aboutsummaryrefslogtreecommitdiffstats
path: root/src/main
diff options
context:
space:
mode:
authorphil <[email protected]>2016-11-06 17:03:11 +1300
committerphil <[email protected]>2016-11-06 17:03:11 +1300
commitb519162cc27f380d36c5d2f779189628a42b3800 (patch)
tree05da9b1cb5045da85665cee0b0484257552dbe73 /src/main
parent7d153738e397b6f9e7b51ea2d127fc55cdff6032 (diff)
move java into maven standard src/main/java and resources into
src/main/resources
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/Resources.java90
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/alternate_appearance/AlternateAppearanceBoundsTest.java328
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/alternate_appearance/AlternateAppearanceBoundsTestGL2ES2.java314
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/alternate_appearance/AlternateAppearanceScopeTest.java375
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/alternate_appearance/SphereGroup.java132
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceMixed.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceMixed.java549
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceMixedGL2ES2.java530
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceTest.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceTest.java419
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/appearance/Tetrahedron.java113
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/applet3d/Applet3D.form69
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/applet3d/Applet3D.html26
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/applet3d/Applet3D.java275
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/background/BackgroundGeometry.form37
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/background/BackgroundGeometry.java280
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/background/BackgroundGeometryGL2ES2.java263
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/collision/Box.java102
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/collision/CollisionDetector.java98
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/collision/TickTockCollision.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/collision/TickTockCollision.java272
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/collision/TickTockCollisionGL2ES2.java254
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/configured_universe/ConfigObjLoad.java327
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/configured_universe/README.txt142
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-behavior.cfg149
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-stereo.cfg113
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-vr.cfg212
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-window.cfg89
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1.cfg98
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x2-flat.cfg134
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x2-rot30.cfg99
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x3-cave-vr.cfg222
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x3-cave.cfg171
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x3-rot45.cfg110
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d2x2-flat.cfg135
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/depth_func/DepthFuncTest.form217
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/depth_func/DepthFuncTest.java359
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/depth_func/DepthFuncTestGL2ES2.java347
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/depth_func/RenderFrame.form25
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/depth_func/RenderFrame.java309
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/depth_func/RenderFrameGL2ES2.java294
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortBehavior.java193
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortGlyphTest.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortGlyphTest.java254
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortGlyphTestGL2ES2.java324
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/dot3/Dot3Demo.java548
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/dot3/MyCanvas.java247
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/dot3/TextureControlPanel.java232
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/four_by_four/BigCube.java139
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/four_by_four/Board.java2313
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/four_by_four/Canvas2D.java96
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/four_by_four/Cube.java132
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/four_by_four/Cylinder.java117
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/four_by_four/FourByFour.html15
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/four_by_four/FourByFour.java893
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/four_by_four/ID.java61
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/four_by_four/PickDragBehavior.java234
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/four_by_four/Poles.java80
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/four_by_four/Positions.java319
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/four_by_four/README.txt8
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/four_by_four/instructions.txt98
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/four_by_four/scores.txt20
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/fps_counter/FPSCounter.java282
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/fps_counter/FPSCounterDemo.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/fps_counter/FPSCounterDemo.java255
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gears/Gear.java403
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gears/GearBox.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gears/GearBox.java408
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gears/GearTest.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gears/GearTest.java256
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gears/Shaft.java203
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gears/SpurGear.java563
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gears/SpurGearThinBody.java185
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/GeometryByReferenceNIOBuffer.java552
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/GeometryByReferenceTest.java584
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/ImageComponentByReferenceTest.java331
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/InterleavedNIOBuffer.java561
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/InterleavedTest.java528
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/TiledImage.java367
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/geometry_compression/ObjectFileCompressor.java255
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/geometry_compression/README.txt23
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/geometry_compression/cgview.java214
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/geometry_compression/obj2cg.java73
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/Cube.java311
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/EnvironmentMappingGLSL.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/EnvironmentMappingGLSL.java239
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ObjLoadGLSL.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ObjLoadGLSL.java424
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/PhongShadingGLSL.form138
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/PhongShadingGLSL.java478
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SamplerTestGLSL.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SamplerTestGLSL.java261
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ShaderTestGLSL.form266
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ShaderTestGLSL.java727
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SimpleShaderAppearance.java474
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SphereGLSL.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SphereGLSL.java388
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/VertexAttrTestGLSL.form203
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/VertexAttrTestGLSL.java435
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/aabrick.frag56
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/aabrick.vert64
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/dimple.frag68
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/dimple.vert75
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/envmap.frag61
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/envmap.vert46
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/fixed_function_shader.frag108
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/fixed_function_shader.vert142
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/gouraud.frag54
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/gouraud.vert158
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/multitex.frag67
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/multitex.vert68
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/phong.frag154
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/phong.vert89
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/polkadot3d.frag49
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/polkadot3d.vert75
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/simple.frag68
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/simple.vert189
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/toon.frag34
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/toon.vert19
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/vertexshader.frag52
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/vertexshader.vert70
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/wood.frag67
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/wood.vert43
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/EnvironmentMappingGLSL.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/EnvironmentMappingGLSL.java261
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/ObjLoadGLSL.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/ObjLoadGLSL.java404
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/PhongShadingGLSL.form138
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/PhongShadingGLSL.java492
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/SamplerTestGLSL.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/SamplerTestGLSL.java278
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/ShaderTestGLSL.form266
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/ShaderTestGLSL.java707
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/SphereGLSL.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/SphereGLSL.java384
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/VertexAttrTestGLSL.form203
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/VertexAttrTestGLSL.java428
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/aabrick.frag55
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/aabrick.vert42
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/dimple.frag61
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/dimple.vert42
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/envmap.frag61
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/envmap.vert25
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/gouraud.frag50
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/gouraud.vert100
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/multitex.frag61
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/phong.frag98
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/phong.vert56
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/polkadot3d.frag48
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/polkadot3d.vert58
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/simple.frag65
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/simple.vert131
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/toon.frag34
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/toon.vert19
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/vertexshader.vert61
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/wood.frag66
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/glsl_shader/wood.vert25
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/hello_universe/HelloUniverse.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/hello_universe/HelloUniverse.java176
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/hello_universe/HelloUniverseGL2ES2.java161
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JCanvas3DExample.form142
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JCanvas3DExample.java195
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JCanvas3DExampleGL2ES2.java175
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JInternalWorld.java232
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JInternalWorldGL2ES2.java211
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/lightwave/README.txt321
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/lightwave/Viewer.java206
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/lod/LOD.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/lod/LOD.java235
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/model_clip/ModelClipTest.java190
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/model_clip/ModelClipTest2.java213
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/morphing/ColorCube.java122
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/morphing/ColorPyramidDown.java122
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/morphing/ColorPyramidUp.java124
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/morphing/Morphing.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/morphing/Morphing.java304
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/morphing/MorphingBehavior.java102
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/morphing/Pyramid2Cube.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/morphing/Pyramid2Cube.java250
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/objload/ObjLoad.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/objload/ObjLoad.java325
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OffScreenCanvas3D.java107
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OffScreenTest.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OffScreenTest.java231
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OnScreenCanvas3D.java79
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/PrintFromButton.form82
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/PrintFromButton.java274
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/oriented_shape3d/MouseRotateY.java200
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/oriented_shape3d/OrientedPtTest.java309
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/oriented_shape3d/OrientedTest.java329
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/overlay2d/Canvas3D2D.java60
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/overlay2d/Overlay2D.java201
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/package_info/PackageInfo.form45
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/package_info/PackageInfo.java139
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/package_info/QueryProperties.form44
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/package_info/QueryProperties.java203
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/BoltCG.java359
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/ColorCube.java122
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/ColorPyramidDown.java122
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/ColorPyramidUp.java124
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/Cube.java113
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/CubeIQA.java140
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/CubeQA.java137
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/GullCG.java578
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/IcosahedronITSA.java182
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/IcosahedronTSA.java179
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/IntersectInfoBehavior.java271
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/IntersectTest.java251
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/MorphingBehavior.java102
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/OctahedronITFA.java117
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/OctahedronTFA.java116
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/PickHighlightBehavior.java102
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/PickTest.java442
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/PickText3DBounds.java254
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/PickText3DGeometry.java273
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/RandomColorCube.java133
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/RandomColorTetrahedron.java103
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/Tetrahedron.java117
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronILA.java108
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronILSA.java99
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronIPA.java83
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronITA.java106
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronLA.java106
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronLSA.java96
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronPA.java73
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronTA.java104
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/TickTockPicking.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/picking/TickTockPicking.java488
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/platform_geometry/SimpleGeometry.java213
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/print_canvas3d/ImageDisplayer.java138
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/print_canvas3d/ImagePrinter.java115
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/print_canvas3d/OffScreenCanvas3D.java84
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/print_canvas3d/PrintCanvas3D.form74
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/print_canvas3d/PrintCanvas3D.java402
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediate.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediate.java186
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediateStereo.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediateStereo.java308
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/read_raster/ReadRaster.java236
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sound/AudioReverberate.java177
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sound/BackgroundSoundBehavior.java85
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sound/BackgroundSoundTest.form37
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sound/BackgroundSoundTest.java289
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sound/PointSoundBehavior.java89
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sound/PointSoundTest.form37
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sound/PointSoundTest.java318
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sound/ReverberateSound.java202
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sound/SimpleSounds.java262
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sound/SimpleSoundsBehavior.java187
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotion.form36
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotion.java365
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotionGL2ES2.java363
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotionGL2ES3_Texture.java376
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotionGLSL_FFP.java361
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_ffp.frag66
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_ffp.vert19
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2.frag96
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2.vert31
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2_texture.frag105
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2_texture.vert35
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/spline_anim/SplineAnim.java631
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/stencil/StencilOutline.java524
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/swing_interaction/SwingInteraction.form82
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/swing_interaction/SwingInteraction.java259
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/text2d/MoverBehavior.java151
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/text2d/Text2DTest.java205
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/text3d/Text3DLoad.java308
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/texture/MultiTextureTest.java344
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/texture/TextureImage.java196
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/texture/TextureImageNPOT.java249
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/texture_by_ref/AnimateTexturesBehavior.java323
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/texture_by_ref/ImageOps.java181
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/texture_by_ref/Tetrahedron.java228
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/texture_by_ref/TextureByReference.java581
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/virtual_input_device/ButtonPositionControls.java214
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/virtual_input_device/PositionControls.java69
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/virtual_input_device/README.txt195
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/virtual_input_device/RotationControls.java71
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/virtual_input_device/SensorBehavior.java77
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/virtual_input_device/VirtualInputDevice.java265
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/virtual_input_device/VirtualInputDeviceTest.java144
-rw-r--r--src/main/java/org/jdesktop/j3d/examples/virtual_input_device/WheelControls.java410
-rw-r--r--src/main/resources/audio/hello_universe.aubin0 -> 10743 bytes
-rw-r--r--src/main/resources/audio/magic_bells.wavbin0 -> 295252 bytes
-rw-r--r--src/main/resources/audio/roar.aubin0 -> 18935 bytes
-rw-r--r--src/main/resources/audio/techno_machine.aubin0 -> 49347 bytes
-rw-r--r--src/main/resources/geometry/ballcone.lws102
-rw-r--r--src/main/resources/geometry/beethoven.obj9278
-rw-r--r--src/main/resources/geometry/brick2.intbin0 -> 4608 bytes
-rw-r--r--src/main/resources/geometry/concrete.intbin0 -> 4608 bytes
-rw-r--r--src/main/resources/geometry/galleon.cgbin0 -> 36616 bytes
-rw-r--r--src/main/resources/geometry/galleon.obj8901
-rw-r--r--src/main/resources/geometry/gas.rgbbin0 -> 247280 bytes
-rw-r--r--src/main/resources/geometry/gravel.intbin0 -> 4608 bytes
-rw-r--r--src/main/resources/geometry/greenball.lwobin0 -> 8574 bytes
-rw-r--r--src/main/resources/geometry/hand1.obj846
-rw-r--r--src/main/resources/geometry/hand2.obj846
-rw-r--r--src/main/resources/geometry/hand3.obj846
-rw-r--r--src/main/resources/geometry/minimart.cgbin0 -> 15968 bytes
-rw-r--r--src/main/resources/geometry/minimart.mtl131
-rw-r--r--src/main/resources/geometry/minimart.obj8696
-rw-r--r--src/main/resources/geometry/numbers.intbin0 -> 11520 bytes
-rw-r--r--src/main/resources/geometry/p51_mustang.cgbin0 -> 24440 bytes
-rw-r--r--src/main/resources/geometry/p51_mustang.obj5527
-rw-r--r--src/main/resources/geometry/products.rgbbin0 -> 49664 bytes
-rw-r--r--src/main/resources/geometry/pumps.intbin0 -> 16896 bytes
-rw-r--r--src/main/resources/geometry/redcone.lwobin0 -> 890 bytes
-rw-r--r--src/main/resources/geometry/thdoor.intabin0 -> 4608 bytes
-rw-r--r--src/main/resources/geometry/window.intabin0 -> 4608 bytes
-rw-r--r--src/main/resources/images/Java3Ddot3.jpgbin0 -> 16302 bytes
-rw-r--r--src/main/resources/images/Java3d.jpgbin0 -> 15473 bytes
-rw-r--r--src/main/resources/images/animation1.gifbin0 -> 5631 bytes
-rw-r--r--src/main/resources/images/animation10.gifbin0 -> 5027 bytes
-rw-r--r--src/main/resources/images/animation2.gifbin0 -> 5925 bytes
-rw-r--r--src/main/resources/images/animation3.gifbin0 -> 6051 bytes
-rw-r--r--src/main/resources/images/animation4.gifbin0 -> 6276 bytes
-rw-r--r--src/main/resources/images/animation5.gifbin0 -> 5571 bytes
-rw-r--r--src/main/resources/images/animation6.gifbin0 -> 4186 bytes
-rw-r--r--src/main/resources/images/animation7.gifbin0 -> 4628 bytes
-rw-r--r--src/main/resources/images/animation8.gifbin0 -> 6476 bytes
-rw-r--r--src/main/resources/images/animation9.gifbin0 -> 5664 bytes
-rw-r--r--src/main/resources/images/bg.jpgbin0 -> 58084 bytes
-rw-r--r--src/main/resources/images/duke-gears.jpgbin0 -> 69308 bytes
-rw-r--r--src/main/resources/images/earth.jpgbin0 -> 13411 bytes
-rw-r--r--src/main/resources/images/gold.jpgbin0 -> 18253 bytes
-rw-r--r--src/main/resources/images/mask.pngbin0 -> 3403 bytes
-rw-r--r--src/main/resources/images/one.jpgbin0 -> 6450 bytes
-rw-r--r--src/main/resources/images/stone.jpgbin0 -> 20446 bytes
-rw-r--r--src/main/resources/images/ttimage.jpgbin0 -> 1033 bytes
-rw-r--r--src/main/resources/images/wood.jpgbin0 -> 12807 bytes
330 files changed, 90128 insertions, 0 deletions
diff --git a/src/main/java/org/jdesktop/j3d/examples/Resources.java b/src/main/java/org/jdesktop/j3d/examples/Resources.java
new file mode 100644
index 0000000..a50a188
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/Resources.java
@@ -0,0 +1,90 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ *
+ */
+public class Resources
+{
+
+ /**
+ * Do not construct an instance of this class.
+ */
+ private Resources()
+ {
+
+ }
+
+ /**
+ * Return the URL of the filename under the resources directory
+ */
+ public static URL getResource(String filename)
+ {
+ URL url = Resources.class.getClassLoader().getResource(filename);
+
+ if (url == null)
+ {
+ try
+ {
+ File f = new File(System.getProperty("user.dir") + "/src/" + filename);
+ if (!f.exists())
+ f = new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/" + filename);
+
+ url = f.toURL();
+ }
+ catch (MalformedURLException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ return url;
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/alternate_appearance/AlternateAppearanceBoundsTest.java b/src/main/java/org/jdesktop/j3d/examples/alternate_appearance/AlternateAppearanceBoundsTest.java
new file mode 100644
index 0000000..7bd3d23
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/alternate_appearance/AlternateAppearanceBoundsTest.java
@@ -0,0 +1,328 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.alternate_appearance;
+
+import java.awt.Container;
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.BoxLayout;
+import javax.swing.JApplet;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.border.TitledBorder;
+
+import org.jogamp.java3d.AlternateAppearance;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingLeaf;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.Bounds;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class AlternateAppearanceBoundsTest extends JApplet
+implements ActionListener {
+
+
+ Material mat1, altMat;
+ Appearance app, otherApp;
+ JComboBox altAppMaterialColor;
+ JComboBox appMaterialColor;
+ JCheckBox useBoundingLeaf;
+ JCheckBox override;
+ JComboBox boundsType;
+ private Group content1 = null;
+ AlternateAppearance altApp;
+ Shape3D[] shapes1;
+ boolean boundingLeafOn = false;
+ // Globally used colors
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f red = new Color3f(1.0f, 0.0f, 0.0f);
+ Color3f green = new Color3f(0.0f, 1.0f, 0.0f);
+ Color3f blue = new Color3f(0.0f, 0.0f, 1.0f);
+ Color3f[] colors = {white, red, green, blue};
+
+ private Bounds worldBounds = new BoundingSphere(
+ new Point3d( 0.0, 0.0, 0.0 ), // Center
+ 1000.0 ); // Extent
+ private Bounds smallBounds = new BoundingSphere(
+ new Point3d( 0.0, 0.0, 0.0 ), // Center
+ 0.25 ); // Extent
+ private Bounds tinyBounds = new BoundingSphere(
+ new Point3d( 0.0, 0.0, 0.0 ), // Center
+ 0.05 ); // Extent
+ private BoundingLeaf leafBounds = null;
+ private int currentBounds = 2;
+
+ private Bounds[] allBounds = {tinyBounds, smallBounds, worldBounds};
+
+ DirectionalLight light1 = null;
+
+ // Get the current bounding leaf position
+ private int currentPosition = 0;
+ // Point3f pos = (Point3f)positions[currentPosition].value;
+
+ private SimpleUniverse u = null;
+
+ public AlternateAppearanceBoundsTest() {
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ Container contentPane = getContentPane();
+
+ Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
+ contentPane.add("Center", c);
+
+ BranchGroup scene = createSceneGraph();
+ // SimpleUniverse is a Convenience Utility class
+ u = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+ u.addBranchGraph(scene);
+
+
+ // Create GUI
+ JPanel p = new JPanel();
+ BoxLayout boxlayout = new BoxLayout(p,
+ BoxLayout.Y_AXIS);
+ p.add(createBoundsPanel());
+ p.add(createMaterialPanel());
+ p.setLayout(boxlayout);
+
+ contentPane.add("South", p);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ BranchGroup createSceneGraph() {
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create an alternate appearance
+ otherApp = new Appearance();
+ altMat = new Material();
+ altMat.setCapability(Material.ALLOW_COMPONENT_WRITE);
+ altMat.setDiffuseColor( new Color3f( 0.0f, 1.0f, 0.0f ) );
+ otherApp.setMaterial(altMat);
+
+ altApp = new AlternateAppearance();
+ altApp.setAppearance(otherApp);
+ altApp.setCapability(AlternateAppearance.ALLOW_BOUNDS_WRITE);
+ altApp.setCapability(AlternateAppearance.ALLOW_INFLUENCING_BOUNDS_WRITE);
+ altApp.setInfluencingBounds( worldBounds );
+ objRoot.addChild(altApp);
+
+ // Build foreground geometry
+ Appearance app1 = new Appearance();
+ mat1 = new Material();
+ mat1.setCapability(Material.ALLOW_COMPONENT_WRITE);
+ mat1.setDiffuseColor( new Color3f( 1.0f, 0.0f, 0.0f ) );
+ app1.setMaterial(mat1);
+ content1 = new SphereGroup(
+ 0.05f, // radius of spheres
+ 0.15f, // x spacing
+ 0.15f, // y spacing
+ 5, // number of spheres in X
+ 5, // number of spheres in Y
+ app1, // appearance
+ true); // alt app override = true
+ objRoot.addChild( content1 );
+ shapes1 = ((SphereGroup)content1).getShapes();
+
+
+
+ // Add lights
+ light1 = new DirectionalLight( );
+ light1.setEnable( true );
+ light1.setColor( new Color3f(0.2f, 0.2f, 0.2f) );
+ light1.setDirection( new Vector3f( 1.0f, 0.0f, -1.0f ) );
+ light1.setInfluencingBounds( worldBounds );
+ light1.setCapability(
+ DirectionalLight.ALLOW_INFLUENCING_BOUNDS_WRITE );
+ light1.setCapability(
+ DirectionalLight.ALLOW_BOUNDS_WRITE );
+ objRoot.addChild( light1 );
+
+ // Add an ambient light to dimly illuminate the rest of
+ // the shapes in the scene to help illustrate that the
+ // directional lights are being scoped... otherwise it looks
+ // like we're just removing shapes from the scene
+ AmbientLight ambient = new AmbientLight( );
+ ambient.setEnable( true );
+ ambient.setColor( new Color3f(1.0f, 1.0f, 1.0f) );
+ ambient.setInfluencingBounds( worldBounds );
+ objRoot.addChild( ambient );
+
+
+ // Define a bounding leaf
+ leafBounds = new BoundingLeaf( allBounds[currentBounds] );
+ leafBounds.setCapability( BoundingLeaf.ALLOW_REGION_WRITE );
+ objRoot.addChild( leafBounds );
+ if (boundingLeafOn) {
+ altApp.setInfluencingBoundingLeaf(leafBounds);
+ }
+ else {
+ altApp.setInfluencingBounds(allBounds[currentBounds]);
+ }
+
+
+
+ return objRoot;
+ }
+ JPanel createBoundsPanel() {
+ JPanel panel = new JPanel();
+ panel.setBorder(new TitledBorder("Scopes"));
+
+
+ String boundsValues[] = { "Tiny Bounds", "Small Bounds", "Big Bounds"};
+
+ boundsType = new JComboBox(boundsValues);
+ boundsType.addActionListener(this);
+ boundsType.setSelectedIndex(2);
+ panel.add(new JLabel("Bounds"));
+ panel.add(boundsType);
+
+ useBoundingLeaf = new JCheckBox("Enable BoundingLeaf",
+ boundingLeafOn);
+ useBoundingLeaf.addActionListener(this);
+ panel.add(useBoundingLeaf);
+
+ override = new JCheckBox("Enable App Override",
+ false);
+ override.addActionListener(this);
+ panel.add(override);
+
+ return panel;
+
+ }
+
+ JPanel createMaterialPanel() {
+ JPanel panel = new JPanel();
+ panel.setBorder(new TitledBorder("Appearance Attributes"));
+
+ String colorVals[] = { "WHITE", "RED", "GREEN", "BLUE"};
+
+ altAppMaterialColor = new JComboBox(colorVals);
+ altAppMaterialColor.addActionListener(this);
+ altAppMaterialColor.setSelectedIndex(2);
+ panel.add(new JLabel("Alternate Appearance MaterialColor"));
+ panel.add(altAppMaterialColor);
+
+
+
+ appMaterialColor = new JComboBox(colorVals);
+ appMaterialColor.addActionListener(this);
+ appMaterialColor.setSelectedIndex(1);
+ panel.add(new JLabel("Normal Appearance MaterialColor"));
+ panel.add(appMaterialColor);
+
+ return panel;
+
+
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ int i;
+
+ Object target = e.getSource();
+ if (target == altAppMaterialColor) {
+ altMat.setDiffuseColor(colors[altAppMaterialColor.getSelectedIndex()]);
+ }
+ else if (target == useBoundingLeaf) {
+ boundingLeafOn = useBoundingLeaf.isSelected();
+ if (boundingLeafOn) {
+ leafBounds.setRegion(allBounds[currentBounds]);
+ altApp.setInfluencingBoundingLeaf( leafBounds );
+ }
+ else {
+ altApp.setInfluencingBoundingLeaf( null );
+ altApp.setInfluencingBounds(allBounds[currentBounds]);
+ }
+
+ }
+ else if (target == boundsType) {
+ currentBounds = boundsType.getSelectedIndex();
+ if (boundingLeafOn) {
+ leafBounds.setRegion(allBounds[currentBounds]);
+ altApp.setInfluencingBoundingLeaf( leafBounds );
+ }
+ else {
+ altApp.setInfluencingBoundingLeaf( null );
+ altApp.setInfluencingBounds(allBounds[currentBounds]);
+ }
+
+ }
+ else if (target == override) {
+ for (i = 0; i < shapes1.length; i++)
+ shapes1[i].setAppearanceOverrideEnable(override.isSelected());
+ }
+ else if (target == appMaterialColor) {
+ mat1.setDiffuseColor(colors[appMaterialColor.getSelectedIndex()]);
+ }
+
+ }
+
+
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ Frame frame = new MainFrame(new AlternateAppearanceBoundsTest(), 800, 800);
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/alternate_appearance/AlternateAppearanceBoundsTestGL2ES2.java b/src/main/java/org/jdesktop/j3d/examples/alternate_appearance/AlternateAppearanceBoundsTestGL2ES2.java
new file mode 100644
index 0000000..c24b79a
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/alternate_appearance/AlternateAppearanceBoundsTestGL2ES2.java
@@ -0,0 +1,314 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.alternate_appearance;
+
+import java.awt.Container;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.BoxLayout;
+import javax.swing.JApplet;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.border.TitledBorder;
+
+import org.jdesktop.j3d.examples.gl2es2pipeline.SimpleShaderAppearance;
+import org.jogamp.java3d.AlternateAppearance;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingLeaf;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.Bounds;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class AlternateAppearanceBoundsTestGL2ES2 extends JApplet implements ActionListener
+{
+
+ Material mat1, altMat;
+ Appearance app, otherApp;
+ JComboBox<?> altAppMaterialColor;
+ JComboBox<?> appMaterialColor;
+ JCheckBox useBoundingLeaf;
+ JCheckBox override;
+ JComboBox<?> boundsType;
+ private Group content1 = null;
+ AlternateAppearance altApp;
+ Shape3D[] shapes1;
+ boolean boundingLeafOn = false;
+ // Globally used colors
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f red = new Color3f(1.0f, 0.0f, 0.0f);
+ Color3f green = new Color3f(0.0f, 1.0f, 0.0f);
+ Color3f blue = new Color3f(0.0f, 0.0f, 1.0f);
+ Color3f[] colors = { white, red, green, blue };
+
+ private Bounds worldBounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), // Center
+ 1000.0); // Extent
+ private Bounds smallBounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), // Center
+ 0.25); // Extent
+ private Bounds tinyBounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), // Center
+ 0.05); // Extent
+ private BoundingLeaf leafBounds = null;
+ private int currentBounds = 2;
+
+ private Bounds[] allBounds = { tinyBounds, smallBounds, worldBounds };
+
+ DirectionalLight light1 = null;
+
+ // Get the current bounding leaf position
+ //private int currentPosition = 0;
+ // Point3f pos = (Point3f)positions[currentPosition].value;
+
+ private SimpleUniverse u = null;
+
+ public AlternateAppearanceBoundsTestGL2ES2()
+ {
+ }
+
+ @Override
+ public void init()
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ Container contentPane = getContentPane();
+
+ Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
+ contentPane.add("Center", c);
+
+ BranchGroup scene = createSceneGraph();
+ // SimpleUniverse is a Convenience Utility class
+ u = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+ u.addBranchGraph(scene);
+
+ // Create GUI
+ JPanel p = new JPanel();
+ BoxLayout boxlayout = new BoxLayout(p, BoxLayout.Y_AXIS);
+ p.add(createBoundsPanel());
+ p.add(createMaterialPanel());
+ p.setLayout(boxlayout);
+
+ contentPane.add("South", p);
+ }
+
+ @Override
+ public void destroy()
+ {
+ u.cleanup();
+ }
+
+ BranchGroup createSceneGraph()
+ {
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create an alternate appearance
+ otherApp = new SimpleShaderAppearance(true, false);
+ //otherApp = new Appearance();
+ altMat = new Material();
+ altMat.setCapability(Material.ALLOW_COMPONENT_WRITE);
+ altMat.setDiffuseColor(new Color3f(0.0f, 1.0f, 0.0f));
+ otherApp.setMaterial(altMat);
+
+ altApp = new AlternateAppearance();
+ altApp.setAppearance(otherApp);
+ altApp.setCapability(AlternateAppearance.ALLOW_BOUNDS_WRITE);
+ altApp.setCapability(AlternateAppearance.ALLOW_INFLUENCING_BOUNDS_WRITE);
+ altApp.setInfluencingBounds(worldBounds);
+ objRoot.addChild(altApp);
+
+ // Build foreground geometry
+ Appearance app1 = new SimpleShaderAppearance(true, false);
+ //Appearance app1 = new Appearance();
+ mat1 = new Material();
+ mat1.setCapability(Material.ALLOW_COMPONENT_WRITE);
+ mat1.setDiffuseColor(new Color3f(1.0f, 0.0f, 0.0f));
+ app1.setMaterial(mat1);
+ content1 = new SphereGroup(0.05f, // radius of spheres
+ 0.15f, // x spacing
+ 0.15f, // y spacing
+ 5, // number of spheres in X
+ 5, // number of spheres in Y
+ app1, // appearance
+ true); // alt app override = true
+ objRoot.addChild(content1);
+ shapes1 = ((SphereGroup) content1).getShapes();
+
+ // Add lights
+ light1 = new DirectionalLight();
+ light1.setEnable(true);
+ light1.setColor(new Color3f(0.2f, 0.2f, 0.2f));
+ light1.setDirection(new Vector3f(1.0f, 0.0f, -1.0f));
+ light1.setInfluencingBounds(worldBounds);
+ light1.setCapability(DirectionalLight.ALLOW_INFLUENCING_BOUNDS_WRITE);
+ light1.setCapability(DirectionalLight.ALLOW_BOUNDS_WRITE);
+ objRoot.addChild(light1);
+
+ // Add an ambient light to dimly illuminate the rest of
+ // the shapes in the scene to help illustrate that the
+ // directional lights are being scoped... otherwise it looks
+ // like we're just removing shapes from the scene
+ AmbientLight ambient = new AmbientLight();
+ ambient.setEnable(true);
+ ambient.setColor(new Color3f(1.0f, 1.0f, 1.0f));
+ ambient.setInfluencingBounds(worldBounds);
+ objRoot.addChild(ambient);
+
+ // Define a bounding leaf
+ leafBounds = new BoundingLeaf(allBounds[currentBounds]);
+ leafBounds.setCapability(BoundingLeaf.ALLOW_REGION_WRITE);
+ objRoot.addChild(leafBounds);
+ if (boundingLeafOn)
+ {
+ altApp.setInfluencingBoundingLeaf(leafBounds);
+ }
+ else
+ {
+ altApp.setInfluencingBounds(allBounds[currentBounds]);
+ }
+
+ return objRoot;
+ }
+
+ JPanel createBoundsPanel()
+ {
+ JPanel panel = new JPanel();
+ panel.setBorder(new TitledBorder("Scopes"));
+
+ String boundsValues[] = { "Tiny Bounds", "Small Bounds", "Big Bounds" };
+
+ boundsType = new JComboBox<Object>(boundsValues);
+ boundsType.addActionListener(this);
+ boundsType.setSelectedIndex(2);
+ panel.add(new JLabel("Bounds"));
+ panel.add(boundsType);
+
+ useBoundingLeaf = new JCheckBox("Enable BoundingLeaf", boundingLeafOn);
+ useBoundingLeaf.addActionListener(this);
+ panel.add(useBoundingLeaf);
+
+ override = new JCheckBox("Enable App Override", false);
+ override.addActionListener(this);
+ panel.add(override);
+
+ return panel;
+
+ }
+
+ JPanel createMaterialPanel()
+ {
+ JPanel panel = new JPanel();
+ panel.setBorder(new TitledBorder("Appearance Attributes"));
+
+ String colorVals[] = { "WHITE", "RED", "GREEN", "BLUE" };
+
+ altAppMaterialColor = new JComboBox<Object>(colorVals);
+ altAppMaterialColor.addActionListener(this);
+ altAppMaterialColor.setSelectedIndex(2);
+ panel.add(new JLabel("Alternate Appearance MaterialColor"));
+ panel.add(altAppMaterialColor);
+
+ appMaterialColor = new JComboBox<Object>(colorVals);
+ appMaterialColor.addActionListener(this);
+ appMaterialColor.setSelectedIndex(1);
+ panel.add(new JLabel("Normal Appearance MaterialColor"));
+ panel.add(appMaterialColor);
+
+ return panel;
+
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ int i;
+
+ Object target = e.getSource();
+ if (target == altAppMaterialColor)
+ {
+ altMat.setDiffuseColor(colors[altAppMaterialColor.getSelectedIndex()]);
+ }
+ else if (target == useBoundingLeaf)
+ {
+ boundingLeafOn = useBoundingLeaf.isSelected();
+ if (boundingLeafOn)
+ {
+ leafBounds.setRegion(allBounds[currentBounds]);
+ altApp.setInfluencingBoundingLeaf(leafBounds);
+ }
+ else
+ {
+ altApp.setInfluencingBoundingLeaf(null);
+ altApp.setInfluencingBounds(allBounds[currentBounds]);
+ }
+
+ }
+ else if (target == boundsType)
+ {
+ currentBounds = boundsType.getSelectedIndex();
+ if (boundingLeafOn)
+ {
+ leafBounds.setRegion(allBounds[currentBounds]);
+ altApp.setInfluencingBoundingLeaf(leafBounds);
+ }
+ else
+ {
+ altApp.setInfluencingBoundingLeaf(null);
+ altApp.setInfluencingBounds(allBounds[currentBounds]);
+ }
+
+ }
+ else if (target == override)
+ {
+ for (i = 0; i < shapes1.length; i++)
+ shapes1[i].setAppearanceOverrideEnable(override.isSelected());
+ }
+ else if (target == appMaterialColor)
+ {
+ mat1.setDiffuseColor(colors[appMaterialColor.getSelectedIndex()]);
+ }
+
+ }
+
+ public static void main(String[] args)
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend", "jogl2es2");
+ System.setProperty("j3d.displaylist", "false");
+ new MainFrame(new AlternateAppearanceBoundsTestGL2ES2(), 800, 800);
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/alternate_appearance/AlternateAppearanceScopeTest.java b/src/main/java/org/jdesktop/j3d/examples/alternate_appearance/AlternateAppearanceScopeTest.java
new file mode 100644
index 0000000..bddbee8
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/alternate_appearance/AlternateAppearanceScopeTest.java
@@ -0,0 +1,375 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.alternate_appearance;
+
+import java.awt.Container;
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.BoxLayout;
+import javax.swing.JApplet;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.border.TitledBorder;
+
+import org.jogamp.java3d.AlternateAppearance;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class AlternateAppearanceScopeTest extends JApplet
+implements ActionListener {
+
+
+ Material mat1, altMat;
+ Appearance app, otherApp;
+ JComboBox altAppMaterialColor;
+ JComboBox appMaterialColor;
+ JComboBox altAppScoping;
+ JComboBox override;
+ private Group content1 = null;
+ private Group content2 = null;
+ BoundingSphere worldBounds;
+ AlternateAppearance altApp;
+ Shape3D[] shapes1, shapes2;
+ boolean shape1Enabled = false, shape2Enabled = false;
+ // Globally used colors
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f red = new Color3f(1.0f, 0.0f, 0.0f);
+ Color3f green = new Color3f(0.0f, 1.0f, 0.0f);
+ Color3f blue = new Color3f(0.0f, 0.0f, 1.0f);
+ Color3f[] colors = {white, red, green, blue};
+
+ private SimpleUniverse u;
+
+ public AlternateAppearanceScopeTest() {
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ Container contentPane = getContentPane();
+
+ Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
+ contentPane.add("Center", c);
+
+ BranchGroup scene = createSceneGraph();
+ // SimpleUniverse is a Convenience Utility class
+ u = new SimpleUniverse(c);
+
+ // add mouse behaviors to the viewingPlatform
+ ViewingPlatform viewingPlatform = u.getViewingPlatform();
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ OrbitBehavior orbit = new OrbitBehavior(c,
+ OrbitBehavior.REVERSE_ALL);
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
+ 100.0);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+
+ u.addBranchGraph(scene);
+
+
+ // Create GUI
+ JPanel p = new JPanel();
+ BoxLayout boxlayout = new BoxLayout(p,
+ BoxLayout.Y_AXIS);
+ p.add(createScopingPanel());
+ p.add(createMaterialPanel());
+ p.setLayout(boxlayout);
+
+ contentPane.add("South", p);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ BranchGroup createSceneGraph() {
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create influencing bounds
+ worldBounds = new BoundingSphere(
+ new Point3d( 0.0, 0.0, 0.0 ), // Center
+ 1000.0 ); // Extent
+
+ Transform3D t = new Transform3D();
+ // move the object upwards
+ t.set(new Vector3f(0.0f, 0.1f, 0.0f));
+ // Shrink the object
+ t.setScale(0.8);
+
+ TransformGroup trans = new TransformGroup(t);
+ trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+
+
+ otherApp = new Appearance();
+ altMat = new Material();
+ altMat.setCapability(Material.ALLOW_COMPONENT_WRITE);
+ altMat.setDiffuseColor( new Color3f( 0.0f, 1.0f, 0.0f ) );
+ otherApp.setMaterial(altMat);
+
+ altApp = new AlternateAppearance();
+ altApp.setAppearance(otherApp);
+ altApp.setCapability(AlternateAppearance.ALLOW_SCOPE_WRITE);
+ altApp.setCapability(AlternateAppearance.ALLOW_SCOPE_READ);
+ altApp.setInfluencingBounds( worldBounds );
+ objRoot.addChild(altApp);
+
+ // Build foreground geometry into two groups. We'll
+ // create three directional lights below, one each with
+ // scope to cover the first geometry group only, the
+ // second geometry group only, or both geometry groups.
+ Appearance app1 = new Appearance();
+ mat1 = new Material();
+ mat1.setCapability(Material.ALLOW_COMPONENT_WRITE);
+ mat1.setDiffuseColor( new Color3f( 1.0f, 0.0f, 0.0f ) );
+ app1.setMaterial(mat1);
+ content1 = new SphereGroup(
+ 0.05f, // radius of spheres
+ 0.4f, // x spacing
+ 0.2f, // y spacing
+ 3, // number of spheres in X
+ 5, // number of spheres in Y
+ app1, // appearance
+ true); // alt app override = true
+ trans.addChild( content1 );
+ shapes1 = ((SphereGroup)content1).getShapes();
+
+ content2 = new SphereGroup(
+ 0.05f, // radius of spheres
+ .4f, // x spacing
+ 0.2f, // y spacing
+ 2, // number of spheres in X
+ 5, // number of spheres in Y
+ app1, // appearance
+ true); // alt app override = true
+ trans.addChild( content2 );
+ shapes2 = ((SphereGroup)content2).getShapes();
+
+
+ // Add lights
+ DirectionalLight light1 = null;
+ light1 = new DirectionalLight( );
+ light1.setEnable( true );
+ light1.setColor( new Color3f(0.2f, 0.2f, 0.2f) );
+ light1.setDirection( new Vector3f( 1.0f, 0.0f, -1.0f ) );
+ light1.setInfluencingBounds( worldBounds );
+ objRoot.addChild( light1 );
+
+ DirectionalLight light2 = new DirectionalLight();
+ light2.setEnable(true);
+ light2.setColor(new Color3f(0.2f, 0.2f, 0.2f));
+ light2.setDirection(new Vector3f(-1.0f, 0.0f, 1.0f));
+ light2.setInfluencingBounds(worldBounds);
+ objRoot.addChild(light2);
+
+ // Add an ambient light to dimly illuminate the rest of
+ // the shapes in the scene to help illustrate that the
+ // directional lights are being scoped... otherwise it looks
+ // like we're just removing shapes from the scene
+ AmbientLight ambient = new AmbientLight( );
+ ambient.setEnable( true );
+ ambient.setColor( new Color3f(1.0f, 1.0f, 1.0f) );
+ ambient.setInfluencingBounds( worldBounds );
+ objRoot.addChild( ambient );
+
+
+ objRoot.addChild(trans);
+
+ return objRoot;
+ }
+ JPanel createScopingPanel() {
+ JPanel panel = new JPanel();
+ panel.setBorder(new TitledBorder("Scopes"));
+
+ String values[] = {"Scoped Set1", "Scoped Set2", "Universal Scope"};
+ altAppScoping = new JComboBox(values);
+ altAppScoping.addActionListener(this);
+ altAppScoping.setSelectedIndex(2);
+ panel.add(new JLabel("Scoping"));
+ panel.add(altAppScoping);
+
+
+ String enables[] = { "Enabled Set1", "Enabled Set2", "Enabled set1&2", "Disabled set1&2"};
+
+ override = new JComboBox(enables);
+ override.addActionListener(this);
+ override.setSelectedIndex(3);
+ panel.add(new JLabel("Alternate Appearance Override"));
+ panel.add(override);
+
+ return panel;
+
+ }
+
+ JPanel createMaterialPanel() {
+ JPanel panel = new JPanel();
+ panel.setBorder(new TitledBorder("Appearance Attributes"));
+
+ String colorVals[] = { "WHITE", "RED", "GREEN", "BLUE"};
+
+ altAppMaterialColor = new JComboBox(colorVals);
+ altAppMaterialColor.addActionListener(this);
+ altAppMaterialColor.setSelectedIndex(2);
+ panel.add(new JLabel("Alternate Appearance MaterialColor"));
+ panel.add(altAppMaterialColor);
+
+
+
+ appMaterialColor = new JComboBox(colorVals);
+ appMaterialColor.addActionListener(this);
+ appMaterialColor.setSelectedIndex(1);
+ panel.add(new JLabel("Normal Appearance MaterialColor"));
+ panel.add(appMaterialColor);
+
+ return panel;
+
+
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ Object target = e.getSource();
+ if (target == altAppMaterialColor) {
+ altMat.setDiffuseColor(colors[altAppMaterialColor.getSelectedIndex()]);
+ }
+ else if (target == altAppScoping) {
+ for (int i = 0; i < altApp.numScopes(); i++) {
+ altApp.removeScope(0);
+ }
+ if (altAppScoping.getSelectedIndex() == 0) {
+ altApp.addScope(content1);
+ }
+ else if (altAppScoping.getSelectedIndex() == 1) {
+ altApp.addScope(content2);
+ }
+ }
+ else if (target == override) {
+ int i;
+ if (override.getSelectedIndex()== 0) {
+ if (!shape1Enabled) {
+ for (i = 0; i < shapes1.length; i++)
+ shapes1[i].setAppearanceOverrideEnable(true);
+ shape1Enabled = true;
+ }
+
+ if (shape2Enabled) {
+ for (i = 0; i < shapes2.length; i++)
+ shapes2[i].setAppearanceOverrideEnable(false);
+ shape2Enabled = false;
+ }
+ }
+ else if (override.getSelectedIndex() == 1) {
+ if (!shape2Enabled) {
+ for (i = 0; i < shapes2.length; i++)
+ shapes2[i].setAppearanceOverrideEnable(true);
+ shape2Enabled = true;
+ }
+
+ if (shape1Enabled) {
+ for (i = 0; i < shapes1.length; i++)
+ shapes1[i].setAppearanceOverrideEnable(false);
+ shape1Enabled = false;
+ }
+ }
+ else if (override.getSelectedIndex() == 2) {
+ if (!shape1Enabled) {
+ for (i = 0; i < shapes1.length; i++)
+ shapes1[i].setAppearanceOverrideEnable(true);
+ shape1Enabled = true;
+ }
+ if (!shape2Enabled) {
+ for (i = 0; i < shapes2.length; i++)
+ shapes2[i].setAppearanceOverrideEnable(true);
+ shape2Enabled = true;
+ }
+ }
+ else {
+ if (shape1Enabled) {
+ for (i = 0; i < shapes1.length; i++)
+ shapes1[i].setAppearanceOverrideEnable(false);
+ shape1Enabled = false;
+ }
+
+ if (shape2Enabled) {
+ for (i = 0; i < shapes2.length; i++)
+ shapes2[i].setAppearanceOverrideEnable(false);
+ shape2Enabled = false;
+ }
+ }
+
+ }
+ else if (target == appMaterialColor) {
+ mat1.setDiffuseColor(colors[appMaterialColor.getSelectedIndex()]);
+ }
+
+ }
+
+
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ Frame frame = new MainFrame(new AlternateAppearanceScopeTest(), 800, 800);
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/alternate_appearance/SphereGroup.java b/src/main/java/org/jdesktop/j3d/examples/alternate_appearance/SphereGroup.java
new file mode 100644
index 0000000..22f8553
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/alternate_appearance/SphereGroup.java
@@ -0,0 +1,132 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.alternate_appearance;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.Primitive;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Vector3d;
+
+public class SphereGroup
+ extends Group
+{
+ Shape3D[] shapes;
+ int numShapes = 0;
+ // Constructors
+ public SphereGroup( )
+ {
+ // radius x,y spacing x,y count appearance
+ this( 0.25f, 0.75f, 0.75f, 5, 5, null, false );
+ }
+
+ public SphereGroup( Appearance app )
+ {
+ // radius x,y spacing x,y count appearance
+ this( 0.25f, 0.75f, 0.75f, 5, 5, app, false );
+ }
+
+ public SphereGroup( float radius, float xSpacing, float ySpacing,
+ int xCount, int yCount, boolean overrideflag )
+ {
+ this( radius, xSpacing, ySpacing, xCount, yCount, null, overrideflag );
+ }
+
+ public SphereGroup( float radius, float xSpacing, float ySpacing,
+ int xCount, int yCount, Appearance app, boolean overrideflag )
+ {
+ if ( app == null )
+ {
+ app = new Appearance( );
+ Material material = new Material( );
+ material.setDiffuseColor( new Color3f( 0.8f, 0.8f, 0.8f ) );
+ material.setSpecularColor( new Color3f( 0.0f, 0.0f, 0.0f ) );
+ material.setShininess( 0.0f );
+ app.setMaterial( material );
+ }
+
+ double xStart = -xSpacing * (double)(xCount-1) / 2.0;
+ double yStart = -ySpacing * (double)(yCount-1) / 2.0;
+
+ Sphere sphere = null;
+ TransformGroup trans = null;
+ Transform3D t3d = new Transform3D( );
+ Vector3d vec = new Vector3d( );
+ double x, y = yStart, z = 0.0;
+ shapes = new Shape3D[xCount * yCount];
+ for ( int i = 0; i < yCount; i++ )
+ {
+ x = xStart;
+ for ( int j = 0; j < xCount; j++ ) {
+ vec.set( x, y, z );
+ t3d.setTranslation( vec );
+ trans = new TransformGroup( t3d );
+ addChild( trans );
+
+ sphere = new Sphere(
+ radius, // sphere radius
+ Primitive.GENERATE_NORMALS, // generate normals
+ 16, // 16 divisions radially
+ app ); // it's appearance
+ trans.addChild( sphere );
+ x += xSpacing;
+ shapes[numShapes] = sphere.getShape();
+ if (overrideflag)
+ shapes[numShapes].setCapability(Shape3D.ALLOW_APPEARANCE_OVERRIDE_WRITE);
+ numShapes++;
+ }
+ y += ySpacing;
+ }
+ }
+ Shape3D[] getShapes() {
+ return shapes;
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceMixed.form b/src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceMixed.form
new file mode 100644
index 0000000..2440a43
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceMixed.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="AppearanceMixed"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceMixed.java b/src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceMixed.java
new file mode 100644
index 0000000..943d387
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceMixed.java
@@ -0,0 +1,549 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.appearance;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GraphicsContext3D;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.IndexedTriangleArray;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointAttributes;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.TextureAttributes;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TransparencyAttributes;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class AppearanceMixed extends javax.swing.JFrame {
+
+ private java.net.URL texImage = null;
+ private java.net.URL bgImage = null;
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ static class MyCanvas3D extends Canvas3D {
+ private GraphicsContext3D gc;
+
+ private static final int vertIndices[] = { 0, 1, 2, 0, 2, 3 };
+ private static final int normalIndices[] = { 0, 0, 0, 1, 1, 1 };
+ private IndexedTriangleArray tri =
+ new IndexedTriangleArray(4, IndexedTriangleArray.COORDINATES |
+ IndexedTriangleArray.NORMALS, 6);
+
+ private Point3f vert[] = {
+ new Point3f(-0.12f, -0.12f, 0.0f),
+ new Point3f( 0.12f, -0.12f, 0.0f),
+ new Point3f( 0.12f, 0.12f, 0.0f),
+ new Point3f(-0.12f, 0.12f, 0.0f),
+ };
+
+ private Point3f min[] = {
+ new Point3f(-0.24f, -0.24f, -0.20f),
+ new Point3f( 0.04f, -0.28f, -0.24f),
+ new Point3f( 0.00f, 0.00f, -0.24f),
+ new Point3f(-0.32f, 0.08f, -0.20f),
+ };
+
+ private Point3f max[] = {
+ new Point3f(-0.04f, -0.04f, 0.12f),
+ new Point3f( 0.32f, -0.04f, 0.16f),
+ new Point3f( 0.36f, 0.28f, 0.20f),
+ new Point3f(-0.04f, 0.24f, 0.16f),
+ };
+
+ private Point3f delta[] = {
+ new Point3f(-0.0021f, -0.0017f, 0.0014f),
+ new Point3f( 0.0025f, -0.0013f, -0.0018f),
+ new Point3f( 0.0021f, 0.0017f, 0.0018f),
+ new Point3f(-0.0025f, 0.0013f, -0.0014f),
+ };
+
+ private Vector3f normals[];
+ private Vector3f v01 = new Vector3f();
+ private Vector3f v02 = new Vector3f();
+ private Vector3f v03 = new Vector3f();
+
+ public void renderField(int fieldDesc) {
+ computeVert();
+ computeNormals();
+ gc.draw(tri);
+ }
+
+ private void computeVert() {
+ for (int i = 0; i < 4; i++) {
+ vert[i].add(delta[i]);
+ if (vert[i].x > max[i].x) {
+ vert[i].x = max[i].x;
+ delta[i].x *= -1.0f;
+ }
+ if (vert[i].x < min[i].x) {
+ vert[i].x = min[i].x;
+ delta[i].x *= -1.0f;
+ }
+ if (vert[i].y > max[i].y) {
+ vert[i].y = max[i].y;
+ delta[i].y *= -1.0f;
+ }
+ if (vert[i].y < min[i].y) {
+ vert[i].y = min[i].y;
+ delta[i].y *= -1.0f;
+ }
+ if (vert[i].z > max[i].z) {
+ vert[i].z = max[i].z;
+ delta[i].z *= -1.0f;
+ }
+ if (vert[i].z < min[i].z) {
+ vert[i].z = min[i].z;
+ delta[i].z *= -1.0f;
+ }
+ }
+ tri.setCoordinates(0, vert);
+ }
+
+ private void computeNormals() {
+ v01.sub(vert[1], vert[0]);
+ v02.sub(vert[2], vert[0]);
+ v03.sub(vert[3], vert[0]);
+ normals[0].cross(v01, v02);
+ normals[0].normalize();
+ normals[1].cross(v02, v03);
+ normals[1].normalize();
+ tri.setNormals(0, normals);
+ }
+
+ public MyCanvas3D(GraphicsConfiguration gcfg) {
+ super(gcfg);
+
+ // Allocate memory for normals
+ normals = new Vector3f[2];
+ normals[0] = new Vector3f();
+ normals[1] = new Vector3f();
+
+ // Set up the indices
+ tri.setCoordinateIndices(0, vertIndices);
+ tri.setNormalIndices(0, normalIndices);
+
+ // Set up the graphics context
+ gc = getGraphicsContext3D();
+
+ // Create the appearance for the triangle fan
+ Appearance app = new Appearance();
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f objColor = new Color3f(0.0f, 0.0f, 0.8f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ white, 80.0f));
+ gc.setAppearance(app);
+
+ // Set up the global lights
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+ gc.addLight(new AmbientLight(alColor));
+ gc.addLight(new DirectionalLight(lColor1, lDir1));
+ }
+ }
+
+
+ private BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the background
+ TextureLoader bgTexture = new TextureLoader(bgImage, this);
+ Background bg = new Background(bgTexture.getImage());
+ bg.setApplicationBounds(bounds);
+ objRoot.addChild(bg);
+
+ // Set up the global lights
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+
+ AmbientLight aLgt = new AmbientLight(alColor);
+ aLgt.setInfluencingBounds(bounds);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ lgt1.setInfluencingBounds(bounds);
+ objRoot.addChild(aLgt);
+ objRoot.addChild(lgt1);
+
+ // Create a bunch of objects with a behavior and add them
+ // into the scene graph.
+
+ int row, col;
+ Appearance[][] app = new Appearance[3][3];
+
+ for (row = 0; row < 3; row++)
+ for (col = 0; col < 3; col++)
+ app[row][col] = createAppearance(row * 3 + col);
+
+ for (int i = 0; i < 3; i++) {
+ double ypos = (double)(i - 1) * 0.6;
+ for (int j = 0; j < 3; j++) {
+ double xpos = (double)(j - 1) * 0.6;
+ objRoot.addChild(createObject(app[i][j], 0.12, xpos, ypos));
+ }
+ }
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+
+ private Appearance createAppearance(int idx) {
+ Appearance app = new Appearance();
+
+ // Globally used colors
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+
+ switch (idx) {
+ // Unlit solid
+ case 0:
+ {
+ // Set up the coloring properties
+ Color3f objColor = new Color3f(1.0f, 0.2f, 0.4f);
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(objColor);
+ app.setColoringAttributes(ca);
+ break;
+ }
+
+
+ // Unlit wire frame
+ case 1:
+ {
+ // Set up the coloring properties
+ Color3f objColor = new Color3f(0.5f, 0.0f, 0.2f);
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(objColor);
+ app.setColoringAttributes(ca);
+
+ // Set up the polygon attributes
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setPolygonMode(pa.POLYGON_LINE);
+ pa.setCullFace(pa.CULL_NONE);
+ app.setPolygonAttributes(pa);
+ break;
+ }
+
+ // Unlit points
+ case 2:
+ {
+ // Set up the coloring properties
+ Color3f objColor = new Color3f(0.2f, 0.2f, 1.0f);
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(objColor);
+ app.setColoringAttributes(ca);
+
+ // Set up the polygon attributes
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setPolygonMode(pa.POLYGON_POINT);
+ pa.setCullFace(pa.CULL_NONE);
+ app.setPolygonAttributes(pa);
+
+ // Set up point attributes
+ PointAttributes pta = new PointAttributes();
+ pta.setPointSize(5.0f);
+ app.setPointAttributes(pta);
+ break;
+ }
+
+ // Lit solid
+ case 3:
+ {
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ white, 80.0f));
+ break;
+ }
+
+ // Texture mapped, lit solid
+ case 4:
+ {
+ // Set up the texture map
+ TextureLoader tex = new TextureLoader(texImage, this);
+ app.setTexture(tex.getTexture());
+
+ TextureAttributes texAttr = new TextureAttributes();
+ texAttr.setTextureMode(TextureAttributes.MODULATE);
+ app.setTextureAttributes(texAttr);
+
+
+ // Set up the material properties
+ app.setMaterial(new Material(white, black, white, black, 1.0f));
+ break;
+ }
+
+ // Transparent, lit solid
+ case 5:
+ {
+ // Set up the transparency properties
+ TransparencyAttributes ta = new TransparencyAttributes();
+ ta.setTransparencyMode(ta.BLENDED);
+ ta.setTransparency(0.6f);
+ app.setTransparencyAttributes(ta);
+
+ // Set up the polygon attributes
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setCullFace(pa.CULL_NONE);
+ app.setPolygonAttributes(pa);
+
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.7f, 0.8f, 1.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ black, 1.0f));
+ break;
+ }
+
+ // Lit solid, no specular
+ case 6:
+ {
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ black, 80.0f));
+ break;
+ }
+
+ // Lit solid, specular only
+ case 7:
+ {
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
+ app.setMaterial(new Material(black, black, black,
+ white, 80.0f));
+ break;
+ }
+
+ // Another lit solid with a different color
+ case 8:
+ {
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.8f, 0.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ white, 80.0f));
+ break;
+ }
+
+ default:
+ {
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(new Color3f(0.0f, 1.0f, 0.0f));
+ app.setColoringAttributes(ca);
+ }
+ }
+
+ return app;
+ }
+
+
+ private Group createObject(Appearance app, double scale,
+ double xpos, double ypos) {
+
+ // Create a transform group node to scale and position the object.
+ Transform3D t = new Transform3D();
+ t.set(scale, new Vector3d(xpos, ypos, 0.0));
+ TransformGroup objTrans = new TransformGroup(t);
+
+ // Create a second transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime.
+ TransformGroup spinTg = new TransformGroup();
+ spinTg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+
+ // Create a simple shape leaf node and set the appearance
+ Shape3D shape = new Tetrahedron();
+ shape.setAppearance(app);
+
+ // add it to the scene graph.
+ spinTg.addChild(shape);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into
+ // the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 5000, 0, 0,
+ 0, 0, 0);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, spinTg, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ rotator.setSchedulingBounds(bounds);
+
+ // Add the behavior and the transform group to the object
+ objTrans.addChild(rotator);
+ objTrans.addChild(spinTg);
+
+ return objTrans;
+ }
+
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a MyCanvas3D using the preferred configuration
+ MyCanvas3D c = new MyCanvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form AppearanceMixed
+ */
+ public AppearanceMixed() {
+
+ if (bgImage == null) {
+ // the path to the image for an applet
+ bgImage = Resources.getResource("resources/images/bg.jpg");
+ if (bgImage == null) {
+ System.err.println("resources/images/bg.jpg not found");
+ System.exit(1);
+ }
+ }
+
+ if (texImage == null) {
+ // the path to the image for an applet
+ texImage = Resources.getResource("resources/images/stone.jpg");
+ if (texImage == null) {
+ System.err.println("resources/images/stone.jpg not found");
+ System.exit(1);
+ }
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("AppearanceMixed");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new AppearanceMixed().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceMixedGL2ES2.java b/src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceMixedGL2ES2.java
new file mode 100644
index 0000000..e3ec631
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceMixedGL2ES2.java
@@ -0,0 +1,530 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.appearance;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jdesktop.j3d.examples.gl2es2pipeline.SimpleShaderAppearance;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GraphicsContext3D;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.IndexedTriangleArray;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointAttributes;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.TextureAttributes;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TransparencyAttributes;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class AppearanceMixedGL2ES2 extends javax.swing.JFrame {
+
+ private java.net.URL texImage = null;
+ private java.net.URL bgImage = null;
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ static class MyCanvas3D extends Canvas3D {
+ private GraphicsContext3D gc;
+
+ private static final int vertIndices[] = { 0, 1, 2, 0, 2, 3 };
+ private static final int normalIndices[] = { 0, 0, 0, 1, 1, 1 };
+ private IndexedTriangleArray tri =
+ new IndexedTriangleArray(4, IndexedTriangleArray.COORDINATES |
+ IndexedTriangleArray.NORMALS, 6);
+
+ private Point3f vert[] = {
+ new Point3f(-0.12f, -0.12f, 0.0f),
+ new Point3f( 0.12f, -0.12f, 0.0f),
+ new Point3f( 0.12f, 0.12f, 0.0f),
+ new Point3f(-0.12f, 0.12f, 0.0f),
+ };
+
+ private Point3f min[] = {
+ new Point3f(-0.24f, -0.24f, -0.20f),
+ new Point3f( 0.04f, -0.28f, -0.24f),
+ new Point3f( 0.00f, 0.00f, -0.24f),
+ new Point3f(-0.32f, 0.08f, -0.20f),
+ };
+
+ private Point3f max[] = {
+ new Point3f(-0.04f, -0.04f, 0.12f),
+ new Point3f( 0.32f, -0.04f, 0.16f),
+ new Point3f( 0.36f, 0.28f, 0.20f),
+ new Point3f(-0.04f, 0.24f, 0.16f),
+ };
+
+ private Point3f delta[] = {
+ new Point3f(-0.0021f, -0.0017f, 0.0014f),
+ new Point3f( 0.0025f, -0.0013f, -0.0018f),
+ new Point3f( 0.0021f, 0.0017f, 0.0018f),
+ new Point3f(-0.0025f, 0.0013f, -0.0014f),
+ };
+
+ private Vector3f normals[];
+ private Vector3f v01 = new Vector3f();
+ private Vector3f v02 = new Vector3f();
+ private Vector3f v03 = new Vector3f();
+
+ public void renderField(int fieldDesc) {
+ computeVert();
+ computeNormals();
+ gc.draw(tri);
+ }
+
+ private void computeVert() {
+ for (int i = 0; i < 4; i++) {
+ vert[i].add(delta[i]);
+ if (vert[i].x > max[i].x) {
+ vert[i].x = max[i].x;
+ delta[i].x *= -1.0f;
+ }
+ if (vert[i].x < min[i].x) {
+ vert[i].x = min[i].x;
+ delta[i].x *= -1.0f;
+ }
+ if (vert[i].y > max[i].y) {
+ vert[i].y = max[i].y;
+ delta[i].y *= -1.0f;
+ }
+ if (vert[i].y < min[i].y) {
+ vert[i].y = min[i].y;
+ delta[i].y *= -1.0f;
+ }
+ if (vert[i].z > max[i].z) {
+ vert[i].z = max[i].z;
+ delta[i].z *= -1.0f;
+ }
+ if (vert[i].z < min[i].z) {
+ vert[i].z = min[i].z;
+ delta[i].z *= -1.0f;
+ }
+ }
+ tri.setCoordinates(0, vert);
+ }
+
+ private void computeNormals() {
+ v01.sub(vert[1], vert[0]);
+ v02.sub(vert[2], vert[0]);
+ v03.sub(vert[3], vert[0]);
+ normals[0].cross(v01, v02);
+ normals[0].normalize();
+ normals[1].cross(v02, v03);
+ normals[1].normalize();
+ tri.setNormals(0, normals);
+ }
+
+ public MyCanvas3D(GraphicsConfiguration gcfg) {
+ super(gcfg);
+
+ // Allocate memory for normals
+ normals = new Vector3f[2];
+ normals[0] = new Vector3f();
+ normals[1] = new Vector3f();
+
+ // Set up the indices
+ tri.setCoordinateIndices(0, vertIndices);
+ tri.setNormalIndices(0, normalIndices);
+
+ // Set up the graphics context
+ gc = getGraphicsContext3D();
+
+ // Create the appearance for the triangle fan
+ Appearance app = new SimpleShaderAppearance(true, false);
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f objColor = new Color3f(0.0f, 0.0f, 0.8f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ white, 80.0f));
+ gc.setAppearance(app);
+
+ // Set up the global lights
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+ gc.addLight(new AmbientLight(alColor));
+ gc.addLight(new DirectionalLight(lColor1, lDir1));
+ }
+ }
+
+
+ private BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the background
+ //TextureLoader bgTexture = new TextureLoader(bgImage, this);
+ //Background bg = new Background(bgTexture.getImage());
+ //bg.setApplicationBounds(bounds);
+ //objRoot.addChild(bg);
+
+ // Set up the global lights
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+
+ AmbientLight aLgt = new AmbientLight(alColor);
+ aLgt.setInfluencingBounds(bounds);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ lgt1.setInfluencingBounds(bounds);
+ objRoot.addChild(aLgt);
+ objRoot.addChild(lgt1);
+
+ // Create a bunch of objects with a behavior and add them
+ // into the scene graph.
+
+ int row, col;
+ Appearance[][] app = new SimpleShaderAppearance [3][3];
+
+ for (row = 0; row < 3; row++)
+ for (col = 0; col < 3; col++)
+ app[row][col] = createAppearance(row * 3 + col);
+
+ for (int i = 0; i < 3; i++) {
+ double ypos = (double)(i - 1) * 0.6;
+ for (int j = 0; j < 3; j++) {
+ double xpos = (double)(j - 1) * 0.6;
+ objRoot.addChild(createObject(app[i][j], 0.12, xpos, ypos));
+ }
+ }
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+
+ private Appearance createAppearance(int idx) {
+ Appearance app = new SimpleShaderAppearance(true, false);;
+
+ // Globally used colors
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+
+ switch (idx) {
+ // Unlit solid
+ case 0:
+ {
+ // Set up the coloring properties
+ Color3f objColor = new Color3f(1.0f, 0.2f, 0.4f);
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(objColor);
+ app.setColoringAttributes(ca);
+ break;
+ }
+
+
+ // Unlit wire frame
+ case 1:
+ {
+ // Set up the coloring properties
+ Color3f objColor = new Color3f(0.5f, 0.0f, 0.2f);
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(objColor);
+ app.setColoringAttributes(ca);
+
+ // Set up the polygon attributes
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setPolygonMode(pa.POLYGON_LINE);
+ pa.setCullFace(pa.CULL_NONE);
+ app.setPolygonAttributes(pa);
+ break;
+ }
+
+ // Unlit points
+ case 2:
+ {
+ // Set up the coloring properties
+ Color3f objColor = new Color3f(0.2f, 0.2f, 1.0f);
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(objColor);
+ app.setColoringAttributes(ca);
+
+ // Set up the polygon attributes
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setPolygonMode(pa.POLYGON_POINT);
+ pa.setCullFace(pa.CULL_NONE);
+ app.setPolygonAttributes(pa);
+
+ // Set up point attributes
+ PointAttributes pta = new PointAttributes();
+ pta.setPointSize(5.0f);
+ app.setPointAttributes(pta);
+ break;
+ }
+
+ // Lit solid
+ case 3:
+ {
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ white, 80.0f));
+ break;
+ }
+
+ // Texture mapped, lit solid
+ case 4:
+ {app = new SimpleShaderAppearance(true, true);;
+ // Set up the texture map
+ TextureLoader tex = new TextureLoader(texImage, this);
+ app.setTexture(tex.getTexture());
+
+ TextureAttributes texAttr = new TextureAttributes();
+ texAttr.setTextureMode(TextureAttributes.MODULATE);
+ app.setTextureAttributes(texAttr);
+
+
+ // Set up the material properties
+ app.setMaterial(new Material(white, black, white, black, 1.0f));
+ break;
+ }
+
+ // Transparent, lit solid
+ case 5:
+ {
+ // Set up the transparency properties
+ TransparencyAttributes ta = new TransparencyAttributes();
+ ta.setTransparencyMode(ta.BLENDED);
+ ta.setTransparency(0.6f);
+ app.setTransparencyAttributes(ta);
+
+ // Set up the polygon attributes
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setCullFace(pa.CULL_NONE);
+ app.setPolygonAttributes(pa);
+
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.7f, 0.8f, 1.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ black, 1.0f));
+ break;
+ }
+
+ // Lit solid, no specular
+ case 6:
+ {
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ black, 80.0f));
+ break;
+ }
+
+ // Lit solid, specular only
+ case 7:
+ {
+
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
+ app.setMaterial(new Material(black, black, black,
+ white, 80.0f));
+ break;
+ }
+
+ // Another lit solid with a different color
+ case 8:
+ {
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.8f, 0.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ white, 80.0f));
+ break;
+ }
+
+ default:
+ {
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(new Color3f(0.0f, 1.0f, 0.0f));
+ app.setColoringAttributes(ca);
+ }
+ }
+
+ return app;
+ }
+
+
+ private Group createObject(Appearance app, double scale,
+ double xpos, double ypos) {
+
+ // Create a transform group node to scale and position the object.
+ Transform3D t = new Transform3D();
+ t.set(scale, new Vector3d(xpos, ypos, 0.0));
+ TransformGroup objTrans = new TransformGroup(t);
+
+ // Create a second transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime.
+ TransformGroup spinTg = new TransformGroup();
+ spinTg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+
+ // Create a simple shape leaf node and set the appearance
+ Shape3D shape = new Tetrahedron();
+ shape.setAppearance(app);
+
+ // add it to the scene graph.
+ spinTg.addChild(shape);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into
+ // the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 5000, 0, 0,
+ 0, 0, 0);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, spinTg, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ rotator.setSchedulingBounds(bounds);
+
+ // Add the behavior and the transform group to the object
+ objTrans.addChild(rotator);
+ objTrans.addChild(spinTg);
+
+ return objTrans;
+ }
+
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a MyCanvas3D using the preferred configuration
+ MyCanvas3D c = new MyCanvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form AppearanceMixed
+ */
+ public AppearanceMixedGL2ES2() {
+
+ if (bgImage == null) {
+ // the path to the image for an applet
+ bgImage = Resources.getResource("resources/images/bg.jpg");
+ if (bgImage == null) {
+ System.err.println("resources/images/bg.jpg not found");
+ System.exit(1);
+ }
+ }
+
+ if (texImage == null) {
+ // the path to the image for an applet
+ texImage = Resources.getResource("resources/images/stone.jpg");
+ if (texImage == null) {
+ System.err.println("resources/images/stone.jpg not found");
+ System.exit(1);
+ }
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("AppearanceMixed");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend", "jogl2es2");System.setProperty("j3d.displaylist", "false");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new AppearanceMixedGL2ES2().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceTest.form b/src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceTest.form
new file mode 100644
index 0000000..43cd90f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceTest.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="AppearanceTest"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceTest.java b/src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceTest.java
new file mode 100644
index 0000000..0f0315a
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/appearance/AppearanceTest.java
@@ -0,0 +1,419 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.appearance;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointAttributes;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.TextureAttributes;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TransparencyAttributes;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class AppearanceTest extends javax.swing.JFrame {
+
+ private java.net.URL texImage = null;
+ private java.net.URL bgImage = null;
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ private BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the background
+ TextureLoader bgTexture = new TextureLoader(bgImage, this);
+ Background bg = new Background(bgTexture.getImage());
+ bg.setApplicationBounds(bounds);
+ objRoot.addChild(bg);
+
+ // Set up the global lights
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+
+ AmbientLight aLgt = new AmbientLight(alColor);
+ aLgt.setInfluencingBounds(bounds);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ lgt1.setInfluencingBounds(bounds);
+ objRoot.addChild(aLgt);
+ objRoot.addChild(lgt1);
+
+ // Create a bunch of objects with a behavior and add them
+ // into the scene graph.
+
+ int row, col;
+ Appearance[][] app = new Appearance[3][3];
+
+ for (row = 0; row < 3; row++)
+ for (col = 0; col < 3; col++)
+ app[row][col] = createAppearance(row * 3 + col);
+
+ for (int i = 0; i < 3; i++) {
+ double ypos = (double)(i - 1) * 0.6;
+ for (int j = 0; j < 3; j++) {
+ double xpos = (double)(j - 1) * 0.6;
+ objRoot.addChild(createObject(app[i][j], 0.12, xpos, ypos));
+ }
+ }
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Appearance createAppearance(int idx) {
+ Appearance app = new Appearance();
+
+ // Globally used colors
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+
+ switch (idx) {
+ // Unlit solid
+ case 0:
+ {
+ // Set up the coloring properties
+ Color3f objColor = new Color3f(1.0f, 0.2f, 0.4f);
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(objColor);
+ app.setColoringAttributes(ca);
+ break;
+ }
+
+
+ // Unlit wire frame
+ case 1:
+ {
+ // Set up the coloring properties
+ Color3f objColor = new Color3f(0.5f, 0.0f, 0.2f);
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(objColor);
+ app.setColoringAttributes(ca);
+
+ // Set up the polygon attributes
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setPolygonMode(pa.POLYGON_LINE);
+ pa.setCullFace(pa.CULL_NONE);
+ app.setPolygonAttributes(pa);
+ break;
+ }
+
+ // Unlit points
+ case 2:
+ {
+ // Set up the coloring properties
+ Color3f objColor = new Color3f(0.2f, 0.2f, 1.0f);
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(objColor);
+ app.setColoringAttributes(ca);
+
+ // Set up the polygon attributes
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setPolygonMode(pa.POLYGON_POINT);
+ pa.setCullFace(pa.CULL_NONE);
+ app.setPolygonAttributes(pa);
+
+ // Set up point attributes
+ PointAttributes pta = new PointAttributes();
+ pta.setPointSize(5.0f);
+ app.setPointAttributes(pta);
+ break;
+ }
+
+ // Lit solid
+ case 3:
+ {
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ white, 80.0f));
+ break;
+ }
+
+ // Texture mapped, lit solid
+ case 4:
+ {
+ // Set up the texture map
+ TextureLoader tex = new TextureLoader(texImage, this);
+ app.setTexture(tex.getTexture());
+
+ TextureAttributes texAttr = new TextureAttributes();
+ texAttr.setTextureMode(TextureAttributes.MODULATE);
+ app.setTextureAttributes(texAttr);
+
+ // Set up the material properties
+ app.setMaterial(new Material(white, black, white, black, 1.0f));
+ break;
+ }
+
+ // Transparent, lit solid
+ case 5:
+ {
+ // Set up the transparency properties
+ TransparencyAttributes ta = new TransparencyAttributes();
+ ta.setTransparencyMode(ta.BLENDED);
+ ta.setTransparency(0.6f);
+ app.setTransparencyAttributes(ta);
+
+ // Set up the polygon attributes
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setCullFace(pa.CULL_NONE);
+ app.setPolygonAttributes(pa);
+
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.7f, 0.8f, 1.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ black, 1.0f));
+ break;
+ }
+
+ // Lit solid, no specular
+ case 6:
+ {
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ black, 80.0f));
+ break;
+ }
+
+ // Lit solid, specular only
+ case 7:
+ {
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
+ app.setMaterial(new Material(black, black, black,
+ white, 80.0f));
+ break;
+ }
+
+ // Another lit solid with a different color
+ case 8:
+ {
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.8f, 0.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ white, 80.0f));
+ break;
+ }
+
+ default:
+ {
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(new Color3f(0.0f, 1.0f, 0.0f));
+ app.setColoringAttributes(ca);
+ }
+ }
+
+ return app;
+ }
+
+
+ private Group createObject(Appearance app, double scale,
+ double xpos, double ypos) {
+
+ // Create a transform group node to scale and position the object.
+ Transform3D t = new Transform3D();
+ t.set(scale, new Vector3d(xpos, ypos, 0.0));
+ TransformGroup objTrans = new TransformGroup(t);
+
+ // Create a second transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime.
+ TransformGroup spinTg = new TransformGroup();
+ spinTg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+
+ // Create a simple shape leaf node and set the appearance
+ Shape3D shape = new Tetrahedron();
+ shape.setAppearance(app);
+
+ // add it to the scene graph.
+ spinTg.addChild(shape);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into
+ // the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 5000, 0, 0,
+ 0, 0, 0);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, spinTg, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ rotator.setSchedulingBounds(bounds);
+
+ // Add the behavior and the transform group to the object
+ objTrans.addChild(rotator);
+ objTrans.addChild(spinTg);
+
+ return objTrans;
+ }
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form AppearanceTest
+ */
+ public AppearanceTest() {
+
+ if (bgImage == null) {
+ // the path to the image for an applet
+ bgImage = Resources.getResource("resources/images/bg.jpg");
+ if (bgImage == null) {
+ System.err.println("resources/images/bg.jpg not found");
+ System.exit(1);
+ }
+ }
+
+ if (texImage == null) {
+ // the path to the image for an applet
+ texImage = Resources.getResource("resources/images/stone.jpg");
+ if (texImage == null) {
+ System.err.println("resources/images/stone.jpg not found");
+ System.exit(1);
+ }
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("AppearanceTest");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new AppearanceTest().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/appearance/Tetrahedron.java b/src/main/java/org/jdesktop/j3d/examples/appearance/Tetrahedron.java
new file mode 100644
index 0000000..625e7e4
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/appearance/Tetrahedron.java
@@ -0,0 +1,113 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.appearance;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.TriangleArray;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.TexCoord2f;
+import org.jogamp.vecmath.Vector3f;
+
+public class Tetrahedron extends Shape3D {
+ private static final float sqrt3 = (float) Math.sqrt(3.0);
+ private static final float sqrt3_3 = sqrt3 / 3.0f;
+ private static final float sqrt24_3 = (float) Math.sqrt(24.0) / 3.0f;
+
+ private static final float ycenter = 0.5f * sqrt24_3;
+ private static final float zcenter = -sqrt3_3;
+
+ private static final Point3f p1 = new Point3f(-1.0f, -ycenter, -zcenter);
+ private static final Point3f p2 = new Point3f(1.0f, -ycenter, -zcenter);
+ private static final Point3f p3 =
+ new Point3f(0.0f, -ycenter, -sqrt3 - zcenter);
+ private static final Point3f p4 =
+ new Point3f(0.0f, sqrt24_3 - ycenter, 0.0f);
+
+ private static final Point3f[] verts = {
+ p1, p2, p4, // front face
+ p1, p4, p3, // left, back face
+ p2, p3, p4, // right, back face
+ p1, p3, p2, // bottom face
+ };
+
+ private TexCoord2f texCoord[] = {
+ new TexCoord2f(0.0f, 0.0f),
+ new TexCoord2f(1.0f, 0.0f),
+ new TexCoord2f(0.5f, sqrt3 / 2.0f),
+ };
+
+ public Tetrahedron() {
+ int i;
+
+ TriangleArray tetra = new TriangleArray(12, TriangleArray.COORDINATES |
+ TriangleArray.NORMALS | TriangleArray.TEXTURE_COORDINATE_2);
+
+ tetra.setCoordinates(0, verts);
+ for (i = 0; i < 12; i++) {
+ tetra.setTextureCoordinate(0, i, texCoord[i%3]);
+ }
+
+ int face;
+ Vector3f normal = new Vector3f();
+ Vector3f v1 = new Vector3f();
+ Vector3f v2 = new Vector3f();
+ Point3f [] pts = new Point3f[3];
+ for (i = 0; i < 3; i++) pts[i] = new Point3f();
+
+ for (face = 0; face < 4; face++) {
+ tetra.getCoordinates(face*3, pts);
+ v1.sub(pts[1], pts[0]);
+ v2.sub(pts[2], pts[0]);
+ normal.cross(v1, v2);
+ normal.normalize();
+ for (i = 0; i < 3; i++) {
+ tetra.setNormal((face * 3 + i), normal);
+ }
+ }
+ this.setGeometry(tetra);
+ this.setAppearance(new Appearance());
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/applet3d/Applet3D.form b/src/main/java/org/jdesktop/j3d/examples/applet3d/Applet3D.form
new file mode 100644
index 0000000..a70fb22
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/applet3d/Applet3D.form
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+ <AuxValues>
+ <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="guiPanel">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="North"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JButton" name="pauseButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Pause"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="pauseButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="4" insetsLeft="4" insetsBottom="4" insetsRight="4" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JButton" name="resumeButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Resume"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="resumeButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="4" insetsLeft="4" insetsBottom="4" insetsRight="4" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/applet3d/Applet3D.html b/src/main/java/org/jdesktop/j3d/examples/applet3d/Applet3D.html
new file mode 100644
index 0000000..037c7c1
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/applet3d/Applet3D.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<title>Simple 3D Applet</title>
+</head>
+<body>
+<applet code="org.jdesktop.applet.util.JNLPAppletLauncher"
+ width=500 height=400
+ archive="../../../../../../../dist/j3d-examples.jar,
+ http://download.java.net/media/applet-launcher/applet-launcher.jar,
+ http://download.java.net/media/java3d/webstart/release/j3d/latest/j3dcore.jar,
+ http://download.java.net/media/java3d/webstart/release/j3d/latest/j3dutils.jar,
+ http://download.java.net/media/java3d/webstart/release/vecmath/latest/vecmath.jar,
+ http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jar,
+ http://download.java.net/media/gluegen/webstart/gluegen-rt.jar">
+ <param name="codebase_lookup" value="false">
+ <param name="subapplet.classname" value="org.jdesktop.j3d.examples.applet3d.Applet3D$MyApplet">
+ <param name="subapplet.displayname" value="Java 3D Simple Applet">
+ <param name="jnlpNumExtensions" value="1">
+ <param name="jnlpExtension1" value="http://download.java.net/media/java3d/webstart/release/java3d-latest.jnlp">
+ <param name="progressbar" value="true">
+ <param name="noddraw.check" value="true">
+</applet>
+<p>Simple Java 3D Applet</p>
+</body>
+</html>
diff --git a/src/main/java/org/jdesktop/j3d/examples/applet3d/Applet3D.java b/src/main/java/org/jdesktop/j3d/examples/applet3d/Applet3D.java
new file mode 100644
index 0000000..1822cba
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/applet3d/Applet3D.java
@@ -0,0 +1,275 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.applet3d;
+
+import java.awt.BorderLayout;
+import java.awt.Container;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+
+import javax.swing.JApplet;
+import javax.swing.JFrame;
+import javax.swing.JPopupMenu;
+import javax.swing.WindowConstants;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.GraphicsConfigTemplate3D;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Point3d;
+
+/**
+ * Simple Java 3D program that can be run as an application or as an applet.
+ */
+public class Applet3D extends javax.swing.JPanel {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ private Alpha rotationAlpha1;
+ private Alpha rotationAlpha2;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create two TransformGroup nodes in series
+ TransformGroup objTrans1 = new TransformGroup();
+ objTrans1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans1);
+
+ // Create two TransformGroup nodes in series
+ TransformGroup objTrans2 = new TransformGroup();
+ objTrans2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans1.addChild(objTrans2);
+
+ // Create a simple Shape3D node; add it to the scene graph.
+ objTrans2.addChild(new ColorCube(0.4));
+
+ // Create 2 new Behavior objects that will perform the
+ // desired operations on the specified transforms and add
+ // them into the scene graph.
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ Transform3D yAxis1 = new Transform3D();
+ rotationAlpha1 = new Alpha(-1, 4000);
+
+ RotationInterpolator rotator1 =
+ new RotationInterpolator(rotationAlpha1, objTrans1, yAxis1,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator1.setSchedulingBounds(bounds);
+ objRoot.addChild(rotator1);
+
+ Transform3D yAxis2 = new Transform3D();
+ yAxis2.rotX(Math.PI/4.0);
+ rotationAlpha2 = new Alpha(-1, 13000);
+
+ RotationInterpolator rotator2 =
+ new RotationInterpolator(rotationAlpha2, objTrans2, yAxis2,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator2.setSchedulingBounds(bounds);
+ objRoot.addChild(rotator2);
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse(Container container) {
+ GraphicsDevice graphicsDevice;
+ if (container.getGraphicsConfiguration() != null) {
+ graphicsDevice = container.getGraphicsConfiguration().getDevice();
+ } else {
+ graphicsDevice =
+ GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
+ }
+ GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();
+ GraphicsConfiguration config = graphicsDevice.getBestConfiguration(template);
+
+ Canvas3D c = new Canvas3D(config);
+
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ private void destroy() {
+ univ.cleanup();
+ }
+
+ /**
+ * Creates new form Applet3D
+ */
+ public Applet3D(Container container) {
+ // Initialize the GUI components
+ JPopupMenu.setDefaultLightWeightPopupEnabled(false);
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse(container);
+ drawingPanel.add(c, BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ // Applet framework
+
+ public static class MyApplet extends JApplet {
+ Applet3D mainPanel;
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ setLayout(new BorderLayout());
+ mainPanel = new Applet3D(this);
+ add(mainPanel, BorderLayout.CENTER);
+ }
+
+ public void destroy() {
+ mainPanel.destroy();
+ }
+ }
+
+ // Application framework
+
+ private static class MyFrame extends JFrame {
+ MyFrame() {
+ setLayout(new BorderLayout());
+ setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+ setTitle("Simple 3D Applet");
+ getContentPane().add(new Applet3D(this), BorderLayout.CENTER);
+ pack();
+ }
+ }
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new MyFrame().setVisible(true);
+ }
+ });
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ guiPanel = new javax.swing.JPanel();
+ pauseButton = new javax.swing.JButton();
+ resumeButton = new javax.swing.JButton();
+ drawingPanel = new javax.swing.JPanel();
+
+ setLayout(new java.awt.BorderLayout());
+
+ guiPanel.setLayout(new java.awt.GridBagLayout());
+
+ pauseButton.setText("Pause");
+ pauseButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ pauseButtonActionPerformed(evt);
+ }
+ });
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
+ guiPanel.add(pauseButton, gridBagConstraints);
+
+ resumeButton.setText("Resume");
+ resumeButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ resumeButtonActionPerformed(evt);
+ }
+ });
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
+ guiPanel.add(resumeButton, gridBagConstraints);
+
+ add(guiPanel, java.awt.BorderLayout.NORTH);
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+ add(drawingPanel, java.awt.BorderLayout.CENTER);
+ }// </editor-fold>//GEN-END:initComponents
+
+ private void resumeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_resumeButtonActionPerformed
+ rotationAlpha1.resume();
+ rotationAlpha2.resume();
+ }//GEN-LAST:event_resumeButtonActionPerformed
+
+ private void pauseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pauseButtonActionPerformed
+ rotationAlpha1.pause();
+ rotationAlpha2.pause();
+ }//GEN-LAST:event_pauseButtonActionPerformed
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ private javax.swing.JPanel guiPanel;
+ private javax.swing.JButton pauseButton;
+ private javax.swing.JButton resumeButton;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/background/BackgroundGeometry.form b/src/main/java/org/jdesktop/j3d/examples/background/BackgroundGeometry.form
new file mode 100644
index 0000000..9e76404
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/background/BackgroundGeometry.form
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="BackgroundGeometry"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="opaque" type="boolean" value="false"/>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/background/BackgroundGeometry.java b/src/main/java/org/jdesktop/j3d/examples/background/BackgroundGeometry.java
new file mode 100644
index 0000000..18d2f5f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/background/BackgroundGeometry.java
@@ -0,0 +1,280 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.background;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseRotate;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseTranslate;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseZoom;
+import org.jogamp.java3d.utils.geometry.Box;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class BackgroundGeometry extends javax.swing.JFrame {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+ private java.net.URL bgImage = null;
+ private BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ public BranchGroup createSceneGraph() {
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime.
+ TransformGroup objTrans = new TransformGroup();
+ objScale.addChild(objTrans);
+
+ Background bg = new Background();
+ bg.setApplicationBounds(bounds);
+ BranchGroup backGeoBranch = new BranchGroup();
+ Sphere sphereObj = new Sphere(1.0f, Sphere.GENERATE_NORMALS |
+ Sphere.GENERATE_NORMALS_INWARD |
+ Sphere.GENERATE_TEXTURE_COORDS |
+ Sphere.GENERATE_TEXTURE_COORDS_Y_UP, 45);
+ Appearance backgroundApp = sphereObj.getAppearance();
+ backGeoBranch.addChild(sphereObj);
+ bg.setGeometry(backGeoBranch);
+ objTrans.addChild(bg);
+
+ TextureLoader tex = new TextureLoader(bgImage,
+ new String("RGB"),
+ TextureLoader.BY_REFERENCE | TextureLoader.Y_UP,
+ this);
+ if (tex != null)
+ backgroundApp.setTexture(tex.getTexture());
+
+ Vector3f tranlation = new Vector3f(2.0f, 0.0f, 0.0f);
+ Transform3D modelTransform = new Transform3D();
+ Transform3D tmpTransform = new Transform3D();
+ double angleInc = Math.PI/8.0;
+ double angle = 0.0;
+ int numBoxes = 16;
+
+ float scaleX[] = {0.1f, 0.2f, 0.2f, 0.3f,
+ 0.2f, 0.1f, 0.2f, 0.3f,
+ 0.1f, 0.3f, 0.2f, 0.3f,
+ 0.1f, 0.3f, 0.2f, 0.3f};
+
+ float scaleY[] = {0.3f, 0.4f, 0.3f, 0.4f,
+ 0.3f, 0.4f, 0.3f, 0.4f,
+ 0.3f, 0.3f, 0.3f, 0.3f,
+ 0.3f, 0.3f, 0.3f, 0.4f};
+
+ float scaleZ[] = {0.3f, 0.2f, 0.1f, 0.1f,
+ 0.3f, 0.2f, 0.1f, 0.3f,
+ 0.3f, 0.2f, 0.1f, 0.3f,
+ 0.3f, 0.2f, 0.1f, 0.2f};
+
+ Appearance a1 = new Appearance();
+ Color3f eColor = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f sColor = new Color3f(0.5f, 0.5f, 1.0f);
+ Color3f oColor = new Color3f(0.5f, 0.5f, 0.3f);
+
+ Material m = new Material(oColor, eColor, oColor, sColor, 100.0f);
+ m.setLightingEnable(true);
+ a1.setMaterial(m);
+
+ for (int i=0; i<numBoxes; i++, angle += angleInc) {
+ modelTransform.rotY(angle);
+ tmpTransform.set(tranlation);
+ modelTransform.mul(tmpTransform);
+
+ TransformGroup tgroup = new TransformGroup(modelTransform);
+ objTrans.addChild(tgroup);
+
+ tgroup.addChild( new Box(scaleX[i],scaleY[i],scaleZ[i],
+ Box.GENERATE_NORMALS,a1));
+ }
+
+
+ // Shine it with two lights.
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Color3f lColor2 = new Color3f(0.2f, 0.2f, 0.1f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
+ Vector3f lDir2 = new Vector3f(0.0f, 0.0f, -1.0f);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ DirectionalLight lgt2 = new DirectionalLight(lColor2, lDir2);
+ lgt1.setInfluencingBounds(bounds);
+ lgt2.setInfluencingBounds(bounds);
+ objScale.addChild(lgt1);
+ objScale.addChild(lgt2);
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ TransformGroup viewTrans =
+ univ.getViewingPlatform().getViewPlatformTransform();
+
+ // Create the rotate behavior node
+ MouseRotate behavior1 = new MouseRotate(viewTrans);
+ scene.addChild(behavior1);
+ behavior1.setSchedulingBounds(bounds);
+
+ // Create the zoom behavior node
+ MouseZoom behavior2 = new MouseZoom(viewTrans);
+ scene.addChild(behavior2);
+ behavior2.setSchedulingBounds(bounds);
+
+ // Create the translate behavior node
+ MouseTranslate behavior3 = new MouseTranslate(viewTrans);
+ scene.addChild(behavior3);
+ behavior3.setSchedulingBounds(bounds);
+
+ return c;
+ }
+
+ /**
+ * Creates new form BackgroundGeometry
+ */
+ public BackgroundGeometry() {
+
+ if (bgImage == null) {
+ // the path to the image for an applet
+ bgImage = Resources.getResource("resources/images/bg.jpg");
+ if (bgImage == null) {
+ System.err.println("resources/images/bg.jpg not found");
+ System.exit(1);
+ }
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ scene.compile();
+
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("BackgroundGeometry");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setOpaque(false);
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new BackgroundGeometry().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/background/BackgroundGeometryGL2ES2.java b/src/main/java/org/jdesktop/j3d/examples/background/BackgroundGeometryGL2ES2.java
new file mode 100644
index 0000000..709dd78
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/background/BackgroundGeometryGL2ES2.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.background;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jdesktop.j3d.examples.gl2es2pipeline.SimpleShaderAppearance;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseRotate;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseTranslate;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseZoom;
+import org.jogamp.java3d.utils.geometry.Box;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class BackgroundGeometryGL2ES2 extends javax.swing.JFrame {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+ private java.net.URL bgImage = null;
+ private BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ public BranchGroup createSceneGraph() {
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime.
+ TransformGroup objTrans = new TransformGroup();
+ objScale.addChild(objTrans);
+
+ Background bg = new Background();
+ bg.setApplicationBounds(bounds);
+ BranchGroup backGeoBranch = new BranchGroup();
+ Sphere sphereObj = new Sphere(1.0f, Sphere.GENERATE_NORMALS |
+ Sphere.GENERATE_NORMALS_INWARD |
+ Sphere.GENERATE_TEXTURE_COORDS |
+ Sphere.GENERATE_TEXTURE_COORDS_Y_UP, 45);
+ Appearance backgroundApp = new SimpleShaderAppearance(true, false);//sphereObj.getAppearance();
+ sphereObj.setAppearance(backgroundApp);
+ backGeoBranch.addChild(sphereObj);
+ bg.setGeometry(backGeoBranch);
+ objTrans.addChild(bg);
+
+ TextureLoader tex = new TextureLoader(bgImage,
+ new String("RGB"),
+ TextureLoader.BY_REFERENCE | TextureLoader.Y_UP,
+ this);
+ if (tex != null)
+ backgroundApp.setTexture(tex.getTexture());
+
+ Vector3f tranlation = new Vector3f(2.0f, 0.0f, 0.0f);
+ Transform3D modelTransform = new Transform3D();
+ Transform3D tmpTransform = new Transform3D();
+ double angleInc = Math.PI/8.0;
+ double angle = 0.0;
+ int numBoxes = 16;
+
+ float scaleX[] = {0.1f, 0.2f, 0.2f, 0.3f,
+ 0.2f, 0.1f, 0.2f, 0.3f,
+ 0.1f, 0.3f, 0.2f, 0.3f,
+ 0.1f, 0.3f, 0.2f, 0.3f};
+
+ float scaleY[] = {0.3f, 0.4f, 0.3f, 0.4f,
+ 0.3f, 0.4f, 0.3f, 0.4f,
+ 0.3f, 0.3f, 0.3f, 0.3f,
+ 0.3f, 0.3f, 0.3f, 0.4f};
+
+ float scaleZ[] = {0.3f, 0.2f, 0.1f, 0.1f,
+ 0.3f, 0.2f, 0.1f, 0.3f,
+ 0.3f, 0.2f, 0.1f, 0.3f,
+ 0.3f, 0.2f, 0.1f, 0.2f};
+
+ Appearance a1 = new SimpleShaderAppearance(true, false);
+
+ Color3f eColor = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f sColor = new Color3f(0.5f, 0.5f, 1.0f);
+ Color3f oColor = new Color3f(0.5f, 0.5f, 0.3f);
+
+ Material m = new Material(oColor, eColor, oColor, sColor, 100.0f);
+ m.setLightingEnable(true);
+ a1.setMaterial(m);
+
+ for (int i=0; i<numBoxes; i++, angle += angleInc) {
+ modelTransform.rotY(angle);
+ tmpTransform.set(tranlation);
+ modelTransform.mul(tmpTransform);
+
+ TransformGroup tgroup = new TransformGroup(modelTransform);
+ objTrans.addChild(tgroup);
+
+ tgroup.addChild( new Box(scaleX[i],scaleY[i],scaleZ[i],
+ Box.GENERATE_NORMALS,a1));
+ }
+
+
+ // Shine it with two lights.
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Color3f lColor2 = new Color3f(0.2f, 0.2f, 0.1f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
+ Vector3f lDir2 = new Vector3f(0.0f, 0.0f, -1.0f);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ DirectionalLight lgt2 = new DirectionalLight(lColor2, lDir2);
+ lgt1.setInfluencingBounds(bounds);
+ lgt2.setInfluencingBounds(bounds);
+ objScale.addChild(lgt1);
+ objScale.addChild(lgt2);
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ TransformGroup viewTrans =
+ univ.getViewingPlatform().getViewPlatformTransform();
+
+ // Create the rotate behavior node
+ MouseRotate behavior1 = new MouseRotate(viewTrans);
+ scene.addChild(behavior1);
+ behavior1.setSchedulingBounds(bounds);
+
+ // Create the zoom behavior node
+ MouseZoom behavior2 = new MouseZoom(viewTrans);
+ scene.addChild(behavior2);
+ behavior2.setSchedulingBounds(bounds);
+
+ // Create the translate behavior node
+ MouseTranslate behavior3 = new MouseTranslate(viewTrans);
+ scene.addChild(behavior3);
+ behavior3.setSchedulingBounds(bounds);
+
+ return c;
+ }
+
+ /**
+ * Creates new form BackgroundGeometry
+ */
+ public BackgroundGeometryGL2ES2() {
+
+ if (bgImage == null) {
+ // the path to the image for an applet
+ bgImage = Resources.getResource("resources/images/bg.jpg");
+ if (bgImage == null) {
+ System.err.println("resources/images/bg.jpg not found");
+ System.exit(1);
+ }
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ scene.compile();
+
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("BackgroundGeometry");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setOpaque(false);
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend", "jogl2es2");System.setProperty("j3d.displaylist", "false");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ new BackgroundGeometryGL2ES2().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/collision/Box.java b/src/main/java/org/jdesktop/j3d/examples/collision/Box.java
new file mode 100644
index 0000000..a472fb3
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/collision/Box.java
@@ -0,0 +1,102 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.collision;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.QuadArray;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.vecmath.Point3d;
+
+public class Box extends Shape3D {
+
+ public Box(double xsize, double ysize, double zsize) {
+ super();
+ double xmin = -xsize/2.0;
+ double xmax = xsize/2.0;
+ double ymin = -ysize/2.0;
+ double ymax = ysize/2.0;
+ double zmin = -zsize/2.0;
+ double zmax = zsize/2.0;
+
+ QuadArray box = new QuadArray(24, QuadArray.COORDINATES);
+
+ Point3d verts[] = new Point3d[24];
+
+ // front face
+ verts[0] = new Point3d(xmax, ymin, zmax);
+ verts[1] = new Point3d(xmax, ymax, zmax);
+ verts[2] = new Point3d(xmin, ymax, zmax);
+ verts[3] = new Point3d(xmin, ymin, zmax);
+ // back face
+ verts[4] = new Point3d(xmin, ymin, zmin);
+ verts[5] = new Point3d(xmin, ymax, zmin);
+ verts[6] = new Point3d(xmax, ymax, zmin);
+ verts[7] = new Point3d(xmax, ymin, zmin);
+ // right face
+ verts[8] = new Point3d(xmax, ymin, zmin);
+ verts[9] = new Point3d(xmax, ymax, zmin);
+ verts[10] = new Point3d(xmax, ymax, zmax);
+ verts[11] = new Point3d(xmax, ymin, zmax);
+ // left face
+ verts[12] = new Point3d(xmin, ymin, zmax);
+ verts[13] = new Point3d(xmin, ymax, zmax);
+ verts[14] = new Point3d(xmin, ymax, zmin);
+ verts[15] = new Point3d(xmin, ymin, zmin);
+ // top face
+ verts[16] = new Point3d(xmax, ymax, zmax);
+ verts[17] = new Point3d(xmax, ymax, zmin);
+ verts[18] = new Point3d(xmin, ymax, zmin);
+ verts[19] = new Point3d(xmin, ymax, zmax);
+ // bottom face
+ verts[20] = new Point3d(xmin, ymin, zmax);
+ verts[21] = new Point3d(xmin, ymin, zmin);
+ verts[22] = new Point3d(xmax, ymin, zmin);
+ verts[23] = new Point3d(xmax, ymin, zmax);
+
+ box.setCoordinates(0, verts);
+ setGeometry(box);
+ setAppearance(new Appearance());
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/collision/CollisionDetector.java b/src/main/java/org/jdesktop/j3d/examples/collision/CollisionDetector.java
new file mode 100644
index 0000000..5d25810
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/collision/CollisionDetector.java
@@ -0,0 +1,98 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.collision;
+
+import java.util.Enumeration;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.WakeupOnCollisionEntry;
+import org.jogamp.java3d.WakeupOnCollisionExit;
+import org.jogamp.vecmath.Color3f;
+
+public class CollisionDetector extends Behavior {
+ private static final Color3f highlightColor =
+ new Color3f(0.0f, 1.0f, 0.0f);
+ private static final ColoringAttributes highlight =
+ new ColoringAttributes(highlightColor,
+ ColoringAttributes.SHADE_GOURAUD);
+
+ private boolean inCollision = false;
+ private Shape3D shape;
+ private ColoringAttributes shapeColoring;
+ private Appearance shapeAppearance;
+
+ private WakeupOnCollisionEntry wEnter;
+ private WakeupOnCollisionExit wExit;
+
+
+ public CollisionDetector(Shape3D s) {
+ shape = s;
+ shapeAppearance = shape.getAppearance();
+ shapeColoring = shapeAppearance.getColoringAttributes();
+ inCollision = false;
+ }
+
+ public void initialize() {
+ wEnter = new WakeupOnCollisionEntry(shape);
+ wExit = new WakeupOnCollisionExit(shape);
+ wakeupOn(wEnter);
+ }
+
+ public void processStimulus(Enumeration criteria) {
+ inCollision = !inCollision;
+
+ if (inCollision) {
+ shapeAppearance.setColoringAttributes(highlight);
+ wakeupOn(wExit);
+ }
+ else {
+ shapeAppearance.setColoringAttributes(shapeColoring);
+ wakeupOn(wEnter);
+ }
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/collision/TickTockCollision.form b/src/main/java/org/jdesktop/j3d/examples/collision/TickTockCollision.form
new file mode 100644
index 0000000..5a555b4
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/collision/TickTockCollision.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="TickTockCollision"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/collision/TickTockCollision.java b/src/main/java/org/jdesktop/j3d/examples/collision/TickTockCollision.java
new file mode 100644
index 0000000..8d1cba2
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/collision/TickTockCollision.java
@@ -0,0 +1,272 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.collision;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3d;
+
+/**
+ * Simple Java 3D example program to display how collision work.
+ */
+public class TickTockCollision extends javax.swing.JFrame {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and behaviors
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objScale.addChild(bg);
+
+ // Create a pair of transform group nodes and initialize them to
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behaviors can modify them at runtime. Add them to the
+ // root of the subgraph.
+ TransformGroup objTrans1 = new TransformGroup();
+ objTrans1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(objTrans1);
+
+ TransformGroup objTrans2 = new TransformGroup();
+ objTrans2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans1.addChild(objTrans2);
+
+ // Create the positioning and scaling transform group node.
+ Transform3D t = new Transform3D();
+ t.set(0.3, new Vector3d(0.0, -1.5, 0.0));
+ TransformGroup objTrans3 = new TransformGroup(t);
+ objTrans2.addChild(objTrans3);
+
+ // Create a simple shape leaf node, add it to the scene graph.
+ objTrans3.addChild(new ColorCube());
+
+ // Create a new Behavior object that will perform the desired
+ // rotation on the specified transform object and add it into
+ // the scene graph.
+ Transform3D yAxis1 = new Transform3D();
+ yAxis1.rotX(Math.PI/2.0);
+ Alpha tickTockAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE |
+ Alpha.DECREASING_ENABLE,
+ 0, 0,
+ 5000, 2500, 200,
+ 5000, 2500, 200);
+
+ RotationInterpolator tickTock =
+ new RotationInterpolator(tickTockAlpha, objTrans1, yAxis1,
+ -(float) Math.PI/2.0f,
+ (float) Math.PI/2.0f);
+ tickTock.setSchedulingBounds(bounds);
+ objTrans2.addChild(tickTock);
+
+ // Create a new Behavior object that will perform the desired
+ // rotation on the specified transform object and add it into
+ // the scene graph.
+ Transform3D yAxis2 = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans2, yAxis2,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator.setSchedulingBounds(bounds);
+ objTrans2.addChild(rotator);
+
+ // Now create a pair of rectangular boxes, each with a collision
+ // detection behavior attached. The behavior will highlight the
+ // object when it is in a state of collision.
+
+ Group box1 = createBox(0.3, new Vector3d(-1.3, 0.0, 0.0));
+ Group box2 = createBox(0.3, new Vector3d( 1.3, 0.0, 0.0));
+
+ objScale.addChild(box1);
+ objScale.addChild(box2);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Group createBox(double scale, Vector3d pos) {
+ // Create a transform group node to scale and position the object.
+ Transform3D t = new Transform3D();
+ t.set(scale, pos);
+ TransformGroup objTrans = new TransformGroup(t);
+
+ // Create a simple shape leaf node and add it to the scene graph
+ Shape3D shape = new Box(0.5, 5.0, 1.0);
+ objTrans.addChild(shape);
+
+ // Create a new ColoringAttributes object for the shape's
+ // appearance and make it writable at runtime.
+ Appearance app = shape.getAppearance();
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(0.6f, 0.3f, 0.0f);
+ app.setCapability(app.ALLOW_COLORING_ATTRIBUTES_WRITE);
+ app.setColoringAttributes(ca);
+
+ // Create a new Behavior object that will perform the collision
+ // detection on the specified object, and add it into
+ // the scene graph.
+ CollisionDetector cd = new CollisionDetector(shape);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ cd.setSchedulingBounds(bounds);
+
+ // Add the behavior to the scene graph
+ objTrans.addChild(cd);
+
+ return objTrans;
+ }
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form TickTockCollision
+ */
+ public TickTockCollision() {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("TickTockCollision");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new TickTockCollision().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/collision/TickTockCollisionGL2ES2.java b/src/main/java/org/jdesktop/j3d/examples/collision/TickTockCollisionGL2ES2.java
new file mode 100644
index 0000000..44db453
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/collision/TickTockCollisionGL2ES2.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+package org.jdesktop.j3d.examples.collision;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jdesktop.j3d.examples.gl2es2pipeline.Cube;
+import org.jdesktop.j3d.examples.gl2es2pipeline.SimpleShaderAppearance;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.RenderingAttributes;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3d;
+
+/**
+ * Simple Java 3D example program to display how collision work.
+ */
+public class TickTockCollisionGL2ES2 extends javax.swing.JFrame
+{
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ public BranchGroup createSceneGraph()
+ {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and behaviors
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objScale.addChild(bg);
+
+ // Create a pair of transform group nodes and initialize them to
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behaviors can modify them at runtime. Add them to the
+ // root of the subgraph.
+ TransformGroup objTrans1 = new TransformGroup();
+ objTrans1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(objTrans1);
+
+ TransformGroup objTrans2 = new TransformGroup();
+ objTrans2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans1.addChild(objTrans2);
+
+ // Create the positioning and scaling transform group node.
+ Transform3D t = new Transform3D();
+ t.set(0.3, new Vector3d(0.0, -1.5, 0.0));
+ TransformGroup objTrans3 = new TransformGroup(t);
+ objTrans2.addChild(objTrans3);
+
+ // Create a simple shape leaf node, add it to the scene graph.
+ objTrans3.addChild(new Cube());
+
+ // Create a new Behavior object that will perform the desired
+ // rotation on the specified transform object and add it into
+ // the scene graph.
+ Transform3D yAxis1 = new Transform3D();
+ yAxis1.rotX(Math.PI / 2.0);
+ Alpha tickTockAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE, 0, 0, 5000, 2500, 200, 5000, 2500, 200);
+
+ RotationInterpolator tickTock = new RotationInterpolator(tickTockAlpha, objTrans1, yAxis1, -(float) Math.PI / 2.0f,
+ (float) Math.PI / 2.0f);
+ tickTock.setSchedulingBounds(bounds);
+ objTrans2.addChild(tickTock);
+
+ // Create a new Behavior object that will perform the desired
+ // rotation on the specified transform object and add it into
+ // the scene graph.
+ Transform3D yAxis2 = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 4000, 0, 0, 0, 0, 0);
+
+ RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, objTrans2, yAxis2, 0.0f, (float) Math.PI * 2.0f);
+ rotator.setSchedulingBounds(bounds);
+ objTrans2.addChild(rotator);
+
+ // Now create a pair of rectangular boxes, each with a collision
+ // detection behavior attached. The behavior will highlight the
+ // object when it is in a state of collision.
+
+ Group box1 = createBox(0.3, new Vector3d(-1.3, 0.0, 0.0));
+ Group box2 = createBox(0.3, new Vector3d(1.3, 0.0, 0.0));
+
+ objScale.addChild(box1);
+ objScale.addChild(box2);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private static Group createBox(double scale, Vector3d pos)
+ {
+ // Create a transform group node to scale and position the object.
+ Transform3D t = new Transform3D();
+ t.set(scale, pos);
+ TransformGroup objTrans = new TransformGroup(t);
+
+ // Create a simple shape leaf node and add it to the scene graph
+ Shape3D shape = new Cube(0.5 / 2, 5.0 / 2, 1.0 / 2);
+ objTrans.addChild(shape);
+
+ // Create a new ColoringAttributes object for the shape's
+ // appearance and make it writable at runtime.
+ Appearance app = new SimpleShaderAppearance();
+ shape.setAppearance(app);
+ RenderingAttributes ra = new RenderingAttributes();
+ ra.setIgnoreVertexColors(true);
+ app.setRenderingAttributes(ra);
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(0.6f, 0.3f, 0.0f);
+ app.setCapability(Appearance.ALLOW_COLORING_ATTRIBUTES_WRITE);
+ app.setColoringAttributes(ca);
+
+ // Create a new Behavior object that will perform the collision
+ // detection on the specified object, and add it into
+ // the scene graph.
+ CollisionDetector cd = new CollisionDetector(shape);
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ cd.setSchedulingBounds(bounds);
+
+ // Add the behavior to the scene graph
+ objTrans.addChild(cd);
+
+ return objTrans;
+ }
+
+ private Canvas3D createUniverse()
+ {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form TickTockCollision
+ */
+ public TickTockCollisionGL2ES2()
+ {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("TickTockCollision");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[])
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend", "jogl2es2");
+ System.setProperty("j3d.displaylist", "false");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
+ public void run()
+ {
+ new TickTockCollisionGL2ES2().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/configured_universe/ConfigObjLoad.java b/src/main/java/org/jdesktop/j3d/examples/configured_universe/ConfigObjLoad.java
new file mode 100644
index 0000000..9afa414
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/configured_universe/ConfigObjLoad.java
@@ -0,0 +1,327 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.configured_universe;
+
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.io.FileNotFoundException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Map;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Sensor;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.loaders.IncorrectFormatException;
+import org.jogamp.java3d.loaders.ParsingErrorException;
+import org.jogamp.java3d.loaders.Scene;
+import org.jogamp.java3d.loaders.objectfile.ObjectFile;
+import org.jogamp.java3d.utils.behaviors.sensor.Mouse6DPointerBehavior;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.universe.ConfiguredUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class ConfigObjLoad {
+
+ private boolean spin = false;
+ private boolean noTriangulate = false;
+ private boolean noStripify = false;
+ private double creaseAngle = 60.0;
+ private URL filename = null;
+
+ private ConfiguredUniverse u;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.7);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ objScale.addChild(objTrans);
+
+ int flags = ObjectFile.RESIZE;
+ if (!noTriangulate) flags |= ObjectFile.TRIANGULATE;
+ if (!noStripify) flags |= ObjectFile.STRIPIFY;
+ ObjectFile f = new ObjectFile(flags,
+ (float)(creaseAngle * Math.PI / 180.0));
+ Scene s = null;
+ try {
+ s = f.load(filename);
+ }
+ catch (FileNotFoundException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+ catch (ParsingErrorException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+ catch (IncorrectFormatException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+
+ objTrans.addChild(s.getSceneGroup());
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ if (spin) {
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+ }
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
+ Background bgNode = new Background(bgColor);
+ bgNode.setApplicationBounds(bounds);
+ objRoot.addChild(bgNode);
+
+ // Set up the ambient light
+ Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
+ AmbientLight ambientLightNode = new AmbientLight(ambientColor);
+ ambientLightNode.setInfluencingBounds(bounds);
+ objRoot.addChild(ambientLightNode);
+
+ // Set up the directional lights
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);
+ Color3f light2Color = new Color3f(1.0f, 1.0f, 1.0f);
+ Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
+
+ DirectionalLight light1
+ = new DirectionalLight(light1Color, light1Direction);
+ light1.setInfluencingBounds(bounds);
+ objRoot.addChild(light1);
+
+ DirectionalLight light2
+ = new DirectionalLight(light2Color, light2Direction);
+ light2.setInfluencingBounds(bounds);
+ objRoot.addChild(light2);
+
+ return objRoot;
+ }
+
+ private void usage()
+ {
+ System.out.println(
+ "Usage: java ConfigObjLoad [-s] [-n] [-t] [-c degrees] <.obj file>");
+ System.out.println(" -s Spin (no user interaction)");
+ System.out.println(" -n No triangulation");
+ System.out.println(" -t No stripification");
+ System.out.println(
+ " -c Set crease angle for normal generation (default is 60 without");
+ System.out.println(
+ " smoothing group info, otherwise 180 within smoothing groups)");
+ System.exit(0);
+ } // End of usage
+
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ if (filename == null) {
+ filename = Resources.getResource("resources/geometry/galleon.obj");
+ if (filename == null) {
+ System.err.println("resources/geometry/galleon.obj not found");
+ System.exit(1);
+ }
+ }
+
+ // Get the config file URL from the j3d.configURL property or use the
+ // default config file "j3d1x1-window" in the current directory.
+ URL configURL = ConfiguredUniverse.getConfigURL(null);
+ if(configURL == null) {
+ configURL = Resources.getResource("configured_universe/j3d1x1-window.cfg");
+ }
+
+ // Create a simple scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph();
+
+ u = new ConfiguredUniverse(configURL);
+
+ // Get the ViewingPlatform.
+ ViewingPlatform viewingPlatform = u.getViewingPlatform();
+
+ // This will move the ViewPlatform back a bit so the objects in the
+ // scene can be viewed. This will only have an effect if the config
+ // file sets the window eyepoint policy to something other than
+ // RELATIVE_TO_COEXISTENCE, which is the default eyepoint policy
+ // applied by ConfiguredUniverse.
+ //
+ // The default view attach policy for ConfiguredUniverse applications
+ // is NOMINAL_SCREEN. This sets the view platform origin in the
+ // physical world to the center of coexistence, which allows eye
+ // positions expressed relative to coexistence to see the appropriate
+ // field of view automatically.
+ viewingPlatform.setNominalViewingTransform();
+
+ // Add a ViewPlatformBehavior if not specified in the config file.
+ if (!spin && viewingPlatform.getViewPlatformBehavior() == null) {
+ OrbitBehavior orbit = new OrbitBehavior(u.getCanvas(),
+ OrbitBehavior.REVERSE_ALL);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+ }
+
+ // See if there's a 6 degree of freedom mouse in the environment.
+ // We look for one named "mouse6d".
+ Map sensorMap = null;
+ sensorMap = u.getNamedSensors();
+ if (sensorMap != null) {
+ Sensor mouse6d = (Sensor)sensorMap.get("mouse6d");
+ if (mouse6d != null) {
+ Mouse6DPointerBehavior behavior =
+ new Mouse6DPointerBehavior(mouse6d, 1.0, true);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ behavior.setSchedulingBounds(bounds);
+
+ scene.addChild(behavior);
+ scene.addChild(behavior.getEcho());
+ }
+ }
+
+ // Listen for a typed "q", "Q", or "Escape" key on each canvas to
+ // allow a convenient exit from full screen configurations.
+ Canvas3D[] canvases;
+ canvases = u.getViewer().getCanvas3Ds();
+
+ class QuitListener extends KeyAdapter {
+ public void keyTyped(KeyEvent e) {
+ char c = e.getKeyChar();
+ if (c == 'q' || c == 'Q' || c == 27)
+ System.exit(0);
+ }
+ }
+
+ QuitListener quitListener = new QuitListener();
+ for (int i = 0; i < canvases.length; i++)
+ canvases[i].addKeyListener(quitListener);
+
+ // Make the scenegraph live.
+ u.addBranchGraph(scene);
+ }
+
+ public ConfigObjLoad(String[] args) {
+ if (args.length != 0) {
+ for (int i = 0; i < args.length; i++) {
+ if (args[i].startsWith("-")) {
+ if (args[i].equals("-s")) {
+ spin = true;
+ } else if (args[i].equals("-n")) {
+ noTriangulate = true;
+ } else if (args[i].equals("-t")) {
+ noStripify = true;
+ } else if (args[i].equals("-c")) {
+ if (i < args.length - 1) {
+ creaseAngle = (new Double(args[++i])).doubleValue();
+ } else usage();
+ } else {
+ usage();
+ }
+ } else {
+ try {
+ if ((args[i].indexOf("file:") == 0) ||
+ (args[i].indexOf("http") == 0)) {
+ filename = new URL(args[i]);
+ }
+ else if (args[i].charAt(0) != '/') {
+ filename = new URL("file:./" + args[i]);
+ }
+ else {
+ filename = new URL("file:" + args[i]);
+ }
+ }
+ catch (MalformedURLException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+ }
+ }
+ }
+ init();
+ }
+
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ new ConfigObjLoad(args);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/configured_universe/README.txt b/src/main/java/org/jdesktop/j3d/examples/configured_universe/README.txt
new file mode 100644
index 0000000..77e5a37
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/configured_universe/README.txt
@@ -0,0 +1,142 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+This directory contains a simple example application that demonstrates the
+ConfiguredUniverse utility class available in the com.sun.j3d.utils.universe
+package. J3DFly, available separately, is a fully featured application that
+also uses ConfiguredUniverse.
+
+ConfiguredUniverse is an extension of SimpleUniverse that can set up an
+interactive viewing environment based upon the contents of a site-specific
+configuration file. This is useful when an application needs to run without
+change across a broad range of viewing configurations and locally available
+input and audio devices. InputDevice implementations can be instantiated by
+ConfiguredUniverse and their Sensors can be retrieved by applications along
+with the names bound to them in the configuration file.
+
+Supported viewing configurations include windows on conventional desktops,
+stereo-enabled views, fullscreen immersive displays on single or multiple
+screens, and virtual reality installations such as cave and head-mounted
+displays incorporating 6-degree-of-freedom sensor devices.
+
+The ConfigObjLoad application is a modified version of the ObjLoad example
+program which uses the ConfiguredUniverse utility instead of SimpleUniverse.
+It also differs in the following other respects:
+
+ It is an application and cannot be run in a browser. ConfiguredUniverse
+ creates a JFrame, JPanel, and Canvas3D itself for each screen and is
+ oriented towards multiple fullscreen viewing environments, although
+ conventional windowed displays are also supported. The components
+ created are easily accessable so applications can still incorporate them
+ into their own user interfaces.
+
+ The configuration file to load is specified by the j3d.configURL
+ property. If one is not specified, it will load the file j3d1x1-window.cfg
+ in this directory.
+
+ Alternative custom view platform behaviors other than OrbitBehavior can
+ be used by specifying the behavior in the configuration file.
+
+ It can retrieve a 6DOF Sensor specified in the configuration file and
+ use it to demonstrate the Mouse6DPointerBehavior class.
+
+ Typing a "q" or the Escape key will terminate the example program. This
+ is useful for fullscreen configurations.
+
+To load a specific configuration file, set the j3d.configURL property on the
+command line:
+
+ java -Dj3d.configURL=<URL string> ConfigObjLoad <args> <obj file>
+
+For example, to load j3d1x2-rot30.cfg in the current directory, run
+
+ java -Dj3d.configURL=file:j3d1x2-rot30.cfg ConfigObjLoad <args> <obj file>
+
+This directory includes the following sample configuration files. Normally
+a configuration file is site-specific but many of these can used as-is.
+Others may need customization for screen sizes, available input devices, and
+PhysicalBody parameters.
+
+ j3d1x1.cfg: single fullscreen desktop configuration.
+
+ j3d1x1-behavior.cfg: single fullscreen desktop configuration with a
+ configurable view platform behavior.
+
+ j3d1x1-stereo.cfg: single fullscreen desktop configuration with stereo
+ viewing.
+
+ j3d1x1-vr.cfg: single fullscreen desktop configuration with stereo viewing,
+ head tracker, and 6DOF mouse.
+
+ j3d1x1-window.cfg: single screen windowed desktop configuration.
+
+ j3d1x2-flat.cfg: dual-screen flat desktop configuration.
+
+ j3d1x2-rot30.cfg: dual-screen desktop configuration with each screen rotated
+ toward the other by 30 degrees about Y.
+
+ j3d1x3-cave.cfg: 3-projector configuration with screens to the left, front,
+ and right of the user.
+
+ j3d1x3-cave-vr.cfg: 3-projector configuration with screens to the left,
+ front, and right of the user. Includes head tracking and stereo
+ viewing.
+
+ j3d1x3-rot45.cfg: 3-screen desktop configuration with left and right screens
+ angled by 45 degrees from the center screen.
+
+ j3d2x2-flat.cfg: 4-screen projector configuration arranged in a 2x2 power
+ wall.
+
+Note: JDK 1.4 or newer is required when configuring multiple screens if the
+X11 Xinerama extension is being used to create a single virtual screen.
+This is due to a limitation of the getScreenDevices() method in the JDK 1.3
+version of GraphicsConfiguration which returns only a single GraphicsDevice
+from a virtual screen. ConfiguredUniverse will report this condition as an
+error in specifying more screens than are available.
+
+Also: Graphics performance may be degraded in some environments when using a
+virtual screen device. See the description of the j3d.disableXinerama
+property for possible performance improvements when using Xinerama.
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-behavior.cfg b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-behavior.cfg
new file mode 100644
index 0000000..db56b2c
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-behavior.cfg
@@ -0,0 +1,149 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+/*
+ ************************************************************************
+ *
+ * Java 3D configuration file for single fullscreen desktop configuration.
+ * A view platform behavior is created and configured here as well.
+ *
+ ************************************************************************
+ */
+
+// Create a new screen object and associate it with a logical name and a
+// number. This number is used as an index to retrieve the AWT GraphicsDevice
+// from the array that GraphicsEnvironment.getScreenDevices() returns.
+//
+// NOTE: The GraphicsDevice order in the array is specific to the local
+// site and display system.
+//
+(NewScreen center 0)
+
+// Create a fullscreen window
+//
+(ScreenAttribute center WindowSize NoBorderFullScreen)
+
+// Set the available image area for the full screen.
+//
+(ScreenAttribute center PhysicalScreenWidth 0.360)
+(ScreenAttribute center PhysicalScreenHeight 0.288)
+
+// Set the TrackerBaseToImagePlate transform for this screen. The coexistence
+// to tracker base transform is identity by default, so the tracker base origin
+// and orientation will also set the origin and orientation of coexistence
+// coordinates in the physical world. This is the primary purpose of setting
+// this transform when neither head tracking nor multiple screens are being
+// used.
+//
+// The tracker base and center of coexistence are set here to the middle of the
+// screen's image plate. Their basis vectors are aligned with the image plate
+// basis vectors. The physical eyepoint position will be set relative to
+// coexistence coordinates below.
+//
+(ScreenAttribute center TrackerBaseToImagePlate
+ (Translate 0.180 0.144 0.000))
+
+// Create a view using the defined screen.
+//
+(NewView view0)
+(ViewAttribute view0 Screen center)
+
+// Set the eyepoint relative to coexistence coordinates. Here it is set 45cm
+// toward the user along +Z. Skewed projections can be set by by offsetting
+// the eyepoint along X and Y.
+//
+(ViewAttribute view0 CenterEyeInCoexistence (0.0 0.0 0.45))
+
+// Create a view platform behavior. Here we use OrbitBehavior, although any
+// concrete subclass of the abstract ViewPlatformBehavior with a parameterless
+// constructor could be used. The logical name to assign to this behavior is
+// specified by the 2nd argument to the NewViewPlatformBehavior command, while
+// the 3rd argument is the name of the ViewPlatformBehavior subclass. It is
+// instantiated through introspection.
+//
+// Attributes defined by the abstract ViewPlatformBehavior superclass itself
+// can be set directly with the ViewPlatformBehaviorAttribute command. The
+// details of the subclass implementation are not known to ConfiguredUniverse,
+// so any configuration information needed by such a subclass is set by the
+// ViewPlatformBehaviorProperty command. The property name specified by that
+// command is taken to be a method name of the subclass and invoked through
+// introspection.
+//
+// View platform behaviors often need sensors or canvases as event sources to
+// drive the behavior action. An implementation of ViewPlatformBehavior always
+// gets the current ViewingPlatform through the setViewingPlatform() method.
+// The canvases used by the ViewingPlatform can be retrieved by calling its
+// getViewers() method and then calling each Viewer's getCanvas3Ds()
+// method. Sensors can be retrived by calling the ViewingPlatform method
+// getUniverse(), checking to see if the returned SimpleUniverse is a
+// ConfiguredUniverse, and then calling its getNamedSensors() method.
+//
+(NewViewPlatformBehavior vpb com.sun.j3d.utils.behaviors.vp.OrbitBehavior)
+
+// Set the scheduling bounds to be a BoundingSphere with its center at
+// (0.0 0.0 0.0) and a radius of 100 meters.
+//
+(ViewPlatformBehaviorAttribute vpb SchedulingBounds
+ (BoundingSphere (0.0 0.0 0.0) 100.0))
+
+// Set properties specific to OrbitBehavior. All arguments following the
+// method name are wrapped and passed to the specified method as an array of
+// Objects. Strings "true" and "false" get turned into Boolean, and number
+// strings get turned into Double. Constructs such as (0.0 1.0 2.0) and
+// ((0.0 1.0 2.0 0.5) (3.0 4.0 5.0 1.0) (6.0 7.0 8.0 0.0)) get converted to
+// Point3d and Matrix4d respectively. Note that last row of a Matrix4d doesn't
+// need to be specified; it is implicitly (0.0 0.0 0.0 1.0).
+//
+// The REVERSE_ALL flags are usually passed to the OrbitBehavior constructor.
+// Since it is being instantiated with its parameterless constructor the
+// reverse flags are set here explicitly.
+//
+(ViewPlatformBehaviorProperty vpb ReverseTranslate true)
+(ViewPlatformBehaviorProperty vpb ReverseRotate true)
+(ViewPlatformBehaviorProperty vpb ReverseZoom true)
+
+// Create a new view platform and set the view platform behavior.
+//
+(NewViewPlatform vp)
+(ViewPlatformAttribute vp ViewPlatformBehavior vpb)
diff --git a/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-stereo.cfg b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-stereo.cfg
new file mode 100644
index 0000000..959064c
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-stereo.cfg
@@ -0,0 +1,113 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+/*
+ ************************************************************************
+ *
+ * Java 3D configuration file for single fullscreen stereo desktop
+ * configuration with no head tracking.
+ *
+ ************************************************************************
+ */
+
+// Create a new screen object and associate it with a logical name and a
+// number. This number is used as an index to retrieve the AWT GraphicsDevice
+// from the array that GraphicsEnvironment.getScreenDevices() returns.
+//
+// NOTE: The GraphicsDevice order in the array is specific to the local
+// site and display system.
+//
+(NewScreen center 0)
+
+// Create a fullscreen window
+//
+(ScreenAttribute center WindowSize NoBorderFullScreen)
+
+// Set the available image area for the full screen.
+//
+(ScreenAttribute center PhysicalScreenWidth 0.360)
+(ScreenAttribute center PhysicalScreenHeight 0.288)
+
+// Set the TrackerBaseToImagePlate transform for this screen. The coexistence
+// to tracker base transform is identity by default, so the tracker base origin
+// and orientation will also set the origin and orientation of coexistence
+// coordinates in the physical world. This is the primary purpose of setting
+// this transform when neither head tracking nor multiple screens are being
+// used.
+//
+// The tracker base and center of coexistence are set here to the middle of the
+// screen's image plate. Their basis vectors are aligned with the image plate
+// basis vectors. The physical eyepoint position will be set relative to
+// coexistence coordinates below.
+//
+(ScreenAttribute center TrackerBaseToImagePlate
+ (Translate 0.180 0.144 0.000))
+
+// Define the physical body.
+//
+// The head origin is halfway between the eyes, with X extending to the right,
+// Y up, and positive Z extending into the skull.
+//
+(NewPhysicalBody SiteUser)
+
+// Set the interpupilary distance. This sets the LeftEyePosition and
+// RightEyePosition to offsets of half this distance along both directions of
+// the X axis.
+//
+(PhysicalBodyAttribute SiteUser StereoEyeSeparation 0.066)
+
+// Create a view using the defined screen and physical body.
+//
+(NewView view0)
+(ViewAttribute view0 Screen center)
+(ViewAttribute view0 PhysicalBody SiteUser)
+
+// Set the eyepoint relative to coexistence coordinates. Here it is set 45cm
+// toward the user along +Z.
+//
+(ViewAttribute view0 CenterEyeInCoexistence (0.0 0.0 0.45))
+
+// Enable stereo viewing.
+//
+(ViewAttribute view0 StereoEnable true)
diff --git a/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-vr.cfg b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-vr.cfg
new file mode 100644
index 0000000..7da054d
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-vr.cfg
@@ -0,0 +1,212 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+/*
+ ************************************************************************
+ *
+ * Java 3D configuration file for a single screen stereo desktop display
+ * using a head tracker and 6DOF mouse.
+ *
+ ************************************************************************
+ */
+
+// Configure the head tracker. The NewDevice command binds a logical name
+// (the 2nd argument) to an InputDevice implementation whose class name is
+// specified in the 3rd argument. The InputDevice implementation for a head
+// tracker must generate position and orientation data relative to a fixed
+// frame of reference in the physical world, the "tracker base" of the Java
+// 3D view model.
+//
+// The InputDevice is instantiated through introspection of the class name.
+// Available InputDevice implementations are site-specific, so substitute
+// the class name in a NewDevice command below with one that is available at
+// the local site.
+//
+// Note that properties are used to configure an InputDevice instead of
+// attributes. The details of an InputDevice implementation are not known to
+// ConfiguredUniverse, so the property name is invoked as a method through
+// introspection. The example properties below must be replaced with the ones
+// needed, if any, by specific InputDevice implementations.
+//
+// All property arguments following the method name are wrapped and passed to
+// the specified method as an array of Objects. Strings "true" and "false"
+// get wrapped into Boolean, and number strings get wrapped into Double.
+// Construct such as (0.0 1.0 2.0) and ((0.0 1.0 2.0 0.5) (3.0 4.0 5.0 1.0)
+// (6.0 7.0 8.0 0.0)) get converted to Point3d and Matrix4d respectively.
+// Note that last row of a Matrix4d doesn't need to be specified; it is
+// implicitly (0.0 0.0 0.0 1.0).
+//
+(NewDevice glasses LogitechRedBarron)
+(DeviceProperty glasses SerialPort "/dev/ttya") // Unix paths need quoting.
+(DeviceProperty glasses ReceiverBaseline 0.1450)
+(DeviceProperty glasses ReceiverLeftLeg 0.0875)
+(DeviceProperty glasses ReceiverHeight 0.0470)
+(DeviceProperty glasses ReceiverTopOffset 0.0000)
+
+// Configure an InputDevice to use for a 6 degree of freedom mouse if
+// required. In some implementations the same InputDevice instance can be
+// used both for head tracking and multiple peripheral sensing devices.
+// This example assumes an implementation that requires multiple instances,
+// one for each sensor, sharing the same physical hardware used for the
+// tracker base. In either case all the sensors must generate position and
+// orientation relative to the same fixed tracker base frame of reference.
+//
+(NewDevice wand LogitechRedBarron)
+(DeviceProperty wand SerialPort "/dev/ttyb")
+(DeviceProperty wand ReceiverBaseline 0.0700)
+(DeviceProperty wand ReceiverLeftLeg 0.0625)
+(DeviceProperty wand ReceiverHeight 0.0510)
+(DeviceProperty wand ReceiverTopOffset 0.0000)
+
+// Create logical names for the available sensors in the specified input
+// devices. The last argument is the sensor's index in the input device.
+//
+(NewSensor head glasses 0)
+(NewSensor mouse6d wand 0)
+
+// Set the 6DOF mouse sensor hotspot in the local sensor coordinate system.
+// The hotspot is simply the "active" point relative to the sensor origin
+// which interacts with the virtual world, such as the point used for picking
+// or grabbing an object. Its interpretation is up to the sensor behavior.
+//
+// It is set here to 10 centimeters from the base to allow reaching into the
+// screen without bumping the device into the glass, and to prevent the device
+// itself from obscuring the pointer echo.
+//
+(SensorAttribute mouse6d Hotspot (0.0 0.0 -0.10))
+
+
+// Create a new screen object and associate it with a logical name and a
+// number. This number is used as an index to retrieve the AWT GraphicsDevice
+// from the array that GraphicsEnvironment.getScreenDevices() returns.
+//
+// NOTE: The GraphicsDevice order in the array is specific to the local
+// site and display system.
+//
+(NewScreen center 0)
+
+// Set the actual available image area. This measured as 0.350 meters in
+// width and 0.245 meters in height for the monitor in the sample setup when
+// running in stereo resolution.
+//
+(ScreenAttribute center PhysicalScreenWidth 0.350)
+(ScreenAttribute center PhysicalScreenHeight 0.245)
+(ScreenAttribute center WindowSize NoBorderFullScreen)
+
+// Set the TrackerBaseToImagePlate transform for this screen. This transforms
+// points in tracker base coordinates to image plate coordinates.
+//
+// For this sample setup the tracker base is leaning at 50 degrees about its
+// X-axis over the top edge of the monitor. The middle of the tracker base
+// (its origin) is offset by (0.175, 0.345, 0.020) from the lower left
+// corner of the screen (origin of the image plate).
+//
+(ScreenAttribute center TrackerBaseToImagePlate
+ (RotateTranslate (Rotate 50.000 0.000 0.000)
+ (Translate 0.175 0.345 0.020)))
+
+
+// Create a physical environment. This contains the available input devices,
+// audio devices, and sensors, and defines the coexistence coordinate system.
+//
+(NewPhysicalEnvironment SampleSite)
+
+// Register the input devices defined in this file.
+//
+(PhysicalEnvironmentAttribute SampleSite InputDevice glasses)
+(PhysicalEnvironmentAttribute SampleSite InputDevice wand)
+
+// Register the sensor which will drive head tracking.
+//
+(PhysicalEnvironmentAttribute SampleSite HeadTracker head)
+
+// Define coexistence coordinates.
+//
+// Coexistence coordinates are defined relative to the tracker base to simplify
+// calibration measurements, just as the tracker base is used as the common
+// reference frame for the TrackerBaseToImagePlate calibration.
+//
+// Here the coexistence origin is set to the middle of the center screen, using
+// the same basis vectors as its image plate. This will put the tracker base
+// origin at (0.0 0.220 0.020) relative to the coexistence origin along its
+// basis vectors.
+//
+(PhysicalEnvironmentAttribute SampleSite CoexistenceToTrackerBase
+ (TranslateRotate (Translate 0.0 -0.220 -0.020)
+ (Rotate -50.0 0.0 0.0)))
+
+// Define the physical body.
+//
+// The head origin is halfway between the eyes, with X extending to the right,
+// Y up, and positive Z extending into the skull.
+//
+(NewPhysicalBody SiteUser)
+
+// Set the interpupilary distance. This sets the LeftEyePosition and
+// RightEyePosition to offsets of half this distance along both directions of
+// the X axis.
+//
+(PhysicalBodyAttribute SiteUser StereoEyeSeparation 0.066)
+
+// Define the position and orientation of the head relative to the tracker
+// mounted on the head.
+//
+(PhysicalBodyAttribute SiteUser HeadToHeadTracker ((1.0 0.0 0.0 0.000)
+ (0.0 1.0 0.0 0.020)
+ (0.0 0.0 1.0 0.018)))
+
+
+// Create a view using the defined screens, PhysicalEnvironment, and
+// PhysicalBody.
+//
+(NewView view0)
+(ViewAttribute view0 Screen center)
+(ViewAttribute view0 PhysicalEnvironment SampleSite)
+(ViewAttribute view0 PhysicalBody SiteUser)
+
+// Enable stereo viewing. Enable head tracking to get the position of the eyes
+// with respect to coexistence.
+//
+(ViewAttribute view0 StereoEnable true)
+(ViewAttribute view0 TrackingEnable True)
diff --git a/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-window.cfg b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-window.cfg
new file mode 100644
index 0000000..2496ee4
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1-window.cfg
@@ -0,0 +1,89 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+/*
+ ************************************************************************
+ *
+ * Java 3D configuration file for a conventional single screen, windowed
+ * desktop configuration.
+ *
+ ************************************************************************
+ */
+
+// Create a new screen object and associate it with a logical name and a
+// number. This number is used as an index to retrieve the AWT GraphicsDevice
+// from the array that GraphicsEnvironment.getScreenDevices() returns.
+//
+// NOTE: The GraphicsDevice order in the array is specific to the local
+// site and display system.
+//
+(NewScreen center 0)
+
+// Create a 700x700 pixel window on the screen.
+//
+(ScreenAttribute center WindowSize (700.0 700.0))
+
+// Create a view using the defined screen.
+//
+(NewView view0)
+(ViewAttribute view0 Screen center)
+
+// ConfiguredUniverse is oriented toward multi-screen viewing environments, so
+// it sets the following attributes to those listed. For a conventional window
+// on a single screen desktop configuration we need to set them back to their
+// normal defaults.
+//
+// View.windowEyePointPolicy RELATIVE_TO_COEXISTENCE
+// View.windowMovementPolicy VIRTUAL_WORLD
+// View.windowResizePolicy VIRTUAL_WORLD
+// View.coexistenceCenteringEnable false
+// ViewPlatform.viewAttachPolicy NOMINAL_SCREEN
+//
+(ViewAttribute view0 WindowEyepointPolicy RELATIVE_TO_FIELD_OF_VIEW)
+(ViewAttribute view0 WindowMovementPolicy PHYSICAL_WORLD)
+(ViewAttribute view0 WindowResizePolicy PHYSICAL_WORLD)
+(ViewAttribute view0 CoexistenceCenteringEnable true)
+
+(NewViewPlatform vp)
+(ViewPlatformAttribute vp ViewAttachPolicy NOMINAL_HEAD)
diff --git a/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1.cfg b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1.cfg
new file mode 100644
index 0000000..a4977a3
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x1.cfg
@@ -0,0 +1,98 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+/*
+ ************************************************************************
+ *
+ * Java 3D configuration file for a single fullscreen desktop configuration.
+ *
+ ************************************************************************
+ */
+
+// Create a new screen object and associate it with a logical name and a
+// number. This number is used as an index to retrieve the AWT GraphicsDevice
+// from the array that GraphicsEnvironment.getScreenDevices() returns.
+//
+// NOTE: The GraphicsDevice order in the array is specific to the local
+// site and display system.
+//
+(NewScreen center 0)
+
+// Create a fullscreen window
+//
+(ScreenAttribute center WindowSize NoBorderFullScreen)
+
+// Set the available image area for the full screen. This is important when an
+// explicit ScreenScale view attribute is defined for precise scaling between
+// objects in the virtual world and their projections into the physical world.
+// The defaults are 0.365 meters for width and 0.292 meters for height.
+//
+(ScreenAttribute center PhysicalScreenWidth 0.360)
+(ScreenAttribute center PhysicalScreenHeight 0.288)
+
+// Set the TrackerBaseToImagePlate transform for this screen. The coexistence
+// to tracker base transform is identity by default, so the tracker base origin
+// and orientation will also set the origin and orientation of coexistence
+// coordinates in the physical world. This is the primary purpose of setting
+// this transform when neither head tracking nor multiple screens are being
+// used.
+//
+// The tracker base and center of coexistence are set here to the middle of the
+// screen's image plate. Their basis vectors are aligned with the image plate
+// basis vectors. The physical eyepoint position will be set relative to
+// coexistence coordinates below.
+//
+(ScreenAttribute center TrackerBaseToImagePlate
+ (Translate 0.180 0.144 0.000))
+
+// Create a view using the defined screen.
+//
+(NewView view0)
+(ViewAttribute view0 Screen center)
+
+// Set the eyepoint relative to coexistence coordinates. Here it is set 45cm
+// toward the user along +Z. Skewed projections can be created by offsetting
+// the eyepoint along X and/or Y.
+//
+(ViewAttribute view0 CenterEyeInCoexistence (0.0 0.0 0.45))
diff --git a/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x2-flat.cfg b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x2-flat.cfg
new file mode 100644
index 0000000..155f1f7
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x2-flat.cfg
@@ -0,0 +1,134 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+/*
+ ************************************************************************
+ *
+ * Java 3D configuration file for dual-screen (flat) desktop configuration
+ * with no head tracking.
+ *
+ ************************************************************************
+ */
+
+// Create new screen objects and associate them with logical names and numbers.
+// These numbers are used as indices to retrieve the AWT GraphicsDevice from
+// the array that GraphicsEnvironment.getScreenDevices() returns.
+//
+// NOTE: The GraphicsDevice order in the array is specific to the local
+// site and display system.
+//
+(NewScreen left 0)
+(NewScreen right 1)
+
+// Set the screen dimensions.
+//
+(ScreenAttribute left PhysicalScreenWidth 0.360)
+(ScreenAttribute left PhysicalScreenHeight 0.288)
+
+(ScreenAttribute right PhysicalScreenWidth 0.360)
+(ScreenAttribute right PhysicalScreenHeight 0.288)
+
+// Specify full screen windows.
+//
+(ScreenAttribute left WindowSize NoBorderFullScreen)
+(ScreenAttribute right WindowSize NoBorderFullScreen)
+
+// Set the TrackerBaseToImagePlate transforms for these screens. This
+// transforms points in tracker base coordinates to each screen's image plate
+// coordinates, where the origin of the image plate is defined to be the lower
+// left corner of the screen with X increasing to the right, Y increasing to
+// the top, and Z increasing away from the screen.
+//
+// Without head or sensor tracking the tracker base is still needed as a fixed
+// frame of reference for describing the orientation and position of each
+// screen to the others. The coexistence to tracker base transform is set to
+// identity by default, so the tracker base origin and orientation will also
+// set the origin and orientation of coexistence coordinates in the physical
+// world.
+//
+// The tracker base and center of coexistence is set here to the middle of the
+// edge shared by the two screens.
+//
+(ScreenAttribute left TrackerBaseToImagePlate
+ (Translate 0.360 0.144 0.0))
+(ScreenAttribute right TrackerBaseToImagePlate
+ (Translate 0.000 0.144 0.0))
+
+// Sometimes it is desirable to include the bevels in between the monitors in
+// the TrackerBaseToImagePlate transforms, so that the abutting bevels obscure
+// the view of the virtual world instead of stretching it out between the
+// monitors. For a bevel width of 4.5 cm on each monitor, the above commands
+// would become the following:
+//
+// (ScreenAttribute left TrackerBaseToImagePlate
+// (Translate 0.405 0.144 0.0))
+// (ScreenAttribute right TrackerBaseToImagePlate
+// (Translate -0.045 0.144 0.0))
+//
+// Conversely, a similar technique may be used to include overlap between the
+// screens. This is useful for projection systems which use edge blending
+// to provide seamless integration between screens.
+
+
+// Create a view using the defined screens.
+//
+(NewView view0)
+(ViewAttribute view0 Screen left)
+(ViewAttribute view0 Screen right)
+
+// Set the eyepoint relative to coexistence coordinates. Here it is set 45cm
+// toward the user along Z, extending out from the midpoint of the edge shared
+// by the two screens. This will create the appropriate skewed projection
+// frustums for each image plate.
+//
+// If a planar display surface is all that is required, the same effect could
+// be achieved in a virtual screen enviroment such as Xinerama by simply
+// creating a canvas that spans both screens. In some display environments the
+// use of a canvas that spans multiple physical screens may cause significant
+// performance degradation, however.
+//
+// See j3d1x2-rot30 for an example of a non-planar configuration that cannot be
+// achieved through a single canvas spanning both screens.
+//
+(ViewAttribute view0 CenterEyeInCoexistence (0.0 0.0 0.45))
diff --git a/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x2-rot30.cfg b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x2-rot30.cfg
new file mode 100644
index 0000000..eccdb4b
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x2-rot30.cfg
@@ -0,0 +1,99 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+/*
+ ************************************************************************
+ *
+ * Java 3D configuration file for a dual-screen desktop configuration
+ * with each screen rotated toward the other by 30 degrees about Y from
+ * planar. The inside angle between them is 120 degrees.
+ *
+ ************************************************************************
+ */
+
+// Create new screen objects and associate them with logical names and numbers.
+// These numbers are used as indices to retrieve the AWT GraphicsDevice from
+// the array that GraphicsEnvironment.getScreenDevices() returns.
+//
+// NOTE: The GraphicsDevice order in the array is specific to the local
+// site and display system.
+//
+(NewScreen left 0)
+(NewScreen right 1)
+
+// Set the available image areas for full screens.
+//
+(ScreenAttribute left PhysicalScreenWidth 0.360)
+(ScreenAttribute left PhysicalScreenHeight 0.288)
+
+(ScreenAttribute right PhysicalScreenWidth 0.360)
+(ScreenAttribute right PhysicalScreenHeight 0.288)
+
+// Specify full screen windows.
+//
+(ScreenAttribute left WindowSize NoBorderFullScreen)
+(ScreenAttribute right WindowSize NoBorderFullScreen)
+
+// Set the TrackerBaseToImagePlate transforms for these screens.
+//
+// The tracker base is set here to the middle of the edge shared by the two
+// screens. Each screen is rotated 30 degrees toward the other about the
+// tracker base +Y axis, so that the tracker base +Z is centered between the
+// two screens.
+//
+(ScreenAttribute left TrackerBaseToImagePlate
+ (RotateTranslate (Rotate 0.000 -30.000 0.0)
+ (Translate 0.360 0.144 0.0)))
+
+(ScreenAttribute right TrackerBaseToImagePlate
+ (RotateTranslate (Rotate 0.000 30.000 0.0)
+ (Translate 0.000 0.144 0.0)))
+
+
+// Create a view using the defined screens.
+//
+(NewView view0)
+(ViewAttribute view0 Screen left)
+(ViewAttribute view0 Screen right)
+(ViewAttribute view0 CenterEyeInCoexistence (0.0 0.0 0.45))
diff --git a/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x3-cave-vr.cfg b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x3-cave-vr.cfg
new file mode 100644
index 0000000..f87887d
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x3-cave-vr.cfg
@@ -0,0 +1,222 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+/*
+ ************************************************************************
+ *
+ * Java 3D configuration file for a cave environment with head tracking and
+ * stereo viewing. This cave consists of 3 projectors with 3 screens to the
+ * left, front, and right of the user, all at 90 degrees to each other.
+ *
+ * The projectors in the VirtualPortal sample site are actually turned
+ * on their sides to get more height. Screen 0 is rotated 90 degrees
+ * counter-clockwise, while screens 1 and 2 are rotated 90 degrees
+ * clockwise.
+ *
+ ************************************************************************
+ */
+
+// Configure the head tracker. The NewDevice command binds a logical name
+// (the 2nd argument) to an InputDevice implementation whose class name is
+// specified in the 3rd argument. The InputDevice implementation for a head
+// tracker must generate position and orientation data relative to a fixed
+// frame of reference in the physical world, the "tracker base" of the Java
+// 3D view model.
+//
+// The InputDevice is instantiated through introspection of the class name.
+// Available InputDevice implementations are site-specific, so substitute
+// the class name in a NewDevice command below with one that is available at
+// the local site.
+//
+// Note that properties are used to configure an InputDevice instead of
+// attributes. The details of an InputDevice implementation are not known to
+// ConfiguredUniverse, so the property name is invoked as a method through
+// introspection. The example properties below must be replaced with the ones
+// needed, if any, by specific InputDevice implementations. All arguments
+// following the method name are wrapped and passed to the specified method as
+// an array of Objects.
+//
+// All property arguments following the method name are wrapped and passed to
+// the specified method as an array of Objects. Strings "true" and "false"
+// get wrapped into Boolean, and number strings get wrapped into Double.
+// Construct such as (0.0 1.0 2.0) and ((0.0 1.0 2.0 0.5) (3.0 4.0 5.0 1.0)
+// (6.0 7.0 8.0 0.0)) get converted to Point3d and Matrix4d respectively.
+// Note that last row of a Matrix4d doesn't need to be specified; it is
+// implicitly (0.0 0.0 0.0 1.0).
+//
+(NewDevice glasses LogitechRedBarron)
+(DeviceProperty glasses SerialPort "/dev/ttya") // Unix paths need quoting.
+(DeviceProperty glasses TransmitterBaseline 0.4600)
+(DeviceProperty glasses TransmitterLeftLeg 0.4400)
+(DeviceProperty glasses TransmitterCalibrationDistance 0.4120)
+
+// Create a logical name for the head tracker sensor. The last argument is
+// the sensor's index in the input device.
+//
+(NewSensor head glasses 0)
+
+// Create new screen objects and associate them with logical names and numbers.
+// These numbers are used as indices to retrieve the AWT GraphicsDevice from
+// the array that GraphicsEnvironment.getScreenDevices() returns.
+//
+// NOTE: The GraphicsDevice order in the array is specific to the local
+// site and display system.
+//
+(NewScreen left 0)
+(NewScreen center 1)
+(NewScreen right 2)
+
+
+// Set the available image areas as well as their positition and orientation
+// relative to the tracker base. From the orientation of a user standing
+// within this VirtualPortal site and facing the center screen, the tracker
+// base is along the vertical midline of the screen, 0.248 meters down from
+// the top edge, and 1.340 meters in front of it. The tracker base is
+// oriented so that its +X axis points to the left, its +Y axis points toward
+// the screen, and its +Z axis points toward the floor.
+//
+(ScreenAttribute left PhysicalScreenWidth 2.480)
+(ScreenAttribute left PhysicalScreenHeight 1.705)
+(ScreenAttribute left WindowSize NoBorderFullScreen)
+(ScreenAttribute left TrackerBaseToImagePlate
+ (( 0.0 0.0 -1.0 2.230)
+ ( 0.0 -1.0 0.0 1.340)
+ (-1.0 0.0 0.0 0.885)))
+
+(ScreenAttribute center PhysicalScreenWidth 2.485)
+(ScreenAttribute center PhysicalScreenHeight 1.745)
+(ScreenAttribute center WindowSize NoBorderFullScreen)
+(ScreenAttribute center TrackerBaseToImagePlate
+ (( 0.0 0.0 1.0 0.248)
+ (-1.0 0.0 0.0 0.885)
+ ( 0.0 -1.0 0.0 1.340)))
+
+(ScreenAttribute right PhysicalScreenWidth 2.480)
+(ScreenAttribute right PhysicalScreenHeight 1.775)
+(ScreenAttribute right WindowSize NoBorderFullScreen)
+(ScreenAttribute right TrackerBaseToImagePlate
+ (( 0.0 0.0 1.0 0.2488)
+ ( 0.0 -1.0 0.0 1.340)
+ ( 1.0 0.0 0.0 0.860)))
+
+// Create a physical environment. This contains the available input devices,
+// audio devices, and sensors, and defines the coexistence coordinate system
+// for mapping between the virtual and physical worlds.
+//
+(NewPhysicalEnvironment VirtualPortal)
+
+// Register the input device defined in this file and the sensor which will
+// drive head tracking.
+//
+(PhysicalEnvironmentAttribute VirtualPortal InputDevice glasses)
+(PhysicalEnvironmentAttribute VirtualPortal HeadTracker head)
+
+// Set the location of the center of coexistence relative to the tracker base.
+// Here it set to the center of the center screen. The default view attach
+// policy of NOMINAL_SCREEN used by ConfiguredUniverse will place the origin of
+// the view platform in coexistence coordinates at the center of coexistence.
+//
+(PhysicalEnvironmentAttribute VirtualPortal
+ CoexistenceToTrackerBase
+ ((-1.0 0.0 0.0 0.000)
+ ( 0.0 0.0 -1.0 1.340)
+ ( 0.0 -1.0 0.0 0.994)))
+
+// The above center of coexistence is appropriate for the sample geometry
+// files available in the programs/examples directory. Often a more
+// immersive point of view is required for larger virtual worlds. This can be
+// achieved by placing the center of coexistence closer to the nominal position
+// of the user's head, so that the view platform origin in coexistence
+// coordinates will map there as well.
+//
+// Here we set the location of the center of coexistence 0.5 meters along the
+// tracker base +Z axis, 1.737 meters from the floor (about 5 ft 8.4 inches).
+//
+// (PhysicalEnvironmentAttribute VirtualPortal
+// CoexistenceToTrackerBase
+// ((-1.0 0.0 0.0 0.0)
+// ( 0.0 0.0 -1.0 0.0)
+// ( 0.0 -1.0 0.0 0.5)))
+
+
+// Define the physical body.
+//
+// The head origin is halfway between the eyes, with X extending to the right,
+// Y up, and positive Z extending into the skull.
+//
+(NewPhysicalBody LabRat)
+(PhysicalBodyAttribute LabRat StereoEyeSeparation .07)
+
+// Define the position and orientation of the head relative to the tracker
+// mounted on the head.
+//
+(PhysicalBodyAttribute LabRat HeadToHeadTracker
+ ((-1.0 0.0 0.0 0.00)
+ ( 0.0 0.0 -1.0 0.05)
+ ( 0.0 -1.0 0.0 0.11)))
+// Now define the view.
+//
+(NewView view0)
+(ViewAttribute view0 Screen left)
+(ViewAttribute view0 Screen center)
+(ViewAttribute view0 Screen right)
+(ViewAttribute view0 PhysicalBody LabRat)
+(ViewAttribute view0 PhysicalEnvironment VirtualPortal)
+
+// Set the screen scale. This is scale factor from virtual to physical
+// coordinates.
+//
+(ViewAttribute view0 ScreenScalePolicy SCALE_SCREEN_SIZE)
+
+// Alternative for explict scaling.
+//
+//(ViewAttribute view0 ScreenScalePolicy SCALE_EXPLICIT)
+//(ViewAttribute view0 ScreenScale 5.00)
+
+// Enable stereo viewing. Enable head tracking to get the position of the eyes
+// with respect to coexistence. Boolean values may be specified as either
+// true, True, false, or False.
+//
+(ViewAttribute view0 StereoEnable true)
+(ViewAttribute view0 TrackingEnable True)
diff --git a/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x3-cave.cfg b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x3-cave.cfg
new file mode 100644
index 0000000..88f86d8
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x3-cave.cfg
@@ -0,0 +1,171 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+/*
+ ************************************************************************
+ *
+ * Java 3D configuration file for a cave environment. This cave
+ * consists of 3 projectors with 3 screens to the left, front, and right
+ * of the user, all at 90 degrees to each other.
+ *
+ * The projectors in the VirtualPortal sample site are actually turned
+ * on their sides to get more height. Screen 0 is rotated 90 degrees
+ * counter-clockwise, while screens 1 and 2 are rotated 90 degrees
+ * clockwise.
+ *
+ ************************************************************************
+ */
+
+// Create new screen objects and associate them with logical names and numbers.
+// These numbers are used as indices to retrieve the AWT GraphicsDevice from
+// the array that GraphicsEnvironment.getScreenDevices() returns.
+//
+// NOTE: The GraphicsDevice order in the array is specific to the local
+// site and display system.
+//
+(NewScreen left 0)
+(NewScreen center 1)
+(NewScreen right 2)
+
+
+// Set the available image areas as well as their positition and orientation
+// relative to the tracker base. Although this config file doesn't enable
+// head tracking, the tracker base is still needed as a point of reference to
+// describe the position and orientation of the screens relative to the
+// environment.
+//
+// From the orientation of a user standing within this VirtualPortal site and
+// facing the center screen, the tracker base is along the vertical midline of
+// the screen, 0.248 meters down from the top edge, and 1.340 meters in front
+// of it. The tracker base is oriented so that its +X axis points to the left,
+// its +Y axis points toward the screen, and its +Z axis points toward the
+// floor.
+//
+(ScreenAttribute left PhysicalScreenWidth 2.480)
+(ScreenAttribute left PhysicalScreenHeight 1.705)
+(ScreenAttribute left WindowSize NoBorderFullScreen)
+(ScreenAttribute left TrackerBaseToImagePlate
+ (( 0.0 0.0 -1.0 2.230)
+ ( 0.0 -1.0 0.0 1.340)
+ (-1.0 0.0 0.0 0.885)))
+
+(ScreenAttribute center PhysicalScreenWidth 2.485)
+(ScreenAttribute center PhysicalScreenHeight 1.745)
+(ScreenAttribute center WindowSize NoBorderFullScreen)
+(ScreenAttribute center TrackerBaseToImagePlate
+ (( 0.0 0.0 1.0 0.248)
+ (-1.0 0.0 0.0 0.885)
+ ( 0.0 -1.0 0.0 1.340)))
+
+(ScreenAttribute right PhysicalScreenWidth 2.480)
+(ScreenAttribute right PhysicalScreenHeight 1.775)
+(ScreenAttribute right WindowSize NoBorderFullScreen)
+(ScreenAttribute right TrackerBaseToImagePlate
+ (( 0.0 0.0 1.0 0.2488)
+ ( 0.0 -1.0 0.0 1.340)
+ ( 1.0 0.0 0.0 0.860)))
+
+// Set the location of the center of coexistence relative to the tracker base.
+// Here it set to the center of the center screen. This config file will set
+// the location of the user's eyes relative to this point. The default view
+// attach policy of NOMINAL_SCREEN used by ConfiguredUniverse will place the
+// origin of the view platform in coexistence coordinates at the center of
+// coexistence.
+//
+(NewPhysicalEnvironment VirtualPortal)
+(PhysicalEnvironmentAttribute VirtualPortal
+ CoexistenceToTrackerBase
+ ((-1.0 0.0 0.0 0.000)
+ ( 0.0 0.0 -1.0 1.340)
+ ( 0.0 -1.0 0.0 0.994)))
+
+// The above center of coexistence is appropriate for the sample geometry
+// files available in the programs/examples directory. Often a more
+// immersive point of view is required for larger virtual worlds. This can be
+// achieved by placing the center of coexistence closer to the nominal position
+// of the user's head, so that the view platform origin in coexistence
+// coordinates will map there as well.
+//
+// Here we set the location of the center of coexistence 0.5 meters along the
+// tracker base +Z axis, 1.737 meters from the floor (about 5 ft 8.4 inches).
+//
+// (PhysicalEnvironmentAttribute VirtualPortal
+// CoexistenceToTrackerBase
+// ((-1.0 0.0 0.0 0.0)
+// ( 0.0 0.0 -1.0 0.0)
+// ( 0.0 -1.0 0.0 0.5)))
+
+
+// Now define the view.
+//
+(NewView view0)
+(ViewAttribute view0 Screen left)
+(ViewAttribute view0 Screen center)
+(ViewAttribute view0 Screen right)
+(ViewAttribute view0 PhysicalEnvironment VirtualPortal)
+
+// Set the user eye position in the display environment. It is set here to
+// 1.340 meters back from the center screen (directly under the tracker), and
+// 1.737 meters from the floor (about 5 ft 8.4 inches).
+//
+(ViewAttribute view0 CenterEyeInCoexistence (0.0 0.494 1.340))
+
+// Here is an alternative center eye position to use with the immersive
+// coexistence coordinate system defined in comments above.
+//
+// (ViewAttribute view0 CenterEyeInCoexistence (0.0 0.0 0.0))
+
+// Set the screen scale. This is scale factor from virtual to physical
+// coordinates.
+//
+(ViewAttribute view0 ScreenScalePolicy SCALE_SCREEN_SIZE)
+
+// Alternative for explict scaling.
+//
+// (ViewAttribute view0 ScreenScalePolicy SCALE_EXPLICIT)
+// (ViewAttribute view0 ScreenScale 5.00)
+
+// No stereo viewing for this configuration.
+//
+(ViewAttribute view0 StereoEnable False)
diff --git a/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x3-rot45.cfg b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x3-rot45.cfg
new file mode 100644
index 0000000..c84d548
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d1x3-rot45.cfg
@@ -0,0 +1,110 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+/*
+ ************************************************************************
+ *
+ * Java 3D configuration file for 3 screens. Left and right screens are
+ * rotated 45 degrees from the center screen.
+ *
+ ************************************************************************
+ */
+
+// Create new screen objects and associate them with logical names and numbers.
+// These numbers are used as indices to retrieve the AWT GraphicsDevice from
+// the array that GraphicsEnvironment.getScreenDevices() returns.
+//
+// NOTE: The GraphicsDevice order in the array is specific to the local
+// site and display system.
+//
+(NewScreen left 0)
+(NewScreen center 1)
+(NewScreen right 2)
+
+// Set the available image areas for full screens.
+//
+(ScreenAttribute left PhysicalScreenWidth 0.360)
+(ScreenAttribute left PhysicalScreenHeight 0.288)
+
+(ScreenAttribute center PhysicalScreenWidth 0.360)
+(ScreenAttribute center PhysicalScreenHeight 0.288)
+
+(ScreenAttribute right PhysicalScreenWidth 0.360)
+(ScreenAttribute right PhysicalScreenHeight 0.288)
+
+// Specify full screen windows.
+//
+(ScreenAttribute left WindowSize NoBorderFullScreen)
+(ScreenAttribute center WindowSize NoBorderFullScreen)
+(ScreenAttribute right WindowSize NoBorderFullScreen)
+
+// Set the TrackerBaseToImagePlate transforms for these screens.
+//
+// The tracker base and center of coexistence are set here to the middle of the
+// center screen. The basis vectors are aligned with the center screen image
+// plate. The left and right screens are rotated 45 degrees toward each other
+// about their shared edges with the center screen.
+//
+(ScreenAttribute center TrackerBaseToImagePlate
+ (Translate 0.180000 0.144000 0.000000))
+
+// cos(45) * 0.360 * 0.5 = 0.127279; 0.360 + 0.127279 = 0.487279
+(ScreenAttribute left TrackerBaseToImagePlate
+ (RotateTranslate
+ (Rotate 0.000000 -45.000000 0.000000)
+ (Translate 0.487279 0.144000 0.127279)))
+
+// cos(45) * 0.360 * 0.5 = 0.127279
+(ScreenAttribute right TrackerBaseToImagePlate
+ (RotateTranslate
+ (Rotate 0.000000 45.000000 0.000000)
+ (Translate -0.127279 0.144000 0.127279)))
+
+// Create a view using the defined screens.
+//
+(NewView view0)
+(ViewAttribute view0 Screen left)
+(ViewAttribute view0 Screen center)
+(ViewAttribute view0 Screen right)
+(ViewAttribute view0 CenterEyeInCoexistence (0.0 0.0 0.5))
diff --git a/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d2x2-flat.cfg b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d2x2-flat.cfg
new file mode 100644
index 0000000..8bc4cb0
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/configured_universe/j3d2x2-flat.cfg
@@ -0,0 +1,135 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+/*
+ ************************************************************************
+ *
+ * Java 3D configuration file for 4 screen projection configuration
+ * arranged in a 2x2 power wall.
+ *
+ ************************************************************************
+ */
+
+// Create new screen objects and associate them with logical names and numbers.
+// These numbers are used as indices to retrieve the AWT GraphicsDevice from
+// the array that GraphicsEnvironment.getScreenDevices() returns.
+//
+// NOTE: The GraphicsDevice order in the array is specific to the local
+// site and display system.
+//
+(NewScreen topleft 0)
+(NewScreen topright 1)
+(NewScreen bottomleft 3)
+(NewScreen bottomright 2)
+
+// Set the available image areas for full screens. This is important when
+// precise scaling between objects in the virtual world and their projections
+// into the physical world is desired through use of explicit ScreenScale view
+// attributes. The defaults are 0.365 meters for width and 0.292 meters for
+// height.
+//
+(ScreenAttribute topleft PhysicalScreenWidth 0.912)
+(ScreenAttribute topleft PhysicalScreenHeight 0.680)
+
+(ScreenAttribute topright PhysicalScreenWidth 0.912)
+(ScreenAttribute topright PhysicalScreenHeight 0.680)
+
+(ScreenAttribute bottomleft PhysicalScreenWidth 0.912)
+(ScreenAttribute bottomleft PhysicalScreenHeight 0.685)
+
+(ScreenAttribute bottomright PhysicalScreenWidth 0.912)
+(ScreenAttribute bottomright PhysicalScreenHeight 0.685)
+
+
+// Specify full screen windows.
+//
+(ScreenAttribute topleft WindowSize NoBorderFullScreen)
+(ScreenAttribute topright WindowSize NoBorderFullScreen)
+(ScreenAttribute bottomleft WindowSize NoBorderFullScreen)
+(ScreenAttribute bottomright WindowSize NoBorderFullScreen)
+
+// Set the TrackerBaseToImagePlate transforms for these screens. This
+// transforms points in tracker base coordinates to each screen's image plate
+// coordinates, where the origin of the image plate is defined to be the lower
+// left corner of the screen with X increasing to the right, Y increasing to
+// the top, and Z increasing away from the screen.
+//
+// Without head or sensor tracking the tracker base is still needed as a point
+// of reference for describing the orientation and position of each screen to
+// the others. The coexistence to tracker base transform is set to identity by
+// default, so the tracker base origin and orientation will also set the origin
+// and orientation of coexistence coordinates in the physical world.
+//
+// The tracker base and center of coexistence are set here to the center of the
+// 2x2 array with its basis vectors aligned to image plate coordinates.
+//
+(ScreenAttribute topleft TrackerBaseToImagePlate
+ (Translate 0.912 0.000 0.0))
+(ScreenAttribute topright TrackerBaseToImagePlate
+ (Translate 0.000 0.000 0.0))
+(ScreenAttribute bottomleft TrackerBaseToImagePlate
+ (Translate 0.912 0.685 0.0))
+(ScreenAttribute bottomright TrackerBaseToImagePlate
+ (Translate 0.000 0.685 0.0))
+
+// Create a view using the defined screens.
+//
+(NewView view0)
+(ViewAttribute view0 Screen topleft)
+(ViewAttribute view0 Screen topright)
+(ViewAttribute view0 Screen bottomleft)
+(ViewAttribute view0 Screen bottomright)
+
+// Set the screen scale. This is scale factor from virtual to physical
+// coordinates. The default policy of SCALE_SCREEN_SIZE doesn't work well here
+// since in the 2x2 arrangement the individual screens are too small. The
+// explicit scale factor below assumes a normalized range of object coordinates
+// of [-1.0 .. +1.0].
+//
+(ViewAttribute view0 ScreenScalePolicy SCALE_EXPLICIT)
+(ViewAttribute view0 ScreenScale 0.912)
+
+// Set the user eye position in the display environment.
+//
+(ViewAttribute view0 CenterEyeInCoexistence (0.0 0.0 1.0))
diff --git a/src/main/java/org/jdesktop/j3d/examples/depth_func/DepthFuncTest.form b/src/main/java/org/jdesktop/j3d/examples/depth_func/DepthFuncTest.form
new file mode 100644
index 0000000..b7d1376
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/depth_func/DepthFuncTest.form
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.2" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,-16,0,0,1,-109"/>
+ <SyntheticProperty name="formPosition" type="java.awt.Point" value="-84,-19,0,5,115,114,0,14,106,97,118,97,46,97,119,116,46,80,111,105,110,116,-74,-60,-118,114,52,126,-56,38,2,0,2,73,0,1,120,73,0,1,121,120,112,0,0,0,0,0,0,0,0"/>
+ <SyntheticProperty name="formSizePolicy" type="int" value="0"/>
+ <SyntheticProperty name="generatePosition" type="boolean" value="true"/>
+ <SyntheticProperty name="generateSize" type="boolean" value="true"/>
+ <SyntheticProperty name="generateCenter" type="boolean" value="false"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,-40,0,0,1,-117"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="jPanel1">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="WireFrame Object"/>
+ </Border>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="jLabel1">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="12" style="0"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Depth function"/>
+ <Property name="toolTipText" type="java.lang.String" value="Mode for normal object"/>
+ </Properties>
+ <AccessibilityProperties>
+ <Property name="AccessibleContext.accessibleParent" type="javax.accessibility.Accessible" editor="org.netbeans.modules.form.RADVisualComponent$AccessibleParentEditor">
+ <ComponentRef name="shadedComboBox"/>
+ </Property>
+ </AccessibilityProperties>
+ </Component>
+ <Component class="javax.swing.JComboBox" name="normalComboBox">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="12" style="0"/>
+ </Property>
+ <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+ <StringArray count="8">
+ <StringItem index="0" value="ALWAYS"/>
+ <StringItem index="1" value="NEVER"/>
+ <StringItem index="2" value="EQUAL"/>
+ <StringItem index="3" value="NOT_EQUAL"/>
+ <StringItem index="4" value="LESS"/>
+ <StringItem index="5" value="LESS_OR_EQUAL"/>
+ <StringItem index="6" value="GREATER"/>
+ <StringItem index="7" value="GREATER_OR_EQUAL"/>
+ </StringArray>
+ </Property>
+ <Property name="selectedIndex" type="int" value="6"/>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[150, 22]"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="normalComboBoxActionPerformed"/>
+ </Events>
+ </Component>
+ <Component class="javax.swing.JCheckBox" name="wfCheckBox">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="12" style="0"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Write Depth Buffer"/>
+ <Property name="toolTipText" type="java.lang.String" value="Depth will be written for the object, if selected"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="wfCheckBoxActionPerformed"/>
+ </Events>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="jPanel2">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="Shaded Object"/>
+ </Border>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="jLabel3">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="12" style="0"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Depth Function"/>
+ <Property name="toolTipText" type="java.lang.String" value="Mode of shaded object"/>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JComboBox" name="shadedComboBox">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="12" style="0"/>
+ </Property>
+ <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+ <StringArray count="8">
+ <StringItem index="0" value="ALWAYS"/>
+ <StringItem index="1" value="NEVER"/>
+ <StringItem index="2" value="EQUAL"/>
+ <StringItem index="3" value="NOT_EQUAL"/>
+ <StringItem index="4" value="LESS"/>
+ <StringItem index="5" value="LESS_OR_EQUAL"/>
+ <StringItem index="6" value="GREATER"/>
+ <StringItem index="7" value="GREATER_OR_EQUAL"/>
+ </StringArray>
+ </Property>
+ <Property name="selectedIndex" type="int" value="4"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="shadedComboBoxActionPerformed"/>
+ </Events>
+ </Component>
+ <Component class="javax.swing.JCheckBox" name="shadedCheckBox">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="12" style="0"/>
+ </Property>
+ <Property name="selected" type="boolean" value="true"/>
+ <Property name="text" type="java.lang.String" value="Write Depth Buffer"/>
+ <Property name="toolTipText" type="java.lang.String" value="Depth will be written for the object, if selected"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="shadedCheckBoxActionPerformed"/>
+ </Events>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="jPanel3">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="Rotating Cube"/>
+ </Border>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="jLabel4">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="12" style="0"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Raster Operator"/>
+ <Property name="toolTipText" type="java.lang.String" value="Raster mode of rotating object (try NOOP)"/>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JComboBox" name="rotatingComboBox">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="12" style="0"/>
+ </Property>
+ <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+ <StringArray count="16">
+ <StringItem index="0" value="CLEAR"/>
+ <StringItem index="1" value="AND"/>
+ <StringItem index="2" value="AND_REVERSE"/>
+ <StringItem index="3" value="COPY"/>
+ <StringItem index="4" value="AND_INVERTED"/>
+ <StringItem index="5" value="NOOP"/>
+ <StringItem index="6" value="XOR"/>
+ <StringItem index="7" value="OR"/>
+ <StringItem index="8" value="NOR"/>
+ <StringItem index="9" value="EQUIV"/>
+ <StringItem index="10" value="INVERT"/>
+ <StringItem index="11" value="OR_REVERSE"/>
+ <StringItem index="12" value="COPY_INVERTED"/>
+ <StringItem index="13" value="OR_INVERTED"/>
+ <StringItem index="14" value="NAND"/>
+ <StringItem index="15" value="SET"/>
+ </StringArray>
+ </Property>
+ <Property name="selectedIndex" type="int" value="3"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="rotatingComboBoxActionPerformed"/>
+ </Events>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/depth_func/DepthFuncTest.java b/src/main/java/org/jdesktop/j3d/examples/depth_func/DepthFuncTest.java
new file mode 100644
index 0000000..0095ca9
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/depth_func/DepthFuncTest.java
@@ -0,0 +1,359 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.depth_func;
+
+import org.jogamp.java3d.RenderingAttributes;
+
+
+/**
+ *The goal of that example is to show the use of different ZBuffer comparison modes.
+ */
+public class DepthFuncTest extends javax.swing.JFrame
+{
+
+ RenderFrame rf;
+
+ /**
+ * Creates new form DepthFuncTest
+ */
+ public DepthFuncTest(){
+ initComponents();
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ jPanel1 = new javax.swing.JPanel();
+ jLabel1 = new javax.swing.JLabel();
+ normalComboBox = new javax.swing.JComboBox();
+ wfCheckBox = new javax.swing.JCheckBox();
+ jPanel2 = new javax.swing.JPanel();
+ jLabel3 = new javax.swing.JLabel();
+ shadedComboBox = new javax.swing.JComboBox();
+ shadedCheckBox = new javax.swing.JCheckBox();
+ jPanel3 = new javax.swing.JPanel();
+ jLabel4 = new javax.swing.JLabel();
+ rotatingComboBox = new javax.swing.JComboBox();
+
+ getContentPane().setLayout(new java.awt.GridBagLayout());
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ jPanel1.setBorder(new javax.swing.border.TitledBorder("WireFrame Object"));
+ jLabel1.setFont(new java.awt.Font("Dialog", 0, 12));
+ jLabel1.setText("Depth function");
+ jLabel1.setToolTipText("Mode for normal object");
+ jPanel1.add(jLabel1);
+ jLabel1.getAccessibleContext().setAccessibleParent(shadedComboBox);
+
+ normalComboBox.setFont(new java.awt.Font("Dialog", 0, 12));
+ normalComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "ALWAYS", "NEVER", "EQUAL", "NOT_EQUAL", "LESS", "LESS_OR_EQUAL", "GREATER", "GREATER_OR_EQUAL" }));
+ normalComboBox.setSelectedIndex(6);
+ normalComboBox.setPreferredSize(new java.awt.Dimension(150, 22));
+ normalComboBox.addActionListener(new java.awt.event.ActionListener()
+ {
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ normalComboBoxActionPerformed(evt);
+ }
+ });
+
+ jPanel1.add(normalComboBox);
+
+ wfCheckBox.setFont(new java.awt.Font("Dialog", 0, 12));
+ wfCheckBox.setText("Write Depth Buffer");
+ wfCheckBox.setToolTipText("Depth will be written for the object, if selected");
+ wfCheckBox.addActionListener(new java.awt.event.ActionListener()
+ {
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ wfCheckBoxActionPerformed(evt);
+ }
+ });
+
+ jPanel1.add(wfCheckBox);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+ getContentPane().add(jPanel1, gridBagConstraints);
+
+ jPanel2.setBorder(new javax.swing.border.TitledBorder("Shaded Object"));
+ jLabel3.setFont(new java.awt.Font("Dialog", 0, 12));
+ jLabel3.setText("Depth Function");
+ jLabel3.setToolTipText("Mode of shaded object");
+ jPanel2.add(jLabel3);
+
+ shadedComboBox.setFont(new java.awt.Font("Dialog", 0, 12));
+ shadedComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "ALWAYS", "NEVER", "EQUAL", "NOT_EQUAL", "LESS", "LESS_OR_EQUAL", "GREATER", "GREATER_OR_EQUAL" }));
+ shadedComboBox.setSelectedIndex(4);
+ shadedComboBox.addActionListener(new java.awt.event.ActionListener()
+ {
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ shadedComboBoxActionPerformed(evt);
+ }
+ });
+
+ jPanel2.add(shadedComboBox);
+
+ shadedCheckBox.setFont(new java.awt.Font("Dialog", 0, 12));
+ shadedCheckBox.setSelected(true);
+ shadedCheckBox.setText("Write Depth Buffer");
+ shadedCheckBox.setToolTipText("Depth will be written for the object, if selected");
+ shadedCheckBox.addActionListener(new java.awt.event.ActionListener()
+ {
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ shadedCheckBoxActionPerformed(evt);
+ }
+ });
+
+ jPanel2.add(shadedCheckBox);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+ getContentPane().add(jPanel2, gridBagConstraints);
+
+ jPanel3.setBorder(new javax.swing.border.TitledBorder("Rotating Cube"));
+ jLabel4.setFont(new java.awt.Font("Dialog", 0, 12));
+ jLabel4.setText("Raster Operator");
+ jLabel4.setToolTipText("Raster mode of rotating object (try NOOP)");
+ jPanel3.add(jLabel4);
+
+ rotatingComboBox.setFont(new java.awt.Font("Dialog", 0, 12));
+ rotatingComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "CLEAR", "AND", "AND_REVERSE", "COPY", "AND_INVERTED", "NOOP", "XOR", "OR", "NOR", "EQUIV", "INVERT", "OR_REVERSE", "COPY_INVERTED", "OR_INVERTED", "NAND", "SET" }));
+ rotatingComboBox.setSelectedIndex(3);
+ rotatingComboBox.addActionListener(new java.awt.event.ActionListener()
+ {
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ rotatingComboBoxActionPerformed(evt);
+ }
+ });
+
+ jPanel3.add(rotatingComboBox);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+ getContentPane().add(jPanel3, gridBagConstraints);
+
+ setBounds(0, 0, 403, 240);
+ }
+ // </editor-fold>//GEN-END:initComponents
+
+ private void rotatingComboBoxActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_rotatingComboBoxActionPerformed
+ {//GEN-HEADEREND:event_rotatingComboBoxActionPerformed
+ String selectedItem = rotatingComboBox.getSelectedItem().toString(); // how to avoid a cast and all that goes with it. (lazyness)
+ int mode = RenderingAttributes.ROP_COPY;
+ if ( "CLEAR".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_CLEAR;
+ }
+ else if ( "AND".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_AND;
+ }
+ else if ( "AND_REVERSE".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_AND_REVERSE;
+ }
+ else if ( "COPY".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_COPY;
+ }
+ else if ( "AND_INVERTED".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_AND_INVERTED;
+ }
+ else if ( "NOOP".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_NOOP;
+ }
+ else if ( "XOR".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_XOR;
+ }
+ else if ( "OR".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_OR;
+ }
+ else if ( "NOR".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_NOR;
+ }
+ else if ( "EQUIV".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_EQUIV;
+ }
+ else if ( "INVERT".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_INVERT;
+ }
+ else if ( "OR_REVERSE".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_OR_REVERSE;
+ }
+ else if ( "COPY_INVERTED".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_COPY_INVERTED;
+ }
+ else if ( "OR_INVERTED".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_OR_INVERTED;
+ }
+ else if ( "NAND".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_NAND;
+ }
+ else if ( "SET".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_SET;
+ }
+ else
+ {
+ System.out.println("oops. wrong mode in ROP combo: "+selectedItem);
+ }
+ rf.setRotatingObjectROPMode( mode );
+ }//GEN-LAST:event_rotatingComboBoxActionPerformed
+
+ private void shadedCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_shadedCheckBoxActionPerformed
+ rf.setStaticObjectDBWriteStatus( shadedCheckBox.isSelected() );
+ }//GEN-LAST:event_shadedCheckBoxActionPerformed
+
+ private void wfCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_wfCheckBoxActionPerformed
+ rf.setStaticWFObjectDBWriteStatus( wfCheckBox.isSelected() );
+ }//GEN-LAST:event_wfCheckBoxActionPerformed
+
+ private void shadedComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_shadedComboBoxActionPerformed
+ int func = RenderingAttributes.LESS_OR_EQUAL;
+ String selectedItem = shadedComboBox.getSelectedItem().toString(); // how to avoid a cast and all that goes with it. (lazyness)
+ rf.setStaticObjectTestFunc( getID( selectedItem ) );
+ }//GEN-LAST:event_shadedComboBoxActionPerformed
+
+ private void normalComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_normalComboBoxActionPerformed
+ int func = RenderingAttributes.LESS_OR_EQUAL;
+ String selectedItem = normalComboBox.getSelectedItem().toString(); // how to avoid a cast and all that goes with it. (lazyness)
+ rf.setStaticWFObjectTestFunc( getID( selectedItem ) );
+ }//GEN-LAST:event_normalComboBoxActionPerformed
+
+ int getID( String selectedItem )
+ {
+ int func = RenderingAttributes.LESS_OR_EQUAL;
+ if ( "LESS_OR_EQUAL".equals(selectedItem) )
+ {
+ func = RenderingAttributes.LESS_OR_EQUAL;
+ }
+ else if ( "NEVER".equals(selectedItem) )
+ {
+ func = RenderingAttributes.NEVER;
+ }
+ else if ( "ALWAYS".equals(selectedItem) )
+ {
+ func = RenderingAttributes.ALWAYS;
+ }
+ else if ( "GREATER".equals(selectedItem) )
+ {
+ func = RenderingAttributes.GREATER;
+ }
+ else if ( "GREATER_OR_EQUAL".equals(selectedItem) )
+ {
+ func = RenderingAttributes.GREATER_OR_EQUAL;
+ }
+ else if ( "LESS".equals(selectedItem) )
+ {
+ func = RenderingAttributes.LESS;
+ }
+ else if ( "EQUAL".equals(selectedItem) )
+ {
+ func = RenderingAttributes.EQUAL;
+ }
+ else if ( "NOT_EQUAL".equals(selectedItem) )
+ {
+ func = RenderingAttributes.NOT_EQUAL;
+ }
+ return func;
+ }
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ DepthFuncTest dpt = new DepthFuncTest();
+ dpt.rf = new RenderFrame( dpt );
+ dpt.setVisible(true);
+ dpt.rf.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JLabel jLabel3;
+ private javax.swing.JLabel jLabel4;
+ private javax.swing.JPanel jPanel1;
+ private javax.swing.JPanel jPanel2;
+ private javax.swing.JPanel jPanel3;
+ private javax.swing.JComboBox normalComboBox;
+ private javax.swing.JComboBox rotatingComboBox;
+ private javax.swing.JCheckBox shadedCheckBox;
+ private javax.swing.JComboBox shadedComboBox;
+ private javax.swing.JCheckBox wfCheckBox;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/depth_func/DepthFuncTestGL2ES2.java b/src/main/java/org/jdesktop/j3d/examples/depth_func/DepthFuncTestGL2ES2.java
new file mode 100644
index 0000000..ed34922
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/depth_func/DepthFuncTestGL2ES2.java
@@ -0,0 +1,347 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.depth_func;
+
+import org.jogamp.java3d.RenderingAttributes;
+
+
+/**
+ *The goal of that example is to show the use of different ZBuffer comparison modes.
+ */
+public class DepthFuncTestGL2ES2 extends javax.swing.JFrame
+{
+
+ RenderFrameGL2ES2 rf;
+
+ /**
+ * Creates new form DepthFuncTest
+ */
+ public DepthFuncTestGL2ES2(){
+ initComponents();
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ jPanel1 = new javax.swing.JPanel();
+ jLabel1 = new javax.swing.JLabel();
+ normalComboBox = new javax.swing.JComboBox();
+ wfCheckBox = new javax.swing.JCheckBox();
+ jPanel2 = new javax.swing.JPanel();
+ jLabel3 = new javax.swing.JLabel();
+ shadedComboBox = new javax.swing.JComboBox();
+ shadedCheckBox = new javax.swing.JCheckBox();
+ jPanel3 = new javax.swing.JPanel();
+ jLabel4 = new javax.swing.JLabel();
+ rotatingComboBox = new javax.swing.JComboBox();
+
+ getContentPane().setLayout(new java.awt.GridBagLayout());
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ jPanel1.setBorder(new javax.swing.border.TitledBorder("WireFrame Object"));
+ jLabel1.setFont(new java.awt.Font("Dialog", 0, 12));
+ jLabel1.setText("Depth function");
+ jLabel1.setToolTipText("Mode for normal object");
+ jPanel1.add(jLabel1);
+ jLabel1.getAccessibleContext().setAccessibleParent(shadedComboBox);
+
+ normalComboBox.setFont(new java.awt.Font("Dialog", 0, 12));
+ normalComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "ALWAYS", "NEVER", "EQUAL", "NOT_EQUAL", "LESS", "LESS_OR_EQUAL", "GREATER", "GREATER_OR_EQUAL" }));
+ normalComboBox.setSelectedIndex(6);
+ normalComboBox.setPreferredSize(new java.awt.Dimension(150, 22));
+ normalComboBox.addActionListener(new java.awt.event.ActionListener()
+ {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ normalComboBoxActionPerformed(evt);
+ }
+ });
+
+ jPanel1.add(normalComboBox);
+
+ wfCheckBox.setFont(new java.awt.Font("Dialog", 0, 12));
+ wfCheckBox.setText("Write Depth Buffer");
+ wfCheckBox.setToolTipText("Depth will be written for the object, if selected");
+ wfCheckBox.addActionListener(new java.awt.event.ActionListener()
+ {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ wfCheckBoxActionPerformed(evt);
+ }
+ });
+
+ jPanel1.add(wfCheckBox);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+ getContentPane().add(jPanel1, gridBagConstraints);
+
+ jPanel2.setBorder(new javax.swing.border.TitledBorder("Shaded Object"));
+ jLabel3.setFont(new java.awt.Font("Dialog", 0, 12));
+ jLabel3.setText("Depth Function");
+ jLabel3.setToolTipText("Mode of shaded object");
+ jPanel2.add(jLabel3);
+
+ shadedComboBox.setFont(new java.awt.Font("Dialog", 0, 12));
+ shadedComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "ALWAYS", "NEVER", "EQUAL", "NOT_EQUAL", "LESS", "LESS_OR_EQUAL", "GREATER", "GREATER_OR_EQUAL" }));
+ shadedComboBox.setSelectedIndex(4);
+ shadedComboBox.addActionListener(new java.awt.event.ActionListener()
+ {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ shadedComboBoxActionPerformed(evt);
+ }
+ });
+
+ jPanel2.add(shadedComboBox);
+
+ shadedCheckBox.setFont(new java.awt.Font("Dialog", 0, 12));
+ shadedCheckBox.setSelected(true);
+ shadedCheckBox.setText("Write Depth Buffer");
+ shadedCheckBox.setToolTipText("Depth will be written for the object, if selected");
+ shadedCheckBox.addActionListener(new java.awt.event.ActionListener()
+ {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ shadedCheckBoxActionPerformed(evt);
+ }
+ });
+
+ jPanel2.add(shadedCheckBox);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+ getContentPane().add(jPanel2, gridBagConstraints);
+
+ jPanel3.setBorder(new javax.swing.border.TitledBorder("Rotating Cube"));
+ jLabel4.setFont(new java.awt.Font("Dialog", 0, 12));
+ jLabel4.setText("Raster Operator - Raster Ops are not availible in GL2ES2");
+ jLabel4.setToolTipText("Raster mode of rotating object (try NOOP)");
+ jPanel3.add(jLabel4);
+
+ rotatingComboBox.setFont(new java.awt.Font("Dialog", 0, 12));
+ rotatingComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "CLEAR", "AND", "AND_REVERSE", "COPY", "AND_INVERTED", "NOOP", "XOR", "OR", "NOR", "EQUIV", "INVERT", "OR_REVERSE", "COPY_INVERTED", "OR_INVERTED", "NAND", "SET" }));
+ rotatingComboBox.setSelectedIndex(3);
+ rotatingComboBox.addActionListener(new java.awt.event.ActionListener()
+ {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ rotatingComboBoxActionPerformed(evt);
+ }
+ });
+
+ //Raster Ops are not availible in GL2ES2
+ //jPanel3.add(rotatingComboBox);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+ getContentPane().add(jPanel3, gridBagConstraints);
+
+ setBounds(0, 0, 403, 240);
+ }
+ // </editor-fold>//GEN-END:initComponents
+
+ private void rotatingComboBoxActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_rotatingComboBoxActionPerformed
+ {//GEN-HEADEREND:event_rotatingComboBoxActionPerformed
+ String selectedItem = rotatingComboBox.getSelectedItem().toString(); // how to avoid a cast and all that goes with it. (lazyness)
+ int mode = RenderingAttributes.ROP_COPY;
+ if ( "CLEAR".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_CLEAR;
+ }
+ else if ( "AND".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_AND;
+ }
+ else if ( "AND_REVERSE".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_AND_REVERSE;
+ }
+ else if ( "COPY".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_COPY;
+ }
+ else if ( "AND_INVERTED".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_AND_INVERTED;
+ }
+ else if ( "NOOP".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_NOOP;
+ }
+ else if ( "XOR".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_XOR;
+ }
+ else if ( "OR".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_OR;
+ }
+ else if ( "NOR".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_NOR;
+ }
+ else if ( "EQUIV".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_EQUIV;
+ }
+ else if ( "INVERT".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_INVERT;
+ }
+ else if ( "OR_REVERSE".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_OR_REVERSE;
+ }
+ else if ( "COPY_INVERTED".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_COPY_INVERTED;
+ }
+ else if ( "OR_INVERTED".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_OR_INVERTED;
+ }
+ else if ( "NAND".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_NAND;
+ }
+ else if ( "SET".equals(selectedItem) )
+ {
+ mode = RenderingAttributes.ROP_SET;
+ }
+ else
+ {
+ System.out.println("oops. wrong mode in ROP combo: "+selectedItem);
+ }
+
+ rf.setRotatingObjectROPMode( mode );
+ }//GEN-LAST:event_rotatingComboBoxActionPerformed
+
+ private void shadedCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_shadedCheckBoxActionPerformed
+ rf.setStaticObjectDBWriteStatus( shadedCheckBox.isSelected() );
+ }//GEN-LAST:event_shadedCheckBoxActionPerformed
+
+ private void wfCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_wfCheckBoxActionPerformed
+ rf.setStaticWFObjectDBWriteStatus( wfCheckBox.isSelected() );
+ }//GEN-LAST:event_wfCheckBoxActionPerformed
+
+ private void shadedComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_shadedComboBoxActionPerformed
+ //int func = RenderingAttributes.LESS_OR_EQUAL;
+ String selectedItem = shadedComboBox.getSelectedItem().toString(); // how to avoid a cast and all that goes with it. (lazyness)
+ rf.setStaticObjectTestFunc( getID( selectedItem ) );
+ }//GEN-LAST:event_shadedComboBoxActionPerformed
+
+ private void normalComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_normalComboBoxActionPerformed
+ //int func = RenderingAttributes.LESS_OR_EQUAL;
+ String selectedItem = normalComboBox.getSelectedItem().toString(); // how to avoid a cast and all that goes with it. (lazyness)
+ rf.setStaticWFObjectTestFunc( getID( selectedItem ) );
+ }//GEN-LAST:event_normalComboBoxActionPerformed
+
+ int getID( String selectedItem )
+ {
+ int func = RenderingAttributes.LESS_OR_EQUAL;
+ if ( "LESS_OR_EQUAL".equals(selectedItem) )
+ {
+ func = RenderingAttributes.LESS_OR_EQUAL;
+ }
+ else if ( "NEVER".equals(selectedItem) )
+ {
+ func = RenderingAttributes.NEVER;
+ }
+ else if ( "ALWAYS".equals(selectedItem) )
+ {
+ func = RenderingAttributes.ALWAYS;
+ }
+ else if ( "GREATER".equals(selectedItem) )
+ {
+ func = RenderingAttributes.GREATER;
+ }
+ else if ( "GREATER_OR_EQUAL".equals(selectedItem) )
+ {
+ func = RenderingAttributes.GREATER_OR_EQUAL;
+ }
+ else if ( "LESS".equals(selectedItem) )
+ {
+ func = RenderingAttributes.LESS;
+ }
+ else if ( "EQUAL".equals(selectedItem) )
+ {
+ func = RenderingAttributes.EQUAL;
+ }
+ else if ( "NOT_EQUAL".equals(selectedItem) )
+ {
+ func = RenderingAttributes.NOT_EQUAL;
+ }
+ return func;
+ }
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend", "jogl2es2");
+ System.setProperty("j3d.displaylist", "false");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ DepthFuncTestGL2ES2 dpt = new DepthFuncTestGL2ES2();
+ dpt.rf = new RenderFrameGL2ES2( dpt );
+ dpt.setVisible(true);
+ dpt.rf.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JLabel jLabel3;
+ private javax.swing.JLabel jLabel4;
+ private javax.swing.JPanel jPanel1;
+ private javax.swing.JPanel jPanel2;
+ private javax.swing.JPanel jPanel3;
+ private javax.swing.JComboBox<?> normalComboBox;
+ private javax.swing.JComboBox<?> rotatingComboBox;
+ private javax.swing.JCheckBox shadedCheckBox;
+ private javax.swing.JComboBox<?> shadedComboBox;
+ private javax.swing.JCheckBox wfCheckBox;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/depth_func/RenderFrame.form b/src/main/java/org/jdesktop/j3d/examples/depth_func/RenderFrame.form
new file mode 100644
index 0000000..2edc4bb
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/depth_func/RenderFrame.form
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="J3D frame"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,-32,0,0,2,-128"/>
+ <SyntheticProperty name="formPosition" type="java.awt.Point" value="-84,-19,0,5,115,114,0,14,106,97,118,97,46,97,119,116,46,80,111,105,110,116,-74,-60,-118,114,52,126,-56,38,2,0,2,73,0,1,120,73,0,1,121,120,112,0,0,1,-112,0,0,0,0"/>
+ <SyntheticProperty name="formSizePolicy" type="int" value="0"/>
+ <SyntheticProperty name="generatePosition" type="boolean" value="true"/>
+ <SyntheticProperty name="generateSize" type="boolean" value="true"/>
+ <SyntheticProperty name="generateCenter" type="boolean" value="false"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,-56,0,0,2,120"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/depth_func/RenderFrame.java b/src/main/java/org/jdesktop/j3d/examples/depth_func/RenderFrame.java
new file mode 100644
index 0000000..04d8a58
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/depth_func/RenderFrame.java
@@ -0,0 +1,309 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.depth_func;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.OrderedGroup;
+import org.jogamp.java3d.PointLight;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.RenderingAttributes;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.ScaleInterpolator;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseRotate;
+import org.jogamp.java3d.utils.geometry.Box;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3f;
+
+
+public class RenderFrame extends javax.swing.JFrame {
+
+ DepthFuncTest dpt;
+
+ SimpleUniverse su;
+
+ RenderingAttributes staticWFBoxRA;
+ RenderingAttributes staticBoxRA;
+
+ RenderingAttributes rotatingBoxRA;
+
+ /** Creates new form RenderFrame */
+ public RenderFrame( DepthFuncTest _dpt) {
+ dpt = _dpt;
+ initComponents();
+ initUniverse();
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("J3D frame");
+ setBounds(400, 0, 640, 480);
+ }
+ // </editor-fold>//GEN-END:initComponents
+
+ void initUniverse() {
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+ su = new SimpleUniverse(c);
+ su.addBranchGraph( createScene() );
+ c.getView().setMinimumFrameCycleTime( 10 );
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ // End of variables declaration//GEN-END:variables
+
+ BranchGroup createScene() {
+ BoundingSphere bounds = new BoundingSphere( new Point3d( 0.0, 0.0, 0.0 ), 100.0 );
+
+ BranchGroup globalBG = new BranchGroup();
+ BranchGroup rotObjectBG = new BranchGroup();
+ OrderedGroup staticObjectOG = new OrderedGroup();
+ BranchGroup lampsBG = new BranchGroup();
+ OrderedGroup oGroup = new OrderedGroup();
+ TransformGroup staticBoxRotTG = new TransformGroup();
+ staticBoxRotTG.addChild( staticObjectOG );
+ TransformGroup objectsTGRot = new TransformGroup();
+ TransformGroup objectsTGTrans = new TransformGroup();
+ Transform3D objectsTGTransT3d = new Transform3D();
+ objectsTGTransT3d.setTranslation( new Vector3f( 0.0f, 0.0f, -10.0f ) );
+ objectsTGTrans.setTransform( objectsTGTransT3d );
+ objectsTGRot.addChild( oGroup );
+ objectsTGTrans.addChild( objectsTGRot );
+ lampsBG.addChild( objectsTGTrans );
+
+ //adding a sphere as backgroung so there is something else than flat black, and cut cube removal as an other implication. (seeing through)
+ Appearance globalSphereAppearance = new Appearance();
+ PolygonAttributes globalSpherePA = new PolygonAttributes();
+ globalSpherePA.setCullFace( globalSpherePA.CULL_FRONT );// so that interior of the sphere is visible.
+ Material globalSphereMaterial = new Material();
+ globalSphereMaterial.setEmissiveColor( .25f ,.3f ,.35f );
+ globalSphereAppearance.setMaterial( globalSphereMaterial );
+ globalSphereAppearance.setPolygonAttributes( globalSpherePA );
+ Sphere globalSphere = new Sphere( 6.0f );
+ globalSphere.setAppearance( globalSphereAppearance );
+ globalSphere.setBounds( bounds );
+ oGroup.addChild( globalSphere );
+
+ globalBG.addChild( lampsBG );
+
+ // adding lamps.
+ PointLight frontLamp = new PointLight( new Color3f( 1.0f, 1.0f, 1.0f ), new Point3f( 20, 20, 20 ), new Point3f( 0.0f, .0f, 0.f ) );
+ lampsBG.addChild( frontLamp );
+ frontLamp.setBounds( bounds );
+ frontLamp.setInfluencingBounds( bounds );
+ PointLight backLamp = new PointLight( new Color3f( 1.0f, .0f, .0f ), new Point3f( -20, -20, -20 ), new Point3f( 0.0f, .0f, 0.f ) );
+ lampsBG.addChild( backLamp );
+ backLamp.setBounds( bounds );
+ backLamp.setInfluencingBounds( bounds );
+
+ //adding shapes.
+ {
+ //adding rotating and scaling cube
+ //doing the rotation
+ TransformGroup rotBoxTGRot = new TransformGroup();
+ rotBoxTGRot.setCapability( rotBoxTGRot.ALLOW_TRANSFORM_WRITE );
+ RotationInterpolator rotBoxRotInt = new RotationInterpolator( new Alpha( -1, 20000 ) , rotBoxTGRot );
+ rotBoxRotInt.setSchedulingBounds( bounds );
+ rotBoxRotInt.setBounds( bounds );
+
+ //doing the scaling
+ Transform3D scaleBoxt3d = new Transform3D();
+ TransformGroup rotBoxTGScale = new TransformGroup();
+ rotBoxTGScale.setCapability( rotBoxTGScale.ALLOW_TRANSFORM_WRITE );
+ ScaleInterpolator rotBoxScaleInt = new ScaleInterpolator( new Alpha( -1, Alpha.INCREASING_ENABLE|Alpha.DECREASING_ENABLE, 0, 0, 3000, 1500, 0, 3000, 1500, 0 ) , rotBoxTGScale, new Transform3D(), 0.7f, 1.6f );
+ rotBoxScaleInt.setSchedulingBounds( bounds );
+ rotBoxScaleInt.setBounds( bounds );
+
+ Appearance rotBoxApp = new Appearance();
+ Material rotBoxMat = new Material();
+ rotBoxMat.setDiffuseColor( .4f, .4f, .4f );
+ rotBoxApp.setMaterial( rotBoxMat );
+ Box rotBox = new Box( 1.1f, 1.1f, 1.1f, rotBoxApp );
+ rotBoxTGScale.addChild( rotBox );
+ rotBoxTGRot.addChild( rotBoxTGScale );
+ TransformGroup rotBoxTG = new TransformGroup();
+ rotBoxTG.addChild( rotBoxTGRot );
+ rotObjectBG.addChild( rotBoxTG );
+ rotObjectBG.addChild( rotBoxScaleInt );
+ rotObjectBG.addChild( rotBoxRotInt );
+ rotBox.setBounds( bounds );
+
+ rotatingBoxRA = new RenderingAttributes();
+ rotatingBoxRA.setRasterOpEnable( true );
+ rotatingBoxRA.setCapability( staticBoxRA.ALLOW_RASTER_OP_WRITE );
+// rotatingBoxRA.setRasterOp( rotatingBoxRA.ROP_XOR );
+ rotBoxApp.setRenderingAttributes( rotatingBoxRA );
+
+
+ rotBox.setAppearance( rotBoxApp );
+ }
+
+ //adding static back face wireframe cube
+ {
+ Box staticWFBoxBack = new Box( );
+ Appearance staticWFBoxApp = new Appearance();
+ Material staticWFBoxMat = new Material();
+ staticWFBoxMat.setDiffuseColor( 0.f, 0.f, 0.f );
+ staticWFBoxMat.setEmissiveColor( 0.f, .4f, 0.f );
+ staticWFBoxApp.setMaterial( staticWFBoxMat );
+ PolygonAttributes staticWFBoxPABack = new PolygonAttributes( PolygonAttributes.POLYGON_LINE, PolygonAttributes.CULL_FRONT, 0.0f );
+ staticWFBoxApp.setPolygonAttributes( staticWFBoxPABack );
+ staticWFBoxRA = new RenderingAttributes();
+ staticWFBoxRA.setCapability( staticWFBoxRA.ALLOW_DEPTH_TEST_FUNCTION_WRITE );
+ staticWFBoxRA.setCapability( staticWFBoxRA.ALLOW_DEPTH_ENABLE_WRITE );
+ staticWFBoxRA.setDepthTestFunction( staticWFBoxRA.GREATER );
+ staticWFBoxRA.setDepthBufferWriteEnable( false );
+ staticWFBoxApp.setRenderingAttributes( staticWFBoxRA );
+ staticWFBoxBack.setAppearance( staticWFBoxApp );
+ staticWFBoxBack.setBounds( bounds );
+ staticObjectOG.addChild( staticWFBoxBack );
+ }
+
+ //adding static front face wireframe cube
+ {
+ Box staticWFBox = new Box( );
+ Appearance staticWFBoxApp = new Appearance();
+ Material staticWFBoxMat = new Material();
+ staticWFBoxMat.setDiffuseColor( 0.f, 0.f, 0.f );
+ staticWFBoxMat.setEmissiveColor( 0.f, 1.f, 0.f );
+ staticWFBoxApp.setMaterial( staticWFBoxMat );
+ PolygonAttributes staticWFBoxPA = new PolygonAttributes( PolygonAttributes.POLYGON_LINE, PolygonAttributes.CULL_BACK, 0.0f );
+ staticWFBoxApp.setPolygonAttributes( staticWFBoxPA );
+ staticWFBoxApp.setRenderingAttributes( staticWFBoxRA );
+ staticWFBox.setAppearance( staticWFBoxApp );
+ staticWFBox.setBounds( bounds );
+ staticObjectOG.addChild( staticWFBox );
+ }
+
+
+ {// rotating the static cubes
+ Transform3D boxt3d = new Transform3D();
+ Transform3D tempt3d = new Transform3D();
+ boxt3d.rotZ( Math.PI/4.0f );
+ tempt3d.rotX( Math.PI/4.0f );
+ boxt3d.mul( tempt3d );
+ tempt3d.rotY( Math.PI/4.0f );
+ boxt3d.mul( tempt3d );
+ staticBoxRotTG.setTransform( boxt3d );
+ }
+
+ // adding static flat cube
+ {
+ Box staticBox = new Box( );
+ staticBox.setBounds( bounds );
+ Appearance boxApp = new Appearance();
+ Material boxMat = new Material();
+ boxMat.setDiffuseColor( .7f, .7f, .7f );
+ boxApp.setMaterial( boxMat );
+ staticBoxRA = new RenderingAttributes();
+ staticBoxRA.setCapability( staticBoxRA.ALLOW_DEPTH_TEST_FUNCTION_WRITE );
+ staticBoxRA.setCapability( staticBoxRA.ALLOW_DEPTH_ENABLE_WRITE );
+ staticBoxRA.setDepthTestFunction( staticBoxRA.LESS );
+ staticBoxRA.setDepthBufferWriteEnable( false );
+ boxApp.setRenderingAttributes( staticBoxRA );
+ staticBox.setAppearance( boxApp );
+ staticObjectOG.addChild( staticBox );
+ }
+ oGroup.addChild( rotObjectBG );
+ oGroup.addChild( staticBoxRotTG );
+
+ //adding the mouse rotate behavior to the group of cubes.
+ MouseRotate behavior = new MouseRotate();
+ behavior.setTransformGroup( objectsTGRot );
+ objectsTGRot.addChild( behavior );
+ objectsTGRot.setCapability( objectsTGRot.ALLOW_TRANSFORM_READ );
+ objectsTGRot.setCapability( objectsTGRot.ALLOW_TRANSFORM_WRITE );
+ behavior.setSchedulingBounds(bounds);
+ return globalBG;
+ }
+
+ public void setStaticWFObjectTestFunc( int func )
+ {
+ staticWFBoxRA.setDepthTestFunction( func );
+ }
+
+ public void setStaticObjectTestFunc( int func )
+ {
+ staticBoxRA.setDepthTestFunction( func );
+ }
+
+ public void setStaticWFObjectDBWriteStatus( boolean status )
+ {
+ staticWFBoxRA.setDepthBufferWriteEnable( status );
+ }
+
+ public void setStaticObjectDBWriteStatus( boolean status )
+ {
+ staticBoxRA.setDepthBufferWriteEnable( status );
+ }
+
+ public void setRotatingObjectROPMode( int mode )
+ {
+ rotatingBoxRA.setRasterOp( mode );
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/depth_func/RenderFrameGL2ES2.java b/src/main/java/org/jdesktop/j3d/examples/depth_func/RenderFrameGL2ES2.java
new file mode 100644
index 0000000..7eaed6e
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/depth_func/RenderFrameGL2ES2.java
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.depth_func;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jdesktop.j3d.examples.gl2es2pipeline.Cube;
+import org.jdesktop.j3d.examples.gl2es2pipeline.SimpleShaderAppearance;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.OrderedGroup;
+import org.jogamp.java3d.PointLight;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.RenderingAttributes;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.ScaleInterpolator;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseRotate;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3f;
+
+public class RenderFrameGL2ES2 extends javax.swing.JFrame
+{
+
+ DepthFuncTestGL2ES2 dpt;
+
+ SimpleUniverse su;
+
+ RenderingAttributes staticWFBoxRA;
+ RenderingAttributes staticBoxRA;
+
+ RenderingAttributes rotatingBoxRA;
+
+ /** Creates new form RenderFrame */
+ public RenderFrameGL2ES2(DepthFuncTestGL2ES2 _dpt)
+ {
+ dpt = _dpt;
+ initComponents();
+ initUniverse();
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("J3D frame");
+ setBounds(400, 0, 640, 480);
+ }
+ // </editor-fold>//GEN-END:initComponents
+
+ void initUniverse()
+ {
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+ su = new SimpleUniverse(c);
+ su.addBranchGraph(createScene());
+ c.getView().setMinimumFrameCycleTime(10);
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ // End of variables declaration//GEN-END:variables
+
+ BranchGroup createScene()
+ {
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+
+ BranchGroup globalBG = new BranchGroup();
+ BranchGroup rotObjectBG = new BranchGroup();
+ OrderedGroup staticObjectOG = new OrderedGroup();
+ BranchGroup lampsBG = new BranchGroup();
+ OrderedGroup oGroup = new OrderedGroup();
+ TransformGroup staticBoxRotTG = new TransformGroup();
+ staticBoxRotTG.addChild(staticObjectOG);
+ TransformGroup objectsTGRot = new TransformGroup();
+ TransformGroup objectsTGTrans = new TransformGroup();
+ Transform3D objectsTGTransT3d = new Transform3D();
+ objectsTGTransT3d.setTranslation(new Vector3f(0.0f, 0.0f, -10.0f));
+ objectsTGTrans.setTransform(objectsTGTransT3d);
+ objectsTGRot.addChild(oGroup);
+ objectsTGTrans.addChild(objectsTGRot);
+ lampsBG.addChild(objectsTGTrans);
+
+ //adding a sphere as backgroung so there is something else than flat black, and cut cube removal as an other implication. (seeing through)
+ Appearance globalSphereAppearance = new SimpleShaderAppearance(true, false);
+ PolygonAttributes globalSpherePA = new PolygonAttributes();
+ globalSpherePA.setCullFace(PolygonAttributes.CULL_FRONT);// so that interior of the sphere is visible.
+ Material globalSphereMaterial = new Material();
+ globalSphereMaterial.setEmissiveColor(.25f, .3f, .35f);
+ globalSphereAppearance.setMaterial(globalSphereMaterial);
+ globalSphereAppearance.setPolygonAttributes(globalSpherePA);
+ Sphere globalSphere = new Sphere(6.0f);
+ globalSphere.setAppearance(globalSphereAppearance);
+ globalSphere.setBounds(bounds);
+ oGroup.addChild(globalSphere);
+
+ globalBG.addChild(lampsBG);
+
+ // adding lamps.
+ PointLight frontLamp = new PointLight(new Color3f(1.0f, 1.0f, 1.0f), new Point3f(20, 20, 20), new Point3f(0.0f, .0f, 0.f));
+ lampsBG.addChild(frontLamp);
+ frontLamp.setBounds(bounds);
+ frontLamp.setInfluencingBounds(bounds);
+ PointLight backLamp = new PointLight(new Color3f(1.0f, .0f, .0f), new Point3f(-20, -20, -20), new Point3f(0.0f, .0f, 0.f));
+ lampsBG.addChild(backLamp);
+ backLamp.setBounds(bounds);
+ backLamp.setInfluencingBounds(bounds);
+
+ //adding shapes.
+ {
+ //adding rotating and scaling cube
+ //doing the rotation
+ TransformGroup rotBoxTGRot = new TransformGroup();
+ rotBoxTGRot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ RotationInterpolator rotBoxRotInt = new RotationInterpolator(new Alpha(-1, 20000), rotBoxTGRot);
+ rotBoxRotInt.setSchedulingBounds(bounds);
+ rotBoxRotInt.setBounds(bounds);
+
+ //doing the scaling
+ //Transform3D scaleBoxt3d = new Transform3D();
+ TransformGroup rotBoxTGScale = new TransformGroup();
+ rotBoxTGScale.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ ScaleInterpolator rotBoxScaleInt = new ScaleInterpolator(
+ new Alpha(-1, Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE, 0, 0, 3000, 1500, 0, 3000, 1500, 0), rotBoxTGScale,
+ new Transform3D(), 0.7f, 1.6f);
+ rotBoxScaleInt.setSchedulingBounds(bounds);
+ rotBoxScaleInt.setBounds(bounds);
+
+ Appearance rotBoxApp = new SimpleShaderAppearance(false, false);
+ Material rotBoxMat = new Material();
+ rotBoxMat.setDiffuseColor(.4f, .4f, .4f);
+ rotBoxApp.setMaterial(rotBoxMat);
+ Cube rotBox = new Cube(1.1f / 2, 1.1f / 2, 1.1f / 2);
+ rotBox.setAppearance(rotBoxApp);
+ rotBoxTGScale.addChild(rotBox);
+ rotBoxTGRot.addChild(rotBoxTGScale);
+ TransformGroup rotBoxTG = new TransformGroup();
+ rotBoxTG.addChild(rotBoxTGRot);
+ rotObjectBG.addChild(rotBoxTG);
+ rotObjectBG.addChild(rotBoxScaleInt);
+ rotObjectBG.addChild(rotBoxRotInt);
+ rotBox.setBounds(bounds);
+
+ rotatingBoxRA = new RenderingAttributes();
+ //Raster Ops are not availible in GL2ES2
+ // rotatingBoxRA.setRasterOpEnable( true );
+ rotatingBoxRA.setCapability(RenderingAttributes.ALLOW_RASTER_OP_WRITE);
+ // rotatingBoxRA.setRasterOp( rotatingBoxRA.ROP_XOR );
+ rotBoxApp.setRenderingAttributes(rotatingBoxRA);
+
+ rotBox.setAppearance(rotBoxApp);
+ }
+
+ //adding static back face wireframe cube
+ {
+ Cube staticWFBoxBack = new Cube();
+ Appearance staticWFBoxApp = new SimpleShaderAppearance(false, false);
+ Material staticWFBoxMat = new Material();
+ staticWFBoxMat.setDiffuseColor(0.f, 0.f, 0.f);
+ staticWFBoxMat.setEmissiveColor(0.f, .4f, 0.f);
+ staticWFBoxApp.setMaterial(staticWFBoxMat);
+ PolygonAttributes staticWFBoxPABack = new PolygonAttributes(PolygonAttributes.POLYGON_LINE, PolygonAttributes.CULL_FRONT, 0.0f);
+ staticWFBoxApp.setPolygonAttributes(staticWFBoxPABack);
+ staticWFBoxRA = new RenderingAttributes();
+ staticWFBoxRA.setCapability(RenderingAttributes.ALLOW_DEPTH_TEST_FUNCTION_WRITE);
+ staticWFBoxRA.setCapability(RenderingAttributes.ALLOW_DEPTH_ENABLE_WRITE);
+ staticWFBoxRA.setDepthTestFunction(RenderingAttributes.GREATER);
+ staticWFBoxRA.setDepthBufferWriteEnable(false);
+ staticWFBoxApp.setRenderingAttributes(staticWFBoxRA);
+ staticWFBoxBack.setAppearance(staticWFBoxApp);
+ staticWFBoxBack.setBounds(bounds);
+ staticObjectOG.addChild(staticWFBoxBack);
+ }
+
+ //adding static front face wireframe cube
+ {
+ Cube staticWFBox = new Cube();
+ Appearance staticWFBoxApp = new SimpleShaderAppearance(false, false);
+ Material staticWFBoxMat = new Material();
+ staticWFBoxMat.setDiffuseColor(0.f, 0.f, 0.f);
+ staticWFBoxMat.setEmissiveColor(0.f, 1.f, 0.f);
+ staticWFBoxApp.setMaterial(staticWFBoxMat);
+ PolygonAttributes staticWFBoxPA = new PolygonAttributes(PolygonAttributes.POLYGON_LINE, PolygonAttributes.CULL_BACK, 0.0f);
+ staticWFBoxApp.setPolygonAttributes(staticWFBoxPA);
+ staticWFBoxApp.setRenderingAttributes(staticWFBoxRA);
+ staticWFBox.setAppearance(staticWFBoxApp);
+ staticWFBox.setBounds(bounds);
+ staticObjectOG.addChild(staticWFBox);
+ }
+
+ {// rotating the static cubes
+ Transform3D boxt3d = new Transform3D();
+ Transform3D tempt3d = new Transform3D();
+ boxt3d.rotZ(Math.PI / 4.0f);
+ tempt3d.rotX(Math.PI / 4.0f);
+ boxt3d.mul(tempt3d);
+ tempt3d.rotY(Math.PI / 4.0f);
+ boxt3d.mul(tempt3d);
+ staticBoxRotTG.setTransform(boxt3d);
+ }
+
+ // adding static flat cube
+ {
+ Cube staticBox = new Cube();
+ staticBox.setBounds(bounds);
+ Appearance boxApp = new SimpleShaderAppearance(false, false);
+ Material boxMat = new Material();
+ boxMat.setDiffuseColor(.7f, .7f, .7f);
+ boxApp.setMaterial(boxMat);
+ staticBoxRA = new RenderingAttributes();
+ staticBoxRA.setCapability(RenderingAttributes.ALLOW_DEPTH_TEST_FUNCTION_WRITE);
+ staticBoxRA.setCapability(RenderingAttributes.ALLOW_DEPTH_ENABLE_WRITE);
+ staticBoxRA.setDepthTestFunction(RenderingAttributes.LESS);
+ staticBoxRA.setDepthBufferWriteEnable(false);
+ boxApp.setRenderingAttributes(staticBoxRA);
+ staticBox.setAppearance(boxApp);
+ staticObjectOG.addChild(staticBox);
+ }
+ oGroup.addChild(rotObjectBG);
+ oGroup.addChild(staticBoxRotTG);
+
+ //adding the mouse rotate behavior to the group of cubes.
+ MouseRotate behavior = new MouseRotate();
+ behavior.setTransformGroup(objectsTGRot);
+ objectsTGRot.addChild(behavior);
+ objectsTGRot.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ objectsTGRot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ behavior.setSchedulingBounds(bounds);
+ return globalBG;
+ }
+
+ public void setStaticWFObjectTestFunc(int func)
+ {
+ staticWFBoxRA.setDepthTestFunction(func);
+ }
+
+ public void setStaticObjectTestFunc(int func)
+ {
+ staticBoxRA.setDepthTestFunction(func);
+ }
+
+ public void setStaticWFObjectDBWriteStatus(boolean status)
+ {
+ staticWFBoxRA.setDepthBufferWriteEnable(status);
+ }
+
+ public void setStaticObjectDBWriteStatus(boolean status)
+ {
+ staticBoxRA.setDepthBufferWriteEnable(status);
+ }
+
+ public void setRotatingObjectROPMode(int mode)
+ {
+ //Raster Ops are not availible in GL2ES2
+ //rotatingBoxRA.setRasterOp( mode );
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortBehavior.java b/src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortBehavior.java
new file mode 100644
index 0000000..3ba873f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortBehavior.java
@@ -0,0 +1,193 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.distort_glyph;
+
+import java.util.Enumeration;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.WakeupCondition;
+import org.jogamp.java3d.WakeupCriterion;
+import org.jogamp.java3d.WakeupOnElapsedFrames;
+import org.jogamp.java3d.WakeupOnElapsedTime;
+import org.jogamp.vecmath.Vector3f;
+
+public class DistortBehavior extends Behavior {
+ // the wake up condition for the behavior
+ protected WakeupCondition m_InitialWakeupCondition = null;
+ protected WakeupCondition m_FrameWakeupCondition = null;
+
+ // the GeometryArray for the Shape3D that we are modifying
+ protected Shape3D m_Shape3D = null;
+ protected GeometryArray m_GeometryArray = null;
+
+ protected float[] m_CoordinateArray = null;
+ protected float[] m_OriginalCoordinateArray = null;
+ protected Appearance m_Appearance = null;
+
+ protected int m_nElapsedTime = 0;
+ protected int m_nNumFrames = 0;
+ protected int m_nFrameNumber = 0;
+
+ private int frame = 0;
+ protected Vector3f m_Vector = null;
+
+ public DistortBehavior(Shape3D shape3D, int nElapsedTime, int nNumFrames) {
+ // allocate a temporary vector
+ m_Vector = new Vector3f();
+
+ m_FrameWakeupCondition = new WakeupOnElapsedFrames(0);
+
+ restart(shape3D, nElapsedTime, nNumFrames);
+ }
+
+ public WakeupCondition restart(Shape3D shape3D, int nElapsedTime, int nNumFrames) {
+ m_Shape3D = shape3D;
+ m_nElapsedTime = nElapsedTime;
+ m_nNumFrames = nNumFrames;
+ m_nFrameNumber = 0;
+
+ // create the WakeupCriterion for the behavior
+ m_InitialWakeupCondition = new WakeupOnElapsedTime(m_nElapsedTime);
+
+ // save the GeometryArray that we are modifying
+ m_GeometryArray = (GeometryArray) m_Shape3D.getGeometry();
+
+ if (m_Shape3D.isLive() == false && m_Shape3D.isCompiled() == false) {
+ // set the capability bits that the behavior requires
+ m_Shape3D.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
+ m_Shape3D.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
+
+ m_Shape3D.getAppearance().setCapability(Appearance.ALLOW_POINT_ATTRIBUTES_WRITE);
+ m_Shape3D.getAppearance().setCapability(Appearance.ALLOW_POLYGON_ATTRIBUTES_WRITE);
+ m_Shape3D.getAppearance().setCapability(Appearance.ALLOW_TRANSPARENCY_ATTRIBUTES_WRITE);
+ m_Shape3D.getAppearance().setCapability(Appearance.ALLOW_TEXTURE_WRITE);
+
+ m_GeometryArray.setCapability(GeometryArray.ALLOW_COORDINATE_READ);
+ m_GeometryArray.setCapability(GeometryArray.ALLOW_COORDINATE_WRITE);
+ m_GeometryArray.setCapability(GeometryArray.ALLOW_COUNT_READ);
+ }
+
+ // make a copy of the object's original appearance
+ m_Appearance = new Appearance();
+ m_Appearance = (Appearance) m_Shape3D.getAppearance().cloneNodeComponent(true);
+
+ // allocate an array for the model coordinates
+ m_CoordinateArray = new float[3 * m_GeometryArray.getVertexCount()];
+
+ // make a copy of the models original coordinates
+ m_OriginalCoordinateArray = new float[3 * m_GeometryArray.getVertexCount()];
+ m_GeometryArray.getCoordinates(0, m_OriginalCoordinateArray);
+
+ // start (or restart) the behavior
+ setEnable(true);
+
+ return m_InitialWakeupCondition;
+ }
+
+ public void initialize() {
+ // apply the initial WakeupCriterion
+ wakeupOn(m_InitialWakeupCondition);
+ }
+
+ public void processStimulus(Enumeration criteria) {
+ while (criteria.hasMoreElements()) {
+ WakeupCriterion wakeUp = (WakeupCriterion) criteria.nextElement();
+
+ if (wakeUp instanceof WakeupOnElapsedTime) {
+ } else {
+ // we are mid explosion, modify the GeometryArray
+ m_nFrameNumber++;
+ frame++;
+ m_GeometryArray.getCoordinates(0, m_CoordinateArray);
+
+ Transform3D t3 = new Transform3D();
+ for (int n = 0; n < m_CoordinateArray.length; n += 3) {
+ m_Vector.x = m_OriginalCoordinateArray[n];
+ m_Vector.y = m_OriginalCoordinateArray[n + 1];
+ m_Vector.z = m_OriginalCoordinateArray[n + 2];
+
+ float spx = (float) (Math.sin(frame *3f / 500));
+ float spy = (float) (Math.cos(frame *5f / 500));
+ Vector3f v = new Vector3f(spx, spy, 0);
+
+ float px = (m_Vector.x - v.x);
+ float py = (m_Vector.y - v.y);
+ float pz = (m_Vector.z - v.z);
+ float d = (float) Math.sqrt(px * px + py * py + pz * pz);
+
+
+ m_Vector.add(new Vector3f(-.25f, -.25f, -.25f));
+ //m_Vector.scale(d);
+
+ t3.rotZ(d);
+ t3.rotX(d*2);
+ t3.rotY(d);
+ t3.transform(m_Vector);
+
+ m_CoordinateArray[n] = m_Vector.x;
+ m_CoordinateArray[n + 1] = m_Vector.y;
+ m_CoordinateArray[n + 2] = m_Vector.z;
+
+ }
+
+ // assign the new coordinates
+ m_GeometryArray.setCoordinates(0, m_CoordinateArray);
+ }
+ }
+
+ if (m_nFrameNumber < m_nNumFrames) {
+ // assign the next WakeUpCondition, so we are notified again
+ wakeupOn(m_FrameWakeupCondition);
+ } else {
+ // restart
+ m_nFrameNumber = 0;
+ wakeupOn(m_FrameWakeupCondition);
+ }
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortGlyphTest.form b/src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortGlyphTest.form
new file mode 100644
index 0000000..22838dc
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortGlyphTest.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="DistortGlyphTest"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortGlyphTest.java b/src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortGlyphTest.java
new file mode 100644
index 0000000..cf88439
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortGlyphTest.java
@@ -0,0 +1,254 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.distort_glyph;
+
+import java.awt.Font;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Font3D;
+import org.jogamp.java3d.FontExtrusion;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.GraphicsConfigTemplate3D;
+import org.jogamp.java3d.Light;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointLight;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.TexCoordGeneration;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseRotate;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseTranslate;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseZoom;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3f;
+
+public class DistortGlyphTest extends javax.swing.JFrame {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ // get a nice graphics config
+ private static GraphicsConfiguration getGraphicsConfig() {
+ GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();
+ template.setSceneAntialiasing(GraphicsConfigTemplate3D.PREFERRED);
+ GraphicsConfiguration gcfg = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getBestConfiguration(template);
+ return gcfg;
+ }
+
+ private void setupLights(BranchGroup root) {
+ // set up the BoundingSphere for all the lights
+ BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
+
+ // Set up the ambient light
+ AmbientLight lightAmbient = new AmbientLight(new Color3f(0.37f, 0.37f, 0.37f));
+ lightAmbient.setInfluencingBounds(bounds);
+ root.addChild(lightAmbient);
+
+ // Set up the directional light
+ Vector3f lightDirection1 = new Vector3f(0.0f, 0.0f, -1.0f);
+ DirectionalLight lightDirectional1 = new DirectionalLight(new Color3f(1.00f, 0.10f, 0.00f), lightDirection1);
+ lightDirectional1.setInfluencingBounds(bounds);
+ lightDirectional1.setCapability(Light.ALLOW_STATE_WRITE);
+ root.addChild(lightDirectional1);
+
+ Point3f lightPos1 = new Point3f(-4.0f, 8.0f, 16.0f);
+ Point3f lightAttenuation1 = new Point3f(1.0f, 0.0f, 0.0f);
+ PointLight pointLight1 = new PointLight(new Color3f(0.37f, 1.00f, 0.37f), lightPos1, lightAttenuation1);
+ pointLight1.setInfluencingBounds(bounds);
+ root.addChild(pointLight1);
+
+ Point3f lightPos2 = new Point3f(-16.0f, 8.0f, 4.0f);
+ Point3f lightAttenuation2 = new Point3f(1.0f, 0.0f, 0.0f);
+ PointLight pointLight2 = new PointLight(new Color3f(0.37f, 0.37f, 1.00f), lightPos2, lightAttenuation2);
+ pointLight2.setInfluencingBounds(bounds);
+ root.addChild(pointLight2);
+ }
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ setupLights(objRoot);
+
+ TransformGroup objTransform = new TransformGroup();
+ objTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+
+ objRoot.addChild(objTransform);
+
+ // setup a nice textured appearance
+ Appearance app = new Appearance();
+ Color3f objColor = new Color3f(1.0f, 0.7f, 0.8f);
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ app.setMaterial(new Material(objColor, black, objColor, black, 80.0f));
+ Texture txtr = new TextureLoader(Resources.getResource("resources/images/gold.jpg"),this).getTexture();
+ app.setTexture(txtr);
+ TexCoordGeneration tcg = new TexCoordGeneration(TexCoordGeneration.SPHERE_MAP,TexCoordGeneration.TEXTURE_COORDINATE_2);
+ app.setTexCoordGeneration(tcg);
+
+ // use a customized FontExtrusion object to control the depth of the text
+ java.awt.geom.GeneralPath gp = new java.awt.geom.GeneralPath();
+ gp.moveTo(0, 0);
+ gp.lineTo(.01f, .01f);
+ gp.lineTo(.2f, .01f);
+ gp.lineTo(.21f, 0f);
+ FontExtrusion fontEx = new FontExtrusion(gp);
+
+ // our glyph
+ Font fnt = new Font("dialog", Font.BOLD, 1);
+ Font3D f3d = new Font3D(fnt, .001, fontEx);
+ GeometryArray geom = f3d.getGlyphGeometry('A');
+ Shape3D shape = new Shape3D(geom, app);
+ objTransform.addChild(shape);
+
+ // the DistortBehavior
+ DistortBehavior eb = new DistortBehavior(shape, 1000, 1000);
+ eb.setSchedulingBounds(new BoundingSphere());
+ objTransform.addChild(eb);
+
+ MouseRotate myMouseRotate = new MouseRotate();
+ myMouseRotate.setTransformGroup(objTransform);
+ myMouseRotate.setSchedulingBounds(new BoundingSphere());
+ objRoot.addChild(myMouseRotate);
+
+ MouseTranslate myMouseTranslate = new MouseTranslate();
+ myMouseTranslate.setTransformGroup(objTransform);
+ myMouseTranslate.setSchedulingBounds(new BoundingSphere());
+ objRoot.addChild(myMouseTranslate);
+
+ MouseZoom myMouseZoom = new MouseZoom();
+ myMouseZoom.setTransformGroup(objTransform);
+ myMouseZoom.setSchedulingBounds(new BoundingSphere());
+ objRoot.addChild(myMouseZoom);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse() {
+
+ // Create a Canvas3D using a nice configuration
+ Canvas3D c = new Canvas3D(getGraphicsConfig());
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form DistortGlyphTest2
+ */
+ public DistortGlyphTest() {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("DistortGlyphTest");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new DistortGlyphTest().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortGlyphTestGL2ES2.java b/src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortGlyphTestGL2ES2.java
new file mode 100644
index 0000000..c92725a
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/distort_glyph/DistortGlyphTestGL2ES2.java
@@ -0,0 +1,324 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.distort_glyph;
+
+import java.awt.Font;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
+
+import org.jdesktop.j3d.examples.Resources;
+
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Font3D;
+import org.jogamp.java3d.FontExtrusion;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.GraphicsConfigTemplate3D;
+import org.jogamp.java3d.Light;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointLight;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderAttributeSet;
+import org.jogamp.java3d.ShaderAttributeValue;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.TexCoordGeneration;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseRotate;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseTranslate;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseZoom;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3f;
+
+public class DistortGlyphTestGL2ES2 extends javax.swing.JFrame
+{
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ // get a nice graphics config
+ private static GraphicsConfiguration getGraphicsConfig()
+ {
+ GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();
+ template.setSceneAntialiasing(GraphicsConfigTemplate3D.PREFERRED);
+ GraphicsConfiguration gcfg = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
+ .getBestConfiguration(template);
+ return gcfg;
+ }
+
+ private void setupLights(BranchGroup root)
+ {
+ // set up the BoundingSphere for all the lights
+ BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
+
+ // Set up the ambient light
+ AmbientLight lightAmbient = new AmbientLight(new Color3f(0.37f, 0.37f, 0.37f));
+ lightAmbient.setInfluencingBounds(bounds);
+ root.addChild(lightAmbient);
+
+ // Set up the directional light
+ Vector3f lightDirection1 = new Vector3f(0.0f, 0.0f, -1.0f);
+ DirectionalLight lightDirectional1 = new DirectionalLight(new Color3f(1.00f, 0.10f, 0.00f), lightDirection1);
+ lightDirectional1.setInfluencingBounds(bounds);
+ lightDirectional1.setCapability(Light.ALLOW_STATE_WRITE);
+ root.addChild(lightDirectional1);
+
+ Point3f lightPos1 = new Point3f(-4.0f, 8.0f, 16.0f);
+ Point3f lightAttenuation1 = new Point3f(1.0f, 0.0f, 0.0f);
+ PointLight pointLight1 = new PointLight(new Color3f(0.37f, 1.00f, 0.37f), lightPos1, lightAttenuation1);
+ pointLight1.setInfluencingBounds(bounds);
+ root.addChild(pointLight1);
+
+ Point3f lightPos2 = new Point3f(-16.0f, 8.0f, 4.0f);
+ Point3f lightAttenuation2 = new Point3f(1.0f, 0.0f, 0.0f);
+ PointLight pointLight2 = new PointLight(new Color3f(0.37f, 0.37f, 1.00f), lightPos2, lightAttenuation2);
+ pointLight2.setInfluencingBounds(bounds);
+ root.addChild(pointLight2);
+ }
+
+ public BranchGroup createSceneGraph()
+ {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ setupLights(objRoot);
+
+ TransformGroup objTransform = new TransformGroup();
+ objTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+
+ objRoot.addChild(objTransform);
+
+ // setup a nice textured appearance
+ Appearance app = makeShaderAppearance();
+ Color3f objColor = new Color3f(1.0f, 0.7f, 0.8f);
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ app.setMaterial(new Material(objColor, black, objColor, black, 80.0f));
+ Texture txtr = new TextureLoader(Resources.getResource("resources/images/gold.jpg"), this).getTexture();
+ app.setTexture(txtr);
+ // done in shader see makeShaderAppearance() below
+ //TexCoordGeneration tcg = new TexCoordGeneration(TexCoordGeneration.SPHERE_MAP, TexCoordGeneration.TEXTURE_COORDINATE_2);
+ //app.setTexCoordGeneration(tcg);
+
+ // use a customized FontExtrusion object to control the depth of the text
+ java.awt.geom.GeneralPath gp = new java.awt.geom.GeneralPath();
+ gp.moveTo(0, 0);
+ gp.lineTo(.01f, .01f);
+ gp.lineTo(.2f, .01f);
+ gp.lineTo(.21f, 0f);
+ FontExtrusion fontEx = new FontExtrusion(gp);
+
+ // our glyph
+ Font fnt = new Font("dialog", Font.BOLD, 1);
+ Font3D f3d = new Font3D(fnt, .001, fontEx);
+ GeometryArray geom = f3d.getGlyphGeometry('A');
+ Shape3D shape = new Shape3D(geom, app);
+ objTransform.addChild(shape);
+
+ // the DistortBehavior
+ DistortBehavior eb = new DistortBehavior(shape, 1000, 1000);
+ eb.setSchedulingBounds(new BoundingSphere());
+ objTransform.addChild(eb);
+
+ MouseRotate myMouseRotate = new MouseRotate();
+ myMouseRotate.setTransformGroup(objTransform);
+ myMouseRotate.setSchedulingBounds(new BoundingSphere());
+ objRoot.addChild(myMouseRotate);
+
+ MouseTranslate myMouseTranslate = new MouseTranslate();
+ myMouseTranslate.setTransformGroup(objTransform);
+ myMouseTranslate.setSchedulingBounds(new BoundingSphere());
+ objRoot.addChild(myMouseTranslate);
+
+ MouseZoom myMouseZoom = new MouseZoom();
+ myMouseZoom.setTransformGroup(objTransform);
+ myMouseZoom.setSchedulingBounds(new BoundingSphere());
+ objRoot.addChild(myMouseZoom);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse()
+ {
+
+ // Create a Canvas3D using a nice configuration
+ Canvas3D c = new Canvas3D(getGraphicsConfig());
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form DistortGlyphTest2
+ */
+ public DistortGlyphTestGL2ES2()
+ {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("DistortGlyphTest");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[])
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend", "jogl2es2");
+ System.setProperty("j3d.displaylist", "false");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run()
+ {
+ new DistortGlyphTestGL2ES2().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+ public static ShaderAppearance makeShaderAppearance()
+ {
+ ShaderAppearance app = new ShaderAppearance();
+ GLSLShaderProgram litTextureShaderProgram = new GLSLShaderProgram() {
+ @Override
+ public String toString()
+ {
+ return "SimpleShaderAppearance litTextureShaderProgram";
+ }
+ };
+ litTextureShaderProgram.setShaders(makeShaders(vertShader, fragShader));
+ litTextureShaderProgram.setShaderAttrNames(new String[] { "EnvMap" });
+
+ app.setShaderProgram(litTextureShaderProgram);
+
+ ShaderAttributeSet shaderAttributeSet = new ShaderAttributeSet();
+ shaderAttributeSet.put(new ShaderAttributeValue("EnvMap", new Integer(0)));
+ app.setShaderAttributeSet(shaderAttributeSet);
+ return app;
+ }
+
+ private static Shader[] makeShaders(String vertexProgram, String fragmentProgram)
+ {
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_VERTEX, vertexProgram) {
+ @Override
+ public String toString()
+ {
+ return "vertexProgram";
+ }
+ };
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_FRAGMENT, fragmentProgram) {
+ @Override
+ public String toString()
+ {
+ return "fragmentProgram";
+ }
+ };
+ return shaders;
+ }
+
+ public static String fragShader = "uniform sampler2D EnvMap;\n" + //
+ "varying vec2 texCoord0;\n" + //
+ "void main (void)\n" + //
+ "{\n" + //
+ " vec2 tc0 = texCoord0.xy;\n" + //
+ " vec3 color = vec3(texture2D(EnvMap, tc0));\n" + //
+ " gl_FragColor = vec4(color, 1.0);\n" + //
+ "}\n";
+
+ public static String vertShader = "attribute vec4 glVertex;\n" + //
+ "attribute vec3 glNormal; \n" + //
+ "uniform mat4 glModelViewProjectionMatrix;\n" + //
+ "uniform mat4 glModelViewMatrix;\n" + //
+ "uniform mat3 glNormalMatrix;\n" + //
+ "varying vec3 Normal;\n" + //
+ "varying vec2 texCoord0;\n" + //
+ "vec2 sphere_map(vec3 position, vec3 normal)\n" + //
+ "{\n" + //
+ " vec3 reflection = reflect(position, normal);\n" + //
+ " float m = 2.0 * sqrt(reflection.x * reflection.x + reflection.y * reflection.y + (reflection.z + 1.0) * (reflection.z + 1.0)); \n"
+ + //
+ " return vec2((reflection.x / m + 0.5), (reflection.y / m + 0.5));\n" + //
+ "}\n" + //
+ "void main()\n" + //
+ "{\n" + //
+ " Normal = normalize(vec3(glNormalMatrix * glNormal));\n" + //
+ " gl_Position = glModelViewProjectionMatrix * glVertex; \n" + //
+ " texCoord0 = sphere_map(normalize(vec3(glModelViewMatrix*glVertex)), Normal);\n" + //
+ "}\n"; //
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/dot3/Dot3Demo.java b/src/main/java/org/jdesktop/j3d/examples/dot3/Dot3Demo.java
new file mode 100644
index 0000000..8e5ec84
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/dot3/Dot3Demo.java
@@ -0,0 +1,548 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.dot3;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.GraphicsConfiguration;
+import java.awt.image.BufferedImage;
+import java.util.Enumeration;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.ImageComponent2D;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.TexCoordGeneration;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.Texture2D;
+import org.jogamp.java3d.TextureAttributes;
+import org.jogamp.java3d.TextureUnitState;
+import org.jogamp.java3d.WakeupOnElapsedFrames;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.geometry.GeometryInfo;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * This example program is contributed by Alessandro Borges
+ */
+
+/**
+ * <pre>
+ * DOT3 per-pixel lighting demo.
+ * It uses a Normal map and a Light map, both coded as independent textures.
+ * Each pixel color is a vector coded, where color range [0,255] is mapped
+ * as vector in range [-1.0,+1.0].
+ *
+ * A math operation called DOT3 applied to Light vector and Normal vector results
+ * a scalar value, interpreted as light intensity. This operation is made for each
+ * pixel on texture.
+ * Light Intensity = DOT3(light, normal);
+ *
+ * This technique allows complex lighting effects, as bumps, on low polygon count
+ * geometries.
+ * </pre>
+ *
+ */
+
+public class Dot3Demo extends JFrame {
+ // a external control panel for this demo
+ private TextureControlPanel ctrlPanel = null;
+ // default bounds used in this application
+ private BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
+ 100.0);
+ // TextureUnitStates used in this application
+ TextureUnitState tuLightMap;
+ TextureUnitState tuDOT3NormalMap;
+ TextureUnitState tuColor;
+
+ /** Where the TUs are applied **/
+ TextureUnitState[] tusArr;
+ /** appearance will be changed at runtime **/
+ Appearance appearance;
+ /** polygonAttributes will be changed at runtime **/
+ PolygonAttributes polygonAttributes;
+
+ // textures used
+ Texture textureColor;
+ Texture textureDOT3NormalMap;
+ Texture2D textureLightMap;
+ // needs for runtime updates on lightMap
+ ImageComponent2D imageLightMap;
+
+ // default texture names used
+ String textureColorName= "resources/images/wood.jpg";
+ String textureDOT3NormalMapName = "resources/images/Java3Ddot3.jpg";
+
+ /**
+ * Constructor.
+ */
+ public Dot3Demo() {
+ super("Java3D DOT3 demo");
+ try {
+ init();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void init() throws Exception {
+ this.setSize(new Dimension(400, 400));
+ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+ JPanel mainPanel = new JPanel();
+ this.getContentPane().add(mainPanel, null);
+ mainPanel.setLayout(new BorderLayout());
+ // get default configuration for 3D
+ GraphicsConfiguration conf = SimpleUniverse.getPreferredConfiguration();
+ Canvas3D canvas = new Canvas3D(conf);
+ // create simpleUniverse
+ SimpleUniverse su = new SimpleUniverse(canvas);
+ // create sceneGraph and add it to universe
+ BranchGroup sceneGraph = createSceneGraph();
+ su.addBranchGraph(sceneGraph);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ su.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ su.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ // add the behaviors to the ViewingPlatform
+ ViewingPlatform viewingPlatform = su.getViewingPlatform();
+ viewingPlatform.setNominalViewingTransform();
+
+ // add orbit behavior to ViewingPlatform
+ OrbitBehavior orbit = new OrbitBehavior(canvas, OrbitBehavior.REVERSE_ALL |
+ OrbitBehavior.STOP_ZOOM);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+
+ mainPanel.add(canvas, BorderLayout.CENTER);
+ this.setVisible(true);
+ //create a control panel to user interaction
+ ctrlPanel = new TextureControlPanel(this);
+ ctrlPanel.setVisible(true);
+ ctrlPanel.setLocation(410,10);
+ }
+
+ /**
+ * loads all needed textures, and creates light map texture
+ */
+ private void loadTextures() {
+ try {
+ //java.net.URL urlColor = new java.net.URL("file:" + textureColorName);
+ //java.net.URL urlDot3 = new java.net.URL("file:" + textureDOT3NormalMapName);
+ java.net.URL urlColor = Resources.getResource(textureColorName);
+ java.net.URL urlDot3 = Resources.getResource(textureDOT3NormalMapName);
+
+ // loading textures
+ textureColor = new TextureLoader(urlColor,this).getTexture();
+ textureDOT3NormalMap = new TextureLoader(urlDot3,this) .getTexture();
+
+ // create Image for textureLightMap
+ BufferedImage image = new BufferedImage(256,256,BufferedImage.TYPE_INT_RGB);
+ Graphics2D graphics = image.createGraphics();
+ graphics.setPaint(new Color(130,130,250));
+ graphics.fillRect(0,0,image.getWidth(),image.getHeight());
+ graphics.dispose();
+
+ imageLightMap = new ImageComponent2D(ImageComponent2D.FORMAT_RGB,image,false,false);
+ imageLightMap.setCapability(ImageComponent2D.ALLOW_IMAGE_WRITE);
+ imageLightMap.setCapability(ImageComponent2D.ALLOW_IMAGE_READ);
+
+ //create textureLightMap with above imageLightMap
+ textureLightMap = new Texture2D(Texture2D.BASE_LEVEL,Texture2D.RGB,256,256);
+ textureLightMap.setImage(0,imageLightMap);
+ textureLightMap.setMagFilter(Texture2D.NICEST);
+ textureLightMap.setMinFilter(Texture2D.NICEST);
+
+ // application with update textureLightMap at runtime, so lets enable some caps
+ textureLightMap.setCapability(Texture2D.ALLOW_ENABLE_WRITE);
+ textureLightMap.setCapability(Texture2D.ALLOW_ENABLE_READ);
+ textureLightMap.setCapability(Texture2D.ALLOW_IMAGE_WRITE);
+ textureLightMap.setCapability(Texture2D.ALLOW_IMAGE_READ);
+
+ } catch(Exception e) {
+ System.err.println("Failed to load textures");
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * setup TextureUnitStates used in this demo. *
+ * @return
+ */
+ private TextureUnitState[] setupTextureUnitState() {
+ //texture Attributes for DOT3 normal map
+ TextureAttributes textAttDot3 = new TextureAttributes();
+
+
+ // lightMap uses TextureAttributes with default REPLACE mode
+ TextureAttributes textAttLightMap = new TextureAttributes();
+
+ TextureAttributes texAttColor = new TextureAttributes();
+ texAttColor.setTextureMode(TextureAttributes.COMBINE);
+
+ //CombineRgbMode could be also COMBINE_ADD or COMBINE_ADD_SIGNED, with
+ //different results
+ texAttColor.setCombineRgbMode(TextureAttributes.COMBINE_MODULATE);
+ // increase light depth effect
+ texAttColor.setCombineRgbScale(2);
+
+ textAttDot3.setTextureMode(TextureAttributes.COMBINE);
+ textAttDot3.setCombineRgbMode(TextureAttributes.COMBINE_DOT3);
+ textAttDot3.setCombineAlphaMode(TextureAttributes.COMBINE_DOT3);
+ textAttDot3.setTextureBlendColor(1.f,1.0f,1.0f,0.0f);
+ // increase light intesity
+ textAttDot3.setCombineRgbScale(2);
+ // setup functions
+ textAttDot3.setCombineRgbFunction(0,TextureAttributes.COMBINE_SRC_COLOR);
+ textAttDot3.setCombineRgbFunction(1,TextureAttributes.COMBINE_SRC_COLOR);
+ textAttDot3.setCombineRgbFunction(2,TextureAttributes.COMBINE_SRC_COLOR);
+ //combine with previous TUS, lightMap
+ textAttDot3.setCombineRgbSource(0,TextureAttributes.COMBINE_PREVIOUS_TEXTURE_UNIT_STATE);
+ textAttDot3.setCombineRgbSource(1,TextureAttributes.COMBINE_TEXTURE_COLOR );
+ textAttDot3.setCombineRgbSource(2,TextureAttributes.COMBINE_OBJECT_COLOR);
+
+ TexCoordGeneration tcg1=null;
+ // SphereMap tcg can add nice dynamic effects for curved surfaces, because it
+ // distributes texture like a light bean over geometry.
+ // It os not used in this demo, but you can try yourself at home
+ // with *complex* lightmaps, i.e., spherical light distributions,
+ // multi light sorces, degradee, waves,etc
+ /*
+ tcg1 = new TexCoordGeneration(TexCoordGeneration.SPHERE_MAP,
+ TexCoordGeneration.TEXTURE_COORDINATE_3);
+ */
+
+ // create TUS
+ tuLightMap = new TextureUnitState(textureLightMap,textAttLightMap,tcg1);
+ tuDOT3NormalMap = new TextureUnitState(textureDOT3NormalMap,textAttDot3,null);
+ tuColor = new TextureUnitState(textureColor,texAttColor,null);
+
+ // this TUS array is used by geometry at runtime
+ TextureUnitState[] tus = new TextureUnitState[3];
+ tus[0] = tuLightMap;
+ tus[1] = tuDOT3NormalMap;
+ tus[2] = tuColor;
+ // enable texture units for read/write at runtime
+ for (int i = 0; i < tus.length; i++) {
+ tus[i].setCapability(TextureUnitState.ALLOW_STATE_WRITE);
+ tus[i].setCapability(TextureUnitState.ALLOW_STATE_READ);
+ }
+
+ return tus;
+ }
+
+ /**
+ * creates a single Quad geometry with 4 TextureCoordinateMaps, for multitexture use.<br>
+ * Dimension is scale*(2m , 1m)
+ * @param scale a scale for this quad
+ * @return quad geometry for multitexture use
+ */
+ private GeometryArray createGeometry(float scale) {
+ // vertex coordinates
+ float[] verts = { 2.0f, -1.0f, 0.0f,
+ 2.0f, 1.0f, 0.0f,
+ -2.0f, 1.0f, 0.0f,
+ -2.0f, -1.0f, 0.0f };
+ // 2D texture Coords - each texture unit will use one set of this
+ float[] texCoords = { 1.0f, 0.0f,
+ 1.0f, 1.0f,
+ 0.0f, 1.0f,
+ 0.0f, 0.0f};
+ // all texture units will use texCoords from unit 0
+ int[] texCoordSetMap = {0,0,0,0};
+ // normals
+ Vector3f normal = new Vector3f( 0.0f, 0.0f, 1.0f);
+ Vector3f[] normals = { normal, normal, normal, normal} ;
+ // resize quad dimension
+ for(int i = 0;i<verts.length;i++) {
+ verts[i] *= scale;
+ }
+ // create geometry using GeometryInfo
+ GeometryInfo gi = new GeometryInfo(GeometryInfo.QUAD_ARRAY);
+
+ gi.setCoordinates(verts);
+ gi.setNormals(normals);
+ // preparing for multitexture
+ // To get up to 4 TUS, it needs 4 sets of 2D texture
+ gi.setTextureCoordinateParams(4, 2);
+ gi.setTexCoordSetMap(texCoordSetMap);
+
+ // this demo needs just 3 TUS, but geometry
+ // is prepared for up to 4 TUS stages
+ gi.setTextureCoordinates(0,texCoords);
+ gi.setTextureCoordinates(1,texCoords);
+ gi.setTextureCoordinates(2,texCoords);
+ gi.setTextureCoordinates(3,texCoords);
+
+ return gi.getGeometryArray();
+ }
+
+ /**
+ * Creates scenegraphs
+ * @return a BranchGroup with all needed objects in scene
+ */
+ private BranchGroup createSceneGraph() {
+ BranchGroup bgRoot = new BranchGroup();
+ CheckNewLightMapBehavior checkNewLightMapBehavior = new CheckNewLightMapBehavior();
+
+ bgRoot.addChild(checkNewLightMapBehavior);
+
+ // a blue background
+ Background background = new Background(0.4f,0.4f,0.8f);
+ background.setApplicationBounds(bounds);
+ bgRoot.addChild(background);
+
+ AmbientLight alit = new AmbientLight(true,new Color3f(0.4f,0.4f,0.4f));
+ bgRoot.addChild(alit);
+
+ // Set up some directional lights
+ // DOT3 doesnot need light, because it is a perpixel lighting technique
+ //but we add this lights to show
+ // geometry when using non-DOT3 lighting, as color texture only and
+ // light map texture mode
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);
+ Color3f light2Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
+
+ DirectionalLight light1
+ = new DirectionalLight(light1Color, light1Direction);
+ light1.setInfluencingBounds(bounds);
+ bgRoot.addChild(light1);
+
+ DirectionalLight light2
+ = new DirectionalLight(light2Color, light2Direction);
+ light2.setInfluencingBounds(bounds);
+ bgRoot.addChild(light2);
+
+ //loading color and DOT3 normal map textures from disk,
+ //and creating light map at runtime
+ loadTextures();
+ //our single Quad geometry, enabled for multitexture
+ GeometryArray geo = createGeometry(0.4f);
+ // a appearance for our geometry
+ appearance = new Appearance();
+ // polygon and texture unit will be updated at runtime
+ // so we must enabled read/write operations for then
+ appearance.setCapability(Appearance.ALLOW_POLYGON_ATTRIBUTES_READ);
+ appearance.setCapability(Appearance.ALLOW_POLYGON_ATTRIBUTES_WRITE);
+ appearance.setCapability(Appearance.ALLOW_TEXTURE_UNIT_STATE_READ);
+ appearance.setCapability(Appearance.ALLOW_TEXTURE_UNIT_STATE_WRITE);
+
+ //use a default material. It is necessary when running
+ //on non per-pixel lighting mod, i.e., using non DOT3 textures
+ appearance.setMaterial(new Material());
+
+ polygonAttributes = new PolygonAttributes();
+ polygonAttributes.setCapability(PolygonAttributes.ALLOW_MODE_WRITE);
+ polygonAttributes.setCullFace(PolygonAttributes.CULL_NONE);
+
+ appearance.setPolygonAttributes(polygonAttributes);
+
+ // uses a TUS dot3 enabled
+ tusArr = setupTextureUnitState();
+ appearance.setTextureUnitState(tusArr);
+
+ // joining geometry and appearance in a shape3D
+ Shape3D shape3D = new Shape3D(geo,appearance);
+ shape3D.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
+ shape3D.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
+
+ bgRoot.addChild(shape3D);
+
+ bgRoot.compile();
+
+ return bgRoot;
+ }
+
+ /**
+ * Toggles wireframe mode
+ * @param mode true for wireframe, false for fill polygon
+ */
+ public void setWireframeMode(boolean mode) {
+ if(mode)
+ polygonAttributes.setPolygonMode(PolygonAttributes.POLYGON_LINE);
+ else
+ polygonAttributes.setPolygonMode(PolygonAttributes.POLYGON_FILL);
+ }
+
+
+ /**
+ * This method togles on/off textures and updates TextureUnitState in correct Order.
+ * Some video drivers does not accept TextureUnitState arrays with null values among
+ * non-null values
+ * @param showLightMap togles LightMap texture
+ * @param showDot3 togles DOT3 Normal texture
+ * @param showColor togles Color texture
+ */
+ public void showTextures(boolean showLightMap, boolean showDot3, boolean showColor) {
+ int bitSet = 0;
+ bitSet |= showLightMap ? 4 : 0;
+ bitSet |= showDot3 ? 2 : 0;
+ bitSet |= showColor ? 1 : 0;
+
+ tusArr[0] = null;
+ tusArr[1] = null;
+ tusArr[2] = null;
+
+ switch (bitSet) {
+ case 7: { //all bit == all tus
+ tusArr[0] = tuLightMap;
+ tusArr[1] = tuDOT3NormalMap;
+ tusArr[2] = tuColor;
+ }
+ break;
+ case 6: { //no Color
+ tusArr[0] = tuLightMap;
+ tusArr[1] = tuDOT3NormalMap;
+ }
+ break;
+ case 5: { //no Dot3
+ tusArr[0] = tuLightMap;
+ tusArr[1] = tuColor;
+ }
+ break;
+ case 4: { //lightMap only
+ tusArr[0] = tuLightMap;
+ }
+ break;
+ case 3: { //no LightMap
+ tusArr[0] = tuDOT3NormalMap;
+ tusArr[1] = tuColor;
+ }
+ break;
+ case 2: { //Dot3 Only
+ tusArr[0] = tuDOT3NormalMap;
+ }
+ break;
+ case 1: { // Color Only
+ tusArr[0] = tuColor;
+ }
+ break;
+ default: { // case 0, no textures shows at all
+ }
+ break;
+ }
+ appearance.setTextureUnitState(tusArr);
+ }
+
+ /**
+ * updates LightMap texture.
+ * This method is called from checkNewLightMapBehavior
+ * @param image new image to be applied
+ */
+ public void updateLighMap(BufferedImage image) {
+ imageLightMap.setSubImage(image,image.getWidth(),image.getHeight(),0,0,0,0);
+ }
+
+ private BufferedImage tempImage;
+ private boolean lockTempImage = false;
+
+
+ /**
+ * main method
+ * @param args
+ */
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ javax.swing.SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ new Dot3Demo();
+ }
+ });
+
+ }
+
+ /**
+ * A internal class to check if there is a new Light Map to be applied
+ */
+ class CheckNewLightMapBehavior extends Behavior {
+ WakeupOnElapsedFrames wakeup = new WakeupOnElapsedFrames(0);
+
+ public CheckNewLightMapBehavior() {// auto enable and set schedulling bounds
+ setEnable(true);
+ setSchedulingBounds(bounds);
+ }
+
+ public void initialize() {
+ wakeupOn(wakeup);
+ }
+
+ public void processStimulus(Enumeration e) {
+ // check if there are a new light map ready to use
+ if (ctrlPanel.hasTextureImageReady()) {
+ updateLighMap(ctrlPanel.getTextureImage());
+ }
+ //wake up on next frame
+ wakeupOn(wakeup);
+ }
+ }
+
+}
+
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/dot3/MyCanvas.java b/src/main/java/org/jdesktop/j3d/examples/dot3/MyCanvas.java
new file mode 100644
index 0000000..f5f4cfc
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/dot3/MyCanvas.java
@@ -0,0 +1,247 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.dot3;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Point;
+import java.awt.event.MouseEvent;
+import java.awt.image.BufferedImage;
+
+import javax.swing.JPanel;
+import javax.swing.event.MouseInputListener;
+
+/**
+ * A mouse interactive canvas for lightMap image
+ */
+public class MyCanvas extends JPanel implements MouseInputListener {
+ BufferedImage lightMask = null;
+ BufferedImage textureImage = null;
+ Graphics2D gr = null;
+ Point location = new Point();
+ // default color light map
+ Color bgColor = new Color(147, 147, 147);
+
+ int x = 0;
+ int y = 0;
+ int z = 142;
+ // texture image size
+ private static final int textureSize = 256;
+ boolean mouseOut = true;
+ //flag about image is ready or not for use
+ boolean imageReady = false;
+ // allows mask be dragged with mouse
+ boolean dragMask = false;
+ boolean updateLightDir = false;
+ boolean updateMaskPosition = false;
+
+ /**
+ * Creates a MyCanvas object with a image lightMask.
+ * Also creates a default ImageLight map
+ * @param mask light lightMask used
+ */
+ public MyCanvas(BufferedImage mask) {
+ super();
+ this.lightMask = mask;
+ // create a light map
+ setTextureImage(new BufferedImage(textureSize, textureSize,
+ BufferedImage.TYPE_INT_RGB));
+ // Graphics used to update lightmap
+ gr = getTextureImage().createGraphics();
+
+ Dimension dimSize = new Dimension(textureSize, textureSize);
+ // lock size
+ this.setSize(dimSize);
+ this.setMaximumSize(dimSize);
+ this.setMinimumSize(dimSize);
+
+ this.setDoubleBuffered(true);
+ this.setOpaque(true);
+ this.addMouseMotionListener(this);
+ this.addMouseListener(this);
+ }
+
+ /**
+ * Handles mouse click event.
+ * Get mouse coords call repaint for proper imageLight update
+ * @param ev mouse event
+ */
+ public void mouseClicked(MouseEvent ev) {
+ x = ev.getX();
+ y = this.getHeight() - ev.getY();
+ updateLightDir = true;
+ repaint();
+ }
+
+ public void mousePressed(MouseEvent e) {
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ }
+
+ /**
+ * Handles mouse drag event.
+ * get current mouse position and calls repaint for proper imageLight update
+ * @param ev
+ */
+ public void mouseDragged(MouseEvent ev) {
+ if (!mouseOut) {
+ x = ev.getX();
+ y = this.getHeight() - ev.getY();
+
+ //changes lightDir
+ if ((ev.getModifiers()& MouseEvent.BUTTON1_MASK) ==
+ MouseEvent.BUTTON1_MASK) {
+ updateLightDir = true;
+ updateMaskPosition = false;
+ }
+ //updates light mask position
+ if ((ev.getModifiers() & ev.BUTTON2_MASK) == ev.BUTTON2_MASK ||
+ (ev.getModifiers() & ev.BUTTON3_MASK) == ev.BUTTON3_MASK) {
+ updateLightDir = false;
+ updateMaskPosition = true;
+ }
+ repaint();
+ }
+ }
+
+ public void mouseMoved(MouseEvent ev) {
+ // disable updates on lightMap
+ updateLightDir = false;
+ updateMaskPosition = false;
+ }
+
+ public void mouseEntered(MouseEvent e) {
+ mouseOut = false;
+ }
+
+ public void mouseExited(MouseEvent e) {
+ mouseOut = true;
+ }
+
+ /**
+ * updates imageLight using current setings
+ * @param g
+ */
+ public void paintComponent(Graphics g) {
+ imageReady = false;
+ Graphics2D g2d = (Graphics2D)g;
+
+ // ligthDir has changed, we must update bgColor li
+ if(updateLightDir) {
+ int blue = bgColor.getBlue();
+ //clamp values to 255
+ y = y>255?255:y;
+ x = x>255?255:x;
+ bgColor = new Color(y,x,blue);
+ }
+ // paint lightMap
+ gr.setColor(bgColor);
+ gr.fillRect(0, 0, textureSize, textureSize);
+
+ // draw mask on mouse position
+ if (dragMask || updateMaskPosition) {
+ int maskWH = lightMask.getWidth()/2;
+ int mx = x - maskWH ;
+ int my = textureSize - y - maskWH ; // y value is inverted
+ // clamp mouse position, to avoid drawing outside imageLigh bounds
+ mx = mx > textureSize ? textureSize : mx;
+ my = my > textureSize ? textureSize : my;
+ // draw light mask
+ gr.drawImage(lightMask, mx, my, this);
+ }
+
+ g2d.drawImage(getTextureImage(), 0, 0, this);
+ imageReady = true;
+ }
+
+ /**
+ *
+ * @return true if exists a new texture image available
+ */
+ public boolean hasTextureImageReady() {
+ return imageReady;
+ }
+
+ /**
+ * Returns a texture image.<br>
+ * You can avoid calling the same image several times
+ * by checking hasTextureImageReady() first.
+ * @return latest texture image available
+ */
+ public BufferedImage getTextureImage() {
+ // sign as texture used for next call;
+ imageReady = false;
+ //return image
+ return textureImage;
+ }
+
+
+ public Image getMask() {
+ return lightMask;
+ }
+
+ public void setLightMask(BufferedImage mask) {
+ this.lightMask = mask;
+ }
+
+ public Color getBgColor() {
+ return bgColor;
+ }
+
+ public void setBgColor(Color bgColor) {
+ this.bgColor = bgColor;
+ }
+
+ public void setTextureImage(BufferedImage textureImage) {
+ this.textureImage = textureImage;
+ }
+
+
+}
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/dot3/TextureControlPanel.java b/src/main/java/org/jdesktop/j3d/examples/dot3/TextureControlPanel.java
new file mode 100644
index 0000000..0aef5f0
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/dot3/TextureControlPanel.java
@@ -0,0 +1,232 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.dot3;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.image.BufferedImage;
+import java.net.URL;
+
+import javax.imageio.ImageIO;
+import javax.swing.JCheckBox;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JSlider;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.jdesktop.j3d.examples.Resources;
+
+/**
+ * A control panel for Dot3Demo.
+ * It enables user change LightMap, enables/disables textures units states
+ * and toggles geometry wireframes on/off
+ */
+public class TextureControlPanel extends JDialog implements ChangeListener,
+ ActionListener {
+ /** renderer for lightMap, with support for mouse interaction **/
+ private MyCanvas canvas = null;
+ /** file name for light mask */
+ private String maskFileName = "resources/images/mask.png";
+ /** a slider to change Z light direction, i.e, blue channel */
+ private JSlider sliderZ = new JSlider(JSlider.HORIZONTAL, 1, 255, 142);
+ /** target demo instance to be controled **/
+ private Dot3Demo dot3DemoFrame;
+
+ // some checkboxes for user interaction
+ private JCheckBox cbWireframe = new JCheckBox("Show as Wireframe", false);
+ private JCheckBox cbDot3 = new JCheckBox("Show Dot3 texture", true);
+ private JCheckBox cbShowLightMap = new JCheckBox("Show LightMap texture", true);
+ private JCheckBox cbShowColor = new JCheckBox("Show Color texture", true);
+ private JCheckBox cbDragLightMask = new JCheckBox("Drag light mask");
+
+ private JLabel lbSliderZ = new JLabel();
+ private JLabel lbMessage = new JLabel();
+
+ public TextureControlPanel(Dot3Demo owner) {
+ super(owner);
+ dot3DemoFrame = owner;
+ try {
+ URL url = Resources.getResource(maskFileName);
+ BufferedImage mask = ImageIO.read(url);
+ canvas = new MyCanvas(mask);
+ init();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public TextureControlPanel() {
+ this(null);
+ }
+
+ /**
+ * Creates Graphical User Interface
+ * @throws Exception
+ */
+ private void init() throws Exception {
+ Dimension dim = new Dimension(540, 350);
+ this.setSize(dim);
+ this.setPreferredSize(dim);
+ this.setTitle("DOT3Demo Texture Control Panel");
+ this.setLayout(new BorderLayout());
+
+ JPanel panel = new JPanel();
+ this.getContentPane().add(panel, BorderLayout.CENTER);
+ canvas.setSize(new Dimension(256, 256));
+ canvas.setBounds(new Rectangle(40, 40, 256, 256));
+
+ sliderZ.setBounds(new Rectangle(310, 190, 205, 45));
+ sliderZ.setPaintTicks(true);
+ sliderZ.setMajorTickSpacing(63);
+
+ cbWireframe.setBounds(new Rectangle(310, 50, 200, 20));
+ cbWireframe.setToolTipText("Toggles Wireframe");
+ cbDot3.setBounds(new Rectangle(310, 70, 150, 20));
+ cbShowLightMap.setBounds(new Rectangle(310, 90, 200, 20));
+ cbShowLightMap.setToolTipText("Toggles DOT3 texture");
+ cbShowColor.setBounds(new Rectangle(310, 110, 200, 20));
+ cbShowColor.setToolTipText("Toggles Color texture");
+
+ panel.setLayout(null);
+
+ cbDragLightMask.setBounds(new Rectangle(310, 135, 200, 20));
+ lbMessage.setText("<html>Left-click and drag to change Light Direction." +
+ " Right-click and drag to move spotlight.</html>");
+ lbMessage.setBounds(new Rectangle(305, 245, 210, 60));
+
+ lbSliderZ.setText("Blue Light (Dot3 Z axis)");
+ lbSliderZ.setBounds(new Rectangle(310, 170, 210, 15));
+ lbSliderZ.setToolTipText("changes light intensity from Z axis");
+
+ panel.add(cbDragLightMask, null);
+ panel.add(lbMessage, null);
+ panel.add(lbSliderZ, null);
+ panel.add(sliderZ, null);
+ panel.add(canvas, null);
+ panel.add(cbShowColor, null);
+ panel.add(cbShowLightMap, null);
+ panel.add(cbWireframe, null);
+ panel.add(cbDot3, null);
+
+ sliderZ.addChangeListener(this);
+
+ cbDot3.addActionListener(this);
+ cbShowColor.addActionListener(this);
+ cbShowLightMap.addActionListener(this);
+ cbWireframe.addActionListener(this);
+ cbDragLightMask.addActionListener(this);
+ }
+
+ public void stateChanged(ChangeEvent ev) {
+ JComponent source = (JComponent)ev.getSource();
+ if (sliderZ.equals(source)) {
+ int xVal = canvas.getBgColor().getRed();
+ int yVal = canvas.getBgColor().getGreen();
+ int zVal = sliderZ.getValue();
+ Color ligtDir = new Color(xVal, yVal, zVal);
+ updateLightMap(ligtDir) ;
+ }
+ }
+
+ private void updateLightMap(Color ligtDir) {
+ canvas.setBgColor(ligtDir);
+ canvas.repaint();
+ dot3DemoFrame.updateLighMap(canvas.getTextureImage());
+ }
+
+
+ public void actionPerformed(ActionEvent ev) {
+ JComponent source = (JComponent)ev.getSource();
+ if (cbWireframe.equals(source)) {
+ dot3DemoFrame.setWireframeMode(cbWireframe.isSelected());
+ } else
+ if (cbDot3.equals(source)
+ || cbShowColor.equals(source)
+ || cbShowLightMap.equals(source)) {
+ dot3DemoFrame.showTextures(cbShowLightMap.isSelected(),
+ cbDot3.isSelected(),
+ cbShowColor.isSelected());
+ } else if (cbDragLightMask.equals(source)) {
+ canvas.dragMask = cbDragLightMask.isSelected();
+ }
+
+ }
+
+ /**
+ * Wrapper method call for MyCanvas. hasTextureImageReady()
+ * @return true if exists a new texture image available
+ */
+ public boolean hasTextureImageReady() {
+ return canvas.hasTextureImageReady();
+ }
+
+ /**
+ * Wrapper method call for MyCanvas.getTextureImage()
+ * Returns a texture image.<br>
+ * Avoid calling the same image several times
+ * by cheking hasTextureImageReady() first.
+ * @return latest texture image available
+ */
+ public BufferedImage getTextureImage() {
+ return canvas.getTextureImage();
+ }
+
+ /**
+ * Wrapper method to MyCanvas.setLightMask(mask)
+ * @param mask a new light mask
+ */
+ public void setLightMask(BufferedImage mask) {
+ canvas.setLightMask(mask);
+ }
+}
+
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/four_by_four/BigCube.java b/src/main/java/org/jdesktop/j3d/examples/four_by_four/BigCube.java
new file mode 100644
index 0000000..3609c97
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/four_by_four/BigCube.java
@@ -0,0 +1,139 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.four_by_four;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.QuadArray;
+import org.jogamp.java3d.Shape3D;
+
+/**
+ * Class BigCube
+ *
+ * Description: Creates the "big" cube used to mark the computer's
+ * position.
+ *
+ * Version: 1.0
+ */
+public class BigCube extends Object {
+
+ private Shape3D shape3D;
+
+ private static final float[] verts = {
+ // Front Face
+ 5.0f, -5.0f, 5.0f, 5.0f, 5.0f, 5.0f,
+ -5.0f, 5.0f, 5.0f, -5.0f, -5.0f, 5.0f,
+ // Back Face
+ -5.0f, -5.0f, -5.0f, -5.0f, 5.0f, -5.0f,
+ 5.0f, 5.0f, -5.0f, 5.0f, -5.0f, -5.0f,
+ // Right Face
+ 5.0f, -5.0f, -5.0f, 5.0f, 5.0f, -5.0f,
+ 5.0f, 5.0f, 5.0f, 5.0f, -5.0f, 5.0f,
+ // Left Face
+ -5.0f, -5.0f, 5.0f, -5.0f, 5.0f, 5.0f,
+ -5.0f, 5.0f, -5.0f, -5.0f, -5.0f, -5.0f,
+ // Top Face
+ 5.0f, 5.0f, 5.0f, 5.0f, 5.0f, -5.0f,
+ -5.0f, 5.0f, -5.0f, -5.0f, 5.0f, 5.0f,
+ // Bottom Face
+ -5.0f, -5.0f, 5.0f, -5.0f, -5.0f, -5.0f,
+ 5.0f, -5.0f, -5.0f, 5.0f, -5.0f, 5.0f,
+ };
+
+ private static final float[] normals = {
+ // Front Face
+ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
+ // Back Face
+ 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f,
+ 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f,
+ // Right Face
+ 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
+ // Left Face
+ -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
+ -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
+ // Top Face
+ 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
+ // Bottom Face
+ 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f,
+ 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f,
+ };
+
+ public BigCube(Appearance appearance) {
+
+ QuadArray quadArray = new QuadArray(24, QuadArray.COORDINATES |
+ QuadArray.NORMALS );
+ quadArray.setCoordinates(0, verts);
+ quadArray.setNormals(0, normals);
+
+ shape3D = new Shape3D(quadArray, appearance);
+ shape3D.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
+ shape3D.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
+ shape3D.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
+ shape3D.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
+ }
+
+ public BigCube(Appearance appearance, float size) {
+
+ QuadArray quadArray = new QuadArray(24, QuadArray.COORDINATES |
+ QuadArray.NORMALS );
+
+ for (int i=0; i<72; i++) verts[i] *= size;
+
+ quadArray.setCoordinates(0, verts);
+ quadArray.setNormals(0, normals);
+
+ shape3D = new Shape3D(quadArray, appearance);
+ shape3D.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
+ shape3D.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
+ shape3D.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
+ shape3D.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
+ }
+
+ public Shape3D getChild() {
+ return shape3D;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/four_by_four/Board.java b/src/main/java/org/jdesktop/j3d/examples/four_by_four/Board.java
new file mode 100644
index 0000000..3ed2f89
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/four_by_four/Board.java
@@ -0,0 +1,2313 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.four_by_four;
+
+import java.awt.Color;
+import java.awt.Graphics;
+
+/**
+ * Class: Board
+ *
+ * Description: Handles all logic with respect to play. Also renders
+ * the 2D window.
+ *
+ * Version: 1.1
+ *
+ */
+class Board {
+
+ final static int UNOCCUPIED = 0;
+ final static int HUMAN = 1;
+ final static int MACHINE = 2;
+ final static int END = 3;
+
+ private int[] moves;
+ private int[] occupied;
+ private int[][] combinations;
+ private int[][] outside_four;
+ private int[][] inside_four;
+ private int[][] faces;
+ private int[][] pos_to_comb;
+ private int[][] best_picks;
+ private int num_points;
+ private int num_balls;
+ private int num_polygons;
+ private int num_pt_indexes;
+ private int num_normal_indexes;
+ private int pt_start;
+ private int color_index;
+ private int width;
+ private int height;
+ private int center_x;
+ private int center_y;
+ private int player;
+ private int skill_level;
+ private int outside_four_index;
+ private int inside_four_index;
+ private int face_index;
+ private int nmoves;
+ private int current_face;
+ private int min = 1000;
+ private int max = 0;
+ private long[] sort_array;
+ private long time;
+ private long beg_time;
+ private long end_time;
+ private Color[] color_ramp;
+ private Color background;
+ private Color label_color;
+ private Color red;
+ private Color blue;
+ private Color white;
+ private Color gray;
+ private Color yellow;
+ private double max_dist;
+ private FourByFour panel;
+ private boolean debug;
+ private boolean outside_four_flag;
+ private boolean inside_four_flag;
+ private boolean face_flag;
+ private boolean label_flag;
+ private boolean block_chair_flag;
+ private boolean undoFlag;
+ private boolean[] highlight;
+ private int block_chair_next_move;
+ private int block_chair_face;
+ private Positions positions;
+ private Canvas2D canvas;
+
+ Board (FourByFour panel, Positions positions, int width, int height) {
+
+ // Set the debug state.
+ debug = false;
+
+ // Store arguments
+ this.width = width;
+ this.height = height;
+ this.panel = panel;
+ this.positions = positions;
+
+ // Initialize flags
+ label_flag = false;
+ outside_four_flag = false;
+ inside_four_flag = false;
+ block_chair_flag = false;
+ undoFlag = false;
+
+ // Total number of board positions.
+ num_points = 64;
+
+ // Allocate the logic arrays.
+ moves = new int[64];
+ occupied = new int[64];
+ combinations = new int[76][7];
+ outside_four = new int[18][6];
+ inside_four = new int[18][6];
+ faces = new int[18][18];
+ pos_to_comb = new int[64][8];
+ best_picks = new int[64][8];
+ highlight = new boolean[18];
+
+ // Initialize the logic arrays.
+ init_combinations();
+ init_faces();
+ init_outside_four();
+ init_inside_four();
+
+ // Set the player with the first move.
+ player = HUMAN;
+
+ // Set the default skill level.
+ skill_level = 4;
+
+ // Initialize the number of moves.
+ nmoves = 0;
+
+ // Define colors
+ background = new Color(13, 13, 51);
+ red = new Color(230, 26, 51);
+ blue = new Color(51, 51, 230);
+ white = new Color(255, 255, 255);
+ gray = new Color(240, 240, 240);
+ yellow = new Color(240, 240, 0);
+
+ // Record the start time
+ beg_time = System.currentTimeMillis();
+ }
+
+ public void setCanvas(Canvas2D canvas) {
+ this.canvas = canvas;
+ }
+
+ public void init_combinations () {
+
+ // The combination array contains all possible winning combinations.
+ //
+ // Each combination has the following format:
+ //
+ // combinations[x][0] = status: 0 = no player has selected positons in this row
+ // -1 = both players have men in this row
+ // 1 to 4 = number of positions occupied by player
+ //
+ // combinations[x][1] = player who owns this row (valid only if status = 1-4)
+ // combinations[x][2] = postion that define the row
+ // combinations[x][3] = postion that define the row
+ // combinations[x][4] = postion that define the row
+ // combinations[x][5] = postion that define the row
+
+ // Horizontal, Z
+
+ combinations[ 0][0] = 0; combinations[ 1][0] = 0; combinations[ 2][0] = 0; combinations[ 3][0] = 0;
+ combinations[ 0][1] = 0; combinations[ 1][1] = 0; combinations[ 2][1] = 0; combinations[ 3][1] = 0;
+ combinations[ 0][2] = 0; combinations[ 1][2] = 4; combinations[ 2][2] = 8; combinations[ 3][2] = 12;
+ combinations[ 0][3] = 1; combinations[ 1][3] = 5; combinations[ 2][3] = 9; combinations[ 3][3] = 13;
+ combinations[ 0][4] = 2; combinations[ 1][4] = 6; combinations[ 2][4] = 10; combinations[ 3][4] = 14;
+ combinations[ 0][5] = 3; combinations[ 1][5] = 7; combinations[ 2][5] = 11; combinations[ 3][5] = 15;
+
+ combinations[ 4][0] = 0; combinations[ 5][0] = 0; combinations[ 6][0] = 0; combinations[ 7][0] = 0;
+ combinations[ 4][1] = 0; combinations[ 5][1] = 0; combinations[ 6][1] = 0; combinations[ 7][1] = 0;
+ combinations[ 4][2] = 16; combinations[ 5][2] = 20; combinations[ 6][2] = 24; combinations[ 7][2] = 28;
+ combinations[ 4][3] = 17; combinations[ 5][3] = 21; combinations[ 6][3] = 25; combinations[ 7][3] = 29;
+ combinations[ 4][4] = 18; combinations[ 5][4] = 22; combinations[ 6][4] = 26; combinations[ 7][4] = 30;
+ combinations[ 4][5] = 19; combinations[ 5][5] = 23; combinations[ 6][5] = 27; combinations[ 7][5] = 31;
+
+ combinations[ 8][0] = 0; combinations[ 9][0] = 0; combinations[10][0] = 0; combinations[11][0] = 0;
+ combinations[ 8][1] = 0; combinations[ 9][1] = 0; combinations[10][1] = 0; combinations[11][1] = 0;
+ combinations[ 8][2] = 32; combinations[ 9][2] = 36; combinations[10][2] = 40; combinations[11][2] = 44;
+ combinations[ 8][3] = 33; combinations[ 9][3] = 37; combinations[10][3] = 41; combinations[11][3] = 45;
+ combinations[ 8][4] = 34; combinations[ 9][4] = 38; combinations[10][4] = 42; combinations[11][4] = 46;
+ combinations[ 8][5] = 35; combinations[ 9][5] = 39; combinations[10][5] = 43; combinations[11][5] = 47;
+
+ combinations[12][0] = 0; combinations[13][0] = 0; combinations[14][0] = 0; combinations[15][0] = 0;
+ combinations[12][1] = 0; combinations[13][1] = 0; combinations[14][1] = 0; combinations[15][1] = 0;
+ combinations[12][2] = 48; combinations[13][2] = 52; combinations[14][2] = 56; combinations[15][2] = 60;
+ combinations[12][3] = 49; combinations[13][3] = 53; combinations[14][3] = 57; combinations[15][3] = 61;
+ combinations[12][4] = 50; combinations[13][4] = 54; combinations[14][4] = 58; combinations[15][4] = 62;
+ combinations[12][5] = 51; combinations[13][5] = 55; combinations[14][5] = 59; combinations[15][5] = 63;
+
+ // Vertical, Z
+
+ combinations[16][0] = 0; combinations[17][0] = 0; combinations[18][0] = 0; combinations[19][0] = 0;
+ combinations[16][1] = 0; combinations[17][1] = 0; combinations[18][1] = 0; combinations[19][1] = 0;
+ combinations[16][2] = 0; combinations[17][2] = 1; combinations[18][2] = 2; combinations[19][2] = 3;
+ combinations[16][3] = 4; combinations[17][3] = 5; combinations[18][3] = 6; combinations[19][3] = 7;
+ combinations[16][4] = 8; combinations[17][4] = 9; combinations[18][4] = 10; combinations[19][4] = 11;
+ combinations[16][5] = 12; combinations[17][5] = 13; combinations[18][5] = 14; combinations[19][5] = 15;
+
+ combinations[20][0] = 0; combinations[21][0] = 0; combinations[22][0] = 0; combinations[23][0] = 0;
+ combinations[20][1] = 0; combinations[21][1] = 0; combinations[22][1] = 0; combinations[23][1] = 0;
+ combinations[20][2] = 16; combinations[21][2] = 17; combinations[22][2] = 18; combinations[23][2] = 19;
+ combinations[20][3] = 20; combinations[21][3] = 21; combinations[22][3] = 22; combinations[23][3] = 23;
+ combinations[20][4] = 24; combinations[21][4] = 25; combinations[22][4] = 26; combinations[23][4] = 27;
+ combinations[20][5] = 28; combinations[21][5] = 29; combinations[22][5] = 30; combinations[23][5] = 31;
+
+ combinations[24][0] = 0; combinations[25][0] = 0; combinations[26][0] = 0; combinations[27][0] = 0;
+ combinations[24][1] = 0; combinations[25][1] = 0; combinations[26][1] = 0; combinations[27][1] = 0;
+ combinations[24][2] = 32; combinations[25][2] = 33; combinations[26][2] = 34; combinations[27][2] = 35;
+ combinations[24][3] = 36; combinations[25][3] = 37; combinations[26][3] = 38; combinations[27][3] = 39;
+ combinations[24][4] = 40; combinations[25][4] = 41; combinations[26][4] = 42; combinations[27][4] = 43;
+ combinations[24][5] = 44; combinations[25][5] = 45; combinations[26][5] = 46; combinations[27][5] = 47;
+
+ combinations[28][0] = 0; combinations[29][0] = 0; combinations[30][0] = 0; combinations[31][0] = 0;
+ combinations[28][1] = 0; combinations[29][1] = 0; combinations[30][1] = 0; combinations[31][1] = 0;
+ combinations[28][2] = 48; combinations[29][2] = 49; combinations[30][2] = 50; combinations[31][2] = 51;
+ combinations[28][3] = 52; combinations[29][3] = 53; combinations[30][3] = 54; combinations[31][3] = 55;
+ combinations[28][4] = 56; combinations[29][4] = 57; combinations[30][4] = 58; combinations[31][4] = 59;
+ combinations[28][5] = 60; combinations[29][5] = 61; combinations[30][5] = 62; combinations[31][5] = 63;
+
+ // Diagonal, Z
+
+ combinations[32][0] = 0; combinations[33][0] = 0; combinations[34][0] = 0; combinations[35][0] = 0;
+ combinations[32][1] = 0; combinations[33][1] = 0; combinations[34][1] = 0; combinations[35][1] = 0;
+ combinations[32][2] = 0; combinations[33][2] = 16; combinations[34][2] = 32; combinations[35][2] = 48;
+ combinations[32][3] = 5; combinations[33][3] = 21; combinations[34][3] = 37; combinations[35][3] = 53;
+ combinations[32][4] = 10; combinations[33][4] = 26; combinations[34][4] = 42; combinations[35][4] = 58;
+ combinations[32][5] = 15; combinations[33][5] = 31; combinations[34][5] = 47; combinations[35][5] = 63;
+
+ combinations[36][0] = 0; combinations[37][0] = 0; combinations[38][0] = 0; combinations[39][0] = 0;
+ combinations[36][1] = 0; combinations[37][1] = 0; combinations[38][1] = 0; combinations[39][1] = 0;
+ combinations[36][2] = 3; combinations[37][2] = 19; combinations[38][2] = 35; combinations[39][2] = 51;
+ combinations[36][3] = 6; combinations[37][3] = 22; combinations[38][3] = 38; combinations[39][3] = 54;
+ combinations[36][4] = 9; combinations[37][4] = 25; combinations[38][4] = 41; combinations[39][4] = 57;
+ combinations[36][5] = 12; combinations[37][5] = 28; combinations[38][5] = 44; combinations[39][5] = 60;
+
+ // Horizontal, X
+
+ combinations[40][0] = 0; combinations[41][0] = 0; combinations[42][0] = 0; combinations[43][0] = 0;
+ combinations[40][1] = 0; combinations[41][1] = 0; combinations[42][1] = 0; combinations[43][1] = 0;
+ combinations[40][2] = 51; combinations[41][2] = 55; combinations[42][2] = 59; combinations[43][2] = 63;
+ combinations[40][3] = 35; combinations[41][3] = 39; combinations[42][3] = 43; combinations[43][3] = 47;
+ combinations[40][4] = 19; combinations[41][4] = 23; combinations[42][4] = 27; combinations[43][4] = 31;
+ combinations[40][5] = 3; combinations[41][5] = 7; combinations[42][5] = 11; combinations[43][5] = 15;
+
+ combinations[44][0] = 0; combinations[45][0] = 0; combinations[46][0] = 0; combinations[47][0] = 0;
+ combinations[44][1] = 0; combinations[45][1] = 0; combinations[46][1] = 0; combinations[47][1] = 0;
+ combinations[44][2] = 50; combinations[45][2] = 54; combinations[46][2] = 58; combinations[47][2] = 62;
+ combinations[44][3] = 34; combinations[45][3] = 38; combinations[46][3] = 42; combinations[47][3] = 46;
+ combinations[44][4] = 18; combinations[45][4] = 22; combinations[46][4] = 26; combinations[47][4] = 30;
+ combinations[44][5] = 2; combinations[45][5] = 6; combinations[46][5] = 10; combinations[47][5] = 14;
+
+ combinations[48][0] = 0; combinations[49][0] = 0; combinations[50][0] = 0; combinations[51][0] = 0;
+ combinations[48][1] = 0; combinations[49][1] = 0; combinations[50][1] = 0; combinations[51][1] = 0;
+ combinations[48][2] = 49; combinations[49][2] = 53; combinations[50][2] = 57; combinations[51][2] = 61;
+ combinations[48][3] = 33; combinations[49][3] = 37; combinations[50][3] = 41; combinations[51][3] = 45;
+ combinations[48][4] = 17; combinations[49][4] = 21; combinations[50][4] = 25; combinations[51][4] = 29;
+ combinations[48][5] = 1; combinations[49][5] = 5; combinations[50][5] = 9; combinations[51][5] = 13;
+
+ combinations[52][0] = 0; combinations[53][0] = 0; combinations[54][0] = 0; combinations[55][0] = 0;
+ combinations[52][1] = 0; combinations[53][1] = 0; combinations[54][1] = 0; combinations[55][1] = 0;
+ combinations[52][2] = 48; combinations[53][2] = 52; combinations[54][2] = 56; combinations[55][2] = 60;
+ combinations[52][3] = 32; combinations[53][3] = 36; combinations[54][3] = 40; combinations[55][3] = 44;
+ combinations[52][4] = 16; combinations[53][4] = 20; combinations[54][4] = 24; combinations[55][4] = 28;
+ combinations[52][5] = 0; combinations[53][5] = 4; combinations[54][5] = 8; combinations[55][5] = 12;
+
+ // Diagonal, X
+
+ combinations[56][0] = 0; combinations[57][0] = 0; combinations[58][0] = 0; combinations[59][0] = 0;
+ combinations[56][1] = 0; combinations[57][1] = 0; combinations[58][1] = 0; combinations[59][1] = 0;
+ combinations[56][2] = 51; combinations[57][2] = 50; combinations[58][2] = 49; combinations[59][2] = 48;
+ combinations[56][3] = 39; combinations[57][3] = 38; combinations[58][3] = 37; combinations[59][3] = 36;
+ combinations[56][4] = 27; combinations[57][4] = 26; combinations[58][4] = 25; combinations[59][4] = 24;
+ combinations[56][5] = 15; combinations[57][5] = 14; combinations[58][5] = 13; combinations[59][5] = 12;
+
+ combinations[60][0] = 0; combinations[61][0] = 0; combinations[62][0] = 0; combinations[63][0] = 0;
+ combinations[60][1] = 0; combinations[61][1] = 0; combinations[62][1] = 0; combinations[63][1] = 0;
+ combinations[60][2] = 3; combinations[61][2] = 2; combinations[62][2] = 1; combinations[63][2] = 0;
+ combinations[60][3] = 23; combinations[61][3] = 22; combinations[62][3] = 21; combinations[63][3] = 20;
+ combinations[60][4] = 43; combinations[61][4] = 42; combinations[62][4] = 41; combinations[63][4] = 40;
+ combinations[60][5] = 63; combinations[61][5] = 62; combinations[62][5] = 61; combinations[63][5] = 60;
+
+ // Diagonal, Y
+
+ combinations[64][0] = 0; combinations[65][0] = 0; combinations[66][0] = 0; combinations[67][0] = 0;
+ combinations[64][1] = 0; combinations[65][1] = 0; combinations[66][1] = 0; combinations[67][1] = 0;
+ combinations[64][2] = 63; combinations[65][2] = 59; combinations[66][2] = 55; combinations[67][2] = 51;
+ combinations[64][3] = 46; combinations[65][3] = 42; combinations[66][3] = 38; combinations[67][3] = 34;
+ combinations[64][4] = 29; combinations[65][4] = 25; combinations[66][4] = 21; combinations[67][4] = 17;
+ combinations[64][5] = 12; combinations[65][5] = 8; combinations[66][5] = 4; combinations[67][5] = 0;
+
+ combinations[68][0] = 0; combinations[69][0] = 0; combinations[70][0] = 0; combinations[71][0] = 0;
+ combinations[68][1] = 0; combinations[69][1] = 0; combinations[70][1] = 0; combinations[71][1] = 0;
+ combinations[68][2] = 15; combinations[69][2] = 11; combinations[70][2] = 7; combinations[71][2] = 3;
+ combinations[68][3] = 30; combinations[69][3] = 26; combinations[70][3] = 22; combinations[71][3] = 18;
+ combinations[68][4] = 45; combinations[69][4] = 41; combinations[70][4] = 37; combinations[71][4] = 33;
+ combinations[68][5] = 60; combinations[69][5] = 56; combinations[70][5] = 52; combinations[71][5] = 48;
+
+ // Corner to Corner
+
+ combinations[72][0] = 0; combinations[73][0] = 0; combinations[74][0] = 0; combinations[75][0] = 0;
+ combinations[72][1] = 0; combinations[73][1] = 0; combinations[74][1] = 0; combinations[75][1] = 0;
+ combinations[72][2] = 0; combinations[73][2] = 3; combinations[74][2] = 12; combinations[75][2] = 15;
+ combinations[72][3] = 21; combinations[73][3] = 22; combinations[74][3] = 25; combinations[75][3] = 26;
+ combinations[72][4] = 42; combinations[73][4] = 41; combinations[74][4] = 38; combinations[75][4] = 37;
+ combinations[72][5] = 63; combinations[73][5] = 60; combinations[74][5] = 51; combinations[75][5] = 48;
+
+ // Initialize the combination flags to zero.
+ for (int i=0; i<76; i++)
+ combinations[i][6] = 0;
+
+ // Set up the pos_to_comb array to point to every winning combination that a given
+ // position may have.
+ setup_pos_to_comb();
+
+ // Set up the best_picks array.
+ update_best_picks();
+ }
+
+
+ /**
+ * Initialize the "outside four" array.
+ */
+ public void init_outside_four() {
+ for (int i=0; i<18; i++) {
+ outside_four[i][0] = 0;
+ outside_four[i][1] = 0;
+ outside_four[i][2] = faces[i][ 2];
+ outside_four[i][3] = faces[i][ 5];
+ outside_four[i][4] = faces[i][14];
+ outside_four[i][5] = faces[i][17];
+ }
+ }
+
+
+ /**
+ * Initialize the "inside four" array.
+ */
+ public void init_inside_four() {
+ for (int i=0; i<18; i++) {
+ inside_four[i][0] = 0;
+ inside_four[i][1] = 0;
+ inside_four[i][2] = faces[i][ 7];
+ inside_four[i][3] = faces[i][ 8];
+ inside_four[i][4] = faces[i][11];
+ inside_four[i][5] = faces[i][12];
+ }
+ }
+
+ /**
+ * Initialize the "faces" array.
+ */
+ public void init_faces () {
+
+ faces[ 0][ 0] = 0;
+ faces[ 0][ 1] = 0;
+ faces[ 0][ 2] = 12; faces[ 0][ 6] = 13; faces[ 0][10] = 14; faces[ 0][14] = 15;
+ faces[ 0][ 3] = 8; faces[ 0][ 7] = 9; faces[ 0][11] = 10; faces[ 0][15] = 11;
+ faces[ 0][ 4] = 4; faces[ 0][ 8] = 5; faces[ 0][12] = 6; faces[ 0][16] = 7;
+ faces[ 0][ 5] = 0; faces[ 0][ 9] = 1; faces[ 0][13] = 2; faces[ 0][17] = 3;
+
+ faces[ 1][ 0] = 0;
+ faces[ 1][ 1] = 0;
+ faces[ 1][ 2] = 28; faces[ 1][ 6] = 29; faces[ 1][10] = 30; faces[ 1][14] = 31;
+ faces[ 1][ 3] = 24; faces[ 1][ 7] = 25; faces[ 1][11] = 26; faces[ 1][15] = 27;
+ faces[ 1][ 4] = 20; faces[ 1][ 8] = 21; faces[ 1][12] = 22; faces[ 1][16] = 23;
+ faces[ 1][ 5] = 16; faces[ 1][ 9] = 17; faces[ 1][13] = 18; faces[ 1][17] = 19;
+
+ faces[ 2][ 0] = 0;
+ faces[ 2][ 1] = 0;
+ faces[ 2][ 2] = 44; faces[ 2][ 6] = 45; faces[ 2][10] = 46; faces[ 2][14] = 47;
+ faces[ 2][ 3] = 40; faces[ 2][ 7] = 41; faces[ 2][11] = 42; faces[ 2][15] = 43;
+ faces[ 2][ 4] = 36; faces[ 2][ 8] = 37; faces[ 2][12] = 38; faces[ 2][16] = 39;
+ faces[ 2][ 5] = 32; faces[ 2][ 9] = 33; faces[ 2][13] = 34; faces[ 2][17] = 35;
+
+ faces[ 3][ 0] = 0;
+ faces[ 3][ 1] = 0;
+ faces[ 3][ 2] = 60; faces[ 3][ 6] = 61; faces[ 3][10] = 62; faces[ 3][14] = 63;
+ faces[ 3][ 3] = 56; faces[ 3][ 7] = 57; faces[ 3][11] = 58; faces[ 3][15] = 59;
+ faces[ 3][ 4] = 52; faces[ 3][ 8] = 53; faces[ 3][12] = 54; faces[ 3][16] = 55;
+ faces[ 3][ 5] = 48; faces[ 3][ 9] = 49; faces[ 3][13] = 50; faces[ 3][17] = 51;
+
+ faces[ 4][ 0] = 0;
+ faces[ 4][ 1] = 0;
+ faces[ 4][ 2] = 12; faces[ 4][ 6] = 28; faces[ 4][10] = 44; faces[ 4][14] = 60;
+ faces[ 4][ 3] = 8; faces[ 4][ 7] = 24; faces[ 4][11] = 40; faces[ 4][15] = 56;
+ faces[ 4][ 4] = 4; faces[ 4][ 8] = 20; faces[ 4][12] = 36; faces[ 4][16] = 52;
+ faces[ 4][ 5] = 0; faces[ 4][ 9] = 16; faces[ 4][13] = 32; faces[ 4][17] = 48;
+
+ faces[ 5][ 0] = 0;
+ faces[ 5][ 1] = 0;
+ faces[ 5][ 2] = 13; faces[ 5][ 6] = 29; faces[ 5][10] = 45; faces[ 5][14] = 61;
+ faces[ 5][ 3] = 9; faces[ 5][ 7] = 25; faces[ 5][11] = 41; faces[ 5][15] = 57;
+ faces[ 5][ 4] = 5; faces[ 5][ 8] = 21; faces[ 5][12] = 37; faces[ 5][16] = 53;
+ faces[ 5][ 5] = 1; faces[ 5][ 9] = 17; faces[ 5][13] = 33; faces[ 5][17] = 49;
+
+ faces[ 6][ 0] = 0;
+ faces[ 6][ 1] = 0;
+ faces[ 6][ 2] = 14; faces[ 6][ 6] = 30; faces[ 6][10] = 46; faces[ 6][14] = 62;
+ faces[ 6][ 3] = 10; faces[ 6][ 7] = 26; faces[ 6][11] = 42; faces[ 6][15] = 58;
+ faces[ 6][ 4] = 6; faces[ 6][ 8] = 22; faces[ 6][12] = 38; faces[ 6][16] = 54;
+ faces[ 6][ 5] = 2; faces[ 6][ 9] = 18; faces[ 6][13] = 34; faces[ 6][17] = 50;
+
+ faces[ 7][ 0] = 0;
+ faces[ 7][ 1] = 0;
+ faces[ 7][ 2] = 15; faces[ 7][ 6] = 31; faces[ 7][10] = 47; faces[ 7][14] = 63;
+ faces[ 7][ 3] = 11; faces[ 7][ 7] = 27; faces[ 7][11] = 43; faces[ 7][15] = 59;
+ faces[ 7][ 4] = 7; faces[ 7][ 8] = 23; faces[ 7][12] = 39; faces[ 7][16] = 55;
+ faces[ 7][ 5] = 3; faces[ 7][ 9] = 19; faces[ 7][13] = 35; faces[ 7][17] = 51;
+
+ faces[ 8][ 0] = 0;
+ faces[ 8][ 1] = 0;
+ faces[ 8][ 2] = 12; faces[ 8][ 6] = 28; faces[ 8][10] = 44; faces[ 8][14] = 60;
+ faces[ 8][ 3] = 13; faces[ 8][ 7] = 29; faces[ 8][11] = 45; faces[ 8][15] = 61;
+ faces[ 8][ 4] = 14; faces[ 8][ 8] = 30; faces[ 8][12] = 46; faces[ 8][16] = 62;
+ faces[ 8][ 5] = 15; faces[ 8][ 9] = 31; faces[ 8][13] = 47; faces[ 8][17] = 63;
+
+ faces[ 9][ 0] = 0;
+ faces[ 9][ 1] = 0;
+ faces[ 9][ 2] = 8; faces[ 9][ 6] = 24; faces[ 9][10] = 40; faces[ 9][14] = 56;
+ faces[ 9][ 3] = 9; faces[ 9][ 7] = 25; faces[ 9][11] = 41; faces[ 9][15] = 57;
+ faces[ 9][ 4] = 10; faces[ 9][ 8] = 26; faces[ 9][12] = 42; faces[ 9][16] = 58;
+ faces[ 9][ 5] = 11; faces[ 9][ 9] = 27; faces[ 9][13] = 43; faces[ 9][17] = 59;
+
+ faces[10][ 0] = 0;
+ faces[10][ 1] = 0;
+ faces[10][ 2] = 4; faces[10][ 6] = 20; faces[10][10] = 36; faces[10][14] = 52;
+ faces[10][ 3] = 5; faces[10][ 7] = 21; faces[10][11] = 37; faces[10][15] = 53;
+ faces[10][ 4] = 6; faces[10][ 8] = 22; faces[10][12] = 38; faces[10][16] = 54;
+ faces[10][ 5] = 7; faces[10][ 9] = 23; faces[10][13] = 39; faces[10][17] = 55;
+
+ faces[11][ 0] = 0;
+ faces[11][ 1] = 0;
+ faces[11][ 2] = 0; faces[11][ 6] = 16; faces[11][10] = 32; faces[11][14] = 48;
+ faces[11][ 3] = 1; faces[11][ 7] = 17; faces[11][11] = 33; faces[11][15] = 49;
+ faces[11][ 4] = 2; faces[11][ 8] = 18; faces[11][12] = 34; faces[11][16] = 50;
+ faces[11][ 5] = 3; faces[11][ 9] = 19; faces[11][13] = 35; faces[11][17] = 51;
+
+ faces[12][ 0] = 0;
+ faces[12][ 1] = 0;
+ faces[12][ 2] = 12; faces[12][ 6] = 13; faces[12][10] = 14; faces[12][14] = 15;
+ faces[12][ 3] = 24; faces[12][ 7] = 25; faces[12][11] = 26; faces[12][15] = 27;
+ faces[12][ 4] = 36; faces[12][ 8] = 37; faces[12][12] = 38; faces[12][16] = 39;
+ faces[12][ 5] = 48; faces[12][ 9] = 49; faces[12][13] = 50; faces[12][17] = 51;
+
+ faces[13][ 0] = 0;
+ faces[13][ 1] = 0;
+ faces[13][ 2] = 0; faces[13][ 6] = 1; faces[13][10] = 2; faces[13][14] = 3;
+ faces[13][ 3] = 20; faces[13][ 7] = 21; faces[13][11] = 22; faces[13][15] = 23;
+ faces[13][ 4] = 40; faces[13][ 8] = 41; faces[13][12] = 42; faces[13][16] = 43;
+ faces[13][ 5] = 60; faces[13][ 9] = 61; faces[13][13] = 62; faces[13][17] = 63;
+
+ faces[14][ 0] = 0;
+ faces[14][ 1] = 0;
+ faces[14][ 2] = 12; faces[14][ 6] = 28; faces[14][10] = 44; faces[14][14] = 60;
+ faces[14][ 3] = 9; faces[14][ 7] = 25; faces[14][11] = 41; faces[14][15] = 57;
+ faces[14][ 4] = 6; faces[14][ 8] = 22; faces[14][12] = 38; faces[14][16] = 54;
+ faces[14][ 5] = 3; faces[14][ 9] = 19; faces[14][13] = 35; faces[14][17] = 51;
+
+ faces[15][ 0] = 0;
+ faces[15][ 1] = 0;
+ faces[15][ 2] = 15; faces[15][ 6] = 31; faces[15][10] = 47; faces[15][14] = 63;
+ faces[15][ 3] = 10; faces[15][ 7] = 26; faces[15][11] = 42; faces[15][15] = 58;
+ faces[15][ 4] = 5; faces[15][ 8] = 21; faces[15][12] = 37; faces[15][16] = 53;
+ faces[15][ 5] = 0; faces[15][ 9] = 16; faces[15][13] = 32; faces[15][17] = 48;
+
+ faces[16][ 0] = 0;
+ faces[16][ 1] = 0;
+ faces[16][ 2] = 12; faces[16][ 6] = 29; faces[16][10] = 46; faces[16][14] = 63;
+ faces[16][ 3] = 8; faces[16][ 7] = 25; faces[16][11] = 42; faces[16][15] = 59;
+ faces[16][ 4] = 4; faces[16][ 8] = 21; faces[16][12] = 38; faces[16][16] = 55;
+ faces[16][ 5] = 0; faces[16][ 9] = 17; faces[16][13] = 34; faces[16][17] = 51;
+
+ faces[17][ 0] = 0;
+ faces[17][ 1] = 0;
+ faces[17][ 2] = 15; faces[17][ 6] = 30; faces[17][10] = 45; faces[17][14] = 60;
+ faces[17][ 3] = 11; faces[17][ 7] = 26; faces[17][11] = 41; faces[17][15] = 56;
+ faces[17][ 4] = 7; faces[17][ 8] = 22; faces[17][12] = 37; faces[17][16] = 52;
+ faces[17][ 5] = 3; faces[17][ 9] = 18; faces[17][13] = 33; faces[17][17] = 48;
+ }
+
+ /**
+ * Render the current face set in the 2D window.
+ */
+ public void render2D(Graphics gc) {
+
+ gc.setColor(background);
+ gc.fillRect(0, 0, width, height);
+
+ int id;
+ int x, y;
+
+ float begX;
+ float begY;
+
+ for (int l=0; l<3; l++) {
+ begY = 28.0f + l*(5.f*23.3f);
+ for (int k=0; k<6; k++) {
+ begX = 11.65f + k*(5.f*11.65f);
+ int count = 0;
+ int face = l*6+k;
+ for (int i=0; i<4; i++) {
+ for (int j=0; j<4; j++) {
+ x = (int)begX + i*12;
+ y = (int)begY + j*12;
+ id = faces[face][count+2];
+ if (occupied[id] == HUMAN) {
+ x -= 2;
+ y -= 2;
+ gc.setColor(red);
+ gc.fillRect(x, y, 5, 5);
+ }
+ else if (occupied[id] == MACHINE) {
+ x -= 2;
+ y -= 2;
+ gc.setColor(blue);
+ gc.fillRect(x, y, 5, 5);
+ }
+ else {
+ x -= 1;
+ y -= 1;
+ gc.setColor(gray);
+ gc.fillRect(x, y, 2, 2);
+ }
+ if (highlight[face]) {
+ gc.setColor(yellow);
+ positions.setHighlight(faces[face][count+2]);
+ }
+ count++;
+ }
+ }
+ if (highlight[face])
+ gc.setColor(yellow);
+ else
+ gc.setColor(white);
+ if ((face+1)<10)
+ gc.drawString("Face "+(face+1), (int)begX-2, (int)begY+60);
+ else
+ gc.drawString("Face "+(face+1), (int)begX-4, (int)begY+60);
+ }
+ }
+ }
+
+ /**
+ * Determine what position has been selected in the 2D window.
+ */
+ public void checkSelection2D(int x, int y, int player) {
+
+ int id;
+ int posX, posY;
+
+ float begX;
+ float begY;
+
+ for (int l=0; l<3; l++) {
+ begY = 28.0f + l*(5.f*23.3f);
+ for (int k=0; k<6; k++) {
+ begX = 11.65f + k*(5.f*11.65f);
+ int count = 0;
+ int face = l*6+k;
+ for (int i=0; i<4; i++) {
+ for (int j=0; j<4; j++) {
+ posX = (int)begX + i*12;
+ posY = (int)begY + j*12;
+ if (x > posX-4 && x < posX+4 &&
+ y > posY-4 && y < posY+4) {
+
+ id = faces[face][count+2];
+
+ if (occupied[id] == UNOCCUPIED) {
+ positions.set(id, player);
+ selection(id, player);
+ canvas.repaint();
+ }
+ return;
+ }
+ count++;
+ }
+ }
+ if ((x > begX-4 && x < begX+40) &&
+ (y > begY+45 && y < begY+60) ) {
+
+ count = 0;
+ for (int i=0; i<4; i++) {
+ for (int j=0; j<4; j++) {
+ if (highlight[face])
+ positions.clearHighlight(faces[face][count+2]);
+ count++;
+ }
+ }
+ if (highlight[face])
+ highlight[face] = false;
+ else
+ highlight[face] = true;
+ canvas.repaint();
+ }
+ }
+ }
+
+ }
+
+
+ /**
+ * Record the player's move.
+ */
+ public void selection(int pos, int player) {
+
+ int num_combinations;
+ int comb;
+
+ this.player = player;
+
+ if (player == HUMAN) {
+
+ // If position is already occupied, return.
+ if (occupied[pos] != 0) return;
+
+ // Mark the position as HUMAN.
+ occupied[pos] = HUMAN;
+
+ // Update the logic arrays.
+ this.player = update_logic_arrays(pos);
+
+ // Have the computer determine its move.
+ choose_move();
+ }
+ }
+
+
+ /**
+ * Determine the computer's move.
+ */
+ public void choose_move () {
+
+ if (player == MACHINE) {
+
+ // Babe in the woods.
+ if (skill_level == 0) {
+ if (!block_winning_move()) {
+ if (!pick_7()) {
+ if (!check_outside_four()) {
+ pick_best_position();
+ }
+ }
+ }
+ }
+
+ // Walk and chew gum.
+ else if (skill_level == 1) {
+ if (!block_winning_move()) {
+ if (!block_intersecting_rows()) {
+ if (!block_inside_four()) {
+ if (!block_outside_four()) {
+ pick_best_position();
+ }
+ }
+ }
+ }
+ }
+
+ // Jeopordy contestant.
+ else if (skill_level == 2) {
+ if (!block_winning_move()) {
+ if (!block_intersecting_rows()) {
+ if (!block_inside_four()) {
+ if (!block_outside_four()) {
+ if (!pick_7()) {
+ pick_best_position();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Rocket scientist.
+ else if (skill_level == 3) {
+ if (!block_winning_move()) {
+ if (!block_intersecting_rows()) {
+ if (!block_chair_move()) {
+ if (!check_face_three()) {
+ if (!block_central_four()) {
+ if (!block_inside_four()) {
+ if (!block_outside_four()) {
+ if (!take_inside_four()) {
+ if (!take_outside_four()) {
+ if (!pick_7()) {
+ if (!check_outside_four()) {
+ pick_best_position();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Be afraid, be very afraid.
+ else if (skill_level == 4) {
+ if (!block_winning_move()) {
+ if (!block_intersecting_rows()) {
+ if (!block_chair_move()) {
+ if (!block_walk_move()) {
+ if (!block_central_four()) {
+ if (!block_inside_four()) {
+ if (!block_outside_four()) {
+ if (!check_face_three()) {
+ if (!check_intersecting_rows2()) {
+ if (!take_inside_four()) {
+ if (!take_outside_four()) {
+ if (!pick_7()) {
+ if (!check_outside_four()) {
+ pick_best_position();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Check for a winning move.
+ */
+ public boolean block_winning_move() {
+
+ // Loop through each combination and see if any player occupies
+ // three positions. If so, take the last remaining position.
+ int pos;
+ for (int i=0; i<76; i++) {
+ if (combinations[i][0] == 3) {
+ for (int j=2; j<6; j++) {
+ pos = combinations[i][j];
+ if (occupied[pos] == 0) {
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_winning_move: true");
+ return true;
+ }
+ }
+ }
+ }
+ if (debug) System.out.println("check_winning_move: false");
+ return false;
+ }
+
+
+ /**
+ * Block outside four
+ */
+ public boolean block_outside_four() {
+
+ int pos;
+ int index = 0;
+ int max = 0;
+
+ // Block the opponent, if necessary.
+ for (int i=0; i<18; i++) {
+ if (outside_four[i][0] > 0 &&
+ outside_four[i][1] == HUMAN) {
+ if(outside_four[i][0] > max) {
+ index = i;
+ max = outside_four[i][0];
+ }
+ }
+ }
+
+ if (max > 0) {
+ for (int j=2; j<6; j++) {
+ pos = outside_four[index][j];
+ if (occupied[pos] == 0) {
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_outside_four: true");
+ return true;
+ }
+ }
+ }
+
+ if (debug) System.out.println("block_outside_four: false");
+ return false;
+ }
+
+
+ /**
+ * Block central four
+ */
+ public boolean block_central_four() {
+
+ int pos;
+ int index = 0;
+ int max = 0;
+
+ // Block the opponent, if necessary.
+ for (int i=1; i<3; i++) {
+ if (inside_four[i][0] > 0 &&
+ inside_four[i][1] == HUMAN) {
+ if(inside_four[i][0] > max) {
+ index = i;
+ max = inside_four[i][0];
+ }
+ }
+ }
+
+ if (max > 0) {
+ for (int j=2; j<6; j++) {
+ pos = inside_four[index][j];
+ if (occupied[pos] == 0) {
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_central_four: true");
+ return true;
+ }
+ }
+ }
+
+ if (debug) System.out.println("block_central_four: false");
+ return false;
+ }
+
+ /**
+ * Check each face for a forced win.
+ */
+ public boolean check_face_three() {
+
+ int pos;
+ int index = 0;
+ int human = 0;
+ int machine = 0;
+
+ // Block the opponent from a forced win.
+ for (int i=0; i<18; i++) {
+ if (outside_four[i][0] == -1) {
+ human = 0;
+ machine = 0;
+ for (int j=2; j<6; j++) {
+ if (occupied[outside_four[i][j]] == MACHINE)
+ machine++;
+ else if (occupied[outside_four[i][j]] == HUMAN)
+ human++;
+ }
+ if (debug) System.out.println("machine = " + machine);
+ if (debug) System.out.println("human = " + human);
+ if (human == 3 && machine == 1) {
+ if (debug) System.out.println("human == 3 && machine == 1");
+ for (int j=2; j<18; j++) {
+ pos = faces[i][j];
+ if (occupied[pos] == 0) {
+ for (int k=0; k<76; k++) {
+ if (combinations[i][0] == 2 &
+ combinations[i][1] == HUMAN) {
+ for (int l=0; l<4; l++) {
+ if (combinations[i][l] == pos) {
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("check_face_three: true");
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (debug) System.out.println("check_face_three: false");
+ return false;
+ }
+
+
+
+ /**
+ * Block inside four
+ */
+ public boolean block_inside_four() {
+
+ int pos;
+ int index = 0;
+ int max = 0;
+
+ // Block the opponent, if necessary.
+ for (int i=0; i<18; i++) {
+ if (inside_four[i][0] > 0 &&
+ inside_four[i][1] == HUMAN) {
+ if(inside_four[i][0] > max) {
+ index = i;
+ max = inside_four[i][0];
+ }
+ }
+ }
+
+ if (max > 0) {
+ for (int j=2; j<6; j++) {
+ pos = inside_four[index][j];
+ if (occupied[pos] == 0) {
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_inside_four: true");
+ return true;
+ }
+ }
+ }
+
+ if (debug) System.out.println("block_inside_four: false");
+ return false;
+ }
+
+
+ public boolean block_chair_move() {
+
+ int pos;
+
+ int ncorners = 0; // Number of corners owned by human
+ int corner = 0; // Corner owned by machine
+
+ if (debug) System.out.println("inside block_chair_move");
+
+ // Loop through all of the faces.
+ for(int i=0; i<18; i++) {
+
+ // Determine which corners the human owns.
+ if (occupied[faces[i][2]] == HUMAN)
+ ncorners++;
+ else if (occupied[faces[i][2]] == MACHINE)
+ corner = 2;
+ if (occupied[faces[i][5]] == HUMAN)
+ ncorners++;
+ else if (occupied[faces[i][5]] == MACHINE)
+ corner = 5;
+ if (occupied[faces[i][14]] == HUMAN)
+ ncorners++;
+ else if (occupied[faces[i][14]] == MACHINE)
+ corner = 14;
+ if (occupied[faces[i][17]] == HUMAN)
+ ncorners++;
+ else if (occupied[faces[i][17]] == MACHINE)
+ corner = 17;
+
+ // If the human owns three corners, continue with the search.
+ if (ncorners == 3) {
+ if (corner == 2) {
+ if (occupied[faces[i][ 3]] == HUMAN && occupied[faces[i][ 7]] == 0 &&
+ occupied[faces[i][ 8]] == 0 && occupied[faces[i][11]] == 0 &&
+ occupied[faces[i][15]] == 0 && occupied[faces[i][16]] == 0) {
+ pos = faces[i][11];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][ 4]] == HUMAN && occupied[faces[i][ 8]] == 0 &&
+ occupied[faces[i][11]] == 0 && occupied[faces[i][12]] == 0 &&
+ occupied[faces[i][15]] == 0 && occupied[faces[i][16]] == 0) {
+ pos = faces[i][12];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][ 6]] == HUMAN && occupied[faces[i][ 7]] == 0 &&
+ occupied[faces[i][ 8]] == 0 && occupied[faces[i][ 9]] == 0 &&
+ occupied[faces[i][11]] == 0 && occupied[faces[i][13]] == 0) {
+ pos = faces[i][8];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][10]] == HUMAN && occupied[faces[i][ 8]] == 0 &&
+ occupied[faces[i][ 9]] == 0 && occupied[faces[i][11]] == 0 &&
+ occupied[faces[i][12]] == 0 && occupied[faces[i][13]] == 0) {
+ pos = faces[i][11];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][ 7]] == HUMAN && occupied[faces[i][ 3]] == 0 &&
+ occupied[faces[i][ 8]] == 0 && occupied[faces[i][11]] == 0 &&
+ occupied[faces[i][15]] == 0 && occupied[faces[i][16]] == 0) {
+ pos = faces[i][11];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][12]] == HUMAN && occupied[faces[i][ 4]] == 0 &&
+ occupied[faces[i][ 8]] == 0 && occupied[faces[i][11]] == 0 &&
+ occupied[faces[i][15]] == 0 && occupied[faces[i][16]] == 0) {
+ pos = faces[i][16];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ }
+ else if (corner == 5) {
+ if (occupied[faces[i][ 9]] == HUMAN && occupied[faces[i][ 6]] == 0 &&
+ occupied[faces[i][ 7]] == 0 && occupied[faces[i][ 8]] == 0 &&
+ occupied[faces[i][10]] == 0 && occupied[faces[i][12]] == 0) {
+ pos = faces[i][7];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][13]] == HUMAN && occupied[faces[i][ 7]] == 0 &&
+ occupied[faces[i][ 7]] == 0 && occupied[faces[i][10]] == 0 &&
+ occupied[faces[i][11]] == 0 && occupied[faces[i][12]] == 0) {
+ pos = faces[i][12];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][ 4]] == HUMAN && occupied[faces[i][ 8]] == 0 &&
+ occupied[faces[i][11]] == 0 && occupied[faces[i][12]] == 0 &&
+ occupied[faces[i][15]] == 0 && occupied[faces[i][16]] == 0) {
+ pos = faces[i][12];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][ 3]] == HUMAN && occupied[faces[i][ 7]] == 0 &&
+ occupied[faces[i][11]] == 0 && occupied[faces[i][12]] == 0 &&
+ occupied[faces[i][15]] == 0 && occupied[faces[i][16]] == 0) {
+ pos = faces[i][7];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][ 8]] == HUMAN && occupied[faces[i][ 4]] == 0 &&
+ occupied[faces[i][11]] == 0 && occupied[faces[i][12]] == 0 &&
+ occupied[faces[i][15]] == 0 && occupied[faces[i][16]] == 0) {
+ pos = faces[i][12];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][11]] == HUMAN && occupied[faces[i][ 3]] == 0 &&
+ occupied[faces[i][ 7]] == 0 && occupied[faces[i][12]] == 0 &&
+ occupied[faces[i][15]] == 0 && occupied[faces[i][16]] == 0) {
+ pos = faces[i][ 7];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ }
+ else if (corner == 14) {
+ if (occupied[faces[i][ 6]] == HUMAN && occupied[faces[i][ 7]] == 0 &&
+ occupied[faces[i][ 8]] == 0 && occupied[faces[i][ 9]] == 0 &&
+ occupied[faces[i][11]] == 0 && occupied[faces[i][13]] == 0) {
+ pos = faces[i][7];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][10]] == HUMAN && occupied[faces[i][ 8]] == 0 &&
+ occupied[faces[i][ 9]] == 0 && occupied[faces[i][11]] == 0 &&
+ occupied[faces[i][12]] == 0 && occupied[faces[i][13]] == 0) {
+ pos = faces[i][12];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][15]] == HUMAN && occupied[faces[i][ 3]] == 0 &&
+ occupied[faces[i][ 4]] == 0 && occupied[faces[i][ 7]] == 0 &&
+ occupied[faces[i][11]] == 0 && occupied[faces[i][12]] == 0) {
+ pos = faces[i][3];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][16]] == HUMAN && occupied[faces[i][ 3]] == 0 &&
+ occupied[faces[i][ 4]] == 0 && occupied[faces[i][ 7]] == 0 &&
+ occupied[faces[i][ 8]] == 0 && occupied[faces[i][12]] == 0) {
+ pos = faces[i][12];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][11]] == HUMAN && occupied[faces[i][ 3]] == 0 &&
+ occupied[faces[i][ 4]] == 0 && occupied[faces[i][ 7]] == 0 &&
+ occupied[faces[i][12]] == 0 && occupied[faces[i][15]] == 0) {
+ pos = faces[i][7];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][ 8]] == HUMAN && occupied[faces[i][ 6]] == 0 &&
+ occupied[faces[i][ 7]] == 0 && occupied[faces[i][ 9]] == 0 &&
+ occupied[faces[i][12]] == 0 && occupied[faces[i][13]] == 0) {
+ pos = faces[i][7];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ }
+ else if (corner == 17) {
+ if (occupied[faces[i][ 9]] == HUMAN && occupied[faces[i][ 6]] == 0 &&
+ occupied[faces[i][ 7]] == 0 && occupied[faces[i][ 8]] == 0 &&
+ occupied[faces[i][10]] == 0 && occupied[faces[i][11]] == 0) {
+ pos = faces[i][8];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][13]] == HUMAN && occupied[faces[i][ 6]] == 0 &&
+ occupied[faces[i][ 8]] == 0 && occupied[faces[i][10]] == 0 &&
+ occupied[faces[i][11]] == 0 && occupied[faces[i][12]] == 0) {
+ pos = faces[i][11];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][15]] == HUMAN && occupied[faces[i][ 3]] == 0 &&
+ occupied[faces[i][ 4]] == 0 && occupied[faces[i][ 7]] == 0 &&
+ occupied[faces[i][ 8]] == 0 && occupied[faces[i][11]] == 0) {
+ pos = faces[i][11];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][16]] == HUMAN && occupied[faces[i][ 3]] == 0 &&
+ occupied[faces[i][ 4]] == 0 && occupied[faces[i][ 8]] == 0 &&
+ occupied[faces[i][11]] == 0 && occupied[faces[i][12]] == 0) {
+ pos = faces[i][8];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][12]] == HUMAN && occupied[faces[i][ 3]] == 0 &&
+ occupied[faces[i][ 4]] == 0 && occupied[faces[i][ 8]] == 0 &&
+ occupied[faces[i][11]] == 0 && occupied[faces[i][16]] == 0) {
+ pos = faces[i][8];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (occupied[faces[i][ 7]] == HUMAN && occupied[faces[i][ 3]] == 0 &&
+ occupied[faces[i][ 4]] == 0 && occupied[faces[i][ 8]] == 0 &&
+ occupied[faces[i][11]] == 0 && occupied[faces[i][15]] == 0) {
+ pos = faces[i][11];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ }
+ }
+ ncorners = 0;
+ corner = -1;
+ }
+ if (debug) System.out.println("block_chair_move: false");
+ return false;
+ }
+
+ public boolean block_walk_move() {
+
+ int pos;
+
+ if (debug) System.out.println("inside block_walk_move");
+
+ // Loop through all of the faces.
+ for(int i=0; i<18; i++) {
+
+ // Look for a matching pattern.
+ if (occupied[faces[i][ 2]] == HUMAN && occupied[faces[i][14]] == HUMAN &&
+ occupied[faces[i][ 3]] == HUMAN && occupied[faces[i][15]] == HUMAN &&
+ occupied[faces[i][ 6]] == 0 && occupied[faces[i][10]] == 0 &&
+ occupied[faces[i][ 7]] == 0 && occupied[faces[i][11]] == 0) {
+
+ if (occupied[faces[i][ 8]] == HUMAN && occupied[faces[i][ 9]] == 0) {
+ pos = faces[i][6];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ else if (occupied[faces[i][12]] == HUMAN && occupied[faces[i][13]] == 0) {
+ pos = faces[i][10];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ }
+
+ // Look for a matching pattern.
+ if (occupied[faces[i][14]] == HUMAN && occupied[faces[i][17]] == HUMAN &&
+ occupied[faces[i][10]] == HUMAN && occupied[faces[i][13]] == HUMAN &&
+ occupied[faces[i][15]] == 0 && occupied[faces[i][16]] == 0 &&
+ occupied[faces[i][11]] == 0 && occupied[faces[i][12]] == 0) {
+
+ if (occupied[faces[i][7]] == HUMAN && occupied[faces[i][3]] == 0) {
+ pos = faces[i][15];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ else if (occupied[faces[i][8]] == HUMAN && occupied[faces[i][4]] == 0) {
+ pos = faces[i][16];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ }
+
+ // Look for a matching pattern.
+ if (occupied[faces[i][ 4]] == HUMAN && occupied[faces[i][16]] == HUMAN &&
+ occupied[faces[i][ 5]] == HUMAN && occupied[faces[i][17]] == HUMAN &&
+ occupied[faces[i][ 8]] == 0 && occupied[faces[i][12]] == 0 &&
+ occupied[faces[i][ 9]] == 0 && occupied[faces[i][13]] == 0) {
+
+ if (occupied[faces[i][11]] == HUMAN && occupied[faces[i][10]] == 0) {
+ pos = faces[i][18];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ else if (occupied[faces[i][7]] == HUMAN && occupied[faces[i][6]] == 0) {
+ pos = faces[i][9];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ }
+
+ // Look for a matching pattern.
+ if (occupied[faces[i][ 6]] == HUMAN && occupied[faces[i][ 9]] == HUMAN &&
+ occupied[faces[i][ 2]] == HUMAN && occupied[faces[i][ 5]] == HUMAN &&
+ occupied[faces[i][ 7]] == 0 && occupied[faces[i][ 8]] == 0 &&
+ occupied[faces[i][ 3]] == 0 && occupied[faces[i][ 4]] == 0) {
+
+ if (occupied[faces[i][11]] == HUMAN && occupied[faces[i][15]] == 0) {
+ pos = faces[i][3];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ else if (occupied[faces[i][12]] == HUMAN && occupied[faces[i][16]] == 0) {
+ pos = faces[i][4];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ }
+
+ // Look for a matching pattern.
+ if (occupied[faces[i][ 2]] == HUMAN && occupied[faces[i][14]] == HUMAN &&
+ occupied[faces[i][ 4]] == HUMAN && occupied[faces[i][16]] == HUMAN &&
+ occupied[faces[i][ 6]] == 0 && occupied[faces[i][10]] == 0 &&
+ occupied[faces[i][ 8]] == 0 && occupied[faces[i][12]] == 0) {
+
+ if ((occupied[faces[i][7]] == HUMAN && occupied[faces[i][9]] == 0) ||
+ (occupied[faces[i][9]] == HUMAN && occupied[faces[i][7]] == 0) ) {
+ pos = faces[i][6];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ else if ((occupied[faces[i][11]] == HUMAN && occupied[faces[i][13]] == 0) ||
+ (occupied[faces[i][13]] == HUMAN && occupied[faces[i][11]] == 0) ) {
+ pos = faces[i][10];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ }
+
+ // Look for a matching pattern.
+ if (occupied[faces[i][14]] == HUMAN && occupied[faces[i][17]] == HUMAN &&
+ occupied[faces[i][ 6]] == HUMAN && occupied[faces[i][ 9]] == HUMAN &&
+ occupied[faces[i][15]] == 0 && occupied[faces[i][16]] == 0 &&
+ occupied[faces[i][ 7]] == 0 && occupied[faces[i][ 8]] == 0) {
+
+ if ((occupied[faces[i][11]] == HUMAN && occupied[faces[i][ 3]] == 0) ||
+ (occupied[faces[i][ 3]] == HUMAN && occupied[faces[i][11]] == 0) ) {
+ pos = faces[i][15];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ else if ((occupied[faces[i][12]] == HUMAN && occupied[faces[i][ 4]] == 0) ||
+ (occupied[faces[i][ 4]] == HUMAN && occupied[faces[i][12]] == 0) ) {
+ pos = faces[i][16];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ }
+
+ // Look for a matching pattern.
+ if (occupied[faces[i][ 3]] == HUMAN && occupied[faces[i][15]] == HUMAN &&
+ occupied[faces[i][ 5]] == HUMAN && occupied[faces[i][17]] == HUMAN &&
+ occupied[faces[i][ 7]] == 0 && occupied[faces[i][11]] == 0 &&
+ occupied[faces[i][ 9]] == 0 && occupied[faces[i][13]] == 0) {
+
+ if ((occupied[faces[i][ 6]] == HUMAN && occupied[faces[i][ 8]] == 0) ||
+ (occupied[faces[i][ 8]] == HUMAN && occupied[faces[i][ 6]] == 0) ) {
+ pos = faces[i][9];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ else if ((occupied[faces[i][10]] == HUMAN && occupied[faces[i][12]] == 0) ||
+ (occupied[faces[i][12]] == HUMAN && occupied[faces[i][10]] == 0) ) {
+ pos = faces[i][13];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ }
+
+ // Look for a matching pattern.
+ if (occupied[faces[i][10]] == HUMAN && occupied[faces[i][13]] == HUMAN &&
+ occupied[faces[i][ 2]] == HUMAN && occupied[faces[i][ 5]] == HUMAN &&
+ occupied[faces[i][11]] == 0 && occupied[faces[i][12]] == 0 &&
+ occupied[faces[i][ 3]] == 0 && occupied[faces[i][ 4]] == 0) {
+
+ if ((occupied[faces[i][ 7]] == HUMAN && occupied[faces[i][15]] == 0) ||
+ (occupied[faces[i][15]] == HUMAN && occupied[faces[i][ 7]] == 0) ) {
+ pos = faces[i][3];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ else if ((occupied[faces[i][ 8]] == HUMAN && occupied[faces[i][16]] == 0) ||
+ (occupied[faces[i][16]] == HUMAN && occupied[faces[i][ 8]] == 0) ) {
+ pos = faces[i][4];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ }
+
+ }
+
+ if (debug) System.out.println("block_walk_move: false");
+ return false;
+ }
+
+ public boolean check_chair_move() {
+
+ int pos;
+
+ // If the "block chair flag" is set, all we need to do is
+ // block the winning path...
+ if (block_chair_flag) {
+ pos = faces[block_chair_face][block_chair_next_move];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: march");
+ return true;
+ }
+
+ int ncorners = 0; // Number of corners owned by human
+ int corner = 0; // Corner owned by machine
+
+ // Loop through all of the faces.
+ for(int i=0; i<18; i++) {
+
+ // Determine which corners the human owns.
+ if (faces[i][ 2] == HUMAN)
+ ncorners++;
+ else
+ corner = 2;
+ if (faces[i][ 5] == HUMAN)
+ ncorners++;
+ else
+ corner = 5;
+ if (faces[i][14] == HUMAN)
+ ncorners++;
+ else
+ corner = 14;
+ if (faces[i][17] == HUMAN)
+ ncorners++;
+ else
+ corner = 17;
+
+ // If the human owns three corners, continue with the search.
+ if (ncorners == 3) {
+ if (corner == 2) {
+ if (faces[i][ 3] == HUMAN && faces[i][ 7] == 0 &&
+ faces[i][ 8] == 0 && faces[i][11] == 0 &&
+ faces[i][15] == 0 && faces[i][16] == 0) {
+ block_chair_flag = true;
+ block_chair_next_move = 11;
+ block_chair_face = i;
+ pos = faces[i][15];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ if (faces[i][ 4] == HUMAN && faces[i][ 8] == 0 &&
+ faces[i][11] == 0 && faces[i][12] == 0 &&
+ faces[i][15] == 0 && faces[i][16] == 0) {
+ block_chair_flag = true;
+ block_chair_next_move = 16;
+ block_chair_face = i;
+ pos = faces[i][8];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_chair_move: found");
+ return true;
+ }
+ }
+ else if (corner == 5) {
+ block_chair_flag = true;
+ block_chair_next_move = 11;
+ block_chair_face = i;
+ pos = faces[i][15];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("check_face_three: true");
+ return true;
+ }
+ else if (corner == 14) {
+ block_chair_flag = true;
+ block_chair_next_move = 11;
+ block_chair_face = i;
+ pos = faces[i][15];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("check_face_three: true");
+ return true;
+ }
+ else if (corner == 17) {
+ block_chair_flag = true;
+ block_chair_next_move = 11;
+ block_chair_face = i;
+ pos = faces[i][15];
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("check_face_three: true");
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Take inside four
+ */
+ public boolean take_inside_four() {
+
+ int pos = 0;
+ boolean found = false;
+
+ if (occupied[21] == 0) {
+ found = true;
+ pos = 21;
+ }
+ else if (occupied[22] == 0) {
+ found = true;
+ pos = 22;
+ }
+ else if (occupied[25] == 0) {
+ found = true;
+ pos = 25;
+ }
+ else if (occupied[26] == 0) {
+ found = true;
+ pos = 26;
+ }
+ else if (occupied[37] == 0) {
+ found = true;
+ pos = 37;
+ }
+ else if (occupied[38] == 0) {
+ found = true;
+ pos = 38;
+ }
+ else if (occupied[41] == 0) {
+ found = true;
+ pos = 41;
+ }
+ else if (occupied[42] == 0) {
+ found = true;
+ pos = 42;
+ }
+
+ if (found) {
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("take_inside_four: true");
+ return true;
+ }
+
+ if (debug) System.out.println("take_inside_four: false");
+ return false;
+ }
+
+
+ /**
+ * Check occupancy of outside four.
+ */
+ public boolean check_outside_four() {
+
+ int pos = 0;
+
+ // Finish off the four corner combination.
+ if (outside_four_flag) {
+ if (occupied[faces[face_index][7]] == 0) {
+ pos = faces[face_index][7];
+ }
+ else if (occupied[faces[face_index][6]] == 0) {
+ pos = faces[face_index][6];
+ }
+
+ if (occupied[pos] == 0) {
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ return true;
+ }
+ }
+
+ // Look for a four corner combination.
+ for (int i=0; i<18; i++) {
+ if (outside_four[i][0] == 4 &&
+ outside_four[i][1] == MACHINE) {
+ if (faces[i][0] > 0 &&
+ faces[i][1] == MACHINE) {
+ if (occupied[faces[i][8]] == 0) {
+ pos = faces[i][8];
+ outside_four_flag = true;
+ face_index = i;
+ }
+ if (occupied[pos] == 0) {
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("check_outside_four: true");
+ return true;
+ }
+ }
+ }
+ }
+
+ // Take the corners, if available.
+ for (int i=0; i<18; i++) {
+ if (outside_four[i][0] > 0 &&
+ outside_four[i][1] == MACHINE) {
+ if (faces[i][0] > 0 &&
+ faces[i][1] == MACHINE) {
+ for (int j=2; j<6; j++) {
+ pos = outside_four[i][j];
+ if (occupied[pos] == 0) {
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("check_outside_four: true");
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ // Look for an "outside four" combination in a face in which the
+ // opponent holds no positions.
+ for (int i=0; i<18; i++) {
+ if (outside_four[i][0] == 0 || (outside_four[i][0] > 0 &&
+ outside_four[i][1] == MACHINE)) {
+
+ if (outside_four[i][1] == MACHINE)
+ outside_four_flag = true;
+ for (int j=2; j<6; j++) {
+ pos = outside_four[i][j];
+ if (occupied[pos] == 0) {
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("check_outside_four: true");
+ return true;
+ }
+ }
+ }
+ }
+
+ if (debug) System.out.println("check_outside_four: false");
+ return false;
+ }
+
+
+ /**
+ * Take outside four
+ */
+ public boolean take_outside_four() {
+
+ int pos = 0;
+ boolean found = false;
+
+ if (occupied[0] == 0) {
+ found = true;
+ pos = 0;
+ }
+ else if (occupied[3] == 0) {
+ found = true;
+ pos = 3;
+ }
+ else if (occupied[12] == 0) {
+ found = true;
+ pos = 12;
+ }
+ else if (occupied[15] == 0) {
+ found = true;
+ pos = 15;
+ }
+ else if (occupied[48] == 0) {
+ found = true;
+ pos = 48;
+ }
+ else if (occupied[51] == 0) {
+ found = true;
+ pos = 51;
+ }
+ else if (occupied[60] == 0) {
+ found = true;
+ pos = 60;
+ }
+ else if (occupied[63] == 0) {
+ found = true;
+ pos = 63;
+ }
+
+ if (found) {
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("take_outside_four: true");
+ return true;
+ }
+
+ if (debug) System.out.println("take_outside_four: false");
+ return false;
+ }
+
+
+ /**
+ * Check for a forced win by intersecting rows. Block
+ * if necessary.
+ */
+ public boolean block_intersecting_rows() {
+
+ int pos;
+
+ // Loop through each row and check for rows that have two
+ // positions occupied by the human and two positions which are empty.
+ // Make sure that none of the empty positions in this row intersect
+ // with another row that also contains two positions held by the human.
+ // If so, block the row by taking the position at the intersection
+ // of these two row.
+
+ // Loop through each row.
+ for (int i=0; i<76; i++) {
+
+ // Look for a row that has two positions held by the human.
+ if (combinations[i][0] == 2 && combinations[i][1] == HUMAN) {
+
+ if (debug)
+ System.out.println(" row " + i + "has 2 positions occupied by the human");
+
+ // Mark this row with a flag.
+ combinations[i][6] = 1;
+
+ // Check each position in the row.
+ for (int j=2; j<6; j++) {
+
+ // Look for the empty positions in the row.
+ pos = combinations[i][j];
+ if (occupied[pos] == 0) {
+
+ // Loop through the rows again.
+ for (int k=0; k<76; k++) {
+
+ if (debug) System.out.println(" row " + k);
+
+ // Look for another row that has two positions held
+ // by the human (and which is unmarked.) modified
+ if (combinations[k][0] == 2 &&
+ combinations[k][1] == HUMAN &&
+ combinations[k][6] == 0) {
+
+ if (debug)
+ System.out.println("found an intersecting row: row " + k);
+
+ // Check the positions in this row and see if
+ // any match the position we're looking for. If
+ // we find a match, grab the position and return.
+ for (int l=2; l<6; l++) {
+ if (pos == combinations[k][l]) {
+ combinations[i][6] = 0;
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("block_intersecting_rows: true");
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Unmark the combination before moving on.
+ combinations[i][6] = 0;
+ }
+
+ }
+ if (debug) System.out.println("block_intersecting_rows: false");
+ return false;
+ }
+
+ /**
+ * Check for a forced win by intersecting rows. Block
+ * if necessary.
+ */
+ public boolean check_intersecting_rows2() {
+
+ int pos;
+
+ // Loop through each row and check for rows that have two
+ // positions occupied by the human and two positions which are empty.
+ // Make sure that none of the empty positions in this row intersect
+ // with another row that also contains two positions held by the human.
+ // If so, block the row by taking the position at the intersection
+ // of these two row.
+
+ // Loop through each row.
+ for (int i=0; i<76; i++) {
+
+ // Look for a row that has two positions held by the human.
+ if (combinations[i][0] == 2 && combinations[i][1] == HUMAN) {
+
+ if (debug) {
+ System.out.println(" row " + i + "has 2 positions occupied by the human");
+ }
+
+ // Mark this row with a flag.
+ combinations[i][6] = 1;
+
+ // Check each position in the row.
+ for (int j=2; j<6; j++) {
+
+ // Look for the empty positions in the row.
+ pos = combinations[i][j];
+ if (occupied[pos] == 0) {
+
+ // Loop through the rows again.
+ for (int k=0; k<76; k++) {
+
+ if (debug) System.out.println(" row " + k);
+
+ // Look for another row that has two positions held
+ // by the human (and which is unmarked.) modified
+ if (combinations[k][0] == 1 &&
+ combinations[k][1] == HUMAN &&
+ combinations[k][6] == 0) {
+
+ if (debug)
+ System.out.println("found an intersecting row: row " + k);
+
+ // Check the positions in this row and see if
+ // any match the position we're looking for. If
+ // we find a match, grab the position and return.
+ for (int l=2; l<6; l++) {
+ if (pos == combinations[k][l]) {
+ combinations[i][6] = 0;
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("check_intersecting_rows: true");
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Unmark the combination before moving on.
+ combinations[i][6] = 0;
+ }
+
+ }
+ if (debug) System.out.println("check_intersecting_rows: false");
+ return false;
+ }
+
+
+ /**
+ * Check for a forced win by intersecting rows. Block
+ * if necessary.
+ */
+ public boolean check_for_two() {
+
+ int pos;
+
+ // Loop through the rows.
+ for (int i=0; i<76; i++) {
+
+ // Look for a row that has two positions held
+ // by the human (and which is unmarked.)
+ if (combinations[i][0] == 2 &&
+ combinations[i][1] == HUMAN &&
+ combinations[i][6] == 0) {
+
+ // Take the first available spot.
+ for (int j=2; j<6; j++) {
+ pos = combinations[i][j];
+ if (occupied[pos] == 0) {
+ occupied[pos] = MACHINE;
+ positions.set(pos, MACHINE);
+ player = update_logic_arrays(pos);
+ if (debug) System.out.println("check_for_two: true");
+ return true;
+ }
+ }
+
+ }
+ }
+ if (debug) System.out.println("check_for_two: false");
+ return false;
+ }
+
+ public void undo_move() {
+
+ // Return if no moves are recorded
+ if (nmoves == 0) return;
+
+ // Set the undo flag
+ undoFlag = true;
+
+ // Undo the last two moves
+ positions.clear(moves[--nmoves]);
+ positions.clear(moves[--nmoves]);
+
+ // Undo the winner flag in the positions object
+ positions.noWinner();
+
+ // Repaint the 2D canvas.
+ canvas.repaint();
+
+ // Reset the inside/outside flags
+ inside_four_flag = false;
+ outside_four_flag = false;
+ block_chair_flag = false;
+
+ // Reset the board
+ for (int i=0; i<64; i++) {
+ occupied[i] = 0;
+ }
+
+ // Reset the inside/outside arrays
+ for (int i=0; i<18; i++) {
+ inside_four[i][0] = 0;
+ inside_four[i][1] = 0;
+ outside_four[i][0] = 0;
+ outside_four[i][1] = 0;
+ }
+
+ // Reset the faces array
+ for (int i=0; i<18; i++) {
+ faces[i][0] = 0;
+ faces[i][1] = 0;
+ }
+
+ // Reset the combinations array
+ for (int i=0; i<76; i++) {
+ combinations[i][0] = 0;
+ combinations[i][1] = 0;
+ }
+
+ if (nmoves == 0) {
+ undoFlag = false;
+ player = HUMAN;
+ return;
+ }
+
+ // Update the logic arrays
+ int pos;
+ player = HUMAN;
+ for (int i=0; i<nmoves; i++) {
+ pos = moves[i];
+ occupied[pos] = player;
+ player = update_logic_arrays(pos);
+ }
+
+ // Reset the "best picks" array
+ update_best_picks();
+
+ // Reset the player and undo flag
+ player = HUMAN;
+ undoFlag = false;
+ }
+
+ /**
+ * Update the logic arrays that keep track of positions and status.
+ * If we have a winner, stop the game.
+ */
+ public int update_logic_arrays(int pos) {
+
+ // Record the move.
+ if (!undoFlag) {
+ moves[nmoves++] = pos;
+ }
+
+ // Get the number of combinations that this position has.
+ int num_combinations = pos_to_comb[pos][0];
+
+ // Go through each combination associated with this position
+ // and update the status. If we have a winner, stop the game.
+ int comb;
+ for (int j=0; j<num_combinations; j++) {
+ comb = pos_to_comb[pos][j+1];
+ if (combinations[comb][1] != player &&
+ combinations[comb][1] != 0) {
+ combinations[comb][0] = -1;
+ }
+ else {
+ combinations[comb][0]++;
+ if (combinations[comb][0] == 4) {
+ end_time = System.currentTimeMillis();
+ time = (end_time - beg_time)/1000;
+ panel.winner(player, skill_level, nmoves, time);
+ panel.repaint();
+ canvas.repaint();
+ positions.winner();
+ return END;
+ }
+ else {
+ combinations[comb][1] = player;
+ }
+ }
+ }
+
+ // Update the best_picks array.
+ update_best_picks();
+
+ // Update the inside_four array.
+ for (int i=0; i<18; i++) {
+ for (int j=2; j<6; j++) {
+ if (pos == inside_four[i][j]) {
+ if (inside_four[i][0] == 0) {
+ inside_four[i][0] = 1;
+ inside_four[i][1] = player;
+ }
+ else if (inside_four[i][1] == player) {
+ inside_four[i][0]++;
+ inside_four[i][1] = player;
+ }
+ else {
+ inside_four[i][0] = -1;
+ }
+ }
+ }
+ }
+
+ // Update the outside_four array.
+ for (int i=0; i<18; i++) {
+ for (int j=2; j<6; j++) {
+ if (pos == outside_four[i][j]) {
+ if (outside_four[i][0] == 0) {
+ outside_four[i][0] = 1;
+ outside_four[i][1] = player;
+ }
+ else if (outside_four[i][1] == player) {
+ outside_four[i][0]++;
+ outside_four[i][1] = player;
+ }
+ else {
+ outside_four[i][0] = -1;
+ }
+ }
+ }
+ }
+
+ // Update the faces array.
+ for (int i=0; i<18; i++) {
+ for (int j=2; j<18; j++) {
+ if (pos == faces[i][j]) {
+ if (faces[i][0] == 0) {
+ faces[i][0] = 1;
+ faces[i][1] = player;
+ }
+ else if (faces[i][1] == player) {
+ faces[i][0]++;
+ }
+ else {
+ faces[i][0] = -1;
+ }
+ }
+ }
+
+ }
+
+ // Switch players.
+ if (player == HUMAN)
+ return MACHINE;
+ else
+ return HUMAN;
+ }
+
+
+ /**
+ * Start a new game.
+ */
+ public void newGame() {
+
+ // Initialize the inside/outside flags.
+ inside_four_flag = false;
+ outside_four_flag = false;
+ block_chair_flag = false;
+
+ // Initialize the inside/outside arrays.
+ for (int i=0; i<18; i++) {
+ inside_four[i][0] = 0;
+ inside_four[i][1] = 0;
+ outside_four[i][0] = 0;
+ outside_four[i][1] = 0;
+ }
+
+ // Initialize the faces array.
+ for (int i=0; i<18; i++) {
+ faces[i][0] = 0;
+ faces[i][1] = 0;
+ }
+
+ // Initialize the board.
+ for (int i=0; i<64; i++) {
+ occupied[i] = 0;
+ }
+ for (int i=0; i<76; i++) {
+ combinations[i][0] = 0;
+ combinations[i][1] = 0;
+ }
+
+ // Reset the best_picks array.
+ update_best_picks();
+
+ // Set the player with the first move.
+ player = HUMAN;
+
+ // Initialize the number of moves.
+ nmoves = 0;
+
+ // Reset the playing positions.
+ positions.newGame();
+ }
+
+
+ /**
+ * Set the skill level.
+ */
+ public void set_skill_level(int level) {
+ skill_level = level;
+ }
+
+
+ /**
+ * Set up the pos_to_comb array.
+ */
+ public void setup_pos_to_comb() {
+
+ // Set up the pos_to_comb array to point to every winning
+ // combination a given position may have.
+ int count;
+ for (int i=0; i<64; i++) {
+ count = 1;
+ pos_to_comb[i][0] = 0;
+ for (int j=0; j<76; j++) {
+ for (int k=2; k<6; k++) {
+ if (combinations[j][k] == i) {
+ pos_to_comb[i][0]++;
+ pos_to_comb[i][count++] = j;
+ }
+ }
+ }
+ }
+
+ if (debug) {
+ for (int i=0; i<64; i++) {
+ System.out.println("");
+ for (int j=0; j<8; j++) {
+ System.out.println("pos_to_comb[" + i + "][" + j + "] = " + pos_to_comb[i][j]);
+ }
+ }
+ }
+
+ }
+
+
+ /**
+ * Update the best_picks array.
+ */
+ public void update_best_picks() {
+
+ // Re-calculate the best_picks array to point to every (current) winning
+ // combination a given position may have.
+ int count;
+ for (int i=0; i<64; i++) {
+
+ count = 1;
+ best_picks[i][0] = 0;
+ if (occupied[i] == 0) {
+ for (int j=0; j<76; j++) {
+
+ if (combinations[j][0] == 0 ||
+ combinations[j][1] == MACHINE) {
+
+ for (int k=2; k<6; k++) {
+ if (combinations[j][k] == i) {
+ best_picks[i][0]++;
+ best_picks[i][count++] = j;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (debug) {
+ for (int i=0; i<64; i++) {
+ System.out.println("");
+ for (int j=0; j<8; j++) {
+ System.out.println("best_picks[" + i + "][" + j + "] = " + best_picks[i][j]);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Pick the computer's best possible move based on the number
+ * of combinations per position. Choose the position with the
+ * most combinations.
+ */
+ public void pick_best_position() {
+
+ int pos = 0;
+ int max_num = 0;
+ for (int i=0; i<64; i++) {
+ if (best_picks[i][0] > max_num &&
+ occupied[i] == 0) {
+ pos = i;
+ max_num = best_picks[i][0];
+ }
+ }
+
+ // Mark the position as MACHINE.
+ occupied[pos] = MACHINE;
+
+ positions.set(pos, MACHINE);
+
+ // Udate the logic arrays and reset the player.
+ player = update_logic_arrays(pos);
+ }
+
+
+ public boolean pick_7() {
+
+ for (int i=0; i<64; i++) {
+ if (best_picks[i][0] == 7) {
+ occupied[i] = MACHINE;
+ positions.set(i, MACHINE);
+ player = update_logic_arrays(i);
+ return true;
+ }
+ }
+ return false;
+
+ }
+
+ public void change_face() {
+ current_face = ++current_face%18;
+ }
+
+ public void label() {
+ label_flag ^= true;
+ }
+
+ public boolean unoccupied(int pos) {
+ if (occupied[pos] == UNOCCUPIED)
+ return true;
+ else
+ return false;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/four_by_four/Canvas2D.java b/src/main/java/org/jdesktop/j3d/examples/four_by_four/Canvas2D.java
new file mode 100644
index 0000000..ea63b4b
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/four_by_four/Canvas2D.java
@@ -0,0 +1,96 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.four_by_four;
+
+import java.awt.Canvas;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+
+/**
+ * Class: Canvas2D
+ *
+ * Description: Used to respond to mouse events in the 2D window.
+ *
+ * Version: 1.0
+ *
+ */
+class Canvas2D extends Canvas implements MouseListener {
+
+ Image backbuffer; // Backbuffer image
+ Graphics gc; // Graphics context of backbuffer
+ Board board; // Game board
+
+ Canvas2D(Board board) {
+ this.board = board;
+ }
+
+ public void setBuffer(Image backbuffer) {
+ this.backbuffer = backbuffer;
+ gc = backbuffer.getGraphics();
+ }
+
+ public void update(Graphics g) {
+ paint(g);
+ }
+
+ public void paint(Graphics g) {
+ if (board != null) {
+ board.render2D(gc);
+ g.drawImage(backbuffer, 0, 0, this);
+ }
+ }
+
+ public void mousePressed(MouseEvent e) {
+ board.checkSelection2D(e.getX(), e.getY(), 1);
+ repaint();
+ }
+
+ public void mouseClicked(MouseEvent e) {}
+ public void mouseReleased(MouseEvent e) {}
+ public void mouseEntered(MouseEvent e) {}
+ public void mouseExited(MouseEvent e) {}
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/four_by_four/Cube.java b/src/main/java/org/jdesktop/j3d/examples/four_by_four/Cube.java
new file mode 100644
index 0000000..2460881
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/four_by_four/Cube.java
@@ -0,0 +1,132 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.four_by_four;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.QuadArray;
+import org.jogamp.java3d.Shape3D;
+
+public class Cube extends Object {
+
+ private Shape3D shape3D;
+
+ private static final float[] verts = {
+ // Front Face
+ 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
+ -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f,
+ // Back Face
+ -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f,
+ 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f,
+ // Right Face
+ 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f,
+ 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f,
+ // Left Face
+ -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f,
+ -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f,
+ // Top Face
+ 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f,
+ -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f,
+ // Bottom Face
+ -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 static final float[] normals = {
+ // Front Face
+ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
+ // Back Face
+ 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f,
+ 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f,
+ // Right Face
+ 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
+ // Left Face
+ -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
+ -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
+ // Top Face
+ 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
+ // Bottom Face
+ 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f,
+ 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f,
+ };
+
+ public Cube(Appearance appearance) {
+
+ QuadArray quadArray = new QuadArray(24, QuadArray.COORDINATES |
+ QuadArray.NORMALS |
+ QuadArray.TEXTURE_COORDINATE_2);
+ quadArray.setCoordinates(0, verts);
+ quadArray.setNormals(0, normals);
+
+ shape3D = new Shape3D(quadArray, appearance);
+ shape3D.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
+ shape3D.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
+ shape3D.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
+ shape3D.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
+ }
+
+ public Cube(Appearance appearance, float size) {
+
+ QuadArray quadArray = new QuadArray(24, QuadArray.COORDINATES |
+ QuadArray.NORMALS);
+ for (int i=0; i<72; i++)
+ verts[i] *= size;
+
+ quadArray.setCoordinates(0, verts);
+ quadArray.setNormals(0, normals);
+
+ shape3D = new Shape3D(quadArray, appearance);
+ shape3D.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
+ shape3D.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
+ shape3D.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
+ shape3D.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
+ }
+
+ public Shape3D getChild() {
+ return shape3D;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/four_by_four/Cylinder.java b/src/main/java/org/jdesktop/j3d/examples/four_by_four/Cylinder.java
new file mode 100644
index 0000000..db13a32
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/four_by_four/Cylinder.java
@@ -0,0 +1,117 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.four_by_four;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.QuadArray;
+import org.jogamp.java3d.Shape3D;
+
+public class Cylinder {
+
+ float verts[];
+ float normals[];
+ QuadArray quad = null;
+ float div = 3.0f;
+ Shape3D shape;
+
+ public Cylinder(float x, float z, float radius, float length, int quality, Appearance a) {
+
+ if (quality < 3) quality = 3;
+
+ div = (float) quality;
+
+ verts = new float[quality*12];
+ normals = new float[quality*12];
+
+ double inc = 2.0*Math.PI/(double)div;
+ for (int i=0; i< quality; i++){
+ float z1 = radius * (float)Math.sin((double)i*inc) + z;
+ float x1 = radius * (float)Math.cos((double)i*inc) + x;
+ float z2 = radius * (float)Math.sin((double)(i+1)*inc) + z;
+ float x2 = radius * (float)Math.cos((double)(i+1)*inc) + x;
+
+ verts[12*i] = x1;
+ verts[12*i+1] = -length/2.f;
+ verts[12*i+2] = z1;
+ verts[12*i+3] = x1;
+ verts[12*i+4] = length/2.f;
+ verts[12*i+5] = z1;
+ verts[12*i+6] = x2;
+ verts[12*i+7] = length/2.f;
+ verts[12*i+8] = z2;
+ verts[12*i+9] = x2;
+ verts[12*i+10] = -length/2.f;
+ verts[12*i+11] = z2;
+
+ float nz1 = (float)Math.sin((double)i*inc);
+ float nx1 = (float)Math.cos((double)i*inc);
+ float nz2 = (float)Math.sin((double)(i+1)*inc);
+ float nx2 = (float)Math.cos((double)(i+1)*inc);
+
+ normals[12*i] = nx1;
+ normals[12*i+1] = 0.0f;
+ normals[12*i+2] = nz1;
+ normals[12*i+3] = nx1;
+ normals[12*i+4] = 0.0f;
+ normals[12*i+5] = nz1;
+ normals[12*i+6] = nx2;
+ normals[12*i+7] = 0.0f;
+ normals[12*i+8] = nz2;
+ normals[12*i+9] = nx2;
+ normals[12*i+10] = 0.0f;
+ normals[12*i+11] = nz2;
+ }
+
+ quad = new QuadArray(quality*4, QuadArray.COORDINATES |
+ QuadArray.NORMALS );
+ quad.setCoordinates(0, verts);
+ quad.setNormals(0, normals);
+ shape = new Shape3D(quad, a);
+ }
+
+ Shape3D getShape(){
+ return shape;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/four_by_four/FourByFour.html b/src/main/java/org/jdesktop/j3d/examples/four_by_four/FourByFour.html
new file mode 100644
index 0000000..db06814
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/four_by_four/FourByFour.html
@@ -0,0 +1,15 @@
+<HTML>
+<HEAD>
+<TITLE>Drag the mouse in the window</TITLE>
+</HEAD>
+<BODY BGCOLOR="#0C0C33">
+<applet align=middle codebase="../../../../.." code="org.jdesktop.j3d.examples.four_by_four.FourByFour" width=716 height=410>
+<blockquote>
+<hr>
+If you were using a Java-capable browser,
+you would see "FourByFour" instead of this paragraph.
+<hr>
+</blockquote>
+</applet>
+</BODY>
+</HTML>
diff --git a/src/main/java/org/jdesktop/j3d/examples/four_by_four/FourByFour.java b/src/main/java/org/jdesktop/j3d/examples/four_by_four/FourByFour.java
new file mode 100644
index 0000000..3f1a3e1
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/four_by_four/FourByFour.java
@@ -0,0 +1,893 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.four_by_four;
+
+import java.applet.Applet;
+import java.awt.Button;
+import java.awt.Checkbox;
+import java.awt.CheckboxGroup;
+import java.awt.Color;
+import java.awt.Image;
+import java.awt.Label;
+import java.awt.Panel;
+import java.awt.TextArea;
+import java.awt.TextField;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.StreamTokenizer;
+import java.net.URL;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingLeaf;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.View;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * Class FourByFour
+ *
+ * Description: High level class for the game FourByFour
+ *
+ * Version: 1.2
+ *
+ */
+public class FourByFour extends Applet implements ActionListener {
+
+ // To write scores to scores file
+ private static final boolean writeScoresFile = false;
+
+ String host; // Host from which this applet came from
+ int port; // Port number for writing high scores
+ Image backbuffer2D; // Backbuffer image used for 2D double buffering
+ int width, height; // Size of the graphics window in pixels
+ int score; // Final game score
+ int level_weight; // Weighting factor for skill level
+ int move_weight; // Weighting factor for number of moves to win
+ int time_weight; // Weighting factor for amount of time it took to win
+ int skill_level; // Skill level, 0 - 4
+ Canvas2D canvas2D; // 2D rendering canvas
+ Canvas3D canvas3D; // 3D rendering canvas
+ Board board; // Game board object
+ Panel b_container; // Container to hold the buttons
+ Panel c_container; // Container to hold the canvas
+ Panel l_container; // Container to hold the labels
+ Panel skill_panel; // Panel to hold skill levels
+ Panel instruct_panel; // Panel to hold instructions
+ Panel winner_panel; // Panel to hold winner announcement
+ Panel high_panel; // Panel to hold high scores
+ Button instruct_button; // Instructions button
+ Button new_button; // New Game button
+ Button skill_button; // Skill Level button
+ Button high_button; // High Scores button
+ Button undo_button; // Undo Move button
+ Label skill_label; // Label on skill panel
+ Label winner_label; // Label on winner panel
+ Label winner_score_label; // Score label on winner panel
+ Label winner_name_label; // Name label on winner panel
+ Label winner_top_label; // Top 20 label on winner panel
+ Label high_label; // High score label
+ Label high_places[]; // Labels to hold places
+ Label high_names[]; // Labels to hold names
+ Label high_scores[]; // Labels to hold scores
+ TextArea instruct_text; // TextArea object that holds instructions
+ TextArea high_text; // TextArea object that holds top 20 scores
+ TextField winner_name; // TextField object that holds winner's name
+ Button instruct_return_button; // Return button for instruction panel
+ Button skill_return_button; // Return button for skill level panel
+ Button winner_return_button; // Return button for winner panel
+ Button high_return_button; // Return button for high scores panel
+ CheckboxGroup group; // CheckboxGroup object for skill level panel
+ InputStream inStream; // Input stream for reading instructions and high scores
+ static boolean appletFlag = true; // Applet flag
+ boolean winner_flag = false; // Winner flag
+ byte text[]; // Temporary storage area for reading instructions file
+ byte outText[]; // Temporary storage area for writing high scores file
+ String textString; // Storage area for instructions
+ String scoresString; // String used for writing high scores file
+ int places[]; // Storage area for high score places
+ int scores[]; // Storage area for high score scores
+ String names[]; // Storage area for high score names
+ Positions positions; // Positions object, used to render player positions
+
+ private SimpleUniverse universe = null;
+
+ /**
+ * Initialization
+ */
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+
+ // Set the port number.
+ port = 4111;
+
+ // Set the graphics window size.
+ width = 350;
+ height = 350;
+
+ // Set the weighting factors used for scoring.
+ level_weight = 1311;
+ move_weight = 111;
+ time_weight = 1000;
+
+ // Create the "base" color for the AWT components.
+ setBackground(new Color(200, 200, 200));
+
+ // Read the instructions file.
+ if (appletFlag) {
+
+ // Get the host from which this applet came.
+ host = getCodeBase().getHost();
+
+ try {
+ URL instrURL = Resources.getResource("four_by_four/instructions.txt");
+ inStream = new BufferedInputStream((instrURL).openStream(), 8192);
+ text = new byte[5000];
+ int character = inStream.read();
+ int count = 0;
+ while (character != -1) {
+ text[count++] = (byte) character;
+ character = inStream.read();
+ }
+ textString = new String(text);
+ inStream.close();
+ }
+ catch(Exception e) {
+ System.out.println("Error: " + e.toString());
+ }
+ }
+ else {
+
+ try {
+ URL instrURL = Resources.getResource("four_by_four/instructions.txt");
+ inStream = new BufferedInputStream((instrURL).openStream(), 8192);
+ text = new byte[5000];
+ int character = inStream.read();
+ int count = 0;
+ while (character != -1) {
+ text[count++] = (byte) character;
+ character = inStream.read();
+ }
+ textString = new String(text);
+ inStream.close();
+ }
+ catch(Exception e) {
+ System.out.println("Error: " + e.toString());
+ }
+ }
+
+ // Read the high-scores file.
+ places = new int[20];
+ scores = new int[20];
+ names = new String[20];
+ if (appletFlag) {
+ try {
+ URL scoreURL = Resources.getResource("four_by_four/scores.txt");
+ inStream = new BufferedInputStream((scoreURL).openStream(), 8192);
+ Reader read = new BufferedReader(new InputStreamReader(inStream));
+ StreamTokenizer st = new StreamTokenizer(read);
+ st.whitespaceChars(32,44);
+ st.eolIsSignificant(false);
+
+ int count = 0;
+ int token = st.nextToken();
+ boolean scoreFlag = true;
+ String string;
+ while (count<20) {
+ places[count] = (int) st.nval;
+ string = new String("");
+ token = st.nextToken();
+ while (token == StreamTokenizer.TT_WORD) {
+ string += st.sval;
+ string += " ";
+ token = st.nextToken();
+ }
+ names[count] = string;
+ scores[count] = (int) st.nval;
+ token = st.nextToken();
+ count++;
+ }
+ inStream.close();
+ }
+ catch(Exception e) {
+ System.out.println("Error: " + e.toString());
+ }
+ }
+ else {
+ try {
+ URL scoreURL = Resources.getResource("four_by_four/scores.txt");
+ inStream = new BufferedInputStream((scoreURL).openStream(), 8192);
+ Reader read = new BufferedReader(new InputStreamReader(inStream));
+ StreamTokenizer st = new StreamTokenizer(read);
+ st.whitespaceChars(32,44);
+ st.eolIsSignificant(false);
+
+ int count = 0;
+ int token = st.nextToken();
+ boolean scoreFlag = true;
+ String string;
+ while (count<20) {
+ places[count] = (int) st.nval;
+ string = new String("");
+ token = st.nextToken();
+ while (token == StreamTokenizer.TT_WORD) {
+ string += st.sval;
+ string += " ";
+ token = st.nextToken();
+ }
+ names[count] = string;
+ scores[count] = (int) st.nval;
+ token = st.nextToken();
+ count++;
+ }
+ inStream.close();
+ }
+ catch(Exception e) {
+ System.out.println("Error: " + e.toString());
+ }
+ }
+
+ // The positions object sets up the switch nodes which
+ // control the rendering of the player's positions.
+ positions = new Positions();
+
+ // Create the game board object which is responsible
+ // for keeping track of the moves on the game board
+ // and determining what move the computer should make.
+ board = new Board(this, positions, width, height);
+ positions.setBoard(board);
+
+ // Create a 2D graphics canvas.
+ canvas2D = new Canvas2D(board);
+ canvas2D.setSize(width, height);
+ canvas2D.setLocation(width+10, 5);
+ canvas2D.addMouseListener(canvas2D);
+ board.setCanvas(canvas2D);
+
+ // Create the 2D backbuffer
+ backbuffer2D = createImage(width, height);
+ canvas2D.setBuffer(backbuffer2D);
+
+ // Create a 3D graphics canvas.
+ canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
+ canvas3D.setSize(width, height);
+ canvas3D.setLocation(5, 5);
+
+ // Create the scene branchgroup.
+ BranchGroup scene3D = createScene3D();
+
+ // Create a universe with the Java3D universe utility.
+ universe = new SimpleUniverse(canvas3D);
+ universe.addBranchGraph(scene3D);
+
+ // Use parallel projection.
+ View view = universe.getViewer().getView();
+ view.setProjectionPolicy(View.PARALLEL_PROJECTION);
+
+ // Set the universe Transform3D object.
+ TransformGroup tg =
+ universe.getViewingPlatform().getViewPlatformTransform();
+ Transform3D transform = new Transform3D();
+ transform.set(65.f, new Vector3f(0.0f, 0.0f, 400.0f));
+ tg.setTransform(transform);
+
+ // Create the canvas container.
+ c_container = new Panel();
+ c_container.setSize(720, 360);
+ c_container.setLocation(0, 0);
+ c_container.setVisible(true);
+ c_container.setLayout(null);
+ add(c_container);
+
+ // Add the 2D and 3D canvases to the container.
+ c_container.add(canvas2D);
+ c_container.add(canvas3D);
+
+ // Turn off the layout manager, widgets will be sized
+ // and positioned explicitly.
+ setLayout(null);
+
+ // Create the button container.
+ b_container = new Panel();
+ b_container.setSize(720, 70);
+ b_container.setLocation(0, 360);
+ b_container.setVisible(true);
+ b_container.setLayout(null);
+
+ // Create the buttons.
+ instruct_button = new Button("Instructions");
+ instruct_button.setSize(135, 25);
+ instruct_button.setLocation(10, 10);
+ instruct_button.setVisible(true);
+ instruct_button.addActionListener(this);
+
+ new_button = new Button("New Game");
+ new_button.setSize(135, 25);
+ new_button.setLocation(150, 10);
+ new_button.setVisible(true);
+ new_button.addActionListener(this);
+
+ undo_button = new Button("Undo Move");
+ undo_button.setSize(135, 25);
+ undo_button.setLocation(290, 10);
+ undo_button.setVisible(true);
+ undo_button.addActionListener(this);
+
+ skill_button = new Button("Skill Level");
+ skill_button.setSize(135, 25);
+ skill_button.setLocation(430, 10);
+ skill_button.setVisible(true);
+ skill_button.addActionListener(this);
+
+ high_button = new Button("High Scores");
+ high_button.setSize(135, 25);
+ high_button.setLocation(570, 10);
+ high_button.setVisible(true);
+ high_button.addActionListener(this);
+
+ b_container.add(new_button);
+ b_container.add(undo_button);
+ b_container.add(skill_button);
+ b_container.add(high_button);
+ b_container.add(instruct_button);
+
+ // Add the button container to the applet.
+ add(b_container);
+
+ // Create the "Skill Level" dialog box.
+ skill_panel = new Panel();
+ skill_panel.setSize(400, 300);
+ skill_panel.setLocation(200, 20);
+ skill_panel.setLayout(null);
+
+ skill_label = new Label("Pick your skill level:");
+ skill_label.setSize(200, 25);
+ skill_label.setLocation(25, 20);
+ skill_label.setVisible(true);
+ skill_panel.add(skill_label);
+
+ group = new CheckboxGroup();
+ Checkbox skill_1 = new Checkbox("Babe in the Woods ", group, false);
+ Checkbox skill_2 = new Checkbox("Walk and Chew Gum ", group, false);
+ Checkbox skill_3 = new Checkbox("Jeopardy Contestant ", group, false);
+ Checkbox skill_4 = new Checkbox("Rocket Scientist ", group, false);
+ Checkbox skill_5 = new Checkbox("Be afraid, be very afraid", group, true);
+ skill_1.setSize(170, 25);
+ skill_1.setLocation(80, 60);
+ skill_1.setVisible(true);
+ skill_2.setSize(170, 25);
+ skill_2.setLocation(80, 100);
+ skill_2.setVisible(true);
+ skill_3.setSize(170, 25);
+ skill_3.setLocation(80, 140);
+ skill_3.setVisible(true);
+ skill_4.setSize(170, 25);
+ skill_4.setLocation(80, 180);
+ skill_4.setVisible(true);
+ skill_5.setSize(170, 25);
+ skill_5.setLocation(80, 220);
+ skill_5.setVisible(true);
+ skill_return_button = new Button("Return");
+ skill_return_button.setSize(120, 25);
+ skill_return_button.setLocation(300, 370);
+ skill_return_button.setVisible(false);
+ skill_return_button.addActionListener(this);
+ skill_panel.add(skill_1);
+ skill_panel.add(skill_2);
+ skill_panel.add(skill_3);
+ skill_panel.add(skill_4);
+ skill_panel.add(skill_5);
+ skill_panel.setVisible(false);
+ add(skill_return_button);
+ add(skill_panel);
+
+ // Create the "Instructions" panel.
+ instruct_return_button = new Button("Return");
+ instruct_return_button.setLocation(300, 370);
+ instruct_return_button.setSize(120, 25);
+ instruct_return_button.setVisible(false);
+ instruct_return_button.addActionListener(this);
+ instruct_text =
+ new TextArea(textString, 100, 200, TextArea.SCROLLBARS_VERTICAL_ONLY);
+ instruct_text.setSize(715, 350);
+ instruct_text.setLocation(0, 0);
+ instruct_text.setVisible(false);
+ add(instruct_text);
+
+ add(instruct_return_button);
+
+ high_panel = new Panel();
+ high_panel.setSize(715, 350);
+ high_panel.setLocation(0, 0);
+ high_panel.setVisible(false);
+ high_panel.setLayout(null);
+
+ high_label = new Label("High Scores");
+ high_label.setLocation(330, 5);
+ high_label.setSize(200, 30);
+ high_label.setVisible(true);
+ high_panel.add(high_label);
+
+ high_places = new Label[20];
+ high_names = new Label[20];
+ high_scores = new Label[20];
+ for (int i=0; i<20; i++) {
+ high_places[i] = new Label(Integer.toString(i+1));
+ high_places[i].setSize(20, 30);
+ high_places[i].setVisible(true);
+ high_names[i] = new Label(names[i]);
+ high_names[i].setSize(150, 30);
+ high_names[i].setVisible(true);
+ high_scores[i] = new Label(Integer.toString(scores[i]));
+ high_scores[i].setSize(150, 30);
+ high_scores[i].setVisible(true);
+ if (i<10) {
+ high_places[i].setLocation(70, i*30+40);
+ high_names[i].setLocation(100, i*30+40);
+ high_scores[i].setLocation(260, i*30+40);
+ }
+ else {
+ high_places[i].setLocation(425, (i-10)*30+40);
+ high_names[i].setLocation(455, (i-10)*30+40);
+ high_scores[i].setLocation(615, (i-10)*30+40);
+ }
+ high_panel.add(high_places[i]);
+ high_panel.add(high_names[i]);
+ high_panel.add(high_scores[i]);
+ }
+ high_return_button = new Button("Return");
+ high_return_button.setSize(120, 25);
+ high_return_button.setLocation(300, 370);
+ high_return_button.setVisible(false);
+ high_return_button.addActionListener(this);
+ add(high_return_button);
+ add(high_panel);
+
+ // Create the "Winner" dialog box
+ winner_panel = new Panel();
+ winner_panel.setLayout(null);
+ winner_panel.setSize(600, 500);
+ winner_panel.setLocation(0, 0);
+ winner_return_button = new Button("Return");
+ winner_return_button.setSize(120, 25);
+ winner_return_button.setLocation(300, 360);
+ winner_return_button.addActionListener(this);
+ winner_panel.add(winner_return_button);
+ winner_label = new Label("");
+ winner_label.setSize(200, 30);
+ winner_label.setLocation(270, 110);
+ winner_score_label = new Label("");
+ winner_score_label.setSize(200, 30);
+ winner_top_label = new Label("You have a score in the top 20.");
+ winner_top_label.setSize(200, 25);
+ winner_top_label.setLocation(260, 185);
+ winner_top_label.setVisible(false); winner_name_label = new Label("Enter your name here:");
+ winner_name_label.setSize(150, 25);
+ winner_name_label.setLocation(260, 210);
+ winner_name_label.setVisible(false);
+ winner_name = new TextField("");
+ winner_name.setSize(200, 30);
+ winner_name.setLocation(260, 240);
+ winner_name.setVisible(false);
+ winner_panel.add(winner_label);
+ winner_panel.add(winner_score_label);
+ winner_panel.add(winner_top_label);
+ winner_panel.add(winner_name_label);
+ winner_panel.add(winner_name);
+ winner_panel.setVisible(false);
+ add(winner_panel);
+ }
+
+ public void destroy() {
+ universe.cleanup();
+ }
+
+ /**
+ * Create the scenegraph for the 3D view.
+ */
+ public BranchGroup createScene3D() {
+
+ // Define colors
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f red = new Color3f(0.80f, 0.20f, 0.2f);
+ Color3f ambient = new Color3f(0.25f, 0.25f, 0.25f);
+ Color3f diffuse = new Color3f(0.7f, 0.7f, 0.7f);
+ Color3f specular = new Color3f(0.9f, 0.9f, 0.9f);
+ Color3f ambientRed = new Color3f(0.2f, 0.05f, 0.0f);
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+
+ // Create the branch group
+ BranchGroup branchGroup = new BranchGroup();
+
+ // Create the bounding leaf node
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 1000.0);
+ BoundingLeaf boundingLeaf = new BoundingLeaf(bounds);
+ branchGroup.addChild(boundingLeaf);
+
+ // Create the background
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ branchGroup.addChild(bg);
+
+ // Create the ambient light
+ AmbientLight ambLight = new AmbientLight(white);
+ ambLight.setInfluencingBounds(bounds);
+ branchGroup.addChild(ambLight);
+
+ // Create the directional light
+ Vector3f dir = new Vector3f(-1.0f, -1.0f, -1.0f);
+ DirectionalLight dirLight = new DirectionalLight(white, dir);
+ dirLight.setInfluencingBounds(bounds);
+ branchGroup.addChild(dirLight);
+
+ // Create the pole appearance
+ Material poleMaterial =
+ new Material(ambient, black, diffuse, specular, 110.f);
+ poleMaterial.setLightingEnable(true);
+ Appearance poleAppearance = new Appearance();
+ poleAppearance.setMaterial(poleMaterial);
+
+ // Create the transform group node
+ TransformGroup transformGroup = new TransformGroup();
+ transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ branchGroup.addChild(transformGroup);
+
+ // Create the poles
+ Poles poles = new Poles(poleAppearance);
+ transformGroup.addChild(poles.getChild());
+
+ // Add the position markers to the transform group
+ transformGroup.addChild(positions.getChild());
+
+ // Let the positions object know about the transform group
+ positions.setTransformGroup(transformGroup);
+
+ // Create the mouse pick and drag behavior node
+ PickDragBehavior behavior = new PickDragBehavior(canvas2D, canvas3D, positions,
+ branchGroup, transformGroup);
+ behavior.setSchedulingBounds(bounds);
+ transformGroup.addChild(behavior);
+
+ return branchGroup;
+ }
+
+ public void actionPerformed (ActionEvent event) {
+
+ Object target = event.getSource();
+
+ // Process the button events.
+ if (target == skill_return_button) {
+ skill_panel.setVisible(false);
+ skill_return_button.setVisible(false);
+ c_container.setVisible(true);
+ b_container.setVisible(true);
+ newGame();
+ }
+ else if (target == winner_return_button) {
+ if (winner_flag) {
+ String name = winner_name.getText();
+ String tmp_name = new String("");
+ int tmp_score = 0;
+ boolean insert_flag = false;
+ winner_flag = false;
+ for (int i=0; i<20; i++) {
+ if (insert_flag) {
+ name = names[i];
+ score = scores[i];
+ names[i] = tmp_name;
+ scores[i] = tmp_score;
+ tmp_name = name;
+ tmp_score = score;
+ }
+ if (!insert_flag && score > scores[i]) {
+ tmp_name = names[i];
+ tmp_score = scores[i];
+ scores[i] = score;
+ names[i] = name;
+ insert_flag = true;
+ }
+ high_names[i].setText(names[i]);
+ high_scores[i].setText(Integer.toString(scores[i]));
+ }
+ scoresString = new String("");
+ int place;
+ for (int i=0; i<20; i++) {
+ place = (int) places[i];
+ scoresString += Integer.toString(place);
+ scoresString += "\t";
+ scoresString += names[i];
+ scoresString += " ";
+ scoresString += Integer.toString(scores[i]);
+ scoresString += "\n";
+ }
+
+ if(writeScoresFile) {
+ if (appletFlag) {
+ try {
+ OutputStreamWriter outFile =
+ new OutputStreamWriter(new FileOutputStream("scores.txt"));
+ outFile.write(scoresString);
+ outFile.flush();
+ outFile.close();
+ outFile = null;
+ } catch (IOException ioe) {
+ System.out.println("Error: " + ioe.toString());
+ } catch (Exception e) {
+ System.out.println("Error: " + e.toString());
+ }
+
+ } else {
+
+ try {
+
+ OutputStreamWriter outFile =
+ new OutputStreamWriter(new FileOutputStream("scores.txt"));
+ outFile.write(scoresString);
+ outFile.flush();
+ outFile.close();
+ outFile = null;
+ } catch (IOException ioe) {
+ System.out.println("Error: " + ioe.toString());
+ }
+ }
+ }
+ }
+ winner_panel.setVisible(false);
+ winner_return_button.setVisible(false);
+ winner_label.setVisible(false);
+ winner_score_label.setVisible(false);
+ winner_name_label.setVisible(false);
+ winner_top_label.setVisible(false);
+ winner_name.setVisible(false);
+ c_container.setVisible(true);
+ b_container.setVisible(true);
+ }
+ else if (target == high_return_button) {
+ high_return_button.setVisible(false);
+ high_panel.setVisible(false);
+ c_container.setVisible(true);
+ b_container.setVisible(true);
+ }
+ else if (target == instruct_return_button) {
+ instruct_text.setVisible(false);
+ instruct_return_button.setVisible(false);
+ instruct_text.repaint();
+ c_container.setVisible(true);
+ b_container.setVisible(true);
+ }
+ else if (target == undo_button) {
+ board.undo_move();
+ canvas2D.repaint();
+ }
+ else if (target == instruct_button) {
+ c_container.setVisible(false);
+ b_container.setVisible(false);
+ instruct_text.setVisible(true);
+ instruct_return_button.setVisible(true);
+ }
+ else if (target == new_button) {
+ newGame();
+ }
+ else if (target == skill_button) {
+ c_container.setVisible(false);
+ b_container.setVisible(false);
+ skill_panel.setVisible(true);
+ skill_return_button.setVisible(true);
+ }
+ else if (target == high_button) {
+ // Read the high scores file.
+ if (appletFlag) {
+ try {
+ URL scoreURL = Resources.getResource("four_by_four/scores.txt");
+ inStream = new BufferedInputStream(scoreURL.openStream(), 8192);
+ Reader read = new BufferedReader(new InputStreamReader(inStream));
+ StreamTokenizer st = new StreamTokenizer(read);
+ st.whitespaceChars(32,44);
+ st.eolIsSignificant(false);
+
+ int count = 0;
+ int token = st.nextToken();
+ boolean scoreFlag = true;
+ String string;
+ while (count<20) {
+ places[count] = (int) st.nval;
+ string = new String("");
+ token = st.nextToken();
+ while (token == StreamTokenizer.TT_WORD) {
+ string += st.sval;
+ string += " ";
+ token = st.nextToken();
+ }
+ names[count] = string;
+ scores[count] = (int) st.nval;
+ token = st.nextToken();
+ count++;
+ }
+ inStream.close();
+ }
+ catch(Exception ioe) {
+ System.out.println("Error: " + ioe.toString());
+ }
+ }
+ else {
+ try {
+ URL scoreURL = Resources.getResource("four_by_four/scores.txt");
+ inStream = new BufferedInputStream(scoreURL.openStream(), 8192);
+ Reader read = new BufferedReader(new InputStreamReader(inStream));
+ StreamTokenizer st = new StreamTokenizer(read);
+ st.whitespaceChars(32,44);
+ st.eolIsSignificant(false);
+
+ int count = 0;
+ int token = st.nextToken();
+ boolean scoreFlag = true;
+ String string;
+ while (count<20) {
+ places[count] = (int) st.nval;
+ string = new String("");
+ token = st.nextToken();
+ while (token == StreamTokenizer.TT_WORD) {
+ string += st.sval;
+ string += " ";
+ token = st.nextToken();
+ }
+ names[count] = string;
+ scores[count] = (int) st.nval;
+ token = st.nextToken();
+ count++;
+ }
+ inStream.close();
+ }
+ catch(Exception ioe) {
+ System.out.println("Error: " + ioe.toString());
+ }
+ }
+ c_container.setVisible(false);
+ b_container.setVisible(false);
+ high_panel.setVisible(true);
+ high_return_button.setVisible(true);
+ }
+
+ Checkbox box = group.getSelectedCheckbox();
+ String label = box.getLabel();
+ if (label.equals("Babe in the Woods ")) {
+ board.set_skill_level(0);
+ }
+ else if (label.equals("Walk and Chew Gum ")) {
+ board.set_skill_level(1);
+ }
+ else if (label.equals("Jeopardy Contestant ")) {
+ board.set_skill_level(2);
+ }
+ else if (label.equals("Rocket Scientist ")) {
+ board.set_skill_level(3);
+ }
+ else if (label.equals("Be afraid, be very afraid")) {
+ board.set_skill_level(4);
+ }
+ }
+
+ public void newGame() {
+ board.newGame();
+ canvas2D.repaint();
+ }
+
+ public void start() {
+ if (appletFlag) showStatus("FourByFour");
+ }
+
+ public void winner(int player, int level, int nmoves, long time) {
+
+ if (player == 1) {
+ score = level * level_weight +
+ (66 - nmoves) * move_weight -
+ (int) Math.min(time * time_weight, 5000);
+ winner_label.setText("Game over, you win!");
+ winner_label.setLocation(290, 90);
+ winner_score_label.setText("Score = " + score);
+ winner_score_label.setVisible(true);
+ winner_score_label.setLocation(315, 120);
+ if (score > scores[19]) {
+ winner_name_label.setVisible(true);
+ winner_top_label.setVisible(true);
+ winner_name.setVisible(true);
+ winner_flag = true;
+ }
+ }
+ else {
+ winner_label.setText("Game over, the computer wins!");
+ winner_label.setLocation(250, 150);
+ }
+ c_container.setVisible(false);
+ b_container.setVisible(false);
+ winner_panel.setVisible(true);
+ winner_label.setVisible(true);
+ winner_return_button.setVisible(true);
+ repaint();
+ }
+
+ /**
+ * Inner class used to "kill" the window when running as
+ * an application.
+ */
+ static class killAdapter extends WindowAdapter {
+ public void windowClosing(WindowEvent event) {
+ System.exit(0);
+ }
+ }
+
+ /**
+ * Main method, only used when running as an application.
+ */
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ FourByFour.appletFlag = false;
+ new MainFrame(new FourByFour(), 730, 450);
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/four_by_four/ID.java b/src/main/java/org/jdesktop/j3d/examples/four_by_four/ID.java
new file mode 100644
index 0000000..062f69a
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/four_by_four/ID.java
@@ -0,0 +1,61 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.four_by_four;
+
+class ID {
+ int id;
+
+ public ID(int id) {
+ this.id = id;
+ }
+
+ public int get() {
+ return id;
+ }
+
+ public void set(int id) {
+ this.id = id;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/four_by_four/PickDragBehavior.java b/src/main/java/org/jdesktop/j3d/examples/four_by_four/PickDragBehavior.java
new file mode 100644
index 0000000..697e934
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/four_by_four/PickDragBehavior.java
@@ -0,0 +1,234 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.four_by_four;
+
+import java.awt.AWTEvent;
+import java.awt.event.MouseEvent;
+import java.util.Enumeration;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.CapabilityNotSetException;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Node;
+import org.jogamp.java3d.PickRay;
+import org.jogamp.java3d.SceneGraphPath;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.WakeupCriterion;
+import org.jogamp.java3d.WakeupOnAWTEvent;
+import org.jogamp.java3d.WakeupOr;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3d;
+
+/**
+ * Class: PickDragBehavior
+ *
+ * Description: Used to respond to mouse pick and drag events
+ * in the 3D window.
+ *
+ * Version: 1.0
+ *
+ */
+public class PickDragBehavior extends Behavior {
+
+ WakeupCriterion[] mouseEvents;
+ WakeupOr mouseCriterion;
+ int x, y;
+ int x_last, y_last;
+ double x_angle, y_angle;
+ double x_factor, y_factor;
+ Transform3D modelTrans;
+ Transform3D transformX;
+ Transform3D transformY;
+ TransformGroup transformGroup;
+ BranchGroup branchGroup;
+ Canvas2D canvas2D;
+ Canvas3D canvas3D;
+ Positions positions;
+ PickRay pickRay = new PickRay();
+ SceneGraphPath sceneGraphPath[];
+ Appearance highlight;
+ boolean parallel;
+
+ PickDragBehavior(Canvas2D canvas2D, Canvas3D canvas3D, Positions positions,
+ BranchGroup branchGroup, TransformGroup transformGroup) {
+
+ this.canvas2D = canvas2D;
+ this.canvas3D = canvas3D;
+ this.positions = positions;
+ this.branchGroup = branchGroup;
+ this.transformGroup = transformGroup;
+
+ modelTrans = new Transform3D();
+ transformX = new Transform3D();
+ transformY = new Transform3D();
+
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f green = new Color3f(0.0f, 1.0f, 0.0f);
+
+ highlight = new Appearance();
+ highlight.setMaterial(new Material(green, black, green, white, 80.f));
+
+ parallel = true;
+ }
+
+ public void initialize() {
+ x = 0;
+ y = 0;
+ x_last = 0;
+ y_last = 0;
+ x_angle = 0;
+ y_angle = 0;
+ x_factor = .02;
+ y_factor = .02;
+
+ mouseEvents = new WakeupCriterion[2];
+ mouseEvents[0] = new WakeupOnAWTEvent(MouseEvent.MOUSE_DRAGGED);
+ mouseEvents[1] = new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED);
+ mouseCriterion = new WakeupOr(mouseEvents);
+ wakeupOn (mouseCriterion);
+ }
+
+ public void processStimulus (Enumeration criteria) {
+ WakeupCriterion wakeup;
+ AWTEvent[] event;
+ int id;
+ int dx, dy;
+
+ while (criteria.hasMoreElements()) {
+ wakeup = (WakeupCriterion) criteria.nextElement();
+ if (wakeup instanceof WakeupOnAWTEvent) {
+ event = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
+ for (int i=0; i<event.length; i++) {
+ id = event[i].getID();
+ if (id == MouseEvent.MOUSE_DRAGGED) {
+
+ x = ((MouseEvent)event[i]).getX();
+ y = ((MouseEvent)event[i]).getY();
+
+ dx = x - x_last;
+ dy = y - y_last;
+
+ x_angle = dy * y_factor;
+ y_angle = dx * x_factor;
+
+ transformX.rotX(x_angle);
+ transformY.rotY(y_angle);
+
+ modelTrans.mul(transformX, modelTrans);
+ modelTrans.mul(transformY, modelTrans);
+
+ transformGroup.setTransform(modelTrans);
+
+ x_last = x;
+ y_last = y;
+ }
+ else if (id == MouseEvent.MOUSE_PRESSED) {
+
+ x = x_last = ((MouseEvent)event[i]).getX();
+ y = y_last = ((MouseEvent)event[i]).getY();
+
+ Point3d eyePos = new Point3d();
+ canvas3D.getCenterEyeInImagePlate(eyePos);
+
+ Point3d mousePos = new Point3d();
+ canvas3D.getPixelLocationInImagePlate(x, y, mousePos);
+
+ Transform3D transform3D = new Transform3D();
+ canvas3D.getImagePlateToVworld(transform3D);
+
+ transform3D.transform(eyePos);
+ transform3D.transform(mousePos);
+
+ Vector3d mouseVec;
+ if (parallel) {
+ mouseVec = new Vector3d(0.f, 0.f, -1.f);
+ }
+ else {
+ mouseVec = new Vector3d();
+ mouseVec.sub(mousePos, eyePos);
+ mouseVec.normalize();
+ }
+
+ pickRay.set(mousePos, mouseVec);
+ sceneGraphPath = branchGroup.pickAllSorted(pickRay);
+
+ if (sceneGraphPath != null) {
+ for (int j=0; j<sceneGraphPath.length; j++) {
+ if (sceneGraphPath[j] != null) {
+ Node node = sceneGraphPath[j].getObject();
+ if (node instanceof Shape3D) {
+ try {
+ ID posID = (ID) node.getUserData();
+ if (posID != null) {
+ int pos = posID.get();
+ positions.set(pos, Positions.HUMAN);
+ canvas2D.repaint();
+ break;
+ }
+ }
+ catch (CapabilityNotSetException e) {
+ // Catch all CapabilityNotSet exceptions and
+ // throw them away, prevents renderer from
+ // locking up when encountering "non-selectable"
+ // objects.
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ wakeupOn (mouseCriterion);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/four_by_four/Poles.java b/src/main/java/org/jdesktop/j3d/examples/four_by_four/Poles.java
new file mode 100644
index 0000000..47ba07e
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/four_by_four/Poles.java
@@ -0,0 +1,80 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.four_by_four;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Group;
+
+/**
+ * Class: Poles
+ *
+ * Description: Creates the "poles" in the 3D window.
+ *
+ * Version: 1.0
+ *
+ */
+public class Poles extends Object {
+
+ private Group group;
+
+ public Poles(Appearance appearance) {
+ float x = -30.0f;
+ float z = -30.0f;
+ group = new Group();
+ for(int i=0; i<4; i++) {
+ for(int j=0; j<4; j++) {
+ Cylinder c = new Cylinder(x, z, 1.0f, 60.0f, 10, appearance);
+ group.addChild(c.getShape());
+ x += 20.0f;
+ }
+ x = -30.0f;
+ z += 20.0f;
+ }
+ }
+
+ public Group getChild() {
+ return group;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/four_by_four/Positions.java b/src/main/java/org/jdesktop/j3d/examples/four_by_four/Positions.java
new file mode 100644
index 0000000..4f5d927
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/four_by_four/Positions.java
@@ -0,0 +1,319 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.four_by_four;
+
+import java.util.BitSet;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Switch;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * Class: Positions
+ *
+ * Description: Creates the position markers.
+ *
+ * Version: 1.0
+ *
+ */
+public class Positions extends Object {
+
+ final static int UNOCCUPIED = 0;
+ final static int HUMAN = 1;
+ final static int MACHINE = 2;
+ final static int END = 3;
+
+ private Vector3f point[];
+ private Switch posSwitch;
+ private Switch humanSwitch;
+ private Switch machineSwitch;
+ private BitSet posMask;
+ private BitSet humanMask;
+ private BitSet machineMask;
+ private Group group;
+ private Material redMat;
+ private Material blueMat;
+ private Material yellowMat;
+ private Material whiteMat;
+ private Appearance redApp;
+ private Appearance blueApp;
+ private Appearance yellowApp;
+ private Appearance whiteApp;
+ private Board board;
+ private Sphere posSphere[];
+ private BigCube cube[];
+ private TransformGroup tgroup;
+ private boolean winnerFlag = false;
+
+ public Positions() {
+
+ // Define colors for lighting
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f red = new Color3f(0.9f, 0.1f, 0.2f);
+ Color3f blue = new Color3f(0.3f, 0.3f, 0.8f);
+ Color3f yellow = new Color3f(1.0f, 1.0f, 0.0f);
+ Color3f ambRed = new Color3f(0.3f, 0.03f, 0.03f);
+ Color3f ambBlue = new Color3f(0.03f, 0.03f, 0.3f);
+ Color3f ambYellow = new Color3f(0.3f, 0.3f, 0.03f);
+ Color3f ambWhite = new Color3f(0.3f, 0.3f, 0.3f);
+ Color3f specular = new Color3f(1.0f, 1.0f, 1.0f);
+
+ // Create the red appearance node
+ redMat= new Material(ambRed, black, red, specular, 100.f);
+ redMat.setLightingEnable(true);
+ redApp = new Appearance();
+ redApp.setMaterial(redMat);
+
+ // Create the blue appearance node
+ blueMat= new Material(ambBlue, black, blue, specular, 100.f);
+ blueMat.setLightingEnable(true);
+ blueApp = new Appearance();
+ blueApp.setMaterial(blueMat);
+
+ // Create the yellow appearance node
+ yellowMat= new Material(ambYellow, black, yellow, specular, 100.f);
+ yellowMat.setLightingEnable(true);
+ yellowApp = new Appearance();
+ yellowApp.setMaterial(yellowMat);
+
+ // Create the white appearance node
+ whiteMat= new Material(ambWhite, black, white, specular, 100.f);
+ whiteMat.setLightingEnable(true);
+ whiteApp = new Appearance();
+ whiteApp.setMaterial(whiteMat);
+
+ // Load the point array with the offset (coordinates) for each of
+ // the 64 positions.
+ point = new Vector3f[64];
+ int count = 0;
+ for (int i=-30; i<40; i+=20) {
+ for (int j=-30; j<40; j+=20) {
+ for (int k=-30; k<40; k+=20) {
+ point[count] = new Vector3f((float) k, (float) j, (float) i);
+ count++;
+ }
+ }
+ }
+
+ // Create the switch nodes
+ posSwitch = new Switch(Switch.CHILD_MASK);
+ humanSwitch = new Switch(Switch.CHILD_MASK);
+ machineSwitch = new Switch(Switch.CHILD_MASK);
+
+ // Set the capability bits
+ posSwitch.setCapability(Switch.ALLOW_SWITCH_READ);
+ posSwitch.setCapability(Switch.ALLOW_SWITCH_WRITE);
+
+ humanSwitch.setCapability(Switch.ALLOW_SWITCH_READ);
+ humanSwitch.setCapability(Switch.ALLOW_SWITCH_WRITE);
+
+ machineSwitch.setCapability(Switch.ALLOW_SWITCH_READ);
+ machineSwitch.setCapability(Switch.ALLOW_SWITCH_WRITE);
+
+ // Create the bit masks
+ posMask = new BitSet();
+ humanMask = new BitSet();
+ machineMask = new BitSet();
+
+ // Create the small white spheres that mark unoccupied
+ // positions.
+ posSphere = new Sphere[64];
+ for (int i=0; i<64; i++) {
+ Transform3D transform3D = new Transform3D();
+ transform3D.set(point[i]);
+ TransformGroup transformGroup = new TransformGroup(transform3D);
+ posSphere[i] = new Sphere(2.0f, Sphere.GENERATE_NORMALS |
+ Sphere.ENABLE_APPEARANCE_MODIFY,
+ 12, whiteApp);
+ Shape3D shape = posSphere[i].getShape();
+ ID id = new ID(i);
+ shape.setUserData(id);
+ transformGroup.addChild(posSphere[i]);
+ posSwitch.addChild(transformGroup);
+ posMask.set(i);
+ }
+
+ // Create the red spheres that mark the user's positions.
+ for (int i=0; i<64; i++) {
+ Transform3D transform3D = new Transform3D();
+ transform3D.set(point[i]);
+ TransformGroup transformGroup = new TransformGroup(transform3D);
+ transformGroup.addChild(new Sphere(7.0f, redApp));
+ humanSwitch.addChild(transformGroup);
+ humanMask.clear(i);
+ }
+
+ // Create the blue cubes that mark the computer's positions.
+ for (int i=0; i<64; i++) {
+ Transform3D transform3D = new Transform3D();
+ transform3D.set(point[i]);
+ TransformGroup transformGroup = new TransformGroup(transform3D);
+ BigCube cube = new BigCube(blueApp);
+ transformGroup.addChild(cube.getChild());
+ machineSwitch.addChild(transformGroup);
+ machineMask.clear(i);
+ }
+
+ // Set the positions mask
+ posSwitch.setChildMask(posMask);
+ humanSwitch.setChildMask(humanMask);
+ machineSwitch.setChildMask(machineMask);
+
+ // Throw everything into a single group
+ group = new Group();
+ group.addChild(posSwitch);
+ group.addChild(humanSwitch);
+ group.addChild(machineSwitch);
+ }
+
+ public void setTransformGroup(TransformGroup transformGroup) {
+ tgroup = transformGroup;
+ }
+
+ public Group getChild() {
+ return group;
+ }
+
+ public void setBoard(Board board) {
+ this.board = board;
+ }
+
+ public void winner() {
+ winnerFlag = true;
+ }
+
+ public void noWinner() {
+ winnerFlag = false;
+ }
+
+ public void setHighlight(int pos) {
+ posSphere[pos].setAppearance(yellowApp);
+ }
+
+ public void clearHighlight(int pos) {
+ posSphere[pos].setAppearance(whiteApp);
+ }
+
+ public void newGame() {
+
+ // Clear the board
+ for (int i=0; i<64; i++) {
+ posMask.set(i);
+ humanMask.clear(i);
+ machineMask.clear(i);
+ }
+ posSwitch.setChildMask(posMask);
+ humanSwitch.setChildMask(humanMask);
+ machineSwitch.setChildMask(machineMask);
+
+ // The following three lines fix a bug in J3D
+ Transform3D t = new Transform3D();
+ tgroup.getTransform(t);
+ tgroup.setTransform(t);
+
+ // Reset the winner flag
+ winnerFlag = false;
+ }
+
+ public void set(int pos, int player) {
+
+ // Stop accepting selections when the game
+ // is over.
+ if (winnerFlag) return;
+
+ // Make sure the position is not occupied.
+ if (player == HUMAN)
+ if (!board.unoccupied(pos)) return;
+
+ // Turn off the position marker for the given position
+ posMask.clear(pos);
+ posSwitch.setChildMask(posMask);
+
+ // Turn on the player marker
+ if (player == Positions.HUMAN) {
+ humanMask.set(pos);
+ humanSwitch.setChildMask(humanMask);
+ board.selection(pos, Positions.HUMAN);
+ }
+ else {
+ machineMask.set(pos);
+ machineSwitch.setChildMask(machineMask);
+ }
+
+ // The following three lines fix a bug in J3D
+ Transform3D t = new Transform3D();
+ tgroup.getTransform(t);
+ tgroup.setTransform(t);
+ }
+
+ public void clear(int pos) {
+
+ // Turn on the position marker
+ posMask.set(pos);
+ posSwitch.setChildMask(posMask);
+
+ // Turn off the player marker
+ humanMask.clear(pos);
+ humanSwitch.setChildMask(humanMask);
+ machineMask.clear(pos);
+ machineSwitch.setChildMask(machineMask);
+
+ // The following three lines are a workaround for a bug
+ // in dev09 in which the transform3D of certain items are
+ // not updated properly. Scheduled to be fixed in dev10
+ Transform3D t = new Transform3D();
+ tgroup.getTransform(t);
+ tgroup.setTransform(t);
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/four_by_four/README.txt b/src/main/java/org/jdesktop/j3d/examples/four_by_four/README.txt
new file mode 100644
index 0000000..40798d0
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/four_by_four/README.txt
@@ -0,0 +1,8 @@
+FourByFour
+
+To run:
+
+ appletviewer FourByFour.html
+
+Press the "Instructions" button to get instructions on
+how to play FourByFour.
diff --git a/src/main/java/org/jdesktop/j3d/examples/four_by_four/instructions.txt b/src/main/java/org/jdesktop/j3d/examples/four_by_four/instructions.txt
new file mode 100644
index 0000000..3dcc736
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/four_by_four/instructions.txt
@@ -0,0 +1,98 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+ Four By Four
+
+Description:
+
+ A three dimensional game of tic-tac-toe on a 4x4x4 cube.
+
+Object:
+
+ Be the first to score four in a row.
+
+Instructions:
+
+ 1. It's you versus the computer.
+
+ 2. There are five skill levels. Press the "Skill Level" button to select your level
+ of play. The program defaults to the hardest level. Changing the skill level in
+ the middle of a game will force the start of a new game.
+
+ 3. The screen on the left is a 3D window. A mouse drag in this window will rotate the
+ view to any desired position.
+
+ 4. The screen on the right is a 2D window which displays all 18 faces that exist in the
+ 4x4x4 array.
+
+ 5. Click on any of the small gray spheres (in either the 2D or 3D window) to select a position.
+
+ 6. Positions owned by you will be marked in red. Positions owned by the computer will be
+ marked in blue.
+
+ 7. Click the "Undo Move" button to take back a move.
+
+ 8. Clicking on any of words "Face X" in the 2D window will cause that particular face to highlight
+ in the 3D window. Clicking the word again will un-highlight the face.
+
+ 9. The final score is based on skill level, number of moves, and time. Select the button
+ "High Scores" to see a list of the top 20 scores. There is no penalty for using the
+ undo button.
+
+ 10. Good luck.
+
+General Strategy:
+
+ 1. There are a 64 positions from which to choose. In total, there are 72 possible winning
+ combinations.
+
+ 2. The outer four corners and the inner "core" of eight have the most winning combinations,
+ 7 each, and should perhaps be chosen first.
+
+ 3. Use the 2D window to keep an eye on all the faces.
+
+ 4. The computer plays well at the highest skill level (the default). There are, however,
+ faults in it's logic that can be exploited. Thus the human player can win even at the
+ highest skill level. In the beginning, however, you may want to start at the lower skill
+ levels and work your way up.
diff --git a/src/main/java/org/jdesktop/j3d/examples/four_by_four/scores.txt b/src/main/java/org/jdesktop/j3d/examples/four_by_four/scores.txt
new file mode 100644
index 0000000..0ebc31a
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/four_by_four/scores.txt
@@ -0,0 +1,20 @@
+1 Bart Simpson 5283
+2 Dwight Eisenhower 5105
+3 Ken 5061
+4 Barbie 2883
+5 DoubleMint Twins 2195
+6 Robin Hood 1772
+7 Jack Benny 1604
+8 Anonymous 1550
+9 Duke 1501
+10 Jack Paar 1499
+11 Barney 1488
+12 Mick Jagger 1472
+13 Howard Hughes 1329
+14 Bugs Bunny 1328
+15 Suzi Chapstick 1302
+16 Forest Gump 1244
+17 Alfred Hitchcock 1231
+18 Roman Polaski 1168
+19 Missy Giovi 1106
+20 Bill Joy 1002
diff --git a/src/main/java/org/jdesktop/j3d/examples/fps_counter/FPSCounter.java b/src/main/java/org/jdesktop/j3d/examples/fps_counter/FPSCounter.java
new file mode 100644
index 0000000..fa57927
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/fps_counter/FPSCounter.java
@@ -0,0 +1,282 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.fps_counter;
+
+import java.text.NumberFormat;
+
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.WakeupOnElapsedFrames;
+
+/** This behavior calculates the frame rate and average frame rate of a
+ * Java3D application.
+ * The behavior sets itself up to wakeup every time a new frame is rendered.
+ *
+ * <p> The HotSpot(tm) compiler performs some initial optimizations before
+ * running at optimal speed. Frame rates measured during this warmup period
+ * will be inaccurate and not indicative of the true performance of the the
+ * application. Therefore, before beginning the frame rate computation,
+ * the frame counter waits for a fixed time period to allow the HotSpot(tm)
+ * compiler to stablilize.
+ *
+ * <p> To avoid computing the frame rate too frequently (which would also
+ * hamper rendering performance), the frame counter only computes the frame
+ * rate at fixed time intervals. The default sampling duration is 10 seconds.
+ * After waiting for the warmup period, the frame counter needs to calibrate
+ * itself. It computes the number of frames rendered during the sampling
+ * period. After doing this calibration, the frame counter reports the frame
+ * rate after these many frames are rendered. It also reports the average
+ * frame rate after a fixed number of sampling intervals (the default is 5).
+ *
+ * <p>The frame counter can be set up to run for a fixed number of sampling
+ * intervals or to run indefinitely. The defaultis to run indefinitely.
+ */
+
+public class FPSCounter extends Behavior {
+ // Wakeup condition - framecount = 0 -> wakeup on every frame
+ WakeupOnElapsedFrames FPSwakeup = new WakeupOnElapsedFrames(0);
+
+ // Do calibration for these many millisec
+ private static final long testduration = 1000;
+
+ // Report frame rate after every sampleduration milliseconds
+ private static final long sampleduration = 10000;
+
+ // Flag to indicate that it is time to (re)calibrate
+ private boolean doCalibration = true;
+
+ // Flag to indicate the counter has started
+ private boolean startup = true;
+
+ // Wait for HotSpot compiler to perform optimizations
+ private boolean warmup = true;
+
+ // Time to wait for HotSpot compiler to stabilize (in milliseconds)
+ private long warmupTime = 20000;
+
+ // Counter for number of frames rendered
+ private int numframes = 0;
+
+ // Report frame rate after maxframe number of frames have been rendered
+ private int maxframes = 1;
+
+ // Variables to keep track of elapsed time
+ private long startuptime = 0;
+ private long currtime = 0;
+ private long lasttime = 0;
+ private long deltatime;
+
+ // Run indefinitely or for a fixed duration
+ private boolean finiteLoop = false;
+
+ // No. of sampling intervals to run for if not running indefinitely
+ private long maxLoops;
+
+ // No. of sampling intervals run for so far
+ private long numLoops = 0;
+
+ // Total number of frames rendered so far
+ private int sumFrames = 0;
+
+ // Total time since last reporting of average frame rate
+ private long sumTimes = 0;
+
+ // Counts no. of sampling intervals
+ private int loop = 0;
+
+ // Average frame rate is reported after loopCount number of
+ // sampling intervals
+ private int loopCount = 5;
+ private double sumFps = 0.0;
+
+ private String symbol[] = {"\\", "|", "|", "/", "-", "|", "-"};
+ int index = 0;
+ private NumberFormat nf = null;
+
+ public FPSCounter() {
+ setEnable(true);
+ nf = NumberFormat.getNumberInstance();
+ }
+
+ /**
+ * Called to init the behavior
+ */
+ public void initialize() {
+ // Set the trigger for the behavior to wakeup on every frame rendered
+ wakeupOn(FPSwakeup);
+ }
+
+ /**
+ * Called every time the behavior is activated
+ */
+ public void processStimulus(java.util.Enumeration critera) {
+ // Apply calibration algorithm to determine number of frames to
+ // wait before computing frames per second.
+ // sampleduration = 10000 -> to run test, pass for 10 seconds.
+
+ if (doCalibration) { // start calibration
+ if (startup) {
+ // Record time at which the behavior was first invoked
+ startuptime = System.currentTimeMillis();
+ startup = false;
+ }
+ else if(warmup) { // Wait for the system to stabilize.
+ System.out.print("\rFPSCounter warming up..." +
+ symbol[(index++)%symbol.length]);
+ currtime = System.currentTimeMillis();
+ deltatime = currtime - startuptime;
+ if(deltatime > warmupTime) {
+ // Done waiting for warmup
+ warmup = false;
+ lasttime = System.currentTimeMillis();
+ System.out.println("\rFPSCounter warming up...Done");
+ }
+ }
+ else {
+ numframes += 1;
+ // Wait till at least maxframe no. of frames have been rendered
+ if (numframes >= maxframes) {
+ currtime = System.currentTimeMillis();
+ deltatime = currtime - lasttime;
+ // Do the calibration for testduration no. of millisecs
+ if (deltatime > testduration) {
+ // Compute total no. of frames rendered so far in the
+ // current sampling duration
+ maxframes = (int)Math.ceil((double)numframes *
+ ((double)sampleduration /
+ (double)deltatime));
+
+ // Done with calibration
+ doCalibration = false;
+ // reset the value for the measurement
+ numframes = 0;
+ lasttime = System.currentTimeMillis();
+ }
+ else {
+ // Need to run the calibration routine for some more
+ // time. Increase the no. of frames to be rendered
+ maxframes *= 2;
+ }
+ }
+ }
+ }
+ else { // do the measurement
+ numframes += 1;
+ if (numframes >= maxframes) {
+ currtime = System.currentTimeMillis();
+ deltatime = currtime - lasttime;
+ // time is in millisec, so multiply by 1000 to get frames/sec
+ double fps = (double)numframes / ((double)deltatime / 1000.0);
+
+ System.out.println("Frame Rate : \n\tNo. of frames : " +
+ numframes + "\n\tTime : " +
+ ((double)deltatime / 1000.0) +
+ " sec." + "\n\tFrames/sec : " + nf.format(fps));
+
+ // Calculate average frame rate
+ sumFrames += numframes;
+ sumTimes += deltatime;
+ sumFps += fps;
+ loop++;
+ if (loop >= loopCount) {
+ double avgFps = (double)sumFrames*1000.0/(double)sumTimes;
+ double ravgFps = sumFps/(double)loopCount;
+ System.out.println("Aggregate frame rate " +
+ nf.format(avgFps) + " frames/sec");
+ System.out.println("Average frame rate " +
+ nf.format(ravgFps) + " frames/sec");
+ numLoops++;
+ if (finiteLoop && numLoops >= maxLoops) {
+ System.out.println("************** The End **************\n");
+ setEnable(false);
+ }
+ loop = 0;
+ sumFps = 0;
+ }
+ numframes = 0;
+ lasttime = System.currentTimeMillis();;
+ }
+ }
+ // Set the trigger for the behavior
+ wakeupOn(FPSwakeup);
+ }
+
+ /**
+ * The frame counter waits for some time before computing the
+ * frame rate. This allows the HotSpot compiler to perform
+ * initial optimizations. The amount of time to wait for is set
+ * by this method. The default is 20000 (20 sec)
+ *
+ * @param amount of time to wait for before computing frame rate
+ * (specified in milliseconds)
+ */
+ public void setWarmupTime(long wt) {
+ warmupTime = wt;
+ }
+
+ /**
+ * Sets the number of sampling intervals to wait for before computing
+ * the average frame rate.
+ * The default is 5.
+ *
+ * @param number of sampling intervals over which to compute frame rate.
+ * A value of 0 implies the average frame rate is computed over one
+ * sampling interval
+ */
+ public void setLoopCount(int lc) {
+ loopCount = lc;
+ }
+
+ /**
+ * This method sets the number of sampling intervals for which
+ * the frame counter should run.
+ *
+ * @param number of sampling intervals to run for
+ */
+ public void setMaxLoops(int ml) {
+ maxLoops = ml;
+ finiteLoop = true;
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/fps_counter/FPSCounterDemo.form b/src/main/java/org/jdesktop/j3d/examples/fps_counter/FPSCounterDemo.form
new file mode 100644
index 0000000..0a6a276
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/fps_counter/FPSCounterDemo.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="FPSCounterDemo"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[250, 250]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/fps_counter/FPSCounterDemo.java b/src/main/java/org/jdesktop/j3d/examples/fps_counter/FPSCounterDemo.java
new file mode 100644
index 0000000..d72aa9f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/fps_counter/FPSCounterDemo.java
@@ -0,0 +1,255 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.fps_counter;
+
+import java.awt.GraphicsConfiguration;
+
+import javax.swing.JOptionPane;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Point3d;
+
+/**
+ * This program demonstrates the use of the frames per second counter.
+ * The program displays a rotating cube and sets up the FPSCounter to compute
+ * the frame rate. The FPSCounter is set up with default values:
+ * - run indefinitely
+ * - 2 sec. warmup time
+ * - display average frame rate every fifth sampling interval.
+ * The default values can be changed through the command line
+ * arguments. Use FPSCounterDemo1 -h for help on the various arguments.
+ */
+public class FPSCounterDemo extends javax.swing.JFrame {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+ private FPSCounter fpsCounter = new FPSCounter();
+
+ BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create the TransformGroup node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at run time. Add it to
+ // the root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // Create a simple Shape3D node; add it to the scene graph.
+ objTrans.addChild(new ColorCube(0.4));
+
+ // Create a new Behavior object that will perform the
+ // desired operation on the specified transform and add
+ // it into the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, 4000);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),
+ 100.0);
+ rotator.setSchedulingBounds(bounds);
+ objRoot.addChild(rotator);
+
+ // Create the Framecounter behavior
+ fpsCounter.setSchedulingBounds(bounds);
+ objRoot.addChild(fpsCounter);
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ return c;
+ }
+
+ /**
+ * Creates new form FPSCounterDemo
+ */
+ public FPSCounterDemo() {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+
+ JOptionPane.showMessageDialog(this,
+ ("This program measures the number of frames rendered per second.\n" +
+ "Note that the frame rate is limited by the refresh rate of the monitor.\n" +
+ "To get the true frame rate you need to disable vertical retrace.\n\n" +
+ "On Windows(tm) you do this through the Control Panel.\n\n" +
+ "On Solaris set the environment variable OGL_NO_VBLANK"),
+ "Frame Counter",
+ JOptionPane.INFORMATION_MESSAGE);
+
+ }
+
+ /** Parses the commandline for the various switches to set the FPSCounter
+ * variables.
+ * All arguments are of the form <i>-name value</i>.
+ * All -name arguments can be shortened to one character. All the value
+ * arguments take a number. The arguments accepted are :
+ * <ul>
+ * <li>warmupTime : Specifies amount of time the FPSCounter should wait
+ * for the HotSpot<sup><font size="-2">TM</font></sup> VM to perform
+ * initial optimizations. Specified in milliseconds<br>
+ * <li>loopCount : Specifies the number of sampling intervals over which
+ * the FPSCounter should calculate the aggregate and average frame rate.
+ * Specified as a count. <br>
+ * <li>maxLoops : Specifies that the FPSCounter should run for only
+ * these many sampling intervals. Specified as number. If this argument
+ * is not specified, the FPSCounter runs indefinitely. <br>
+ * <li>help : Prints the accepted arguments. <br>
+ * </ul>
+ */
+ private void parseArgs(String args[]) {
+ for(int i = 0; i < args.length; i++) {
+ if(args[i].startsWith("-")) {
+ if(args[i].startsWith("w", 1)) {
+ i++;
+ System.out.println("Warmup time : " + args[i]);
+ int w = new Integer(args[i]).intValue();
+ fpsCounter.setWarmupTime(w);
+ }
+ else if(args[i].startsWith("l", 1)) {
+ i++;
+ System.out.println("Loop count : " + args[i]);
+ int l = new Integer(args[i]).intValue();
+ fpsCounter.setLoopCount(l);
+ }
+ else if(args[i].startsWith("m", 1)) {
+ i++;
+ System.out.println("Max Loop Count : " + args[i]);
+ int m = new Integer(args[i]).intValue();
+ fpsCounter.setMaxLoops(m);
+ }
+ else if(args[i].startsWith("h", 1)) {
+ System.out.println("Usage : FPSCounterDemo [-name value]\n" +
+ "All arguments are of the form: -name value. All -name arguments can be\n" +
+ "shortened to one character. All the value arguments take a number. The\n" +
+ "arguments accepted are:\n\n" +
+ " -warmupTime : Specifies amount of time the FPSCounter should wait\n" +
+ " for the HotSpot(tm) VM to perform initial\n" +
+ " optimizations. Specified in milliseconds\n\n" +
+ " -loopCount : Specifies the number of sampling intervals over which\n" +
+ " the FPSCounter should calculate the aggregate and average\n" +
+ " frame rate. Specified as a count\n\n" +
+ " -maxLoops : Specifies that the FPSCounter should run for only these\n" +
+ " many sampling intervals. Specified as number. If this argument\n" +
+ " is not specified, the FPSCounter runs indefinitely.\n\n" +
+ " -help : Prints this message.");
+ }
+ }
+ }
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("FPSCounterDemo");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(250, 250));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[]) {
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ FPSCounterDemo fp = new FPSCounterDemo();
+ fp.parseArgs(args);
+ fp.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gears/Gear.java b/src/main/java/org/jdesktop/j3d/examples/gears/Gear.java
new file mode 100644
index 0000000..63ececf
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gears/Gear.java
@@ -0,0 +1,403 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.gears;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TriangleStripArray;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3f;
+
+public class Gear extends TransformGroup {
+
+ // Specifiers determining whether to generate outward facing normals or
+ // inward facing normals.
+ static final int OutwardNormals = 1;
+ static final int InwardNormals = -1;
+
+ // The number of teeth in the gear
+ int toothCount;
+
+ // Gear start differential angle. All gears are constructed with the
+ // center of a tooth at Z-axis angle = 0.
+ double gearStartAngle;
+ // The Z-rotation angle to place the tooth center at theta = 0
+ float toothTopCenterAngle;
+ // The Z-rotation angle to place the valley center at theta = 0
+ float valleyCenterAngle;
+ // The angle about Z subtended by one tooth and its associated valley
+ float circularPitchAngle;
+
+ // Increment angles
+ float toothValleyAngleIncrement;
+
+ // Front and rear facing normals for the gear's body
+ final Vector3f frontNormal = new Vector3f(0.0f, 0.0f, -1.0f);
+ final Vector3f rearNormal = new Vector3f(0.0f, 0.0f, 1.0f);
+
+
+ Gear(int toothCount) {
+ this.toothCount = toothCount;
+ }
+
+ void addBodyDisks(float shaftRadius, float bodyOuterRadius,
+ float thickness, Appearance look) {
+ int gearBodySegmentVertexCount; // #(segments) per tooth-unit
+ int gearBodyTotalVertexCount; // #(vertices) in a gear face
+ int gearBodyStripCount[] = new int[1]; // per strip (1) vertex count
+
+ // A ray from the gear center, used in normal calculations
+ float xDirection, yDirection;
+
+ // The x and y coordinates at each point of a facet and at each
+ // point on the gear: at the shaft, the root of the teeth, and
+ // the outer point of the teeth
+ float xRoot0, yRoot0, xShaft0, yShaft0;
+ float xRoot3, yRoot3, xShaft3, yShaft3;
+ float xRoot4, yRoot4, xShaft4, yShaft4;
+
+ // Temporary variables for storing coordinates and vectors
+ Point3f coordinate = new Point3f(0.0f, 0.0f, 0.0f);
+
+ // Gear start differential angle. All gears are constructed with the
+ // center of a tooth at Z-axis angle = 0.
+ double gearStartAngle = -1.0 * toothTopCenterAngle;
+
+ // Temporaries that store start angle for each portion of tooth facet
+ double toothStartAngle, toothTopStartAngle,
+ toothDeclineStartAngle, toothValleyStartAngle,
+ nextToothStartAngle;
+
+ Shape3D newShape;
+ int index;
+
+ // The z coordinates for the body disks
+ final float frontZ = -0.5f * thickness;
+ final float rearZ = 0.5f * thickness;
+
+ /* Construct the gear's front body (front facing torus disk)
+ * __2__
+ * - | - 4
+ * - /| /-
+ * / / | /| \
+ * 0\ / | / / >
+ * \ / | / | >
+ * \ / | / / |
+ * \ / ____|/ | >
+ * \-- --__/ |
+ * 1 3 5
+ *
+ */
+ gearBodySegmentVertexCount = 4;
+ gearBodyTotalVertexCount = 2 + gearBodySegmentVertexCount * toothCount;
+ gearBodyStripCount[0] = gearBodyTotalVertexCount;
+
+ TriangleStripArray frontGearBody
+ = new TriangleStripArray(gearBodyTotalVertexCount,
+ GeometryArray.COORDINATES
+ | GeometryArray.NORMALS,
+ gearBodyStripCount);
+
+ xDirection = (float)Math.cos(gearStartAngle);
+ yDirection = (float)Math.sin(gearStartAngle);
+ xShaft0 = shaftRadius * xDirection;
+ yShaft0 = shaftRadius * yDirection;
+ xRoot0 = bodyOuterRadius * xDirection;
+ yRoot0 = bodyOuterRadius * yDirection;
+
+ coordinate.set(xRoot0, yRoot0, frontZ);
+ frontGearBody.setCoordinate(0, coordinate);
+ frontGearBody.setNormal(0, frontNormal);
+
+ coordinate.set(xShaft0, yShaft0, frontZ);
+ frontGearBody.setCoordinate(1, coordinate);
+ frontGearBody.setNormal(1, frontNormal);
+
+ for(int count = 0; count < toothCount; count++) {
+ index = 2 + count * 4;
+ toothStartAngle
+ = gearStartAngle + circularPitchAngle * (double)count;
+ toothValleyStartAngle
+ = toothStartAngle + toothValleyAngleIncrement;
+ nextToothStartAngle = toothStartAngle + circularPitchAngle;
+
+ xDirection = (float)Math.cos(toothValleyStartAngle);
+ yDirection = (float)Math.sin(toothValleyStartAngle);
+ xShaft3 = shaftRadius * xDirection;
+ yShaft3 = shaftRadius * yDirection;
+ xRoot3 = bodyOuterRadius * xDirection;
+ yRoot3 = bodyOuterRadius * yDirection;
+
+ xDirection = (float)Math.cos(nextToothStartAngle);
+ yDirection = (float)Math.sin(nextToothStartAngle);
+ xShaft4 = shaftRadius * xDirection;
+ yShaft4 = shaftRadius * yDirection;
+ xRoot4 = bodyOuterRadius * xDirection;
+ yRoot4 = bodyOuterRadius * yDirection;
+
+ coordinate.set(xRoot3, yRoot3, frontZ);
+ frontGearBody.setCoordinate(index, coordinate);
+ frontGearBody.setNormal(index, frontNormal);
+
+ coordinate.set(xShaft3, yShaft3, frontZ);
+ frontGearBody.setCoordinate(index + 1, coordinate);
+ frontGearBody.setNormal(index + 1, frontNormal);
+
+ coordinate.set(xRoot4, yRoot4, frontZ);
+ frontGearBody.setCoordinate(index + 2, coordinate);
+ frontGearBody.setNormal(index + 2, frontNormal);
+
+ coordinate.set(xShaft4, yShaft4, frontZ);
+ frontGearBody.setCoordinate(index + 3, coordinate);
+ frontGearBody.setNormal(index + 3, frontNormal);
+ }
+ newShape = new Shape3D(frontGearBody, look);
+ this.addChild(newShape);
+
+ // Construct the gear's rear body (rear facing torus disc)
+ TriangleStripArray rearGearBody
+ = new TriangleStripArray(gearBodyTotalVertexCount,
+ GeometryArray.COORDINATES
+ | GeometryArray.NORMALS,
+ gearBodyStripCount);
+ xDirection = (float)Math.cos(gearStartAngle);
+ yDirection = (float)Math.sin(gearStartAngle);
+ xShaft0 = shaftRadius * xDirection;
+ yShaft0 = shaftRadius * yDirection;
+ xRoot0 = bodyOuterRadius * xDirection;
+ yRoot0 = bodyOuterRadius * yDirection;
+
+ coordinate.set(xShaft0, yShaft0, rearZ);
+ rearGearBody.setCoordinate(0, coordinate);
+ rearGearBody.setNormal(0, rearNormal);
+
+ coordinate.set(xRoot0, yRoot0, rearZ);
+ rearGearBody.setCoordinate(1, coordinate);
+ rearGearBody.setNormal(1, rearNormal);
+
+ for(int count = 0; count < toothCount; count++) {
+ index = 2 + count * 4;
+ toothStartAngle
+ = gearStartAngle + circularPitchAngle * (double)count;
+ toothValleyStartAngle
+ = toothStartAngle + toothValleyAngleIncrement;
+ nextToothStartAngle = toothStartAngle + circularPitchAngle;
+
+ xDirection = (float)Math.cos(toothValleyStartAngle);
+ yDirection = (float)Math.sin(toothValleyStartAngle);
+ xShaft3 = shaftRadius * xDirection;
+ yShaft3 = shaftRadius * yDirection;
+ xRoot3 = bodyOuterRadius * xDirection;
+ yRoot3 = bodyOuterRadius * yDirection;
+
+ xDirection = (float)Math.cos(nextToothStartAngle);
+ yDirection = (float)Math.sin(nextToothStartAngle);
+ xShaft4 = shaftRadius * xDirection;
+ yShaft4 = shaftRadius * yDirection;
+ xRoot4 = bodyOuterRadius * xDirection;
+ yRoot4 = bodyOuterRadius * yDirection;
+
+ coordinate.set(xShaft3, yShaft3, rearZ);
+ rearGearBody.setCoordinate(index, coordinate);
+ rearGearBody.setNormal(index, rearNormal);
+
+ coordinate.set(xRoot3, yRoot3, rearZ);
+ rearGearBody.setCoordinate(index + 1, coordinate);
+ rearGearBody.setNormal(index + 1, rearNormal);
+
+ coordinate.set(xShaft4, yShaft4, rearZ);
+ rearGearBody.setCoordinate(index + 2, coordinate);
+ rearGearBody.setNormal(index + 2, rearNormal);
+
+ coordinate.set(xRoot4, yRoot4, rearZ);
+ rearGearBody.setCoordinate(index + 3, coordinate);
+ rearGearBody.setNormal(index + 3, rearNormal);
+
+ }
+ newShape = new Shape3D(rearGearBody, look);
+ this.addChild(newShape);
+ }
+
+ void addCylinderSkins(float shaftRadius, float length,
+ int normalDirection, Appearance look) {
+ int insideShaftVertexCount; // #(vertices) for shaft
+ int insideShaftStripCount[] = new int[1]; // #(vertices) in strip/strip
+ double toothStartAngle, nextToothStartAngle, toothValleyStartAngle;
+
+ // A ray from the gear center, used in normal calculations
+ float xDirection, yDirection;
+
+ // The z coordinates for the body disks
+ final float frontZ = -0.5f * length;
+ final float rearZ = 0.5f * length;
+
+ // Temporary variables for storing coordinates, points, and vectors
+ float xShaft3, yShaft3, xShaft4, yShaft4;
+ Point3f coordinate = new Point3f(0.0f, 0.0f, 0.0f);
+ Vector3f surfaceNormal = new Vector3f();
+
+ Shape3D newShape;
+ int index;
+ int firstIndex;
+ int secondIndex;
+
+
+ /*
+ * Construct gear's inside shaft cylinder
+ * First the tooth's up, flat outer, and down distances
+ * Second the tooth's flat inner distance
+ *
+ * Outward facing vertex order:
+ * 0_______2____4
+ * | /| /|
+ * | / | / |
+ * | / | / |
+ * |/______|/___|
+ * 1 3 5
+ *
+ * Inward facing vertex order:
+ * 1_______3____5
+ * |\ |\ |
+ * | \ | \ |
+ * | \ | \ |
+ * |______\|___\|
+ * 0 2 4
+ */
+ insideShaftVertexCount = 4 * toothCount + 2;
+ insideShaftStripCount[0] = insideShaftVertexCount;
+
+ TriangleStripArray insideShaft
+ = new TriangleStripArray(insideShaftVertexCount,
+ GeometryArray.COORDINATES
+ | GeometryArray.NORMALS,
+ insideShaftStripCount);
+ xShaft3 = shaftRadius * (float)Math.cos(gearStartAngle);
+ yShaft3 = shaftRadius * (float)Math.sin(gearStartAngle);
+
+ if (normalDirection == OutwardNormals) {
+ surfaceNormal.set(1.0f, 0.0f, 0.0f);
+ firstIndex = 1;
+ secondIndex = 0;
+ } else {
+ surfaceNormal.set(-1.0f, 0.0f, 0.0f);
+ firstIndex = 0;
+ secondIndex = 1;
+ }
+
+ // Coordinate labeled 0 in the strip
+ coordinate.set(shaftRadius, 0.0f, frontZ);
+ insideShaft.setCoordinate(firstIndex, coordinate);
+ insideShaft.setNormal(firstIndex, surfaceNormal);
+
+ // Coordinate labeled 1 in the strip
+ coordinate.set(shaftRadius, 0.0f, rearZ);
+ insideShaft.setCoordinate(secondIndex, coordinate);
+ insideShaft.setNormal(secondIndex, surfaceNormal);
+
+ for(int count = 0; count < toothCount; count++) {
+ index = 2 + count * 4;
+
+ toothStartAngle = circularPitchAngle * (double)count;
+ toothValleyStartAngle
+ = toothStartAngle + toothValleyAngleIncrement;
+ nextToothStartAngle = toothStartAngle + circularPitchAngle;
+
+ xDirection = (float)Math.cos(toothValleyStartAngle);
+ yDirection = (float)Math.sin(toothValleyStartAngle);
+ xShaft3 = shaftRadius * xDirection;
+ yShaft3 = shaftRadius * yDirection;
+ if (normalDirection == OutwardNormals)
+ surfaceNormal.set(xDirection, yDirection, 0.0f);
+ else
+ surfaceNormal.set(-xDirection, -yDirection, 0.0f);
+
+ // Coordinate labeled 2 in the strip
+ coordinate.set(xShaft3, yShaft3, frontZ);
+ insideShaft.setCoordinate(index + firstIndex, coordinate);
+ insideShaft.setNormal(index + firstIndex, surfaceNormal);
+
+ // Coordinate labeled 3 in the strip
+ coordinate.set(xShaft3, yShaft3, rearZ);
+ insideShaft.setCoordinate(index + secondIndex, coordinate);
+ insideShaft.setNormal(index + secondIndex, surfaceNormal);
+
+ xDirection = (float)Math.cos(nextToothStartAngle);
+ yDirection = (float)Math.sin(nextToothStartAngle);
+ xShaft4 = shaftRadius * xDirection;
+ yShaft4 = shaftRadius * yDirection;
+ if (normalDirection == OutwardNormals)
+ surfaceNormal.set(xDirection, yDirection, 0.0f);
+ else
+ surfaceNormal.set(-xDirection, -yDirection, 0.0f);
+
+ // Coordinate labeled 4 in the strip
+ coordinate.set(xShaft4, yShaft4, frontZ);
+ insideShaft.setCoordinate(index + 2 + firstIndex, coordinate);
+ insideShaft.setNormal(index + 2 + firstIndex, surfaceNormal);
+
+ // Coordinate labeled 5 in the strip
+ coordinate.set(xShaft4, yShaft4, rearZ);
+ insideShaft.setCoordinate(index + 2 + secondIndex, coordinate);
+ insideShaft.setNormal(index + 2 + secondIndex, surfaceNormal);
+
+ }
+ newShape = new Shape3D(insideShaft, look);
+ this.addChild(newShape);
+ }
+
+ public float getToothTopCenterAngle() {
+ return toothTopCenterAngle;
+ }
+
+ public float getValleyCenterAngle() {
+ return valleyCenterAngle;
+ }
+
+ public float getCircularPitchAngle() {
+ return circularPitchAngle;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gears/GearBox.form b/src/main/java/org/jdesktop/j3d/examples/gears/GearBox.form
new file mode 100644
index 0000000..840732c
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gears/GearBox.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="GearBox"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/gears/GearBox.java b/src/main/java/org/jdesktop/j3d/examples/gears/GearBox.java
new file mode 100644
index 0000000..9f3bf6f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gears/GearBox.java
@@ -0,0 +1,408 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.gears;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * Simple Java 3D example program to display a spinning cube.
+ */
+public class GearBox extends javax.swing.JFrame {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+ private int toothCount = 48;
+
+ public BranchGroup createSceneGraph() {
+ Transform3D tempTransform = new Transform3D();
+
+ // Create the root of the branch graph
+ BranchGroup branchRoot = createBranchEnvironment();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ branchRoot.addChild(objScale);
+
+ // Create an Appearance.
+ Appearance look = new Appearance();
+ Color3f objColor = new Color3f(0.5f, 0.5f, 0.6f);
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ look.setMaterial(new Material(objColor, black,
+ objColor, white, 100.0f));
+
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup gearboxTrans = new TransformGroup();
+ gearboxTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ gearboxTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ objScale.addChild(gearboxTrans);
+
+ // Create a bounds for the mouse behavior methods
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Define the shaft base information
+ int shaftCount = 4;
+ int secondsPerRevolution = 8000;
+
+ // Create the Shaft(s)
+ Shaft shafts[] = new Shaft[shaftCount];
+ TransformGroup shaftTGs[] = new TransformGroup[shaftCount];
+ Alpha shaftAlphas[] = new Alpha[shaftCount];
+ RotationInterpolator shaftRotors[]
+ = new RotationInterpolator[shaftCount];
+ Transform3D shaftAxis[] = new Transform3D[shaftCount];
+
+ // Note: the following arrays we're incorporated to make changing
+ // the gearbox easier.
+ float shaftRatios[] = new float[shaftCount];
+ shaftRatios[0] = 1.0f;
+ shaftRatios[1] = 0.5f;
+ shaftRatios[2] = 0.75f;
+ shaftRatios[3] = 5.0f;
+
+ float shaftRadius[] = new float[shaftCount];
+ shaftRadius[0] = 0.2f;
+ shaftRadius[1] = 0.2f;
+ shaftRadius[2] = 0.2f;
+ shaftRadius[3] = 0.2f;
+
+ float shaftLength[] = new float[shaftCount];
+ shaftLength[0] = 1.8f;
+ shaftLength[1] = 0.8f;
+ shaftLength[2] = 0.8f;
+ shaftLength[3] = 0.8f;
+
+ float shaftDirection[] = new float[shaftCount];
+ shaftDirection[0] = 1.0f;
+ shaftDirection[1] = -1.0f;
+ shaftDirection[2] = 1.0f;
+ shaftDirection[3] = -1.0f;
+
+ Vector3d shaftPlacement[] = new Vector3d[shaftCount];
+ shaftPlacement[0] = new Vector3d(-0.75, -0.9, 0.0);
+ shaftPlacement[1] = new Vector3d(0.75, -0.9, 0.0);
+ shaftPlacement[2] = new Vector3d(0.75, 0.35, 0.0);
+ shaftPlacement[3] = new Vector3d(-0.75, 0.60, -0.7);
+
+ // Create the shafts.
+ for(int i = 0; i < shaftCount; i++) {
+ shafts[i] = new Shaft(shaftRadius[i], shaftLength[i], 25, look);
+ }
+
+ // Create a transform group node for placing each shaft
+ for(int i = 0; i < shaftCount; i++) {
+ shaftTGs[i] = new TransformGroup();
+ gearboxTrans.addChild(shaftTGs[i]);
+ shaftTGs[i].getTransform(tempTransform);
+ tempTransform.setTranslation(shaftPlacement[i]);
+ shaftTGs[i].setTransform(tempTransform);
+ shaftTGs[i].addChild(shafts[i]);
+ }
+
+ // Add rotation interpolators to rotate the shaft in the appropriate
+ // direction and at the appropriate rate
+ for(int i = 0; i < shaftCount; i++) {
+ shaftAlphas[i] = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0,
+ (long)(secondsPerRevolution
+ * shaftRatios[i]),
+ 0, 0,
+ 0, 0, 0);
+ shaftAxis[i] = new Transform3D();
+ shaftAxis[i].rotX(Math.PI/2.0);
+ shaftRotors[i]
+ = new RotationInterpolator(shaftAlphas[i], shafts[i],
+ shaftAxis[i],
+ 0.0f,
+ shaftDirection[i] *
+ (float) Math.PI * 2.0f);
+ shaftRotors[i].setSchedulingBounds(bounds);
+ shaftTGs[i].addChild(shaftRotors[i]);
+ }
+
+ // Define the gear base information. Again, these arrays exist to
+ // make the process of changing the GearBox1 via an editor faster
+ int gearCount = 5;
+ float valleyToCircularPitchRatio = .15f;
+ float pitchCircleRadius = 1.0f;
+ float addendum = 0.05f;
+ float dedendum = 0.05f;
+ float gearThickness = 0.3f;
+ float toothTipThickness = 0.27f;
+
+ // Create an array of gears and their associated information
+ SpurGear gears[] = new SpurGear[gearCount];
+ TransformGroup gearTGs[] = new TransformGroup[gearCount];
+
+ int gearShaft[] = new int[gearCount];
+ gearShaft[0] = 0;
+ gearShaft[1] = 1;
+ gearShaft[2] = 2;
+ gearShaft[3] = 0;
+ gearShaft[4] = 3;
+
+ float ratio[] = new float[gearCount];
+ ratio[0] = 1.0f;
+ ratio[1] = 0.5f;
+ ratio[2] = 0.75f;
+ ratio[3] = 0.25f;
+ ratio[4] = 1.25f;
+
+ Vector3d placement[] = new Vector3d[gearCount];
+ placement[0] = new Vector3d(0.0, 0.0, 0.0);
+ placement[1] = new Vector3d(0.0, 0.0, 0.0);
+ placement[2] = new Vector3d(0.0, 0.0, 0.0);
+ placement[3] = new Vector3d(0.0, 0.0, -0.7);
+ placement[4] = new Vector3d(0.0, 0.0, 0.0);
+
+ // Create the gears.
+ for(int i = 0; i < gearCount; i++) {
+ gears[i]
+ = new SpurGearThinBody(((int)((float)toothCount * ratio[i])),
+ pitchCircleRadius * ratio[i],
+ shaftRadius[0],
+ addendum, dedendum,
+ gearThickness,
+ toothTipThickness,
+ valleyToCircularPitchRatio, look);
+ }
+
+ // Create a transform group node for arranging the gears on a shaft
+ // and attach the gear to its associated shaft
+ for(int i = 0; i < gearCount; i++) {
+ gearTGs[i] = new TransformGroup();
+ gearTGs[i].getTransform(tempTransform);
+ tempTransform.rotZ((shaftDirection[gearShaft[i]] == -1.0) ?
+ gears[i].getCircularPitchAngle()/-2.0f :
+ 0.0f);
+ tempTransform.setTranslation(placement[i]);
+ gearTGs[i].setTransform(tempTransform);
+ gearTGs[i].addChild(gears[i]);
+ shafts[gearShaft[i]].addChild(gearTGs[i]);
+ }
+
+ // Have Java 3D perform optimizations on this scene graph.
+ branchRoot.compile();
+
+ return branchRoot;
+ }
+
+ BranchGroup createBranchEnvironment(){
+ // Create the root of the branch graph
+ BranchGroup branchRoot = new BranchGroup();
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
+ Background bgNode = new Background(bgColor);
+ bgNode.setApplicationBounds(bounds);
+ branchRoot.addChild(bgNode);
+
+ // Set up the ambient light
+ Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
+ AmbientLight ambientLightNode = new AmbientLight(ambientColor);
+ ambientLightNode.setInfluencingBounds(bounds);
+ branchRoot.addChild(ambientLightNode);
+
+ // Set up the directional lights
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);
+ Color3f light2Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
+
+ DirectionalLight light1
+ = new DirectionalLight(light1Color, light1Direction);
+ light1.setInfluencingBounds(bounds);
+ branchRoot.addChild(light1);
+
+ DirectionalLight light2
+ = new DirectionalLight(light2Color, light2Direction);
+ light2.setInfluencingBounds(bounds);
+ branchRoot.addChild(light2);
+
+ return branchRoot;
+ }
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // add mouse behaviors to the ViewingPlatform
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+
+ // add orbit behavior to the ViewingPlatform
+ OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+
+ /**
+ * Creates new form GearBox
+ */
+ public GearBox(String args[]) {
+ int value;
+
+ if (args.length > 1) {
+ System.out.println("Usage: java GearBox #teeth (LCD 4)");
+ System.exit(0);
+ } else if (args.length == 1) {
+ {
+ try{
+ value = Integer.parseInt(args[0]);
+ } catch (NumberFormatException e) {
+ System.out.println("Illegal integer specified");
+ System.out.println("Usage: java GearBox #teeth (LCD 4)");
+ value = 0;
+ System.exit(0);
+ }
+ if (value <= 0 | (value % 4) != 0) {
+ System.out.println("Integer not a positive multiple of 4");
+ System.out.println("Usage: java GearBox #teeth (LCD 4)");
+ System.exit(0);
+ }
+ toothCount = value;
+ }
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("GearBox");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[]) {
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ GearBox gb = new GearBox(args);
+ gb.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gears/GearTest.form b/src/main/java/org/jdesktop/j3d/examples/gears/GearTest.form
new file mode 100644
index 0000000..0ba2e64
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gears/GearTest.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="GearTest"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/gears/GearTest.java b/src/main/java/org/jdesktop/j3d/examples/gears/GearTest.java
new file mode 100644
index 0000000..d50d7d3
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gears/GearTest.java
@@ -0,0 +1,256 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.gears;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * Simple Java 3D example program to display a spinning cube.
+ */
+public class GearTest extends javax.swing.JFrame {
+
+ private int toothCount = 24;
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+ Background bgNode = new Background(bgColor);
+ bgNode.setApplicationBounds(bounds);
+ objScale.addChild(bgNode);
+
+ // Set up the global lights
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f);
+ Color3f light2Color = new Color3f(0.3f, 0.3f, 0.4f);
+ Vector3f light2Direction = new Vector3f(-6.0f, -2.0f, -1.0f);
+ Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
+
+ AmbientLight ambientLightNode = new AmbientLight(ambientColor);
+ ambientLightNode.setInfluencingBounds(bounds);
+ objScale.addChild(ambientLightNode);
+
+ DirectionalLight light1
+ = new DirectionalLight(light1Color, light1Direction);
+ light1.setInfluencingBounds(bounds);
+ objScale.addChild(light1);
+
+ DirectionalLight light2
+ = new DirectionalLight(light2Color, light2Direction);
+ light2.setInfluencingBounds(bounds);
+ objScale.addChild(light2);
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(objTrans);
+
+ // Create an Appearance.
+ Appearance look = new Appearance();
+ Color3f objColor = new Color3f(0.5f, 0.5f, 0.6f);
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ look.setMaterial(new Material(objColor, black, objColor, white, 100.0f));
+
+ // Create a gear, add it to the scene graph.
+ // SpurGear gear = new SpurGear(toothCount, 1.0f, 0.2f,
+ SpurGear gear = new SpurGearThinBody(toothCount, 1.0f, 0.2f,
+ 0.05f, 0.05f, 0.3f, 0.28f, look);
+ objTrans.addChild(gear);
+
+ // Create a new Behavior object that will rotate the object and
+ // add it into the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 8000, 0, 0,
+ 0, 0, 0);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form GearTest
+ */
+ public GearTest(String args[]) {
+ int value;
+
+ if (args.length > 1) {
+ System.out.println("Usage: java GearTest [#teeth]");
+ System.exit(0);
+ } else if (args.length == 1) {
+ try {
+ value = Integer.parseInt(args[0]);
+ } catch (NumberFormatException e) {
+ System.out.println("Illegal integer specified");
+ System.out.println("Usage: java GearTest [#teeth]");
+ value = 0;
+ System.exit(0);
+ }
+ if (value <= 0) {
+ System.out.println("Integer must be positive (> 0)");
+ System.out.println("Usage: java GearBox [#teeth]");
+ System.exit(0);
+ }
+ toothCount = value;
+
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("GearTest");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[]) {
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ GearTest gt = new GearTest(args);
+ gt.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gears/Shaft.java b/src/main/java/org/jdesktop/j3d/examples/gears/Shaft.java
new file mode 100644
index 0000000..18f1c1a
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gears/Shaft.java
@@ -0,0 +1,203 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.gears;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TriangleFanArray;
+import org.jogamp.java3d.TriangleStripArray;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3f;
+
+public class Shaft extends TransformGroup {
+
+ /**
+ * Construct a Shaft;
+ * @return a new shaft that with the specified radius centered about
+ * the origin an laying in the XY plane and of a specified length
+ * extending in the Z dimension
+ * @param radius radius of shaft
+ * @param length shaft length shaft extends from -length/2 to length/2 in
+ * the Z dimension
+ * @param segmentCount number of segments for the shaft face
+ * @param look the Appearance to associate with this shaft
+ */
+ public Shaft(float radius, float length, int segmentCount,
+ Appearance look) {
+ // The direction of the ray from the shaft's center
+ float xDirection, yDirection;
+ float xShaft, yShaft;
+
+ // The z coordinates for the shaft's faces (never change)
+ float frontZ = -0.5f * length;
+ float rearZ = 0.5f * length;
+
+ int shaftFaceVertexCount; // #(vertices) per shaft face
+ int shaftFaceTotalVertexCount; // total #(vertices) in all teeth
+ int shaftFaceStripCount[] = new int[1]; // per shaft vertex count
+ int shaftVertexCount; // #(vertices) for shaft
+ int shaftStripCount[] = new int[1]; // #(vertices) in strip/strip
+
+ // Front and rear facing normals for the shaft's faces
+ Vector3f frontNormal = new Vector3f(0.0f, 0.0f, -1.0f);
+ Vector3f rearNormal = new Vector3f(0.0f, 0.0f, 1.0f);
+ // Outward facing normal
+ Vector3f outNormal = new Vector3f(1.0f, 0.0f, 0.0f);
+
+ // Temporary variables for storing coordinates and vectors
+ Point3f coordinate = new Point3f(0.0f, 0.0f, 0.0f);
+ Shape3D newShape;
+
+ // The angle subtended by a single segment
+ double segmentAngle = 2.0 * Math.PI/segmentCount;
+ double tempAngle;
+
+ // Allow this object to spin. etc.
+ this.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+
+ /* for the forward facing fan:
+ * ___3___
+ * - | -
+ * / | \
+ * 4/\ | /\2
+ * / \ | / \
+ * / \ | / \
+ * : \ | / :
+ * |--------------- *----------------|
+ * 5 0 1
+ *
+ * for backward facing fan exchange 1 with 5; 2 with 4, etc.
+ */
+
+ // Construct the shaft's front and rear face
+ shaftFaceVertexCount = segmentCount + 2;
+ shaftFaceStripCount[0] = shaftFaceVertexCount;
+
+ TriangleFanArray frontShaftFace
+ = new TriangleFanArray(shaftFaceVertexCount,
+ GeometryArray.COORDINATES
+ | GeometryArray.NORMALS,
+ shaftFaceStripCount);
+
+ TriangleFanArray rearShaftFace
+ = new TriangleFanArray(shaftFaceVertexCount,
+ GeometryArray.COORDINATES
+ | GeometryArray.NORMALS,
+ shaftFaceStripCount);
+
+ coordinate.set(0.0f, 0.0f, frontZ);
+ frontShaftFace.setCoordinate(0, coordinate);
+ frontShaftFace.setNormal(0, frontNormal);
+
+ coordinate.set(0.0f, 0.0f, rearZ);
+ rearShaftFace.setCoordinate(0, coordinate);
+ rearShaftFace.setNormal(0, rearNormal);
+
+ for(int index = 1; index < segmentCount+2; index++) {
+
+ tempAngle = segmentAngle * -(double)index;
+ coordinate.set(radius * (float)Math.cos(tempAngle),
+ radius * (float)Math.sin(tempAngle),
+ frontZ);
+ frontShaftFace.setCoordinate(index, coordinate);
+ frontShaftFace.setNormal(index, frontNormal);
+
+ tempAngle = -tempAngle;
+ coordinate.set(radius * (float)Math.cos(tempAngle),
+ radius * (float)Math.sin(tempAngle),
+ rearZ);
+ rearShaftFace.setCoordinate(index, coordinate);
+ rearShaftFace.setNormal(index, rearNormal);
+ }
+ newShape = new Shape3D(frontShaftFace, look);
+ this.addChild(newShape);
+ newShape = new Shape3D(rearShaftFace, look);
+ this.addChild(newShape);
+
+ // Construct shaft's outer skin (the cylinder body)
+ shaftVertexCount = 2 * segmentCount + 2;
+ shaftStripCount[0] = shaftVertexCount;
+
+ TriangleStripArray shaft
+ = new TriangleStripArray(shaftVertexCount,
+ GeometryArray.COORDINATES
+ | GeometryArray.NORMALS,
+ shaftStripCount);
+
+ outNormal.set(1.0f, 0.0f, 0.0f);
+
+ coordinate.set(radius, 0.0f, rearZ);
+ shaft.setCoordinate(0, coordinate);
+ shaft.setNormal(0, outNormal);
+
+ coordinate.set(radius, 0.0f, frontZ);
+ shaft.setCoordinate(1, coordinate);
+ shaft.setNormal(1, outNormal);
+
+ for(int count = 0; count < segmentCount; count++) {
+ int index = 2 + count * 2;
+
+ tempAngle = segmentAngle * (double)(count + 1);
+ xDirection = (float)Math.cos(tempAngle);
+ yDirection = (float)Math.sin(tempAngle);
+ xShaft = radius * xDirection;
+ yShaft = radius * yDirection;
+ outNormal.set(xDirection, yDirection, 0.0f);
+
+ coordinate.set(xShaft, yShaft, rearZ);
+ shaft.setCoordinate(index, coordinate);
+ shaft.setNormal(index, outNormal);
+
+ coordinate.set(xShaft, yShaft, frontZ);
+ shaft.setCoordinate(index + 1, coordinate);
+ shaft.setNormal(index + 1, outNormal);
+ }
+ newShape = new Shape3D(shaft, look);
+ this.addChild(newShape);
+ }
+}
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/gears/SpurGear.java b/src/main/java/org/jdesktop/j3d/examples/gears/SpurGear.java
new file mode 100644
index 0000000..0649e96
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gears/SpurGear.java
@@ -0,0 +1,563 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.gears;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.QuadArray;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TriangleStripArray;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3f;
+
+public class SpurGear extends Gear {
+
+ float toothTopAngleIncrement;
+ float toothDeclineAngleIncrement;
+
+ float rootRadius;
+ float outsideRadius;
+
+ //The angle subtended by the ascending or descending portion of a tooth
+ float circularToothEdgeAngle;
+ // The angle subtended by a flat (either a tooth top or a valley
+ // between teeth
+ float circularToothFlatAngle;
+
+ /**
+ * internal constructor for SpurGear, used by subclasses to establish
+ * SpurGear's required state
+ * @return a new spur gear that contains sufficient information to
+ * continue building
+ * @param toothCount number of teeth
+ * @param pitchCircleRadius radius at center of teeth
+ * @param addendum distance from pitch circle to top of teeth
+ * @param dedendum distance from pitch circle to root of teeth
+ * @param toothToValleyAngleRatio the ratio of the angle subtended by the
+ * tooth to the angle subtended by the valley (must be <= .25)
+ */
+ SpurGear(int toothCount, float pitchCircleRadius,
+ float addendum, float dedendum, float toothToValleyAngleRatio) {
+
+ super(toothCount);
+
+ // The angle about Z subtended by one tooth and its associated valley
+ circularPitchAngle = (float)(2.0 * Math.PI / (double)toothCount);
+
+ // The angle subtended by a flat (either a tooth top or a valley
+ // between teeth
+ circularToothFlatAngle = circularPitchAngle * toothToValleyAngleRatio;
+
+ //The angle subtended by the ascending or descending portion of a tooth
+ circularToothEdgeAngle = circularPitchAngle/2.0f -
+ circularToothFlatAngle;
+
+ // Increment angles
+ toothTopAngleIncrement = circularToothEdgeAngle;
+ toothDeclineAngleIncrement
+ = toothTopAngleIncrement + circularToothFlatAngle;
+ toothValleyAngleIncrement
+ = toothDeclineAngleIncrement + circularToothEdgeAngle;
+
+ // Differential angles for offsetting to the center of tooth's top
+ // and valley
+ toothTopCenterAngle
+ = toothTopAngleIncrement + circularToothFlatAngle/2.0f;
+ valleyCenterAngle
+ = toothValleyAngleIncrement + circularToothFlatAngle/2.0f;
+
+ // Gear start differential angle. All gears are constructed with the
+ // center of a tooth at Z-axis angle = 0.
+ gearStartAngle = -1.0 * toothTopCenterAngle;
+
+ // The radial distance to the root and top of the teeth, respectively
+ rootRadius = pitchCircleRadius - dedendum;
+ outsideRadius = pitchCircleRadius + addendum;
+
+ // Allow this object to spin. etc.
+ this.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ }
+
+ /**
+ * Construct a SpurGear;
+ * @return a new spur gear that conforms to the input paramters
+ * @param toothCount number of teeth
+ * @param pitchCircleRadius radius at center of teeth
+ * @param shaftRadius radius of hole at center
+ * @param addendum distance from pitch circle to top of teeth
+ * @param dedendum distance from pitch circle to root of teeth
+ * @param gearThickness thickness of the gear
+ */
+ public SpurGear(int toothCount, float pitchCircleRadius, float shaftRadius,
+ float addendum, float dedendum, float gearThickness) {
+ this(toothCount, pitchCircleRadius, shaftRadius, addendum, dedendum,
+ gearThickness, gearThickness, 0.25f, null);
+ }
+
+ /**
+ * Construct a SpurGear;
+ * @return a new spur gear that conforms to the input paramters
+ * @param toothCount number of teeth
+ * @param pitchCircleRadius radius at center of teeth
+ * @param shaftRadius radius of hole at center
+ * @param addendum distance from pitch circle to top of teeth
+ * @param dedendum distance from pitch circle to root of teeth
+ * @param gearThickness thickness of the gear
+ * @param look the gear's appearance
+ */
+ public SpurGear(int toothCount, float pitchCircleRadius, float shaftRadius,
+ float addendum, float dedendum, float gearThickness,
+ Appearance look) {
+ this(toothCount, pitchCircleRadius, shaftRadius, addendum, dedendum,
+ gearThickness, gearThickness, 0.25f, look);
+ }
+
+ /**
+ * Construct a SpurGear;
+ * @return a new spur gear that conforms to the input paramters
+ * @param toothCount number of teeth
+ * @param pitchCircleRadius radius at center of teeth
+ * @param shaftRadius radius of hole at center
+ * @param addendum distance from pitch circle to top of teeth
+ * @param dedendum distance from pitch circle to root of teeth
+ * @param gearThickness thickness of the gear
+ * @param toothTipThickness thickness of the tip of the tooth
+ * @param look the gear's appearance
+ */
+ public SpurGear(int toothCount, float pitchCircleRadius, float shaftRadius,
+ float addendum, float dedendum, float gearThickness,
+ float toothTipThickness, Appearance look) {
+ this(toothCount, pitchCircleRadius, shaftRadius, addendum, dedendum,
+ gearThickness, toothTipThickness, 0.25f, look);
+ }
+
+ /**
+ * Construct a SpurGear;
+ * @return a new spur gear that conforms to the input paramters
+ * @param toothCount number of teeth
+ * @param pitchCircleRadius radius at center of teeth
+ * @param shaftRadius radius of hole at center
+ * @param addendum distance from pitch circle to top of teeth
+ * @param dedendum distance from pitch circle to root of teeth
+ * @param gearThickness thickness of the gear
+ * @param toothTipThickness thickness of the tip of the tooth
+ * @param toothToValleyAngleRatio the ratio of the angle subtended by the
+ * tooth to the angle subtended by the valley (must be <= .25)
+ * @param look the gear's appearance object
+ */
+ public SpurGear(int toothCount, float pitchCircleRadius, float shaftRadius,
+ float addendum, float dedendum, float gearThickness,
+ float toothTipThickness, float toothToValleyAngleRatio,
+ Appearance look) {
+
+ this(toothCount, pitchCircleRadius, addendum, dedendum,
+ toothToValleyAngleRatio);
+
+ // Generate the gear's body disks
+ addBodyDisks(shaftRadius, rootRadius, gearThickness, look);
+
+ // Generate the gear's interior shaft
+ addCylinderSkins(shaftRadius, gearThickness, InwardNormals, look);
+
+ // Generate the gear's teeth
+ addTeeth(pitchCircleRadius, rootRadius,
+ outsideRadius, gearThickness, toothTipThickness,
+ toothToValleyAngleRatio, look);
+ }
+
+ /**
+ * Construct a SpurGear's teeth by adding the teeth shape nodes
+ * @param pitchCircleRadius radius at center of teeth
+ * @param rootRadius distance from pitch circle to top of teeth
+ * @param outsideRadius distance from pitch circle to root of teeth
+ * @param gearThickness thickness of the gear
+ * @param toothTipThickness thickness of the tip of the tooth
+ * @param toothToValleyAngleRatio the ratio of the angle subtended by the
+ * tooth to the angle subtended by the valley (must be <= .25)
+ * @param look the gear's appearance object
+ */
+ void addTeeth(float pitchCircleRadius, float rootRadius,
+ float outsideRadius, float gearThickness,
+ float toothTipThickness, float toothToValleyAngleRatio,
+ Appearance look) {
+ int index;
+ Shape3D newShape;
+
+ // Temporaries that store start angle for each portion of tooth facet
+ double toothStartAngle, toothTopStartAngle,
+ toothDeclineStartAngle, toothValleyStartAngle,
+ nextToothStartAngle;
+
+ // The x and y coordinates at each point of a facet and at each
+ // point on the gear: at the shaft, the root of the teeth, and
+ // the outer point of the teeth
+ float xRoot0, yRoot0;
+ float xOuter1, yOuter1;
+ float xOuter2, yOuter2;
+ float xRoot3, yRoot3;
+ float xRoot4, yRoot4;
+
+ // The z coordinates for the gear
+ final float frontZ = -0.5f * gearThickness;
+ final float rearZ = 0.5f * gearThickness;
+
+ // The z coordinates for the tooth tip of the gear
+ final float toothTipFrontZ = -0.5f * toothTipThickness;
+ final float toothTipRearZ = 0.5f * toothTipThickness;
+
+ int toothFacetVertexCount; // #(vertices) per tooth facet
+ int toothFacetCount; // #(facets) per tooth
+ int toothFaceTotalVertexCount; // #(vertices) in all teeth
+ int toothFaceStripCount[] = new int[toothCount];
+ // per tooth vertex count
+ int topVertexCount; // #(vertices) for teeth tops
+ int topStripCount[] = new int[1]; // #(vertices) in strip/strip
+
+ // Front and rear facing normals for the teeth faces
+ Vector3f frontToothNormal = new Vector3f(0.0f, 0.0f, -1.0f);
+ Vector3f rearToothNormal = new Vector3f(0.0f, 0.0f, 1.0f);
+
+ // Normals for teeth tops up incline, tooth top, and down incline
+ Vector3f leftNormal = new Vector3f(-1.0f, 0.0f, 0.0f);
+ Vector3f rightNormal = new Vector3f(1.0f, 0.0f, 0.0f);
+ Vector3f outNormal = new Vector3f(1.0f, 0.0f, 0.0f);
+ Vector3f inNormal = new Vector3f(-1.0f, 0.0f, 0.0f);
+
+ // Temporary variables for storing coordinates and vectors
+ Point3f coordinate = new Point3f(0.0f, 0.0f, 0.0f);
+ Point3f tempCoordinate1 = new Point3f(0.0f, 0.0f, 0.0f);
+ Point3f tempCoordinate2 = new Point3f(0.0f, 0.0f, 0.0f);
+ Point3f tempCoordinate3 = new Point3f(0.0f, 0.0f, 0.0f);
+ Vector3f tempVector1 = new Vector3f(0.0f, 0.0f, 0.0f);
+ Vector3f tempVector2 = new Vector3f(0.0f, 0.0f, 0.0f);
+
+ /* Construct the gear's front facing teeth facets
+ * 0______2
+ * / /\
+ * / / \
+ * / / \
+ * //___________\
+ * 1 3
+ */
+ toothFacetVertexCount = 4;
+ toothFaceTotalVertexCount = toothFacetVertexCount * toothCount;
+ for(int i = 0; i < toothCount; i++)
+ toothFaceStripCount[i] = toothFacetVertexCount;
+
+ TriangleStripArray frontGearTeeth
+ = new TriangleStripArray(toothFaceTotalVertexCount,
+ GeometryArray.COORDINATES
+ | GeometryArray.NORMALS,
+ toothFaceStripCount);
+
+ for(int count = 0; count < toothCount; count++) {
+ index = count * toothFacetVertexCount;
+
+ toothStartAngle
+ = gearStartAngle + circularPitchAngle * (double)count;
+ toothTopStartAngle = toothStartAngle + toothTopAngleIncrement;
+ toothDeclineStartAngle
+ = toothStartAngle + toothDeclineAngleIncrement;
+ toothValleyStartAngle
+ = toothStartAngle + toothValleyAngleIncrement;
+
+ xRoot0 = rootRadius * (float)Math.cos(toothStartAngle);
+ yRoot0 = rootRadius * (float)Math.sin(toothStartAngle);
+ xOuter1 = outsideRadius * (float)Math.cos(toothTopStartAngle);
+ yOuter1 = outsideRadius * (float)Math.sin(toothTopStartAngle);
+ xOuter2 = outsideRadius * (float)Math.cos(toothDeclineStartAngle);
+ yOuter2 = outsideRadius * (float)Math.sin(toothDeclineStartAngle);
+ xRoot3 = rootRadius * (float)Math.cos(toothValleyStartAngle);
+ yRoot3 = rootRadius * (float)Math.sin(toothValleyStartAngle);
+
+ tempCoordinate1.set(xRoot0, yRoot0, frontZ);
+ tempCoordinate2.set(xRoot3, yRoot3, frontZ);
+ tempVector1.sub(tempCoordinate2, tempCoordinate1);
+
+ tempCoordinate2.set(xOuter1, yOuter1, toothTipFrontZ);
+ tempVector2.sub(tempCoordinate2, tempCoordinate1);
+
+ frontToothNormal.cross(tempVector1, tempVector2);
+ frontToothNormal.normalize();
+
+ coordinate.set(xOuter1, yOuter1, toothTipFrontZ);
+ frontGearTeeth.setCoordinate(index, coordinate);
+ frontGearTeeth.setNormal(index, frontToothNormal);
+
+ coordinate.set(xRoot0, yRoot0, frontZ);
+ frontGearTeeth.setCoordinate(index + 1, coordinate);
+ frontGearTeeth.setNormal(index + 1, frontToothNormal);
+
+ coordinate.set(xOuter2, yOuter2, toothTipFrontZ);
+ frontGearTeeth.setCoordinate(index + 2, coordinate);
+ frontGearTeeth.setNormal(index + 2, frontToothNormal);
+
+ coordinate.set(xRoot3, yRoot3, frontZ);
+ frontGearTeeth.setCoordinate(index + 3, coordinate);
+ frontGearTeeth.setNormal(index + 3, frontToothNormal);
+ }
+ newShape = new Shape3D(frontGearTeeth, look);
+ this.addChild(newShape);
+
+ /* Construct the gear's rear facing teeth facets (Using Quads)
+ * 1______2
+ * / \
+ * / \
+ * / \
+ * /____________\
+ * 0 3
+ */
+ toothFacetVertexCount = 4;
+ toothFaceTotalVertexCount = toothFacetVertexCount * toothCount;
+
+ QuadArray rearGearTeeth
+ = new QuadArray(toothCount * toothFacetVertexCount,
+ GeometryArray.COORDINATES
+ | GeometryArray.NORMALS);
+
+ for(int count = 0; count < toothCount; count++) {
+
+ index = count * toothFacetVertexCount;
+ toothStartAngle =
+ gearStartAngle + circularPitchAngle * (double)count;
+ toothTopStartAngle = toothStartAngle + toothTopAngleIncrement;
+ toothDeclineStartAngle
+ = toothStartAngle + toothDeclineAngleIncrement;
+ toothValleyStartAngle = toothStartAngle + toothValleyAngleIncrement;
+
+ xRoot0 = rootRadius * (float)Math.cos(toothStartAngle);
+ yRoot0 = rootRadius * (float)Math.sin(toothStartAngle);
+ xOuter1 = outsideRadius * (float)Math.cos(toothTopStartAngle);
+ yOuter1 = outsideRadius * (float)Math.sin(toothTopStartAngle);
+ xOuter2 = outsideRadius * (float)Math.cos(toothDeclineStartAngle);
+ yOuter2 = outsideRadius * (float)Math.sin(toothDeclineStartAngle);
+ xRoot3 = rootRadius * (float)Math.cos(toothValleyStartAngle);
+ yRoot3 = rootRadius * (float)Math.sin(toothValleyStartAngle);
+
+ tempCoordinate1.set(xRoot0, yRoot0, rearZ);
+ tempCoordinate2.set(xRoot3, yRoot3, rearZ);
+ tempVector1.sub(tempCoordinate2, tempCoordinate1);
+ tempCoordinate2.set(xOuter1, yOuter1, toothTipRearZ);
+ tempVector2.sub(tempCoordinate2, tempCoordinate1);
+ rearToothNormal.cross(tempVector2, tempVector1);
+ rearToothNormal.normalize();
+
+ coordinate.set(xRoot0, yRoot0, rearZ);
+ rearGearTeeth.setCoordinate(index, coordinate);
+ rearGearTeeth.setNormal(index, rearToothNormal);
+
+ coordinate.set(xOuter1, yOuter1, toothTipRearZ);
+ rearGearTeeth.setCoordinate(index + 1, coordinate);
+ rearGearTeeth.setNormal(index + 1, rearToothNormal);
+
+ coordinate.set(xOuter2, yOuter2, toothTipRearZ);
+ rearGearTeeth.setCoordinate(index + 2, coordinate);
+ rearGearTeeth.setNormal(index + 2, rearToothNormal);
+
+ coordinate.set(xRoot3, yRoot3, rearZ);
+ rearGearTeeth.setCoordinate(index + 3, coordinate);
+ rearGearTeeth.setNormal(index + 3, rearToothNormal);
+
+ }
+ newShape = new Shape3D(rearGearTeeth, look);
+ this.addChild(newShape);
+
+ /*
+ * Construct the gear's top teeth faces (As seen from above)
+ * Root0 Outer1 Outer2 Root3 Root4 (RearZ)
+ * 0_______3 2_______5 4_______7 6_______9
+ * |0 3| |4 7| |8 11| |12 15|
+ * | | | | | | | |
+ * | | | | | | | |
+ * |1_____2| |5_____6| |9____10| |13___14|
+ * 1 2 3 4 5 6 7 8
+ * Root0 Outer1 Outer2 Root3 Root4 (FrontZ)
+ *
+ * Quad 0123 uses a left normal
+ * Quad 2345 uses an out normal
+ * Quad 4567 uses a right normal
+ * Quad 6789 uses an out normal
+ */
+ topVertexCount = 8 * toothCount + 2;
+ topStripCount[0] = topVertexCount;
+
+ toothFacetVertexCount = 4;
+ toothFacetCount = 4;
+
+ QuadArray topGearTeeth
+ = new QuadArray(toothCount * toothFacetVertexCount
+ * toothFacetCount,
+ GeometryArray.COORDINATES
+ | GeometryArray.NORMALS);
+
+ for(int count = 0; count < toothCount; count++) {
+ index = count * toothFacetCount * toothFacetVertexCount;
+ toothStartAngle = gearStartAngle +
+ circularPitchAngle * (double)count;
+ toothTopStartAngle = toothStartAngle + toothTopAngleIncrement;
+ toothDeclineStartAngle
+ = toothStartAngle + toothDeclineAngleIncrement;
+ toothValleyStartAngle
+ = toothStartAngle + toothValleyAngleIncrement;
+ nextToothStartAngle = toothStartAngle + circularPitchAngle;
+
+ xRoot0 = rootRadius * (float)Math.cos(toothStartAngle);
+ yRoot0 = rootRadius * (float)Math.sin(toothStartAngle);
+ xOuter1 = outsideRadius * (float)Math.cos(toothTopStartAngle);
+ yOuter1 = outsideRadius * (float)Math.sin(toothTopStartAngle);
+ xOuter2 = outsideRadius * (float)Math.cos(toothDeclineStartAngle);
+ yOuter2 = outsideRadius * (float)Math.sin(toothDeclineStartAngle);
+ xRoot3 = rootRadius * (float)Math.cos(toothValleyStartAngle);
+ yRoot3 = rootRadius * (float)Math.sin(toothValleyStartAngle);
+ xRoot4 = rootRadius * (float)Math.cos(nextToothStartAngle);
+ yRoot4 = rootRadius * (float)Math.sin(nextToothStartAngle);
+
+ // Compute normal for quad 1
+ tempCoordinate1.set(xRoot0, yRoot0, frontZ);
+ tempCoordinate2.set(xOuter1, yOuter1, toothTipFrontZ);
+ tempVector1.sub(tempCoordinate2, tempCoordinate1);
+ leftNormal.cross(frontNormal, tempVector1);
+ leftNormal.normalize();
+
+ // Coordinate labeled 0 in the quad
+ coordinate.set(xRoot0, yRoot0, rearZ);
+ topGearTeeth.setCoordinate(index, coordinate);
+ topGearTeeth.setNormal(index, leftNormal);
+
+ // Coordinate labeled 1 in the quad
+ coordinate.set(tempCoordinate1);
+ topGearTeeth.setCoordinate(index + 1, coordinate);
+ topGearTeeth.setNormal(index + 1, leftNormal);
+
+ // Coordinate labeled 2 in the quad
+ topGearTeeth.setCoordinate(index + 2, tempCoordinate2);
+ topGearTeeth.setNormal(index + 2, leftNormal);
+ topGearTeeth.setCoordinate(index + 5, tempCoordinate2);
+
+ // Coordinate labeled 3 in the quad
+ coordinate.set(xOuter1, yOuter1, toothTipRearZ);
+ topGearTeeth.setCoordinate(index + 3, coordinate);
+ topGearTeeth.setNormal(index + 3, leftNormal);
+ topGearTeeth.setCoordinate(index + 4, coordinate);
+
+ // Compute normal for quad 2
+ tempCoordinate1.set(xOuter1, yOuter1, toothTipFrontZ);
+ tempCoordinate2.set(xOuter2, yOuter2, toothTipFrontZ);
+ tempVector1.sub(tempCoordinate2, tempCoordinate1);
+ outNormal.cross(frontNormal, tempVector1);
+ outNormal.normalize();
+
+ topGearTeeth.setNormal(index + 4, outNormal);
+ topGearTeeth.setNormal(index + 5, outNormal);
+
+ // Coordinate labeled 4 in the quad
+ topGearTeeth.setCoordinate(index + 6, tempCoordinate2);
+ topGearTeeth.setNormal(index + 6, outNormal);
+ topGearTeeth.setCoordinate(index + 9, tempCoordinate2);
+
+ // Coordinate labeled 5 in the quad
+ coordinate.set(xOuter2, yOuter2, toothTipRearZ);
+ topGearTeeth.setCoordinate(index + 7, coordinate);
+ topGearTeeth.setNormal(index + 7, outNormal);
+ topGearTeeth.setCoordinate(index + 8, coordinate);
+
+ // Compute normal for quad 3
+ tempCoordinate1.set(xOuter2, yOuter2, toothTipFrontZ);
+ tempCoordinate2.set(xRoot3, yRoot3, frontZ);
+ tempVector1.sub(tempCoordinate2, tempCoordinate1);
+ rightNormal.cross(frontNormal, tempVector1);
+ rightNormal.normalize();
+
+ topGearTeeth.setNormal(index + 8, rightNormal);
+ topGearTeeth.setNormal(index + 9, rightNormal);
+
+ // Coordinate labeled 7 in the quad
+ topGearTeeth.setCoordinate(index + 10, tempCoordinate2);
+ topGearTeeth.setNormal(index + 10, rightNormal);
+ topGearTeeth.setCoordinate(index + 13, tempCoordinate2);
+
+ // Coordinate labeled 6 in the quad
+ coordinate.set(xRoot3, yRoot3, rearZ);
+ topGearTeeth.setCoordinate(index + 11, coordinate);
+ topGearTeeth.setNormal(index + 11, rightNormal);
+ topGearTeeth.setCoordinate(index + 12, coordinate);
+
+ // Compute normal for quad 4
+ tempCoordinate1.set(xRoot3, yRoot3, frontZ);
+ tempCoordinate2.set(xRoot4, yRoot4, frontZ);
+ tempVector1.sub(tempCoordinate2, tempCoordinate1);
+ outNormal.cross(frontNormal, tempVector1);
+ outNormal.normalize();
+
+ topGearTeeth.setNormal(index + 12, outNormal);
+ topGearTeeth.setNormal(index + 13, outNormal);
+
+ // Coordinate labeled 9 in the quad
+ topGearTeeth.setCoordinate(index + 14, tempCoordinate2);
+ topGearTeeth.setNormal(index + 14, outNormal);
+
+ // Coordinate labeled 8 in the quad
+ coordinate.set(xRoot4, yRoot4, rearZ);
+ topGearTeeth.setCoordinate(index + 15, coordinate);
+ topGearTeeth.setNormal(index + 15, outNormal);
+
+ // Prepare for the loop by computing the new normal
+ toothTopStartAngle
+ = nextToothStartAngle + toothTopAngleIncrement;
+ xOuter1 = outsideRadius * (float)Math.cos(toothTopStartAngle);
+ yOuter1 = outsideRadius * (float)Math.sin(toothTopStartAngle);
+
+ tempCoordinate1.set(xRoot4, yRoot4, toothTipFrontZ);
+ tempCoordinate2.set(xOuter1, yOuter1, toothTipFrontZ);
+ tempVector1.sub(tempCoordinate2, tempCoordinate1);
+ leftNormal.cross(frontNormal, tempVector1);
+ leftNormal.normalize();
+ }
+ newShape = new Shape3D(topGearTeeth, look);
+ this.addChild(newShape);
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gears/SpurGearThinBody.java b/src/main/java/org/jdesktop/j3d/examples/gears/SpurGearThinBody.java
new file mode 100644
index 0000000..39a7b20
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gears/SpurGearThinBody.java
@@ -0,0 +1,185 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.gears;
+
+import org.jogamp.java3d.Appearance;
+
+public class SpurGearThinBody extends SpurGear {
+
+ /**
+ * Construct a SpurGearThinBody;
+ * @return a new spur gear that conforms to the input paramters
+ * @param toothCount number of teeth
+ * @param pitchCircleRadius radius at center of teeth
+ * @param shaftRadius radius of hole at center
+ * @param addendum distance from pitch circle to top of teeth
+ * @param dedendum distance from pitch circle to root of teeth
+ * @param gearThickness thickness of the gear
+ */
+ public SpurGearThinBody(int toothCount, float pitchCircleRadius,
+ float shaftRadius, float addendum, float dedendum,
+ float gearThickness) {
+ this(toothCount, pitchCircleRadius, shaftRadius,
+ addendum, dedendum, gearThickness, gearThickness, 0.25f, null);
+ }
+
+ /**
+ * Construct a SpurGearThinBody;
+ * @return a new spur gear that conforms to the input paramters
+ * @param toothCount number of teeth
+ * @param pitchCircleRadius radius at center of teeth
+ * @param shaftRadius radius of hole at center
+ * @param addendum distance from pitch circle to top of teeth
+ * @param dedendum distance from pitch circle to root of teeth
+ * @param gearThickness thickness of the gear
+ * @param look the gear's appearance
+ */
+ public SpurGearThinBody(int toothCount, float pitchCircleRadius,
+ float shaftRadius, float addendum, float dedendum,
+ float gearThickness,
+ Appearance look) {
+ this(toothCount, pitchCircleRadius, shaftRadius,
+ addendum, dedendum, gearThickness, gearThickness, 0.25f, look);
+ }
+
+ /**
+ * Construct a SpurGearThinBody;
+ * @return a new spur gear that conforms to the input paramters
+ * @param toothCount number of teeth
+ * @param pitchCircleRadius radius at center of teeth
+ * @param shaftRadius radius of hole at center
+ * @param addendum distance from pitch circle to top of teeth
+ * @param dedendum distance from pitch circle to root of teeth
+ * @param gearThickness thickness of the gear
+ * @param toothTipThickness thickness of the tip of the tooth
+ * @param look the gear's appearance
+ */
+ public SpurGearThinBody(int toothCount, float pitchCircleRadius,
+ float shaftRadius, float addendum, float dedendum,
+ float gearThickness, float toothTipThickness,
+ Appearance look) {
+ this(toothCount, pitchCircleRadius, shaftRadius, addendum,
+ dedendum, gearThickness, toothTipThickness, 0.25f, look);
+ }
+
+ /**
+ * Construct a SpurGearThinBody;
+ * @return a new spur gear that conforms to the input paramters
+ * @param toothCount number of teeth
+ * @param pitchCircleRadius radius at center of teeth
+ * @param shaftRadius radius of hole at center
+ * @param addendum distance from pitch circle to top of teeth
+ * @param dedendum distance from pitch circle to root of teeth
+ * @param gearThickness thickness of the gear
+ * @param toothTipThickness thickness of the tip of the tooth
+ * @param toothToValleyRatio ratio of tooth valley to circular pitch
+ * (must be <= .25)
+ * @param look the gear's appearance object
+ */
+ public SpurGearThinBody(int toothCount, float pitchCircleRadius,
+ float shaftRadius, float addendum, float dedendum,
+ float gearThickness, float toothTipThickness,
+ float toothToValleyAngleRatio, Appearance look) {
+
+ this(toothCount, pitchCircleRadius, shaftRadius, addendum,
+ dedendum, gearThickness, toothTipThickness, 0.25f, look,
+ 0.6f * gearThickness, 0.75f * (pitchCircleRadius - shaftRadius));
+ }
+
+ /**
+ * Construct a SpurGearThinBody;
+ * @return a new spur gear that conforms to the input paramters
+ * @param toothCount number of teeth
+ * @param pitchCircleRadius radius at center of teeth
+ * @param shaftRadius radius of hole at center
+ * @param addendum distance from pitch circle to top of teeth
+ * @param dedendum distance from pitch circle to root of teeth
+ * @param gearThickness thickness of the gear
+ * @param toothTipThickness thickness of the tip of the tooth
+ * @param toothToValleyRatio ratio of tooth valley to circular pitch
+ * (must be <= .25)
+ * @param look the gear's appearance object
+ * @param bodyThickness the thickness of the gear body
+ * @param crossSectionWidth the width of the depressed portion of the
+ * gear's body
+ */
+ public SpurGearThinBody(int toothCount, float pitchCircleRadius,
+ float shaftRadius, float addendum, float dedendum,
+ float gearThickness, float toothTipThickness,
+ float toothToValleyAngleRatio, Appearance look,
+ float bodyThickness, float crossSectionWidth) {
+
+ super(toothCount, pitchCircleRadius, addendum, dedendum,
+ toothToValleyAngleRatio);
+
+ float diskCrossSectionWidth =
+ (rootRadius - shaftRadius - crossSectionWidth)/ 2.0f;
+ float outerShaftRadius = shaftRadius + diskCrossSectionWidth;
+ float innerToothRadius = rootRadius - diskCrossSectionWidth;
+
+ // Generate the gear's body disks, first by the shaft, then in
+ // the body and, lastly, by the teeth
+ addBodyDisks(shaftRadius, outerShaftRadius,
+ gearThickness, look);
+ addBodyDisks(innerToothRadius, rootRadius,
+ gearThickness, look);
+ addBodyDisks(outerShaftRadius, innerToothRadius,
+ bodyThickness, look);
+
+ // Generate the gear's "shaft" equivalents the two at the teeth
+ // and the two at the shaft
+ addCylinderSkins(innerToothRadius, gearThickness, InwardNormals, look);
+ addCylinderSkins(outerShaftRadius, gearThickness, OutwardNormals, look);
+
+ // Generate the gear's interior shaft
+ addCylinderSkins(shaftRadius, gearThickness, InwardNormals, look);
+
+ // Generate the gear's teeth
+ addTeeth(pitchCircleRadius, rootRadius,
+ outsideRadius, gearThickness, toothTipThickness,
+ toothToValleyAngleRatio, look);
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/GeometryByReferenceNIOBuffer.java b/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/GeometryByReferenceNIOBuffer.java
new file mode 100644
index 0000000..ec58e4c
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/GeometryByReferenceNIOBuffer.java
@@ -0,0 +1,552 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.geometry_by_ref;
+
+import java.awt.Container;
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+import javax.swing.BoxLayout;
+import javax.swing.JApplet;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.border.TitledBorder;
+
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Geometry;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.GeometryUpdater;
+import org.jogamp.java3d.IndexedGeometryArray;
+import org.jogamp.java3d.IndexedTriangleArray;
+import org.jogamp.java3d.IndexedTriangleStripArray;
+import org.jogamp.java3d.J3DBuffer;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.RenderingAttributes;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TransparencyAttributes;
+import org.jogamp.java3d.TriangleArray;
+import org.jogamp.java3d.TriangleStripArray;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3f;
+
+public class GeometryByReferenceNIOBuffer extends JApplet implements ActionListener,
+GeometryUpdater {
+
+ RenderingAttributes ra;
+ ColoringAttributes ca;
+ Material mat;
+ Appearance app;
+ JComboBox geomType;
+ JComboBox vertexType;
+ JComboBox colorType;
+ JCheckBox transparency;
+ JComboBox updates;
+ Shape3D shape;
+ TransparencyAttributes transp;
+ int updateIndex = 0;
+ int colorCount = 0, vertexCount = 0;
+ int vertexIndex = 0, colorIndex = 0;
+
+ GeometryArray tetraRegular, tetraStrip, tetraIndexed, tetraIndexedStrip;
+ GeometryArray[] geoArrays = new GeometryArray[4];
+
+ private static final float sqrt3 = (float) Math.sqrt(3.0);
+ private static final float sqrt3_3 = sqrt3 / 3.0f;
+ private static final float sqrt24_3 = (float) Math.sqrt(24.0) / 3.0f;
+
+ private static final float ycenter = 0.5f * sqrt24_3;
+ private static final float zcenter = -sqrt3_3;
+
+ private static final Point3f p1 =
+ new Point3f(-1.0f, -ycenter, -zcenter);
+ private static final Point3f p2 =
+ new Point3f(1.0f, -ycenter, -zcenter);
+ private static final Point3f p3 =
+ new Point3f(0.0f, -ycenter, -sqrt3 - zcenter);
+ private static final Point3f p4 =
+ new Point3f(0.0f, sqrt24_3 - ycenter, 0.0f);
+
+ private static final float[] floatVerts = {
+ p1.x, p1.y, p1.z, // front face
+ p2.x, p2.y, p2.z,
+ p4.x, p4.y, p4.z,
+
+ p1.x, p1.y, p1.z,// left, back face
+ p4.x, p4.y, p4.z,
+ p3.x, p3.y, p3.z,
+
+ p2.x, p2.y, p2.z,// right, back face
+ p3.x, p3.y, p3.z,
+ p4.x, p4.y, p4.z,
+
+ p1.x, p1.y, p1.z,// bottom face
+ p3.x, p3.y, p3.z,
+ p2.x, p2.y, p2.z,
+ };
+
+ private static final Color3f c1 = new Color3f(0.6f, 0.0f, 0.0f);
+ private static final Color3f c2 = new Color3f(0.0f, 0.6f, 0.0f);
+ private static final Color3f c3 = new Color3f(0.0f, 0.6f, 0.6f);
+ private static final Color3f c4 = new Color3f(0.6f, 0.6f, 0.0f);
+
+
+
+ private static final float[] floatClrs = {
+ c1.x, c1.y, c1.z, // front face
+ c2.x, c2.y, c2.z,
+ c4.x, c4.y, c4.z,
+
+ c1.x, c1.y, c1.z,// left, back face
+ c4.x, c4.y, c4.z,
+ c3.x, c3.y, c3.z,
+
+ c2.x, c2.y, c2.z,// right, back face
+ c3.x, c3.y, c3.z,
+ c4.x, c4.y, c4.z,
+
+ c1.x, c1.y, c1.z,// bottom face
+ c3.x, c3.y, c3.z,
+ c2.x, c2.y, c2.z,
+ };
+
+ private static final float[] indexedFloatVerts = {
+ p1.x,p1.y,p1.z,
+ p2.x,p2.y,p2.z,
+ p3.x,p3.y,p3.z,
+ p4.x,p4.y,p4.z,
+
+ };
+
+
+ private static final float[] indexedFloatClrs = {
+ c1.x,c1.y,c1.z,
+ c2.x,c2.y,c2.z,
+ c3.x,c3.y,c3.z,
+ c4.x,c4.y,c4.z,
+ };
+
+ private static final int[] indices = {0,1,3,0,3,2,1,2,3,0,2,1};
+ private int[] stripVertexCounts = {3,3,3,3};
+
+ private SimpleUniverse u;
+
+ private J3DBuffer floatBufferCoord;
+ private J3DBuffer floatBufferColor;
+ private J3DBuffer indexedFloatBufferCoord;
+ private J3DBuffer indexedFloatBufferColor;
+
+ void createJ3DBuffers() {
+ int i;
+ ByteOrder order = ByteOrder.nativeOrder();
+
+ FloatBuffer coord = ByteBuffer.allocateDirect(36 * 4).order(order).asFloatBuffer();
+ coord.put(floatVerts, 0, 36);
+ floatBufferCoord = new J3DBuffer(coord);
+
+ FloatBuffer color = ByteBuffer.allocateDirect(36 * 4).order(order).asFloatBuffer();
+ color.put(floatClrs, 0, 36);
+ floatBufferColor = new J3DBuffer(color);
+
+ FloatBuffer indexedCoord = ByteBuffer.allocateDirect(12 * 4).order(order).asFloatBuffer();
+ indexedCoord.put(indexedFloatVerts, 0, 12);
+ indexedFloatBufferCoord = new J3DBuffer(indexedCoord);
+
+ FloatBuffer indexedColor = ByteBuffer.allocateDirect(12 * 4).order(order).asFloatBuffer();
+ indexedColor.put(indexedFloatClrs, 0, 12);
+ indexedFloatBufferColor = new J3DBuffer(indexedColor);
+ }
+
+ BranchGroup createSceneGraph() {
+ BranchGroup objRoot = new BranchGroup();
+
+ // Set up attributes to render lines
+ app = new Appearance();
+
+ transp = new TransparencyAttributes();
+ transp.setTransparency(0.5f);
+ transp.setCapability(TransparencyAttributes.ALLOW_MODE_WRITE);
+ transp.setTransparencyMode(TransparencyAttributes.NONE);
+ app.setTransparencyAttributes(transp);
+
+ //create the direct nio buffer
+ createJ3DBuffers();
+
+ tetraRegular = createGeometry(1);
+ tetraStrip =createGeometry(2);
+ tetraIndexed = createGeometry(3);
+ tetraIndexedStrip = createGeometry(4);
+
+ geoArrays[0] = tetraRegular;
+ geoArrays[1] = tetraStrip;
+ geoArrays[2] = tetraIndexed;
+ geoArrays[3] = tetraIndexedStrip;
+
+ shape = new Shape3D(tetraRegular, app);
+ shape.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
+ shape.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
+
+ Transform3D t = new Transform3D();
+ // move the object upwards
+ t.set(new Vector3f(0.0f, 0.3f, 0.0f));
+
+ // rotate the shape
+ Transform3D temp = new Transform3D();
+ temp.rotX(Math.PI/4.0d);
+ t.mul(temp);
+ temp.rotY(Math.PI/4.0d);
+ t.mul(temp);
+
+ // Shrink the object
+ t.setScale(0.6);
+
+ TransformGroup trans = new TransformGroup(t);
+ trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+
+ objRoot.addChild(trans);
+ trans.addChild(shape);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the global lights
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+
+ AmbientLight aLgt = new AmbientLight(alColor);
+ aLgt.setInfluencingBounds(bounds);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ lgt1.setInfluencingBounds(bounds);
+ objRoot.addChild(aLgt);
+ objRoot.addChild(lgt1);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ JPanel createGeometryByReferencePanel() {
+ JPanel panel = new JPanel();
+ panel.setBorder(new TitledBorder("Geometry Type"));
+
+ String values[] = {"Array", "Strip", "Indexed", "IndexedStrip"};
+ geomType = new JComboBox(values);
+ geomType.setLightWeightPopupEnabled(false);
+ geomType.addActionListener(this);
+ geomType.setSelectedIndex(0);
+ panel.add(new JLabel("Geometry Type"));
+ panel.add(geomType);
+
+ return panel;
+ }
+
+ JPanel createUpdatePanel() {
+
+ JPanel panel = new JPanel();
+ panel.setBorder(new TitledBorder("Other Attributes"));
+
+ String updateComp[] = { "None","Geometry", "Color"};
+
+ transparency = new JCheckBox("EnableTransparency",
+ false);
+ transparency.addActionListener(this);
+ panel.add(transparency);
+
+
+ updates = new JComboBox(updateComp);
+ updates.setLightWeightPopupEnabled(false);
+ updates.addActionListener(this);
+ updates.setSelectedIndex(0);
+ panel.add(new JLabel("UpdateData"));
+ panel.add(updates);
+
+ return panel;
+ }
+
+
+
+ public GeometryByReferenceNIOBuffer() {
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ Container contentPane = getContentPane();
+
+ Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
+ contentPane.add("Center", c);
+
+ BranchGroup scene = createSceneGraph();
+ // SimpleUniverse is a Convenience Utility class
+ u = new SimpleUniverse(c);
+
+ // add mouse behaviors to the viewingPlatform
+ ViewingPlatform viewingPlatform = u.getViewingPlatform();
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+ u.addBranchGraph(scene);
+
+ // add Orbit behavior to the ViewingPlatform
+ OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+
+ // Create GUI
+ JPanel p = new JPanel();
+ BoxLayout boxlayout = new BoxLayout(p,
+ BoxLayout.Y_AXIS);
+ p.add(createGeometryByReferencePanel());
+ p.add(createUpdatePanel());
+ p.setLayout(boxlayout);
+
+ contentPane.add("South", p);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ Object target = e.getSource();
+ GeometryArray geo;
+ boolean setColor = false, setVertex = false;
+ if (target == geomType) {
+ geo = geoArrays[geomType.getSelectedIndex()];
+ // Set everything to null, and set it later ..
+ geo.setColorRefBuffer(null);
+ geo.setCoordRefBuffer(null);
+ shape.setGeometry(geoArrays[geomType.getSelectedIndex()]);
+
+ setColor = true;
+ setVertex= true;
+
+
+ }
+ else if (target == transparency) {
+ if (transparency.isSelected()) {
+ transp.setTransparencyMode(TransparencyAttributes.BLENDED);
+ }
+ else {
+ transp.setTransparencyMode(TransparencyAttributes.NONE);
+ }
+
+ }
+ else if (target == updates) {
+ updateIndex = updates.getSelectedIndex();
+ if (updateIndex == 1) {
+ System.out.println("Doing coordinate update");
+ ((GeometryArray)(shape.getGeometry())).updateData(this);
+ }
+ else if (updateIndex == 2) {
+ System.out.println("Doing color update");
+ ((GeometryArray)(shape.getGeometry())).updateData(this);
+ }
+
+ }
+
+ if (setVertex) {
+ geo = (GeometryArray) shape.getGeometry();
+ if (geo instanceof IndexedGeometryArray)
+ geo.setCoordRefBuffer(indexedFloatBufferCoord);
+ else
+ geo.setCoordRefBuffer(floatBufferCoord);
+
+ }
+ if (setColor) {
+ geo = (GeometryArray) shape.getGeometry();
+ if (geo instanceof IndexedGeometryArray)
+ geo.setColorRefBuffer(indexedFloatBufferColor);
+ else
+ geo.setColorRefBuffer(floatBufferColor);
+ }
+ }
+
+
+
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ Frame frame = new MainFrame(new GeometryByReferenceNIOBuffer(), 800, 800);
+ }
+
+ public GeometryArray createGeometry (int type) {
+ GeometryArray tetra = null;
+ if (type == 1) {
+ tetra =new TriangleArray(12,
+ TriangleArray.COORDINATES|
+ TriangleArray.COLOR_3|
+ TriangleArray.BY_REFERENCE|
+ TriangleArray.USE_NIO_BUFFER);
+
+ tetra.setCoordRefBuffer(floatBufferCoord);
+ tetra.setColorRefBuffer(floatBufferColor);
+
+ }
+ else if (type == 2) {
+ tetra = new TriangleStripArray(12,
+ TriangleStripArray.COORDINATES|
+ TriangleStripArray.COLOR_3|
+ TriangleStripArray.BY_REFERENCE|
+ TriangleStripArray.USE_NIO_BUFFER,
+ stripVertexCounts);
+ tetra.setCoordRefBuffer(floatBufferCoord);
+ tetra.setColorRefBuffer(floatBufferColor);
+
+ }
+ else if (type == 3) { // Indexed Geometry
+ tetra = new IndexedTriangleArray(4,
+ IndexedTriangleArray.COORDINATES|
+ IndexedTriangleArray.COLOR_3|
+ IndexedTriangleArray.BY_REFERENCE|
+ IndexedTriangleArray.USE_NIO_BUFFER,
+ //IndexedTriangleStripArray.USE_COORD_INDEX_ONLY,
+ 12);
+ tetra.setCoordRefBuffer(indexedFloatBufferCoord);
+ tetra.setColorRefBuffer(indexedFloatBufferColor);
+ ((IndexedTriangleArray)tetra).setCoordinateIndices(0, indices);
+ ((IndexedTriangleArray)tetra).setColorIndices(0, indices);
+ }
+ else if (type == 4) { // Indexed strip geometry
+ tetra = new IndexedTriangleStripArray(4,
+ IndexedTriangleStripArray.COORDINATES|
+ IndexedTriangleStripArray.COLOR_3|
+ IndexedTriangleStripArray.BY_REFERENCE|
+ IndexedTriangleStripArray.USE_NIO_BUFFER|
+ IndexedTriangleStripArray.USE_COORD_INDEX_ONLY,
+ 12,
+ stripVertexCounts);
+ tetra.setCoordRefBuffer(indexedFloatBufferCoord);
+ tetra.setColorRefBuffer(indexedFloatBufferColor);
+ ((IndexedTriangleStripArray)tetra).setCoordinateIndices(0, indices);
+ /*
+ // Do not set color indices in UCIO mode
+ ((IndexedTriangleStripArray)tetra).setColorIndices(0, indices);
+ */
+ }
+
+ if (tetra != null)
+ tetra.setCapability(GeometryArray.ALLOW_REF_DATA_WRITE);
+ return tetra;
+ }
+
+ public void updateData(Geometry geometry) {
+ int i;
+ float val;
+ float val1;
+ if (updateIndex == 1) { // geometry
+ // Translate the geometry by a small amount in x
+ vertexCount++;
+ if ((vertexCount &1) == 1)
+ val = 0.2f;
+ else
+ val = -0.2f;
+
+ FloatBuffer indexedCoord = (FloatBuffer)indexedFloatBufferCoord.getBuffer();
+ indexedCoord.rewind();
+ FloatBuffer coord = (FloatBuffer)floatBufferCoord.getBuffer();
+ coord.rewind();
+
+ if (vertexIndex == 0) {
+ // Do Indexed geometry
+ for (i = 0; i < indexedCoord.limit(); i+=3) {
+ val1 = indexedCoord.get(i);
+ indexedCoord.put(i, val1 + val);
+ }
+ // Do non-indexed float geometry
+ for (i = 0; i < coord.limit(); i+=3) {
+ val1 = coord.get(i);
+ coord.put(i, val1 + val);
+ }
+ }
+ }
+ else if (updateIndex == 2) { // colors
+ colorCount++;
+ if ((colorCount & 1) == 1)
+ val = 0.4f;
+ else
+ val = -0.4f;
+
+ FloatBuffer indexedColors = (FloatBuffer)indexedFloatBufferColor.getBuffer();
+ indexedColors.rewind();
+ FloatBuffer colors = (FloatBuffer)floatBufferColor.getBuffer();
+ colors.rewind();
+
+ if (colorIndex == 0) {
+ // Do Indexed geometry
+ for (i = 0; i < indexedColors.limit(); i+=3) {
+ indexedColors.put(i, indexedColors.get(i) + val);
+ }
+ // Do non-indexed float geometry
+ for (i = 0; i < colors.limit(); i+=3) {
+ colors.put(i, colors.get(i) + val);
+ }
+ }
+
+ }
+
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/GeometryByReferenceTest.java b/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/GeometryByReferenceTest.java
new file mode 100644
index 0000000..55be4a5
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/GeometryByReferenceTest.java
@@ -0,0 +1,584 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.geometry_by_ref;
+
+import java.awt.Container;
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.BoxLayout;
+import javax.swing.JApplet;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.border.TitledBorder;
+
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Geometry;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.GeometryUpdater;
+import org.jogamp.java3d.IndexedGeometryArray;
+import org.jogamp.java3d.IndexedTriangleArray;
+import org.jogamp.java3d.IndexedTriangleStripArray;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.RenderingAttributes;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TransparencyAttributes;
+import org.jogamp.java3d.TriangleArray;
+import org.jogamp.java3d.TriangleStripArray;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3f;
+
+public class GeometryByReferenceTest extends JApplet implements ActionListener,
+GeometryUpdater {
+
+ RenderingAttributes ra;
+ ColoringAttributes ca;
+ Material mat;
+ Appearance app;
+ JComboBox geomType;
+ JComboBox vertexType;
+ JComboBox colorType;
+ JCheckBox transparency;
+ JComboBox updates;
+ Shape3D shape;
+ TransparencyAttributes transp;
+ int updateIndex = 0;
+ int colorCount = 0, vertexCount = 0;
+ int vertexIndex = 0, colorIndex = 0;
+
+ GeometryArray tetraRegular, tetraStrip, tetraIndexed, tetraIndexedStrip;
+ GeometryArray[] geoArrays = new GeometryArray[4];
+
+ private static final float sqrt3 = (float) Math.sqrt(3.0);
+ private static final float sqrt3_3 = sqrt3 / 3.0f;
+ private static final float sqrt24_3 = (float) Math.sqrt(24.0) / 3.0f;
+
+ private static final float ycenter = 0.5f * sqrt24_3;
+ private static final float zcenter = -sqrt3_3;
+
+ private static final Point3f p1 =
+ new Point3f(-1.0f, -ycenter, -zcenter);
+ private static final Point3f p2 =
+ new Point3f(1.0f, -ycenter, -zcenter);
+ private static final Point3f p3 =
+ new Point3f(0.0f, -ycenter, -sqrt3 - zcenter);
+ private static final Point3f p4 =
+ new Point3f(0.0f, sqrt24_3 - ycenter, 0.0f);
+
+
+ private static final float[] floatVerts = {
+ p1.x, p1.y, p1.z, // front face
+ p2.x, p2.y, p2.z,
+ p4.x, p4.y, p4.z,
+
+ p1.x, p1.y, p1.z,// left, back face
+ p4.x, p4.y, p4.z,
+ p3.x, p3.y, p3.z,
+
+ p2.x, p2.y, p2.z,// right, back face
+ p3.x, p3.y, p3.z,
+ p4.x, p4.y, p4.z,
+
+ p1.x, p1.y, p1.z,// bottom face
+ p3.x, p3.y, p3.z,
+ p2.x, p2.y, p2.z,
+ };
+
+ private static final Color3f c1 = new Color3f(0.6f, 0.0f, 0.0f);
+ private static final Color3f c2 = new Color3f(0.0f, 0.6f, 0.0f);
+ private static final Color3f c3 = new Color3f(0.0f, 0.6f, 0.6f);
+ private static final Color3f c4 = new Color3f(0.6f, 0.6f, 0.0f);
+
+
+ private static final float[] floatClrs = {
+ c1.x, c1.y, c1.z, // front face
+ c2.x, c2.y, c2.z,
+ c4.x, c4.y, c4.z,
+
+ c1.x, c1.y, c1.z,// left, back face
+ c4.x, c4.y, c4.z,
+ c3.x, c3.y, c3.z,
+
+ c2.x, c2.y, c2.z,// right, back face
+ c3.x, c3.y, c3.z,
+ c4.x, c4.y, c4.z,
+
+ c1.x, c1.y, c1.z,// bottom face
+ c3.x, c3.y, c3.z,
+ c2.x, c2.y, c2.z,
+ } ;
+
+ private static final float[] indexedFloatVerts = {
+ p1.x,p1.y,p1.z,
+ p2.x,p2.y,p2.z,
+ p3.x,p3.y,p3.z,
+ p4.x,p4.y,p4.z,
+
+ };
+ private static final float[] indexedFloatClrs = {
+ c1.x,c1.y,c1.z,
+ c2.x,c2.y,c2.z,
+ c3.x,c3.y,c3.z,
+ c4.x,c4.y,c4.z,
+ };
+ private static final Point3f[] p3fVerts = {
+ p1, p2, p4, p1, p4, p3, p2, p3, p4, p1, p3, p2};
+
+ private static final Point3f[] indexedP3fVerts = {p1, p2, p3, p4};
+
+ private static final Color3f[] c3fClrs = {
+ c1, c2, c4, c1, c4, c3, c2, c3, c4, c1, c3, c2};
+
+ private static final Color3f[] indexedC3fClrs = {c1, c2, c3, c4};
+
+
+ private static final int[] indices = {0,1,3,0,3,2,1,2,3,0,2,1};
+ private int[] stripVertexCounts = {3,3,3,3};
+
+ private SimpleUniverse u;
+
+ BranchGroup createSceneGraph() {
+ BranchGroup objRoot = new BranchGroup();
+
+ // Set up attributes to render lines
+ app = new Appearance();
+
+ transp = new TransparencyAttributes();
+ transp.setTransparency(0.5f);
+ transp.setCapability(TransparencyAttributes.ALLOW_MODE_WRITE);
+ transp.setTransparencyMode(TransparencyAttributes.NONE);
+ app.setTransparencyAttributes(transp);
+
+ tetraRegular = createGeometry(1);
+ tetraStrip =createGeometry(2);
+ tetraIndexed = createGeometry(3);
+ tetraIndexedStrip = createGeometry(4);
+
+ geoArrays[0] = tetraRegular;
+ geoArrays[1] = tetraStrip;
+ geoArrays[2] = tetraIndexed;
+ geoArrays[3] = tetraIndexedStrip;
+
+ shape = new Shape3D(tetraRegular, app);
+ shape.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
+ shape.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
+
+ Transform3D t = new Transform3D();
+ // move the object upwards
+ t.set(new Vector3f(0.0f, 0.3f, 0.0f));
+
+ // rotate the shape
+ Transform3D temp = new Transform3D();
+ temp.rotX(Math.PI/4.0d);
+ t.mul(temp);
+ temp.rotY(Math.PI/4.0d);
+ t.mul(temp);
+
+ // Shrink the object
+ t.setScale(0.6);
+
+ TransformGroup trans = new TransformGroup(t);
+ trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+
+ objRoot.addChild(trans);
+ trans.addChild(shape);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the global lights
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+
+ AmbientLight aLgt = new AmbientLight(alColor);
+ aLgt.setInfluencingBounds(bounds);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ lgt1.setInfluencingBounds(bounds);
+ objRoot.addChild(aLgt);
+ objRoot.addChild(lgt1);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ JPanel createGeometryByReferencePanel() {
+ JPanel panel = new JPanel();
+ panel.setBorder(new TitledBorder("Geometry Type"));
+
+ String values[] = {"Array", "Strip", "Indexed", "IndexedStrip"};
+ geomType = new JComboBox(values);
+ geomType.setLightWeightPopupEnabled(false);
+ geomType.addActionListener(this);
+ geomType.setSelectedIndex(0);
+ panel.add(new JLabel("Geometry Type"));
+ panel.add(geomType);
+
+
+ String vertex_types[] = { "Float","P3F"};
+
+ vertexType = new JComboBox(vertex_types);
+ vertexType.setLightWeightPopupEnabled(false);
+ vertexType.addActionListener(this);
+ vertexType.setSelectedIndex(0);
+ panel.add(new JLabel("VertexType"));
+ panel.add(vertexType);
+
+
+ String color_types[] = { "Float","C3F"};
+
+ colorType = new JComboBox(color_types);
+ colorType.setLightWeightPopupEnabled(false);
+ colorType.addActionListener(this);
+ colorType.setSelectedIndex(0);
+ panel.add(new JLabel("ColorType"));
+ panel.add(colorType);
+
+
+
+
+ return panel;
+ }
+
+ JPanel createUpdatePanel() {
+
+ JPanel panel = new JPanel();
+ panel.setBorder(new TitledBorder("Other Attributes"));
+
+ String updateComp[] = { "None","Geometry", "Color"};
+
+ transparency = new JCheckBox("EnableTransparency",
+ false);
+ transparency.addActionListener(this);
+ panel.add(transparency);
+
+
+ updates = new JComboBox(updateComp);
+ updates.setLightWeightPopupEnabled(false);
+ updates.addActionListener(this);
+ updates.setSelectedIndex(0);
+ panel.add(new JLabel("UpdateData"));
+ panel.add(updates);
+
+ return panel;
+ }
+
+
+
+ public GeometryByReferenceTest() {
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ Container contentPane = getContentPane();
+
+ Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
+ contentPane.add("Center", c);
+
+ BranchGroup scene = createSceneGraph();
+ // SimpleUniverse is a Convenience Utility class
+ u = new SimpleUniverse(c);
+
+ // add mouse behaviors to the viewingPlatform
+ ViewingPlatform viewingPlatform = u.getViewingPlatform();
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+ u.addBranchGraph(scene);
+
+ // add Orbit behavior to the ViewingPlatform
+ OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+
+ // Create GUI
+ JPanel p = new JPanel();
+ BoxLayout boxlayout = new BoxLayout(p,
+ BoxLayout.Y_AXIS);
+ p.add(createGeometryByReferencePanel());
+ p.add(createUpdatePanel());
+ p.setLayout(boxlayout);
+
+ contentPane.add("South", p);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ Object target = e.getSource();
+ GeometryArray geo;
+ boolean setColor = false, setVertex = false;
+ if (target == geomType) {
+ geo = geoArrays[geomType.getSelectedIndex()];
+ // Set everything to null, and set it later ..
+ geo.setColorRefFloat(null);
+ geo.setColorRef3f(null);
+ geo.setCoordRefFloat(null);
+ geo.setCoordRef3f(null);
+ shape.setGeometry(geoArrays[geomType.getSelectedIndex()]);
+
+ setColor = true;
+ setVertex= true;
+
+
+ }
+ else if (target == transparency) {
+ if (transparency.isSelected()) {
+ transp.setTransparencyMode(TransparencyAttributes.BLENDED);
+ }
+ else {
+ transp.setTransparencyMode(TransparencyAttributes.NONE);
+ }
+
+
+ }
+ else if (target == updates) {
+ updateIndex = updates.getSelectedIndex();
+ if (updateIndex == 1) {
+ System.out.println("Doing coordinate update");
+ ((GeometryArray)(shape.getGeometry())).updateData(this);
+ }
+ else if (updateIndex == 2) {
+ System.out.println("Doing color update");
+ ((GeometryArray)(shape.getGeometry())).updateData(this);
+ }
+
+ }
+ else if (target == vertexType) {
+ geo = ((GeometryArray)shape.getGeometry());
+ if (vertexIndex == 0) {
+ geo.setCoordRefFloat(null);
+ }
+ else if (vertexIndex == 1) {
+ geo.setCoordRef3f(null);
+ }
+ vertexIndex = vertexType.getSelectedIndex();
+ setVertex = true;
+ }
+ else if (target == colorType) {
+ geo = (GeometryArray) shape.getGeometry();
+ if (colorIndex == 0) {
+ geo.setColorRefFloat(null);
+ }
+ else if (colorIndex == 1) {
+ geo.setColorRef3f(null);
+ }
+ colorIndex = colorType.getSelectedIndex();
+ setColor = true;
+ }
+
+ if (setVertex) {
+ geo = (GeometryArray) shape.getGeometry();
+ if (vertexIndex == 0) {
+ if (geo instanceof IndexedGeometryArray)
+ geo.setCoordRefFloat(indexedFloatVerts);
+ else
+ geo.setCoordRefFloat(floatVerts);
+ }
+ else if (vertexIndex == 1) {
+ if (geo instanceof IndexedGeometryArray)
+ geo.setCoordRef3f(indexedP3fVerts);
+ else
+ geo.setCoordRef3f(p3fVerts);
+ }
+
+ }
+ if (setColor) {
+ geo = (GeometryArray) shape.getGeometry();
+ if (colorIndex == 0) {
+ if (geo instanceof IndexedGeometryArray)
+ geo.setColorRefFloat(indexedFloatClrs);
+ else
+ geo.setColorRefFloat(floatClrs);
+ }
+ else if (colorIndex == 1) {
+ if (geo instanceof IndexedGeometryArray)
+ geo.setColorRef3f(indexedC3fClrs);
+ else
+ geo.setColorRef3f(c3fClrs);
+ }
+ }
+
+ }
+
+
+
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ Frame frame = new MainFrame(new GeometryByReferenceTest(), 800, 800);
+ }
+
+ public GeometryArray createGeometry (int type) {
+ GeometryArray tetra = null;
+ if (type == 1) {
+ tetra =new TriangleArray(12,
+ TriangleArray.COORDINATES|
+ TriangleArray.COLOR_3|
+ TriangleArray.BY_REFERENCE);
+
+ tetra.setCoordRefFloat(floatVerts);
+ tetra.setColorRefFloat(floatClrs);
+
+ }
+ else if (type == 2) {
+ tetra = new TriangleStripArray(12,
+ TriangleStripArray.COORDINATES|
+ TriangleStripArray.COLOR_3|
+ TriangleStripArray.BY_REFERENCE,
+ stripVertexCounts);
+ tetra.setCoordRefFloat(floatVerts);
+ tetra.setColorRefFloat(floatClrs);
+
+ }
+ else if (type == 3) { // Indexed Geometry
+ tetra = new IndexedTriangleArray(4,
+ IndexedTriangleArray.COORDINATES|
+ IndexedTriangleArray.COLOR_3|
+ IndexedTriangleArray.BY_REFERENCE,
+ 12);
+ tetra.setCoordRefFloat(indexedFloatVerts);
+ tetra.setColorRefFloat(indexedFloatClrs);
+ ((IndexedTriangleArray)tetra).setCoordinateIndices(0, indices);
+ ((IndexedTriangleArray)tetra).setColorIndices(0, indices);
+ }
+ else if (type == 4) { // Indexed strip geometry
+ tetra = new IndexedTriangleStripArray(4,
+ IndexedTriangleStripArray.COORDINATES|
+ IndexedTriangleStripArray.COLOR_3|
+ IndexedTriangleStripArray.BY_REFERENCE,
+ 12,
+ stripVertexCounts);
+ tetra.setCoordRefFloat(indexedFloatVerts);
+ tetra.setColorRefFloat(indexedFloatClrs);
+ ((IndexedTriangleStripArray)tetra).setCoordinateIndices(0, indices);
+ ((IndexedTriangleStripArray)tetra).setColorIndices(0, indices);
+ }
+
+ if (tetra != null)
+ tetra.setCapability(GeometryArray.ALLOW_REF_DATA_WRITE);
+ return tetra;
+ }
+
+ public void updateData(Geometry geometry) {
+ int i;
+ float val;
+
+
+ if (updateIndex == 1) { // geometry
+ // Translate the geometry by a small amount in x
+ vertexCount++;
+ if ((vertexCount &1) == 1)
+ val = 0.2f;
+ else
+ val = -0.2f;
+
+ if (vertexIndex == 0) {
+ // Do Indexed geometry
+ for (i = 0; i < indexedFloatVerts.length; i+=3) {
+ indexedFloatVerts[i] += val;
+ }
+ // Do non-indexed float geometry
+ for (i = 0; i < floatVerts.length; i+=3) {
+ floatVerts[i] += val;
+ }
+ }
+ else {
+ // If p3f do each point only once
+ for (i = 0; i < indexedP3fVerts.length; i++) {
+ indexedP3fVerts[i].x += val;
+ }
+ }
+
+ }
+ else if (updateIndex == 2) { // colors
+ colorCount++;
+ if ((colorCount & 1) == 1)
+ val = 0.4f;
+ else
+ val = -0.4f;
+ if (colorIndex == 0) {
+ // Do Indexed geometry
+ for (i = 0; i < indexedFloatClrs.length; i+=3) {
+ indexedFloatClrs[i] += val;
+ }
+ // Do non-indexed float geometry
+ for (i = 0; i < floatClrs.length; i+=3) {
+ floatClrs[i] += val;
+ }
+ }
+ else {
+ // If c3f do each point only once
+ for (i = 0; i < indexedC3fClrs.length; i++) {
+ indexedC3fClrs[i].x += val;
+ }
+ }
+
+ }
+
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/ImageComponentByReferenceTest.java b/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/ImageComponentByReferenceTest.java
new file mode 100644
index 0000000..6829952
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/ImageComponentByReferenceTest.java
@@ -0,0 +1,331 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.geometry_by_ref;
+
+import java.awt.Container;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.image.BufferedImage;
+import java.awt.image.RenderedImage;
+
+import javax.swing.BoxLayout;
+import javax.swing.JApplet;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.ImageComponent;
+import org.jogamp.java3d.ImageComponent2D;
+import org.jogamp.java3d.Raster;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.Texture2D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.geometry.Box;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3f;
+
+public class ImageComponentByReferenceTest extends JApplet implements ActionListener {
+
+ Shape3D s1,s2;
+ TextureLoader t0, t1, t2;
+ int count = 0;
+
+ Appearance app = new Appearance();
+ BranchGroup objRoot = new BranchGroup();
+ TransformGroup objTrans = new TransformGroup();
+ BufferedImage bImage1;
+ TiledImage checkBoard;
+ boolean yUp = false;
+ boolean byRef = true;
+ JComboBox rasterType, texType;
+ ImageComponent2D[] image = new ImageComponent2D[8];
+ Appearance dummyApp = new Appearance();
+ Texture2D texOne, texCheckBoard;
+ Raster raster;
+ Box textureCube;
+ Shape3D boxShape;
+ int w1 = 64, h1 = 32, checkw = 16 , checkh = 16;
+
+ private java.net.URL texImage = null;
+
+ private SimpleUniverse u = null;
+
+ public BranchGroup createSceneGraph() {
+ objRoot = new BranchGroup();
+
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.setCapability(Group.ALLOW_CHILDREN_WRITE);
+
+ objRoot.addChild(objTrans);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ app.setCapability(Appearance.ALLOW_TEXTURE_WRITE);
+
+
+ textureCube = new Box(0.4f, 0.4f, 0.4f,
+ Box.GENERATE_TEXTURE_COORDS|
+ Box.GENERATE_NORMALS, app);
+ boxShape = textureCube.getShape(Box.FRONT);
+ boxShape.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
+ objTrans.addChild(textureCube);
+
+ checkBoard = new TiledImage();
+ TextureLoader texLoader = new TextureLoader( texImage, this);
+ ImageComponent2D oneImage = texLoader.getImage();
+ bImage1 = oneImage.getImage();
+
+ int index = 0;
+ image[index++] = new ImageComponent2D(oneImage.getFormat(),
+ (RenderedImage)bImage1,
+ false,
+ true);
+
+ image[index++] = new ImageComponent2D(oneImage.getFormat(),
+ (RenderedImage)bImage1,
+ true,
+ true);
+
+
+ image[index++] = new ImageComponent2D(oneImage.getFormat(),
+ (RenderedImage)bImage1,
+ false,
+ false);
+
+
+ image[index++] = new ImageComponent2D(oneImage.getFormat(),
+ (RenderedImage)bImage1,
+ true,
+ false);
+
+ createRaster(objRoot);
+
+ image[index++] = new ImageComponent2D(ImageComponent.FORMAT_RGBA,
+ checkBoard,
+ false,
+ true);
+
+ image[index++] = new ImageComponent2D(ImageComponent.FORMAT_RGBA,
+ checkBoard,
+ true,
+ true);
+
+
+ image[index++] = new ImageComponent2D(ImageComponent.FORMAT_RGBA,
+ checkBoard,
+ false,
+ false);
+
+
+ image[index++] = new ImageComponent2D(ImageComponent.FORMAT_RGBA,
+ checkBoard,
+ true,
+ false);
+
+
+
+ texOne = new Texture2D(Texture.BASE_LEVEL,
+ Texture.RGBA,
+ image[2].getWidth(), image[2].getHeight());
+
+ texOne.setCapability(Texture.ALLOW_IMAGE_WRITE);
+ texOne.setImage(0, image[2]);
+
+ app.setTexture(texOne);
+
+ texCheckBoard = new Texture2D(Texture.BASE_LEVEL,
+ Texture.RGBA,
+ image[4].getWidth(), image[4].getHeight());
+
+ texCheckBoard.setCapability(Texture.ALLOW_IMAGE_WRITE);
+ objRoot.compile();
+ return objRoot;
+ }
+
+ public void actionPerformed(ActionEvent e ) {
+ Object target = e.getSource();
+
+ if (target == rasterType) {
+ if (rasterType.getSelectedIndex() < 4) {
+ raster.setSize(w1, h1);
+ }
+ else {
+ raster.setSize(checkw, checkh);
+ }
+ raster.setImage(image[rasterType.getSelectedIndex()]);
+ }
+ else if (target == texType) {
+ boxShape.setAppearance(dummyApp);
+ if (texType.getSelectedIndex() < 4) {
+ texOne.setImage(0, image[texType.getSelectedIndex()]);
+ app.setTexture(texOne);
+ }
+ else {
+ texCheckBoard.setImage(0, image[texType.getSelectedIndex()]);
+ app.setTexture(texCheckBoard);
+ }
+
+ boxShape.setAppearance(app);
+ }
+
+
+ }
+
+ JPanel createImagePanel() {
+ JPanel panel = new JPanel();
+ String texVals[] = { "One_Yup_ByCopy",
+ "One_Yup_ByReference",
+ "One_Ydown_ByCopy",
+ "One_Ydown_ByReference",
+ "Checkered_Yup_ByCopy",
+ "Checkered_Yup_ByReference",
+ "Checkered_Ydown_ByCopy",
+ "Checkered_Ydown_ByReference"};
+
+ rasterType = new JComboBox(texVals);
+ rasterType.setLightWeightPopupEnabled(false);
+ rasterType.addActionListener(this);
+ rasterType.setSelectedIndex(2);
+ panel.add(new JLabel("Raster Image"));
+ panel.add(rasterType);
+
+ texType = new JComboBox(texVals);
+ texType.setLightWeightPopupEnabled(false);
+ texType.addActionListener(this);
+ texType.setSelectedIndex(2);
+ panel.add(new JLabel("Texture Image"));
+ panel.add(texType);
+ return panel;
+
+ }
+
+
+
+ public ImageComponentByReferenceTest()
+ {
+ }
+
+ public ImageComponentByReferenceTest(java.net.URL url) {
+ texImage = url;
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+
+ texImage = Resources.getResource("resources/images/one.jpg");
+ if (texImage == null) {
+ System.err.println("resources/images/one.jpg not found");
+ System.exit(1);
+ }
+
+ Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
+ BranchGroup scene = createSceneGraph();u = new SimpleUniverse(c);
+ u.getViewingPlatform().setNominalViewingTransform();
+ u.addBranchGraph(scene);
+ Container contentPane = getContentPane();
+ JPanel p = new JPanel();
+ BoxLayout boxlayout = new BoxLayout(p,
+ BoxLayout.Y_AXIS);
+ p.setLayout(boxlayout);
+ contentPane.add("Center", c);
+
+ contentPane.add("South", p);
+
+ p.add(createImagePanel());
+
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.net.URL url = null;
+ // the path to the image file for an application
+ url = Resources.getResource("resources/images/one.jpg");
+ if (url == null) {
+ System.err.println("resources/images/one.jpg not found");
+ System.exit(1);
+ }
+
+ new MainFrame(new ImageComponentByReferenceTest(url), 800, 700);
+ }
+
+ void createRaster( BranchGroup scene) {
+ // Create raster geometries and shapes
+ Vector3f trans = new Vector3f( );
+ Transform3D tr = new Transform3D( );
+ TransformGroup tg;
+
+ // Left
+ raster = new Raster( );
+ raster.setCapability(Raster.ALLOW_IMAGE_WRITE);
+ raster.setCapability(Raster.ALLOW_SIZE_WRITE);
+ raster.setPosition( new Point3f( -0.9f, 0.75f, 0.0f ) );
+ raster.setType( Raster.RASTER_COLOR );
+ raster.setOffset( 0, 0 );
+
+ raster.setSize( image[2].getWidth(), image[2].getHeight() );
+ raster.setImage( image[2] );
+ Shape3D sh = new Shape3D( raster, new Appearance( ) );
+ scene.addChild( sh );
+ }
+}
+
+
+
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/InterleavedNIOBuffer.java b/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/InterleavedNIOBuffer.java
new file mode 100644
index 0000000..2d642f2
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/InterleavedNIOBuffer.java
@@ -0,0 +1,561 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.geometry_by_ref;
+
+import java.awt.Container;
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+import javax.swing.BoxLayout;
+import javax.swing.JApplet;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.border.TitledBorder;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.IndexedTriangleArray;
+import org.jogamp.java3d.IndexedTriangleStripArray;
+import org.jogamp.java3d.J3DBuffer;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.RenderingAttributes;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.TextureAttributes;
+import org.jogamp.java3d.TextureUnitState;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TransparencyAttributes;
+import org.jogamp.java3d.TriangleArray;
+import org.jogamp.java3d.TriangleStripArray;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point2f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3f;
+
+public class InterleavedNIOBuffer extends JApplet implements ActionListener {
+
+ RenderingAttributes ra;
+ ColoringAttributes ca;
+ Material mat;
+ Appearance app;
+ JComboBox geomType;
+ JCheckBox transparency;
+ JCheckBox textureBox;
+ Shape3D shape;
+ TransparencyAttributes transp;
+
+ GeometryArray tetraRegular, tetraStrip, tetraIndexed, tetraIndexedStrip;
+ GeometryArray[] geoArrays = new GeometryArray[4];
+
+ // Globally used colors
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f red = new Color3f(1.0f, 0.0f, 0.0f);
+ Color3f green = new Color3f(0.0f, 1.0f, 0.0f);
+ Color3f blue = new Color3f(0.0f, 0.0f, 1.0f);
+ Color3f[] colors = {white, red, green, blue};
+
+ private static final float sqrt3 = (float) Math.sqrt(3.0);
+ private static final float sqrt3_3 = sqrt3 / 3.0f;
+ private static final float sqrt24_3 = (float) Math.sqrt(24.0) / 3.0f;
+
+ private static final float ycenter = 0.5f * sqrt24_3;
+ private static final float zcenter = -sqrt3_3;
+
+ private static final Point3f p1 =
+ new Point3f(-1.0f, -ycenter, -zcenter);
+ private static final Point3f p2 =
+ new Point3f(1.0f, -ycenter, -zcenter);
+ private static final Point3f p3 =
+ new Point3f(0.0f, -ycenter, -sqrt3 - zcenter);
+ private static final Point3f p4 =
+ new Point3f(0.0f, sqrt24_3 - ycenter, 0.0f);
+
+ private static final Point2f t1 = new Point2f(0.0f, 0.0f);
+ private static final Point2f t2 = new Point2f(0.5f, 1.0f);
+ private static final Point2f t3 = new Point2f(1.0f, 0.0f);
+ private static final Point2f t4 = new Point2f(1.0f, 1.0f);
+
+ private static final Color3f c1 = new Color3f(1.0f, 0.0f, 0.0f);
+ private static final Color3f c2 = new Color3f(0.0f, 1.0f, 0.0f);
+ private static final Color3f c3 = new Color3f(0.0f, 1.0f, 1.0f);
+ private static final Color3f c4 = new Color3f(1.0f, 1.0f, 0.0f);
+
+
+ private static final float[] interleaved = {
+ t1.x, t1.y,
+ t1.x, t1.y,
+ c1.x, c1.y, c1.z, // front face
+ p1.x, p1.y, p1.z, // front face
+ t2.x, t2.y,
+ t2.x, t2.y,
+ c2.x, c2.y, c2.z,
+ p2.x, p2.y, p2.z,
+ t4.x, t4.y,
+ t4.x, t4.y,
+ c4.x, c4.y, c4.z,
+ p4.x, p4.y, p4.z,
+
+ t1.x, t1.y,
+ t1.x, t1.y,
+ c1.x, c1.y, c1.z,// left, back face
+ p1.x, p1.y, p1.z,// left, back face
+ t4.x, t4.y,
+ t4.x, t4.y,
+ c4.x, c4.y, c4.z,
+ p4.x, p4.y, p4.z,
+ t3.x, t3.y,
+ t3.x, t3.y,
+ c3.x, c3.y, c3.z,
+ p3.x, p3.y, p3.z,
+
+ t2.x, t2.y,
+ t2.x, t2.y,
+ c2.x, c2.y, c2.z,// right, back face
+ p2.x, p2.y, p2.z,// right, back face
+ t3.x, t3.y,
+ t3.x, t3.y,
+ c3.x, c3.y, c3.z,
+ p3.x, p3.y, p3.z,
+ t4.x, t4.y,
+ t4.x, t4.y,
+ c4.x, c4.y, c4.z,
+ p4.x, p4.y, p4.z,
+
+ t1.x, t1.y,
+ t1.x, t1.y,
+ c1.x, c1.y, c1.z,// bottom face
+ p1.x, p1.y, p1.z,// bottom face
+ t3.x, t3.y,
+ t3.x, t3.y,
+ c3.x, c3.y, c3.z,
+ p3.x, p3.y, p3.z,
+ t2.x, t2.y,
+ t2.x, t2.y,
+ c2.x, c2.y, c2.z,
+ p2.x, p2.y, p2.z,
+ };
+
+ private static final float[] indexedInterleaved = {
+ t1.x,t1.y,
+ t1.x,t1.y,
+ c1.x,c1.y,c1.z,
+ p1.x,p1.y,p1.z,
+ t2.x,t2.y,
+ t2.x,t2.y,
+ c2.x,c2.y,c2.z,
+ p2.x,p2.y,p2.z,
+ t3.x,t3.y,
+ t3.x,t3.y,
+ c3.x,c3.y,c3.z,
+ p3.x,p3.y,p3.z,
+ t4.x,t4.y,
+ t4.x,t4.y,
+ c4.x,c4.y,c4.z,
+ p4.x,p4.y,p4.z,
+ };
+
+
+ private static final int[] indices = {0,1,3,0,3,2,1,2,3,0,2,1};
+ private int[] stripVertexCounts = {3,3,3,3};
+
+ TextureUnitState textureUnitState[] = new TextureUnitState[2];
+ Texture tex1;
+ Texture tex2;
+
+ private java.net.URL texImage1 = null;
+ private java.net.URL texImage2 = null;
+
+ private SimpleUniverse u;
+
+ private J3DBuffer interleavedBuffer;
+ private J3DBuffer indexedInterleavedBuffer;
+
+ void createInterleavedBuffers() {
+ int size;
+ ByteOrder order = ByteOrder.nativeOrder();
+
+ size = (2 + 2 + 3 + 3 ) * 3 * 4;
+ FloatBuffer vertex = ByteBuffer.allocateDirect(size * 4).order(order).asFloatBuffer();
+ vertex.put(interleaved, 0, size);
+ interleavedBuffer = new J3DBuffer(vertex);
+
+ size = ( 2 + 2 + 3 + 3) * 4;
+ FloatBuffer indexedVertex = ByteBuffer.allocateDirect(size * 4).order(order).asFloatBuffer();
+ indexedVertex.put(indexedInterleaved, 0, size);
+ indexedInterleavedBuffer = new J3DBuffer(indexedVertex);
+ }
+
+ BranchGroup createSceneGraph() {
+ BranchGroup objRoot = new BranchGroup();
+
+ // Set up attributes to render lines
+ app = new Appearance();
+ app.setCapability(Appearance.ALLOW_TEXTURE_UNIT_STATE_WRITE);
+
+ transp = new TransparencyAttributes();
+ transp.setTransparency(0.5f);
+ transp.setCapability(TransparencyAttributes.ALLOW_MODE_WRITE);
+ transp.setTransparencyMode(TransparencyAttributes.NONE);
+ app.setTransparencyAttributes(transp);
+
+ // load textures
+ TextureAttributes texAttr1 = new TextureAttributes();
+ texAttr1.setTextureMode(TextureAttributes.DECAL);
+ TextureAttributes texAttr2 = new TextureAttributes();
+ texAttr2.setTextureMode(TextureAttributes.MODULATE);
+
+ TextureLoader tex = new TextureLoader(texImage1, new String("RGB"), this);
+ if (tex == null)
+ return null;
+ tex1 = tex.getTexture();
+
+ tex = new TextureLoader(texImage2, new String("RGB"), this);
+ if (tex == null)
+ return null;
+ tex2 = tex.getTexture();
+
+ textureUnitState[0] = new TextureUnitState(tex1, texAttr1, null);
+ textureUnitState[1] = new TextureUnitState(tex2, texAttr2, null);
+
+ createInterleavedBuffers();
+
+ tetraRegular = createGeometry(1);
+ tetraStrip =createGeometry(2);
+ tetraIndexed = createGeometry(3);
+ tetraIndexedStrip = createGeometry(4);
+
+ geoArrays[0] = tetraRegular;
+ geoArrays[1] = tetraStrip;
+ geoArrays[2] = tetraIndexed;
+ geoArrays[3] = tetraIndexedStrip;
+
+ shape = new Shape3D(tetraRegular, app);
+ shape.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
+
+ Transform3D t = new Transform3D();
+ // move the object upwards
+ t.set(new Vector3f(0.0f, 0.3f, 0.0f));
+
+ // rotate the shape
+ Transform3D temp = new Transform3D();
+ temp.rotX(Math.PI/4.0d);
+ t.mul(temp);
+ temp.rotY(Math.PI/4.0d);
+ t.mul(temp);
+
+ // Shrink the object
+ t.setScale(0.6);
+
+ TransformGroup trans = new TransformGroup(t);
+ trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+
+ objRoot.addChild(trans);
+ trans.addChild(shape);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the global lights
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+
+ AmbientLight aLgt = new AmbientLight(alColor);
+ aLgt.setInfluencingBounds(bounds);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ lgt1.setInfluencingBounds(bounds);
+ objRoot.addChild(aLgt);
+ objRoot.addChild(lgt1);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ JPanel createGeometryByReferencePanel() {
+ JPanel panel = new JPanel();
+ panel.setBorder(new TitledBorder("Geometry Type"));
+
+ String values[] = {"Array", "Strip", "Indexed", "IndexedStrip"};
+ geomType = new JComboBox(values);
+ geomType.setLightWeightPopupEnabled(false);
+ geomType.addActionListener(this);
+ geomType.setSelectedIndex(0);
+ panel.add(new JLabel("Geometry Type"));
+ panel.add(geomType);
+
+ transparency = new JCheckBox("EnableTransparency",
+ false);
+ transparency.addActionListener(this);
+ panel.add(transparency);
+
+ textureBox = new JCheckBox("EnableTexture", false);
+ textureBox.addActionListener(this);
+ panel.add(textureBox);
+
+ return panel;
+ }
+
+ public InterleavedNIOBuffer() {
+ }
+
+ public InterleavedNIOBuffer(java.net.URL texURL1, java.net.URL texURL2) {
+ texImage1 = texURL1;
+ texImage2 = texURL2;
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+
+ // create textures
+ texImage1 = Resources.getResource("resources/images/bg.jpg");
+ if (texImage1 == null) {
+ System.err.println("resources/images/bg.jpg not found");
+ System.exit(1);
+ }
+
+ texImage2 = Resources.getResource("resources/images/one.jpg");
+ if (texImage2 == null) {
+ System.err.println("resources/images/one.jpg not found");
+ System.exit(1);
+ }
+
+ Container contentPane = getContentPane();
+
+ Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
+ contentPane.add("Center", c);
+
+ BranchGroup scene = createSceneGraph();
+ // SimpleUniverse is a Convenience Utility class
+ u = new SimpleUniverse(c);
+
+ // add mouse behaviors to the viewingPlatform
+ ViewingPlatform viewingPlatform = u.getViewingPlatform();
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ // add Orbit behavior to the viewing platform
+ OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+
+ u.addBranchGraph(scene);
+
+
+ // Create GUI
+ JPanel p = new JPanel();
+ BoxLayout boxlayout = new BoxLayout(p,
+ BoxLayout.Y_AXIS);
+ p.add(createGeometryByReferencePanel());
+ p.setLayout(boxlayout);
+
+ contentPane.add("South", p);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ Object target = e.getSource();
+ if (target == geomType) {
+ shape.setGeometry(geoArrays[geomType.getSelectedIndex()]);
+
+ }
+ else if (target == transparency) {
+ if (transparency.isSelected()) {
+ transp.setTransparencyMode(TransparencyAttributes.BLENDED);
+ }
+ else {
+ transp.setTransparencyMode(TransparencyAttributes.NONE);
+ }
+ }
+ else if (target == textureBox) {
+ if (textureBox.isSelected()) {
+ app.setTextureUnitState(textureUnitState);
+ }
+ else {
+ app.setTextureUnitState(null);
+ }
+ }
+ }
+
+
+
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.net.URL texURL1 = null;
+ java.net.URL texURL2 = null;
+ // the path to the image for an application
+ texURL1 = Resources.getResource("resources/images/bg.jpg");
+ if (texURL1 == null) {
+ System.err.println("resources/images/bg.jpg not found");
+ System.exit(1);
+ }
+
+ texURL2 = Resources.getResource("resources/images/one.jpg");
+ if (texURL2 == null) {
+ System.err.println("resources/images/one.jpg not found");
+ System.exit(1);
+ }
+
+ Frame frame = new MainFrame(new InterleavedNIOBuffer(texURL1, texURL2),
+ 800, 800);
+ }
+
+ public GeometryArray createGeometry (int type) {
+ GeometryArray tetra = null;
+ int texCoordSetMap[] = {0, 0};
+
+ if (type == 1) {
+ tetra =new TriangleArray(12,
+ TriangleArray.COORDINATES|
+ TriangleArray.COLOR_3|
+ /*
+ TriangleArray.NORMAL_3|
+ */
+ TriangleArray.TEXTURE_COORDINATE_2 |
+ TriangleArray.INTERLEAVED|
+ TriangleArray.BY_REFERENCE|
+ TriangleArray.USE_NIO_BUFFER,
+ 2, texCoordSetMap);
+
+ tetra.setInterleavedVertexBuffer(interleavedBuffer);
+
+ }
+ else if (type == 2) {
+ tetra = new TriangleStripArray(12,
+ TriangleStripArray.COORDINATES|
+ TriangleStripArray.COLOR_3|
+ /*
+ TriangleArray.NORMAL_3|
+ */
+ TriangleArray.TEXTURE_COORDINATE_2 |
+ TriangleStripArray.INTERLEAVED|
+ TriangleStripArray.BY_REFERENCE|
+ TriangleStripArray.USE_NIO_BUFFER,
+ 2, texCoordSetMap,
+ stripVertexCounts);
+ tetra.setInterleavedVertexBuffer(interleavedBuffer);
+
+
+ }
+ else if (type == 3) { // Indexed Geometry
+ tetra = new IndexedTriangleArray(4,
+ IndexedTriangleArray.COORDINATES|
+ IndexedTriangleArray.COLOR_3|
+ /*
+ IndexedTriangleArray.NORMAL_3|
+ */
+ IndexedTriangleArray.TEXTURE_COORDINATE_2 |
+ IndexedTriangleArray.INTERLEAVED|
+ IndexedTriangleArray.BY_REFERENCE|
+ IndexedTriangleArray.USE_NIO_BUFFER|
+ IndexedTriangleArray.USE_COORD_INDEX_ONLY,
+ 2, texCoordSetMap,
+ 12);
+ tetra.setInterleavedVertexBuffer(indexedInterleavedBuffer);
+ ((IndexedTriangleArray)tetra).setCoordinateIndices(0, indices);
+ /*
+ // Do not set color or texcoord indices in UCIO mode
+ ((IndexedTriangleArray)tetra).setColorIndices(0, indices);
+ ((IndexedTriangleArray)tetra).setTextureCoordinateIndices(
+ 0, 0, indices);
+ ((IndexedTriangleArray)tetra).setTextureCoordinateIndices(
+ 1, 0, indices);
+ */
+ }
+ else if (type == 4) { // Indexed strip geometry
+ tetra = new IndexedTriangleStripArray(4,
+ IndexedTriangleStripArray.COORDINATES|
+ IndexedTriangleStripArray.COLOR_3|
+ /*
+ IndexedTriangleArray.NORMAL_3|
+ */
+ IndexedTriangleArray.TEXTURE_COORDINATE_2 |
+ IndexedTriangleStripArray.INTERLEAVED|
+ IndexedTriangleStripArray.BY_REFERENCE|
+ IndexedTriangleStripArray.USE_NIO_BUFFER,
+ //IndexedTriangleStripArray.USE_COORD_INDEX_ONLY,
+ 2, texCoordSetMap,
+ 12,
+ stripVertexCounts);
+ tetra.setInterleavedVertexBuffer(indexedInterleavedBuffer);
+ ((IndexedTriangleStripArray)tetra).setCoordinateIndices(0, indices);
+ ((IndexedTriangleStripArray)tetra).setColorIndices(0, indices);
+ ((IndexedTriangleStripArray)tetra).setTextureCoordinateIndices(
+ 0, 0, indices);
+ ((IndexedTriangleStripArray)tetra).setTextureCoordinateIndices(
+ 1, 0, indices);
+ }
+ else if (type == 5) { // Interleaved array
+ }
+ return tetra;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/InterleavedTest.java b/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/InterleavedTest.java
new file mode 100644
index 0000000..0fd0217
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/InterleavedTest.java
@@ -0,0 +1,528 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.geometry_by_ref;
+
+import java.awt.Container;
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.BoxLayout;
+import javax.swing.JApplet;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.border.TitledBorder;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.IndexedTriangleArray;
+import org.jogamp.java3d.IndexedTriangleStripArray;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.RenderingAttributes;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.TextureAttributes;
+import org.jogamp.java3d.TextureUnitState;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TransparencyAttributes;
+import org.jogamp.java3d.TriangleArray;
+import org.jogamp.java3d.TriangleStripArray;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point2f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3f;
+
+public class InterleavedTest extends JApplet implements ActionListener {
+
+ RenderingAttributes ra;
+ ColoringAttributes ca;
+ Material mat;
+ Appearance app;
+ JComboBox geomType;
+ JCheckBox transparency;
+ JCheckBox textureBox;
+ Shape3D shape;
+ TransparencyAttributes transp;
+
+ GeometryArray tetraRegular, tetraStrip, tetraIndexed, tetraIndexedStrip;
+ GeometryArray[] geoArrays = new GeometryArray[4];
+
+ // Globally used colors
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f red = new Color3f(1.0f, 0.0f, 0.0f);
+ Color3f green = new Color3f(0.0f, 1.0f, 0.0f);
+ Color3f blue = new Color3f(0.0f, 0.0f, 1.0f);
+ Color3f[] colors = {white, red, green, blue};
+
+ private static final float sqrt3 = (float) Math.sqrt(3.0);
+ private static final float sqrt3_3 = sqrt3 / 3.0f;
+ private static final float sqrt24_3 = (float) Math.sqrt(24.0) / 3.0f;
+
+ private static final float ycenter = 0.5f * sqrt24_3;
+ private static final float zcenter = -sqrt3_3;
+
+ private static final Point3f p1 =
+ new Point3f(-1.0f, -ycenter, -zcenter);
+ private static final Point3f p2 =
+ new Point3f(1.0f, -ycenter, -zcenter);
+ private static final Point3f p3 =
+ new Point3f(0.0f, -ycenter, -sqrt3 - zcenter);
+ private static final Point3f p4 =
+ new Point3f(0.0f, sqrt24_3 - ycenter, 0.0f);
+
+ private static final Point2f t1 = new Point2f(0.0f, 0.0f);
+ private static final Point2f t2 = new Point2f(0.5f, 1.0f);
+ private static final Point2f t3 = new Point2f(1.0f, 0.0f);
+ private static final Point2f t4 = new Point2f(1.0f, 1.0f);
+
+ private static final Color3f c1 = new Color3f(1.0f, 0.0f, 0.0f);
+ private static final Color3f c2 = new Color3f(0.0f, 1.0f, 0.0f);
+ private static final Color3f c3 = new Color3f(0.0f, 1.0f, 1.0f);
+ private static final Color3f c4 = new Color3f(1.0f, 1.0f, 0.0f);
+
+
+ private static final float[] interleaved = {
+ t1.x, t1.y,
+ t1.x, t1.y,
+ c1.x, c1.y, c1.z, // front face
+ p1.x, p1.y, p1.z, // front face
+ t2.x, t2.y,
+ t2.x, t2.y,
+ c2.x, c2.y, c2.z,
+ p2.x, p2.y, p2.z,
+ t4.x, t4.y,
+ t4.x, t4.y,
+ c4.x, c4.y, c4.z,
+ p4.x, p4.y, p4.z,
+
+ t1.x, t1.y,
+ t1.x, t1.y,
+ c1.x, c1.y, c1.z,// left, back face
+ p1.x, p1.y, p1.z,// left, back face
+ t4.x, t4.y,
+ t4.x, t4.y,
+ c4.x, c4.y, c4.z,
+ p4.x, p4.y, p4.z,
+ t3.x, t3.y,
+ t3.x, t3.y,
+ c3.x, c3.y, c3.z,
+ p3.x, p3.y, p3.z,
+
+ t2.x, t2.y,
+ t2.x, t2.y,
+ c2.x, c2.y, c2.z,// right, back face
+ p2.x, p2.y, p2.z,// right, back face
+ t3.x, t3.y,
+ t3.x, t3.y,
+ c3.x, c3.y, c3.z,
+ p3.x, p3.y, p3.z,
+ t4.x, t4.y,
+ t4.x, t4.y,
+ c4.x, c4.y, c4.z,
+ p4.x, p4.y, p4.z,
+
+ t1.x, t1.y,
+ t1.x, t1.y,
+ c1.x, c1.y, c1.z,// bottom face
+ p1.x, p1.y, p1.z,// bottom face
+ t3.x, t3.y,
+ t3.x, t3.y,
+ c3.x, c3.y, c3.z,
+ p3.x, p3.y, p3.z,
+ t2.x, t2.y,
+ t2.x, t2.y,
+ c2.x, c2.y, c2.z,
+ p2.x, p2.y, p2.z,
+ };
+
+ private static final float[] indexedInterleaved = {
+ t1.x,t1.y,
+ t1.x,t1.y,
+ c1.x,c1.y,c1.z,
+ p1.x,p1.y,p1.z,
+ t2.x,t2.y,
+ t2.x,t2.y,
+ c2.x,c2.y,c2.z,
+ p2.x,p2.y,p2.z,
+ t3.x,t3.y,
+ t3.x,t3.y,
+ c3.x,c3.y,c3.z,
+ p3.x,p3.y,p3.z,
+ t4.x,t4.y,
+ t4.x,t4.y,
+ c4.x,c4.y,c4.z,
+ p4.x,p4.y,p4.z,
+ };
+
+
+ private static final int[] indices = {0,1,3,0,3,2,1,2,3,0,2,1};
+ private int[] stripVertexCounts = {3,3,3,3};
+
+ TextureUnitState textureUnitState[] = new TextureUnitState[2];
+ Texture tex1;
+ Texture tex2;
+
+ private java.net.URL texImage1 = null;
+ private java.net.URL texImage2 = null;
+
+ private SimpleUniverse u;
+
+ BranchGroup createSceneGraph() {
+ BranchGroup objRoot = new BranchGroup();
+
+ // Set up attributes to render lines
+ app = new Appearance();
+ app.setCapability(Appearance.ALLOW_TEXTURE_UNIT_STATE_WRITE);
+
+ transp = new TransparencyAttributes();
+ transp.setTransparency(0.5f);
+ transp.setCapability(TransparencyAttributes.ALLOW_MODE_WRITE);
+ transp.setTransparencyMode(TransparencyAttributes.NONE);
+ app.setTransparencyAttributes(transp);
+
+ // load textures
+ TextureAttributes texAttr1 = new TextureAttributes();
+ texAttr1.setTextureMode(TextureAttributes.DECAL);
+ TextureAttributes texAttr2 = new TextureAttributes();
+ texAttr2.setTextureMode(TextureAttributes.MODULATE);
+
+ TextureLoader tex = new TextureLoader(texImage1, new String("RGB"), this);
+ if (tex == null)
+ return null;
+ tex1 = tex.getTexture();
+
+ tex = new TextureLoader(texImage2, new String("RGB"), this);
+ if (tex == null)
+ return null;
+ tex2 = tex.getTexture();
+
+ textureUnitState[0] = new TextureUnitState(tex1, texAttr1, null);
+ textureUnitState[1] = new TextureUnitState(tex2, texAttr2, null);
+
+ tetraRegular = createGeometry(1);
+ tetraStrip =createGeometry(2);
+ tetraIndexed = createGeometry(3);
+ tetraIndexedStrip = createGeometry(4);
+
+ geoArrays[0] = tetraRegular;
+ geoArrays[1] = tetraStrip;
+ geoArrays[2] = tetraIndexed;
+ geoArrays[3] = tetraIndexedStrip;
+
+ shape = new Shape3D(tetraRegular, app);
+ shape.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
+
+ Transform3D t = new Transform3D();
+ // move the object upwards
+ t.set(new Vector3f(0.0f, 0.3f, 0.0f));
+
+ // rotate the shape
+ Transform3D temp = new Transform3D();
+ temp.rotX(Math.PI/4.0d);
+ t.mul(temp);
+ temp.rotY(Math.PI/4.0d);
+ t.mul(temp);
+
+ // Shrink the object
+ t.setScale(0.6);
+
+ TransformGroup trans = new TransformGroup(t);
+ trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+
+ objRoot.addChild(trans);
+ trans.addChild(shape);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the global lights
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+
+ AmbientLight aLgt = new AmbientLight(alColor);
+ aLgt.setInfluencingBounds(bounds);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ lgt1.setInfluencingBounds(bounds);
+ objRoot.addChild(aLgt);
+ objRoot.addChild(lgt1);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ JPanel createGeometryByReferencePanel() {
+ JPanel panel = new JPanel();
+ panel.setBorder(new TitledBorder("Geometry Type"));
+
+ String values[] = {"Array", "Strip", "Indexed", "IndexedStrip"};
+ geomType = new JComboBox(values);
+ geomType.setLightWeightPopupEnabled(false);
+ geomType.addActionListener(this);
+ geomType.setSelectedIndex(0);
+ panel.add(new JLabel("Geometry Type"));
+ panel.add(geomType);
+
+ transparency = new JCheckBox("EnableTransparency",
+ false);
+ transparency.addActionListener(this);
+ panel.add(transparency);
+
+ textureBox = new JCheckBox("EnableTexture", false);
+ textureBox.addActionListener(this);
+ panel.add(textureBox);
+
+ return panel;
+ }
+
+ public InterleavedTest() {
+ }
+
+ public InterleavedTest(java.net.URL texURL1, java.net.URL texURL2) {
+ texImage1 = texURL1;
+ texImage2 = texURL2;
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+
+ // create textures
+ texImage1 = Resources.getResource("resources/images/bg.jpg");
+ if (texImage1 == null) {
+ System.err.println("resources/images/bg.jpg not found");
+ System.exit(1);
+ }
+
+ texImage2 = Resources.getResource("resources/images/one.jpg");
+ if (texImage2 == null) {
+ System.err.println("resources/images/one.jpg not found");
+ System.exit(1);
+ }
+
+ Container contentPane = getContentPane();
+
+ Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
+ contentPane.add("Center", c);
+
+ BranchGroup scene = createSceneGraph();
+ // SimpleUniverse is a Convenience Utility class
+ u = new SimpleUniverse(c);
+
+ // add mouse behaviors to the viewingPlatform
+ ViewingPlatform viewingPlatform = u.getViewingPlatform();
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ // add Orbit behavior to the viewing platform
+ OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+
+ u.addBranchGraph(scene);
+
+
+ // Create GUI
+ JPanel p = new JPanel();
+ BoxLayout boxlayout = new BoxLayout(p,
+ BoxLayout.Y_AXIS);
+ p.add(createGeometryByReferencePanel());
+ p.setLayout(boxlayout);
+
+ contentPane.add("South", p);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ Object target = e.getSource();
+ if (target == geomType) {
+ shape.setGeometry(geoArrays[geomType.getSelectedIndex()]);
+
+ }
+ else if (target == transparency) {
+ if (transparency.isSelected()) {
+ transp.setTransparencyMode(TransparencyAttributes.BLENDED);
+ }
+ else {
+ transp.setTransparencyMode(TransparencyAttributes.NONE);
+ }
+ }
+ else if (target == textureBox) {
+ if (textureBox.isSelected()) {
+ app.setTextureUnitState(textureUnitState);
+ }
+ else {
+ app.setTextureUnitState(null);
+ }
+ }
+ }
+
+
+
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.net.URL texURL1 = null;
+ java.net.URL texURL2 = null;
+ // the path to the image for an application
+ texURL1 = Resources.getResource("resources/images/bg.jpg");
+ if (texURL1 == null) {
+ System.err.println("resources/images/bg.jpg not found");
+ System.exit(1);
+ }
+
+ texURL2 = Resources.getResource("resources/images/one.jpg");
+ if (texURL2 == null) {
+ System.err.println("resources/images/one.jpg not found");
+ System.exit(1);
+ }
+
+ Frame frame = new MainFrame(new InterleavedTest(texURL1, texURL2),
+ 800, 800);
+ }
+
+ public GeometryArray createGeometry (int type) {
+ GeometryArray tetra = null;
+ int texCoordSetMap[] = {0, 0};
+
+ if (type == 1) {
+ tetra =new TriangleArray(12,
+ TriangleArray.COORDINATES|
+ TriangleArray.COLOR_3|
+ /*
+ TriangleArray.NORMAL_3|
+ */
+ TriangleArray.TEXTURE_COORDINATE_2 |
+ TriangleArray.INTERLEAVED|
+ TriangleArray.BY_REFERENCE,
+ 2, texCoordSetMap);
+
+ tetra.setInterleavedVertices(interleaved);
+
+ }
+ else if (type == 2) {
+ tetra = new TriangleStripArray(12,
+ TriangleStripArray.COORDINATES|
+ TriangleStripArray.COLOR_3|
+ /*
+ TriangleArray.NORMAL_3|
+ */
+ TriangleArray.TEXTURE_COORDINATE_2 |
+ TriangleStripArray.INTERLEAVED|
+ TriangleStripArray.BY_REFERENCE,
+ 2, texCoordSetMap,
+ stripVertexCounts);
+ tetra.setInterleavedVertices(interleaved);
+
+
+ }
+ else if (type == 3) { // Indexed Geometry
+ tetra = new IndexedTriangleArray(4,
+ IndexedTriangleArray.COORDINATES|
+ IndexedTriangleArray.COLOR_3|
+ /*
+ IndexedTriangleArray.NORMAL_3|
+ */
+ IndexedTriangleArray.TEXTURE_COORDINATE_2 |
+ IndexedTriangleArray.INTERLEAVED|
+ IndexedTriangleArray.BY_REFERENCE,
+ 2, texCoordSetMap,
+ 12);
+ tetra.setInterleavedVertices(indexedInterleaved);
+ ((IndexedTriangleArray)tetra).setCoordinateIndices(0, indices);
+ ((IndexedTriangleArray)tetra).setColorIndices(0, indices);
+ ((IndexedTriangleArray)tetra).setTextureCoordinateIndices(
+ 0, 0, indices);
+ ((IndexedTriangleArray)tetra).setTextureCoordinateIndices(
+ 1, 0, indices);
+ }
+ else if (type == 4) { // Indexed strip geometry
+ tetra = new IndexedTriangleStripArray(4,
+ IndexedTriangleStripArray.COORDINATES|
+ IndexedTriangleStripArray.COLOR_3|
+ /*
+ IndexedTriangleArray.NORMAL_3|
+ */
+ IndexedTriangleArray.TEXTURE_COORDINATE_2 |
+ IndexedTriangleStripArray.INTERLEAVED|
+ IndexedTriangleStripArray.BY_REFERENCE,
+ 2, texCoordSetMap,
+ 12,
+ stripVertexCounts);
+ tetra.setInterleavedVertices(indexedInterleaved);
+ ((IndexedTriangleStripArray)tetra).setCoordinateIndices(0, indices);
+ ((IndexedTriangleStripArray)tetra).setColorIndices(0, indices);
+ ((IndexedTriangleStripArray)tetra).setTextureCoordinateIndices(
+ 0, 0, indices);
+ ((IndexedTriangleStripArray)tetra).setTextureCoordinateIndices(
+ 1, 0, indices);
+ }
+ else if (type == 5) { // Interleaved array
+ }
+ return tetra;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/TiledImage.java b/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/TiledImage.java
new file mode 100644
index 0000000..0e06f0e
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/geometry_by_ref/TiledImage.java
@@ -0,0 +1,367 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.geometry_by_ref;
+
+import java.awt.Rectangle;
+import java.awt.Transparency;
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.DataBuffer;
+import java.awt.image.DataBufferByte;
+import java.awt.image.Raster;
+import java.awt.image.RenderedImage;
+import java.awt.image.SampleModel;
+import java.awt.image.WritableRaster;
+import java.util.Vector;
+
+public class TiledImage extends Object implements RenderedImage {
+
+
+ WritableRaster[][] tile = new WritableRaster[3][3];
+
+ WritableRaster bigTile;
+ ComponentColorModel colorModel;
+ BufferedImage checkBoard;
+ int minX = -2;
+ int minY = -1;
+
+ TiledImage() {
+ ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+ int[] nBits = {8, 8, 8, 8};
+ int i, j, k, cc = 255;
+ int[] bandOffset = new int[4];
+ colorModel =
+ new ComponentColorModel(cs, nBits, true, false, Transparency.OPAQUE, 0);
+ // Create 9 tiles
+ bandOffset[0] = 3;
+ bandOffset[1] = 2;
+ bandOffset[2] = 1;
+ bandOffset[3] = 0;
+ for (i = 0; i < 3; i++) {
+ for (j = 0; j < 3; j++) {
+ tile[i][j] = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, 8, 8 , 32, 4, bandOffset, null);
+ }
+ }
+
+ // tile {-2, -1}
+ byte[] byteData = ((DataBufferByte)tile[0][0].getDataBuffer()).getData();
+ for (i=4, k = 8 * 4 * 4+4 * 4;i < 8;i++, k+= 16){
+ for (j=4;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)cc;
+ byteData[k+2] = (byte)0;
+ byteData[k+3] = (byte)cc ;
+ }
+ }
+
+ // tile {-1, -1}
+ byteData = ((DataBufferByte)tile[1][0].getDataBuffer()).getData();
+ for (i=4, k = 8 * 4 * 4;i < 8;i++){
+ for (j=4;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)cc;
+ byteData[k+2] = (byte)0;
+ byteData[k+3] = (byte)cc ;
+ }
+ for (j=4;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)0;
+ byteData[k+2] = (byte)0;
+ byteData[k+3] = (byte)cc ;
+ }
+ }
+
+ // tile {1, -1}
+ byteData = ((DataBufferByte)tile[2][0].getDataBuffer()).getData();
+ for (i=4, k = 8 * 4 * 4;i < 8;i++, k+= 16){
+ for (j=0;j < 4;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)0;
+ byteData[k+2] = (byte)0;
+ byteData[k+3] = (byte)cc ;
+ }
+ }
+
+ // tile {-2, 0}
+ byteData = ((DataBufferByte)tile[0][1].getDataBuffer()).getData();
+ for (i=0, k = 16;i < 4;i++, k+=16){
+ for (j=4;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)cc;
+ byteData[k+2] = (byte)0;
+ byteData[k+3] = (byte)cc ;
+ }
+ }
+ for (i=4, k = 8*4*4+16;i < 8;i++, k+=16){
+ for (j=4;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)0;
+ byteData[k+2] = (byte)cc;
+ byteData[k+3] = (byte)0 ;
+ }
+ }
+ // tile {-1, 0}
+ byteData = ((DataBufferByte)tile[1][1].getDataBuffer()).getData();
+ for (i=0, k = 0;i < 4;i++){
+ for (j=4;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)cc;
+ byteData[k+2] = (byte)0;
+ byteData[k+3] = (byte)cc ;
+ }
+ for (j=4;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)0;
+ byteData[k+2] = (byte)0;
+ byteData[k+3] = (byte)cc ;
+ }
+ }
+ for (i=0, k = 8 * 4 * 4;i < 4;i++){
+ for (j=4;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)0;
+ byteData[k+2] = (byte)cc;
+ byteData[k+3] = (byte)0 ;
+ }
+
+ for (j=4;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)0;
+ byteData[k+2] = (byte)cc;
+ byteData[k+3] = (byte)cc ;
+ }
+
+ }
+
+
+ // tile {0, 0}
+ byteData = ((DataBufferByte)tile[2][1].getDataBuffer()).getData();
+ for (i=0, k = 0;i < 4;i++, k+= 16) {
+ for (j=4;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)0;
+ byteData[k+2] = (byte)0;
+ byteData[k+3] = (byte)cc ;
+ }
+ }
+ for (i=4, k = 8 * 4* 4;i < 8;i++, k+= 16) {
+ for (j=4;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)0;
+ byteData[k+2] = (byte)cc;
+ byteData[k+3] = (byte)cc ;
+ }
+ }
+
+
+ // tile {-2, 1}
+ byteData = ((DataBufferByte)tile[0][2].getDataBuffer()).getData();
+ for (i=4, k = 16;i < 8;i++, k+= 16) {
+ for (j=4;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)0;
+ byteData[k+2] = (byte)cc;
+ byteData[k+3] = (byte)0 ;
+ }
+ }
+
+
+ // tile {-1, 1}
+ byteData = ((DataBufferByte)tile[1][2].getDataBuffer()).getData();
+ for (i=0, k = 0;i < 8;i++) {
+ for (j=4;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)0;
+ byteData[k+2] = (byte)cc;
+ byteData[k+3] = (byte)0 ;
+ }
+ for (j=4;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)0;
+ byteData[k+2] = (byte)cc;
+ byteData[k+3] = (byte)cc ;
+ }
+ }
+
+
+
+ // tile {0, 1}
+ byteData = ((DataBufferByte)tile[2][2].getDataBuffer()).getData();
+ for (i=4, k = 0;i < 8;i++, k+= 16) {
+ for (j=4;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)0;
+ byteData[k+2] = (byte)cc;
+ byteData[k+3] = (byte)cc ;
+ }
+ }
+
+ bigTile = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, 16, 16 , 64, 4, bandOffset, null);;
+ byteData = ((DataBufferByte)bigTile.getDataBuffer()).getData();
+ for (i=0, k = 0;i < 8;i++){
+ for (j=0;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)cc;
+ byteData[k+2] = (byte)0;
+ byteData[k+3] = (byte)cc ;
+ }
+ for (;j < 16;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)0;
+ byteData[k+2] = (byte)0;
+ byteData[k+3] = (byte)cc ;
+ }
+ }
+ for (;i < 16;i++){
+ for (j=0;j < 8;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)0;
+ byteData[k+2] = (byte)cc;
+ byteData[k+3] = (byte)0;
+ }
+ for (;j < 16;j++, k+=4){
+ byteData[k] = (byte)0;
+ byteData[k+1] = (byte)0;
+ byteData[k+2] = (byte)cc;
+ byteData[k+3] = (byte)cc ;
+ }
+ }
+ checkBoard = new BufferedImage(colorModel, bigTile, false, null);
+ }
+
+
+
+ // create four tiles {r, g, b, y}
+ public WritableRaster copyData(WritableRaster raster) {
+ return checkBoard.copyData(raster);
+ }
+
+ public ColorModel getColorModel() {
+ return checkBoard.getColorModel();
+ }
+
+ public Raster getData() {
+ return checkBoard.getData();
+ }
+
+ public Raster getData(Rectangle rect) {
+ return checkBoard.getData(rect);
+ }
+
+ public int getHeight() {
+ return 16;
+ }
+
+ public int getMinTileX() {
+ return minX;
+ }
+
+ public int getMinTileY() {
+ return minY;
+ }
+
+ public int getMinX () {
+ return -8;
+ }
+
+ public int getMinY () {
+ return -8;
+ }
+
+ public int getNumXTiles() {
+ return 3;
+ }
+
+ public int getNumYTiles() {
+ return 3;
+ }
+
+ public Object getProperty(String name) {
+ return checkBoard.getProperty(name);
+ }
+
+ public String[] getPropertyNames() {
+ return checkBoard.getPropertyNames();
+ }
+
+
+ public SampleModel getSampleModel() {
+ return checkBoard.getSampleModel();
+ }
+
+ public Vector getSources() {
+ return null;
+ }
+
+ public Raster getTile(int tileX, int tileY) {
+ return tile[tileX- minX][tileY - minY];
+ }
+
+ public int getTileGridXOffset() {
+ return 4;
+ }
+
+ public int getTileGridYOffset() {
+ return -4;
+ }
+
+
+ public int getTileHeight() {
+ return 8;
+ }
+
+
+ public int getTileWidth() {
+ return 8;
+ }
+
+ public int getWidth() {
+ return 16;
+ }
+}
+
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/geometry_compression/ObjectFileCompressor.java b/src/main/java/org/jdesktop/j3d/examples/geometry_compression/ObjectFileCompressor.java
new file mode 100644
index 0000000..15db111
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/geometry_compression/ObjectFileCompressor.java
@@ -0,0 +1,255 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.geometry_compression;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.Reader;
+import java.net.URL;
+import java.util.Hashtable;
+
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.loaders.IncorrectFormatException;
+import org.jogamp.java3d.loaders.ParsingErrorException;
+import org.jogamp.java3d.loaders.Scene;
+import org.jogamp.java3d.loaders.objectfile.ObjectFile;
+import org.jogamp.java3d.utils.geometry.compression.CompressedGeometryData;
+import org.jogamp.java3d.utils.geometry.compression.CompressedGeometryFile;
+import org.jogamp.java3d.utils.geometry.compression.CompressionStream;
+import org.jogamp.java3d.utils.geometry.compression.GeometryCompressor;
+
+/**
+ * This extension of ObjectFile provides the methods setQuantization() and
+ * compress() to compress Wavefront .obj files into the format described by
+ * appendix B of the Java 3D specification.
+ */
+public class ObjectFileCompressor extends ObjectFile {
+ private GeometryCompressor compressor = null ;
+
+ public ObjectFileCompressor() {
+ super(STRIPIFY | TRIANGULATE) ;
+ compressor = new GeometryCompressor() ;
+ }
+
+ public ObjectFileCompressor(int flags) {
+ super(flags | STRIPIFY | TRIANGULATE) ;
+ compressor = new GeometryCompressor() ;
+ }
+
+ public ObjectFileCompressor(int flags, float radians) {
+ super(flags | STRIPIFY | TRIANGULATE, radians) ;
+ compressor = new GeometryCompressor() ;
+ }
+
+ public void setFlags(int flags) {
+ super.setFlags(flags | STRIPIFY | TRIANGULATE) ;
+ }
+
+ private int positionQuant = 10 ;
+ private int colorQuant = 8 ;
+ private int normalQuant = 3 ;
+
+ /**
+ * Set the position, normal, and color quantization values for compression.
+ * @param positionQuant number of bits to quantize each position's X, Y,
+ * and Z components, ranging from 1 to 16 with a default of 10
+ * @param colorQuant number of bits to quantize each color's R, G, B, and
+ * alpha components, ranging from 2 to 16 with a default of 8
+ * @param normalQuant number of bits for quantizing each normal's U and V
+ * components, ranging from 0 to 6 with a default of 3
+ */
+ public void setQuantization(int positionQuant,
+ int colorQuant,
+ int normalQuant) {
+
+ this.positionQuant = positionQuant ;
+ this.colorQuant = colorQuant ;
+ this.normalQuant = normalQuant ;
+ }
+
+ /**
+ * Compress the specified .obj file into a CompressedGeometryData node
+ * component.
+ * @param objFileName String object representing the path to a .obj file
+ * @return a CompressedGeometryData node component
+ */
+ public CompressedGeometryData compress(String objFileName) {
+ return compressScene(getScene(objFileName)) ;
+ }
+
+ /**
+ * Compress the specified .obj file and add it to the end of an open
+ * compressed geometry file.
+ * @param objFileName String object representing the path to a .obj file
+ * @param file a currently open CompressedGeometryFile object
+ * @exception IOException - if write fails
+ */
+ public void compress(String objFileName, CompressedGeometryFile file)
+ throws IOException {
+ compressScene(getScene(objFileName), file) ;
+ }
+
+ /**
+ * Compress the specified .obj file into a CompressedGeometryData node
+ * component.
+ * @param reader an open .obj file
+ * @return a CompressedGeometryData node component
+ */
+ public CompressedGeometryData compress(Reader reader) {
+ return compressScene(getScene(reader)) ;
+ }
+
+ /**
+ * Compress the specified .obj file and add it to the end of an open
+ * compressed geometry file.
+ * @param reader an open .obj file
+ * @param file an open CompressedGeometryFile object
+ * @exception IOException - if write fails
+ */
+ public void compress(Reader reader, CompressedGeometryFile file)
+ throws IOException {
+ compressScene(getScene(reader), file) ;
+ }
+
+ /**
+ * Compress the specified .obj file into a CompressedGeometryData node
+ * component.
+ * @param url Uniform Resource Locator for the .obj file
+ * @return a CompressedGeometryData node component
+ */
+ public CompressedGeometryData compress(URL url) {
+ return compressScene(getScene(url)) ;
+ }
+
+ /**
+ * Compress the specified .obj file and add it to the end of an open
+ * compressed geometry file.
+ * @param url Uniform Resource Locator for the .obj file
+ * @param file a currently open CompressedGeometryFile object
+ * @exception IOException - if write fails
+ */
+ public void compress(URL url, CompressedGeometryFile file)
+ throws IOException {
+ compressScene(getScene(url), file) ;
+ }
+
+ private CompressedGeometryData compressScene(Scene scene) {
+ return compressor.compress(getStream(scene)) ;
+ }
+
+ private void compressScene(Scene scene, CompressedGeometryFile file)
+ throws IOException {
+ compressor.compress(getStream(scene), file) ;
+ }
+
+ private CompressionStream getStream(Scene scene) {
+ Hashtable objs = scene.getNamedObjects() ;
+ Shape3D shapes[] = new Shape3D[objs.size()] ;
+
+ objs.values().toArray(shapes) ;
+ return new CompressionStream(positionQuant, colorQuant, normalQuant,
+ shapes) ;
+ }
+
+ private Scene getScene(String objFileName) {
+ Scene scene = null ;
+ try {
+ scene = load(objFileName) ;
+ }
+ catch (FileNotFoundException e) {
+ System.err.println(e) ;
+ System.exit(1) ;
+ }
+ catch (ParsingErrorException e) {
+ System.err.println(e) ;
+ System.exit(1) ;
+ }
+ catch (IncorrectFormatException e) {
+ System.err.println(e) ;
+ System.exit(1) ;
+ }
+ return scene ;
+ }
+
+ private Scene getScene(Reader reader) {
+ Scene scene = null ;
+ try {
+ scene = load(reader) ;
+ }
+ catch (FileNotFoundException e) {
+ System.err.println(e) ;
+ System.exit(1) ;
+ }
+ catch (ParsingErrorException e) {
+ System.err.println(e) ;
+ System.exit(1) ;
+ }
+ catch (IncorrectFormatException e) {
+ System.err.println(e) ;
+ System.exit(1) ;
+ }
+ return scene ;
+ }
+
+ private Scene getScene(URL url) {
+ Scene scene = null ;
+ try {
+ scene = load(url) ;
+ }
+ catch (FileNotFoundException e) {
+ System.err.println(e) ;
+ System.exit(1) ;
+ }
+ catch (ParsingErrorException e) {
+ System.err.println(e) ;
+ System.exit(1) ;
+ }
+ catch (IncorrectFormatException e) {
+ System.err.println(e) ;
+ System.exit(1) ;
+ }
+ return scene ;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/geometry_compression/README.txt b/src/main/java/org/jdesktop/j3d/examples/geometry_compression/README.txt
new file mode 100644
index 0000000..345766b
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/geometry_compression/README.txt
@@ -0,0 +1,23 @@
+This directory contains example code for using compressed geometry in
+Java 3D through the com.sun.j3d.utils.geometry.compression package.
+
+Applications:
+
+ obj2cg -- takes the names of .obj files to compress followed by the name
+ of a .cg compressed geometry resource file. If the .cg file
+ doesn't exist, then an attempt is made to create it; otherwise,
+ new compressed geometry objects are appended to the end.
+
+ The .obj files are compressed and stored into the .cg file in
+ the order in which they appear in the command line, and can be
+ accessed through indices [0 .. fileCount-1]
+
+ cgview -- takes the name of a .cg file and the index of the object to
+ display, which can range from [0 .. objectCount-1]. The object
+ may rotated, scaled, and translated in response to mouse drags.
+
+
+Utility classes:
+
+ ObjectFileCompressor.java --
+ Extends ObjectFile with compression methods.
diff --git a/src/main/java/org/jdesktop/j3d/examples/geometry_compression/cgview.java b/src/main/java/org/jdesktop/j3d/examples/geometry_compression/cgview.java
new file mode 100644
index 0000000..e3eae64
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/geometry_compression/cgview.java
@@ -0,0 +1,214 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.geometry_compression;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.io.IOException;
+
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.geometry.compression.CompressedGeometryData;
+import org.jogamp.java3d.utils.geometry.compression.CompressedGeometryFile;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class cgview extends Applet {
+
+ private SimpleUniverse u = null;
+
+ public BranchGroup createSceneGraph(CompressedGeometryData cg) {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup() ;
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup() ;
+ Transform3D t3d = new Transform3D() ;
+ t3d.setScale(0.7) ;
+ objScale.setTransform(t3d) ;
+ objRoot.addChild(objScale) ;
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup() ;
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE) ;
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ) ;
+ objScale.addChild(objTrans) ;
+
+ // Add compressed geometry to the scene graph.
+ CompressedGeometryData.Header hdr = new CompressedGeometryData.Header() ;
+ cg.getCompressedGeometryHeader(hdr) ;
+
+ Shape3D[] shapes = cg.decompress();
+ if (shapes != null) {
+ for (int i = 0; i < shapes.length; i++) {
+ objTrans.addChild(shapes[i]);
+ }
+ }
+
+ // Create mouse behavior scheduling bounds.
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0) ;
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
+ Background bgNode = new Background(bgColor) ;
+ bgNode.setApplicationBounds(bounds) ;
+ objRoot.addChild(bgNode) ;
+
+ // Set up the ambient light
+ Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f) ;
+ AmbientLight ambientLightNode = new AmbientLight(ambientColor) ;
+ ambientLightNode.setInfluencingBounds(bounds) ;
+ objRoot.addChild(ambientLightNode) ;
+
+ // Set up the directional lights
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f) ;
+ Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f) ;
+ Color3f light2Color = new Color3f(1.0f, 1.0f, 0.9f) ;
+ Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -0.9f) ;
+
+ DirectionalLight light1
+ = new DirectionalLight(light1Color, light1Direction) ;
+ light1.setInfluencingBounds(bounds) ;
+ objRoot.addChild(light1) ;
+
+ DirectionalLight light2
+ = new DirectionalLight(light2Color, light2Direction) ;
+ light2.setInfluencingBounds(bounds) ;
+ objRoot.addChild(light2) ;
+
+ return objRoot ;
+ }
+
+ private void usage() {
+ System.out.println("Usage: cgview <.cg file> <object index>") ;
+ System.exit(0) ;
+ }
+
+ public cgview(String args[]) {
+ if (args.length < 1)
+ usage() ;
+
+ int index ;
+ if (args.length < 2)
+ index = 0 ;
+ else
+ index = Integer.parseInt(args[1]) ;
+
+ String filename = args[0] ;
+ if (filename == null)
+ usage() ;
+
+ // Read the compressed geometry.
+ CompressedGeometryData cg = null ;
+ try {
+ CompressedGeometryFile cgf ;
+ cgf = new CompressedGeometryFile(filename, false) ;
+
+ if (cgf.getObjectCount() == 0) {
+ System.out.println("no objects were found in " + filename) ;
+ System.exit(0) ;
+ }
+
+ cg = cgf.read(index) ;
+ cgf.close() ;
+
+ } catch (IOException e) {
+ System.out.println(e) ;
+ System.exit(0) ;
+ }
+
+ setLayout(new BorderLayout()) ;
+ Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
+ add("Center", c) ;
+
+ // Create a simple scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph(cg) ;
+ u = new SimpleUniverse(c) ;
+
+ // add mouse behaviors to the ViewingPlatform
+ ViewingPlatform viewingPlatform = u.getViewingPlatform();
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+
+ u.addBranchGraph(scene) ;
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ //
+ // The following allows cgview to be run as an application
+ // as well as an applet.
+ //
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ new MainFrame(new cgview(args), 700, 700) ;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/geometry_compression/obj2cg.java b/src/main/java/org/jdesktop/j3d/examples/geometry_compression/obj2cg.java
new file mode 100644
index 0000000..c0fea26
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/geometry_compression/obj2cg.java
@@ -0,0 +1,73 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.geometry_compression;
+
+import java.io.IOException;
+
+import org.jogamp.java3d.utils.geometry.compression.CompressedGeometryFile;
+
+class obj2cg {
+
+ public static void main(String args[]) throws IOException {
+ if (args.length < 2) {
+ System.out.println
+ ("obj2cg wants the names of .obj files to compress,\n" +
+ "followed by the name of a .cg file to create or to\n" +
+ "which to append.") ;
+ System.exit(0) ;
+ }
+
+ CompressedGeometryFile file ;
+ file = new CompressedGeometryFile(args[args.length-1], true) ;
+
+ ObjectFileCompressor compressor ;
+ compressor = new ObjectFileCompressor() ;
+
+ for (int i = 0 ; i < args.length-1 ; i++)
+ compressor.compress(args[i], file) ;
+
+ file.close() ;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/Cube.java b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/Cube.java
new file mode 100644
index 0000000..86f02ea
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/Cube.java
@@ -0,0 +1,311 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+package org.jdesktop.j3d.examples.gl2es2pipeline;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.J3DBuffer;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.TriangleArray;
+
+/**
+ * @author Administrator
+ *
+ */
+public class Cube extends Shape3D
+{
+
+ private static final float[] verts = {
+ // front face
+ 1.0f, -1.0f, 1.0f, //1
+ 1.0f, 1.0f, 1.0f, //2
+ -1.0f, 1.0f, 1.0f, //3
+ 1.0f, -1.0f, 1.0f, //1
+ -1.0f, 1.0f, 1.0f, //3
+ -1.0f, -1.0f, 1.0f, //4
+ // back face
+ -1.0f, -1.0f, -1.0f, //1
+ -1.0f, 1.0f, -1.0f, //2
+ 1.0f, 1.0f, -1.0f, //3
+ -1.0f, -1.0f, -1.0f, //1
+ 1.0f, 1.0f, -1.0f, //3
+ 1.0f, -1.0f, -1.0f, //4
+ // right face
+ 1.0f, -1.0f, -1.0f, //1
+ 1.0f, 1.0f, -1.0f, //2
+ 1.0f, 1.0f, 1.0f, //3
+ 1.0f, -1.0f, -1.0f, //1
+ 1.0f, 1.0f, 1.0f, //3
+ 1.0f, -1.0f, 1.0f, //4
+ // left face
+ -1.0f, -1.0f, 1.0f, //1
+ -1.0f, 1.0f, 1.0f, //2
+ -1.0f, 1.0f, -1.0f, //3
+ -1.0f, -1.0f, 1.0f, //1
+ -1.0f, 1.0f, -1.0f, //3
+ -1.0f, -1.0f, -1.0f, //4
+ // top face
+ 1.0f, 1.0f, 1.0f, //1
+ 1.0f, 1.0f, -1.0f, //2
+ -1.0f, 1.0f, -1.0f, //3
+ 1.0f, 1.0f, 1.0f, //1
+ -1.0f, 1.0f, -1.0f, //3
+ -1.0f, 1.0f, 1.0f, //4
+ // bottom face
+ -1.0f, -1.0f, 1.0f, //1
+ -1.0f, -1.0f, -1.0f, //2
+ 1.0f, -1.0f, -1.0f, //3
+ -1.0f, -1.0f, 1.0f, //1
+ 1.0f, -1.0f, -1.0f, //3
+ 1.0f, -1.0f, 1.0f, };//4
+
+ private static final float[] colors = {
+ // front face (red)
+ 1.0f, 0.0f, 0.0f, //1
+ 1.0f, 0.0f, 0.0f, //2
+ 1.0f, 0.0f, 0.0f, //3
+ 1.0f, 0.0f, 0.0f, //1
+ 1.0f, 0.0f, 0.0f, //3
+ 1.0f, 0.0f, 0.0f, //4
+ // back face (green)
+ 0.0f, 1.0f, 0.0f, //1
+ 0.0f, 1.0f, 0.0f, //2
+ 0.0f, 1.0f, 0.0f, //3
+ 0.0f, 1.0f, 0.0f, //1
+ 0.0f, 1.0f, 0.0f, //3
+ 0.0f, 1.0f, 0.0f, //4
+ // right face (blue)
+ 0.0f, 0.0f, 1.0f, //1
+ 0.0f, 0.0f, 1.0f, //2
+ 0.0f, 0.0f, 1.0f, //3
+ 0.0f, 0.0f, 1.0f, //1
+ 0.0f, 0.0f, 1.0f, //3
+ 0.0f, 0.0f, 1.0f, //4
+ // left face (yellow)
+ 1.0f, 1.0f, 0.0f, //1
+ 1.0f, 1.0f, 0.0f, //2
+ 1.0f, 1.0f, 0.0f, //3
+ 1.0f, 1.0f, 0.0f, //1
+ 1.0f, 1.0f, 0.0f, //3
+ 1.0f, 1.0f, 0.0f, //4
+ // top face (magenta)
+ 1.0f, 0.0f, 1.0f, //1
+ 1.0f, 0.0f, 1.0f, //2
+ 1.0f, 0.0f, 1.0f, //3
+ 1.0f, 0.0f, 1.0f, //1
+ 1.0f, 0.0f, 1.0f, //3
+ 1.0f, 0.0f, 1.0f, //4
+ // bottom face (cyan)
+ 0.0f, 1.0f, 1.0f, //1
+ 0.0f, 1.0f, 1.0f, //2
+ 0.0f, 1.0f, 1.0f, //3
+ 0.0f, 1.0f, 1.0f, //1
+ 0.0f, 1.0f, 1.0f, //3
+ 0.0f, 1.0f, 1.0f, };//4
+
+ /**
+ * Constructs a color cube with unit scale. The corners of the
+ * color cube are [-1,-1,-1] and [1,1,1].
+ */
+ public Cube()
+ {
+ TriangleArray cube = new TriangleArray(36,
+ GeometryArray.COORDINATES | GeometryArray.COLOR_3 | GeometryArray.USE_NIO_BUFFER | GeometryArray.BY_REFERENCE);
+
+ cube.setCoordRefBuffer(new J3DBuffer(makeFloatBuffer(verts)));
+ cube.setColorRefBuffer(new J3DBuffer(makeFloatBuffer(colors)));
+
+ this.setGeometry(cube);
+ this.setAppearance(new SimpleShaderAppearance());
+ }
+
+ /**
+ * Constructs a color cube with the specified scale. The corners of the
+ * color cube are [-scale,-scale,-scale] and [scale,scale,scale].
+ * @param scale the scale of the cube
+ */
+ public Cube(double scale)
+ {
+ TriangleArray cube = new TriangleArray(36,
+ GeometryArray.COORDINATES | GeometryArray.COLOR_3 | GeometryArray.USE_NIO_BUFFER | GeometryArray.BY_REFERENCE);
+
+ float scaledVerts[] = new float[verts.length];
+ for (int i = 0; i < verts.length; i++)
+ scaledVerts[i] = verts[i] * (float) scale;
+
+ cube.setCoordRefBuffer(new J3DBuffer(makeFloatBuffer(scaledVerts)));
+ cube.setColorRefBuffer(new J3DBuffer(makeFloatBuffer(colors)));
+
+ this.setGeometry(cube);
+
+ this.setAppearance(new SimpleShaderAppearance());
+ }
+
+ public Cube(double scale, float r, float g, float b)
+ {
+ TriangleArray cube = new TriangleArray(36,
+ GeometryArray.COORDINATES | GeometryArray.COLOR_3 | GeometryArray.USE_NIO_BUFFER | GeometryArray.BY_REFERENCE);
+
+ float scaledVerts[] = new float[verts.length];
+ for (int i = 0; i < verts.length; i++)
+ scaledVerts[i] = verts[i] * (float) scale;
+
+ cube.setCoordRefBuffer(new J3DBuffer(makeFloatBuffer(scaledVerts)));
+
+ float colorsSet[] = new float[36 * 3];
+ for (int i = 0; i < 36; i++)
+ {
+ colorsSet[i * 3 + 0] = r;
+ colorsSet[i * 3 + 1] = g;
+ colorsSet[i * 3 + 2] = b;
+ }
+
+ cube.setColorRefBuffer(new J3DBuffer(makeFloatBuffer(colorsSet)));
+
+ this.setGeometry(cube);
+ this.setAppearance(new SimpleShaderAppearance());
+ }
+
+ /**
+ * Constructs a color cube with the specified scale. The corners of the
+ * color cube are [-scale,-scale,-scale] and [scale,scale,scale].
+ * @param scale the scale of the cube
+ */
+ public Cube(double xScale, double yScale, double zScale)
+ {
+ TriangleArray cube = new TriangleArray(36,
+ GeometryArray.COORDINATES | GeometryArray.COLOR_3 | GeometryArray.USE_NIO_BUFFER | GeometryArray.BY_REFERENCE);
+
+ float scaledVerts[] = new float[verts.length];
+ for (int i = 0; i < verts.length; i += 3)
+ {
+ scaledVerts[i + 0] = verts[i + 0] * (float) xScale;
+ scaledVerts[i + 1] = verts[i + 1] * (float) yScale;
+ scaledVerts[i + 2] = verts[i + 2] * (float) zScale;
+ }
+
+ cube.setCoordRefBuffer(new J3DBuffer(makeFloatBuffer(scaledVerts)));
+ cube.setColorRefBuffer(new J3DBuffer(makeFloatBuffer(colors)));
+
+ this.setGeometry(cube);
+ this.setAppearance(new SimpleShaderAppearance());
+ }
+
+ public Cube(double xScale, double yScale, double zScale, float r, float g, float b)
+ {
+ TriangleArray cube = new TriangleArray(36,
+ GeometryArray.COORDINATES | GeometryArray.COLOR_3 | GeometryArray.USE_NIO_BUFFER | GeometryArray.BY_REFERENCE);
+
+ float scaledVerts[] = new float[verts.length];
+ for (int i = 0; i < verts.length; i += 3)
+ {
+ scaledVerts[i + 0] = verts[i + 0] * (float) xScale;
+ scaledVerts[i + 1] = verts[i + 1] * (float) yScale;
+ scaledVerts[i + 2] = verts[i + 2] * (float) zScale;
+ }
+
+ cube.setCoordRefBuffer(new J3DBuffer(makeFloatBuffer(scaledVerts)));
+
+ float colorsSet[] = new float[36 * 3];
+ for (int i = 0; i < 36; i++)
+ {
+ colorsSet[i * 3 + 0] = r;
+ colorsSet[i * 3 + 1] = g;
+ colorsSet[i * 3 + 2] = b;
+ }
+
+ cube.setColorRefBuffer(new J3DBuffer(makeFloatBuffer(colorsSet)));
+
+ this.setGeometry(cube);
+ this.setAppearance(new SimpleShaderAppearance());
+ }
+
+ public Cube(float xMin, float yMin, float zMin, float xMax, float yMax, float zMax)
+ {
+ TriangleArray cube = new TriangleArray(36,
+ GeometryArray.COORDINATES | GeometryArray.COLOR_3 | GeometryArray.USE_NIO_BUFFER | GeometryArray.BY_REFERENCE);
+
+ float scaledVerts[] = new float[] {
+ // front face
+ xMax, yMin, zMax, //1
+ xMax, yMax, zMax, //2
+ xMin, yMax, zMax, //3
+ xMax, yMin, zMax, //1
+ xMin, yMax, zMax, //3
+ xMin, yMin, zMax, //4
+ // back face
+ xMin, yMin, zMin, //1
+ xMin, yMax, zMin, //2
+ xMax, yMax, zMin, //3
+ xMin, yMin, zMin, //1
+ xMax, yMax, zMin, //3
+ xMax, yMin, zMin, //4
+ // right face
+ xMax, yMin, zMin, //1
+ xMax, yMax, zMin, //2
+ xMax, yMax, zMax, //3
+ xMax, yMin, zMin, //1
+ xMax, yMax, zMax, //3
+ xMax, yMin, zMax, //4
+ // left face
+ xMin, yMin, zMax, //1
+ xMin, yMax, zMax, //2
+ xMin, yMax, zMin, //3
+ xMin, yMin, zMax, //1
+ xMin, yMax, zMin, //3
+ xMin, yMin, zMin, //4
+ // top face
+ xMax, yMax, zMax, //1
+ xMax, yMax, zMin, //2
+ xMin, yMax, zMin, //3
+ xMax, yMax, zMax, //1
+ xMin, yMax, zMin, //3
+ xMin, yMax, zMax, //4
+ // bottom face
+ xMin, yMin, zMax, //1
+ xMin, yMin, zMin, //2
+ xMax, yMin, zMin, //3
+ xMin, yMin, zMax, //1
+ xMax, yMin, zMin, //3
+ xMax, yMin, zMax, };//4
+
+ cube.setCoordRefBuffer(new J3DBuffer(makeFloatBuffer(scaledVerts)));
+ cube.setColorRefBuffer(new J3DBuffer(makeFloatBuffer(colors)));
+
+ this.setGeometry(cube);
+ this.setAppearance(new SimpleShaderAppearance());
+ }
+
+ public static FloatBuffer makeFloatBuffer(float[] arr)
+ {
+ ByteBuffer bb = ByteBuffer.allocateDirect(arr.length * 4);
+ bb.order(ByteOrder.nativeOrder());
+ FloatBuffer fb = bb.asFloatBuffer();
+ fb.put(arr);
+ fb.position(0);
+ return fb;
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/EnvironmentMappingGLSL.form b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/EnvironmentMappingGLSL.form
new file mode 100644
index 0000000..b6a3e94
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/EnvironmentMappingGLSL.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="EnvironmentMappingGLSL"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/EnvironmentMappingGLSL.java b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/EnvironmentMappingGLSL.java
new file mode 100644
index 0000000..700df00
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/EnvironmentMappingGLSL.java
@@ -0,0 +1,239 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.gl2es2pipeline;
+
+import java.awt.GraphicsConfiguration;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import javax.swing.JOptionPane;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderAttribute;
+import org.jogamp.java3d.ShaderAttributeSet;
+import org.jogamp.java3d.ShaderAttributeValue;
+import org.jogamp.java3d.ShaderError;
+import org.jogamp.java3d.ShaderErrorListener;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.TextureUnitState;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+
+public class EnvironmentMappingGLSL extends javax.swing.JFrame
+{
+
+ private URL textureURL = null;
+ private static final int NUM_TEX_UNITS = 1;
+ private static final int TEX_UNIT = 0;
+
+ SimpleUniverse univ = null;
+
+ public BranchGroup createSceneGraph()
+ {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create the TransformGroup node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at run time. Add it to
+ // the root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // Create texture object
+ textureURL = Resources.getResource("resources/images/duke-gears.jpg");
+ Texture tex = new TextureLoader(textureURL, this).getTexture();
+ // Create the shader program
+ String vertexProgram = null;
+ String fragmentProgram = null;
+ try
+ {
+ vertexProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/envmap.vert"));
+ fragmentProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/envmap.frag"));
+ }
+ catch (IOException e)
+ {
+ System.err.println(e);
+ }
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_VERTEX, vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_FRAGMENT, fragmentProgram);
+ final String[] shaderAttrNames = { "LightPos", "BaseColor", "MixRatio", "EnvMap", };
+ final Object[] shaderAttrValues = { new Point3f(1.0f, -1.0f, 2.0f), new Color3f(0.2f, 0.9f, 0.5f), new Float(0.4f),
+ new Integer(TEX_UNIT), };
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+ shaderProgram.setShaders(shaders);
+ shaderProgram.setShaderAttrNames(shaderAttrNames);
+
+ // Create the shader attribute set
+ ShaderAttributeSet shaderAttributeSet = new ShaderAttributeSet();
+ for (int i = 0; i < shaderAttrNames.length; i++)
+ {
+ ShaderAttribute shaderAttribute = new ShaderAttributeValue(shaderAttrNames[i], shaderAttrValues[i]);
+ shaderAttributeSet.put(shaderAttribute);
+ }
+
+ // Create shader appearance to hold the shader program and
+ // shader attributes
+ ShaderAppearance app = new ShaderAppearance();
+ app.setShaderProgram(shaderProgram);
+ app.setShaderAttributeSet(shaderAttributeSet);
+
+ // Put the texture in specified texture unit
+ TextureUnitState[] tus = new TextureUnitState[NUM_TEX_UNITS];
+ tus[TEX_UNIT] = new TextureUnitState();
+ tus[TEX_UNIT].setTexture(tex);
+ app.setTextureUnitState(tus);
+
+ // Create a Sphere object using the shader appearance,
+ // and add it into the scene graph.
+ Sphere sph = new Sphere(0.4f, Sphere.GENERATE_NORMALS, 20, app);
+ SphereGLSL.makeNIO(sph);
+ objTrans.addChild(sph);
+
+ // Create a new Behavior object that will perform the
+ // desired operation on the specified transform and add
+ // it into the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, 4000);
+
+ RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, objTrans, yAxis, 0.0f, (float) Math.PI * 2.0f);
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ rotator.setSchedulingBounds(bounds);
+ objRoot.addChild(rotator);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ //objRoot.compile();
+
+ return objRoot;
+ }
+
+
+
+ private Canvas3D initScene()
+ {
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+
+ BranchGroup scene = createSceneGraph();
+ univ = new SimpleUniverse(c);
+
+ // Add a ShaderErrorListener
+ univ.addShaderErrorListener(new ShaderErrorListener() {
+ @Override
+ public void errorOccurred(ShaderError error)
+ {
+ error.printVerbose();
+ JOptionPane.showMessageDialog(EnvironmentMappingGLSL.this, error.toString(), "ShaderError", JOptionPane.ERROR_MESSAGE);
+ }
+ });
+
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ univ.addBranchGraph(scene);
+
+ return c;
+ }
+
+ /**
+ * Creates new form EnvironmentMappingGLSL
+ */
+ public EnvironmentMappingGLSL()
+ {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create the scene and add the Canvas3D to the drawing panel
+ Canvas3D c = initScene();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("EnvironmentMappingGLSL");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[])
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend", "jogl2es2");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
+ public void run()
+ {
+ new EnvironmentMappingGLSL().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ObjLoadGLSL.form b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ObjLoadGLSL.form
new file mode 100644
index 0000000..343b6d5
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ObjLoadGLSL.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="ObjLoadGLSL"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ObjLoadGLSL.java b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ObjLoadGLSL.java
new file mode 100644
index 0000000..2708e58
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ObjLoadGLSL.java
@@ -0,0 +1,424 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.gl2es2pipeline;
+
+import java.awt.GraphicsConfiguration;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Enumeration;
+
+import javax.swing.JOptionPane;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Node;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderError;
+import org.jogamp.java3d.ShaderErrorListener;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.loaders.IncorrectFormatException;
+import org.jogamp.java3d.loaders.ParsingErrorException;
+import org.jogamp.java3d.loaders.Scene;
+import org.jogamp.java3d.loaders.objectfile.ObjectFile;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.PlatformGeometry;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * Simple Java 3D example program to display an .obj object with shader programs.
+ */
+public class ObjLoadGLSL extends javax.swing.JFrame
+{
+
+ private String shaderName = "polkadot3d";
+ private boolean spin = false;
+ private boolean noTriangulate = false;
+ private boolean noStripify = false;
+ private double creaseAngle = 60.0;
+ private URL filename = null;
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ public BranchGroup createSceneGraph()
+ {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.7);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ objScale.addChild(objTrans);
+
+ int flags = ObjectFile.RESIZE;
+ if (!noTriangulate)
+ flags |= ObjectFile.TRIANGULATE;
+ if (!noStripify)
+ flags |= ObjectFile.STRIPIFY;
+ ObjectFile f = new ObjectFile(flags, (float) (creaseAngle * Math.PI / 180.0));
+ Scene s = null;
+ try
+ {
+ s = f.load(filename);
+ }
+ catch (FileNotFoundException e)
+ {
+ System.err.println(e);
+ System.exit(1);
+ }
+ catch (ParsingErrorException e)
+ {
+ System.err.println(e);
+ System.exit(1);
+ }
+ catch (IncorrectFormatException e)
+ {
+ System.err.println(e);
+ System.exit(1);
+ }
+
+ // Set vertex and fragment shader program for all Shape3D nodes in scene
+ String vertexProgram = null;
+ String fragmentProgram = null;
+ try
+ {
+ vertexProgram = StringIO.readFully(new File(
+ System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/" + shaderName + ".vert"));
+ fragmentProgram = StringIO.readFully(new File(
+ System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/" + shaderName + ".frag"));
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_VERTEX, vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_FRAGMENT, fragmentProgram);
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+ shaderProgram.setShaders(shaders);
+ setShaderProgram(s.getSceneGroup(), shaderProgram);
+
+ objTrans.addChild(s.getSceneGroup());
+
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+
+ if (spin)
+ {
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 4000, 0, 0, 0, 0, 0);
+
+ RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, objTrans, yAxis, 0.0f, (float) Math.PI * 2.0f);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+ }
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
+ Background bgNode = new Background(bgColor);
+ bgNode.setApplicationBounds(bounds);
+ objRoot.addChild(bgNode);
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse()
+ {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D canvas3d = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(canvas3d);
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+
+ // Add a ShaderErrorListener
+ univ.addShaderErrorListener(new ShaderErrorListener() {
+ @Override
+ public void errorOccurred(ShaderError error)
+ {
+ error.printVerbose();
+ JOptionPane.showMessageDialog(ObjLoadGLSL.this, error.toString(), "ShaderError", JOptionPane.ERROR_MESSAGE);
+ }
+ });
+
+ // add mouse behaviors to the ViewingPlatform
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+
+ PlatformGeometry pg = new PlatformGeometry();
+
+ // Set up the ambient light
+ Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
+ AmbientLight ambientLightNode = new AmbientLight(ambientColor);
+ ambientLightNode.setInfluencingBounds(bounds);
+ pg.addChild(ambientLightNode);
+
+ // Set up the directional lights
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);
+ Color3f light2Color = new Color3f(1.0f, 1.0f, 1.0f);
+ Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
+
+ DirectionalLight light1 = new DirectionalLight(light1Color, light1Direction);
+ light1.setInfluencingBounds(bounds);
+ pg.addChild(light1);
+
+ DirectionalLight light2 = new DirectionalLight(light2Color, light2Direction);
+ light2.setInfluencingBounds(bounds);
+ pg.addChild(light2);
+
+ viewingPlatform.setPlatformGeometry(pg);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ if (!spin)
+ {
+ OrbitBehavior orbit = new OrbitBehavior(canvas3d, OrbitBehavior.REVERSE_ALL);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+ }
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return canvas3d;
+ }
+
+ private static void usage()
+ {
+ System.out.println("Usage: java ObjLoadGLSL [-s] [-S shaderName] [-n] [-t] [-c degrees] <.obj file>");
+ System.out.println(" -s Spin (no user interaction)");
+ System.out.println(" -S Set shader name (default is 'simple')");
+ System.out.println(" -n No triangulation");
+ System.out.println(" -t No stripification");
+ System.out.println(" -c Set crease angle for normal generation (default is 60 without");
+ System.out.println(" smoothing group info, otherwise 180 within smoothing groups)");
+ System.exit(0);
+ } // End of usage
+
+ // Set shader program for all nodes in specified branch graph
+ private void setShaderProgram(BranchGroup g, ShaderProgram shaderProgram)
+ {
+ ShaderAppearance myApp = new ShaderAppearance();
+ Material mat = new Material();
+ myApp.setShaderProgram(shaderProgram);
+ myApp.setMaterial(mat);
+ setShaderProgram(g, myApp);
+ }
+
+ // Recursively set shader program for all children of specified group
+ private void setShaderProgram(Group g, ShaderAppearance myApp)
+ {
+
+ Enumeration<?> e = g.getAllChildren();
+ while (e.hasMoreElements())
+ {
+ Node n = (Node) (e.nextElement());
+ if (n instanceof Group)
+ {
+ setShaderProgram((Group) n, myApp);
+ }
+ else if (n instanceof Shape3D)
+ {
+ Shape3D s = (Shape3D) n;
+ s.setAppearance(myApp);
+ }
+ }
+ }
+
+ /**
+ * Creates new form ObjLoadGLSL
+ */
+ public ObjLoadGLSL(String args[])
+ {
+ if (args.length != 0)
+ {
+ for (int i = 0; i < args.length; i++)
+ {
+ if (args[i].startsWith("-"))
+ {
+ if (args[i].equals("-s"))
+ {
+ spin = true;
+ }
+ else if (args[i].equals("-n"))
+ {
+ noTriangulate = true;
+ }
+ else if (args[i].equals("-t"))
+ {
+ noStripify = true;
+ }
+ else if (args[i].equals("-c"))
+ {
+ if (i < args.length - 1)
+ {
+ creaseAngle = (new Double(args[++i])).doubleValue();
+ }
+ else
+ usage();
+ }
+ else if (args[i].equals("-S"))
+ {
+ if (i < args.length - 1)
+ {
+ shaderName = args[++i];
+ }
+ else
+ usage();
+ }
+ else
+ {
+ usage();
+ }
+ }
+ else
+ {
+ try
+ {
+ if ((args[i].indexOf("file:") == 0) || (args[i].indexOf("http") == 0))
+ {
+ filename = new URL(args[i]);
+ }
+ else if (args[i].charAt(0) != '/')
+ {
+ filename = new URL("file:./" + args[i]);
+ }
+ else
+ {
+ filename = new URL("file:" + args[i]);
+ }
+ }
+ catch (MalformedURLException e)
+ {
+ System.err.println(e);
+ System.exit(1);
+ }
+ }
+ }
+ }
+
+ if (filename == null)
+ {
+ filename = Resources.getResource("resources/geometry/galleon.obj");
+ if (filename == null)
+ {
+ System.err.println("resources/geometry/galleon.obj not found");
+ System.exit(1);
+ }
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("ObjLoadGLSL");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[])
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend","jogl2es2");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
+ public void run()
+ {
+ ObjLoadGLSL objLoadGLSL = new ObjLoadGLSL(args);
+ objLoadGLSL.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/PhongShadingGLSL.form b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/PhongShadingGLSL.form
new file mode 100644
index 0000000..dcccf73
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/PhongShadingGLSL.form
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <NonVisualComponents>
+ <Component class="javax.swing.ButtonGroup" name="shaderButtonGroup">
+ </Component>
+ <Menu class="javax.swing.JMenuBar" name="jMenuBar1">
+ <SubComponents>
+ <Menu class="javax.swing.JMenu" name="fileMenu">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="File"/>
+ </Properties>
+ <SubComponents>
+ <MenuItem class="javax.swing.JMenuItem" name="exitMenuItem">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Exit"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="exitMenuItemActionPerformed"/>
+ </Events>
+ </MenuItem>
+ </SubComponents>
+ </Menu>
+ </SubComponents>
+ </Menu>
+ </NonVisualComponents>
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="Phong Shading Test"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="menuBar" type="java.lang.String" value="jMenuBar1"/>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="guiPanel">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="North"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="jPanel1">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="Shader"/>
+ </Border>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="4" insetsLeft="4" insetsBottom="4" insetsRight="4" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JRadioButton" name="gouraudButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="shaderButtonGroup"/>
+ </Property>
+ <Property name="selected" type="boolean" value="true"/>
+ <Property name="text" type="java.lang.String" value="Per-Vertex Lighting (Gouraud)"/>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="0" left="0" right="0" top="0"/>
+ </Border>
+ </Property>
+ <Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
+ <Insets value="[0, 0, 0, 0]"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="gouraudButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="2" insetsBottom="2" insetsRight="2" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JRadioButton" name="phongButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="shaderButtonGroup"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Per-Pixel Lighting (Phong)"/>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="0" left="0" right="0" top="0"/>
+ </Border>
+ </Property>
+ <Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
+ <Insets value="[0, 0, 0, 0]"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="phongButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="2" insetsBottom="2" insetsRight="2" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/PhongShadingGLSL.java b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/PhongShadingGLSL.java
new file mode 100644
index 0000000..fa5ba7a
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/PhongShadingGLSL.java
@@ -0,0 +1,478 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.gl2es2pipeline;
+
+import java.awt.GraphicsConfiguration;
+import java.io.File;
+import java.io.IOException;
+
+import javax.swing.JOptionPane;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.Light;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointLight;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderError;
+import org.jogamp.java3d.ShaderErrorListener;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.SpotLight;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ *
+ * @author kcr
+ */
+public class PhongShadingGLSL extends javax.swing.JFrame
+{
+
+ // Constants for type of light to use
+ private static final int DIRECTIONAL_LIGHT = 0;
+ private static final int POINT_LIGHT = 1;
+ private static final int SPOT_LIGHT = 2;
+
+ // Flag indicates type of lights: directional, point, or spot lights.
+ private static int lightType = DIRECTIONAL_LIGHT;
+
+ private SimpleUniverse univ = null;
+
+ private ShaderAppearance sApp = null;
+ private ShaderProgram gouraudSP = null;
+ private ShaderProgram phongSP = null;
+
+ public BranchGroup createSceneGraph()
+ {
+ Color3f eColor = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f sColor = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f objColor = new Color3f(0.6f, 0.6f, 0.6f);
+ // Color3f lColor1 = new Color3f(1.0f, 0.0f, 0.0f);
+ // Color3f lColor2 = new Color3f(0.0f, 1.0f, 0.0f);
+ Color3f lColor1 = new Color3f(1.0f, 1.0f, 0.5f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+
+ Transform3D t;
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.5);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+
+ // Set up the background
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objRoot.addChild(bg);
+
+ // Create the TransformGroup node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at run time. Add it to
+ // the root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(objTrans);
+
+ // Create a Sphere object, generate one copy of the sphere,
+ // and add it into the scene graph.
+ sApp = new ShaderAppearance();
+ sApp.setCapability(ShaderAppearance.ALLOW_SHADER_PROGRAM_WRITE);
+ Material m = new Material(objColor, eColor, objColor, sColor, 100.0f);
+ sApp.setMaterial(m);
+
+ // Create Gouraud and Phong shader programs
+ String vertexProgram = null;
+ String fragmentProgram = null;
+ Shader[] shaders = new Shader[2];
+ //String[] attrNames = { "numLights" };
+
+ try
+ {
+ vertexProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/gouraud.vert"));
+ fragmentProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/gouraud.frag"));
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_VERTEX, vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_FRAGMENT, fragmentProgram);
+ gouraudSP = new GLSLShaderProgram();
+ gouraudSP.setShaders(shaders);
+
+ try
+ {
+ vertexProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/phong.vert"));
+ fragmentProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/phong.frag"));
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_VERTEX, vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_FRAGMENT, fragmentProgram);
+ phongSP = new GLSLShaderProgram();
+ phongSP.setShaders(shaders);
+
+ if (gouraudButton.isSelected())
+ {
+ sApp.setShaderProgram(gouraudSP);
+ }
+ else if (phongButton.isSelected())
+ {
+ sApp.setShaderProgram(phongSP);
+ }
+ Sphere sph = new Sphere(1.0f, Sphere.GENERATE_NORMALS, 30, sApp);
+ SphereGLSL.makeNIO(sph);
+ objTrans.addChild(sph);
+
+ // Create a new Behavior object that will perform the
+ // desired operation on the specified transform and add
+ // it into the scene graph.
+ Transform3D yAxis = new Transform3D();
+ yAxis.rotZ(Math.PI);
+ Alpha rotationAlpha = new Alpha(-1, 10000);
+
+ RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, objTrans, yAxis, 0.0f, (float) Math.PI * 2.0f);
+ rotator.setSchedulingBounds(bounds);
+ objRoot.addChild(rotator);
+
+ // Create the transform group node for the each light and initialize
+ // it to the identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add them to the root
+ // of the subgraph.
+ TransformGroup l1RotTrans = new TransformGroup();
+ l1RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l1RotTrans);
+
+ TransformGroup l2RotTrans = new TransformGroup();
+ l2RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l2RotTrans);
+
+ // Create transformations for the positional lights
+ t = new Transform3D();
+ Vector3d lPos1 = new Vector3d(0.0, 0.0, 2.0);
+ t.set(lPos1);
+ TransformGroup l1Trans = new TransformGroup(t);
+ l1RotTrans.addChild(l1Trans);
+
+ // t = new Transform3D();
+ // Vector3d lPos2 = new Vector3d(0.5, 0.8, 2.0);
+ // t.set(lPos2);
+ // TransformGroup l2Trans = new TransformGroup(t);
+ // l2RotTrans.addChild(l2Trans);
+
+ // Create Geometry for point lights
+ ColoringAttributes caL1 = new ColoringAttributes();
+ // ColoringAttributes caL2 = new ColoringAttributes();
+ caL1.setColor(lColor1);
+ // caL2.setColor(lColor2);
+ Appearance appL1 = new Appearance();
+ // Appearance appL2 = new Appearance();
+ appL1.setColoringAttributes(caL1);
+ // appL2.setColoringAttributes(caL2);
+
+ Sphere sph2 = new Sphere(0.05f, appL1);
+ SphereGLSL.makeNIO(sph2);
+ l1Trans.addChild(sph2);
+ // l2Trans.addChild(new Sphere(0.05f, appL2));
+
+ // Create lights
+ AmbientLight aLgt = new AmbientLight(alColor);
+
+ Light lgt1 = null;
+ // Light lgt2 = null;
+
+ Point3f lPoint = new Point3f(0.0f, 0.0f, 0.0f);
+ Point3f atten = new Point3f(1.0f, 0.0f, 0.0f);
+ Vector3f lDirect1 = new Vector3f(lPos1);
+ // Vector3f lDirect2 = new Vector3f(lPos2);
+ lDirect1.negate();
+ // lDirect2.negate();
+
+ switch (lightType)
+ {
+ case DIRECTIONAL_LIGHT:
+ lgt1 = new DirectionalLight(lColor1, lDirect1);
+ // lgt2 = new DirectionalLight(lColor2, lDirect2);
+ break;
+ case POINT_LIGHT:
+ assert false : "can't get here";
+ lgt1 = new PointLight(lColor1, lPoint, atten);
+ // lgt2 = new PointLight(lColor2, lPoint, atten);
+ break;
+ case SPOT_LIGHT:
+ assert false : "can't get here";
+ lgt1 = new SpotLight(lColor1, lPoint, atten, lDirect1, 25.0f * (float) Math.PI / 180.0f, 10.0f);
+ // lgt2 = new SpotLight(lColor2, lPoint, atten, lDirect2,
+ // 25.0f * (float)Math.PI / 180.0f, 10.0f);
+ break;
+ }
+
+ // Set the influencing bounds
+ aLgt.setInfluencingBounds(bounds);
+ lgt1.setInfluencingBounds(bounds);
+ // lgt2.setInfluencingBounds(bounds);
+
+ // Add the lights into the scene graph
+ objScale.addChild(aLgt);
+ l1Trans.addChild(lgt1);
+ // l2Trans.addChild(lgt2);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ yAxis = new Transform3D();
+ Alpha rotor1Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 4000, 0, 0, 0, 0, 0);
+ RotationInterpolator rotator1 = new RotationInterpolator(rotor1Alpha, l1RotTrans, yAxis, 0.0f, (float) Math.PI * 2.0f);
+ rotator1.setSchedulingBounds(bounds);
+ l1RotTrans.addChild(rotator1);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Alpha rotor2Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 1000, 0, 0, 0, 0, 0);
+ RotationInterpolator rotator2 = new RotationInterpolator(rotor2Alpha, l2RotTrans, yAxis, 0.0f, 0.0f);
+ bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ rotator2.setSchedulingBounds(bounds);
+ l2RotTrans.addChild(rotator2);
+
+ return objRoot;
+ }
+
+
+
+ private Canvas3D initScene()
+ {
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+
+ univ = new SimpleUniverse(c);
+
+ // Add a ShaderErrorListener
+ univ.addShaderErrorListener(new ShaderErrorListener() {
+ @Override
+ public void errorOccurred(ShaderError error)
+ {
+ error.printVerbose();
+ JOptionPane.showMessageDialog(PhongShadingGLSL.this, error.toString(), "ShaderError", JOptionPane.ERROR_MESSAGE);
+ }
+ });
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ BranchGroup scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+
+ return c;
+ }
+
+ /**
+ * Creates new form PhongShadingGLSL
+ */
+ public PhongShadingGLSL()
+ {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create the scene and add the Canvas3D to the drawing panel
+ Canvas3D c = initScene();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ shaderButtonGroup = new javax.swing.ButtonGroup();
+ guiPanel = new javax.swing.JPanel();
+ jPanel1 = new javax.swing.JPanel();
+ gouraudButton = new javax.swing.JRadioButton();
+ phongButton = new javax.swing.JRadioButton();
+ drawingPanel = new javax.swing.JPanel();
+ jMenuBar1 = new javax.swing.JMenuBar();
+ fileMenu = new javax.swing.JMenu();
+ exitMenuItem = new javax.swing.JMenuItem();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("Phong Shading Test");
+ guiPanel.setLayout(new java.awt.GridBagLayout());
+
+ jPanel1.setLayout(new java.awt.GridBagLayout());
+
+ jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Shader"));
+ shaderButtonGroup.add(gouraudButton);
+ gouraudButton.setSelected(true);
+ gouraudButton.setText("Per-Vertex Lighting (Gouraud)");
+ gouraudButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ gouraudButton.setMargin(new java.awt.Insets(0, 0, 0, 0));
+ gouraudButton.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ gouraudButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
+ jPanel1.add(gouraudButton, gridBagConstraints);
+
+ shaderButtonGroup.add(phongButton);
+ phongButton.setText("Per-Pixel Lighting (Phong)");
+ phongButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ phongButton.setMargin(new java.awt.Insets(0, 0, 0, 0));
+ phongButton.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ phongButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
+ jPanel1.add(phongButton, gridBagConstraints);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
+ guiPanel.add(jPanel1, gridBagConstraints);
+
+ getContentPane().add(guiPanel, java.awt.BorderLayout.NORTH);
+
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ fileMenu.setText("File");
+ exitMenuItem.setText("Exit");
+ exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ exitMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(exitMenuItem);
+
+ jMenuBar1.add(fileMenu);
+
+ setJMenuBar(jMenuBar1);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ private void phongButtonActionPerformed(java.awt.event.ActionEvent evt)
+ {//GEN-FIRST:event_phongButtonActionPerformed
+ sApp.setShaderProgram(phongSP);
+ }//GEN-LAST:event_phongButtonActionPerformed
+
+ private void gouraudButtonActionPerformed(java.awt.event.ActionEvent evt)
+ {//GEN-FIRST:event_gouraudButtonActionPerformed
+ sApp.setShaderProgram(gouraudSP);
+ }//GEN-LAST:event_gouraudButtonActionPerformed
+
+ private static void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt)
+ {//GEN-FIRST:event_exitMenuItemActionPerformed
+ System.exit(0);
+ }//GEN-LAST:event_exitMenuItemActionPerformed
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[])
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend", "jogl2es2");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
+ public void run()
+ {
+ new PhongShadingGLSL().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ private javax.swing.JMenuItem exitMenuItem;
+ private javax.swing.JMenu fileMenu;
+ private javax.swing.JRadioButton gouraudButton;
+ private javax.swing.JPanel guiPanel;
+ private javax.swing.JMenuBar jMenuBar1;
+ private javax.swing.JPanel jPanel1;
+ private javax.swing.JRadioButton phongButton;
+ private javax.swing.ButtonGroup shaderButtonGroup;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SamplerTestGLSL.form b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SamplerTestGLSL.form
new file mode 100644
index 0000000..6a1a031
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SamplerTestGLSL.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="SamplerTestGLSL"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SamplerTestGLSL.java b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SamplerTestGLSL.java
new file mode 100644
index 0000000..1cb2904
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SamplerTestGLSL.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.gl2es2pipeline;
+
+import java.awt.GraphicsConfiguration;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import javax.swing.JOptionPane;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderAttribute;
+import org.jogamp.java3d.ShaderAttributeSet;
+import org.jogamp.java3d.ShaderAttributeValue;
+import org.jogamp.java3d.ShaderError;
+import org.jogamp.java3d.ShaderErrorListener;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.TextureUnitState;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Point3d;
+
+public class SamplerTestGLSL extends javax.swing.JFrame
+{
+
+ private static String cloudTexName = "resources/images/bg.jpg";
+ private static String earthTexName = "resources/images/earth.jpg";
+
+ private URL cloudURL = null;
+ private URL earthURL = null;
+ private static final int CLOUD = 0;
+ private static final int EARTH = 1;
+
+ SimpleUniverse univ = null;
+
+ public BranchGroup createSceneGraph()
+ {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create the TransformGroup node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at run time. Add it to
+ // the root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // Create texture objects
+ cloudURL = Resources.getResource(cloudTexName);
+ Texture cloudTex = new TextureLoader(cloudURL, this).getTexture();
+ earthURL = Resources.getResource(earthTexName);
+ Texture earthTex = new TextureLoader(earthURL, this).getTexture();
+
+ // Create the shader program
+ String vertexProgram = null;
+ String fragmentProgram = null;
+ try
+ {
+ vertexProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/multitex.vert"));
+ fragmentProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/multitex.frag"));
+ }
+ catch (IOException e)
+ {
+ System.err.println(e);
+ }
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_VERTEX, vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_FRAGMENT, fragmentProgram);
+ final String[] shaderAttrNames = { "cloudFactor", "cloudTex", "earthTex", };
+ final Object[] shaderAttrValues = { new Float(0.6f), new Integer(0), new Integer(1), };
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+ shaderProgram.setShaders(shaders);
+ shaderProgram.setShaderAttrNames(shaderAttrNames);
+
+ // Create the shader attribute set
+ ShaderAttributeSet shaderAttributeSet = new ShaderAttributeSet();
+ for (int i = 0; i < shaderAttrNames.length; i++)
+ {
+ ShaderAttribute shaderAttribute = new ShaderAttributeValue(shaderAttrNames[i], shaderAttrValues[i]);
+ shaderAttributeSet.put(shaderAttribute);
+ }
+
+ // Create shader appearance to hold the shader program and
+ // shader attributes
+ ShaderAppearance app = new ShaderAppearance();
+ app.setShaderProgram(shaderProgram);
+ app.setShaderAttributeSet(shaderAttributeSet);
+
+ // GL2ES2: Tex coord gen done in shader now
+ //Vector4f plane0S = new Vector4f(3.0f, 1.5f, 0.3f, 0.0f);
+ //Vector4f plane0T = new Vector4f(1.0f, 2.5f, 0.24f, 0.0f);
+ //TexCoordGeneration tcg0 = new TexCoordGeneration(TexCoordGeneration.OBJECT_LINEAR, TexCoordGeneration.TEXTURE_COORDINATE_2, plane0S,
+ // plane0T);
+ //TexCoordGeneration tcg1 = new TexCoordGeneration(TexCoordGeneration.SPHERE_MAP, TexCoordGeneration.TEXTURE_COORDINATE_2);
+
+ // Put the textures in unit 0,1
+ TextureUnitState[] tus = new TextureUnitState[2];
+ tus[CLOUD] = new TextureUnitState();
+ tus[CLOUD].setTexture(cloudTex);
+
+ // GL2ES2: Tex coord gen done in shader now
+ //tus[CLOUD].setTexCoordGeneration(tcg0);
+
+ tus[EARTH] = new TextureUnitState();
+ tus[EARTH].setTexture(earthTex);
+
+ // GL2ES2: Tex coord gen done in shader now
+ //tus[EARTH].setTexCoordGeneration(tcg1);
+
+ app.setTextureUnitState(tus);
+
+ // Create a Sphere object using the shader appearance,
+ // and add it into the scene graph.
+ Sphere sph = new Sphere(0.4f, Sphere.GENERATE_NORMALS, 30, app);
+
+ SphereGLSL.makeNIO(sph);
+ objTrans.addChild(sph);
+
+
+ // Create a new Behavior object that will perform the
+ // desired operation on the specified transform and add
+ // it into the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, 4000);
+
+ RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, objTrans, yAxis, 0.0f, (float) Math.PI * 2.0f);
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ rotator.setSchedulingBounds(bounds);
+ objRoot.addChild(rotator);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ //objRoot.compile();
+
+ return objRoot;
+ }
+
+
+ private Canvas3D initScene()
+ {
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+
+ BranchGroup scene = createSceneGraph();
+ univ = new SimpleUniverse(c);
+
+ // Add a ShaderErrorListener
+ univ.addShaderErrorListener(new ShaderErrorListener() {
+ @Override
+ public void errorOccurred(ShaderError error)
+ {
+ error.printVerbose();
+ JOptionPane.showMessageDialog(SamplerTestGLSL.this, error.toString(), "ShaderError", JOptionPane.ERROR_MESSAGE);
+ }
+ });
+
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ univ.addBranchGraph(scene);
+
+ return c;
+ }
+
+ /**
+ * Creates new form SamplerTestGLSL
+ */
+ public SamplerTestGLSL()
+ {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create the scene and add the Canvas3D to the drawing panel
+ Canvas3D c = initScene();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("SamplerTestGLSL");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[])
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend","jogl2es2");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
+ public void run()
+ {
+ new SamplerTestGLSL().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ShaderTestGLSL.form b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ShaderTestGLSL.form
new file mode 100644
index 0000000..714273d
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ShaderTestGLSL.form
@@ -0,0 +1,266 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.2" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <NonVisualComponents>
+ <Component class="javax.swing.ButtonGroup" name="densityButtonGroup">
+ </Component>
+ <Component class="javax.swing.ButtonGroup" name="colorButtonGroup">
+ </Component>
+ <Component class="javax.swing.ButtonGroup" name="sceneGraphButtonGroup">
+ </Component>
+ <Menu class="javax.swing.JMenuBar" name="jMenuBar1">
+ <SubComponents>
+ <Menu class="javax.swing.JMenu" name="fileMenu">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="File"/>
+ </Properties>
+ <SubComponents>
+ <MenuItem class="javax.swing.JMenuItem" name="exitMenuItem">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Exit"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="exitMenuItemActionPerformed"/>
+ </Events>
+ </MenuItem>
+ </SubComponents>
+ </Menu>
+ </SubComponents>
+ </Menu>
+ </NonVisualComponents>
+ <Properties>
+ <Property name="title" type="java.lang.String" value="Window Title"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="menuBar" type="java.lang.String" value="jMenuBar1"/>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <Events>
+ <EventHandler event="windowClosing" listener="java.awt.event.WindowListener" parameters="java.awt.event.WindowEvent" handler="exitForm"/>
+ </Events>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,-85,0,0,2,0"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="mainPanel">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="guiPanel">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.LineBorderInfo">
+ <LineBorder/>
+ </Border>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="North"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="densityPanel">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="Density"/>
+ </Border>
+ </Property>
+ </Properties>
+ <AccessibilityProperties>
+ <Property name="AccessibleContext.accessibleName" type="java.lang.String" value="ShaderAttributeValue &#xa;"/>
+ </AccessibilityProperties>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JRadioButton" name="zeroButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="densityButtonGroup"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Zero"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zeroButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JRadioButton" name="halfButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="densityButtonGroup"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Half"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="halfButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JRadioButton" name="fullButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="densityButtonGroup"/>
+ </Property>
+ <Property name="selected" type="boolean" value="true"/>
+ <Property name="text" type="java.lang.String" value="Full"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fullButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="colorPanel">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="Color"/>
+ </Border>
+ </Property>
+ </Properties>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JRadioButton" name="goldButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="colorButtonGroup"/>
+ </Property>
+ <Property name="selected" type="boolean" value="true"/>
+ <Property name="text" type="java.lang.String" value="Gold"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="goldButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JRadioButton" name="silverButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="colorButtonGroup"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Silver"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="silverButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="sceneGraphPanel">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="Scene Graph"/>
+ </Border>
+ </Property>
+ </Properties>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JToggleButton" name="DetachButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="sceneGraphButtonGroup"/>
+ </Property>
+ <Property name="selected" type="boolean" value="true"/>
+ <Property name="text" type="java.lang.String" value="Detach"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="DetachButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JToggleButton" name="AttachButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="sceneGraphButtonGroup"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Create"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="AttachButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JButton" name="replaceSPButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Replace Shader"/>
+ <Property name="enabled" type="boolean" value="false"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="replaceSPButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ShaderTestGLSL.java b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ShaderTestGLSL.java
new file mode 100644
index 0000000..ac0282e
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/ShaderTestGLSL.java
@@ -0,0 +1,727 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.gl2es2pipeline;
+
+import java.awt.GraphicsConfiguration;
+import java.io.File;
+import java.io.IOException;
+
+import javax.swing.JOptionPane;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PositionInterpolator;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderAttributeObject;
+import org.jogamp.java3d.ShaderAttributeSet;
+import org.jogamp.java3d.ShaderAttributeValue;
+import org.jogamp.java3d.ShaderError;
+import org.jogamp.java3d.ShaderErrorListener;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+
+public class ShaderTestGLSL extends javax.swing.JFrame
+{
+
+ static final int GOLD = 1;
+ static final int SILVER = 2;
+
+ static final int DIMPLE_SHADER = 1;
+ static final int BRICK_SHADER = 2;
+ static final int WOOD_SHADER = 3;
+ static final int POLKADOT3D_SHADER = 4;
+
+ static final String[] shaderAttrNames1 = { "Density", "Size", "LightPosition", "Color" };
+
+ static final String[] shaderAttrNames2 = { "BrickColor", "LightPosition" };
+
+ private SimpleUniverse univ = null;
+ //private View view;
+ //private BranchGroup transpObj;
+ private BranchGroup scene = null;
+ private int shaderSelected = DIMPLE_SHADER;
+ private float density = 16.0f;
+ private int color = GOLD;
+
+ private Color3f eColor = new Color3f(0.2f, 0.2f, 0.2f);
+ private Color3f sColor = new Color3f(0.8f, 0.8f, 0.8f);
+ private Color3f objColor = new Color3f(0.6f, 0.6f, 0.6f);
+ private Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+ private Color3f gold = new Color3f(0.7f, 0.6f, 0.18f);
+ private Color3f silver = new Color3f(0.75f, 0.75f, 0.75f);
+
+ // Handlers for doing update
+ private ShaderAppearance sApp1 = null;
+ private ShaderAppearance sApp2 = null;
+ private ShaderAppearance sApp3 = null;
+ private ShaderAppearance sApp4 = null;
+ private ShaderProgram sp1 = null;
+ private ShaderProgram sp2 = null;
+ private ShaderProgram sp3 = null;
+ private ShaderProgram sp4 = null;
+ private ShaderAttributeSet sas1 = null;
+ private ShaderAttributeSet sas2 = null;
+ private ShaderAttributeObject sao1 = null;
+ private ShaderAttributeObject sao2 = null;
+ private Sphere sphere = null;
+ private Shape3D s3d = null;
+
+ private Material createMaterial()
+ {
+ Material m;
+ m = new Material(objColor, eColor, objColor, sColor, 100.0f);
+ m.setLightingEnable(true);
+ return m;
+ }
+
+ private static ShaderProgram createGLSLShaderProgram(int index)
+ {
+ String vertexProgram = null;
+ String fragmentProgram = null;
+
+ try
+ {
+ switch (index)
+ {
+ case DIMPLE_SHADER:
+ vertexProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/dimple.vert"));
+ fragmentProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/dimple.frag"));
+ break;
+ case BRICK_SHADER:
+ vertexProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/aabrick.vert"));
+ fragmentProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/aabrick.frag"));
+ break;
+ case WOOD_SHADER:
+ vertexProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/wood.vert"));
+ fragmentProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/wood.frag"));
+ break;
+ case POLKADOT3D_SHADER:
+ vertexProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/polkadot3d.vert"));
+ fragmentProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/polkadot3d.frag"));
+ break;
+ default:
+ }
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_VERTEX, vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_FRAGMENT, fragmentProgram);
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+ shaderProgram.setShaders(shaders);
+ return shaderProgram;
+ }
+
+ private ShaderAttributeSet createShaderAttributeSet(int index)
+ {
+ ShaderAttributeSet shaderAttributeSet = new ShaderAttributeSet();
+ ShaderAttributeObject shaderAttribute = null;
+
+ switch (index)
+ {
+ case DIMPLE_SHADER:
+ // "Density", "Size", "Scale", "Color", "LightPosition"
+ shaderAttribute = new ShaderAttributeValue("Size", new Float(0.25));
+ shaderAttributeSet.put(shaderAttribute);
+ shaderAttribute = new ShaderAttributeValue("LightPosition", new Point3f(0.0f, 0.0f, 0.5f));
+ shaderAttributeSet.put(shaderAttribute);
+
+ sao1 = new ShaderAttributeValue("Density", new Float(density));
+ sao1.setCapability(ShaderAttributeObject.ALLOW_VALUE_READ);
+ sao1.setCapability(ShaderAttributeObject.ALLOW_VALUE_WRITE);
+ shaderAttributeSet.put(sao1);
+
+ if (color == GOLD)
+ {
+ sao2 = new ShaderAttributeValue("Color", gold);
+ }
+ else if (color == SILVER)
+ {
+ sao2 = new ShaderAttributeValue("Color", silver);
+ }
+ sao2.setCapability(ShaderAttributeObject.ALLOW_VALUE_READ);
+ sao2.setCapability(ShaderAttributeObject.ALLOW_VALUE_WRITE);
+ shaderAttributeSet.put(sao2);
+ break;
+
+ case BRICK_SHADER:
+ // "BrickColor", "LightPosition"
+ shaderAttribute = new ShaderAttributeValue("BrickColor", new Color3f(1.0f, 0.3f, 0.2f));
+ shaderAttributeSet.put(shaderAttribute);
+ shaderAttribute = new ShaderAttributeValue("LightPosition", new Point3f(0.0f, 0.0f, 0.5f));
+ shaderAttributeSet.put(shaderAttribute);
+ break;
+ default:
+ assert false;
+ }
+ return shaderAttributeSet;
+ }
+
+ private ShaderAppearance createShaderAppearance()
+ {
+ ShaderAppearance sApp = new ShaderAppearance();
+ sApp.setMaterial(createMaterial());
+ return sApp;
+ }
+
+ private BranchGroup createSubSceneGraph()
+ {
+ // Create the sub-root of the branch graph
+ BranchGroup subRoot = new BranchGroup();
+
+ //
+ // Create 1 spheres with a GLSLShader and add it into the scene graph.
+ //
+ sApp1 = createShaderAppearance();
+ sApp1.setCapability(ShaderAppearance.ALLOW_SHADER_PROGRAM_READ);
+ sApp1.setCapability(ShaderAppearance.ALLOW_SHADER_PROGRAM_WRITE);
+ sApp1.setCapability(ShaderAppearance.ALLOW_SHADER_ATTRIBUTE_SET_READ);
+ sApp1.setCapability(ShaderAppearance.ALLOW_SHADER_ATTRIBUTE_SET_WRITE);
+
+ sp1 = createGLSLShaderProgram(1);
+ sp1.setShaderAttrNames(shaderAttrNames1);
+ sas1 = createShaderAttributeSet(1);
+ sas1.setCapability(ShaderAttributeSet.ALLOW_ATTRIBUTES_READ);
+ sas1.setCapability(ShaderAttributeSet.ALLOW_ATTRIBUTES_WRITE);
+ sApp1.setShaderProgram(sp1);
+ sApp1.setShaderAttributeSet(sas1);
+
+ // Setup Brick shader
+ sp2 = createGLSLShaderProgram(2);
+ sp2.setShaderAttrNames(shaderAttrNames2);
+ sas2 = createShaderAttributeSet(2);
+ sApp2 = createShaderAppearance();
+ sApp2.setShaderProgram(sp2);
+ sApp2.setShaderAttributeSet(sas2);
+
+ // Setup Wood shader
+ sp3 = createGLSLShaderProgram(3);
+ sApp3 = createShaderAppearance();
+ sApp3.setShaderProgram(sp3);
+
+ // Setup Polkadot3d shader
+ sp4 = createGLSLShaderProgram(4);
+ sApp4 = createShaderAppearance();
+ sApp4.setShaderProgram(sp4);
+
+ sphere = new Sphere(1.5f, Sphere.GENERATE_NORMALS, 200, null);
+ SphereGLSL.makeNIO(sphere);
+ s3d = sphere.getShape();
+ s3d.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
+ s3d.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
+ s3d.setAppearance(sApp1);
+
+ TransformGroup objTG;
+ Transform3D t = new Transform3D();
+ t.set(new Vector3d(0.0, 0.0, 0.0));
+ objTG = new TransformGroup(t);
+ objTG.addChild(sphere);
+ subRoot.addChild(objTG);
+
+ return subRoot;
+ }
+
+
+ private BranchGroup createSceneGraph(int selectedScene)
+ {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+ objRoot.setCapability(BranchGroup.ALLOW_DETACH);
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+
+ // Set up the background
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objScale.addChild(bg);
+
+ objScale.addChild(createSubSceneGraph());
+
+ // Create a position interpolator and attach it to the view
+ // platform
+ TransformGroup vpTrans = univ.getViewingPlatform().getViewPlatformTransform();
+ Transform3D axisOfTranslation = new Transform3D();
+ Alpha transAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE, 0, 0, 5000, 0, 0, 5000, 0, 0);
+ axisOfTranslation.rotY(-Math.PI / 2.0);
+ PositionInterpolator translator = new PositionInterpolator(transAlpha, vpTrans, axisOfTranslation, 2.0f, 3.5f);
+ translator.setSchedulingBounds(bounds);
+ objScale.addChild(translator);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Canvas3D initScene()
+ {
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+
+ univ = new SimpleUniverse(c);
+
+ // Add a ShaderErrorListener
+ univ.addShaderErrorListener(new ShaderErrorListener() {
+ @Override
+ public void errorOccurred(ShaderError error)
+ {
+ error.printVerbose();
+ JOptionPane.showMessageDialog(ShaderTestGLSL.this, error.toString(), "ShaderError", JOptionPane.ERROR_MESSAGE);
+ }
+ });
+
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ //view = univ.getViewer().getView();
+
+ return c;
+ }
+
+ /**
+ * Creates new form ShaderTestGLSL
+ */
+ public ShaderTestGLSL()
+ {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create the scene and add the Canvas3D to the drawing panel
+ Canvas3D c = initScene();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ densityButtonGroup = new javax.swing.ButtonGroup();
+ colorButtonGroup = new javax.swing.ButtonGroup();
+ sceneGraphButtonGroup = new javax.swing.ButtonGroup();
+ mainPanel = new javax.swing.JPanel();
+ guiPanel = new javax.swing.JPanel();
+ densityPanel = new javax.swing.JPanel();
+ zeroButton = new javax.swing.JRadioButton();
+ halfButton = new javax.swing.JRadioButton();
+ fullButton = new javax.swing.JRadioButton();
+ colorPanel = new javax.swing.JPanel();
+ goldButton = new javax.swing.JRadioButton();
+ silverButton = new javax.swing.JRadioButton();
+ sceneGraphPanel = new javax.swing.JPanel();
+ DetachButton = new javax.swing.JToggleButton();
+ AttachButton = new javax.swing.JToggleButton();
+ replaceSPButton = new javax.swing.JButton();
+ drawingPanel = new javax.swing.JPanel();
+ jMenuBar1 = new javax.swing.JMenuBar();
+ fileMenu = new javax.swing.JMenu();
+ exitMenuItem = new javax.swing.JMenuItem();
+
+ setTitle("Window Title");
+ addWindowListener(new java.awt.event.WindowAdapter() {
+ @Override
+ public void windowClosing(java.awt.event.WindowEvent evt)
+ {
+ exitForm(evt);
+ }
+ });
+
+ mainPanel.setLayout(new java.awt.BorderLayout());
+
+ guiPanel.setLayout(new javax.swing.BoxLayout(guiPanel, javax.swing.BoxLayout.X_AXIS));
+
+ guiPanel.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0)));
+ densityPanel.setLayout(new java.awt.GridBagLayout());
+
+ densityPanel.setBorder(new javax.swing.border.TitledBorder("Density"));
+ densityButtonGroup.add(zeroButton);
+ zeroButton.setText("Zero");
+ zeroButton.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ zeroButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ densityPanel.add(zeroButton, gridBagConstraints);
+
+ densityButtonGroup.add(halfButton);
+ halfButton.setText("Half");
+ halfButton.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ halfButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ densityPanel.add(halfButton, gridBagConstraints);
+
+ densityButtonGroup.add(fullButton);
+ fullButton.setSelected(true);
+ fullButton.setText("Full");
+ fullButton.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ fullButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ densityPanel.add(fullButton, gridBagConstraints);
+
+ guiPanel.add(densityPanel);
+ densityPanel.getAccessibleContext().setAccessibleName("ShaderAttributeValue \n");
+
+ colorPanel.setLayout(new java.awt.GridBagLayout());
+
+ colorPanel.setBorder(new javax.swing.border.TitledBorder("Color"));
+ colorButtonGroup.add(goldButton);
+ goldButton.setSelected(true);
+ goldButton.setText("Gold");
+ goldButton.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ goldButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ colorPanel.add(goldButton, gridBagConstraints);
+
+ colorButtonGroup.add(silverButton);
+ silverButton.setText("Silver");
+ silverButton.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ silverButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ colorPanel.add(silverButton, gridBagConstraints);
+
+ guiPanel.add(colorPanel);
+
+ sceneGraphPanel.setLayout(new java.awt.GridBagLayout());
+
+ sceneGraphPanel.setBorder(new javax.swing.border.TitledBorder("Scene Graph"));
+ sceneGraphButtonGroup.add(DetachButton);
+ DetachButton.setSelected(true);
+ DetachButton.setText("Detach");
+ DetachButton.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ DetachButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ sceneGraphPanel.add(DetachButton, gridBagConstraints);
+
+ sceneGraphButtonGroup.add(AttachButton);
+ AttachButton.setText("Create");
+ AttachButton.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ AttachButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ sceneGraphPanel.add(AttachButton, gridBagConstraints);
+
+ replaceSPButton.setText("Replace Shader");
+ replaceSPButton.setEnabled(false);
+ replaceSPButton.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ replaceSPButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ sceneGraphPanel.add(replaceSPButton, gridBagConstraints);
+
+ guiPanel.add(sceneGraphPanel);
+
+ mainPanel.add(guiPanel, java.awt.BorderLayout.NORTH);
+
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
+ mainPanel.add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ getContentPane().add(mainPanel, java.awt.BorderLayout.CENTER);
+
+ fileMenu.setText("File");
+ exitMenuItem.setText("Exit");
+ exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ exitMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(exitMenuItem);
+
+ jMenuBar1.add(fileMenu);
+
+ setJMenuBar(jMenuBar1);
+
+ pack();
+ }
+ // </editor-fold>//GEN-END:initComponents
+
+ private void silverButtonActionPerformed(java.awt.event.ActionEvent evt)
+ {//GEN-FIRST:event_silverButtonActionPerformed
+ color = SILVER;
+ if (scene != null)
+ {
+ sao2.setValue(silver);
+ }
+ }//GEN-LAST:event_silverButtonActionPerformed
+
+ private void goldButtonActionPerformed(java.awt.event.ActionEvent evt)
+ {//GEN-FIRST:event_goldButtonActionPerformed
+ color = GOLD;
+ if (scene != null)
+ {
+ sao2.setValue(gold);
+ }
+ }//GEN-LAST:event_goldButtonActionPerformed
+
+ private void replaceSPButtonActionPerformed(java.awt.event.ActionEvent evt)
+ {//GEN-FIRST:event_replaceSPButtonActionPerformed
+ if (shaderSelected != DIMPLE_SHADER)
+ {
+ goldButton.setEnabled(false);
+ silverButton.setEnabled(false);
+ zeroButton.setEnabled(false);
+ halfButton.setEnabled(false);
+ fullButton.setEnabled(false);
+ }
+
+ switch (shaderSelected)
+ {
+ case DIMPLE_SHADER:
+ s3d.setAppearance(sApp1);
+ goldButton.setEnabled(true);
+ silverButton.setEnabled(true);
+ zeroButton.setEnabled(true);
+ halfButton.setEnabled(true);
+ fullButton.setEnabled(true);
+ shaderSelected = BRICK_SHADER;
+ break;
+ case BRICK_SHADER:
+ s3d.setAppearance(sApp2);
+ shaderSelected = WOOD_SHADER;
+ break;
+ case WOOD_SHADER:
+ s3d.setAppearance(sApp3);
+ shaderSelected = POLKADOT3D_SHADER;
+ break;
+ case POLKADOT3D_SHADER:
+ s3d.setAppearance(sApp4);
+ shaderSelected = DIMPLE_SHADER;
+ break;
+ default:
+ assert false;
+ }
+
+ }//GEN-LAST:event_replaceSPButtonActionPerformed
+
+ private void fullButtonActionPerformed(java.awt.event.ActionEvent evt)
+ {//GEN-FIRST:event_fullButtonActionPerformed
+ density = 16.0f;
+ if (scene != null)
+ {
+ sao1.setValue(new Float(density));
+ }
+ }//GEN-LAST:event_fullButtonActionPerformed
+
+ private void DetachButtonActionPerformed(java.awt.event.ActionEvent evt)
+ {//GEN-FIRST:event_DetachButtonActionPerformed
+ if (scene != null)
+ {
+ scene.detach();
+ scene = null;
+ replaceSPButton.setEnabled(false);
+ goldButton.setEnabled(true);
+ silverButton.setEnabled(true);
+ zeroButton.setEnabled(true);
+ halfButton.setEnabled(true);
+ fullButton.setEnabled(true);
+ shaderSelected = DIMPLE_SHADER;
+ }
+ }//GEN-LAST:event_DetachButtonActionPerformed
+
+ private void AttachButtonActionPerformed(java.awt.event.ActionEvent evt)
+ {//GEN-FIRST:event_AttachButtonActionPerformed
+ if (scene == null)
+ {
+ scene = createSceneGraph(1);
+ univ.addBranchGraph(scene);
+ replaceSPButton.setEnabled(true);
+ shaderSelected = BRICK_SHADER;
+ }
+ }//GEN-LAST:event_AttachButtonActionPerformed
+
+ private void halfButtonActionPerformed(java.awt.event.ActionEvent evt)
+ {//GEN-FIRST:event_halfButtonActionPerformed
+ density = 8.0f;
+ if (scene != null)
+ {
+ sao1.setValue(new Float(density));
+ }
+ }//GEN-LAST:event_halfButtonActionPerformed
+
+ private void zeroButtonActionPerformed(java.awt.event.ActionEvent evt)
+ {//GEN-FIRST:event_zeroButtonActionPerformed
+ density = 0.0f;
+ if (scene != null)
+ {
+ sao1.setValue(new Float(density));
+ }
+
+ }//GEN-LAST:event_zeroButtonActionPerformed
+
+ private static void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt)
+ {//GEN-FIRST:event_exitMenuItemActionPerformed
+ System.exit(0);
+ }//GEN-LAST:event_exitMenuItemActionPerformed
+
+ /** Exit the Application */
+ private static void exitForm(java.awt.event.WindowEvent evt)
+ {//GEN-FIRST:event_exitForm
+ System.exit(0);
+ }//GEN-LAST:event_exitForm
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[])
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend","jogl2es2");
+ new ShaderTestGLSL().setVisible(true);
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JToggleButton AttachButton;
+ private javax.swing.JToggleButton DetachButton;
+ private javax.swing.ButtonGroup colorButtonGroup;
+ private javax.swing.JPanel colorPanel;
+ private javax.swing.ButtonGroup densityButtonGroup;
+ private javax.swing.JPanel densityPanel;
+ private javax.swing.JPanel drawingPanel;
+ private javax.swing.JMenuItem exitMenuItem;
+ private javax.swing.JMenu fileMenu;
+ private javax.swing.JRadioButton fullButton;
+ private javax.swing.JRadioButton goldButton;
+ private javax.swing.JPanel guiPanel;
+ private javax.swing.JRadioButton halfButton;
+ private javax.swing.JMenuBar jMenuBar1;
+ private javax.swing.JPanel mainPanel;
+ private javax.swing.JButton replaceSPButton;
+ private javax.swing.ButtonGroup sceneGraphButtonGroup;
+ private javax.swing.JPanel sceneGraphPanel;
+ private javax.swing.JRadioButton silverButton;
+ private javax.swing.JRadioButton zeroButton;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SimpleShaderAppearance.java b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SimpleShaderAppearance.java
new file mode 100644
index 0000000..5b7be75
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SimpleShaderAppearance.java
@@ -0,0 +1,474 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+package org.jdesktop.j3d.examples.gl2es2pipeline;
+
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.LineAttributes;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.RenderingAttributes;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderAttributeSet;
+import org.jogamp.java3d.ShaderAttributeValue;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.vecmath.Color3f;
+
+/**
+ * @author phil
+ *
+ */
+public class SimpleShaderAppearance extends ShaderAppearance
+{
+ private static GLSLShaderProgram flatShaderProgram;
+ private static GLSLShaderProgram textureShaderProgram;
+ private static GLSLShaderProgram colorLineShaderProgram;
+ private static GLSLShaderProgram litFlatShaderProgram;
+ private static GLSLShaderProgram litTextureShaderProgram;
+
+ public static String alphaTestUniforms = "uniform int alphaTestEnabled;\n" + //
+ "uniform int alphaTestFunction;\n" + //
+ "uniform float alphaTestValue;\n";
+
+ public static String alphaTestMethod = "if(alphaTestEnabled != 0)\n" + //
+ "{ \n" + //
+ " if(alphaTestFunction==516)//>\n" + //
+ " if(baseMap.a<=alphaTestValue)discard;\n" + //
+ " else if(alphaTestFunction==518)//>=\n" + //
+ " if(baseMap.a<alphaTestValue)discard;\n" + //
+ " else if(alphaTestFunction==514)//==\n" + //
+ " if(baseMap.a!=alphaTestValue)discard;\n" + //
+ " else if(alphaTestFunction==517)//!=\n" + //
+ " if(baseMap.a==alphaTestValue)discard;\n" + //
+ " else if(alphaTestFunction==513)//<\n" + //
+ " if(baseMap.a>=alphaTestValue)discard;\n" + //
+ " else if(alphaTestFunction==515)//<=\n" + //
+ " if(baseMap.a>alphaTestValue)discard;\n" + //
+ " else if(alphaTestFunction==512)//never \n" + //
+ " discard; \n" + //
+ "}\n";
+
+ /**
+ * Polygons no texture, no single color, must have color vertex attribute
+ */
+ public SimpleShaderAppearance()
+ {
+ this(null, false, false);
+ }
+
+ /**
+ * Lines with a single color no texture, ignores vertex attribute of color
+ * @param color
+ */
+ public SimpleShaderAppearance(Color3f color)
+ {
+ this(color, false, false);
+ }
+
+ /**
+ * Polygons if hasTexture is true a texture otherwise vertex attribute colors for face color
+ */
+ public SimpleShaderAppearance(boolean hasTexture)
+ {
+ this(null, false, hasTexture);
+ }
+
+ public SimpleShaderAppearance(boolean lit, boolean hasTexture)
+ {
+ this(null, lit, hasTexture);
+ }
+
+ /** if color is not null then a line appearance
+ * otherwise simple poly appearance
+ * @param color
+ */
+ private SimpleShaderAppearance(Color3f color, boolean lit, boolean hasTexture)
+ {
+ if (lit)
+ {
+ String vertexProgram = "#version 120\n";
+ vertexProgram += "attribute vec4 glVertex;\n";
+ vertexProgram += "attribute vec4 glColor;\n";
+ vertexProgram += "attribute vec3 glNormal; \n";
+ if (hasTexture)
+ {
+ vertexProgram += "attribute vec2 glMultiTexCoord0;\n";
+ }
+ vertexProgram += "uniform mat4 glModelViewProjectionMatrix;\n";
+ vertexProgram += "uniform mat4 glModelViewMatrix;\n";
+ vertexProgram += "uniform mat3 glNormalMatrix;\n";
+ vertexProgram += "uniform int ignoreVertexColors;\n";
+ vertexProgram += "uniform vec4 glLightModelambient;\n";
+ vertexProgram += "struct material\n";
+ vertexProgram += "{\n";
+ vertexProgram += " int lightEnabled;\n";
+ vertexProgram += " vec4 ambient;\n";
+ vertexProgram += " vec4 diffuse;\n";
+ vertexProgram += " vec4 emission; \n";
+ vertexProgram += " vec3 specular;\n";
+ vertexProgram += " float shininess;\n";
+ vertexProgram += "};\n";
+ vertexProgram += "uniform material glFrontMaterial;\n";
+ vertexProgram += "struct lightSource\n";
+ vertexProgram += " {\n";
+ vertexProgram += " int enabled;\n";
+ vertexProgram += " vec4 position;\n";
+ vertexProgram += " vec4 diffuse;\n";
+ vertexProgram += " vec4 specular;\n";
+ vertexProgram += " float constantAttenuation, linearAttenuation, quadraticAttenuation;\n";
+ vertexProgram += " float spotCutoff, spotExponent;\n";
+ vertexProgram += " vec3 spotDirection;\n";
+ vertexProgram += " };\n";
+ vertexProgram += "\n";
+ vertexProgram += " uniform int numberOfLights;\n";
+ vertexProgram += " const int maxLights = 1;\n";
+ vertexProgram += " uniform lightSource glLightSource[maxLights];\n";
+ if (hasTexture)
+ {
+ vertexProgram += "varying vec2 glTexCoord0;\n";
+ }
+ vertexProgram += "varying vec3 LightDir;\n";
+ vertexProgram += "varying vec3 ViewDir;\n";
+ vertexProgram += "varying vec3 N;\n";
+ vertexProgram += "varying vec4 A;\n";
+ vertexProgram += "varying vec4 C;\n";
+ vertexProgram += "varying vec4 D;\n";
+ vertexProgram += "varying vec3 emissive;\n";
+ vertexProgram += "varying vec3 specular;\n";
+ vertexProgram += "varying float shininess;\n";
+ vertexProgram += "void main( void ){\n";
+ vertexProgram += "gl_Position = glModelViewProjectionMatrix * glVertex;\n";
+ if (hasTexture)
+ {
+ vertexProgram += "glTexCoord0 = glMultiTexCoord0.st;\n";
+ }
+
+ vertexProgram += "N = normalize(glNormalMatrix * glNormal);\n";
+
+ vertexProgram += "vec3 v = vec3(glModelViewMatrix * glVertex);\n";
+
+ vertexProgram += "ViewDir = -v.xyz;\n";
+ vertexProgram += "LightDir = glLightSource[0].position.xyz;\n";
+
+ vertexProgram += "A = glLightModelambient * glFrontMaterial.ambient;\n";
+ vertexProgram += "if( ignoreVertexColors != 0) \n";
+ // objectColor should be used if it is no lighting, and reusing material diffuse appears wrong
+ vertexProgram += " C = vec4(1,1,1,1);//glFrontMaterial.diffuse; \n";
+ vertexProgram += "else \n";
+ vertexProgram += " C = glColor; \n";
+
+ vertexProgram += "D = glLightSource[0].diffuse * glFrontMaterial.diffuse;\n";
+
+ vertexProgram += "emissive = glFrontMaterial.emission.rgb;\n";
+ vertexProgram += "specular = glFrontMaterial.specular;\n";
+ vertexProgram += "shininess = glFrontMaterial.shininess;\n";
+ vertexProgram += "}";
+
+ String fragmentProgram = "#version 120\n";
+ fragmentProgram += "precision mediump float;\n";
+ if (hasTexture)
+ {
+ fragmentProgram += alphaTestUniforms;
+
+ fragmentProgram += "varying vec2 glTexCoord0;\n";
+ fragmentProgram += "uniform sampler2D BaseMap;\n";
+ }
+
+ fragmentProgram += "in vec3 LightDir;\n";
+ fragmentProgram += "in vec3 ViewDir;\n";
+
+ fragmentProgram += "in vec3 N;\n";
+
+ fragmentProgram += "in vec4 A;\n";
+ fragmentProgram += "in vec4 C;\n";
+ fragmentProgram += "in vec4 D;\n";
+
+ fragmentProgram += "in vec3 emissive;\n";
+ fragmentProgram += "in vec3 specular;\n";
+ fragmentProgram += "in float shininess;\n";
+ fragmentProgram += "void main( void ){\n ";
+ if (hasTexture)
+ {
+ fragmentProgram += "vec4 baseMap = texture2D( BaseMap, glTexCoord0.st );\n";
+ }
+ if (hasTexture)
+ {
+ fragmentProgram += alphaTestMethod;
+ }
+ fragmentProgram += "vec3 normal = N;\n";
+
+ fragmentProgram += "vec3 L = normalize(LightDir);\n";
+ fragmentProgram += "vec3 E = normalize(ViewDir);\n";
+ fragmentProgram += "vec3 R = reflect(-L, normal);\n";
+ fragmentProgram += "vec3 H = normalize( L + E );\n";
+
+ fragmentProgram += "float NdotL = max( dot(normal, L), 0.0 );\n";
+ fragmentProgram += "float NdotH = max( dot(normal, H), 0.0 );\n";
+ fragmentProgram += "float EdotN = max( dot(normal, E), 0.0 );\n";
+ fragmentProgram += "float NdotNegL = max( dot(normal, -L), 0.0 );\n";
+
+ fragmentProgram += "vec4 color;\n";
+ if (hasTexture)
+ {
+ fragmentProgram += "vec3 albedo = baseMap.rgb * C.rgb;\n";
+ }
+ else
+ {
+ fragmentProgram += "vec3 albedo = C.rgb;\n";
+ }
+ fragmentProgram += "vec3 diffuse = A.rgb + (D.rgb * NdotL);\n";
+
+ // 0.3 is just what the calc is
+ fragmentProgram += "vec3 spec = specular * pow(NdotH, 0.3*shininess);\n";
+ // D is not right it should be the light source spec color, probably just 1,1,1 but java3d has no spec on lights
+ //fragmentProgram += "spec *= D.rgb;\n";
+
+ fragmentProgram += "color.rgb = albedo * (diffuse + emissive) + spec;\n";
+ if (hasTexture)
+ {
+ fragmentProgram += "color.a = C.a * baseMap.a;\n";
+ }
+ else
+ {
+ fragmentProgram += "color.a = C.a;\n";
+ }
+
+ fragmentProgram += "gl_FragColor = color;\n";
+
+ fragmentProgram += "}";
+ if (hasTexture)
+ {
+ if (litTextureShaderProgram == null)
+ {
+ litTextureShaderProgram = new GLSLShaderProgram() {
+ @Override
+ public String toString()
+ {
+ return "SimpleShaderAppearance litTextureShaderProgram";
+ }
+ };
+ litTextureShaderProgram.setShaders(makeShaders(vertexProgram, fragmentProgram));
+ litTextureShaderProgram.setShaderAttrNames(new String[] { "BaseMap" });
+
+ }
+
+ setShaderProgram(litTextureShaderProgram);
+
+ ShaderAttributeSet shaderAttributeSet = new ShaderAttributeSet();
+ shaderAttributeSet.put(new ShaderAttributeValue("BaseMap", new Integer(0)));
+ setShaderAttributeSet(shaderAttributeSet);
+ }
+ else
+ {
+ if (litFlatShaderProgram == null)
+ {
+ litFlatShaderProgram = new GLSLShaderProgram() {
+ @Override
+ public String toString()
+ {
+ return "SimpleShaderAppearance litFlatShaderProgram";
+ }
+ };
+ litFlatShaderProgram.setShaders(makeShaders(vertexProgram, fragmentProgram));
+
+ //System.out.println("vertexProgram " + vertexProgram);
+ //System.out.println("fragmentProgram " + fragmentProgram);
+
+ }
+
+ setShaderProgram(litFlatShaderProgram);
+
+ }
+ }
+ else
+ {
+ if (hasTexture)
+ {
+ if (textureShaderProgram == null)
+ {
+ textureShaderProgram = new GLSLShaderProgram() {
+ @Override
+ public String toString()
+ {
+ return "SimpleShaderAppearance textureShaderProgram";
+ }
+ };
+ String vertexProgram = "#version 120\n";
+ vertexProgram += "attribute vec4 glVertex;\n";
+ vertexProgram += "attribute vec2 glMultiTexCoord0;\n";
+ vertexProgram += "uniform mat4 glModelViewProjectionMatrix;\n";
+ vertexProgram += "varying vec2 glTexCoord0;\n";
+ vertexProgram += "void main( void ){\n";
+ vertexProgram += "gl_Position = glModelViewProjectionMatrix * glVertex;\n";
+ vertexProgram += "glTexCoord0 = glMultiTexCoord0.st;\n";
+ vertexProgram += "}";
+
+ String fragmentProgram = "#version 120\n";
+ fragmentProgram += "precision mediump float;\n";
+ fragmentProgram += alphaTestUniforms;
+ fragmentProgram += "varying vec2 glTexCoord0;\n";
+ fragmentProgram += "uniform sampler2D BaseMap;\n";
+ fragmentProgram += "void main( void ){\n ";
+ fragmentProgram += "vec4 baseMap = texture2D( BaseMap, glTexCoord0.st );\n";
+ fragmentProgram += alphaTestMethod;
+ fragmentProgram += "gl_FragColor = baseMap;\n";
+ fragmentProgram += "}";
+
+ textureShaderProgram.setShaders(makeShaders(vertexProgram, fragmentProgram));
+ textureShaderProgram.setShaderAttrNames(new String[] { "BaseMap" });
+ }
+
+ setShaderProgram(textureShaderProgram);
+
+ ShaderAttributeSet shaderAttributeSet = new ShaderAttributeSet();
+ shaderAttributeSet.put(new ShaderAttributeValue("BaseMap", new Integer(0)));
+ setShaderAttributeSet(shaderAttributeSet);
+
+ }
+ else
+
+ {
+ if (color != null)
+ {
+ PolygonAttributes polyAtt = new PolygonAttributes(PolygonAttributes.POLYGON_LINE, PolygonAttributes.CULL_NONE, 0.0f);
+ polyAtt.setPolygonOffset(0.1f);
+ setPolygonAttributes(polyAtt);
+ LineAttributes lineAtt = new LineAttributes(1, LineAttributes.PATTERN_SOLID, false);
+ setLineAttributes(lineAtt);
+
+ ColoringAttributes colorAtt = new ColoringAttributes(color, ColoringAttributes.FASTEST);
+ setColoringAttributes(colorAtt);
+
+ RenderingAttributes ra = new RenderingAttributes();
+ ra.setIgnoreVertexColors(true);
+ setRenderingAttributes(ra);
+
+ Material mat = new Material();
+ setMaterial(mat);
+
+ if (colorLineShaderProgram == null)
+ {
+ colorLineShaderProgram = new GLSLShaderProgram() {
+ @Override
+ public String toString()
+ {
+ return "SimpleShaderAppearance colorLineShaderProgram";
+ }
+ };
+ String vertexProgram = "#version 120\n";
+ vertexProgram += "attribute vec4 glVertex;\n";
+ vertexProgram += "attribute vec4 glColor;\n";
+ vertexProgram += "uniform int ignoreVertexColors;\n";
+ vertexProgram += "uniform vec4 objectColor;\n";
+ vertexProgram += "uniform mat4 glModelViewProjectionMatrix;\n";
+ vertexProgram += "varying vec4 glFrontColor;\n";
+ vertexProgram += "void main( void ){\n";
+ vertexProgram += "gl_Position = glModelViewProjectionMatrix * glVertex;\n";
+ vertexProgram += "if( ignoreVertexColors != 0 )\n";
+ vertexProgram += " glFrontColor = objectColor;\n";
+ vertexProgram += "else\n";
+ vertexProgram += " glFrontColor = glColor;\n";
+ vertexProgram += "}";
+
+ String fragmentProgram = "#version 120\n";
+ fragmentProgram += "precision mediump float;\n";
+ fragmentProgram += "varying vec4 glFrontColor;\n";
+ fragmentProgram += "void main( void ){\n";
+ fragmentProgram += "gl_FragColor = glFrontColor;\n";
+ fragmentProgram += "}";
+
+ colorLineShaderProgram.setShaders(makeShaders(vertexProgram, fragmentProgram));
+ }
+
+ setShaderProgram(colorLineShaderProgram);
+
+ }
+ else
+ {
+ RenderingAttributes ra = new RenderingAttributes();
+ setRenderingAttributes(ra);
+
+ if (flatShaderProgram == null)
+ {
+ flatShaderProgram = new GLSLShaderProgram() {
+ @Override
+ public String toString()
+ {
+ return "SimpleShaderAppearance flatShaderProgram";
+ }
+ };
+ String vertexProgram = "#version 120\n";
+ vertexProgram += "attribute vec4 glVertex;\n";
+ vertexProgram += "attribute vec4 glColor;\n";
+ vertexProgram += "uniform int ignoreVertexColors;\n";
+ vertexProgram += "uniform vec4 objectColor;\n";
+ vertexProgram += "uniform mat4 glModelViewProjectionMatrix;\n";
+ vertexProgram += "varying vec4 glFrontColor;\n";
+ vertexProgram += "void main( void ){\n";
+ vertexProgram += "gl_Position = glModelViewProjectionMatrix * glVertex;\n";
+ vertexProgram += "if( ignoreVertexColors != 0 )\n";
+ vertexProgram += " glFrontColor = objectColor;\n";
+ vertexProgram += "else\n";
+ vertexProgram += " glFrontColor = glColor;\n";
+ vertexProgram += "}";
+
+ String fragmentProgram = "#version 120\n";
+ fragmentProgram += "precision mediump float;\n";
+ fragmentProgram += "varying vec4 glFrontColor;\n";
+ fragmentProgram += "void main( void ){\n";
+ fragmentProgram += "gl_FragColor = glFrontColor;\n";
+ fragmentProgram += "}";
+
+ flatShaderProgram.setShaders(makeShaders(vertexProgram, fragmentProgram));
+
+ }
+
+ setShaderProgram(flatShaderProgram);
+
+ }
+ }
+
+ }
+
+ }
+
+ private static Shader[] makeShaders(String vertexProgram, String fragmentProgram)
+ {
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_VERTEX, vertexProgram) {
+ @Override
+ public String toString()
+ {
+ return "vertexProgram";
+ }
+ };
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_FRAGMENT, fragmentProgram) {
+ @Override
+ public String toString()
+ {
+ return "fragmentProgram";
+ }
+ };
+ return shaders;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SphereGLSL.form b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SphereGLSL.form
new file mode 100644
index 0000000..26e9b32
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SphereGLSL.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="SphereGLSL"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SphereGLSL.java b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SphereGLSL.java
new file mode 100644
index 0000000..8a59c5f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/SphereGLSL.java
@@ -0,0 +1,388 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.gl2es2pipeline;
+
+import java.awt.GraphicsConfiguration;
+import java.io.File;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+import javax.swing.JOptionPane;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.J3DBuffer;
+import org.jogamp.java3d.Light;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointLight;
+import org.jogamp.java3d.PositionInterpolator;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderError;
+import org.jogamp.java3d.ShaderErrorListener;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.SpotLight;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TriangleStripArray;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * Simple Java 3D example program with programmable shader.
+ */
+public class SphereGLSL extends javax.swing.JFrame
+{
+
+ // Constants for type of light to use
+ private static final int DIRECTIONAL_LIGHT = 0;
+ private static final int POINT_LIGHT = 1;
+ private static final int SPOT_LIGHT = 2;
+
+ // Flag indicates type of lights: directional, point, or spot
+ // lights. This flag is set based on command line argument
+ private static int lightType = POINT_LIGHT;//DIRECTIONAL_LIGHT;
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ public BranchGroup createSceneGraph()
+ {
+ Color3f eColor = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f sColor = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f objColor = new Color3f(0.6f, 0.6f, 0.6f);
+ Color3f lColor1 = new Color3f(1.0f, 0.0f, 0.0f);
+ Color3f lColor2 = new Color3f(0.0f, 1.0f, 0.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+
+ Transform3D t;
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+
+ // Set up the background
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objScale.addChild(bg);
+
+ // Create a Sphere object, generate one copy of the sphere,
+ // and add it into the scene graph.
+ ShaderAppearance a = new ShaderAppearance();
+ Material m = new Material(objColor, eColor, objColor, sColor, 100.0f);
+ m.setLightingEnable(true);
+ String vertexProgram = null;
+ String fragmentProgram = null;
+ try
+ {
+ vertexProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/simple.vert"));
+ fragmentProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/simple.frag"));
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_VERTEX, vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_FRAGMENT, fragmentProgram);
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+ shaderProgram.setShaders(shaders);
+
+ a.setShaderProgram(shaderProgram);
+ a.setMaterial(m);
+ Sphere sph = new Sphere(1.0f, Sphere.GENERATE_NORMALS, 200, a);
+ makeNIO(sph);
+ objScale.addChild(sph);
+
+ // Create the transform group node for the each light and initialize
+ // it to the identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add them to the root
+ // of the subgraph.
+ TransformGroup l1RotTrans = new TransformGroup();
+ l1RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l1RotTrans);
+
+ TransformGroup l2RotTrans = new TransformGroup();
+ l2RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l2RotTrans);
+
+ // Create transformations for the positional lights
+ t = new Transform3D();
+ Vector3d lPos1 = new Vector3d(0.0, 0.0, 2.0);
+ t.set(lPos1);
+ TransformGroup l1Trans = new TransformGroup(t);
+ l1RotTrans.addChild(l1Trans);
+
+ t = new Transform3D();
+ Vector3d lPos2 = new Vector3d(0.5, 0.8, 2.0);
+ t.set(lPos2);
+ TransformGroup l2Trans = new TransformGroup(t);
+ l2RotTrans.addChild(l2Trans);
+
+ // Create Geometry for point lights
+ ColoringAttributes caL1 = new ColoringAttributes();
+ ColoringAttributes caL2 = new ColoringAttributes();
+ caL1.setColor(lColor1);
+ caL2.setColor(lColor2);
+
+ Appearance appL1 = new SimpleShaderAppearance(false, false);
+ Appearance appL2 = new SimpleShaderAppearance(false, false);
+ appL1.setColoringAttributes(caL1);
+ appL2.setColoringAttributes(caL2);
+
+ Sphere sph2 = new Sphere(0.05f, appL1);
+ makeNIO(sph2);
+
+ l1Trans.addChild(sph2);
+ Sphere sph3 = new Sphere(0.05f, appL2);
+ makeNIO(sph3);
+
+ l2Trans.addChild(sph3);
+
+ // Create lights
+ AmbientLight aLgt = new AmbientLight(alColor);
+
+ Light lgt1 = null;
+ Light lgt2 = null;
+
+ Point3f lPoint = new Point3f(0.0f, 0.0f, 0.0f);
+ Point3f atten = new Point3f(1.0f, 0.0f, 0.0f);
+ Vector3f lDirect1 = new Vector3f(lPos1);
+ Vector3f lDirect2 = new Vector3f(lPos2);
+ lDirect1.negate();
+ lDirect2.negate();
+
+ switch (lightType)
+ {
+ case DIRECTIONAL_LIGHT:
+ lgt1 = new DirectionalLight(lColor1, lDirect1);
+ lgt2 = new DirectionalLight(lColor2, lDirect2);
+ break;
+ case POINT_LIGHT:
+ lgt1 = new PointLight(lColor1, lPoint, atten);
+ lgt2 = new PointLight(lColor2, lPoint, atten);
+ break;
+ case SPOT_LIGHT:
+ lgt1 = new SpotLight(lColor1, lPoint, atten, lDirect1, 25.0f * (float) Math.PI / 180.0f, 10.0f);
+ lgt2 = new SpotLight(lColor2, lPoint, atten, lDirect2, 25.0f * (float) Math.PI / 180.0f, 10.0f);
+ break;
+ }
+
+ // Set the influencing bounds
+ aLgt.setInfluencingBounds(bounds);
+ lgt1.setInfluencingBounds(bounds);
+ lgt2.setInfluencingBounds(bounds);
+
+ // Add the lights into the scene graph
+ objScale.addChild(aLgt);
+ l1Trans.addChild(lgt1);
+ l2Trans.addChild(lgt2);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotor1Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 4000, 0, 0, 0, 0, 0);
+ RotationInterpolator rotator1 = new RotationInterpolator(rotor1Alpha, l1RotTrans, yAxis, 0.0f, (float) Math.PI * 2.0f);
+ rotator1.setSchedulingBounds(bounds);
+ l1RotTrans.addChild(rotator1);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Alpha rotor2Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 1000, 0, 0, 0, 0, 0);
+ RotationInterpolator rotator2 = new RotationInterpolator(rotor2Alpha, l2RotTrans, yAxis, 0.0f, 0.0f);
+ bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ rotator2.setSchedulingBounds(bounds);
+ l2RotTrans.addChild(rotator2);
+
+ // Create a position interpolator and attach it to the view
+ // platform
+ TransformGroup vpTrans = univ.getViewingPlatform().getViewPlatformTransform();
+ Transform3D axisOfTranslation = new Transform3D();
+ Alpha transAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE, 0, 0, 5000, 0, 0, 5000, 0, 0);
+ axisOfTranslation.rotY(-Math.PI / 2.0);
+ PositionInterpolator translator = new PositionInterpolator(transAlpha, vpTrans, axisOfTranslation, 2.0f, 3.5f);
+ translator.setSchedulingBounds(bounds);
+ objScale.addChild(translator);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse()
+ {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D canvas3d = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(canvas3d);
+ //BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+
+ // Add a ShaderErrorListener
+ univ.addShaderErrorListener(new ShaderErrorListener() {
+ @Override
+ public void errorOccurred(ShaderError error)
+ {
+ error.printVerbose();
+ JOptionPane.showMessageDialog(SphereGLSL.this, error.toString(), "ShaderError", JOptionPane.ERROR_MESSAGE);
+ }
+ });
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return canvas3d;
+ }
+
+ /**
+ * Creates new form SphereGLSL
+ */
+ public SphereGLSL()
+ {
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("SphereGLSL");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[])
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend", "jogl2es2");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
+ public void run()
+ {
+ SphereGLSL sphereGLSL = new SphereGLSL();
+ sphereGLSL.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+
+ // End of variables declaration//GEN-END:variables
+ public static void makeNIO(Sphere sph)
+ {
+ //Make it NIO
+ TriangleStripArray geo = (TriangleStripArray) sph.getShape().getGeometry();
+ int[] stripVertexCounts = new int[geo.getNumStrips()];
+ geo.getStripVertexCounts(stripVertexCounts);
+ TriangleStripArray newGeo = new TriangleStripArray(geo.getVertexCount(), GeometryArray.COORDINATES | GeometryArray.NORMALS
+ //| GeometryArray.TEXTURE_COORDINATE_2
+ | GeometryArray.USE_NIO_BUFFER | GeometryArray.BY_REFERENCE, stripVertexCounts);
+
+ float[] coords = new float[geo.getValidVertexCount() * 3];
+ geo.getCoordinates(0, coords);
+ newGeo.setCoordRefBuffer(new J3DBuffer(makeFloatBuffer(coords)));
+ float[] norms = new float[geo.getValidVertexCount() * 3];
+ geo.getNormals(0, norms);
+ newGeo.setNormalRefBuffer(new J3DBuffer(makeFloatBuffer(norms)));
+ sph.getShape().setGeometry(newGeo);
+
+ }
+
+ private static FloatBuffer makeFloatBuffer(float[] arr)
+ {
+ ByteBuffer bb = ByteBuffer.allocateDirect(arr.length * 4);
+ bb.order(ByteOrder.nativeOrder());
+ FloatBuffer fb = bb.asFloatBuffer();
+ fb.put(arr);
+ fb.position(0);
+ return fb;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/VertexAttrTestGLSL.form b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/VertexAttrTestGLSL.form
new file mode 100644
index 0000000..6e31a8f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/VertexAttrTestGLSL.form
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <NonVisualComponents>
+ <Menu class="javax.swing.JMenuBar" name="jMenuBar1">
+ <SubComponents>
+ <Menu class="javax.swing.JMenu" name="fileMenu">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="File"/>
+ </Properties>
+ <SubComponents>
+ <MenuItem class="javax.swing.JMenuItem" name="exitMenuItem">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Exit"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="exitMenuItemActionPerformed"/>
+ </Events>
+ </MenuItem>
+ </SubComponents>
+ </Menu>
+ </SubComponents>
+ </Menu>
+ </NonVisualComponents>
+ <Properties>
+ <Property name="title" type="java.lang.String" value="VertexAttrTestGLSL"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="menuBar" type="java.lang.String" value="jMenuBar1"/>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <Events>
+ <EventHandler event="windowClosing" listener="java.awt.event.WindowListener" parameters="java.awt.event.WindowEvent" handler="exitForm"/>
+ </Events>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="mainPanel">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="guiPanel">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.LineBorderInfo">
+ <LineBorder/>
+ </Border>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="North"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="vertexCheckBoxPanel">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="vertexFormat">
+ <Font PropertyName="font" name="Lucida Sans" size="10" style="0"/>
+ </TitledBorder>
+ </Border>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="2" insetsBottom="2" insetsRight="2" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="jPanel1">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="11" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JSeparator" name="jSeparator1">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[0, 4]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JSeparator" name="jSeparator2">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[0, 4]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="jPanel2">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="11" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JCheckBox" name="vertexAttrsBox">
+ <Properties>
+ <Property name="selected" type="boolean" value="true"/>
+ <Property name="text" type="java.lang.String" value="VertexAttrs"/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="4" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="geometryPanel">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="2" insetsBottom="2" insetsRight="2" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JButton" name="createButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Create Geometry"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="createButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JButton" name="destroyButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Destroy Geometry"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="destroyButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="2" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/VertexAttrTestGLSL.java b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/VertexAttrTestGLSL.java
new file mode 100644
index 0000000..f80ac11
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/VertexAttrTestGLSL.java
@@ -0,0 +1,435 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.gl2es2pipeline;
+
+import java.awt.GraphicsConfiguration;
+import java.io.File;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.J3DBuffer;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderError;
+import org.jogamp.java3d.ShaderErrorListener;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TriangleArray;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+
+public class VertexAttrTestGLSL extends javax.swing.JFrame
+{
+
+ SimpleUniverse univ = null;
+ BranchGroup scene = null;
+
+ public BranchGroup createSceneGraph(boolean hasVertexAttrs)
+ {
+
+ // Bounds for BG and behavior
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+ objRoot.setCapability(BranchGroup.ALLOW_DETACH);
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.1f, 0.1f, 0.1f);
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objRoot.addChild(bg);
+
+ // Create the TransformGroup node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at run time. Add it to
+ // the root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // Create a simple Shape3D node; add it to the scene graph.
+ objTrans.addChild(new MyShape(this, hasVertexAttrs));
+
+ return objRoot;
+ }
+
+ private Canvas3D initScene()
+ {
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ univ = new SimpleUniverse(c);
+
+ // Add a ShaderErrorListener
+ univ.addShaderErrorListener(new ShaderErrorListener() {
+ @Override
+ public void errorOccurred(ShaderError error)
+ {
+ error.printVerbose();
+ JOptionPane.showMessageDialog(VertexAttrTestGLSL.this, error.toString(), "ShaderError", JOptionPane.ERROR_MESSAGE);
+ }
+ });
+
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ return c;
+ }
+
+ /**
+ * Creates new form VertexAttrTestGLSL
+ */
+ public VertexAttrTestGLSL()
+ {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create the scene and add the Canvas3D to the drawing panel
+ Canvas3D c = initScene();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+ }
+
+ static class MyShape extends Shape3D
+ {
+
+ // Coordinate data
+ private static final float[] coords = { 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, };
+
+ private static final int[] sizes = { 1, 3 };
+ private static final float[] weights = { 0.45f, 0.15f, 0.95f, };
+ private static final float[] temps = { 1.0f, 0.5f, 0.5f, 0.5f, 1.0f, 0.5f, 0.5f, 0.5f, 1.0f, };
+
+ private static final String[] vaNames = { "weight", "temperature" };
+
+ J3DBuffer createDirectFloatBuffer(float[] arr)
+ {
+ ByteOrder order = ByteOrder.nativeOrder();
+
+ FloatBuffer nioBuf = ByteBuffer.allocateDirect(arr.length * 4).order(order).asFloatBuffer();
+ nioBuf.put(arr);
+ return new J3DBuffer(nioBuf);
+ }
+
+ MyShape(JFrame frame, boolean hasVertexAttrs)
+ {
+
+ int vertexFormat = GeometryArray.COORDINATES;
+ int vertexAttrCount = 0;
+ int[] vertexAttrSizes = null;
+ String[] vertexAttrNames = null;
+ String[] shaderAttrNames = null;
+
+ if (hasVertexAttrs)
+ {
+ vertexFormat |= GeometryArray.VERTEX_ATTRIBUTES;
+ vertexAttrCount = vaNames.length;
+ vertexAttrSizes = sizes;
+ vertexAttrNames = vaNames;
+ }
+
+ //GL2ES2: requires by reference
+ vertexFormat |= GeometryArray.BY_REFERENCE;
+
+ TriangleArray tri = new TriangleArray(6, vertexFormat, 0, null, vertexAttrCount, vertexAttrSizes);
+ tri.setValidVertexCount(3);
+ //tri.setCoordinates(0, coords);
+ tri.setCoordRefFloat(coords);
+
+ if (hasVertexAttrs)
+ {
+ //tri.setVertexAttrs(0, 0, weights);
+ //tri.setVertexAttrs(1, 0, temps);
+
+ tri.setVertexAttrRefFloat(0, weights);
+ tri.setVertexAttrRefFloat(1, temps);
+
+ String vertexProgram = null;
+ String fragmentProgram = null;
+ try
+ {
+ vertexProgram = StringIO.readFully(new File(
+ System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/vertexshader.vert"));
+ fragmentProgram = StringIO.readFully(new File(
+ System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/vertexshader.frag"));
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_VERTEX, vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_FRAGMENT, fragmentProgram);
+
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+ shaderProgram.setShaders(shaders);
+ shaderProgram.setVertexAttrNames(vertexAttrNames);
+ shaderProgram.setShaderAttrNames(shaderAttrNames);
+
+ ShaderAppearance app = new ShaderAppearance();
+ app.setShaderProgram(shaderProgram);
+
+ this.setGeometry(tri);
+
+ this.setAppearance(app);
+ }
+ else
+ {
+ this.setGeometry(tri);
+ this.setAppearance(new Appearance());
+ }
+ }
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ mainPanel = new javax.swing.JPanel();
+ guiPanel = new javax.swing.JPanel();
+ vertexCheckBoxPanel = new javax.swing.JPanel();
+ jPanel1 = new javax.swing.JPanel();
+ jSeparator1 = new javax.swing.JSeparator();
+ jSeparator2 = new javax.swing.JSeparator();
+ jPanel2 = new javax.swing.JPanel();
+ vertexAttrsBox = new javax.swing.JCheckBox();
+ geometryPanel = new javax.swing.JPanel();
+ createButton = new javax.swing.JButton();
+ destroyButton = new javax.swing.JButton();
+ drawingPanel = new javax.swing.JPanel();
+ jMenuBar1 = new javax.swing.JMenuBar();
+ fileMenu = new javax.swing.JMenu();
+ exitMenuItem = new javax.swing.JMenuItem();
+
+ setTitle("VertexAttrTestGLSL");
+ addWindowListener(new java.awt.event.WindowAdapter() {
+ @Override
+ public void windowClosing(java.awt.event.WindowEvent evt)
+ {
+ exitForm(evt);
+ }
+ });
+
+ mainPanel.setLayout(new java.awt.BorderLayout());
+
+ guiPanel.setLayout(new java.awt.GridBagLayout());
+
+ guiPanel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
+ vertexCheckBoxPanel.setLayout(new java.awt.GridBagLayout());
+
+ vertexCheckBoxPanel.setBorder(
+ javax.swing.BorderFactory.createTitledBorder(null, "vertexFormat", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
+ javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Lucida Sans", 0, 10)));
+ jPanel1.setLayout(new java.awt.GridBagLayout());
+
+ jSeparator1.setPreferredSize(new java.awt.Dimension(0, 4));
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ jPanel1.add(jSeparator1, gridBagConstraints);
+
+ jSeparator2.setPreferredSize(new java.awt.Dimension(0, 4));
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 3;
+ jPanel1.add(jSeparator2, gridBagConstraints);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
+ vertexCheckBoxPanel.add(jPanel1, gridBagConstraints);
+
+ jPanel2.setLayout(new java.awt.GridBagLayout());
+
+ vertexAttrsBox.setSelected(true);
+ vertexAttrsBox.setText("VertexAttrs");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 4;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ jPanel2.add(vertexAttrsBox, gridBagConstraints);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
+ vertexCheckBoxPanel.add(jPanel2, gridBagConstraints);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
+ guiPanel.add(vertexCheckBoxPanel, gridBagConstraints);
+
+ geometryPanel.setLayout(new java.awt.GridBagLayout());
+
+ createButton.setText("Create Geometry");
+ createButton.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ createButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ geometryPanel.add(createButton, gridBagConstraints);
+
+ destroyButton.setText("Destroy Geometry");
+ destroyButton.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ destroyButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(0, 0, 2, 0);
+ geometryPanel.add(destroyButton, gridBagConstraints);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
+ guiPanel.add(geometryPanel, gridBagConstraints);
+
+ mainPanel.add(guiPanel, java.awt.BorderLayout.NORTH);
+
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
+ mainPanel.add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ getContentPane().add(mainPanel, java.awt.BorderLayout.CENTER);
+
+ fileMenu.setText("File");
+ exitMenuItem.setText("Exit");
+ exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ exitMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(exitMenuItem);
+
+ jMenuBar1.add(fileMenu);
+
+ setJMenuBar(jMenuBar1);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ private void destroyButtonActionPerformed(java.awt.event.ActionEvent evt)
+ {//GEN-FIRST:event_destroyButtonActionPerformed
+ if (scene != null)
+ {
+ univ.getLocale().removeBranchGraph(scene);
+ scene = null;
+ }
+ }//GEN-LAST:event_destroyButtonActionPerformed
+
+ private void createButtonActionPerformed(java.awt.event.ActionEvent evt)
+ {//GEN-FIRST:event_createButtonActionPerformed
+ if (scene == null)
+ {
+ boolean hasVertexAttrs = vertexAttrsBox.isSelected();
+ scene = createSceneGraph(hasVertexAttrs);
+ univ.addBranchGraph(scene);
+ }
+ }//GEN-LAST:event_createButtonActionPerformed
+
+ private static void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt)
+ {//GEN-FIRST:event_exitMenuItemActionPerformed
+ System.exit(0);
+ }//GEN-LAST:event_exitMenuItemActionPerformed
+
+ /** Exit the Application */
+ private static void exitForm(java.awt.event.WindowEvent evt)
+ {//GEN-FIRST:event_exitForm
+ System.exit(0);
+ }//GEN-LAST:event_exitForm
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[])
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend","jogl2es2");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
+ public void run()
+ {
+ new VertexAttrTestGLSL().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton createButton;
+ private javax.swing.JButton destroyButton;
+ private javax.swing.JPanel drawingPanel;
+ private javax.swing.JMenuItem exitMenuItem;
+ private javax.swing.JMenu fileMenu;
+ private javax.swing.JPanel geometryPanel;
+ private javax.swing.JPanel guiPanel;
+ private javax.swing.JMenuBar jMenuBar1;
+ private javax.swing.JPanel jPanel1;
+ private javax.swing.JPanel jPanel2;
+ private javax.swing.JSeparator jSeparator1;
+ private javax.swing.JSeparator jSeparator2;
+ private javax.swing.JPanel mainPanel;
+ private javax.swing.JCheckBox vertexAttrsBox;
+ private javax.swing.JPanel vertexCheckBoxPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/aabrick.frag b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/aabrick.frag
new file mode 100644
index 0000000..030b811
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/aabrick.frag
@@ -0,0 +1,56 @@
+//
+// Fragment shader for antialiased procedural bricks
+//
+// Authors: Dave Baldwin, Randi Rost
+// based on a shader by Darwyn Peachey
+//
+// Copyright (c) 2002-2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+uniform vec3 BrickColor;
+//uniform vec3 MortarColor;
+//uniform vec2 BrickSize;
+//uniform vec2 BrickPct;
+//uniform vec2 MortarPct;
+
+//const vec3 BrickColor = vec3 (1, 0.3, 0.2);
+const vec3 MortarColor = vec3 (0.85, 0.86, 0.84);
+const vec2 BrickSize = vec2 (0.3, 0.15);
+const vec2 BrickPct = vec2 (0.9, 0.85);
+const vec2 MortarPct = vec2 (0.1, 0.15);
+
+varying vec2 MCposition;
+varying float LightIntensity;
+
+#define Integral(x, p, notp) ((floor(x)*(p)) + max(fract(x)-(notp), 0.0))
+
+void main(void)
+{
+ vec2 position, fw, useBrick;
+ vec3 color;
+
+ // Determine position within the brick pattern
+ position = MCposition / BrickSize;
+
+ // Adjust every other row by an offset of half a brick
+ if (fract(position.y * 0.5) > 0.5)
+ position.x += 0.5;
+
+ // Calculate filter size
+ //fw = fwidth(position); //fwidth not implemented on WildcatVP
+ fw = (abs(dFdx(MCposition)) + abs(dFdy(MCposition))) / BrickSize;
+
+ // Perform filtering by integrating the 2D pulse made by the
+ // brick pattern over the filter width and height
+ useBrick = (Integral(position + fw, BrickPct, MortarPct) -
+ Integral(position, BrickPct, MortarPct)) / fw;
+
+ // Determine final color
+ color = mix(MortarColor, BrickColor, useBrick.x * useBrick.y);
+ color *= LightIntensity;
+
+ // GL2ES2: gl_FragColor is unchanged
+ gl_FragColor = vec4 (color, 1.0);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/aabrick.vert b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/aabrick.vert
new file mode 100644
index 0000000..9b96195
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/aabrick.vert
@@ -0,0 +1,64 @@
+//
+// Vertex shader for antialiased procedural bricks
+//
+// Authors: Dave Baldwin, Steve Koren, Randi Rost
+// based on a shader by Darwyn Peachey
+//
+// Copyright (c) 2002-2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+// GL2ES2: Java3D built-in attributes, these are calculated and passsed in if declared here
+attribute vec4 glVertex;
+attribute vec3 glNormal;
+
+// GL2ES2: Java3D built-in uniforms, these are calculated and passsed in if declared here
+uniform mat4 glModelViewMatrix;
+uniform mat4 glModelViewProjectionMatrix;
+uniform mat3 glNormalMatrix;
+
+
+uniform vec3 LightPosition;
+//const vec3 LightPosition = vec3 (0, 4, 4);
+
+const float SpecularContribution = 0.3;
+const float DiffuseContribution = 1.0 - SpecularContribution;
+
+varying float LightIntensity;
+varying vec2 MCposition;
+
+void main(void)
+{
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ //vec3 ecPosition = vec3 (gl_ModelViewMatrix * gl_Vertex);
+ vec3 ecPosition = vec3 (glModelViewMatrix * glVertex);
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ //vec3 tnorm = normalize(gl_NormalMatrix * glNormal);
+ vec3 tnorm = normalize(glNormalMatrix * glNormal);
+
+
+ vec3 lightVec = normalize(LightPosition - ecPosition);
+ vec3 reflectVec = reflect(-lightVec, tnorm);
+ vec3 viewVec = normalize(-ecPosition);
+ float diffuse = max(dot(lightVec, tnorm), 0.0);
+ float spec = 0.0;
+
+ if (diffuse > 0.0)
+ {
+ spec = max(dot(reflectVec, viewVec), 0.0);
+ spec = pow(spec, 16.0);
+ }
+
+ LightIntensity = DiffuseContribution * diffuse +
+ SpecularContribution * spec;
+
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ //MCposition = gl_Vertex.xy;
+ MCposition = glVertex.xy;
+
+ // GL2ES2: ftransform() no longer exists, but it is simple (note use of Java3D built-in uniforms and attributes)
+ // GL2ES2: gl_Position is unchanged
+ //gl_Position = ftransform();
+ gl_Position = glModelViewProjectionMatrix * glVertex;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/dimple.frag b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/dimple.frag
new file mode 100644
index 0000000..b2a2ef7
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/dimple.frag
@@ -0,0 +1,68 @@
+
+//
+// dimple.frag: Fragment shader for bump mapping dimples (bumps)
+//
+// author: John Kessenich
+//
+// Copyright (c) 2002: 3Dlabs, Inc.
+//
+//
+
+// GL2ES2: non buit-in varyings
+varying vec2 glTexCoord0;
+varying vec4 C;
+
+varying vec3 LightDir;
+varying vec3 EyeDir;
+varying vec3 Normal;
+
+//const vec3 Color = vec3(0.7, 0.6, 0.18);
+
+//const float Density = 16.0;
+//const float Size = 0.25;
+
+uniform vec3 Color;
+uniform float Density;
+uniform float Size;
+// uniform float SpecularFactor;
+
+//float Density = 27.6;
+//float Size = 0.13025;
+
+
+//uniform float Scale;
+
+const float SpecularFactor = 0.4;
+
+void main (void)
+{
+ vec3 litColor;
+
+ // GL2ES2: non buit-in varying
+ vec2 c = Density * (glTexCoord0.xy);
+ vec2 p = fract(c) - vec2(0.5);
+ float d = (p.x * p.x) + (p.y * p.y);
+ if (d >= Size)
+ p = vec2(0.0);
+
+ vec3 normDelta = vec3(-p.x, -p.y, 1.0);
+
+ litColor = Color * max(0.0, dot(normDelta, LightDir));
+
+ float t = 2.0 * dot(LightDir, normDelta);
+ vec3 reflectDir = t * normDelta;
+ reflectDir = LightDir - reflectDir;
+
+// vec3 reflectDir = LightDir - 2.0 * dot(LightDir, normDelta) * normDelta;
+
+ float spec = max(dot(EyeDir, reflectDir), 0.0);
+ spec = spec * spec;
+ spec = spec * spec;
+ spec *= SpecularFactor;
+
+ litColor = min(litColor + spec, vec3(1.0));
+ // GL2ES2: gl_FragColor is unchanged, C is a non built-in varying
+ gl_FragColor = vec4(litColor, C.a);
+// gl_FragColor = vec4(litColor, 1.0);
+// gl_FragColor = vec4(Scale);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/dimple.vert b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/dimple.vert
new file mode 100644
index 0000000..ebbfdc9
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/dimple.vert
@@ -0,0 +1,75 @@
+#version 120
+//
+// dimple.vert: Vertex shader for bump mapping dimples (bumps)
+//
+// author: John Kessenich
+//
+// Copyright (c) 2002: 3Dlabs, Inc.
+//
+
+
+// GL2ES2: Java3D built-in attributes, these are calculated and passsed in if declared here
+attribute vec4 glVertex;
+attribute vec3 glNormal;
+attribute vec4 glColor;
+
+// GL2ES2: Java3D built-in uniforms, these are calculated and passsed in if declared here
+uniform mat4 glModelViewMatrix;
+uniform mat4 glModelViewProjectionMatrix;
+uniform mat3 glNormalMatrix;
+
+uniform int ignoreVertexColors;
+
+// GL2ES2: new output varyings, these replace gl_TexCoord[] and gl_FrontColor (along with A and D)
+varying vec2 glTexCoord0;
+varying vec4 C;
+
+varying vec3 LightDir;
+varying vec3 EyeDir;
+varying vec3 Normal;
+
+uniform vec3 LightPosition;
+// uniform float Scale;
+// vec3 LightPosition = vec3(0.0, 0.0, 5.0);
+float Scale = 1.0;
+
+
+
+void main(void)
+{
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ vec4 pos = glModelViewMatrix * glVertex;
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ gl_Position = glModelViewProjectionMatrix * glVertex;
+ vec3 eyeDir = vec3(pos);
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ // GL2ES2: swap built-in varying for declared varying
+ //gl_TexCoord[0] = gl_MultiTexCoord0;
+ glTexCoord0 = glVertex.xy;
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ // GL2ES2: swap built-in varying for declared varying
+ //gl_FrontColor = gl_Color;
+
+ if( ignoreVertexColors != 0)
+ C = vec4(1,1,1,1);
+ else
+ C = glColor;
+
+ vec3 n = normalize(glNormalMatrix * glNormal);
+ vec3 t = normalize(cross(vec3(1.141, 2.78, 3.14), n));
+ vec3 b = cross(n, t);
+
+ vec3 v;
+ v.x = dot(LightPosition, t);
+ v.y = dot(LightPosition, b);
+ v.z = dot(LightPosition, n);
+ LightDir = normalize(v);
+
+ v.x = dot(eyeDir, t);
+ v.y = dot(eyeDir, b);
+ v.z = dot(eyeDir, n);
+ EyeDir = normalize(v);
+
+
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/envmap.frag b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/envmap.frag
new file mode 100644
index 0000000..3e298f8
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/envmap.frag
@@ -0,0 +1,61 @@
+//
+// Fragment shader for environment mapping with an
+// equirectangular 2D texture
+//
+// Authors: John Kessenich, Randi Rost
+//
+// Copyright (c) 2002-2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+const vec3 Xunitvec = vec3 (1.0, 0.0, 0.0);
+const vec3 Yunitvec = vec3 (0.0, 1.0, 0.0);
+
+uniform vec3 BaseColor;
+uniform float MixRatio;
+
+uniform sampler2D EnvMap;
+
+varying vec3 Normal;
+varying vec3 EyeDir;
+varying float LightIntensity;
+
+void main (void)
+{
+ // Compute reflection vector
+ vec3 reflectDir = reflect(EyeDir, Normal);
+
+ // Compute altitude and azimuth angles
+
+ vec2 index;
+
+ index.y = dot(normalize(reflectDir), Yunitvec);
+ reflectDir.y = 0.0;
+ index.x = dot(normalize(reflectDir), Xunitvec) * 0.5;
+
+ // Translate index values into proper range
+
+ if (reflectDir.z >= 0.0)
+ index = (index + 1.0) * 0.5;
+ else
+ {
+ index.t = (index.t + 1.0) * 0.5;
+ index.s = (-index.s) * 0.5 + 1.0;
+ }
+
+ // if reflectDir.z >= 0.0, s will go from 0.25 to 0.75
+ // if reflectDir.z < 0.0, s will go from 0.75 to 1.25, and
+ // that's OK, because we've set the texture to wrap.
+
+ // Do a lookup into the environment map.
+
+ vec3 envColor = vec3 (texture2D(EnvMap, index));
+
+ // Add lighting to base color and mix
+
+ vec3 base = LightIntensity * BaseColor;
+ envColor = mix(envColor, base, MixRatio);
+
+ gl_FragColor = vec4 (envColor, 1.0);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/envmap.vert b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/envmap.vert
new file mode 100644
index 0000000..2296c83
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/envmap.vert
@@ -0,0 +1,46 @@
+//
+// Vertex shader for environment mapping with an
+// equirectangular 2D texture
+//
+// Authors: John Kessenich, Randi Rost
+//
+// Copyright (c) 2002-2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+// GL2ES2: Java3D built-in attributes, these are calculated and passsed in if declared here
+attribute vec4 glVertex;
+attribute vec3 glNormal;
+
+// GL2ES2: Java3D built-in uniforms, these are calculated and passsed in if declared here
+uniform mat4 glModelViewMatrix;
+uniform mat4 glModelViewProjectionMatrix;
+uniform mat3 glNormalMatrix;
+
+
+varying vec3 Normal;
+varying vec3 EyeDir;
+varying float LightIntensity;
+
+uniform vec3 LightPos;
+
+void main(void)
+{
+ // GL2ES2: ftransform() no longer exists, but it is simple (note use of Java3D built-in uniforms and attributes)
+ // GL2ES2: gl_Position is unchanged
+ //gl_Position = ftransform();
+ gl_Position = glModelViewProjectionMatrix * glVertex;
+
+ // compute the transformed normal
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ //vec3 Normal = normalize(gl_NormalMatrix * gl_Normal);
+ Normal = normalize(glNormalMatrix * glNormal);
+
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ //vec4 pos = gl_ModelViewMatrix * gl_Vertex;
+ vec4 pos = glModelViewMatrix * glVertex;
+
+ EyeDir = pos.xyz;
+ LightIntensity = max(dot(normalize(LightPos - EyeDir), Normal), 0.0);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/fixed_function_shader.frag b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/fixed_function_shader.frag
new file mode 100644
index 0000000..3da3ef6
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/fixed_function_shader.frag
@@ -0,0 +1,108 @@
+#version 140
+
+precision mediump float;
+
+
+uniform int alphaTestEnabled;
+uniform int alphaTestFunction;
+uniform float alphaTestValue;
+
+struct fogData
+{
+ int fogEnabled;
+ vec4 expColor;
+ float expDensity;
+ vec4 linearColor;
+ float linearStart;
+ float linearEnd;
+};
+uniform fogData fogData;
+
+in vec2 glTexCoord0;
+
+uniform sampler2D BaseMap;
+
+in vec3 LightDir;
+in vec3 ViewDir;
+
+in vec3 N;
+
+in vec4 A;
+in vec4 C;
+in vec4 D;
+in vec3 S;
+in vec3 emissive;
+
+in float shininess;
+
+out vec4 glFragColor;
+
+void main( void )
+{
+ vec4 baseMap = texture( BaseMap, glTexCoord0.st );
+
+ //web says the keyword discard in a shader is bad
+ //I could just gl_FragColor=vec(0,0,0,0); return;
+ if(alphaTestEnabled != 0)
+ {
+ if(alphaTestFunction==516)//>
+ if(baseMap.a<=alphaTestValue)discard;
+ else if(alphaTestFunction==518)//>=
+ if(baseMap.a<alphaTestValue)discard;
+ else if(alphaTestFunction==514)//==
+ if(baseMap.a!=alphaTestValue)discard;
+ else if(alphaTestFunction==517)//!=
+ if(baseMap.a==alphaTestValue)discard;
+ else if(alphaTestFunction==513)//<
+ if(baseMap.a>=alphaTestValue)discard;
+ else if(alphaTestFunction==515)//<=
+ if(baseMap.a>alphaTestValue)discard;
+ else if(alphaTestFunction==512)//never
+ discard;
+ }
+
+ vec3 normal = N;
+
+ vec3 L = normalize(LightDir);
+ vec3 E = normalize(ViewDir);
+ vec3 R = reflect(-L, normal);
+ vec3 H = normalize( L + E );
+
+ float NdotL = max( dot(normal, L), 0.0 );
+ float NdotH = max( dot(normal, H), 0.0 );
+ float EdotN = max( dot(normal, E), 0.0 );
+ float NdotNegL = max( dot(normal, -L), 0.0 );
+
+ vec4 color;
+ vec3 albedo = baseMap.rgb * C.rgb;
+ vec3 diffuse = A.rgb + (D.rgb * NdotL);
+
+ // Specular
+ vec3 spec = S * pow(NdotH, 0.3*shininess);
+
+ color.rgb = albedo * (diffuse + emissive) + spec;
+ color.a = C.a * baseMap.a;
+
+ if(fogData.fogEnabled == 1)
+ {
+ //compute distance used in fog equations
+ float dist = length(ViewVec);
+ float fogFactor = 0.0;
+
+ if(fogData.linearEnd > 0.0)//linear fog
+ {
+ fogFactor = 1.0-((fogData.linearEnd - dist)/(fogData.linearEnd - fogData.linearStart));
+ fogFactor = clamp( fogFactor, 0.0, 1.0 );
+ color = mix(color, fogData.linearColor, fogFactor);
+ }
+ else if( fogData.expDensity > 0.0)// exponential fog
+ {
+ fogFactor = 1.0-(1.0 /exp(dist * fogData.expDensity));
+ fogFactor = clamp( fogFactor, 0.0, 1.0 );
+ color = mix(color, fogData.expColor, fogFactor);
+ }
+ color.a = color.a + fogFactor;
+ }
+
+ glFragColor = color;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/fixed_function_shader.vert b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/fixed_function_shader.vert
new file mode 100644
index 0000000..354c004
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/fixed_function_shader.vert
@@ -0,0 +1,142 @@
+#version 150
+
+in vec4 glVertex;
+in vec4 glColor;
+in vec3 glNormal;
+in vec2 glMultiTexCoord0;
+
+uniform mat4 glProjectionMatrix;
+//uniform mat4 glProjectionMatrixInverse;
+uniform mat4 glViewMatrix;
+uniform mat4 glModelMatrix;
+//uniform mat4 glModelViewMatrix;
+//uniform mat4 glModelViewMatrixInverse;
+//uniform mat4 glModelViewProjectionMatrix;
+
+//uniform mat3 glNormalMatrix;
+
+uniform int ignoreVertexColors;
+
+uniform vec4 glLightModelambient;
+
+struct material
+{
+ int lightEnabled;
+ vec4 ambient;
+ vec4 diffuse;
+ vec4 emission;
+ vec3 specular;
+ float shininess;
+};
+uniform material glFrontMaterial;
+
+struct lightSource
+{
+ int enabled;
+ vec4 position;
+ vec4 diffuse;
+ vec4 specular;
+ float constantAttenuation, linearAttenuation, quadraticAttenuation;
+ float spotCutoff, spotExponent;
+ vec3 spotDirection;
+};
+
+uniform int numberOfLights;// numberOfLights will be set to how many the pipeline can send
+const int maxLights = 1;// this is for the shader, it will process no more than this, must be a const
+uniform lightSource glLightSource[maxLights];
+
+uniform mat4 textureTransform;
+
+// alpha testing is normally done in frag versus the texture alpha
+//uniform int alphaTestEnabled;
+//uniform int alphaTestFunction;
+//uniform float alphaTestValue;
+
+
+// struct fogData
+// {
+// int fogEnabled = -1;
+// vec4 expColor;
+// float expDensity;
+// vec4 linearColor;
+// float linearStart;
+// float linearEnd;
+// };
+// uniform fogData fogData;
+
+
+// Fixed function pipeline pre-calculated values not available:
+// Note:
+// A,D,S = Ambient,Diffuse,Specular
+// cm, cli = glFrontMaterial, glLightSource
+
+
+// gl_LightSource[i].halfVector
+// http://stackoverflow.com/questions/3744038/what-is-half-vector-in-modern-glsl
+// vec3 ecPos = vec3(glModelViewMatrix * glVertex);
+// vec3 ecL;
+// if( glLightSource[i].position.w == 0.0)
+// ecL = vec3(glLightSource0position.xyz);// no -ecPos in case of dir lights?
+// else
+// ecL = vec3(glLightSource0position.xyz - ecPos);
+// vec3 L = normalize(ecL.xyz);
+// vec3 V = -ecPos.xyz;
+// vec3 halfVector = normalize(L + V);
+
+//gl_LightSource[i].ambient
+//use glLightModelambient
+
+// gl_FrontLightModelProduct.sceneColor
+// Derived. Ecm + Acm * Acs (Acs is normal glLightModelambient)
+// use vec4 sceneColor = glFrontMaterial.emission + glFrontMaterial.ambient * glLightModelambient;
+
+
+//gl_FrontLightProduct[i]
+//vec4 ambient; // Acm * Acli (Acli does not exist use glLightModelambient)
+//vec4 diffuse; // Dcm * Dcli
+//vec4 specular; // Scm * Scli
+// calculate yourself
+
+
+out vec2 glTexCoord0;
+
+out vec3 LightDir;
+out vec3 ViewVec;
+
+out vec3 N;
+
+out vec4 A;
+out vec4 C;
+out vec4 D;
+out vec3 S;
+out vec3 E;
+
+out float shininess;
+
+void main( void )
+{
+ mat4 glModelViewMatrix = glViewMatrix * glModelMatrix;
+ gl_Position = glProjectionMatrix * glModelViewMatrix * glVertex;//glModelViewProjectionMatrix * glVertex;
+
+ glTexCoord0 = (textureTransform * vec4(glMultiTexCoord0,0,1)).st;
+
+ mat3 glNormalMatrix = mat3(transpose(inverse(glModelViewMatrix)));
+ N = normalize(glNormalMatrix * glNormal);
+
+ vec3 v = vec3(glModelViewMatrix * glVertex);
+
+ ViewVec = -v.xyz;
+ LightDir = glLightSource[0].position.xyz;
+
+ A = glLightModelambient;
+ if( ignoreVertexColors != 0)
+ C = vec4(1,1,1,1);//glFrontMaterialdiffuse; // objectColor should be used if it is no lighting
+ else
+ C = glColor;
+ D = glLightSource[0].diffuse * glFrontMaterial.diffuse;
+ S = glLightSource[0].specular.rgb * glFrontMaterial.specular;
+ E = glFrontMaterial.emission.rgb;
+
+ shininess = glFrontMaterial.shininess;
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/gouraud.frag b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/gouraud.frag
new file mode 100644
index 0000000..c02a268
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/gouraud.frag
@@ -0,0 +1,54 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+// Simple GLSL fragment program to add the primary and secondary (specular) colors
+
+//GL2ES2: varying color data needs to be defined
+varying vec4 glFrontColor;
+varying vec4 glFrontSecondaryColor;
+
+void main()
+{
+ gl_FragColor = glFrontColor + glFrontSecondaryColor;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/gouraud.vert b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/gouraud.vert
new file mode 100644
index 0000000..771afce
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/gouraud.vert
@@ -0,0 +1,158 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+// A GLSL vertex program for handling 1 directional light with specular.
+// This implements per-vertex lighting (Gouraud shading).
+
+// GL2ES2: Java3D built-in attributes, these are calculated and passsed in if declared here
+attribute vec4 glVertex;
+attribute vec3 glNormal;
+
+// GL2ES2: Java3D built-in uniforms, these are calculated and passsed in if declared here
+uniform mat4 glModelViewMatrix;
+uniform mat4 glModelViewProjectionMatrix;
+uniform mat3 glNormalMatrix;
+
+
+
+uniform vec4 glLightModelambient;
+
+struct material
+{
+ int lightEnabled;
+ vec4 ambient;
+ vec4 diffuse;
+ vec4 emission;// note vec4 extra 1.0 sent through for ease
+ vec3 specular;
+ float shininess;
+};
+uniform material glFrontMaterial;
+
+struct lightSource
+{
+ int enabled;
+ vec4 position;
+ vec4 diffuse;
+ vec4 specular;
+ float constantAttenuation, linearAttenuation, quadraticAttenuation;
+ float spotCutoff, spotExponent;
+ vec3 spotDirection;
+};
+
+uniform int numberOfLights;
+const int maxLights = 1;
+uniform lightSource glLightSource[maxLights];
+
+//GL2ES2: varying color data needs to be defined
+varying vec4 glFrontColor;
+varying vec4 glFrontSecondaryColor;
+
+void directionalLight0(
+ in vec3 normal,
+ inout vec4 ambient,
+ inout vec4 diffuse,
+ inout vec3 specular)
+{
+ // Normalized light direction and half vector
+ vec3 lightDirection = normalize(vec3(glLightSource[0].position));
+
+ //GL2ES2: half vector must be calculated
+ //vec3 halfVector = normalize(vec3(gl_LightSource[0].halfVector));
+ //http://stackoverflow.com/questions/3744038/what-is-half-vector-in-modern-glsl
+ vec3 ecPos = vec3(glModelViewMatrix * glVertex);
+ vec3 ecL;
+ if( glLightSource[0].position.w == 0.0)
+ ecL = vec3(glLightSource[0].position.xyz);// no -ecPos in case of dir lights?
+ else
+ ecL = vec3(glLightSource[0].position.xyz - ecPos);
+ vec3 L = normalize(ecL.xyz);
+ vec3 V = -ecPos.xyz;
+ vec3 halfVector = normalize(L + V);
+
+ float nDotVP; // normal . light_direction
+ float nDotHV; // normal . light_half_vector
+ float pf; // power factor
+
+ nDotVP = max(0.0, dot(normal, lightDirection));
+ nDotHV = max(0.0, dot(normal, halfVector));
+
+ if (nDotVP == 0.0) {
+ pf = 0.0;
+ }
+ else {
+ pf = pow(nDotHV, glFrontMaterial.shininess);
+ }
+
+ ambient += glLightModelambient;
+ diffuse += glLightSource[0].diffuse * nDotVP;
+ specular += glFrontMaterial.specular * pf;
+}
+
+
+void main()
+{
+ vec3 tnorm = normalize(vec3(glNormalMatrix * glNormal));
+ vec4 amb = vec4(0.0);
+ vec4 diff = vec4(0.0);
+ vec3 spec = vec3(0.0);
+ int i;
+
+ // Transform the vertex
+ vec4 outPosition = glModelViewProjectionMatrix * glVertex;
+
+ directionalLight0(tnorm, amb, diff, spec);
+
+ //GL2ES2: sceneColor Derived. Ecm + Acm * Acs (Acs is normal glLightModelambient)
+ vec4 sceneColor = glFrontMaterial.emission + glFrontMaterial.ambient * glLightModelambient;
+
+ // Apply the result of the lighting equation
+ vec4 outSecondaryColor = vec4(vec3(spec * glFrontMaterial.specular), 1.0);
+ vec4 outColor = vec4(vec3( sceneColor +
+ amb * glFrontMaterial.ambient +
+ diff * glFrontMaterial.diffuse), 1.0);
+
+ glFrontColor = outColor;
+ glFrontSecondaryColor = outSecondaryColor;
+ gl_Position = outPosition;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/multitex.frag b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/multitex.frag
new file mode 100644
index 0000000..db24f68
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/multitex.frag
@@ -0,0 +1,67 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+uniform float cloudFactor;
+uniform sampler2D earthTex;
+uniform sampler2D cloudTex;
+
+uniform sampler2D EnvMap;
+
+varying vec2 texCoord0;
+varying vec2 texCoord1;
+
+void main (void)
+{
+ vec2 tc0 = texCoord0.xy;
+ vec2 tc1 = texCoord1.xy;
+
+ vec3 color0 = vec3(texture2D(cloudTex, tc0));
+ vec3 color1 = vec3(texture2D(earthTex, tc1));
+ vec3 finalColor = color0*cloudFactor + color1;
+
+ gl_FragColor = vec4(finalColor, 1.0);
+
+ // if(tc1.x > 0.0)
+ // gl_FragColor = vec4(tc1.y,0.0,0.0,1.0);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/multitex.vert b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/multitex.vert
new file mode 100644
index 0000000..5c25c11
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/multitex.vert
@@ -0,0 +1,68 @@
+// tex coord gen sample from http://www.ogre3d.org/forums/viewtopic.php?f=4&t=59737
+
+
+
+
+// GL2ES2: Java3D built-in attributes, these are calculated and passsed in if declared here
+attribute vec4 glVertex;
+attribute vec3 glNormal;
+
+// GL2ES2: Java3D built-in uniforms, these are calculated and passsed in if declared here
+uniform mat4 glModelViewProjectionMatrix;
+uniform mat4 glModelViewMatrix;
+uniform mat3 glNormalMatrix;
+
+// Per-pixel normal (output to fragment shader)
+varying vec3 Normal;
+
+varying vec2 texCoord0;
+varying vec2 texCoord1;
+
+ //Example 8-4 Sphere Map Texture Coordinate Generation
+ // position is the normalized position coordinate in eye space
+ // normal is the normalized normal coordinate in eye space
+ // returns a vec2 texture coordinate
+vec2 sphere_map(vec3 position, vec3 normal)
+{
+ vec3 reflection = reflect(position, normal);
+ float m = 2.0 * sqrt(reflection.x * reflection.x + reflection.y * reflection.y + (reflection.z + 1.0) * (reflection.z + 1.0));
+ return vec2((reflection.x / m + 0.5), (reflection.y / m + 0.5));
+}
+
+ //Example 8-5 Cube Map Texture Coordinate Generation
+
+ // position is the normalized position coordinate in eye space
+ // normal is the normalized normal coordinate in eye space
+ // returns the reflection vector as a vec3 texture coordinate
+vec3 cube_map(vec3 position, vec3 normal)
+{
+ return reflect(position, normal);
+}
+
+//Object Linear Mapping
+//When the texture generation mode is set to GL_OBJECT_LINEAR, texture coordinates are generated using the following function:
+//coord = P1*X + P2*Y + P3*Z + P4*W
+// The X, Y, Z, and W values are the vertex coordinates from the object being textured, and the P1–P4 values are the coefficients for a plane equation.
+
+//For this shader in my code I have:
+//Vector4f plane0S = new Vector4f(3.0f, 1.5f, 0.3f, 0.0f); //to calc coord S
+//Vector4f plane0T = new Vector4f(1.0f, 2.5f, 0.24f, 0.0f); //to calc coord T
+//I could hand them is as uniforms, but I choose to hard code them
+
+
+vec2 object_linear(vec4 pos, vec4 planeOS, vec4 planeOT)
+{
+ return vec2(pos.x*planeOS.x+pos.y*planeOS.y+pos.z*planeOS.z+ pos.w*planeOS.w,pos.x*planeOT.x+pos.y*planeOT.y+pos.z*planeOT.z+pos.w*planeOT.w);
+}
+
+
+void main()
+{
+ Normal = normalize(vec3(glNormalMatrix * glNormal));
+
+ // Transform the vertex
+ gl_Position = glModelViewProjectionMatrix * glVertex;
+
+ texCoord0 = object_linear(glVertex, vec4(3.0, 1.5, 0.3, 0.0),vec4(1.0, 2.5, 0.24, 0.0));
+ texCoord1 = sphere_map(normalize(vec3(glModelViewMatrix*glVertex)), Normal);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/phong.frag b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/phong.frag
new file mode 100644
index 0000000..7cb6388
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/phong.frag
@@ -0,0 +1,154 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+// A GLSL fragment program for handling 1 directional light with specular.
+// This implements per-pixel lighting (Phong shading)
+
+// GL2ES2: Java3D built-in uniforms, these are calculated and passsed in if declared here
+uniform mat4 glModelViewMatrix;
+
+
+
+uniform vec4 glLightModelambient;
+
+struct material
+{
+ int lightEnabled;
+ vec4 ambient;
+ vec4 diffuse;
+ vec4 emission;
+ vec3 specular;
+ float shininess;
+};
+uniform material glFrontMaterial;
+
+struct lightSource
+{
+ int enabled;
+ vec4 position;
+ vec4 diffuse;
+ vec4 specular;
+ float constantAttenuation, linearAttenuation, quadraticAttenuation;
+ float spotCutoff, spotExponent;
+ vec3 spotDirection;
+};
+
+uniform int numberOfLights;
+const int maxLights = 1;
+uniform lightSource glLightSource[maxLights];
+
+varying vec3 worldPos;
+
+varying vec4 sceneColor;
+
+void directionalLight0(in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec3 specular)
+{
+ // Normalized light direction and half vector
+ vec3 lightDirection = normalize(vec3(glLightSource[0].position));
+
+
+ //GL2ES2: half vector must be calculated
+ //vec3 halfVector = normalize(vec3(gl_LightSource[0].halfVector));
+ //http://stackoverflow.com/questions/3744038/what-is-half-vector-in-modern-glsl
+ vec3 ecPos = vec3(glModelViewMatrix * vec4(worldPos,1.0));
+ vec3 ecL;
+ if( glLightSource[0].position.w == 0.0)
+ ecL = vec3(glLightSource[0].position.xyz);// no -ecPos in case of dir lights?
+ else
+ ecL = vec3(glLightSource[0].position.xyz - ecPos);
+ vec3 L = normalize(ecL.xyz);
+ vec3 V = -ecPos.xyz;
+ vec3 halfVector = normalize(L + V);
+
+
+ float nDotVP; // normal . light_direction
+ float nDotHV; // normal . light_half_vector
+ float pf; // power factor
+
+ nDotVP = max(0.0, dot(normal, lightDirection));
+ nDotHV = max(0.0, dot(normal, halfVector));
+
+ if (nDotVP == 0.0) {
+ pf = 0.0;
+ }
+ else {
+ pf = pow(nDotHV, glFrontMaterial.shininess);
+ }
+
+ // GL2ES2: ambient is part of light model
+ //ambient += gl_LightSource[0].ambient;
+ ambient += glLightModelambient;
+ diffuse += glLightSource[0].diffuse * nDotVP;
+
+ // GL2ES2: specular is part of material
+ //specular += gl_LightSource[0].specular * pf;
+ specular += glFrontMaterial.specular * pf;
+}
+
+
+// Per-pixel normal (input from vertex shader)
+varying vec3 Normal;
+
+void main()
+{
+ vec3 unitNorm = normalize(Normal);
+ vec4 amb = vec4(0.0);
+ vec4 diff = vec4(0.0);
+ vec3 spec = vec3(0.0);
+ int i;
+
+
+ directionalLight0(unitNorm, amb, diff, spec);
+
+
+ // Apply the result of the lighting equation
+ vec4 secondaryColor = vec4(spec * glFrontMaterial.specular, 1.0);
+ // GL2ES2: change to calc'ed sceneColor
+ //vec4 color = vec4(vec3(gl_FrontLightModelProduct.sceneColor +
+ vec4 color = vec4(vec3(sceneColor +
+ amb * glLightModelambient +
+ diff * glFrontMaterial.diffuse), 1.0);
+
+ gl_FragColor = color + secondaryColor;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/phong.vert b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/phong.vert
new file mode 100644
index 0000000..780c2bd
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/phong.vert
@@ -0,0 +1,89 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+// A GLSL vertex program for doing Phone shading (per-fragment lighting)
+
+
+// GL2ES2: Java3D built-in attributes, these are calculated and passsed in if declared here
+attribute vec4 glVertex;
+attribute vec3 glNormal;
+
+// GL2ES2: Java3D built-in uniforms, these are calculated and passsed in if declared here
+uniform mat4 glModelViewProjectionMatrix;
+uniform mat4 glModelViewMatrix;
+uniform mat3 glNormalMatrix;
+
+uniform vec4 glLightModelambient;
+
+struct material
+{
+ int lightEnabled;
+ vec4 ambient;
+ vec4 diffuse;
+ vec4 emission;
+ vec3 specular;
+ float shininess;
+};
+uniform material glFrontMaterial;
+
+// Per-pixel normal (output to fragment shader)
+varying vec3 Normal;
+varying vec3 worldPos;
+
+varying vec4 sceneColor;
+
+
+void main()
+{
+
+ //GL2ES2: sceneColor Derived. Ecm + Acm * Acs (Acs is normal glLightModelambient)
+ sceneColor = glFrontMaterial.emission + glFrontMaterial.ambient * glLightModelambient;
+
+ Normal = normalize(vec3(glNormalMatrix * glNormal));
+
+ worldPos = vec3(glModelViewMatrix * glVertex);
+
+ // Transform the vertex
+ gl_Position = glModelViewProjectionMatrix * glVertex;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/polkadot3d.frag b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/polkadot3d.frag
new file mode 100644
index 0000000..605cb5f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/polkadot3d.frag
@@ -0,0 +1,49 @@
+//
+// Fragment shader for 3 dimensional polka dot shader.
+//
+// Author: Joshua Doss
+//
+// Copyright (C) 2002-2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+varying float LightIntensity;
+varying vec3 MCPosition;
+
+//Create uniform variables so dots can be spaced and scaled by user
+//uniform vec3 Spacing;
+//uniform float DotSize;
+const vec3 Spacing = vec3 (0.314, 0.36, 0.261);
+const float DotSize = 0.123;
+
+//Create colors as uniform variables so they can be easily changed
+//uniform vec3 ModelColor, PolkaDotColor;
+const vec3 ModelColor = vec3 (0.75, 0.2, 0.1);
+const vec3 PolkaDotColor = vec3 (1, 1, 1);
+
+void main(void)
+{
+ float insidesphere, sphereradius, scaledpointlength;
+ vec3 scaledpoint, finalcolor;
+
+ // Scale the coordinate system
+ // The following line of code is not yet implemented in current drivers:
+ // mcpos = mod(Spacing, MCposition);
+ // We will use a workaround found below for now
+ scaledpoint = MCPosition - (Spacing * floor(MCPosition/Spacing));
+
+ // Bring the scaledpoint vector into the center of the scaled coordinate system
+ scaledpoint = scaledpoint - Spacing/2.0;
+
+ // Find the length of the scaledpoint vector and compare it to the dotsize
+ scaledpointlength = length(scaledpoint);
+ insidesphere = step(scaledpointlength,DotSize);
+
+ // Determine final output color before lighting
+ finalcolor = vec3(mix(ModelColor, PolkaDotColor, insidesphere));
+
+ // Output final color and factor in lighting
+ // GL2ES2: gl_FragColor is unchanged
+ gl_FragColor = clamp((vec4( finalcolor, 1.0 ) * LightIntensity), vec4(0.0), vec4(1.0));
+}
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/polkadot3d.vert b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/polkadot3d.vert
new file mode 100644
index 0000000..0422670
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/polkadot3d.vert
@@ -0,0 +1,75 @@
+// This is the Vertex Shader for three dimensional polka dots.
+//
+// author(s): Joshua Doss
+//
+// Copyright (C) 2002-2004 3Dlabs Inc. Ltd.
+
+// GL2ES2: Java3D built-in attributes, these are calculated and passsed in if declared here
+attribute vec4 glVertex;
+attribute vec3 glNormal;
+
+// GL2ES2: Java3D built-in uniforms, these are calculated and passsed in if declared here
+uniform mat4 glModelViewMatrix;
+uniform mat4 glModelViewProjectionMatrix;
+uniform mat3 glNormalMatrix;
+
+//Create uniform variables for lighting to allow user interaction
+//uniform float SpecularContribution;
+//uniform vec3 LightPosition;
+
+const float SpecularContribution = 0.36;
+const vec3 LightPosition = vec3 (0, 4, 5);
+
+varying vec3 MCPosition;
+varying float LightIntensity;
+
+void main(void)
+{
+ float diffusecontribution = 1.0 - SpecularContribution;
+
+ // compute the vertex position in eye coordinates
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ //vec3 ecPosition = vec3(gl_ModelViewMatrix * gl_Vertex);
+ vec3 ecPosition = vec3(glModelViewMatrix * glVertex);
+
+ // compute the transformed normal
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ //vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal);
+ vec3 tnorm = normalize(glNormalMatrix * glNormal);
+
+ // compute a vector from the model to the light position
+ vec3 lightVec = normalize(LightPosition - ecPosition);
+
+ // compute the reflection vector
+ vec3 reflectVec = reflect(-lightVec, tnorm);
+
+ // compute a unit vector in direction of viewing position
+ vec3 viewVec = normalize(-ecPosition);
+
+ // calculate amount of diffuse light based on normal and light angle
+ float diffuse = max(dot(lightVec, tnorm), 0.0);
+ float spec = 0.0;
+
+ // if there is diffuse lighting, calculate specular
+ if(diffuse > 0.0)
+ {
+ spec = max(dot(reflectVec, viewVec), 0.0);
+ spec = pow(spec, 16.0);
+ }
+
+ // add up the light sources, since this is a varying (global) it will pass to frag shader
+ LightIntensity = diffusecontribution * diffuse * 1.5 +
+ SpecularContribution * spec;
+
+ // the varying variable MCPosition will be used by the fragment shader to determine where
+ // in model space the current pixel is
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ //MCPosition = vec3 (gl_Vertex);
+ MCPosition = vec3 (glVertex);
+
+ // send vertex information
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ //gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_Position = glModelViewProjectionMatrix * glVertex;
+}
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/simple.frag b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/simple.frag
new file mode 100644
index 0000000..092a110
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/simple.frag
@@ -0,0 +1,68 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+// Simple GLSL fragment program to attenuate the input fragment color as a
+// function of the distance of the fragment position from the center
+// of the window
+
+//GL2ES2: varying color data needs to be defined
+varying vec4 glFrontColor;
+varying vec4 glFrontSecondaryColor;
+
+//GL2ES2: see particle system point size for mechanism
+const float windowSize = 700.0; // TODO: this should be a built-in parameter!
+
+void main()
+{
+ // Compute distance from center in range [0.0, 1.0]
+ //GL2ES2: gl_FragCoord still exists
+ vec2 dist = min(abs((gl_FragCoord.xy - (windowSize)/2.0) / windowSize), 1.0);
+ vec2 invDist = 1.0 - dist;
+
+ // Compute attenuation
+ float atten = invDist.x * invDist.y;
+ vec4 outcolor = (glFrontColor + glFrontSecondaryColor) * atten;
+
+ gl_FragColor = outcolor;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/simple.vert b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/simple.vert
new file mode 100644
index 0000000..4c5f3c9
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/simple.vert
@@ -0,0 +1,189 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+// A simple GLSL vertex program for handling 2 directional lights with
+// separate specular
+
+// GL2ES2: Java3D built-in attributes, these are calculated and passsed in if declared here
+attribute vec4 glVertex;
+attribute vec3 glNormal;
+attribute vec4 glColor;
+
+// GL2ES2: Java3D built-in uniforms, these are calculated and passsed in if declared here
+uniform mat4 glModelViewMatrix;
+uniform mat4 glModelViewProjectionMatrix;
+uniform mat3 glNormalMatrix;
+
+uniform vec4 glLightModelambient;
+
+
+struct material
+{
+ int lightEnabled;
+ vec4 ambient;
+ vec4 diffuse;
+ vec4 emission;
+ vec3 specular;
+ float shininess;
+};
+uniform material glFrontMaterial;
+
+struct lightSource
+{
+ int enabled;
+ vec4 position;
+ vec4 diffuse;
+ vec4 specular;
+ float constantAttenuation, linearAttenuation, quadraticAttenuation;
+ float spotCutoff, spotExponent;
+ vec3 spotDirection;
+};
+
+uniform int numberOfLights;
+const int maxLights = 1;
+uniform lightSource glLightSource[maxLights];
+
+//GL2ES2: varying color data needs to be defined
+varying vec4 glFrontColor;
+varying vec4 glFrontSecondaryColor;
+
+void directionalLight(
+ in int i,
+ in vec3 normal,
+ inout vec4 ambient,
+ inout vec4 diffuse,
+ inout vec3 specular)
+{
+ // Normalized light direction and half vector
+ // (shouldn't they be pre-normalized?!)
+
+ //GL2ES2 notice not using the i parameter but hard coded to 0
+ vec3 lightDirection = normalize(vec3(glLightSource[0].position));
+
+ //GL2ES2: half vector must be calculated
+ //vec3 halfVector = normalize(vec3(gl_LightSource[0].halfVector));
+ vec3 worldPos = vec3(glModelViewMatrix * glVertex);
+ vec3 L = normalize(glLightSource[0].position.xyz - worldPos);
+ vec3 V = vec3(0,0,1);//eye position
+ vec3 halfVector = (L + V);
+
+
+
+ float nDotVP; // normal . light_direction
+ float nDotHV; // normal . light_half_vector
+ float pf; // power factor
+
+ nDotVP = max(0.0, dot(normal, lightDirection));
+ nDotHV = max(0.0, dot(normal, halfVector));
+
+ if (nDotVP == 0.0) {
+ pf = 0.0;
+ }
+ else {
+ pf = pow(nDotHV, glFrontMaterial.shininess);
+ }
+
+ ambient += glLightModelambient;
+ diffuse += glLightSource[0].diffuse * nDotVP;
+ specular += glFrontMaterial.specular * pf;
+}
+
+//GL2ES2: only a single light for now
+const int numEnabledLights = 1; // TODO: this should be a built-in parameter!
+
+void main()
+{
+ //vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;
+ //vec3 ecPosition3 = ecPosition.xyz / ecPosition.w;
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ //vec3 tnorm = normalize(vec3(gl_NormalMatrix * gl_Normal));
+ vec3 tnorm = normalize(vec3(glNormalMatrix * glNormal));
+ vec4 amb = vec4(0.0);
+ vec4 diff = vec4(0.0);
+ vec3 spec = vec3(0.0);
+ int i;
+
+ // Transform the vertex
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ //vec4 outPosition = gl_ModelViewProjectionMatrix * gl_Vertex;
+ vec4 outPosition = glModelViewProjectionMatrix * glVertex;
+
+ for (i = 0; i < numEnabledLights; i++) {
+ directionalLight(i, tnorm, amb, diff, spec);
+ }
+
+ //GL2ES2: sceneColor Derived. Ecm + Acm * Acs (Acs is normal glLightModelambient)
+ vec4 sceneColor = glFrontMaterial.emission + glFrontMaterial.ambient * glLightModelambient;
+
+ // Apply the result of the lighting equation
+ vec4 outSecondaryColor = vec4(vec3(spec * glFrontMaterial.specular), 1.0);
+ vec3 color0 = vec3(sceneColor +
+ amb * glLightModelambient +
+ diff * glFrontMaterial.diffuse);
+
+ // Generate a pseudo-random noise pattern
+ vec3 xyz = clamp((outPosition.xyz + 1.0) * 0.5, 0.0, 1.0);
+
+ xyz = fract(xyz * 262144.0);
+ float randSeed = fract(3.0 * xyz.x + 5.0 * xyz.y + 7.0 * xyz.z);
+
+ vec3 altColor;
+
+ randSeed = fract(37.0 * randSeed);
+ altColor.x = randSeed * 0.5 + 0.5;
+ randSeed = fract(37.0 * randSeed);
+ altColor.y = randSeed * 0.5 + 0.5;
+ randSeed = fract(37.0 * randSeed);
+ altColor.z = randSeed * 0.5 + 0.5;
+ randSeed = fract(37.0 * randSeed);
+ float altAlpha = randSeed * 0.5;
+
+ // Apply noise and output final vertex color
+ vec4 outColor;
+ outColor = vec4(mix(color0, altColor, altAlpha), 1.0);
+
+ glFrontColor = outColor;
+ glFrontSecondaryColor = outSecondaryColor;
+ gl_Position = outPosition;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/toon.frag b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/toon.frag
new file mode 100644
index 0000000..fa50453
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/toon.frag
@@ -0,0 +1,34 @@
+//
+// Fragment shader for cartoon-style shading
+//
+// Author: Philip Rideout
+//
+// Copyright (c) 2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+//uniform vec3 DiffuseColor;
+//uniform vec3 PhongColor;
+//uniform float Edge;
+//uniform float Phong;
+
+vec3 DiffuseColor = vec3(0.5,0.5,1.0);
+vec3 PhongColor = vec3(0.75,0.75,1.0);
+float Edge = 0.64;
+float Phong = 0.90;
+
+varying vec3 Normal;
+varying vec3 LightDir;
+
+void main (void)
+{
+ vec3 color = DiffuseColor;
+ float f = max( 0.0, dot(LightDir,Normal));
+ if (abs(f) < Edge)
+ color = DiffuseColor * 0.2;
+ if (f > Phong)
+ color = PhongColor;
+
+ gl_FragColor = vec4(color, 1);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/toon.vert b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/toon.vert
new file mode 100644
index 0000000..d044af7
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/toon.vert
@@ -0,0 +1,19 @@
+//
+// Vertex shader for cartoon-style shading
+//
+// Author: Philip Rideout
+//
+// Copyright (c) 2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+varying vec3 Normal;
+varying vec3 LightDir;
+
+void main(void)
+{
+ Normal = normalize(gl_NormalMatrix * gl_Normal);
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ LightDir = vec3(normalize(gl_LightSource[0].position));
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/vertexshader.frag b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/vertexshader.frag
new file mode 100644
index 0000000..029b044
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/vertexshader.frag
@@ -0,0 +1,52 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+
+//GL2ES2: varying color data needs to be defined
+varying vec4 glFrontColor;
+
+void main()
+{
+ gl_FragColor = glFrontColor;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/vertexshader.vert b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/vertexshader.vert
new file mode 100644
index 0000000..12f3662
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/vertexshader.vert
@@ -0,0 +1,70 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+// GL2ES2: Java3D built-in attributes, these are calculated and passsed in if declared here
+attribute vec4 glVertex;
+
+// GL2ES2: Java3D built-in uniforms, these are calculated and passsed in if declared here
+uniform mat4 glModelViewProjectionMatrix;
+
+// A simple GLSL vertex program for demo. vertex attributes
+
+attribute float weight;
+attribute vec3 temperature;
+
+//GL2ES2: varying color data needs to be defined
+varying vec4 glFrontColor;
+
+void main()
+{
+ // Transform the vertex
+ vec4 outPosition = glModelViewProjectionMatrix * glVertex;
+
+ // Compute color from temperature
+ vec4 outColor;
+ outColor = vec4(temperature * weight, 1);
+ // Assign output parameters
+ glFrontColor = outColor;
+ gl_Position = outPosition;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/wood.frag b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/wood.frag
new file mode 100644
index 0000000..6686190
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/wood.frag
@@ -0,0 +1,67 @@
+//
+// Simple fragment shader for wood
+//
+// Author: John Kessenich
+//
+// Copyright (c) 2002-2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+//uniform float GrainSizeRecip;
+//uniform vec3 DarkColor;
+//uniform vec3 spread;
+const float GrainSizeRecip = 1.0;
+const vec3 DarkColor = vec3 (0.6, 0.3, 0.1);
+const vec3 spread = vec3 (0.15, 0.075, 0.0);
+
+varying float lightIntensity;
+varying vec3 Position;
+
+void main (void)
+{
+ //
+ // cheap noise
+ //
+ vec3 location = Position;
+ vec3 floorvec = vec3(floor(10.0 * Position.x), 0.0, floor(10.0 * Position.z));
+ vec3 noise = Position * 10.0 - floorvec - 0.5;
+ noise *= noise;
+ location += noise * 0.12;
+
+ //
+ // distance from axis
+ //
+ float dist = location.x * location.x + location.z * location.z;
+ float grain = dist * GrainSizeRecip;
+
+ //
+ // grain effects as function of distance
+ //
+ float brightness = fract(grain);
+ if (brightness > 0.5)
+ brightness = (1.0 - brightness);
+ vec3 color = DarkColor + brightness * spread;
+
+ brightness = fract(grain * 7.0);
+ if (brightness > 0.5)
+ brightness = 1.0 - brightness;
+ color -= brightness * spread;
+
+ //
+ // also as a function of lines parallel to the axis
+ //
+ brightness = fract(grain * 47.0) * 0.60;
+ float line = fract(Position.z + Position.x);
+ float snap = floor(line * 20.0) * (1.0/20.0);
+ if (line < snap + 0.006)
+ color -= brightness * spread;
+
+ //
+ // apply lighting effects from vertex processor
+ //
+ color = clamp(color * lightIntensity, 0.0, 1.0);
+
+ // GL2ES2: gl_FragColor is unchanged
+ gl_FragColor = vec4(color, 1.0);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/wood.vert b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/wood.vert
new file mode 100644
index 0000000..e04ba6d
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/wood.vert
@@ -0,0 +1,43 @@
+//
+// Simple vertex shader for wood
+//
+// Author: John Kessenich
+//
+// Copyright (c) 2002-2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+// GL2ES2: Java3D built-in attributes, these are calculated and passsed in if declared here
+attribute vec4 glVertex;
+attribute vec3 glNormal;
+
+// GL2ES2: Java3D built-in uniforms, these are calculated and passsed in if declared here
+uniform mat4 glModelViewMatrix;
+uniform mat4 glModelViewProjectionMatrix;
+uniform mat3 glNormalMatrix;
+
+varying float lightIntensity;
+varying vec3 Position;
+//uniform vec3 LightPosition;
+//uniform float Scale;
+const vec3 LightPosition = vec3 (0.0,0.0,0.4);
+const float Scale = 1.0;
+
+void main(void)
+{
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ //vec4 pos = glModelViewMatrix * glVertex;
+ vec4 pos = glModelViewMatrix * glVertex;
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ //Position = vec3(glVertex) * Scale;
+ Position = vec3(glVertex) * Scale;
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ //vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal);
+ vec3 tnorm = normalize(glNormalMatrix * glNormal);
+ lightIntensity = max(dot(normalize(LightPosition - vec3(pos)), tnorm), 0.0) * 1.5;
+
+ // GL2ES2: swap built-in variable for Java3d built-in uniforms and attributes gl_* = gl* + declaration (at top)
+ //gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_Position = glModelViewProjectionMatrix * glVertex;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/EnvironmentMappingGLSL.form b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/EnvironmentMappingGLSL.form
new file mode 100644
index 0000000..b6a3e94
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/EnvironmentMappingGLSL.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="EnvironmentMappingGLSL"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/EnvironmentMappingGLSL.java b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/EnvironmentMappingGLSL.java
new file mode 100644
index 0000000..ff5e9cd
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/EnvironmentMappingGLSL.java
@@ -0,0 +1,261 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.glsl_shader;
+
+import java.awt.GraphicsConfiguration;
+import java.io.IOException;
+import java.net.URL;
+
+import javax.swing.JOptionPane;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderAttribute;
+import org.jogamp.java3d.ShaderAttributeSet;
+import org.jogamp.java3d.ShaderAttributeValue;
+import org.jogamp.java3d.ShaderError;
+import org.jogamp.java3d.ShaderErrorListener;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.TextureUnitState;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+
+public class EnvironmentMappingGLSL extends javax.swing.JFrame {
+
+ private URL textureURL = null;
+ private static final int NUM_TEX_UNITS = 1;
+ private static final int TEX_UNIT = 0;
+
+ SimpleUniverse univ = null;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create the TransformGroup node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at run time. Add it to
+ // the root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // Create texture object
+ textureURL = Resources.getResource("resources/images/duke-gears.jpg");
+ Texture tex = new TextureLoader(textureURL, this).getTexture();
+ // Create the shader program
+ String vertexProgram = null;
+ String fragmentProgram = null;
+ try {
+ vertexProgram = StringIO.readFully(Resources.getResource("glsl_shader/envmap.vert"));
+ fragmentProgram = StringIO.readFully(Resources.getResource("glsl_shader/envmap.frag"));
+ }
+ catch (IOException e) {
+ System.err.println(e);
+ }
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL,
+ Shader.SHADER_TYPE_VERTEX,
+ vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL,
+ Shader.SHADER_TYPE_FRAGMENT,
+ fragmentProgram);
+ final String[] shaderAttrNames = {
+ "LightPos",
+ "BaseColor",
+ "MixRatio",
+ "EnvMap",
+ };
+ final Object[] shaderAttrValues = {
+ new Point3f(1.0f, -1.0f, 2.0f),
+ new Color3f(0.2f, 0.9f, 0.5f),
+ new Float(0.4f),
+ new Integer(TEX_UNIT),
+ };
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+ shaderProgram.setShaders(shaders);
+ shaderProgram.setShaderAttrNames(shaderAttrNames);
+
+ // Create the shader attribute set
+ ShaderAttributeSet shaderAttributeSet = new ShaderAttributeSet();
+ for (int i = 0; i < shaderAttrNames.length; i++) {
+ ShaderAttribute shaderAttribute =
+ new ShaderAttributeValue(shaderAttrNames[i], shaderAttrValues[i]);
+ shaderAttributeSet.put(shaderAttribute);
+ }
+
+ // Create shader appearance to hold the shader program and
+ // shader attributes
+ ShaderAppearance app = new ShaderAppearance();
+ app.setShaderProgram(shaderProgram);
+ app.setShaderAttributeSet(shaderAttributeSet);
+
+ // Put the texture in specified texture unit
+ TextureUnitState[] tus = new TextureUnitState[NUM_TEX_UNITS];
+ tus[TEX_UNIT] = new TextureUnitState();
+ tus[TEX_UNIT].setTexture(tex);
+ app.setTextureUnitState(tus);
+
+ // Create a Sphere object using the shader appearance,
+ // and add it into the scene graph.
+ Sphere sph = new Sphere(0.4f, Sphere.GENERATE_NORMALS, 20, app);
+ objTrans.addChild(sph);
+
+ // Create a new Behavior object that will perform the
+ // desired operation on the specified transform and add
+ // it into the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, 4000);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ rotator.setSchedulingBounds(bounds);
+ objRoot.addChild(rotator);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ //objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Canvas3D initScene() {
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+
+ BranchGroup scene = createSceneGraph();
+ univ = new SimpleUniverse(c);
+
+ // Add a ShaderErrorListener
+ univ.addShaderErrorListener(new ShaderErrorListener() {
+ public void errorOccurred(ShaderError error) {
+ error.printVerbose();
+ JOptionPane.showMessageDialog(EnvironmentMappingGLSL.this,
+ error.toString(),
+ "ShaderError",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ });
+
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ univ.addBranchGraph(scene);
+
+ return c;
+ }
+
+ /**
+ * Creates new form EnvironmentMappingGLSL
+ */
+ public EnvironmentMappingGLSL() {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create the scene and add the Canvas3D to the drawing panel
+ Canvas3D c = initScene();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("EnvironmentMappingGLSL");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new EnvironmentMappingGLSL().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/ObjLoadGLSL.form b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/ObjLoadGLSL.form
new file mode 100644
index 0000000..343b6d5
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/ObjLoadGLSL.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="ObjLoadGLSL"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/ObjLoadGLSL.java b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/ObjLoadGLSL.java
new file mode 100644
index 0000000..2feb50a
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/ObjLoadGLSL.java
@@ -0,0 +1,404 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.glsl_shader;
+
+import java.awt.GraphicsConfiguration;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Enumeration;
+
+import javax.swing.JOptionPane;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Node;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderError;
+import org.jogamp.java3d.ShaderErrorListener;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.loaders.IncorrectFormatException;
+import org.jogamp.java3d.loaders.ParsingErrorException;
+import org.jogamp.java3d.loaders.Scene;
+import org.jogamp.java3d.loaders.objectfile.ObjectFile;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.PlatformGeometry;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * Simple Java 3D example program to display an .obj object with shader programs.
+ */
+public class ObjLoadGLSL extends javax.swing.JFrame {
+
+ private String shaderName = "polkadot3d";
+ private boolean spin = false;
+ private boolean noTriangulate = false;
+ private boolean noStripify = false;
+ private double creaseAngle = 60.0;
+ private URL filename = null;
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.7);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ objScale.addChild(objTrans);
+
+ int flags = ObjectFile.RESIZE;
+ if (!noTriangulate) flags |= ObjectFile.TRIANGULATE;
+ if (!noStripify) flags |= ObjectFile.STRIPIFY;
+ ObjectFile f = new ObjectFile(flags,
+ (float)(creaseAngle * Math.PI / 180.0));
+ Scene s = null;
+ try {
+ s = f.load(filename);
+ }
+ catch (FileNotFoundException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+ catch (ParsingErrorException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+ catch (IncorrectFormatException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+
+ // Set vertex and fragment shader program for all Shape3D nodes in scene
+ String vertexProgram = null;
+ String fragmentProgram = null;
+ try {
+ vertexProgram = StringIO.readFully(Resources.getResource("glsl_shader/" + shaderName + ".vert"));
+ fragmentProgram = StringIO.readFully(Resources.getResource("glsl_shader/" + shaderName + ".frag"));
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL,
+ Shader.SHADER_TYPE_VERTEX,
+ vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL,
+ Shader.SHADER_TYPE_FRAGMENT,
+ fragmentProgram);
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+ shaderProgram.setShaders(shaders);
+ setShaderProgram(s.getSceneGroup(), shaderProgram);
+
+ objTrans.addChild(s.getSceneGroup());
+
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ if (spin) {
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+ }
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
+ Background bgNode = new Background(bgColor);
+ bgNode.setApplicationBounds(bounds);
+ objRoot.addChild(bgNode);
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D canvas3d = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(canvas3d);
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Add a ShaderErrorListener
+ univ.addShaderErrorListener(new ShaderErrorListener() {
+ public void errorOccurred(ShaderError error) {
+ error.printVerbose();
+ JOptionPane.showMessageDialog(ObjLoadGLSL.this,
+ error.toString(),
+ "ShaderError",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ });
+
+ // add mouse behaviors to the ViewingPlatform
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+
+ PlatformGeometry pg = new PlatformGeometry();
+
+ // Set up the ambient light
+ Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
+ AmbientLight ambientLightNode = new AmbientLight(ambientColor);
+ ambientLightNode.setInfluencingBounds(bounds);
+ pg.addChild(ambientLightNode);
+
+ // Set up the directional lights
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);
+ Color3f light2Color = new Color3f(1.0f, 1.0f, 1.0f);
+ Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
+
+ DirectionalLight light1
+ = new DirectionalLight(light1Color, light1Direction);
+ light1.setInfluencingBounds(bounds);
+ pg.addChild(light1);
+
+ DirectionalLight light2
+ = new DirectionalLight(light2Color, light2Direction);
+ light2.setInfluencingBounds(bounds);
+ pg.addChild(light2);
+
+ viewingPlatform.setPlatformGeometry( pg );
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ if (!spin) {
+ OrbitBehavior orbit = new OrbitBehavior(canvas3d,
+ OrbitBehavior.REVERSE_ALL);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+ }
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return canvas3d;
+ }
+
+ private void usage() {
+ System.out.println("Usage: java ObjLoadGLSL [-s] [-S shaderName] [-n] [-t] [-c degrees] <.obj file>");
+ System.out.println(" -s Spin (no user interaction)");
+ System.out.println(" -S Set shader name (default is 'simple')");
+ System.out.println(" -n No triangulation");
+ System.out.println(" -t No stripification");
+ System.out.println(
+ " -c Set crease angle for normal generation (default is 60 without");
+ System.out.println(
+ " smoothing group info, otherwise 180 within smoothing groups)");
+ System.exit(0);
+ } // End of usage
+
+ // Set shader program for all nodes in specified branch graph
+ private void setShaderProgram(BranchGroup g, ShaderProgram shaderProgram) {
+ ShaderAppearance myApp = new ShaderAppearance();
+ Material mat = new Material();
+ myApp.setShaderProgram(shaderProgram);
+ myApp.setMaterial(mat);
+ setShaderProgram(g, myApp);
+ }
+
+ // Recursively set shader program for all children of specified group
+ private void setShaderProgram(Group g,
+ ShaderAppearance myApp) {
+
+ Enumeration e = g.getAllChildren();
+ while (e.hasMoreElements()) {
+ Node n = (Node)(e.nextElement());
+ if (n instanceof Group) {
+ setShaderProgram((Group)n, myApp);
+ }
+ else if (n instanceof Shape3D) {
+ Shape3D s = (Shape3D)n;
+ s.setAppearance(myApp);
+ }
+ }
+ }
+
+ /**
+ * Creates new form ObjLoadGLSL
+ */
+ public ObjLoadGLSL(String args[]) {
+ if (args.length != 0) {
+ for (int i = 0 ; i < args.length ; i++) {
+ if (args[i].startsWith("-")) {
+ if (args[i].equals("-s")) {
+ spin = true;
+ } else if (args[i].equals("-n")) {
+ noTriangulate = true;
+ } else if (args[i].equals("-t")) {
+ noStripify = true;
+ } else if (args[i].equals("-c")) {
+ if (i < args.length - 1) {
+ creaseAngle = (new Double(args[++i])).doubleValue();
+ } else usage();
+ } else if (args[i].equals("-S")) {
+ if (i < args.length - 1) {
+ shaderName = args[++i];
+ } else usage();
+ } else {
+ usage();
+ }
+ } else {
+ try {
+ if ((args[i].indexOf("file:") == 0) ||
+ (args[i].indexOf("http") == 0)) {
+ filename = new URL(args[i]);
+ } else if (args[i].charAt(0) != '/') {
+ filename = new URL("file:./" + args[i]);
+ } else {
+ filename = new URL("file:" + args[i]);
+ }
+ } catch (MalformedURLException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+ }
+ }
+ }
+
+ if (filename == null) {
+ filename = Resources.getResource("resources/geometry/galleon.obj");
+ if (filename == null) {
+ System.err.println("resources/geometry/galleon.obj not found");
+ System.exit(1);
+ }
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("ObjLoadGLSL");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[]) {
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ ObjLoadGLSL objLoadGLSL = new ObjLoadGLSL(args);
+ objLoadGLSL.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/PhongShadingGLSL.form b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/PhongShadingGLSL.form
new file mode 100644
index 0000000..dcccf73
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/PhongShadingGLSL.form
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <NonVisualComponents>
+ <Component class="javax.swing.ButtonGroup" name="shaderButtonGroup">
+ </Component>
+ <Menu class="javax.swing.JMenuBar" name="jMenuBar1">
+ <SubComponents>
+ <Menu class="javax.swing.JMenu" name="fileMenu">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="File"/>
+ </Properties>
+ <SubComponents>
+ <MenuItem class="javax.swing.JMenuItem" name="exitMenuItem">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Exit"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="exitMenuItemActionPerformed"/>
+ </Events>
+ </MenuItem>
+ </SubComponents>
+ </Menu>
+ </SubComponents>
+ </Menu>
+ </NonVisualComponents>
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="Phong Shading Test"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="menuBar" type="java.lang.String" value="jMenuBar1"/>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="guiPanel">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="North"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="jPanel1">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="Shader"/>
+ </Border>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="4" insetsLeft="4" insetsBottom="4" insetsRight="4" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JRadioButton" name="gouraudButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="shaderButtonGroup"/>
+ </Property>
+ <Property name="selected" type="boolean" value="true"/>
+ <Property name="text" type="java.lang.String" value="Per-Vertex Lighting (Gouraud)"/>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="0" left="0" right="0" top="0"/>
+ </Border>
+ </Property>
+ <Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
+ <Insets value="[0, 0, 0, 0]"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="gouraudButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="2" insetsBottom="2" insetsRight="2" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JRadioButton" name="phongButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="shaderButtonGroup"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Per-Pixel Lighting (Phong)"/>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="0" left="0" right="0" top="0"/>
+ </Border>
+ </Property>
+ <Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
+ <Insets value="[0, 0, 0, 0]"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="phongButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="2" insetsBottom="2" insetsRight="2" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/PhongShadingGLSL.java b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/PhongShadingGLSL.java
new file mode 100644
index 0000000..45b4b94
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/PhongShadingGLSL.java
@@ -0,0 +1,492 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.glsl_shader;
+
+import java.awt.GraphicsConfiguration;
+import java.io.IOException;
+
+import javax.swing.JOptionPane;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.Light;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointLight;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderError;
+import org.jogamp.java3d.ShaderErrorListener;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.SpotLight;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ *
+ * @author kcr
+ */
+public class PhongShadingGLSL extends javax.swing.JFrame {
+
+ // Constants for type of light to use
+ private static final int DIRECTIONAL_LIGHT = 0;
+ private static final int POINT_LIGHT = 1;
+ private static final int SPOT_LIGHT = 2;
+
+ // Flag indicates type of lights: directional, point, or spot lights.
+ private static int lightType = DIRECTIONAL_LIGHT;
+
+ private SimpleUniverse univ = null;
+
+ private ShaderAppearance sApp = null;
+ private ShaderProgram gouraudSP = null;
+ private ShaderProgram phongSP = null;
+
+ public BranchGroup createSceneGraph() {
+ Color3f eColor = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f sColor = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f objColor = new Color3f(0.6f, 0.6f, 0.6f);
+// Color3f lColor1 = new Color3f(1.0f, 0.0f, 0.0f);
+// Color3f lColor2 = new Color3f(0.0f, 1.0f, 0.0f);
+ Color3f lColor1 = new Color3f(1.0f, 1.0f, 0.5f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+
+ Transform3D t;
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.5);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the background
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objRoot.addChild(bg);
+
+ // Create the TransformGroup node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at run time. Add it to
+ // the root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(objTrans);
+
+ // Create a Sphere object, generate one copy of the sphere,
+ // and add it into the scene graph.
+ sApp = new ShaderAppearance();
+ sApp.setCapability(ShaderAppearance.ALLOW_SHADER_PROGRAM_WRITE);
+ Material m = new Material(objColor, eColor, objColor, sColor, 100.0f);
+ sApp.setMaterial(m);
+
+ // Create Gouraud and Phong shader programs
+ String vertexProgram = null;
+ String fragmentProgram = null;
+ Shader[] shaders = new Shader[2];
+ String[] attrNames = { "numLights" };
+
+ try {
+ vertexProgram = StringIO.readFully(Resources.getResource("glsl_shader/gouraud.vert"));
+ fragmentProgram = StringIO.readFully(Resources.getResource("glsl_shader/gouraud.frag"));
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL,
+ Shader.SHADER_TYPE_VERTEX,
+ vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL,
+ Shader.SHADER_TYPE_FRAGMENT,
+ fragmentProgram);
+ gouraudSP = new GLSLShaderProgram();
+ gouraudSP.setShaders(shaders);
+
+ try {
+ vertexProgram = StringIO.readFully(Resources.getResource("glsl_shader/phong.vert"));
+ fragmentProgram = StringIO.readFully(Resources.getResource("glsl_shader/phong.frag"));
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL,
+ Shader.SHADER_TYPE_VERTEX,
+ vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL,
+ Shader.SHADER_TYPE_FRAGMENT,
+ fragmentProgram);
+ phongSP = new GLSLShaderProgram();
+ phongSP.setShaders(shaders);
+
+ if (gouraudButton.isSelected()) {
+ sApp.setShaderProgram(gouraudSP);
+ } else if (phongButton.isSelected()) {
+ sApp.setShaderProgram(phongSP);
+ }
+ Sphere sph = new Sphere(1.0f, Sphere.GENERATE_NORMALS, 30, sApp);
+ objTrans.addChild(sph);
+
+ // Create a new Behavior object that will perform the
+ // desired operation on the specified transform and add
+ // it into the scene graph.
+ Transform3D yAxis = new Transform3D();
+ yAxis.rotZ(Math.PI);
+ Alpha rotationAlpha = new Alpha(-1, 10000);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator.setSchedulingBounds(bounds);
+ objRoot.addChild(rotator);
+
+ // Create the transform group node for the each light and initialize
+ // it to the identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add them to the root
+ // of the subgraph.
+ TransformGroup l1RotTrans = new TransformGroup();
+ l1RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l1RotTrans);
+
+ TransformGroup l2RotTrans = new TransformGroup();
+ l2RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l2RotTrans);
+
+ // Create transformations for the positional lights
+ t = new Transform3D();
+ Vector3d lPos1 = new Vector3d(0.0, 0.0, 2.0);
+ t.set(lPos1);
+ TransformGroup l1Trans = new TransformGroup(t);
+ l1RotTrans.addChild(l1Trans);
+
+// t = new Transform3D();
+// Vector3d lPos2 = new Vector3d(0.5, 0.8, 2.0);
+// t.set(lPos2);
+// TransformGroup l2Trans = new TransformGroup(t);
+// l2RotTrans.addChild(l2Trans);
+
+ // Create Geometry for point lights
+ ColoringAttributes caL1 = new ColoringAttributes();
+// ColoringAttributes caL2 = new ColoringAttributes();
+ caL1.setColor(lColor1);
+// caL2.setColor(lColor2);
+ Appearance appL1 = new Appearance();
+// Appearance appL2 = new Appearance();
+ appL1.setColoringAttributes(caL1);
+// appL2.setColoringAttributes(caL2);
+ l1Trans.addChild(new Sphere(0.05f, appL1));
+// l2Trans.addChild(new Sphere(0.05f, appL2));
+
+ // Create lights
+ AmbientLight aLgt = new AmbientLight(alColor);
+
+ Light lgt1 = null;
+// Light lgt2 = null;
+
+ Point3f lPoint = new Point3f(0.0f, 0.0f, 0.0f);
+ Point3f atten = new Point3f(1.0f, 0.0f, 0.0f);
+ Vector3f lDirect1 = new Vector3f(lPos1);
+// Vector3f lDirect2 = new Vector3f(lPos2);
+ lDirect1.negate();
+// lDirect2.negate();
+
+ switch (lightType) {
+ case DIRECTIONAL_LIGHT:
+ lgt1 = new DirectionalLight(lColor1, lDirect1);
+// lgt2 = new DirectionalLight(lColor2, lDirect2);
+ break;
+ case POINT_LIGHT:
+ assert false : "can't get here";
+ lgt1 = new PointLight(lColor1, lPoint, atten);
+// lgt2 = new PointLight(lColor2, lPoint, atten);
+ break;
+ case SPOT_LIGHT:
+ assert false : "can't get here";
+ lgt1 = new SpotLight(lColor1, lPoint, atten, lDirect1,
+ 25.0f * (float)Math.PI / 180.0f, 10.0f);
+// lgt2 = new SpotLight(lColor2, lPoint, atten, lDirect2,
+// 25.0f * (float)Math.PI / 180.0f, 10.0f);
+ break;
+ }
+
+ // Set the influencing bounds
+ aLgt.setInfluencingBounds(bounds);
+ lgt1.setInfluencingBounds(bounds);
+// lgt2.setInfluencingBounds(bounds);
+
+ // Add the lights into the scene graph
+ objScale.addChild(aLgt);
+ l1Trans.addChild(lgt1);
+// l2Trans.addChild(lgt2);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ yAxis = new Transform3D();
+ Alpha rotor1Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+ RotationInterpolator rotator1 =
+ new RotationInterpolator(rotor1Alpha,
+ l1RotTrans,
+ yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator1.setSchedulingBounds(bounds);
+ l1RotTrans.addChild(rotator1);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Alpha rotor2Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 1000, 0, 0,
+ 0, 0, 0);
+ RotationInterpolator rotator2 =
+ new RotationInterpolator(rotor2Alpha,
+ l2RotTrans,
+ yAxis,
+ 0.0f, 0.0f);
+ bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ rotator2.setSchedulingBounds(bounds);
+ l2RotTrans.addChild(rotator2);
+
+ return objRoot;
+ }
+
+ private Canvas3D initScene() {
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+
+ univ = new SimpleUniverse(c);
+
+ // Add a ShaderErrorListener
+ univ.addShaderErrorListener(new ShaderErrorListener() {
+ public void errorOccurred(ShaderError error) {
+ error.printVerbose();
+ JOptionPane.showMessageDialog(PhongShadingGLSL.this,
+ error.toString(),
+ "ShaderError",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ });
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ BranchGroup scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+
+ return c;
+ }
+
+ /**
+ * Creates new form PhongShadingGLSL
+ */
+ public PhongShadingGLSL() {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create the scene and add the Canvas3D to the drawing panel
+ Canvas3D c = initScene();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+ }
+
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ shaderButtonGroup = new javax.swing.ButtonGroup();
+ guiPanel = new javax.swing.JPanel();
+ jPanel1 = new javax.swing.JPanel();
+ gouraudButton = new javax.swing.JRadioButton();
+ phongButton = new javax.swing.JRadioButton();
+ drawingPanel = new javax.swing.JPanel();
+ jMenuBar1 = new javax.swing.JMenuBar();
+ fileMenu = new javax.swing.JMenu();
+ exitMenuItem = new javax.swing.JMenuItem();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("Phong Shading Test");
+ guiPanel.setLayout(new java.awt.GridBagLayout());
+
+ jPanel1.setLayout(new java.awt.GridBagLayout());
+
+ jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Shader"));
+ shaderButtonGroup.add(gouraudButton);
+ gouraudButton.setSelected(true);
+ gouraudButton.setText("Per-Vertex Lighting (Gouraud)");
+ gouraudButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ gouraudButton.setMargin(new java.awt.Insets(0, 0, 0, 0));
+ gouraudButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ gouraudButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
+ jPanel1.add(gouraudButton, gridBagConstraints);
+
+ shaderButtonGroup.add(phongButton);
+ phongButton.setText("Per-Pixel Lighting (Phong)");
+ phongButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ phongButton.setMargin(new java.awt.Insets(0, 0, 0, 0));
+ phongButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ phongButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
+ jPanel1.add(phongButton, gridBagConstraints);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
+ guiPanel.add(jPanel1, gridBagConstraints);
+
+ getContentPane().add(guiPanel, java.awt.BorderLayout.NORTH);
+
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ fileMenu.setText("File");
+ exitMenuItem.setText("Exit");
+ exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ exitMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(exitMenuItem);
+
+ jMenuBar1.add(fileMenu);
+
+ setJMenuBar(jMenuBar1);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ private void phongButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_phongButtonActionPerformed
+ sApp.setShaderProgram(phongSP);
+ }//GEN-LAST:event_phongButtonActionPerformed
+
+ private void gouraudButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_gouraudButtonActionPerformed
+ sApp.setShaderProgram(gouraudSP);
+ }//GEN-LAST:event_gouraudButtonActionPerformed
+
+ private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
+ System.exit(0);
+ }//GEN-LAST:event_exitMenuItemActionPerformed
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new PhongShadingGLSL().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ private javax.swing.JMenuItem exitMenuItem;
+ private javax.swing.JMenu fileMenu;
+ private javax.swing.JRadioButton gouraudButton;
+ private javax.swing.JPanel guiPanel;
+ private javax.swing.JMenuBar jMenuBar1;
+ private javax.swing.JPanel jPanel1;
+ private javax.swing.JRadioButton phongButton;
+ private javax.swing.ButtonGroup shaderButtonGroup;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/SamplerTestGLSL.form b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/SamplerTestGLSL.form
new file mode 100644
index 0000000..6a1a031
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/SamplerTestGLSL.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="SamplerTestGLSL"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/SamplerTestGLSL.java b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/SamplerTestGLSL.java
new file mode 100644
index 0000000..d2c3265
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/SamplerTestGLSL.java
@@ -0,0 +1,278 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.glsl_shader;
+
+import java.awt.GraphicsConfiguration;
+import java.io.IOException;
+import java.net.URL;
+
+import javax.swing.JOptionPane;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderAttribute;
+import org.jogamp.java3d.ShaderAttributeSet;
+import org.jogamp.java3d.ShaderAttributeValue;
+import org.jogamp.java3d.ShaderError;
+import org.jogamp.java3d.ShaderErrorListener;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.TexCoordGeneration;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.TextureUnitState;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector4f;
+
+public class SamplerTestGLSL extends javax.swing.JFrame {
+
+ private static String cloudTexName = "resources/images/bg.jpg";
+ private static String earthTexName = "resources/images/earth.jpg";
+ private static String fragmentProgName = "glsl_shader/multitex.frag";
+ private URL cloudURL = null;
+ private URL earthURL = null;
+ private static final int CLOUD = 0;
+ private static final int EARTH = 1;
+
+ SimpleUniverse univ = null;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create the TransformGroup node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at run time. Add it to
+ // the root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // Create texture objects
+ cloudURL = Resources.getResource(cloudTexName);
+ Texture cloudTex = new TextureLoader(cloudURL, this).getTexture();
+ earthURL = Resources.getResource(earthTexName);
+ Texture earthTex = new TextureLoader(earthURL, this).getTexture();
+
+ // Create the shader program
+ String vertexProgram = null;
+ String fragmentProgram = null;
+ try {
+ fragmentProgram = StringIO.readFully(Resources.getResource(fragmentProgName));
+ }
+ catch (IOException e) {
+ System.err.println(e);
+ }
+ Shader[] shaders = new Shader[1];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL,
+ Shader.SHADER_TYPE_FRAGMENT,
+ fragmentProgram);
+ final String[] shaderAttrNames = {
+ "cloudFactor",
+ "cloudTex",
+ "earthTex",
+ };
+ final Object[] shaderAttrValues = {
+ new Float(0.6f),
+ new Integer(0),
+ new Integer(1),
+ };
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+ shaderProgram.setShaders(shaders);
+ shaderProgram.setShaderAttrNames(shaderAttrNames);
+
+ // Create the shader attribute set
+ ShaderAttributeSet shaderAttributeSet = new ShaderAttributeSet();
+ for (int i = 0; i < shaderAttrNames.length; i++) {
+ ShaderAttribute shaderAttribute =
+ new ShaderAttributeValue(shaderAttrNames[i], shaderAttrValues[i]);
+ shaderAttributeSet.put(shaderAttribute);
+ }
+
+ // Create shader appearance to hold the shader program and
+ // shader attributes
+ ShaderAppearance app = new ShaderAppearance();
+ app.setShaderProgram(shaderProgram);
+ app.setShaderAttributeSet(shaderAttributeSet);
+
+ // Setup texture coordinate generation
+ Vector4f plane0S = new Vector4f(3.0f, 1.5f, 0.3f, 0.0f);
+ Vector4f plane0T = new Vector4f(1.0f, 2.5f, 0.24f, 0.0f);
+ TexCoordGeneration tcg0 =
+ new TexCoordGeneration(TexCoordGeneration.OBJECT_LINEAR,
+ TexCoordGeneration.TEXTURE_COORDINATE_2, plane0S, plane0T);
+
+ // Setup texture coordinate generation
+ TexCoordGeneration tcg1 =
+ new TexCoordGeneration(TexCoordGeneration.SPHERE_MAP,
+ TexCoordGeneration.TEXTURE_COORDINATE_2);
+
+ // Put the textures in unit 0,1
+ TextureUnitState[] tus = new TextureUnitState[2];
+ tus[CLOUD] = new TextureUnitState();
+ tus[CLOUD].setTexture(cloudTex);
+ tus[CLOUD].setTexCoordGeneration(tcg0);
+ tus[EARTH] = new TextureUnitState();
+ tus[EARTH].setTexture(earthTex);
+ tus[EARTH].setTexCoordGeneration(tcg1);
+ app.setTextureUnitState(tus);
+
+ // Create a Sphere object using the shader appearance,
+ // and add it into the scene graph.
+ Sphere sph = new Sphere(0.4f, Sphere.GENERATE_NORMALS, 30, app);
+ objTrans.addChild(sph);
+
+ // Create a new Behavior object that will perform the
+ // desired operation on the specified transform and add
+ // it into the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, 4000);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ rotator.setSchedulingBounds(bounds);
+ objRoot.addChild(rotator);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ //objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Canvas3D initScene() {
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+
+ BranchGroup scene = createSceneGraph();
+ univ = new SimpleUniverse(c);
+
+ // Add a ShaderErrorListener
+ univ.addShaderErrorListener(new ShaderErrorListener() {
+ public void errorOccurred(ShaderError error) {
+ error.printVerbose();
+ JOptionPane.showMessageDialog(SamplerTestGLSL.this,
+ error.toString(),
+ "ShaderError",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ });
+
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ univ.addBranchGraph(scene);
+
+ return c;
+ }
+
+ /**
+ * Creates new form SamplerTestGLSL
+ */
+ public SamplerTestGLSL() {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create the scene and add the Canvas3D to the drawing panel
+ Canvas3D c = initScene();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("SamplerTestGLSL");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new SamplerTestGLSL().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/ShaderTestGLSL.form b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/ShaderTestGLSL.form
new file mode 100644
index 0000000..714273d
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/ShaderTestGLSL.form
@@ -0,0 +1,266 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.2" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <NonVisualComponents>
+ <Component class="javax.swing.ButtonGroup" name="densityButtonGroup">
+ </Component>
+ <Component class="javax.swing.ButtonGroup" name="colorButtonGroup">
+ </Component>
+ <Component class="javax.swing.ButtonGroup" name="sceneGraphButtonGroup">
+ </Component>
+ <Menu class="javax.swing.JMenuBar" name="jMenuBar1">
+ <SubComponents>
+ <Menu class="javax.swing.JMenu" name="fileMenu">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="File"/>
+ </Properties>
+ <SubComponents>
+ <MenuItem class="javax.swing.JMenuItem" name="exitMenuItem">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Exit"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="exitMenuItemActionPerformed"/>
+ </Events>
+ </MenuItem>
+ </SubComponents>
+ </Menu>
+ </SubComponents>
+ </Menu>
+ </NonVisualComponents>
+ <Properties>
+ <Property name="title" type="java.lang.String" value="Window Title"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="menuBar" type="java.lang.String" value="jMenuBar1"/>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <Events>
+ <EventHandler event="windowClosing" listener="java.awt.event.WindowListener" parameters="java.awt.event.WindowEvent" handler="exitForm"/>
+ </Events>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,-85,0,0,2,0"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="mainPanel">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="guiPanel">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.LineBorderInfo">
+ <LineBorder/>
+ </Border>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="North"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="densityPanel">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="Density"/>
+ </Border>
+ </Property>
+ </Properties>
+ <AccessibilityProperties>
+ <Property name="AccessibleContext.accessibleName" type="java.lang.String" value="ShaderAttributeValue &#xa;"/>
+ </AccessibilityProperties>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JRadioButton" name="zeroButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="densityButtonGroup"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Zero"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zeroButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JRadioButton" name="halfButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="densityButtonGroup"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Half"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="halfButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JRadioButton" name="fullButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="densityButtonGroup"/>
+ </Property>
+ <Property name="selected" type="boolean" value="true"/>
+ <Property name="text" type="java.lang.String" value="Full"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fullButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="colorPanel">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="Color"/>
+ </Border>
+ </Property>
+ </Properties>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JRadioButton" name="goldButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="colorButtonGroup"/>
+ </Property>
+ <Property name="selected" type="boolean" value="true"/>
+ <Property name="text" type="java.lang.String" value="Gold"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="goldButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JRadioButton" name="silverButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="colorButtonGroup"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Silver"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="silverButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="sceneGraphPanel">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="Scene Graph"/>
+ </Border>
+ </Property>
+ </Properties>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JToggleButton" name="DetachButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="sceneGraphButtonGroup"/>
+ </Property>
+ <Property name="selected" type="boolean" value="true"/>
+ <Property name="text" type="java.lang.String" value="Detach"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="DetachButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JToggleButton" name="AttachButton">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="sceneGraphButtonGroup"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Create"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="AttachButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JButton" name="replaceSPButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Replace Shader"/>
+ <Property name="enabled" type="boolean" value="false"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="replaceSPButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/ShaderTestGLSL.java b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/ShaderTestGLSL.java
new file mode 100644
index 0000000..f7f82e9
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/ShaderTestGLSL.java
@@ -0,0 +1,707 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.glsl_shader;
+
+import java.awt.GraphicsConfiguration;
+import java.io.IOException;
+
+import javax.swing.JOptionPane;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PositionInterpolator;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderAttributeObject;
+import org.jogamp.java3d.ShaderAttributeSet;
+import org.jogamp.java3d.ShaderAttributeValue;
+import org.jogamp.java3d.ShaderError;
+import org.jogamp.java3d.ShaderErrorListener;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.View;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+
+public class ShaderTestGLSL extends javax.swing.JFrame {
+
+ static final int GOLD = 1;
+ static final int SILVER = 2;
+
+ static final int DIMPLE_SHADER = 1;
+ static final int BRICK_SHADER = 2;
+ static final int WOOD_SHADER = 3;
+ static final int POLKADOT3D_SHADER = 4;
+
+ static final String[] shaderAttrNames1 = {
+ "Density", "Size", "LightPosition", "Color"
+ };
+
+ static final String[] shaderAttrNames2 = {
+ "BrickColor", "LightPosition"
+ };
+
+ private SimpleUniverse univ = null;
+ private View view;
+ private BranchGroup transpObj;
+ private BranchGroup scene = null;
+ private int shaderSelected = DIMPLE_SHADER;
+ private float density = 16.0f;
+ private int color = GOLD;
+
+ private Color3f eColor = new Color3f(0.2f, 0.2f, 0.2f);
+ private Color3f sColor = new Color3f(0.8f, 0.8f, 0.8f);
+ private Color3f objColor = new Color3f(0.6f, 0.6f, 0.6f);
+ private Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+ private Color3f gold = new Color3f(0.7f, 0.6f, 0.18f);
+ private Color3f silver = new Color3f(0.75f, 0.75f, 0.75f);
+
+ // Handlers for doing update
+ private ShaderAppearance sApp1 = null;
+ private ShaderAppearance sApp2 = null;
+ private ShaderAppearance sApp3 = null;
+ private ShaderAppearance sApp4 = null;
+ private ShaderProgram sp1 = null;
+ private ShaderProgram sp2 = null;
+ private ShaderProgram sp3 = null;
+ private ShaderProgram sp4 = null;
+ private ShaderAttributeSet sas1 = null;
+ private ShaderAttributeSet sas2 = null;
+ private ShaderAttributeObject sao1 = null;
+ private ShaderAttributeObject sao2 = null;
+ private Sphere sphere = null;
+ private Shape3D s3d = null;
+
+ private Material createMaterial() {
+ Material m;
+ m = new Material(objColor, eColor, objColor, sColor, 100.0f);
+ m.setLightingEnable(true);
+ return m;
+ }
+
+ private ShaderProgram createGLSLShaderProgram(int index) {
+ String vertexProgram = null;
+ String fragmentProgram = null;
+ try {
+ switch (index) {
+ case DIMPLE_SHADER:
+ vertexProgram = StringIO.readFully(Resources.getResource("glsl_shader/dimple.vert"));
+ fragmentProgram = StringIO.readFully(Resources.getResource("glsl_shader/dimple.frag"));
+ break;
+ case BRICK_SHADER:
+ vertexProgram = StringIO.readFully(Resources.getResource("glsl_shader/aabrick.vert"));
+ fragmentProgram = StringIO.readFully(Resources.getResource("glsl_shader/aabrick.frag"));
+ break;
+ case WOOD_SHADER:
+ vertexProgram = StringIO.readFully(Resources.getResource("glsl_shader/wood.vert"));
+ fragmentProgram = StringIO.readFully(Resources.getResource("glsl_shader/wood.frag"));
+ break;
+ case POLKADOT3D_SHADER:
+ vertexProgram = StringIO.readFully(Resources.getResource("glsl_shader/polkadot3d.vert"));
+ fragmentProgram = StringIO.readFully(Resources.getResource("glsl_shader/polkadot3d.frag"));
+ break;
+ default:
+ }
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL,
+ Shader.SHADER_TYPE_VERTEX,
+ vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL,
+ Shader.SHADER_TYPE_FRAGMENT,
+ fragmentProgram);
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+ shaderProgram.setShaders(shaders);
+ return shaderProgram;
+ }
+
+ private ShaderAttributeSet createShaderAttributeSet(int index) {
+ ShaderAttributeSet shaderAttributeSet = new ShaderAttributeSet();
+ ShaderAttributeObject shaderAttribute = null;
+
+ switch (index) {
+ case DIMPLE_SHADER:
+ // "Density", "Size", "Scale", "Color", "LightPosition"
+ shaderAttribute = new ShaderAttributeValue("Size", new Float(0.25));
+ shaderAttributeSet.put(shaderAttribute);
+ shaderAttribute = new ShaderAttributeValue("LightPosition",
+ new Point3f(0.0f, 0.0f, 0.5f));
+ shaderAttributeSet.put(shaderAttribute);
+
+ sao1 = new ShaderAttributeValue("Density", new Float(density));
+ sao1.setCapability(ShaderAttributeObject.ALLOW_VALUE_READ);
+ sao1.setCapability(ShaderAttributeObject.ALLOW_VALUE_WRITE);
+ shaderAttributeSet.put(sao1);
+
+ if(color == GOLD) {
+ sao2 = new ShaderAttributeValue("Color", gold);
+ }
+ else if (color == SILVER) {
+ sao2 = new ShaderAttributeValue("Color", silver);
+ }
+ sao2.setCapability(ShaderAttributeObject.ALLOW_VALUE_READ);
+ sao2.setCapability(ShaderAttributeObject.ALLOW_VALUE_WRITE);
+ shaderAttributeSet.put(sao2);
+ break;
+
+ case BRICK_SHADER:
+ // "BrickColor", "LightPosition"
+ shaderAttribute = new ShaderAttributeValue("BrickColor",
+ new Color3f(1.0f, 0.3f, 0.2f));
+ shaderAttributeSet.put(shaderAttribute);
+ shaderAttribute = new ShaderAttributeValue("LightPosition",
+ new Point3f(0.0f, 0.0f, 0.5f));
+ shaderAttributeSet.put(shaderAttribute);
+ break;
+ default:
+ assert false;
+ }
+ return shaderAttributeSet;
+ }
+
+ private ShaderAppearance createShaderAppearance() {
+ ShaderAppearance sApp = new ShaderAppearance();
+ sApp.setMaterial(createMaterial());
+ return sApp;
+ }
+
+
+ private BranchGroup createSubSceneGraph() {
+ // Create the sub-root of the branch graph
+ BranchGroup subRoot = new BranchGroup();
+
+ //
+ // Create 1 spheres with a GLSLShader and add it into the scene graph.
+ //
+ sApp1 = createShaderAppearance();
+ sApp1.setCapability(ShaderAppearance.ALLOW_SHADER_PROGRAM_READ);
+ sApp1.setCapability(ShaderAppearance.ALLOW_SHADER_PROGRAM_WRITE);
+ sApp1.setCapability(ShaderAppearance.ALLOW_SHADER_ATTRIBUTE_SET_READ);
+ sApp1.setCapability(ShaderAppearance.ALLOW_SHADER_ATTRIBUTE_SET_WRITE);
+
+ sp1 = createGLSLShaderProgram(1);
+ sp1.setShaderAttrNames(shaderAttrNames1);
+ sas1 = createShaderAttributeSet(1);
+ sas1.setCapability(ShaderAttributeSet.ALLOW_ATTRIBUTES_READ);
+ sas1.setCapability(ShaderAttributeSet.ALLOW_ATTRIBUTES_WRITE);
+ sApp1.setShaderProgram(sp1);
+ sApp1.setShaderAttributeSet(sas1);
+
+ // Setup Brick shader
+ sp2 = createGLSLShaderProgram(2);
+ sp2.setShaderAttrNames(shaderAttrNames2);
+ sas2 = createShaderAttributeSet(2);
+ sApp2 = createShaderAppearance();
+ sApp2.setShaderProgram(sp2);
+ sApp2.setShaderAttributeSet(sas2);
+
+ // Setup Wood shader
+ sp3 = createGLSLShaderProgram(3);
+ sApp3 = createShaderAppearance();
+ sApp3.setShaderProgram(sp3);
+
+ // Setup Polkadot3d shader
+ sp4 = createGLSLShaderProgram(4);
+ sApp4 = createShaderAppearance();
+ sApp4.setShaderProgram(sp4);
+
+ sphere = new Sphere(1.5f, Sphere.GENERATE_NORMALS, 200, null);
+ s3d = (Shape3D)sphere.getShape();
+ s3d.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
+ s3d.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
+ s3d.setAppearance(sApp1);
+
+ TransformGroup objTG;
+ Transform3D t = new Transform3D();
+ t.set(new Vector3d(0.0, 0.0, 0.0));
+ objTG = new TransformGroup(t);
+ objTG.addChild(sphere);
+ subRoot.addChild(objTG);
+
+ return subRoot;
+ }
+
+ private BranchGroup createSceneGraph(int selectedScene) {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+ objRoot.setCapability(BranchGroup.ALLOW_DETACH);
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the background
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objScale.addChild(bg);
+
+ objScale.addChild(createSubSceneGraph());
+
+ // Create a position interpolator and attach it to the view
+ // platform
+ TransformGroup vpTrans =
+ univ.getViewingPlatform().getViewPlatformTransform();
+ Transform3D axisOfTranslation = new Transform3D();
+ Alpha transAlpha = new Alpha(-1,
+ Alpha.INCREASING_ENABLE |
+ Alpha.DECREASING_ENABLE,
+ 0, 0,
+ 5000, 0, 0,
+ 5000, 0, 0);
+ axisOfTranslation.rotY(-Math.PI/2.0);
+ PositionInterpolator translator =
+ new PositionInterpolator(transAlpha,
+ vpTrans,
+ axisOfTranslation,
+ 2.0f, 3.5f);
+ translator.setSchedulingBounds(bounds);
+ objScale.addChild(translator);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Canvas3D initScene() {
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+
+ univ = new SimpleUniverse(c);
+
+ // Add a ShaderErrorListener
+ univ.addShaderErrorListener(new ShaderErrorListener() {
+ public void errorOccurred(ShaderError error) {
+ error.printVerbose();
+ JOptionPane.showMessageDialog(ShaderTestGLSL.this,
+ error.toString(),
+ "ShaderError",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ });
+
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ view = univ.getViewer().getView();
+
+ return c;
+ }
+
+ /**
+ * Creates new form ShaderTestGLSL
+ */
+ public ShaderTestGLSL() {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create the scene and add the Canvas3D to the drawing panel
+ Canvas3D c = initScene();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+ }
+
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ densityButtonGroup = new javax.swing.ButtonGroup();
+ colorButtonGroup = new javax.swing.ButtonGroup();
+ sceneGraphButtonGroup = new javax.swing.ButtonGroup();
+ mainPanel = new javax.swing.JPanel();
+ guiPanel = new javax.swing.JPanel();
+ densityPanel = new javax.swing.JPanel();
+ zeroButton = new javax.swing.JRadioButton();
+ halfButton = new javax.swing.JRadioButton();
+ fullButton = new javax.swing.JRadioButton();
+ colorPanel = new javax.swing.JPanel();
+ goldButton = new javax.swing.JRadioButton();
+ silverButton = new javax.swing.JRadioButton();
+ sceneGraphPanel = new javax.swing.JPanel();
+ DetachButton = new javax.swing.JToggleButton();
+ AttachButton = new javax.swing.JToggleButton();
+ replaceSPButton = new javax.swing.JButton();
+ drawingPanel = new javax.swing.JPanel();
+ jMenuBar1 = new javax.swing.JMenuBar();
+ fileMenu = new javax.swing.JMenu();
+ exitMenuItem = new javax.swing.JMenuItem();
+
+ setTitle("Window Title");
+ addWindowListener(new java.awt.event.WindowAdapter() {
+ public void windowClosing(java.awt.event.WindowEvent evt) {
+ exitForm(evt);
+ }
+ });
+
+ mainPanel.setLayout(new java.awt.BorderLayout());
+
+ guiPanel.setLayout(new javax.swing.BoxLayout(guiPanel, javax.swing.BoxLayout.X_AXIS));
+
+ guiPanel.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0)));
+ densityPanel.setLayout(new java.awt.GridBagLayout());
+
+ densityPanel.setBorder(new javax.swing.border.TitledBorder("Density"));
+ densityButtonGroup.add(zeroButton);
+ zeroButton.setText("Zero");
+ zeroButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zeroButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ densityPanel.add(zeroButton, gridBagConstraints);
+
+ densityButtonGroup.add(halfButton);
+ halfButton.setText("Half");
+ halfButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ halfButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ densityPanel.add(halfButton, gridBagConstraints);
+
+ densityButtonGroup.add(fullButton);
+ fullButton.setSelected(true);
+ fullButton.setText("Full");
+ fullButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ fullButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ densityPanel.add(fullButton, gridBagConstraints);
+
+ guiPanel.add(densityPanel);
+ densityPanel.getAccessibleContext().setAccessibleName("ShaderAttributeValue \n");
+
+ colorPanel.setLayout(new java.awt.GridBagLayout());
+
+ colorPanel.setBorder(new javax.swing.border.TitledBorder("Color"));
+ colorButtonGroup.add(goldButton);
+ goldButton.setSelected(true);
+ goldButton.setText("Gold");
+ goldButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ goldButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ colorPanel.add(goldButton, gridBagConstraints);
+
+ colorButtonGroup.add(silverButton);
+ silverButton.setText("Silver");
+ silverButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ silverButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ colorPanel.add(silverButton, gridBagConstraints);
+
+ guiPanel.add(colorPanel);
+
+ sceneGraphPanel.setLayout(new java.awt.GridBagLayout());
+
+ sceneGraphPanel.setBorder(new javax.swing.border.TitledBorder("Scene Graph"));
+ sceneGraphButtonGroup.add(DetachButton);
+ DetachButton.setSelected(true);
+ DetachButton.setText("Detach");
+ DetachButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ DetachButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ sceneGraphPanel.add(DetachButton, gridBagConstraints);
+
+ sceneGraphButtonGroup.add(AttachButton);
+ AttachButton.setText("Create");
+ AttachButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ AttachButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ sceneGraphPanel.add(AttachButton, gridBagConstraints);
+
+ replaceSPButton.setText("Replace Shader");
+ replaceSPButton.setEnabled(false);
+ replaceSPButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ replaceSPButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ sceneGraphPanel.add(replaceSPButton, gridBagConstraints);
+
+ guiPanel.add(sceneGraphPanel);
+
+ mainPanel.add(guiPanel, java.awt.BorderLayout.NORTH);
+
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
+ mainPanel.add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ getContentPane().add(mainPanel, java.awt.BorderLayout.CENTER);
+
+ fileMenu.setText("File");
+ exitMenuItem.setText("Exit");
+ exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ exitMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(exitMenuItem);
+
+ jMenuBar1.add(fileMenu);
+
+ setJMenuBar(jMenuBar1);
+
+ pack();
+ }
+ // </editor-fold>//GEN-END:initComponents
+
+ private void silverButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_silverButtonActionPerformed
+ color = SILVER;
+ if(scene != null) {
+ sao2.setValue(silver);
+ }
+ }//GEN-LAST:event_silverButtonActionPerformed
+
+ private void goldButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_goldButtonActionPerformed
+ color = GOLD;
+ if(scene != null) {
+ sao2.setValue(gold);
+ }
+ }//GEN-LAST:event_goldButtonActionPerformed
+
+ private void replaceSPButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_replaceSPButtonActionPerformed
+ if (shaderSelected != DIMPLE_SHADER) {
+ goldButton.setEnabled(false);
+ silverButton.setEnabled(false);
+ zeroButton.setEnabled(false);
+ halfButton.setEnabled(false);
+ fullButton.setEnabled(false);
+ }
+
+ switch(shaderSelected) {
+ case DIMPLE_SHADER:
+ s3d.setAppearance(sApp1);
+ goldButton.setEnabled(true);
+ silverButton.setEnabled(true);
+ zeroButton.setEnabled(true);
+ halfButton.setEnabled(true);
+ fullButton.setEnabled(true);
+ shaderSelected = BRICK_SHADER;
+ break;
+ case BRICK_SHADER:
+ s3d.setAppearance(sApp2);
+ shaderSelected = WOOD_SHADER;
+ break;
+ case WOOD_SHADER:
+ s3d.setAppearance(sApp3);
+ shaderSelected = POLKADOT3D_SHADER;
+ break;
+ case POLKADOT3D_SHADER:
+ s3d.setAppearance(sApp4);
+ shaderSelected = DIMPLE_SHADER;
+ break;
+ default:
+ assert false;
+ }
+
+ }//GEN-LAST:event_replaceSPButtonActionPerformed
+
+ private void fullButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fullButtonActionPerformed
+ density = 16.0f;
+ if (scene != null) {
+ sao1.setValue(new Float(density));
+ }
+ }//GEN-LAST:event_fullButtonActionPerformed
+
+ private void DetachButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DetachButtonActionPerformed
+ if (scene != null) {
+ scene.detach();
+ scene = null;
+ replaceSPButton.setEnabled(false);
+ goldButton.setEnabled(true);
+ silverButton.setEnabled(true);
+ zeroButton.setEnabled(true);
+ halfButton.setEnabled(true);
+ fullButton.setEnabled(true);
+ shaderSelected = DIMPLE_SHADER;
+ }
+ }//GEN-LAST:event_DetachButtonActionPerformed
+
+ private void AttachButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AttachButtonActionPerformed
+ if (scene == null) {
+ scene = createSceneGraph(1);
+ univ.addBranchGraph(scene);
+ replaceSPButton.setEnabled(true);
+ shaderSelected = BRICK_SHADER;
+ }
+ }//GEN-LAST:event_AttachButtonActionPerformed
+
+ private void halfButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_halfButtonActionPerformed
+ density = 8.0f;
+ if(scene != null) {
+ sao1.setValue(new Float(density));
+ }
+ }//GEN-LAST:event_halfButtonActionPerformed
+
+ private void zeroButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zeroButtonActionPerformed
+ density = 0.0f;
+ if(scene != null) {
+ sao1.setValue(new Float(density));
+ }
+
+ }//GEN-LAST:event_zeroButtonActionPerformed
+
+ private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
+ System.exit(0);
+ }//GEN-LAST:event_exitMenuItemActionPerformed
+
+ /** Exit the Application */
+ private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
+ System.exit(0);
+ }//GEN-LAST:event_exitForm
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {
+ new ShaderTestGLSL().setVisible(true);
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JToggleButton AttachButton;
+ private javax.swing.JToggleButton DetachButton;
+ private javax.swing.ButtonGroup colorButtonGroup;
+ private javax.swing.JPanel colorPanel;
+ private javax.swing.ButtonGroup densityButtonGroup;
+ private javax.swing.JPanel densityPanel;
+ private javax.swing.JPanel drawingPanel;
+ private javax.swing.JMenuItem exitMenuItem;
+ private javax.swing.JMenu fileMenu;
+ private javax.swing.JRadioButton fullButton;
+ private javax.swing.JRadioButton goldButton;
+ private javax.swing.JPanel guiPanel;
+ private javax.swing.JRadioButton halfButton;
+ private javax.swing.JMenuBar jMenuBar1;
+ private javax.swing.JPanel mainPanel;
+ private javax.swing.JButton replaceSPButton;
+ private javax.swing.ButtonGroup sceneGraphButtonGroup;
+ private javax.swing.JPanel sceneGraphPanel;
+ private javax.swing.JRadioButton silverButton;
+ private javax.swing.JRadioButton zeroButton;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/SphereGLSL.form b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/SphereGLSL.form
new file mode 100644
index 0000000..26e9b32
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/SphereGLSL.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="SphereGLSL"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/SphereGLSL.java b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/SphereGLSL.java
new file mode 100644
index 0000000..03a514e
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/SphereGLSL.java
@@ -0,0 +1,384 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.glsl_shader;
+
+import java.awt.GraphicsConfiguration;
+import java.io.IOException;
+
+import javax.swing.JOptionPane;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.Light;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointLight;
+import org.jogamp.java3d.PositionInterpolator;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderError;
+import org.jogamp.java3d.ShaderErrorListener;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.SpotLight;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * Simple Java 3D example program with programmable shader.
+ */
+public class SphereGLSL extends javax.swing.JFrame {
+
+ // Constants for type of light to use
+ private static final int DIRECTIONAL_LIGHT = 0;
+ private static final int POINT_LIGHT = 1;
+ private static final int SPOT_LIGHT = 2;
+
+ // Flag indicates type of lights: directional, point, or spot
+ // lights. This flag is set based on command line argument
+ private static int lightType = POINT_LIGHT;//DIRECTIONAL_LIGHT;
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ public BranchGroup createSceneGraph() {
+ Color3f eColor = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f sColor = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f objColor = new Color3f(0.6f, 0.6f, 0.6f);
+ Color3f lColor1 = new Color3f(1.0f, 0.0f, 0.0f);
+ Color3f lColor2 = new Color3f(0.0f, 1.0f, 0.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+
+ Transform3D t;
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the background
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objScale.addChild(bg);
+
+ // Create a Sphere object, generate one copy of the sphere,
+ // and add it into the scene graph.
+ ShaderAppearance a = new ShaderAppearance();
+ Material m = new Material(objColor, eColor, objColor, sColor, 100.0f);
+ m.setLightingEnable(true);
+ String vertexProgram = null;
+ String fragmentProgram = null;
+ try {
+ vertexProgram = StringIO.readFully(Resources.getResource("glsl_shader/simple.vert"));
+ fragmentProgram = StringIO.readFully(Resources.getResource("glsl_shader/simple.frag"));
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL,
+ Shader.SHADER_TYPE_VERTEX,
+ vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL,
+ Shader.SHADER_TYPE_FRAGMENT,
+ fragmentProgram);
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+ shaderProgram.setShaders(shaders);
+
+ a.setShaderProgram(shaderProgram);
+ a.setMaterial(m);
+ Sphere sph = new Sphere(1.0f, Sphere.GENERATE_NORMALS, 200, a);
+ objScale.addChild(sph);
+
+ // Create the transform group node for the each light and initialize
+ // it to the identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add them to the root
+ // of the subgraph.
+ TransformGroup l1RotTrans = new TransformGroup();
+ l1RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l1RotTrans);
+
+ TransformGroup l2RotTrans = new TransformGroup();
+ l2RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l2RotTrans);
+
+ // Create transformations for the positional lights
+ t = new Transform3D();
+ Vector3d lPos1 = new Vector3d(0.0, 0.5, 2.0);
+ t.set(lPos1);
+ TransformGroup l1Trans = new TransformGroup(t);
+ l1RotTrans.addChild(l1Trans);
+
+ t = new Transform3D();
+ Vector3d lPos2 = new Vector3d(0.5, 0.8, 2.0);
+ t.set(lPos2);
+ TransformGroup l2Trans = new TransformGroup(t);
+ l2RotTrans.addChild(l2Trans);
+
+ // Create Geometry for point lights
+ ColoringAttributes caL1 = new ColoringAttributes();
+ ColoringAttributes caL2 = new ColoringAttributes();
+ caL1.setColor(lColor1);
+ caL2.setColor(lColor2);
+ Appearance appL1 = new Appearance();
+ Appearance appL2 = new Appearance();
+ appL1.setColoringAttributes(caL1);
+ appL2.setColoringAttributes(caL2);
+ l1Trans.addChild(new Sphere(0.05f, appL1));
+ l2Trans.addChild(new Sphere(0.05f, appL2));
+
+ // Create lights
+ AmbientLight aLgt = new AmbientLight(alColor);
+
+ Light lgt1 = null;
+ Light lgt2 = null;
+
+ Point3f lPoint = new Point3f(0.0f, 0.0f, 0.0f);
+ Point3f atten = new Point3f(1.0f, 0.0f, 0.0f);
+ Vector3f lDirect1 = new Vector3f(lPos1);
+ Vector3f lDirect2 = new Vector3f(lPos2);
+ lDirect1.negate();
+ lDirect2.negate();
+
+ switch (lightType) {
+ case DIRECTIONAL_LIGHT:
+ lgt1 = new DirectionalLight(lColor1, lDirect1);
+ lgt2 = new DirectionalLight(lColor2, lDirect2);
+ break;
+ case POINT_LIGHT:
+ lgt1 = new PointLight(lColor1, lPoint, atten);
+ lgt2 = new PointLight(lColor2, lPoint, atten);
+ break;
+ case SPOT_LIGHT:
+ lgt1 = new SpotLight(lColor1, lPoint, atten, lDirect1,
+ 25.0f * (float)Math.PI / 180.0f, 10.0f);
+ lgt2 = new SpotLight(lColor2, lPoint, atten, lDirect2,
+ 25.0f * (float)Math.PI / 180.0f, 10.0f);
+ break;
+ }
+
+ // Set the influencing bounds
+ aLgt.setInfluencingBounds(bounds);
+ lgt1.setInfluencingBounds(bounds);
+ lgt2.setInfluencingBounds(bounds);
+
+ // Add the lights into the scene graph
+ objScale.addChild(aLgt);
+ l1Trans.addChild(lgt1);
+ l2Trans.addChild(lgt2);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotor1Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+ RotationInterpolator rotator1 =
+ new RotationInterpolator(rotor1Alpha,
+ l1RotTrans,
+ yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator1.setSchedulingBounds(bounds);
+ l1RotTrans.addChild(rotator1);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Alpha rotor2Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 1000, 0, 0,
+ 0, 0, 0);
+ RotationInterpolator rotator2 =
+ new RotationInterpolator(rotor2Alpha,
+ l2RotTrans,
+ yAxis,
+ 0.0f, 0.0f);
+ bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ rotator2.setSchedulingBounds(bounds);
+ l2RotTrans.addChild(rotator2);
+
+ // Create a position interpolator and attach it to the view
+ // platform
+ TransformGroup vpTrans =
+ univ.getViewingPlatform().getViewPlatformTransform();
+ Transform3D axisOfTranslation = new Transform3D();
+ Alpha transAlpha = new Alpha(-1,
+ Alpha.INCREASING_ENABLE |
+ Alpha.DECREASING_ENABLE,
+ 0, 0,
+ 5000, 0, 0,
+ 5000, 0, 0);
+ axisOfTranslation.rotY(-Math.PI/2.0);
+ PositionInterpolator translator =
+ new PositionInterpolator(transAlpha,
+ vpTrans,
+ axisOfTranslation,
+ 2.0f, 3.5f);
+ translator.setSchedulingBounds(bounds);
+ objScale.addChild(translator);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D canvas3d = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(canvas3d);
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Add a ShaderErrorListener
+ univ.addShaderErrorListener(new ShaderErrorListener() {
+ public void errorOccurred(ShaderError error) {
+ error.printVerbose();
+ JOptionPane.showMessageDialog(SphereGLSL.this,
+ error.toString(),
+ "ShaderError",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ });
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return canvas3d;
+ }
+
+
+ /**
+ * Creates new form SphereGLSL
+ */
+ public SphereGLSL() {
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene); }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("SphereGLSL");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[]) {
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ SphereGLSL sphereGLSL = new SphereGLSL();
+ sphereGLSL.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/VertexAttrTestGLSL.form b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/VertexAttrTestGLSL.form
new file mode 100644
index 0000000..6e31a8f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/VertexAttrTestGLSL.form
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <NonVisualComponents>
+ <Menu class="javax.swing.JMenuBar" name="jMenuBar1">
+ <SubComponents>
+ <Menu class="javax.swing.JMenu" name="fileMenu">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="File"/>
+ </Properties>
+ <SubComponents>
+ <MenuItem class="javax.swing.JMenuItem" name="exitMenuItem">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Exit"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="exitMenuItemActionPerformed"/>
+ </Events>
+ </MenuItem>
+ </SubComponents>
+ </Menu>
+ </SubComponents>
+ </Menu>
+ </NonVisualComponents>
+ <Properties>
+ <Property name="title" type="java.lang.String" value="VertexAttrTestGLSL"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="menuBar" type="java.lang.String" value="jMenuBar1"/>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <Events>
+ <EventHandler event="windowClosing" listener="java.awt.event.WindowListener" parameters="java.awt.event.WindowEvent" handler="exitForm"/>
+ </Events>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="mainPanel">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="guiPanel">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.LineBorderInfo">
+ <LineBorder/>
+ </Border>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="North"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="vertexCheckBoxPanel">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="vertexFormat">
+ <Font PropertyName="font" name="Lucida Sans" size="10" style="0"/>
+ </TitledBorder>
+ </Border>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="2" insetsBottom="2" insetsRight="2" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="jPanel1">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="11" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JSeparator" name="jSeparator1">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[0, 4]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JSeparator" name="jSeparator2">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[0, 4]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="jPanel2">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="11" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JCheckBox" name="vertexAttrsBox">
+ <Properties>
+ <Property name="selected" type="boolean" value="true"/>
+ <Property name="text" type="java.lang.String" value="VertexAttrs"/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="4" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="geometryPanel">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="2" insetsBottom="2" insetsRight="2" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JButton" name="createButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Create Geometry"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="createButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JButton" name="destroyButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Destroy Geometry"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="destroyButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="2" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/VertexAttrTestGLSL.java b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/VertexAttrTestGLSL.java
new file mode 100644
index 0000000..014c0e9
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/VertexAttrTestGLSL.java
@@ -0,0 +1,428 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.glsl_shader;
+
+import java.awt.GraphicsConfiguration;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.J3DBuffer;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderError;
+import org.jogamp.java3d.ShaderErrorListener;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TriangleArray;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+
+public class VertexAttrTestGLSL extends javax.swing.JFrame {
+
+ SimpleUniverse univ = null;
+ BranchGroup scene = null;
+
+ public BranchGroup createSceneGraph( boolean hasVertexAttrs ) {
+
+ // Bounds for BG and behavior
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+ objRoot.setCapability(BranchGroup.ALLOW_DETACH);
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.1f, 0.1f, 0.1f);
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objRoot.addChild(bg);
+
+ // Create the TransformGroup node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at run time. Add it to
+ // the root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // Create a simple Shape3D node; add it to the scene graph.
+ objTrans.addChild(new MyShape(this, hasVertexAttrs));
+
+ return objRoot;
+ }
+
+ private Canvas3D initScene() {
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ univ = new SimpleUniverse(c);
+
+ // Add a ShaderErrorListener
+ univ.addShaderErrorListener(new ShaderErrorListener() {
+ public void errorOccurred(ShaderError error) {
+ error.printVerbose();
+ JOptionPane.showMessageDialog(VertexAttrTestGLSL.this,
+ error.toString(),
+ "ShaderError",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ });
+
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ return c;
+ }
+
+ /**
+ * Creates new form VertexAttrTestGLSL
+ */
+ public VertexAttrTestGLSL() {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create the scene and add the Canvas3D to the drawing panel
+ Canvas3D c = initScene();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+ }
+
+ static class MyShape extends Shape3D {
+ private static String vertexProgName = "glsl_shader/vertexshader.vert";
+
+ // Coordinate data
+ private static final float[] coords = {
+ 0.0f, 0.0f, 0.0f,
+ 0.5f, 0.0f, 0.0f,
+ 0.0f, 0.5f, 0.0f,
+ };
+
+ private static final int[] sizes = { 1, 3 };
+ private static final float[] weights = {
+ 0.45f,
+ 0.15f,
+ 0.95f,
+ };
+ private static final float[] temps = {
+ 1.0f, 0.5f, 0.5f,
+ 0.5f, 1.0f, 0.5f,
+ 0.5f, 0.5f, 1.0f,
+ };
+
+ private static final String[] vaNames = { "weight", "temperature" };
+
+ J3DBuffer createDirectFloatBuffer(float[] arr) {
+ ByteOrder order = ByteOrder.nativeOrder();
+
+ FloatBuffer nioBuf = ByteBuffer.allocateDirect(arr.length * 4).order(order).asFloatBuffer();
+ nioBuf.put(arr);
+ return new J3DBuffer(nioBuf);
+ }
+
+
+ MyShape(JFrame frame, boolean hasVertexAttrs) {
+
+ int vertexFormat = GeometryArray.COORDINATES;
+ int vertexAttrCount = 0;
+ int[] vertexAttrSizes = null;
+ String[] vertexAttrNames = null;
+ String[] shaderAttrNames = null;
+
+ if (hasVertexAttrs) {
+ vertexFormat |= GeometryArray.VERTEX_ATTRIBUTES;
+ vertexAttrCount = vaNames.length;
+ vertexAttrSizes = sizes;
+ vertexAttrNames = vaNames;
+ }
+
+ TriangleArray tri = new TriangleArray(6, vertexFormat, 0, null, vertexAttrCount, vertexAttrSizes);
+ tri.setValidVertexCount(3);
+ tri.setCoordinates(0, coords);
+
+ if (hasVertexAttrs) {
+ tri.setVertexAttrs(0, 0, weights);
+ tri.setVertexAttrs(1, 0, temps);
+
+ String vertexProgram = null;
+ try {
+ vertexProgram = StringIO.readFully(Resources.getResource(vertexProgName));
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ Shader[] shaders = new Shader[1];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL,
+ Shader.SHADER_TYPE_VERTEX,
+ vertexProgram);
+
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+ shaderProgram.setShaders(shaders);
+ shaderProgram.setVertexAttrNames(vertexAttrNames);
+ shaderProgram.setShaderAttrNames(shaderAttrNames);
+
+ ShaderAppearance app = new ShaderAppearance();
+ app.setShaderProgram(shaderProgram);
+
+ this.setGeometry(tri);
+
+ this.setAppearance(app);
+ } else {
+ this.setGeometry(tri);
+ this.setAppearance(new Appearance());
+ }
+ }
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ mainPanel = new javax.swing.JPanel();
+ guiPanel = new javax.swing.JPanel();
+ vertexCheckBoxPanel = new javax.swing.JPanel();
+ jPanel1 = new javax.swing.JPanel();
+ jSeparator1 = new javax.swing.JSeparator();
+ jSeparator2 = new javax.swing.JSeparator();
+ jPanel2 = new javax.swing.JPanel();
+ vertexAttrsBox = new javax.swing.JCheckBox();
+ geometryPanel = new javax.swing.JPanel();
+ createButton = new javax.swing.JButton();
+ destroyButton = new javax.swing.JButton();
+ drawingPanel = new javax.swing.JPanel();
+ jMenuBar1 = new javax.swing.JMenuBar();
+ fileMenu = new javax.swing.JMenu();
+ exitMenuItem = new javax.swing.JMenuItem();
+
+ setTitle("VertexAttrTestGLSL");
+ addWindowListener(new java.awt.event.WindowAdapter() {
+ public void windowClosing(java.awt.event.WindowEvent evt) {
+ exitForm(evt);
+ }
+ });
+
+ mainPanel.setLayout(new java.awt.BorderLayout());
+
+ guiPanel.setLayout(new java.awt.GridBagLayout());
+
+ guiPanel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
+ vertexCheckBoxPanel.setLayout(new java.awt.GridBagLayout());
+
+ vertexCheckBoxPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "vertexFormat", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Lucida Sans", 0, 10)));
+ jPanel1.setLayout(new java.awt.GridBagLayout());
+
+ jSeparator1.setPreferredSize(new java.awt.Dimension(0, 4));
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ jPanel1.add(jSeparator1, gridBagConstraints);
+
+ jSeparator2.setPreferredSize(new java.awt.Dimension(0, 4));
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 3;
+ jPanel1.add(jSeparator2, gridBagConstraints);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
+ vertexCheckBoxPanel.add(jPanel1, gridBagConstraints);
+
+ jPanel2.setLayout(new java.awt.GridBagLayout());
+
+ vertexAttrsBox.setSelected(true);
+ vertexAttrsBox.setText("VertexAttrs");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 4;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ jPanel2.add(vertexAttrsBox, gridBagConstraints);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
+ vertexCheckBoxPanel.add(jPanel2, gridBagConstraints);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
+ guiPanel.add(vertexCheckBoxPanel, gridBagConstraints);
+
+ geometryPanel.setLayout(new java.awt.GridBagLayout());
+
+ createButton.setText("Create Geometry");
+ createButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ createButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ geometryPanel.add(createButton, gridBagConstraints);
+
+ destroyButton.setText("Destroy Geometry");
+ destroyButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ destroyButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(0, 0, 2, 0);
+ geometryPanel.add(destroyButton, gridBagConstraints);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
+ guiPanel.add(geometryPanel, gridBagConstraints);
+
+ mainPanel.add(guiPanel, java.awt.BorderLayout.NORTH);
+
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
+ mainPanel.add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ getContentPane().add(mainPanel, java.awt.BorderLayout.CENTER);
+
+ fileMenu.setText("File");
+ exitMenuItem.setText("Exit");
+ exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ exitMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(exitMenuItem);
+
+ jMenuBar1.add(fileMenu);
+
+ setJMenuBar(jMenuBar1);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ private void destroyButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_destroyButtonActionPerformed
+ if (scene != null) {
+ univ.getLocale().removeBranchGraph(scene);
+ scene = null;
+ }
+ }//GEN-LAST:event_destroyButtonActionPerformed
+
+ private void createButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createButtonActionPerformed
+ if (scene == null) {
+ boolean hasVertexAttrs = vertexAttrsBox.isSelected();
+ scene = createSceneGraph(hasVertexAttrs);
+ univ.addBranchGraph(scene);
+ }
+ }//GEN-LAST:event_createButtonActionPerformed
+
+ private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
+ System.exit(0);
+ }//GEN-LAST:event_exitMenuItemActionPerformed
+
+ /** Exit the Application */
+ private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
+ System.exit(0);
+ }//GEN-LAST:event_exitForm
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new VertexAttrTestGLSL().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton createButton;
+ private javax.swing.JButton destroyButton;
+ private javax.swing.JPanel drawingPanel;
+ private javax.swing.JMenuItem exitMenuItem;
+ private javax.swing.JMenu fileMenu;
+ private javax.swing.JPanel geometryPanel;
+ private javax.swing.JPanel guiPanel;
+ private javax.swing.JMenuBar jMenuBar1;
+ private javax.swing.JPanel jPanel1;
+ private javax.swing.JPanel jPanel2;
+ private javax.swing.JSeparator jSeparator1;
+ private javax.swing.JSeparator jSeparator2;
+ private javax.swing.JPanel mainPanel;
+ private javax.swing.JCheckBox vertexAttrsBox;
+ private javax.swing.JPanel vertexCheckBoxPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/aabrick.frag b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/aabrick.frag
new file mode 100644
index 0000000..7c9aab8
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/aabrick.frag
@@ -0,0 +1,55 @@
+//
+// Fragment shader for antialiased procedural bricks
+//
+// Authors: Dave Baldwin, Randi Rost
+// based on a shader by Darwyn Peachey
+//
+// Copyright (c) 2002-2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+uniform vec3 BrickColor;
+//uniform vec3 MortarColor;
+//uniform vec2 BrickSize;
+//uniform vec2 BrickPct;
+//uniform vec2 MortarPct;
+
+//const vec3 BrickColor = vec3 (1, 0.3, 0.2);
+const vec3 MortarColor = vec3 (0.85, 0.86, 0.84);
+const vec2 BrickSize = vec2 (0.3, 0.15);
+const vec2 BrickPct = vec2 (0.9, 0.85);
+const vec2 MortarPct = vec2 (0.1, 0.15);
+
+varying vec2 MCposition;
+varying float LightIntensity;
+
+#define Integral(x, p, notp) ((floor(x)*(p)) + max(fract(x)-(notp), 0.0))
+
+void main(void)
+{
+ vec2 position, fw, useBrick;
+ vec3 color;
+
+ // Determine position within the brick pattern
+ position = MCposition / BrickSize;
+
+ // Adjust every other row by an offset of half a brick
+ if (fract(position.y * 0.5) > 0.5)
+ position.x += 0.5;
+
+ // Calculate filter size
+ //fw = fwidth(position); //fwidth not implemented on WildcatVP
+ fw = (abs(dFdx(MCposition)) + abs(dFdy(MCposition))) / BrickSize;
+
+ // Perform filtering by integrating the 2D pulse made by the
+ // brick pattern over the filter width and height
+ useBrick = (Integral(position + fw, BrickPct, MortarPct) -
+ Integral(position, BrickPct, MortarPct)) / fw;
+
+ // Determine final color
+ color = mix(MortarColor, BrickColor, useBrick.x * useBrick.y);
+ color *= LightIntensity;
+
+ gl_FragColor = vec4 (color, 1.0);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/aabrick.vert b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/aabrick.vert
new file mode 100644
index 0000000..226dbe4
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/aabrick.vert
@@ -0,0 +1,42 @@
+//
+// Vertex shader for antialiased procedural bricks
+//
+// Authors: Dave Baldwin, Steve Koren, Randi Rost
+// based on a shader by Darwyn Peachey
+//
+// Copyright (c) 2002-2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+uniform vec3 LightPosition;
+//const vec3 LightPosition = vec3 (0, 4, 4);
+
+const float SpecularContribution = 0.3;
+const float DiffuseContribution = 1.0 - SpecularContribution;
+
+varying float LightIntensity;
+varying vec2 MCposition;
+
+void main(void)
+{
+ vec3 ecPosition = vec3 (gl_ModelViewMatrix * gl_Vertex);
+ vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal);
+ vec3 lightVec = normalize(LightPosition - ecPosition);
+ vec3 reflectVec = reflect(-lightVec, tnorm);
+ vec3 viewVec = normalize(-ecPosition);
+ float diffuse = max(dot(lightVec, tnorm), 0.0);
+ float spec = 0.0;
+
+ if (diffuse > 0.0)
+ {
+ spec = max(dot(reflectVec, viewVec), 0.0);
+ spec = pow(spec, 16.0);
+ }
+
+ LightIntensity = DiffuseContribution * diffuse +
+ SpecularContribution * spec;
+
+ MCposition = gl_Vertex.xy;
+ gl_Position = ftransform();
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/dimple.frag b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/dimple.frag
new file mode 100644
index 0000000..282add7
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/dimple.frag
@@ -0,0 +1,61 @@
+
+//
+// dimple.frag: Fragment shader for bump mapping dimples (bumps)
+//
+// author: John Kessenich
+//
+// Copyright (c) 2002: 3Dlabs, Inc.
+//
+//
+varying vec3 LightDir;
+varying vec3 EyeDir;
+varying vec3 Normal;
+
+//const vec3 Color = vec3(0.7, 0.6, 0.18);
+
+//const float Density = 16.0;
+//const float Size = 0.25;
+
+uniform vec3 Color;
+uniform float Density;
+uniform float Size;
+// uniform float SpecularFactor;
+
+//float Density = 27.6;
+//float Size = 0.13025;
+
+
+//uniform float Scale;
+
+const float SpecularFactor = 0.4;
+
+void main (void)
+{
+ vec3 litColor;
+
+ vec2 c = Density * (gl_TexCoord[0].xy);
+ vec2 p = fract(c) - vec2(0.5);
+ float d = (p.x * p.x) + (p.y * p.y);
+ if (d >= Size)
+ p = vec2(0.0);
+
+ vec3 normDelta = vec3(-p.x, -p.y, 1.0);
+
+ litColor = Color * max(0.0, dot(normDelta, LightDir));
+
+ float t = 2.0 * dot(LightDir, normDelta);
+ vec3 reflectDir = t * normDelta;
+ reflectDir = LightDir - reflectDir;
+
+// vec3 reflectDir = LightDir - 2.0 * dot(LightDir, normDelta) * normDelta;
+
+ float spec = max(dot(EyeDir, reflectDir), 0.0);
+ spec = spec * spec;
+ spec = spec * spec;
+ spec *= SpecularFactor;
+
+ litColor = min(litColor + spec, vec3(1.0));
+ gl_FragColor = vec4(litColor, gl_Color.a);
+// gl_FragColor = vec4(litColor, 1.0);
+// gl_FragColor = vec4(Scale);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/dimple.vert b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/dimple.vert
new file mode 100644
index 0000000..e45796b
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/dimple.vert
@@ -0,0 +1,42 @@
+
+//
+// dimple.vert: Vertex shader for bump mapping dimples (bumps)
+//
+// author: John Kessenich
+//
+// Copyright (c) 2002: 3Dlabs, Inc.
+//
+
+varying vec3 LightDir;
+varying vec3 EyeDir;
+varying vec3 Normal;
+
+uniform vec3 LightPosition;
+// uniform float Scale;
+// vec3 LightPosition = vec3(0.0, 0.0, 5.0);
+float Scale = 1.0;
+
+void main(void)
+{
+ vec4 pos = gl_ModelViewMatrix * gl_Vertex;
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ vec3 eyeDir = vec3(pos);
+// gl_TexCoord[0] = gl_MultiTexCoord0;
+ gl_TexCoord[0] = gl_Vertex;
+ gl_FrontColor = gl_Color;
+
+ vec3 n = normalize(gl_NormalMatrix * gl_Normal);
+ vec3 t = normalize(cross(vec3(1.141, 2.78, 3.14), n));
+ vec3 b = cross(n, t);
+
+ vec3 v;
+ v.x = dot(LightPosition, t);
+ v.y = dot(LightPosition, b);
+ v.z = dot(LightPosition, n);
+ LightDir = normalize(v);
+
+ v.x = dot(eyeDir, t);
+ v.y = dot(eyeDir, b);
+ v.z = dot(eyeDir, n);
+ EyeDir = normalize(v);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/envmap.frag b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/envmap.frag
new file mode 100644
index 0000000..3e298f8
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/envmap.frag
@@ -0,0 +1,61 @@
+//
+// Fragment shader for environment mapping with an
+// equirectangular 2D texture
+//
+// Authors: John Kessenich, Randi Rost
+//
+// Copyright (c) 2002-2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+const vec3 Xunitvec = vec3 (1.0, 0.0, 0.0);
+const vec3 Yunitvec = vec3 (0.0, 1.0, 0.0);
+
+uniform vec3 BaseColor;
+uniform float MixRatio;
+
+uniform sampler2D EnvMap;
+
+varying vec3 Normal;
+varying vec3 EyeDir;
+varying float LightIntensity;
+
+void main (void)
+{
+ // Compute reflection vector
+ vec3 reflectDir = reflect(EyeDir, Normal);
+
+ // Compute altitude and azimuth angles
+
+ vec2 index;
+
+ index.y = dot(normalize(reflectDir), Yunitvec);
+ reflectDir.y = 0.0;
+ index.x = dot(normalize(reflectDir), Xunitvec) * 0.5;
+
+ // Translate index values into proper range
+
+ if (reflectDir.z >= 0.0)
+ index = (index + 1.0) * 0.5;
+ else
+ {
+ index.t = (index.t + 1.0) * 0.5;
+ index.s = (-index.s) * 0.5 + 1.0;
+ }
+
+ // if reflectDir.z >= 0.0, s will go from 0.25 to 0.75
+ // if reflectDir.z < 0.0, s will go from 0.75 to 1.25, and
+ // that's OK, because we've set the texture to wrap.
+
+ // Do a lookup into the environment map.
+
+ vec3 envColor = vec3 (texture2D(EnvMap, index));
+
+ // Add lighting to base color and mix
+
+ vec3 base = LightIntensity * BaseColor;
+ envColor = mix(envColor, base, MixRatio);
+
+ gl_FragColor = vec4 (envColor, 1.0);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/envmap.vert b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/envmap.vert
new file mode 100644
index 0000000..d4e8b44
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/envmap.vert
@@ -0,0 +1,25 @@
+//
+// Vertex shader for environment mapping with an
+// equirectangular 2D texture
+//
+// Authors: John Kessenich, Randi Rost
+//
+// Copyright (c) 2002-2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+varying vec3 Normal;
+varying vec3 EyeDir;
+varying float LightIntensity;
+
+uniform vec3 LightPos;
+
+void main(void)
+{
+ gl_Position = ftransform();
+ Normal = normalize(gl_NormalMatrix * gl_Normal);
+ vec4 pos = gl_ModelViewMatrix * gl_Vertex;
+ EyeDir = pos.xyz;
+ LightIntensity = max(dot(normalize(LightPos - EyeDir), Normal), 0.0);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/gouraud.frag b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/gouraud.frag
new file mode 100644
index 0000000..9169661
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/gouraud.frag
@@ -0,0 +1,50 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+// Simple GLSL fragment program to add the primary and secondary (specular) colors
+
+void main()
+{
+ gl_FragColor = gl_Color + gl_SecondaryColor;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/gouraud.vert b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/gouraud.vert
new file mode 100644
index 0000000..8503e6f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/gouraud.vert
@@ -0,0 +1,100 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+// A GLSL vertex program for handling 1 directional light with specular.
+// This implements per-vertex lighting (Gouraud shading).
+
+void directionalLight0(
+ in vec3 normal,
+ inout vec4 ambient,
+ inout vec4 diffuse,
+ inout vec4 specular)
+{
+ // Normalized light direction and half vector
+ vec3 lightDirection = normalize(vec3(gl_LightSource[0].position));
+ vec3 halfVector = normalize(vec3(gl_LightSource[0].halfVector));
+
+ float nDotVP; // normal . light_direction
+ float nDotHV; // normal . light_half_vector
+ float pf; // power factor
+
+ nDotVP = max(0.0, dot(normal, lightDirection));
+ nDotHV = max(0.0, dot(normal, halfVector));
+
+ if (nDotVP == 0.0) {
+ pf = 0.0;
+ }
+ else {
+ pf = pow(nDotHV, gl_FrontMaterial.shininess);
+ }
+
+ ambient += gl_LightSource[0].ambient;
+ diffuse += gl_LightSource[0].diffuse * nDotVP;
+ specular += gl_LightSource[0].specular * pf;
+}
+
+
+void main()
+{
+ vec3 tnorm = normalize(vec3(gl_NormalMatrix * gl_Normal));
+ vec4 amb = vec4(0.0);
+ vec4 diff = vec4(0.0);
+ vec4 spec = vec4(0.0);
+ int i;
+
+ // Transform the vertex
+ vec4 outPosition = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ directionalLight0(tnorm, amb, diff, spec);
+
+ // Apply the result of the lighting equation
+ vec4 outSecondaryColor = vec4(vec3(spec * gl_FrontMaterial.specular), 1.0);
+ vec4 outColor = vec4(vec3(gl_FrontLightModelProduct.sceneColor +
+ amb * gl_FrontMaterial.ambient +
+ diff * gl_FrontMaterial.diffuse), 1.0);
+
+ gl_FrontColor = outColor;
+ gl_FrontSecondaryColor = outSecondaryColor;
+ gl_Position = outPosition;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/multitex.frag b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/multitex.frag
new file mode 100644
index 0000000..b79f85a
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/multitex.frag
@@ -0,0 +1,61 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+uniform float cloudFactor;
+uniform sampler2D earthTex;
+uniform sampler2D cloudTex;
+
+uniform sampler2D EnvMap;
+
+void main (void)
+{
+ vec2 tc0 = gl_TexCoord[0].xy;
+ vec2 tc1 = gl_TexCoord[1].xy;
+
+ vec3 color0 = vec3(texture2D(cloudTex, tc0));
+ vec3 color1 = vec3(texture2D(earthTex, tc1));
+ vec3 finalColor = color0*cloudFactor + color1;
+
+ gl_FragColor = vec4(finalColor, 1.0);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/phong.frag b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/phong.frag
new file mode 100644
index 0000000..90bab19
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/phong.frag
@@ -0,0 +1,98 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+// A GLSL fragment program for handling 1 directional light with specular.
+// This implements per-pixel lighting (Phong shading)
+
+void directionalLight0(
+ in vec3 normal,
+ inout vec4 ambient,
+ inout vec4 diffuse,
+ inout vec4 specular)
+{
+ // Normalized light direction and half vector
+ vec3 lightDirection = normalize(vec3(gl_LightSource[0].position));
+ vec3 halfVector = normalize(vec3(gl_LightSource[0].halfVector));
+
+ float nDotVP; // normal . light_direction
+ float nDotHV; // normal . light_half_vector
+ float pf; // power factor
+
+ nDotVP = max(0.0, dot(normal, lightDirection));
+ nDotHV = max(0.0, dot(normal, halfVector));
+
+ if (nDotVP == 0.0) {
+ pf = 0.0;
+ }
+ else {
+ pf = pow(nDotHV, gl_FrontMaterial.shininess);
+ }
+
+ ambient += gl_LightSource[0].ambient;
+ diffuse += gl_LightSource[0].diffuse * nDotVP;
+ specular += gl_LightSource[0].specular * pf;
+}
+
+
+// Per-pixel normal (input from vertex shader)
+varying vec3 Normal;
+
+void main()
+{
+ vec3 unitNorm = normalize(Normal);
+ vec4 amb = vec4(0.0);
+ vec4 diff = vec4(0.0);
+ vec4 spec = vec4(0.0);
+ int i;
+
+ directionalLight0(unitNorm, amb, diff, spec);
+
+ // Apply the result of the lighting equation
+ vec4 secondaryColor = vec4(vec3(spec * gl_FrontMaterial.specular), 1.0);
+ vec4 color = vec4(vec3(gl_FrontLightModelProduct.sceneColor +
+ amb * gl_FrontMaterial.ambient +
+ diff * gl_FrontMaterial.diffuse), 1.0);
+
+ gl_FragColor = color + secondaryColor;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/phong.vert b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/phong.vert
new file mode 100644
index 0000000..ab27603
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/phong.vert
@@ -0,0 +1,56 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+// A GLSL vertex program for doing Phone shading (per-fragment lighting)
+
+// Per-pixel normal (output to fragment shader)
+varying vec3 Normal;
+
+void main()
+{
+ Normal = normalize(vec3(gl_NormalMatrix * gl_Normal));
+
+ // Transform the vertex
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/polkadot3d.frag b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/polkadot3d.frag
new file mode 100644
index 0000000..b341454
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/polkadot3d.frag
@@ -0,0 +1,48 @@
+//
+// Fragment shader for 3 dimensional polka dot shader.
+//
+// Author: Joshua Doss
+//
+// Copyright (C) 2002-2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+varying float LightIntensity;
+varying vec3 MCPosition;
+
+//Create uniform variables so dots can be spaced and scaled by user
+//uniform vec3 Spacing;
+//uniform float DotSize;
+const vec3 Spacing = vec3 (0.314, 0.36, 0.261);
+const float DotSize = 0.123;
+
+//Create colors as uniform variables so they can be easily changed
+//uniform vec3 ModelColor, PolkaDotColor;
+const vec3 ModelColor = vec3 (0.75, 0.2, 0.1);
+const vec3 PolkaDotColor = vec3 (1, 1, 1);
+
+void main(void)
+{
+ float insidesphere, sphereradius, scaledpointlength;
+ vec3 scaledpoint, finalcolor;
+
+ // Scale the coordinate system
+ // The following line of code is not yet implemented in current drivers:
+ // mcpos = mod(Spacing, MCposition);
+ // We will use a workaround found below for now
+ scaledpoint = MCPosition - (Spacing * floor(MCPosition/Spacing));
+
+ // Bring the scaledpoint vector into the center of the scaled coordinate system
+ scaledpoint = scaledpoint - Spacing/2.0;
+
+ // Find the length of the scaledpoint vector and compare it to the dotsize
+ scaledpointlength = length(scaledpoint);
+ insidesphere = step(scaledpointlength,DotSize);
+
+ // Determine final output color before lighting
+ finalcolor = vec3(mix(ModelColor, PolkaDotColor, insidesphere));
+
+ // Output final color and factor in lighting
+ gl_FragColor = clamp((vec4( finalcolor, 1.0 ) * LightIntensity), vec4(0.0), vec4(1.0));
+}
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/polkadot3d.vert b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/polkadot3d.vert
new file mode 100644
index 0000000..86f432f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/polkadot3d.vert
@@ -0,0 +1,58 @@
+// This is the Vertex Shader for three dimensional polka dots.
+//
+// author(s): Joshua Doss
+//
+// Copyright (C) 2002-2004 3Dlabs Inc. Ltd.
+
+//Create uniform variables for lighting to allow user interaction
+//uniform float SpecularContribution;
+//uniform vec3 LightPosition;
+
+const float SpecularContribution = 0.36;
+const vec3 LightPosition = vec3 (0, 4, 5);
+
+varying vec3 MCPosition;
+varying float LightIntensity;
+
+void main(void)
+{
+ float diffusecontribution = 1.0 - SpecularContribution;
+
+ // compute the vertex position in eye coordinates
+ vec3 ecPosition = vec3(gl_ModelViewMatrix * gl_Vertex);
+
+ // compute the transformed normal
+ vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal);
+
+ // compute a vector from the model to the light position
+ vec3 lightVec = normalize(LightPosition - ecPosition);
+
+ // compute the reflection vector
+ vec3 reflectVec = reflect(-lightVec, tnorm);
+
+ // compute a unit vector in direction of viewing position
+ vec3 viewVec = normalize(-ecPosition);
+
+ // calculate amount of diffuse light based on normal and light angle
+ float diffuse = max(dot(lightVec, tnorm), 0.0);
+ float spec = 0.0;
+
+ // if there is diffuse lighting, calculate specular
+ if(diffuse > 0.0)
+ {
+ spec = max(dot(reflectVec, viewVec), 0.0);
+ spec = pow(spec, 16.0);
+ }
+
+ // add up the light sources, since this is a varying (global) it will pass to frag shader
+ LightIntensity = diffusecontribution * diffuse * 1.5 +
+ SpecularContribution * spec;
+
+ // the varying variable MCPosition will be used by the fragment shader to determine where
+ // in model space the current pixel is
+ MCPosition = vec3 (gl_Vertex);
+
+ // send vertex information
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/simple.frag b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/simple.frag
new file mode 100644
index 0000000..51eaaf6
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/simple.frag
@@ -0,0 +1,65 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+
+varying vec4 glFrontColor;
+
+// Simple GLSL fragment program to attenuate the input fragment color as a
+// function of the distance of the fragment position from the center
+// of the window
+
+const float windowSize = 700.0; // TODO: this should be a built-in parameter!
+
+void main()
+{
+ // Compute distance from center in range [0.0, 1.0]
+ vec2 dist = min(abs((gl_FragCoord.xy - (windowSize)/2.0) / windowSize), 1.0);
+ vec2 invDist = 1.0 - dist;
+
+ // Compute attenuation
+ float atten = invDist.x * invDist.y;
+ vec4 outcolor = (gl_Color + gl_SecondaryColor) * atten;
+
+ gl_FragColor = outcolor;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/simple.vert b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/simple.vert
new file mode 100644
index 0000000..f90ef79
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/simple.vert
@@ -0,0 +1,131 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+// A simple GLSL vertex program for handling 2 directional lights with
+// separate specular
+
+varying vec4 glFrontColor;
+
+void directionalLight(
+ in int i,
+ in vec3 normal,
+ inout vec4 ambient,
+ inout vec4 diffuse,
+ inout vec4 specular)
+{
+ // Normalized light direction and half vector
+ // (shouldn't they be pre-normalized?!)
+ vec3 lightDirection = normalize(vec3(gl_LightSource[i].position));
+ vec3 halfVector = normalize(vec3(gl_LightSource[i].halfVector));
+
+ float nDotVP; // normal . light_direction
+ float nDotHV; // normal . light_half_vector
+ float pf; // power factor
+
+ nDotVP = max(0.0, dot(normal, lightDirection));
+ nDotHV = max(0.0, dot(normal, halfVector));
+
+ if (nDotVP == 0.0) {
+ pf = 0.0;
+ }
+ else {
+ pf = pow(nDotHV, gl_FrontMaterial.shininess);
+ }
+
+ ambient += gl_LightSource[i].ambient;
+ diffuse += gl_LightSource[i].diffuse * nDotVP;
+ specular += gl_LightSource[i].specular * pf;
+}
+
+
+const int numEnabledLights = 2; // TODO: this should be a built-in parameter!
+
+void main()
+{
+ //vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;
+ //vec3 ecPosition3 = ecPosition.xyz / ecPosition.w;
+ vec3 tnorm = normalize(vec3(gl_NormalMatrix * gl_Normal));
+ vec4 amb = vec4(0.0);
+ vec4 diff = vec4(0.0);
+ vec4 spec = vec4(0.0);
+ int i;
+
+ // Transform the vertex
+ vec4 outPosition = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ for (i = 0; i < numEnabledLights; i++) {
+ directionalLight(i, tnorm, amb, diff, spec);
+ }
+
+ // Apply the result of the lighting equation
+ vec4 outSecondaryColor = vec4(vec3(spec * gl_FrontMaterial.specular), 1.0);
+ vec3 color0 = vec3(gl_FrontLightModelProduct.sceneColor +
+ amb * gl_FrontMaterial.ambient +
+ diff * gl_FrontMaterial.diffuse);
+
+ // Generate a pseudo-random noise pattern
+ vec3 xyz = clamp((outPosition.xyz + 1.0) * 0.5, 0.0, 1.0);
+
+ xyz = fract(xyz * 262144.0);
+ float randSeed = fract(3.0 * xyz.x + 5.0 * xyz.y + 7.0 * xyz.z);
+
+ vec3 altColor;
+
+ randSeed = fract(37.0 * randSeed);
+ altColor.x = randSeed * 0.5 + 0.5;
+ randSeed = fract(37.0 * randSeed);
+ altColor.y = randSeed * 0.5 + 0.5;
+ randSeed = fract(37.0 * randSeed);
+ altColor.z = randSeed * 0.5 + 0.5;
+ randSeed = fract(37.0 * randSeed);
+ float altAlpha = randSeed * 0.5;
+
+ // Apply noise and output final vertex color
+ vec4 outColor;
+ outColor = vec4(mix(color0, altColor, altAlpha), 1.0);
+
+ gl_FrontColor = outColor;
+ gl_FrontSecondaryColor = outSecondaryColor;
+ gl_Position = outPosition;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/toon.frag b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/toon.frag
new file mode 100644
index 0000000..fa50453
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/toon.frag
@@ -0,0 +1,34 @@
+//
+// Fragment shader for cartoon-style shading
+//
+// Author: Philip Rideout
+//
+// Copyright (c) 2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+//uniform vec3 DiffuseColor;
+//uniform vec3 PhongColor;
+//uniform float Edge;
+//uniform float Phong;
+
+vec3 DiffuseColor = vec3(0.5,0.5,1.0);
+vec3 PhongColor = vec3(0.75,0.75,1.0);
+float Edge = 0.64;
+float Phong = 0.90;
+
+varying vec3 Normal;
+varying vec3 LightDir;
+
+void main (void)
+{
+ vec3 color = DiffuseColor;
+ float f = max( 0.0, dot(LightDir,Normal));
+ if (abs(f) < Edge)
+ color = DiffuseColor * 0.2;
+ if (f > Phong)
+ color = PhongColor;
+
+ gl_FragColor = vec4(color, 1);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/toon.vert b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/toon.vert
new file mode 100644
index 0000000..d044af7
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/toon.vert
@@ -0,0 +1,19 @@
+//
+// Vertex shader for cartoon-style shading
+//
+// Author: Philip Rideout
+//
+// Copyright (c) 2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+varying vec3 Normal;
+varying vec3 LightDir;
+
+void main(void)
+{
+ Normal = normalize(gl_NormalMatrix * gl_Normal);
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ LightDir = vec3(normalize(gl_LightSource[0].position));
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/vertexshader.vert b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/vertexshader.vert
new file mode 100644
index 0000000..43b4a05
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/vertexshader.vert
@@ -0,0 +1,61 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+// A simple GLSL vertex program for demo. vertex attributes
+
+attribute float weight;
+attribute vec3 temperature;
+
+void main()
+{
+ // Transform the vertex
+ vec4 outPosition = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ // Compute color from temperature
+ vec4 outColor;
+ outColor = vec4(temperature * weight, 1);
+ // Assign output parameters
+ gl_FrontColor = outColor;
+ gl_Position = outPosition;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/wood.frag b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/wood.frag
new file mode 100644
index 0000000..eecf91f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/wood.frag
@@ -0,0 +1,66 @@
+//
+// Simple fragment shader for wood
+//
+// Author: John Kessenich
+//
+// Copyright (c) 2002-2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+//uniform float GrainSizeRecip;
+//uniform vec3 DarkColor;
+//uniform vec3 spread;
+const float GrainSizeRecip = 1.0;
+const vec3 DarkColor = vec3 (0.6, 0.3, 0.1);
+const vec3 spread = vec3 (0.15, 0.075, 0.0);
+
+varying float lightIntensity;
+varying vec3 Position;
+
+void main (void)
+{
+ //
+ // cheap noise
+ //
+ vec3 location = Position;
+ vec3 floorvec = vec3(floor(10.0 * Position.x), 0.0, floor(10.0 * Position.z));
+ vec3 noise = Position * 10.0 - floorvec - 0.5;
+ noise *= noise;
+ location += noise * 0.12;
+
+ //
+ // distance from axis
+ //
+ float dist = location.x * location.x + location.z * location.z;
+ float grain = dist * GrainSizeRecip;
+
+ //
+ // grain effects as function of distance
+ //
+ float brightness = fract(grain);
+ if (brightness > 0.5)
+ brightness = (1.0 - brightness);
+ vec3 color = DarkColor + brightness * spread;
+
+ brightness = fract(grain * 7.0);
+ if (brightness > 0.5)
+ brightness = 1.0 - brightness;
+ color -= brightness * spread;
+
+ //
+ // also as a function of lines parallel to the axis
+ //
+ brightness = fract(grain * 47.0) * 0.60;
+ float line = fract(Position.z + Position.x);
+ float snap = floor(line * 20.0) * (1.0/20.0);
+ if (line < snap + 0.006)
+ color -= brightness * spread;
+
+ //
+ // apply lighting effects from vertex processor
+ //
+ color = clamp(color * lightIntensity, 0.0, 1.0);
+
+ gl_FragColor = vec4(color, 1.0);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/glsl_shader/wood.vert b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/wood.vert
new file mode 100644
index 0000000..84651aa
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/glsl_shader/wood.vert
@@ -0,0 +1,25 @@
+//
+// Simple vertex shader for wood
+//
+// Author: John Kessenich
+//
+// Copyright (c) 2002-2004 3Dlabs Inc. Ltd.
+//
+// See 3Dlabs-License.txt for license information
+//
+
+varying float lightIntensity;
+varying vec3 Position;
+//uniform vec3 LightPosition;
+//uniform float Scale;
+const vec3 LightPosition = vec3 (0.0,0.0,0.4);
+const float Scale = 1.0;
+
+void main(void)
+{
+ vec4 pos = gl_ModelViewMatrix * gl_Vertex;
+ Position = vec3(gl_Vertex) * Scale;
+ vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal);
+ lightIntensity = max(dot(normalize(LightPosition - vec3(pos)), tnorm), 0.0) * 1.5;
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/hello_universe/HelloUniverse.form b/src/main/java/org/jdesktop/j3d/examples/hello_universe/HelloUniverse.form
new file mode 100644
index 0000000..48fadea
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/hello_universe/HelloUniverse.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="HelloUniverse"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[250, 250]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/hello_universe/HelloUniverse.java b/src/main/java/org/jdesktop/j3d/examples/hello_universe/HelloUniverse.java
new file mode 100644
index 0000000..a085405
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/hello_universe/HelloUniverse.java
@@ -0,0 +1,176 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.hello_universe;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Point3d;
+
+/**
+ * Simple Java 3D example program to display a spinning cube.
+ */
+public class HelloUniverse extends javax.swing.JFrame {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create the TransformGroup node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at run time. Add it to
+ // the root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // Create a simple Shape3D node; add it to the scene graph.
+ objTrans.addChild(new ColorCube(0.4));
+
+ // Create a new Behavior object that will perform the
+ // desired operation on the specified transform and add
+ // it into the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, 4000);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ rotator.setSchedulingBounds(bounds);
+ objRoot.addChild(rotator);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form HelloUniverse
+ */
+ public HelloUniverse() {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("HelloUniverse");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(250, 250));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new HelloUniverse().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/hello_universe/HelloUniverseGL2ES2.java b/src/main/java/org/jdesktop/j3d/examples/hello_universe/HelloUniverseGL2ES2.java
new file mode 100644
index 0000000..b62906b
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/hello_universe/HelloUniverseGL2ES2.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.hello_universe;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jdesktop.j3d.examples.gl2es2pipeline.Cube;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Point3d;
+
+/**
+ * Simple Java 3D example program to display a spinning cube.
+ */
+public class HelloUniverseGL2ES2 extends javax.swing.JFrame
+{
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ public BranchGroup createSceneGraph()
+ {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create the TransformGroup node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at run time. Add it to
+ // the root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // Create a simple Shape3D node; add it to the scene graph.
+ objTrans.addChild(new Cube(0.4));
+
+ // Create a new Behavior object that will perform the
+ // desired operation on the specified transform and add
+ // it into the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, 4000);
+
+ RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, objTrans, yAxis, 0.0f, (float) Math.PI * 2.0f);
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ rotator.setSchedulingBounds(bounds);
+ objRoot.addChild(rotator);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse()
+ {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form HelloUniverse
+ */
+ public HelloUniverseGL2ES2()
+ {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("HelloUniverse GL2ES2");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(250, 250));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[])
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend", "jogl2es2");
+ System.setProperty("j3d.displaylist", "false");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
+ public void run()
+ {
+ new HelloUniverseGL2ES2().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JCanvas3DExample.form b/src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JCanvas3DExample.form
new file mode 100644
index 0000000..5efa763
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JCanvas3DExample.form
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,2,-35,0,0,3,-13"/>
+ <SyntheticProperty name="formSizePolicy" type="int" value="0"/>
+ <SyntheticProperty name="generateSize" type="boolean" value="true"/>
+ <SyntheticProperty name="generateCenter" type="boolean" value="true"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="2"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JSplitPane" name="splitPane">
+ <Properties>
+ <Property name="dividerLocation" type="int" value="300"/>
+ <Property name="dividerSize" type="int" value="8"/>
+ <Property name="continuousLayout" type="boolean" value="true"/>
+ <Property name="oneTouchExpandable" type="boolean" value="true"/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JScrollPane" name="scrollPane">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
+ <JSplitPaneConstraints position="left"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="panel">
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JButton" name="addButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Create New Frame"/>
+ <Property name="toolTipText" type="java.lang.String" value="Adds a new frame containing an universe into the desktop pane"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="addButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JCheckBox" name="delayCheckBox">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Resize Delayed"/>
+ <Property name="toolTipText" type="java.lang.String" value="Shows the effect of using a delayed resizing to the internal frames."/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JCheckBox" name="interactiveCheckBox">
+ <Properties>
+ <Property name="selected" type="boolean" value="true"/>
+ <Property name="text" type="java.lang.String" value="Interactive Cube"/>
+ <Property name="toolTipText" type="java.lang.String" value="Tests the use of AWT behaviors on the displayed component."/>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="0" left="0" right="0" top="0"/>
+ </Border>
+ </Property>
+ <Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
+ <Insets value="[0, 0, 0, 0]"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="interactiveCheckBoxActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JCheckBox" name="randomCheckBox">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Random start angle"/>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="0" left="0" right="0" top="0"/>
+ </Border>
+ </Property>
+ <Property name="enabled" type="boolean" value="false"/>
+ <Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
+ <Insets value="[0, 0, 0, 0]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JDesktopPane" name="desktopPane">
+ <Properties>
+ <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+ <Color blue="c9" green="99" red="99" type="rgb"/>
+ </Property>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[300, 300]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
+ <JSplitPaneConstraints position="right"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.support.JLayeredPaneSupportLayout"/>
+ </Container>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JCanvas3DExample.java b/src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JCanvas3DExample.java
new file mode 100644
index 0000000..1a83fdd
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JCanvas3DExample.java
@@ -0,0 +1,195 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.jcanvas3d;
+
+
+/**
+ * Simple Java 3D example program that displays universes within lightweight swing components, layed in JInternalFrame objects.
+ */
+import java.awt.Toolkit;
+
+public class JCanvas3DExample extends javax.swing.JFrame implements java.awt.event.ActionListener
+{
+
+ /**
+ * Creates new form JCanvas3DExample
+ */
+ public JCanvas3DExample()
+ {
+ initComponents();
+ Toolkit.getDefaultToolkit().setDynamicLayout( true );
+ setDefaultCloseOperation( EXIT_ON_CLOSE );
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ splitPane = new javax.swing.JSplitPane();
+ scrollPane = new javax.swing.JScrollPane();
+ panel = new javax.swing.JPanel();
+ addButton = new javax.swing.JButton();
+ delayCheckBox = new javax.swing.JCheckBox();
+ interactiveCheckBox = new javax.swing.JCheckBox();
+ randomCheckBox = new javax.swing.JCheckBox();
+ desktopPane = new javax.swing.JDesktopPane();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ splitPane.setDividerLocation(300);
+ splitPane.setDividerSize(8);
+ splitPane.setContinuousLayout(true);
+ splitPane.setOneTouchExpandable(true);
+ panel.setLayout(new java.awt.GridBagLayout());
+
+ addButton.setText("Create New Frame");
+ addButton.setToolTipText("Adds a new frame containing an universe into the desktop pane");
+ addButton.addActionListener(this);
+
+ panel.add(addButton, new java.awt.GridBagConstraints());
+
+ delayCheckBox.setText("Resize Delayed");
+ delayCheckBox.setToolTipText("Shows the effect of using a delayed resizing to the internal frames.");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ panel.add(delayCheckBox, gridBagConstraints);
+
+ interactiveCheckBox.setSelected(true);
+ interactiveCheckBox.setText("Interactive Cube");
+ interactiveCheckBox.setToolTipText("Tests the use of AWT behaviors on the displayed component.");
+ interactiveCheckBox.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ interactiveCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0));
+ interactiveCheckBox.addActionListener(this);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ panel.add(interactiveCheckBox, gridBagConstraints);
+
+ randomCheckBox.setText("Random start angle");
+ randomCheckBox.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ randomCheckBox.setEnabled(false);
+ randomCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0));
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 3;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ panel.add(randomCheckBox, gridBagConstraints);
+
+ scrollPane.setViewportView(panel);
+
+ splitPane.setLeftComponent(scrollPane);
+
+ desktopPane.setBackground(new java.awt.Color(153, 153, 201));
+ desktopPane.setPreferredSize(new java.awt.Dimension(300, 300));
+ splitPane.setRightComponent(desktopPane);
+
+ getContentPane().add(splitPane, java.awt.BorderLayout.CENTER);
+
+ java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
+ setBounds((screenSize.width-1011)/2, (screenSize.height-733)/2, 1011, 733);
+ }
+
+ // Code for dispatching events from components to event handlers.
+
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ if (evt.getSource() == addButton) {
+ JCanvas3DExample.this.addButtonActionPerformed(evt);
+ }
+ else if (evt.getSource() == interactiveCheckBox) {
+ JCanvas3DExample.this.interactiveCheckBoxActionPerformed(evt);
+ }
+ }// </editor-fold>//GEN-END:initComponents
+
+ private void interactiveCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_interactiveCheckBoxActionPerformed
+ randomCheckBox.setEnabled( interactiveCheckBox.isSelected() ? false:true );
+ }//GEN-LAST:event_interactiveCheckBoxActionPerformed
+
+ private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addButtonActionPerformed
+ JInternalWorld iWorld;
+ // we create an internal world to be added within the JDesktop.
+ iWorld = new JInternalWorld( interactiveCheckBox.isSelected(),
+ delayCheckBox.isSelected(),
+ randomCheckBox.isSelected() );
+ iWorld.setSize( 256, 256 );
+ iWorld.setLocation( 50, 50 );
+ iWorld.setResizable( true );
+ desktopPane.add( iWorld );
+ iWorld.setVisible(true);
+ }//GEN-LAST:event_addButtonActionPerformed
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[])
+ {
+ java.awt.EventQueue.invokeLater(new Runnable()
+ {
+ public void run()
+ {
+ new JCanvas3DExample().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton addButton;
+ private javax.swing.JCheckBox delayCheckBox;
+ private javax.swing.JDesktopPane desktopPane;
+ private javax.swing.JCheckBox interactiveCheckBox;
+ private javax.swing.JPanel panel;
+ private javax.swing.JCheckBox randomCheckBox;
+ private javax.swing.JScrollPane scrollPane;
+ private javax.swing.JSplitPane splitPane;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JCanvas3DExampleGL2ES2.java b/src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JCanvas3DExampleGL2ES2.java
new file mode 100644
index 0000000..45dccc0
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JCanvas3DExampleGL2ES2.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.jcanvas3d;
+
+
+/**
+ * Simple Java 3D example program that displays universes within lightweight swing components, layed in JInternalFrame objects.
+ */
+import java.awt.Toolkit;
+
+public class JCanvas3DExampleGL2ES2 extends javax.swing.JFrame implements java.awt.event.ActionListener
+{
+
+ /**
+ * Creates new form JCanvas3DExample
+ */
+ public JCanvas3DExampleGL2ES2()
+ {
+ initComponents();
+ Toolkit.getDefaultToolkit().setDynamicLayout( true );
+ setDefaultCloseOperation( EXIT_ON_CLOSE );
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ splitPane = new javax.swing.JSplitPane();
+ scrollPane = new javax.swing.JScrollPane();
+ panel = new javax.swing.JPanel();
+ addButton = new javax.swing.JButton();
+ delayCheckBox = new javax.swing.JCheckBox();
+ interactiveCheckBox = new javax.swing.JCheckBox();
+ randomCheckBox = new javax.swing.JCheckBox();
+ desktopPane = new javax.swing.JDesktopPane();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ splitPane.setDividerLocation(300);
+ splitPane.setDividerSize(8);
+ splitPane.setContinuousLayout(true);
+ splitPane.setOneTouchExpandable(true);
+ panel.setLayout(new java.awt.GridBagLayout());
+
+ addButton.setText("Create New Frame");
+ addButton.setToolTipText("Adds a new frame containing an universe into the desktop pane");
+ addButton.addActionListener(this);
+
+ panel.add(addButton, new java.awt.GridBagConstraints());
+
+ delayCheckBox.setText("Resize Delayed");
+ delayCheckBox.setToolTipText("Shows the effect of using a delayed resizing to the internal frames.");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ panel.add(delayCheckBox, gridBagConstraints);
+
+ interactiveCheckBox.setSelected(true);
+ interactiveCheckBox.setText("Interactive Cube");
+ interactiveCheckBox.setToolTipText("Tests the use of AWT behaviors on the displayed component.");
+ interactiveCheckBox.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ interactiveCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0));
+ interactiveCheckBox.addActionListener(this);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ panel.add(interactiveCheckBox, gridBagConstraints);
+
+ randomCheckBox.setText("Random start angle");
+ randomCheckBox.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ randomCheckBox.setEnabled(false);
+ randomCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0));
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 3;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ panel.add(randomCheckBox, gridBagConstraints);
+
+ scrollPane.setViewportView(panel);
+
+ splitPane.setLeftComponent(scrollPane);
+
+ desktopPane.setBackground(new java.awt.Color(153, 153, 201));
+ desktopPane.setPreferredSize(new java.awt.Dimension(300, 300));
+ splitPane.setRightComponent(desktopPane);
+
+ getContentPane().add(splitPane, java.awt.BorderLayout.CENTER);
+
+ java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
+ setBounds((screenSize.width-1011)/2, (screenSize.height-733)/2, 1011, 733);
+ }
+
+ // Code for dispatching events from components to event handlers.
+
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ if (evt.getSource() == addButton) {
+ JCanvas3DExampleGL2ES2.this.addButtonActionPerformed(evt);
+ }
+ else if (evt.getSource() == interactiveCheckBox) {
+ JCanvas3DExampleGL2ES2.this.interactiveCheckBoxActionPerformed(evt);
+ }
+ }// </editor-fold>//GEN-END:initComponents
+
+ private void interactiveCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_interactiveCheckBoxActionPerformed
+ randomCheckBox.setEnabled( interactiveCheckBox.isSelected() ? false:true );
+ }//GEN-LAST:event_interactiveCheckBoxActionPerformed
+
+ private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addButtonActionPerformed
+ JInternalWorldGL2ES2 iWorld;
+ // we create an internal world to be added within the JDesktop.
+ iWorld = new JInternalWorldGL2ES2( interactiveCheckBox.isSelected(),
+ delayCheckBox.isSelected(),
+ randomCheckBox.isSelected() );
+ iWorld.setSize( 256, 256 );
+ iWorld.setLocation( 50, 50 );
+ iWorld.setResizable( true );
+ desktopPane.add( iWorld );
+ iWorld.setVisible(true);
+ }//GEN-LAST:event_addButtonActionPerformed
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[])
+ {System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend", "jogl2es2");
+ System.setProperty("j3d.displaylist", "false");
+ java.awt.EventQueue.invokeLater(new Runnable()
+ {
+ public void run()
+ {
+ new JCanvas3DExampleGL2ES2().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton addButton;
+ private javax.swing.JCheckBox delayCheckBox;
+ private javax.swing.JDesktopPane desktopPane;
+ private javax.swing.JCheckBox interactiveCheckBox;
+ private javax.swing.JPanel panel;
+ private javax.swing.JCheckBox randomCheckBox;
+ private javax.swing.JScrollPane scrollPane;
+ private javax.swing.JSplitPane splitPane;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JInternalWorld.java b/src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JInternalWorld.java
new file mode 100644
index 0000000..e702bc2
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JInternalWorld.java
@@ -0,0 +1,232 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.jcanvas3d;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Font;
+
+import javax.swing.JInternalFrame;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Font3D;
+import org.jogamp.java3d.FontExtrusion;
+import org.jogamp.java3d.GraphicsConfigTemplate3D;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Text3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.exp.swing.JCanvas3D;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseRotate;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+
+/**
+ * This is a JInternalFrame holding an universe, which can be configured to
+ * be interactive -that is, where user can interact with object- or automatic
+ * -where the object spins only-. When in automatic mode, spinning speed is
+ * changed so that they look less the same. Changing the spinning start angle
+ * helps unsynchronizing the rotations too.
+ *
+ * @author pepe
+ */
+public class JInternalWorld extends JInternalFrame {
+ /** DOCUMENT ME! */
+ private Component comp;
+
+ /**
+ * Creates a new JInternalWorld object.
+ *
+ * @param isInteractive tells the world to be constructed as interactive
+ * @param isDelayed tells the rotator to start at a random alpha.
+ */
+ public JInternalWorld(boolean isInteractive, boolean isDelayed, boolean isRandom) {
+ super();
+ setSize(256, 256);
+ setClosable(true);
+
+ JCanvas3D canvas = new JCanvas3D(new GraphicsConfigTemplate3D());
+
+ if (true == isDelayed) {
+ canvas.setResizeMode(canvas.RESIZE_DELAYED);
+ }
+
+ comp = canvas;
+
+ Dimension dim = new Dimension(256, 256);
+ comp.setPreferredSize(dim);
+ comp.setSize(dim);
+ getContentPane().setLayout(new BorderLayout());
+ getContentPane().add(comp, BorderLayout.CENTER);
+ pack();
+
+ // Create a simple scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph(isInteractive, isRandom);
+ SimpleUniverse universe = new SimpleUniverse(canvas.getOffscreenCanvas3D()); //TODO: this is awful and must not be done like that in final version
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ universe.getViewingPlatform().setNominalViewingTransform();
+ universe.getViewer().getView().setMinimumFrameCycleTime(30);
+ universe.addBranchGraph(scene);
+ }
+
+ /**
+ * Creates the world. Only exists to cleanup the source a bit
+ *
+ * @param isInteractive tells the world to be constructed as interactive
+ * @param isDelayed tells the rotator to start at a random alpha.
+ *
+ * @return a global branchgroup containing the world, as desired.
+ */
+ private BranchGroup createSceneGraph(boolean isInteractive, boolean isRandom) {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create the TransformGroup node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at run time. Add it to
+ // the root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ Transform3D t3dTrans = new Transform3D();
+ t3dTrans.setTranslation(new Vector3d(0, 0, -1));
+ objTrans.setTransform(t3dTrans);
+
+ TransformGroup objRot = new TransformGroup();
+ objRot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+ objTrans.addChild(objRot);
+
+ // Create a simple Shape3D node; add it to the scene graph.
+ // issue 383: changed the cube to a text, so that any graphical problem related to Yup can be seen.
+ Font3D f3d = new Font3D(new Font("dialog", Font.PLAIN, 1),
+ new FontExtrusion());
+ Text3D text = new Text3D(f3d, "JCanvas3D",
+ new Point3f( -2.3f, -0.5f, 0.f));
+
+ Shape3D sh = new Shape3D();
+ Appearance app = new Appearance();
+ Material mm = new Material();
+ mm.setLightingEnable(true);
+ app.setMaterial(mm);
+ sh.setGeometry(text);
+ sh.setAppearance(app);
+
+ objRot.addChild( sh );
+
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
+ 100.0);
+
+ // Set up the ambient light
+ Color3f ambientColor = new Color3f(0.3f, 0.3f, 0.3f);
+ AmbientLight ambientLightNode = new AmbientLight(ambientColor);
+ ambientLightNode.setInfluencingBounds(bounds);
+ objRoot.addChild(ambientLightNode);
+
+ // Set up the directional lights
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);
+ Color3f light2Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
+
+ DirectionalLight light1
+ = new DirectionalLight(light1Color, light1Direction);
+ light1.setInfluencingBounds(bounds);
+ objRoot.addChild(light1);
+
+ DirectionalLight light2
+ = new DirectionalLight(light2Color, light2Direction);
+ light2.setInfluencingBounds(bounds);
+ objRoot.addChild(light2);
+
+
+ if (true == isInteractive) {
+ MouseRotate mr = new MouseRotate(comp, objRot);
+ mr.setSchedulingBounds(bounds);
+ mr.setSchedulingInterval(1);
+ objRoot.addChild(mr);
+ } else {
+ // Create a new Behavior object that will perform the
+ // desired operation on the specified transform and add
+ // it into the scene graph.
+ Transform3D yAxis = new Transform3D();
+
+ // rotation speed is randomized a bit so that it does not go at the same speed on every canvases,
+ // which will make it more natural and express the differences between every present universes
+ Alpha rotationAlpha = null;
+
+ if (true == isRandom) {
+ int duration = Math.max(2000, (int) (Math.random() * 8000.));
+ rotationAlpha = new Alpha(-1,
+ (int) ((double) duration * Math.random()), 0, duration,
+ 0, 0);
+ } else {
+ rotationAlpha = new Alpha(-1, 4000);
+ }
+
+ RotationInterpolator rotator = new RotationInterpolator(rotationAlpha,
+ objRot, yAxis, 0.0f, (float) Math.PI * 2.0f);
+
+ rotator.setSchedulingBounds(bounds);
+ objRoot.addChild(rotator);
+ }
+
+ return objRoot;
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JInternalWorldGL2ES2.java b/src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JInternalWorldGL2ES2.java
new file mode 100644
index 0000000..d38dc6e
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/jcanvas3d/JInternalWorldGL2ES2.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.jcanvas3d;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Font;
+
+import javax.swing.JInternalFrame;
+
+import org.jdesktop.j3d.examples.gl2es2pipeline.SimpleShaderAppearance;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Font3D;
+import org.jogamp.java3d.FontExtrusion;
+import org.jogamp.java3d.GraphicsConfigTemplate3D;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Text3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.exp.swing.JCanvas3D;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseRotate;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+
+/**
+ * This is a JInternalFrame holding an universe, which can be configured to
+ * be interactive -that is, where user can interact with object- or automatic
+ * -where the object spins only-. When in automatic mode, spinning speed is
+ * changed so that they look less the same. Changing the spinning start angle
+ * helps unsynchronizing the rotations too.
+ *
+ * @author pepe
+ */
+public class JInternalWorldGL2ES2 extends JInternalFrame {
+ /** DOCUMENT ME! */
+ private Component comp;
+
+ /**
+ * Creates a new JInternalWorld object.
+ *
+ * @param isInteractive tells the world to be constructed as interactive
+ * @param isDelayed tells the rotator to start at a random alpha.
+ */
+ public JInternalWorldGL2ES2(boolean isInteractive, boolean isDelayed, boolean isRandom) {
+ super();
+ setSize(256, 256);
+ setClosable(true);
+
+ JCanvas3D canvas = new JCanvas3D(new GraphicsConfigTemplate3D());
+
+ if (true == isDelayed) {
+ canvas.setResizeMode(canvas.RESIZE_DELAYED);
+ }
+
+ comp = canvas;
+
+ Dimension dim = new Dimension(256, 256);
+ comp.setPreferredSize(dim);
+ comp.setSize(dim);
+ getContentPane().setLayout(new BorderLayout());
+ getContentPane().add(comp, BorderLayout.CENTER);
+ pack();
+
+ // Create a simple scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph(isInteractive, isRandom);
+ SimpleUniverse universe = new SimpleUniverse(canvas.getOffscreenCanvas3D()); //TODO: this is awful and must not be done like that in final version
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ universe.getViewingPlatform().setNominalViewingTransform();
+ universe.getViewer().getView().setMinimumFrameCycleTime(30);
+ universe.addBranchGraph(scene);
+ }
+
+ /**
+ * Creates the world. Only exists to cleanup the source a bit
+ *
+ * @param isInteractive tells the world to be constructed as interactive
+ * @param isDelayed tells the rotator to start at a random alpha.
+ *
+ * @return a global branchgroup containing the world, as desired.
+ */
+ private BranchGroup createSceneGraph(boolean isInteractive, boolean isRandom) {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create the TransformGroup node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at run time. Add it to
+ // the root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ Transform3D t3dTrans = new Transform3D();
+ t3dTrans.setTranslation(new Vector3d(0, 0, -1));
+ objTrans.setTransform(t3dTrans);
+
+ TransformGroup objRot = new TransformGroup();
+ objRot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+ objTrans.addChild(objRot);
+
+ // Create a simple Shape3D node; add it to the scene graph.
+ // issue 383: changed the cube to a text, so that any graphical problem related to Yup can be seen.
+ Font3D f3d = new Font3D(new Font("dialog", Font.PLAIN, 1),
+ new FontExtrusion());
+ Text3D text = new Text3D(f3d, "JCanvas3D",
+ new Point3f( -2.3f, -0.5f, 0.f));
+
+ Shape3D sh = new Shape3D();
+ Appearance app = new SimpleShaderAppearance(false,false);
+ Material mm = new Material();
+ mm.setLightingEnable(true);
+ app.setMaterial(mm);
+ sh.setGeometry(text);
+ sh.setAppearance(app);
+
+ objRot.addChild( sh );
+
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
+ 100.0);
+
+ // Set up the ambient light
+ Color3f ambientColor = new Color3f(0.3f, 0.3f, 0.3f);
+ AmbientLight ambientLightNode = new AmbientLight(ambientColor);
+ ambientLightNode.setInfluencingBounds(bounds);
+ objRoot.addChild(ambientLightNode);
+
+ // Set up the directional lights
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);
+ Color3f light2Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
+
+ DirectionalLight light1
+ = new DirectionalLight(light1Color, light1Direction);
+ light1.setInfluencingBounds(bounds);
+ objRoot.addChild(light1);
+
+ DirectionalLight light2
+ = new DirectionalLight(light2Color, light2Direction);
+ light2.setInfluencingBounds(bounds);
+ objRoot.addChild(light2);
+
+
+ if (true == isInteractive) {
+ MouseRotate mr = new MouseRotate(comp, objRot);
+ mr.setSchedulingBounds(bounds);
+ mr.setSchedulingInterval(1);
+ objRoot.addChild(mr);
+ } else {
+ // Create a new Behavior object that will perform the
+ // desired operation on the specified transform and add
+ // it into the scene graph.
+ Transform3D yAxis = new Transform3D();
+
+ // rotation speed is randomized a bit so that it does not go at the same speed on every canvases,
+ // which will make it more natural and express the differences between every present universes
+ Alpha rotationAlpha = null;
+
+ if (true == isRandom) {
+ int duration = Math.max(2000, (int) (Math.random() * 8000.));
+ rotationAlpha = new Alpha(-1,
+ (int) ((double) duration * Math.random()), 0, duration,
+ 0, 0);
+ } else {
+ rotationAlpha = new Alpha(-1, 4000);
+ }
+
+ RotationInterpolator rotator = new RotationInterpolator(rotationAlpha,
+ objRot, yAxis, 0.0f, (float) Math.PI * 2.0f);
+
+ rotator.setSchedulingBounds(bounds);
+ objRoot.addChild(rotator);
+ }
+
+ return objRoot;
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/lightwave/README.txt b/src/main/java/org/jdesktop/j3d/examples/lightwave/README.txt
new file mode 100644
index 0000000..6ae5ce6
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/lightwave/README.txt
@@ -0,0 +1,321 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+ Release Notes for the Lightwave 3D Java3D Loader
+ ------------------------------------------------
+ Updated May 13, 1998
+
+
+
+These release notes are intended to document the known working and
+non-working features of the loader. This is important because the loader
+implements an important subset of Lightwave functionality, but it definitely
+skips many major features of Lightwave files. Please read these notes
+to make sure that the features you need are actually implemented. Or
+if you see differences between Lightwave display of your file and
+the Java3D version of that file, take a look at these notes to see
+what might not be working properly.
+
+
+Testing the Loader
+------------------
+The application in this directory (Viewer) is intended to be a very
+basic test application for loading/viewing Lightwave 3D models. To
+use the program, type:
+ java Viewer <filename>
+where <filename> is the name of a valid Lightwave 3D scene file that is
+reachable from the current directory. There is a very basic test file
+included in this directory called ballcone.lws. To load/view that file,
+type:
+ java Viewer ballcone.lws
+Note that Lightwave scene files (*.lws) embed the pathnames to object
+files (*.lwo) within them, and that object files have pathnames
+to image files (for textures) embedded in them. Whatever those
+pathnames are in those files must be valid for the directory in which
+you are running the application that loads the scene file. For example,
+if I was loading in a scene file that referred to an object file
+called "data/object.lwo", then the file "object.lwo" should be located in
+a subdirectory of this current directory called "data".
+
+
+Summary of Loader
+-----------------
+The Lw3d loader was intended to implement a major subset of the features in
+Lightwave 3D that would be used for realtime 3D animations. That is, any
+features (such as Bones and other high-end rendering
+options) which would require significant rendering time were simply
+not doable. These more advanced features are intended to be rendered
+off-line, saving each frame separately and later compositing them
+together into an animation. But Java3D is a realtime 3D rendering
+system, so these type of animations just do not map into a Java3D viewer
+very well.
+
+Another category of non-implemented items are those that we simply have not
+yet gotten to. There are a few known features of Lightwave files that
+would work well through Java3D but just haven't been implemented in the
+loader yet.
+
+Although there are a lot of features that are not yet implemented,
+the basics of Lightwave 3D functionality (scene creation, animating
+objects/lights/cameras, different surface properties) all work pretty
+much as expected. So try it out and let us know non-documented items
+that didn't work properly.
+
+
+Details of Non-Implemented Features
+-----------------------------------
+This list is probably not comprehensive, but hopefully points out most of
+the features or areas where the implementation is incomplete (or not
+there at all).
+
+
+Limitations of Scene Files (*.lws)
+----------------------------------
+1) Bones/Skeleton
+Bones functionality is not implemented at all. Unfortunately, this
+great feature of Lightwave 3D is not currently implementable in the
+loader because the processing time that it would take to compute
+frames based on Bones data would be far more than a real-time rendering
+system can afford.
+
+The loader may, at some future point, provide a mechanism to read
+in frames of geometry that were saved from Lightwave Bones descriptions.
+That is, there are plug-ins available for Lightwave 3D that allow you
+to save out files with Bones information as a series of files with
+pre-calculated geometry for each frame; eventually we would like the
+Lightwave 3D loader to support those files.
+
+Workaround: None; the best and only workaround is to find a different
+method of animating your objects.
+
+
+2) Spline paths
+Spline paths will be interpreted as linear piecewise paths instead,
+traveling between each control point specified for the spline.
+
+Workaround: Specify linear paths. If your path looks too hard-jointed
+through the loader, specify more keyframes for the path to smooth it out.
+
+
+3) Object Scaling
+Scaling objects in the scene (versus the object files) is currently
+ignored.
+
+Workaround: scale the objects in their individual object files.
+
+
+4) Shadows
+Shadows options are ignored in the loader.
+
+Workaround: None.
+
+
+5) Envelopes
+Most envelopes are ignored. There are a couple of exceptions to this,
+such as light intensity envelopes, but even those features have not been
+completely implemented and tested.
+
+Workaround: None.
+
+
+6) Camera effects
+All advanced-rendering camera effects are ignored in the loader. This
+includes the following items in Lightwave 3D files:
+ - Lens Flare
+ - F-stop
+ - Focal Distance
+ - Blur Length
+ - Dissolves
+ - Glow
+ - Zoom
+ - Intensity Falloff
+ - Antialiasing
+
+Workaround: None.
+
+
+7) Inverse Kinematics
+IK options such as Goal Objects and Anchors are ignored.
+
+Workaround: Animate objects directly instead of indirectly via IK.
+
+
+8) Morphs
+All morph options are ignored.
+
+Workaround: None.
+
+
+9) Display properties
+Lightwave allows you to specify surface properties for different rendering
+modes (e.g., wireframe color). All of these parameters are ignored and
+the full properties of any item are used at all times.
+
+Workaround: None.
+
+
+10) Various Surface Properties
+Various minor surface properties are currently ignored, including:
+ - Polygon size
+ - Dissolves
+ - Clip map
+ - Unaffected by fog
+ - Edge parameters
+
+Workaround: None.
+
+
+11) Lights
+The following items are currently ignored for Light objects:
+ - Target objects
+ - Flare parameters
+ - Shadow options
+
+Workaround: None for flares or shadows. For targeting problems, animate the
+light directly (versus indirectly through using Target).
+
+
+12) Camera Targeting
+The Target option for Camera objects is currently ignored by the loader.
+
+Workaround: Animate the camera directly (versus indirectly through using
+Target).
+
+
+13) Effects
+Most effects (from the Effects dialog box in the layout program) are
+ignored, save for fog (which should accept all parameters) and
+backdrop colors (solid backdrops only - gradient backdrops are
+ignored).
+
+Workaround: None.
+
+
+14) Render Options
+Most options from the Render dialog box are ignored - most of these pertain
+to saving the animation in any case (something that doesn't happen through
+the Loader).
+
+Workaround: None.
+
+
+
+Limitations of Object Files (*.lwo)
+-----------------------------------
+1) MetaNURBS
+Geometry stored in MetaNURBS format will be ignored by the loader.
+
+Workaround: pre-tessellate your MetaNURBS surfaces and save your
+geometry (object) files in that format.
+
+
+2) Layered Object Files
+There is currently no support for the "Layered Object File Format"
+of Lightwave 3D.
+
+Workaround: None.
+
+
+3) Reflectivity
+There is no way to reproduce the reflective properties of surfaces
+through Java3D, so any reflectivity settings in Lightwave object files
+will be ignored.
+
+Workaround: None.
+
+
+4) Refraction
+Refractive properties of surfaces are ignored.
+
+Workaround: None.
+
+
+5) Edge Transparency
+Edge transparency properties are ignored.
+
+Workaround. None.
+
+
+6) Texture types
+Texture mapping is currently somewhat limited in the loader. The following
+types of texture mapping effects should work:
+ - Diffuse (the texture modifies the Diffuse aspects of the surface)
+ - Color (the texture modifies the Color properties of the surface).
+Textures that attempt to modify other parameters of the surface will
+be ignored.
+
+Also, the following texture types should work:
+ - Planar Image Map
+ - Spherical Image Map
+ - Cylindrical Image Map
+Other kinds of mappings will not work (including Marble, Grid, Dots, etc.)
+
+Some Texture parameters will not work. The following should work correctly:
+ - size
+ - center
+Advanced texture parameters such as falloff and velocity will be ignored.
+
+Summary: There are so many texture mapping parameters in Lightwave 3D that
+it's difficult to produce a list of all of the items that won't work
+properly. In a nutshell, basic decal-type (color modifying) or brightness
+(diffuse modifying) textures that are mapped as planes, spheres, or
+cylinders should work correctly. Anything else will probably not work.
+
+Workaround: Use the basics.
+
+
+7) Plug-ins
+There is currently no support for any plug-in capabilities. For example,
+if there are plug-in shaders specified for your file, those shaders will be
+ignored.
+
+Workaround: None.
+
+
+8) Image Sequences
+There is no support for image sequences - textures must be static files.
+
+Workaround: None.
+
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/lightwave/Viewer.java b/src/main/java/org/jdesktop/j3d/examples/lightwave/Viewer.java
new file mode 100644
index 0000000..063c7cc
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/lightwave/Viewer.java
@@ -0,0 +1,206 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.lightwave;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.View;
+import org.jogamp.java3d.loaders.Loader;
+import org.jogamp.java3d.loaders.Scene;
+import org.jogamp.java3d.loaders.lw3d.Lw3dLoader;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Matrix4d;
+
+
+/**
+ * This class loads in a Lightwave3D file and displays it in an applet
+ * window. The application is fairly basic; a more complete version
+ * of a Lightwave 3D loader might incorporate features such as
+ * settable clip plane distances and animated views (these are both
+ * possible with the current Lightwave 3D loader, they just need to
+ * be implemented in the application).
+ */
+public class Viewer extends Applet {
+
+ private java.net.URL filename;
+ private SimpleUniverse u;
+
+ public Viewer(java.net.URL url) {
+ filename = url;
+ }
+
+ public Viewer() {}
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ if (filename == null) {
+ // the path to the file for an applet
+ try {
+ java.net.URL path = getCodeBase();
+ filename = new java.net.URL(path.toString() +
+ "./ballcone.lws");
+ }
+ catch (java.net.MalformedURLException ex) {
+ System.err.println(ex.getMessage());
+ ex.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ // Construct the Lw3d loader and load the file
+ Loader lw3dLoader = new Lw3dLoader(Loader.LOAD_ALL);
+ Scene loaderScene = null;
+ try {
+ loaderScene = lw3dLoader.load(filename);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ System.exit(1);
+ }
+
+ // Construct the applet canvas
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+
+ // Create a basic universe setup and the root of our scene
+ u = new SimpleUniverse(c);
+ BranchGroup sceneRoot = new BranchGroup();
+
+ // Change the back clip distance; the default is small for
+ // some lw3d worlds
+ View theView = u.getViewer().getView();
+ theView.setBackClipDistance(50000f);
+
+ // Now add the scene graph defined in the lw3d file
+ if (loaderScene.getSceneGroup() != null) {
+ // Instead of using the default view location (which may be
+ // completely bogus for the particular file you're loading),
+ // let's use the initial view from the file. We can get
+ // this by getting the view groups from the scene (there's
+ // only one for Lightwave 3D), then using the inverse of the
+ // transform on that view as the transform for the entire scene.
+
+ // First, get the view groups (shouldn't be null unless there
+ // was something wrong in the load
+ TransformGroup viewGroups[] = loaderScene.getViewGroups();
+
+ // Get the Transform3D from the view and invert it
+ Transform3D t = new Transform3D();
+ viewGroups[0].getTransform(t);
+ Matrix4d m = new Matrix4d();
+ t.get(m);
+ m.invert();
+ t.set(m);
+
+ // Now we've got the transform we want. Create an
+ // appropriate TransformGroup and parent the scene to it.
+ // Then insert the new group into the main BranchGroup.
+ TransformGroup sceneTransform = new TransformGroup(t);
+ sceneTransform.addChild(loaderScene.getSceneGroup());
+ sceneRoot.addChild(sceneTransform);
+ }
+
+ // Make the scene graph live by inserting the root into the universe
+ u.addBranchGraph(sceneRoot);
+ }
+
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ private static void usage() {
+ System.out.println("Usage: java Viewer <.lws>") ;
+ System.exit(0) ;
+ }
+
+ /**
+ * The main method of the application takes one argument in the
+ * args array; the filname that you want to load. Note that the
+ * file must be reachable from the directory in which you're running
+ * this application.
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.net.URL url = null;
+ java.net.URL pathUrl = null;
+ if (args.length > 0) {
+ try {
+ if ((args[0].indexOf("file:") == 0) ||
+ (args[0].indexOf("http") == 0)) {
+ url = new java.net.URL(args[0]);
+ }
+ else if (args[0].charAt(0) != '/') {
+ url = new java.net.URL("file:./" + args[0]);
+ }
+ else {
+ url = new java.net.URL("file:" + args[0]);
+ }
+ }
+ catch (java.net.MalformedURLException ex) {
+ System.err.println(ex.getMessage());
+ ex.printStackTrace();
+ System.exit(1);
+ }
+ }
+ else {
+ usage();
+ }
+ new MainFrame(new Viewer(url), 500, 500);
+ }
+}
+
+
+
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/lod/LOD.form b/src/main/java/org/jdesktop/j3d/examples/lod/LOD.form
new file mode 100644
index 0000000..7bba785
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/lod/LOD.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="LOD"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/lod/LOD.java b/src/main/java/org/jdesktop/j3d/examples/lod/LOD.java
new file mode 100644
index 0000000..67aac84
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/lod/LOD.java
@@ -0,0 +1,235 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.lod;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.DistanceLOD;
+import org.jogamp.java3d.Switch;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * Simple Java 3D example program to display a spinning cube.
+ */
+public class LOD extends javax.swing.JFrame {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ createLights(objRoot);
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ objRoot.addChild(objTrans);
+
+ // Create a switch to hold the different levels of detail
+ Switch sw = new Switch(0);
+ sw.setCapability(Switch.ALLOW_SWITCH_READ);
+ sw.setCapability(Switch.ALLOW_SWITCH_WRITE);
+
+
+ // Create several levels for the switch, with less detailed
+ // spheres for the ones which will be used when the sphere is
+ // further away
+ sw.addChild(new Sphere(0.4f, Sphere.GENERATE_NORMALS, 40));
+ sw.addChild(new Sphere(0.4f, Sphere.GENERATE_NORMALS, 20));
+ sw.addChild(new Sphere(0.4f, Sphere.GENERATE_NORMALS, 10));
+ sw.addChild(new Sphere(0.4f, Sphere.GENERATE_NORMALS, 3));
+
+ // Add the switch to the main group
+ objTrans.addChild(sw);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // set up the DistanceLOD behavior
+ float[] distances = new float[3];
+ distances[0] = 5.0f;
+ distances[1] = 10.0f;
+ distances[2] = 25.0f;
+ DistanceLOD lod = new DistanceLOD(distances);
+ lod.addSwitch(sw);
+ lod.setSchedulingBounds(bounds);
+ objTrans.addChild(lod);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private void createLights(BranchGroup graphRoot) {
+
+ // Create a bounds for the light source influence
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the global, ambient light
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+ AmbientLight aLgt = new AmbientLight(alColor);
+ aLgt.setInfluencingBounds(bounds);
+ graphRoot.addChild(aLgt);
+
+ // Set up the directional (infinite) light source
+ Color3f lColor1 = new Color3f(0.9f, 0.9f, 0.9f);
+ Vector3f lDir1 = new Vector3f(1.0f, 1.0f, -1.0f);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ lgt1.setInfluencingBounds(bounds);
+ graphRoot.addChild(lgt1);
+ }
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // only add zoom mouse behavior to viewingPlatform
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ // add orbit behavior to the ViewingPlatform, but disable rotate
+ // and translate
+ OrbitBehavior orbit = new OrbitBehavior(c,
+ OrbitBehavior.REVERSE_ZOOM |
+ OrbitBehavior.DISABLE_ROTATE |
+ OrbitBehavior.DISABLE_TRANSLATE);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form LOD
+ */
+ public LOD() {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("LOD");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new LOD().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/model_clip/ModelClipTest.java b/src/main/java/org/jdesktop/j3d/examples/model_clip/ModelClipTest.java
new file mode 100644
index 0000000..618b7f2
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/model_clip/ModelClipTest.java
@@ -0,0 +1,190 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.model_clip;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.ModelClip;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseRotate;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseZoom;
+import org.jogamp.java3d.utils.geometry.Cylinder;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+import org.jogamp.vecmath.Vector4d;
+
+/**
+ * ModelClipTest draws a cylinder and creates two clip planes
+ * to see the interior of the cylinder.
+ */
+public class ModelClipTest extends Applet {
+
+ private SimpleUniverse u = null;
+
+ public BranchGroup createSceneGraph()
+ {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // This Transformgroup is used by the mouse manipulators to
+ // move the CYlinder.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ objScale.addChild(objTrans);
+
+ //Create Model Clip
+ ModelClip mc = new ModelClip();
+ boolean enables[] = {false, false, false, false, false, false};
+ Vector4d eqn1 = new Vector4d(0.0, 1.0, 0.0, 0.0);
+ Vector4d eqn2 = new Vector4d(1.0, 1.0, 0.0, 0.0);
+ mc.setEnables(enables);
+ mc.setPlane(1, eqn1);
+ mc.setPlane(2, eqn2);
+ mc.setEnable(1, true);
+ mc.setEnable(2, true);
+ mc.setInfluencingBounds(bounds);
+ objTrans.addChild(mc);
+
+ //Create a cylinder
+ PolygonAttributes attr = new PolygonAttributes();
+ attr.setCullFace(PolygonAttributes.CULL_NONE);
+ Appearance ap = new Appearance();
+ Material mat = new Material();
+ mat.setLightingEnable(true);
+ ap.setMaterial(mat);
+ ap.setPolygonAttributes(attr);
+
+ Cylinder CylinderObj = new Cylinder(1.0f, 2.0f, ap);
+ objTrans.addChild(CylinderObj);
+
+ // Create the rotate behavior node
+ MouseRotate behavior = new MouseRotate(objTrans);
+ objTrans.addChild(behavior);
+ behavior.setSchedulingBounds(bounds);
+
+ // Create the zoom behavior node
+ MouseZoom behavior2 = new MouseZoom(objTrans);
+ objTrans.addChild(behavior2);
+ behavior2.setSchedulingBounds(bounds);
+
+ //Shine it with two colored lights.
+ Color3f lColor1 = new Color3f(0.5f, 0.0f, 0.5f);
+ Color3f lColor2 = new Color3f(0.7f, 0.7f, 0.0f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, 1.0f);
+ Vector3f lDir2 = new Vector3f(0.0f, 0.0f, -1.0f);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ DirectionalLight lgt2 = new DirectionalLight(lColor2, lDir2);
+ lgt1.setInfluencingBounds(bounds);
+ lgt2.setInfluencingBounds(bounds);
+ objScale.addChild(lgt1);
+ objScale.addChild(lgt2);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ public ModelClipTest (){
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+
+ // Create a simple scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph();
+ u = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+
+ u.addBranchGraph(scene);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+
+ public static void main(String argv[])
+ {
+
+ BranchGroup group;
+
+ new MainFrame(new ModelClipTest(), 500, 500);
+ }
+}
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/model_clip/ModelClipTest2.java b/src/main/java/org/jdesktop/j3d/examples/model_clip/ModelClipTest2.java
new file mode 100644
index 0000000..ef5a407
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/model_clip/ModelClipTest2.java
@@ -0,0 +1,213 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.model_clip;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.ModelClip;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseRotate;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseZoom;
+import org.jogamp.java3d.utils.geometry.Box;
+import org.jogamp.java3d.utils.geometry.Cylinder;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.AxisAngle4f;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+import org.jogamp.vecmath.Vector4d;
+
+/**
+ * ModelClipTest2 draws a cylinder and creates two clip planes
+ * to see the interior of the cylinder. It also has a behavior to
+ * move the clip planes.
+ */
+public class ModelClipTest2 extends Applet {
+
+ private SimpleUniverse u;
+
+ public BranchGroup createSceneGraph()
+ {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create lights
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ //Shine it with two colored lights.
+ Color3f lColor0 = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f lColor1 = new Color3f(0.5f, 0.0f, 0.5f);
+ Color3f lColor2 = new Color3f(0.7f, 0.7f, 0.0f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, 1.0f);
+ Vector3f lDir2 = new Vector3f(0.0f, 0.0f, -1.0f);
+
+ AmbientLight lgt0 = new AmbientLight(true, lColor2);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ DirectionalLight lgt2 = new DirectionalLight(lColor2, lDir2);
+ lgt0.setInfluencingBounds(bounds);
+ lgt1.setInfluencingBounds(bounds);
+ lgt2.setInfluencingBounds(bounds);
+ objScale.addChild(lgt0);
+ objScale.addChild(lgt1);
+ objScale.addChild(lgt2);
+
+ // Create a Transformgroup for the geometry
+ TransformGroup objRot = new TransformGroup();
+ Transform3D t3d1 = new Transform3D();
+ AxisAngle4f rot1 = new AxisAngle4f(0.0f, 1.0f, 0.0f, 45.0f);
+ t3d1.setRotation(rot1);
+ objRot.setTransform(t3d1);
+ objScale.addChild(objRot);
+
+
+ //Create a cylinder
+ PolygonAttributes attr = new PolygonAttributes();
+ attr.setCullFace(PolygonAttributes.CULL_NONE);
+ Appearance ap = new Appearance();
+ Material mat = new Material();
+ mat.setLightingEnable(true);
+ ap.setMaterial(mat);
+ ap.setPolygonAttributes(attr);
+
+ Cylinder CylinderObj = new Cylinder(0.5f, 2.2f, ap);
+ objRot.addChild(CylinderObj);
+
+ //Create a box
+ Box BoxObj = new Box(0.8f, 0.8f, 0.8f, ap);
+ objRot.addChild(BoxObj);
+
+
+ // This Transformgroup is used by the mouse manipulators to
+ // move the model clip planes.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ objRot.addChild(objTrans);
+
+ // Create the rotate behavior node
+ MouseRotate behavior = new MouseRotate(objTrans);
+ objTrans.addChild(behavior);
+ behavior.setSchedulingBounds(bounds);
+
+ // Create the zoom behavior node
+ MouseZoom behavior2 = new MouseZoom(objTrans);
+ objTrans.addChild(behavior2);
+ behavior2.setSchedulingBounds(bounds);
+
+ //Create Model Clip
+ ModelClip mc = new ModelClip();
+ boolean enables[] = {false, false, false, false, false, false};
+ Vector4d eqn = new Vector4d(0.0, 1.0, 1.0, 0.0);
+ mc.setEnables(enables);
+ mc.setPlane(1, eqn);
+ mc.setEnable(1, true);
+ mc.setInfluencingBounds(bounds);
+ objTrans.addChild(mc);
+
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ public ModelClipTest2 (){
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+
+ // Create a simple scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph();
+ u = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+
+ u.addBranchGraph(scene);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+
+
+ public static void main(String argv[])
+ {
+
+ BranchGroup group;
+
+ new MainFrame(new ModelClipTest2(), 500, 500);
+ }
+}
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/morphing/ColorCube.java b/src/main/java/org/jdesktop/j3d/examples/morphing/ColorCube.java
new file mode 100644
index 0000000..df36e9d
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/morphing/ColorCube.java
@@ -0,0 +1,122 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.morphing;
+
+import org.jogamp.java3d.QuadArray;
+
+class ColorCube extends QuadArray {
+ private static final float[] verts = {
+ // front face
+ 1.0f, -1.0f, 1.0f,
+ 1.0f, 1.0f, 1.0f,
+ -1.0f, 1.0f, 1.0f,
+ -1.0f, -1.0f, 1.0f,
+ // back face
+ -1.0f, -1.0f, -1.0f,
+ -1.0f, 1.0f, -1.0f,
+ 1.0f, 1.0f, -1.0f,
+ 1.0f, -1.0f, -1.0f,
+ // right face
+ 1.0f, -1.0f, -1.0f,
+ 1.0f, 1.0f, -1.0f,
+ 1.0f, 1.0f, 1.0f,
+ 1.0f, -1.0f, 1.0f,
+ // left face
+ -1.0f, -1.0f, 1.0f,
+ -1.0f, 1.0f, 1.0f,
+ -1.0f, 1.0f, -1.0f,
+ -1.0f, -1.0f, -1.0f,
+ // top face
+ 1.0f, 1.0f, 1.0f,
+ 1.0f, 1.0f, -1.0f,
+ -1.0f, 1.0f, -1.0f,
+ -1.0f, 1.0f, 1.0f,
+ // bottom face
+ -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 static final float[] colors = {
+ // front face (red)
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ // back face (green)
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ // right face (blue)
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ // left face (yellow)
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ // top face (magenta)
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ // bottom face (cyan)
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ };
+
+ ColorCube() {
+ super(24, QuadArray.COORDINATES | QuadArray.COLOR_3);
+
+ setCoordinates(0, verts);
+ setColors(0, colors);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/morphing/ColorPyramidDown.java b/src/main/java/org/jdesktop/j3d/examples/morphing/ColorPyramidDown.java
new file mode 100644
index 0000000..89d1a8b
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/morphing/ColorPyramidDown.java
@@ -0,0 +1,122 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.morphing;
+
+import org.jogamp.java3d.QuadArray;
+
+class ColorPyramidDown extends QuadArray {
+ private static final float[] verts = {
+ // front face
+ 0.0f, -1.0f, 0.0f,
+ 1.0f, 1.0f, 1.0f,
+ -1.0f, 1.0f, 1.0f,
+ 0.0f, -1.0f, 0.0f,
+ // back face
+ 0.0f, -1.0f, 0.0f,
+ -1.0f, 1.0f, -1.0f,
+ 1.0f, 1.0f, -1.0f,
+ 0.0f, -1.0f, 0.0f,
+ // right face
+ 0.0f, -1.0f, 0.0f,
+ 1.0f, 1.0f, -1.0f,
+ 1.0f, 1.0f, 1.0f,
+ 0.0f, -1.0f, 0.0f,
+ // left face
+ 0.0f, -1.0f, 0.0f,
+ -1.0f, 1.0f, 1.0f,
+ -1.0f, 1.0f, -1.0f,
+ 0.0f, -1.0f, 0.0f,
+ // top face
+ 1.0f, 1.0f, 1.0f,
+ 1.0f, 1.0f, -1.0f,
+ -1.0f, 1.0f, -1.0f,
+ -1.0f, 1.0f, 1.0f,
+ // bottom face
+ 0.0f, -1.0f, 0.0f,
+ 0.0f, -1.0f, 0.0f,
+ 0.0f, -1.0f, 0.0f,
+ 0.0f, -1.0f, 0.0f,
+ };
+
+ private static final float[] colors = {
+ // front face (green)
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ // back face (red)
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ // right face (yellow)
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ // left face (magenta)
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ // top face (blue)
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ // bottom face (cyan)
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ };
+
+ ColorPyramidDown() {
+ super(24, QuadArray.COORDINATES | QuadArray.COLOR_3);
+
+ setCoordinates(0, verts);
+ setColors(0, colors);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/morphing/ColorPyramidUp.java b/src/main/java/org/jdesktop/j3d/examples/morphing/ColorPyramidUp.java
new file mode 100644
index 0000000..b94e6f0
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/morphing/ColorPyramidUp.java
@@ -0,0 +1,124 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.morphing;
+
+import org.jogamp.java3d.QuadArray;
+
+class ColorPyramidUp extends QuadArray {
+ private static final float[] verts = {
+ // front face
+ 1.0f, -1.0f, 1.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ -1.0f, -1.0f, 1.0f,
+ // back face
+ -1.0f, -1.0f, -1.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 1.0f, -1.0f, -1.0f,
+ // right face
+ 1.0f, -1.0f, -1.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 1.0f, -1.0f, 1.0f,
+ // left face
+ -1.0f, -1.0f, 1.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ -1.0f, -1.0f, -1.0f,
+ // top face
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ // bottom face
+ -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 static final float[] colors = {
+
+ // front face (cyan)
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ // back face (magenta)
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ // right face (yellow)
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ // left face (blue)
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ // top face (green)
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ // bottom face (red)
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+
+ };
+
+ ColorPyramidUp() {
+ super(24, QuadArray.COORDINATES | QuadArray.COLOR_3);
+
+ setCoordinates(0, verts);
+ setColors(0, colors);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/morphing/Morphing.form b/src/main/java/org/jdesktop/j3d/examples/morphing/Morphing.form
new file mode 100644
index 0000000..631f59a
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/morphing/Morphing.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="Morphing"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/morphing/Morphing.java b/src/main/java/org/jdesktop/j3d/examples/morphing/Morphing.java
new file mode 100644
index 0000000..4604f66
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/morphing/Morphing.java
@@ -0,0 +1,304 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.morphing;
+
+import java.awt.GraphicsConfiguration;
+import java.io.FileNotFoundException;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Morph;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.loaders.IncorrectFormatException;
+import org.jogamp.java3d.loaders.ParsingErrorException;
+import org.jogamp.java3d.loaders.Scene;
+import org.jogamp.java3d.loaders.objectfile.ObjectFile;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class Morphing extends javax.swing.JFrame {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+ private java.net.URL[] objFiles = null;
+
+ private BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objScale.addChild(bg);
+
+ // Set up the global lights
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+
+ AmbientLight aLgt = new AmbientLight(alColor);
+ aLgt.setInfluencingBounds(bounds);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ lgt1.setInfluencingBounds(bounds);
+ objScale.addChild(aLgt);
+ objScale.addChild(lgt1);
+
+ //
+ // Create the transform group nodes for the 3 original objects
+ // and the morphed object. Add them to the root of the
+ // branch graph.
+ //
+ TransformGroup objTrans[] = new TransformGroup[4];
+
+ for(int i=0; i<4; i++) {
+ objTrans[i] = new TransformGroup();
+ objScale.addChild(objTrans[i]);
+ }
+
+ Transform3D tr = new Transform3D();
+ Transform3D rotX90 = new Transform3D();
+ rotX90.rotX(90.0 * Math.PI / 180.0);
+
+ objTrans[0].getTransform(tr);
+ tr.setTranslation(new Vector3d(-2.0, 1.5, -2.0));
+ tr.mul(rotX90);
+ objTrans[0].setTransform(tr);
+
+ objTrans[1].getTransform(tr);
+ tr.setTranslation(new Vector3d(0.0, 1.5, -2.0));
+ tr.mul(rotX90);
+ objTrans[1].setTransform(tr);
+
+ objTrans[2].getTransform(tr);
+ tr.setTranslation(new Vector3d(2.0, 1.5, -2.0));
+ tr.mul(rotX90);
+ objTrans[2].setTransform(tr);
+
+ objTrans[3].getTransform(tr);
+ tr.setTranslation(new Vector3d(0.0, -2.0, -2.0));
+ tr.mul(rotX90);
+ objTrans[3].setTransform(tr);
+
+
+ // Now load the object files
+ Scene s[] = new Scene[3];
+ GeometryArray g[] = new GeometryArray[3];
+ Shape3D shape[] = new Shape3D[3];
+ ObjectFile loader = new ObjectFile(ObjectFile.RESIZE);
+ for(int i=0; i<3; i++) {
+ s[i] = null;
+ g[i] = null;
+ shape[i] = null;
+ }
+
+ for(int i=0; i<3;i++) {
+ try {
+ s[i] = loader.load(objFiles[i]);
+ }
+ catch (FileNotFoundException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+ catch (ParsingErrorException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+ catch (IncorrectFormatException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+
+ BranchGroup b = s[i].getSceneGroup();
+ shape[i] = (Shape3D) b.getChild(0);
+ g[i] = (GeometryArray) shape[i].getGeometry();
+
+ shape[i].setGeometry(g[i]);
+ objTrans[i].addChild(b);
+ }
+
+ //
+ // Create a Morph node, and set the appearance and input geometry
+ // arrays. Set the Morph node's capability bits to allow the weights
+ // to be modified at runtime.
+ //
+ Appearance app = new Appearance();
+ Color3f objColor = new Color3f(1.0f, 0.7f, 0.8f);
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ app.setMaterial(new Material(objColor, black, objColor, black, 80.0f));
+ Morph morph = new Morph(g, app);
+ morph.setCapability(Morph.ALLOW_WEIGHTS_READ);
+ morph.setCapability(Morph.ALLOW_WEIGHTS_WRITE);
+
+ objTrans[3].addChild(morph);
+
+ // Now create the Alpha object that controls the speed of the
+ // morphing operation.
+ Alpha morphAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE |
+ Alpha.DECREASING_ENABLE,
+ 0, 0,
+ 2000, 1000, 200,
+ 2000, 1000, 200);
+
+ // Finally, create the morphing behavior
+ MorphingBehavior mBeh = new MorphingBehavior(morphAlpha, morph);
+ mBeh.setSchedulingBounds(bounds);
+ objScale.addChild(mBeh);
+
+ return objRoot;
+ }
+
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form LOD
+ */
+ public Morphing(String args[]) {
+
+ objFiles = new java.net.URL[3];
+ for(int i=0; i<3; i++) {
+ objFiles[i] = Resources.getResource("resources/geometry/hand" + (i+1) + ".obj");
+ if (objFiles[i] == null) {
+ System.err.println("resources/geometry/hand" + (i+1) + ".obj not found");
+ System.exit(1);
+ }
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("Morphing");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[]) {
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ Morphing morphing = new Morphing(args);
+ morphing.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/morphing/MorphingBehavior.java b/src/main/java/org/jdesktop/j3d/examples/morphing/MorphingBehavior.java
new file mode 100644
index 0000000..49520c2
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/morphing/MorphingBehavior.java
@@ -0,0 +1,102 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.morphing;
+
+import java.util.Enumeration;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.Morph;
+import org.jogamp.java3d.WakeupOnElapsedFrames;
+
+// User-defined morphing behavior class
+public class MorphingBehavior extends Behavior {
+
+ Alpha alpha;
+ Morph morph;
+ double weights[];
+
+ WakeupOnElapsedFrames w = new WakeupOnElapsedFrames(0);
+
+ // Override Behavior's initialize method to setup wakeup criteria
+ public void initialize() {
+ alpha.setStartTime(System.currentTimeMillis());
+
+ // Establish initial wakeup criteria
+ wakeupOn(w);
+ }
+
+ // Override Behavior's stimulus method to handle the event
+ public void processStimulus(Enumeration criteria) {
+
+ // NOTE: This assumes 3 objects. It should be generalized to
+ // "n" objects.
+
+ double val = alpha.value();
+ if (val < 0.5) {
+ double a = val * 2.0;
+ weights[0] = 1.0 - a;
+ weights[1] = a;
+ weights[2] = 0.0;
+ }
+ else {
+ double a = (val - 0.5) * 2.0;
+ weights[0] = 0.0;
+ weights[1] = 1.0f - a;
+ weights[2] = a;
+ }
+
+ morph.setWeights(weights);
+
+ // Set wakeup criteria for next time
+ wakeupOn(w);
+ }
+
+ public MorphingBehavior(Alpha a, Morph m) {
+ alpha = a;
+ morph = m;
+ weights = morph.getWeights();
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/morphing/Pyramid2Cube.form b/src/main/java/org/jdesktop/j3d/examples/morphing/Pyramid2Cube.form
new file mode 100644
index 0000000..0c0b7e2
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/morphing/Pyramid2Cube.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="Pyramid2Cube"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/morphing/Pyramid2Cube.java b/src/main/java/org/jdesktop/j3d/examples/morphing/Pyramid2Cube.java
new file mode 100644
index 0000000..7435588
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/morphing/Pyramid2Cube.java
@@ -0,0 +1,250 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.morphing;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.Morph;
+import org.jogamp.java3d.QuadArray;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3d;
+
+public class Pyramid2Cube extends javax.swing.JFrame {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ private BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+
+ // Create a bounds for the background and behavior
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objScale.addChild(bg);
+
+ //
+ // Create the transform group nodes for the 3 original objects
+ // and the morphed object. Add them to the root of the
+ // branch graph.
+ //
+ TransformGroup objTrans[] = new TransformGroup[4];
+
+ for(int i=0; i<4; i++) {
+ objTrans[i] = new TransformGroup();
+ objScale.addChild(objTrans[i]);
+ }
+
+ Transform3D tr = new Transform3D();
+ Transform3D rotY15 = new Transform3D();
+ rotY15.rotY(15.0 * Math.PI / 180.0);
+
+ objTrans[0].getTransform(tr);
+ tr.setTranslation(new Vector3d(-3.0, 1.5, -6.5));
+ tr.mul(rotY15);
+ objTrans[0].setTransform(tr);
+
+ objTrans[1].getTransform(tr);
+ tr.setTranslation(new Vector3d(0.0, 1.5, -6.5));
+ tr.mul(rotY15);
+ objTrans[1].setTransform(tr);
+
+ objTrans[2].getTransform(tr);
+ tr.setTranslation(new Vector3d(3.0, 1.5, -6.5));
+ tr.mul(rotY15);
+ objTrans[2].setTransform(tr);
+
+ objTrans[3].getTransform(tr);
+ tr.setTranslation(new Vector3d(0.0, -2.0, -5.0));
+ tr.mul(rotY15);
+ objTrans[3].setTransform(tr);
+
+ // Now create simple geometries.
+
+ QuadArray g[] = new QuadArray[3];
+ Shape3D shape[] = new Shape3D[3];
+ for(int i=0; i<3; i++) {
+ g[i] = null;
+ shape[i] = null;
+ }
+
+ g[0] = new ColorPyramidUp();
+ g[1] = new ColorCube();
+ g[2] = new ColorPyramidDown();
+
+ Appearance a = new Appearance();
+
+ for(int i=0; i<3;i++) {
+ shape[i] = new Shape3D(g[i],a);
+ objTrans[i].addChild(shape[i]);
+ }
+
+ //
+ // Create a Morph node, and set the appearance and input geometry
+ // arrays. Set the Morph node's capability bits to allow the weights
+ // to be modified at runtime.
+ //
+ Morph morph = new Morph((GeometryArray[]) g, a);
+ morph.setCapability(Morph.ALLOW_WEIGHTS_READ);
+ morph.setCapability(Morph.ALLOW_WEIGHTS_WRITE);
+
+ objTrans[3].addChild(morph);
+
+ // Now create the Alpha object that controls the speed of the
+ // morphing operation.
+ Alpha morphAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE |
+ Alpha.DECREASING_ENABLE,
+ 0, 0,
+ 4000, 1000, 500,
+ 4000, 1000, 500);
+
+ // Finally, create the morphing behavior
+ MorphingBehavior mBeh = new MorphingBehavior(morphAlpha, morph);
+ mBeh.setSchedulingBounds(bounds);
+ objScale.addChild(mBeh);
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form Pyramid2Cube
+ */
+ public Pyramid2Cube() {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("Pyramid2Cube");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new Pyramid2Cube().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/objload/ObjLoad.form b/src/main/java/org/jdesktop/j3d/examples/objload/ObjLoad.form
new file mode 100644
index 0000000..f8ced41
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/objload/ObjLoad.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="ObjLoad"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/objload/ObjLoad.java b/src/main/java/org/jdesktop/j3d/examples/objload/ObjLoad.java
new file mode 100644
index 0000000..9936e97
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/objload/ObjLoad.java
@@ -0,0 +1,325 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.objload;
+
+import java.awt.GraphicsConfiguration;
+import java.io.FileNotFoundException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.loaders.IncorrectFormatException;
+import org.jogamp.java3d.loaders.ParsingErrorException;
+import org.jogamp.java3d.loaders.Scene;
+import org.jogamp.java3d.loaders.objectfile.ObjectFile;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.universe.PlatformGeometry;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * Simple Java 3D example program to display an .obj object.
+ */
+public class ObjLoad extends javax.swing.JFrame {
+
+ private boolean spin = false;
+ private boolean noTriangulate = false;
+ private boolean noStripify = false;
+ private double creaseAngle = 60.0;
+ private URL filename = null;
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.7);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ objScale.addChild(objTrans);
+
+ int flags = ObjectFile.RESIZE;
+ if (!noTriangulate) flags |= ObjectFile.TRIANGULATE;
+ if (!noStripify) flags |= ObjectFile.STRIPIFY;
+ ObjectFile f = new ObjectFile(flags,
+ (float)(creaseAngle * Math.PI / 180.0));
+ Scene s = null;
+ try {
+ s = f.load(filename);
+ }
+ catch (FileNotFoundException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+ catch (ParsingErrorException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+ catch (IncorrectFormatException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+
+ objTrans.addChild(s.getSceneGroup());
+
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ if (spin) {
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+ }
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
+ Background bgNode = new Background(bgColor);
+ bgNode.setApplicationBounds(bounds);
+ objRoot.addChild(bgNode);
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D canvas3d = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(canvas3d);
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // add mouse behaviors to the ViewingPlatform
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+
+ PlatformGeometry pg = new PlatformGeometry();
+
+ // Set up the ambient light
+ Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
+ AmbientLight ambientLightNode = new AmbientLight(ambientColor);
+ ambientLightNode.setInfluencingBounds(bounds);
+ pg.addChild(ambientLightNode);
+
+ // Set up the directional lights
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);
+ Color3f light2Color = new Color3f(1.0f, 1.0f, 1.0f);
+ Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
+
+ DirectionalLight light1
+ = new DirectionalLight(light1Color, light1Direction);
+ light1.setInfluencingBounds(bounds);
+ pg.addChild(light1);
+
+ DirectionalLight light2
+ = new DirectionalLight(light2Color, light2Direction);
+ light2.setInfluencingBounds(bounds);
+ pg.addChild(light2);
+
+ viewingPlatform.setPlatformGeometry( pg );
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ if (!spin) {
+ OrbitBehavior orbit = new OrbitBehavior(canvas3d,
+ OrbitBehavior.REVERSE_ALL);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+ }
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return canvas3d;
+ }
+
+ private void usage() {
+ System.out.println(
+ "Usage: java ObjLoad [-s] [-n] [-t] [-c degrees] <.obj file>");
+ System.out.println(" -s Spin (no user interaction)");
+ System.out.println(" -n No triangulation");
+ System.out.println(" -t No stripification");
+ System.out.println(
+ " -c Set crease angle for normal generation (default is 60 without");
+ System.out.println(
+ " smoothing group info, otherwise 180 within smoothing groups)");
+ System.exit(0);
+ } // End of usage
+
+ /**
+ * Creates new form ObjLoad
+ */
+ public ObjLoad(String args[]) {
+ if (args.length != 0) {
+ for (int i = 0 ; i < args.length ; i++) {
+ if (args[i].startsWith("-")) {
+ if (args[i].equals("-s")) {
+ spin = true;
+ } else if (args[i].equals("-n")) {
+ noTriangulate = true;
+ } else if (args[i].equals("-t")) {
+ noStripify = true;
+ } else if (args[i].equals("-c")) {
+ if (i < args.length - 1) {
+ creaseAngle = (new Double(args[++i])).doubleValue();
+ } else usage();
+ } else {
+ usage();
+ }
+ } else {
+ try {
+ if ((args[i].indexOf("file:") == 0) ||
+ (args[i].indexOf("http") == 0)) {
+ filename = new URL(args[i]);
+ } else if (args[i].charAt(0) != '/') {
+ filename = new URL("file:./" + args[i]);
+ } else {
+ filename = new URL("file:" + args[i]);
+ }
+ } catch (MalformedURLException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+ }
+ }
+ }
+
+ if (filename == null) {
+ filename = Resources.getResource("resources/geometry/galleon.obj");
+ if (filename == null) {
+ System.err.println("resources/geometry/galleon.obj not found");
+ System.exit(1);
+ }
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("ObjLoad");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[]) {
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ ObjLoad objLoad = new ObjLoad(args);
+ objLoad.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OffScreenCanvas3D.java b/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OffScreenCanvas3D.java
new file mode 100644
index 0000000..913bc74
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OffScreenCanvas3D.java
@@ -0,0 +1,107 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.offscreen_canvas3d;
+
+import java.awt.GraphicsConfiguration;
+import java.awt.image.BufferedImage;
+
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ImageComponent;
+import org.jogamp.java3d.ImageComponent2D;
+import org.jogamp.java3d.Raster;
+
+
+class OffScreenCanvas3D extends Canvas3D {
+
+ Raster drawRaster;
+ boolean printing = false;
+
+ public OffScreenCanvas3D(GraphicsConfiguration gconfig, boolean offscreenflag,
+ Raster drawRaster) {
+
+ super(gconfig, offscreenflag);
+ this.drawRaster = drawRaster;
+ }
+
+ public void print(boolean toWait) {
+
+ if (!toWait)
+ printing = true;
+
+ BufferedImage bImage = new BufferedImage(
+ 200, 200 , BufferedImage.TYPE_INT_ARGB);
+
+ ImageComponent2D buffer = new ImageComponent2D(
+ ImageComponent.FORMAT_RGBA, bImage, true, true);
+ buffer.setCapability(ImageComponent2D.ALLOW_IMAGE_READ);
+
+ this.setOffScreenBuffer(buffer);
+ this.renderOffScreenBuffer();
+
+ if (toWait) {
+ this.waitForOffScreenRendering();
+ drawOffScreenBuffer();
+ }
+ }
+
+ public void postSwap() {
+
+ if (printing) {
+ super.postSwap();
+ drawOffScreenBuffer();
+ printing = false;
+ }
+ }
+
+ void drawOffScreenBuffer() {
+
+ BufferedImage bImage = this.getOffScreenBuffer().getImage();
+ ImageComponent2D newImageComponent = new ImageComponent2D(
+ ImageComponent.FORMAT_RGBA, bImage, true, true);
+
+ drawRaster.setImage(newImageComponent);
+ }
+}
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OffScreenTest.form b/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OffScreenTest.form
new file mode 100644
index 0000000..39a0712
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OffScreenTest.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="Window Title"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OffScreenTest.java b/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OffScreenTest.java
new file mode 100644
index 0000000..dbb841e
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OffScreenTest.java
@@ -0,0 +1,231 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.offscreen_canvas3d;
+
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
+import java.awt.image.BufferedImage;
+
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.GraphicsConfigTemplate3D;
+import org.jogamp.java3d.ImageComponent;
+import org.jogamp.java3d.ImageComponent2D;
+import org.jogamp.java3d.Raster;
+import org.jogamp.java3d.Screen3D;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.View;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+
+/**
+ * OffScreenTest programs with no UI.
+ */
+public class OffScreenTest extends javax.swing.JFrame {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+ private Raster drawRaster = null;
+
+ private BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // trans object has composited transformation matrix
+ Transform3D trans = new Transform3D();
+ Transform3D rot = new Transform3D();
+
+ trans.rotX(Math.PI/4.0d);
+ rot.rotY(Math.PI/5.0d);
+ trans.mul(rot);
+ trans.setScale(0.7);
+ trans.setTranslation(new Vector3d(-0.4, 0.3, 0.0));
+
+ TransformGroup objTrans = new TransformGroup(trans);
+ objRoot.addChild(objTrans);
+
+ // Create a simple shape leaf node, add it to the scene graph.
+ // ColorCube is a Convenience Utility class
+ objTrans.addChild(new ColorCube(0.4));
+
+ //Create a raster
+ BufferedImage bImage = new BufferedImage(200, 200 ,
+ BufferedImage.TYPE_INT_ARGB);
+ ImageComponent2D buffer =
+ new ImageComponent2D(ImageComponent.FORMAT_RGBA, bImage, true, true);
+ buffer.setCapability(ImageComponent2D.ALLOW_IMAGE_READ);
+
+ drawRaster = new Raster(new Point3f(0.0f, 0.0f, 0.0f),
+ Raster.RASTER_COLOR,
+ 0, 0, 200, 200, buffer, null);
+
+ drawRaster.setCapability(Raster.ALLOW_IMAGE_WRITE);
+ Shape3D shape = new Shape3D(drawRaster);
+ objRoot.addChild(shape);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+
+ private OnScreenCanvas3D createOnScreenCanvasAndUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ OnScreenCanvas3D onScrCanvas = new OnScreenCanvas3D(config, false);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(onScrCanvas);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return onScrCanvas;
+ }
+
+ private OffScreenCanvas3D createOffScreenCanvas() {
+ // request an offscreen Canvas3D with a single buffer configuration
+ GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();
+ template.setDoubleBuffer(GraphicsConfigTemplate3D.UNNECESSARY);
+ GraphicsConfiguration gc =
+ GraphicsEnvironment.getLocalGraphicsEnvironment().
+ getDefaultScreenDevice().getBestConfiguration(template);
+
+ // Create a offscreen Canvas3D using the single buffer configuration.
+ OffScreenCanvas3D offScrCanvas =
+ new OffScreenCanvas3D(gc, true, drawRaster);
+
+ return offScrCanvas;
+ }
+
+ /**
+ * Creates new form OffScreenTest
+ */
+ public OffScreenTest() {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+
+ // Create an OnScreenCanvas3D and SimpleUniverse; add canvas to drawing panel
+ OnScreenCanvas3D onScreenCanvas = createOnScreenCanvasAndUniverse();
+ drawingPanel.add(onScreenCanvas, java.awt.BorderLayout.CENTER);
+
+ // Creante an OffScreenCanvas3D
+ OffScreenCanvas3D offScreenCanvas = createOffScreenCanvas();
+
+ // set the offscreen to match the onscreen
+ Screen3D sOn = onScreenCanvas.getScreen3D();
+ Screen3D sOff = offScreenCanvas.getScreen3D();
+ sOff.setSize(sOn.getSize());
+ sOff.setPhysicalScreenWidth(sOn.getPhysicalScreenWidth());
+ sOff.setPhysicalScreenHeight(sOn.getPhysicalScreenHeight());
+
+ // attach the same view to the offscreen canvas
+ View view = univ.getViewer().getView();
+ view.addCanvas3D(offScreenCanvas);
+
+ // tell onscreen about the offscreen so it knows to
+ // render to the offscreen at postswap
+ onScreenCanvas.setOffScreenCanvas(offScreenCanvas);
+
+ univ.addBranchGraph(scene);
+
+ view.stopView();
+ // Make sure that image are render completely
+ // before grab it in postSwap().
+ onScreenCanvas.setImageReady();
+ view.startView();
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("Window Title");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new OffScreenTest().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OnScreenCanvas3D.java b/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OnScreenCanvas3D.java
new file mode 100644
index 0000000..ce671e2
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/OnScreenCanvas3D.java
@@ -0,0 +1,79 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.offscreen_canvas3d;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.Canvas3D;
+
+
+class OnScreenCanvas3D extends Canvas3D {
+
+ OffScreenCanvas3D c;
+ boolean print = false;
+ boolean imageReady = false;
+
+ public OnScreenCanvas3D(GraphicsConfiguration gconfig, boolean offscreenflag)
+ {
+ super(gconfig, offscreenflag);
+ }
+
+ public void setOffScreenCanvas(OffScreenCanvas3D c)
+ {
+ this.c = c;
+ }
+
+ public void setImageReady() {
+ imageReady = true;
+ }
+
+ public void postSwap()
+ {
+ if (imageReady && !print) {
+ c.print(false);
+ print = true;
+ }
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/PrintFromButton.form b/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/PrintFromButton.form
new file mode 100644
index 0000000..54d6721
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/PrintFromButton.form
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <NonVisualComponents>
+ <Menu class="javax.swing.JMenuBar" name="jMenuBar1">
+ <SubComponents>
+ <Menu class="javax.swing.JMenu" name="fileMenu">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="File"/>
+ </Properties>
+ <SubComponents>
+ <MenuItem class="javax.swing.JMenuItem" name="exitMenuItem">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Exit"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="exitMenuItemActionPerformed"/>
+ </Events>
+ </MenuItem>
+ </SubComponents>
+ </Menu>
+ </SubComponents>
+ </Menu>
+ </NonVisualComponents>
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="Window Title"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="menuBar" type="java.lang.String" value="jMenuBar1"/>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="guiPanel">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="North"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JButton" name="myButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Print"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="myButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="4" insetsLeft="4" insetsBottom="4" insetsRight="4" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/PrintFromButton.java b/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/PrintFromButton.java
new file mode 100644
index 0000000..e53a094
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/offscreen_canvas3d/PrintFromButton.java
@@ -0,0 +1,274 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.offscreen_canvas3d;
+
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
+import java.awt.image.BufferedImage;
+
+import javax.swing.JPopupMenu;
+
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.GraphicsConfigTemplate3D;
+import org.jogamp.java3d.ImageComponent;
+import org.jogamp.java3d.ImageComponent2D;
+import org.jogamp.java3d.Raster;
+import org.jogamp.java3d.Screen3D;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.View;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+
+/**
+ * PrintFromButton programs with simple UI.
+ */
+public class PrintFromButton extends javax.swing.JFrame {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+ private Raster drawRaster = null;
+ private OffScreenCanvas3D offScreenCanvas = null;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // trans object has composited transformation matrix
+ Transform3D trans = new Transform3D();
+ Transform3D rot = new Transform3D();
+
+ trans.rotX(Math.PI/4.0d);
+ rot.rotY(Math.PI/5.0d);
+ trans.mul(rot);
+ trans.setScale(0.7);
+ trans.setTranslation(new Vector3d(-0.4, 0.3, 0.0));
+
+ TransformGroup objTrans = new TransformGroup(trans);
+ objRoot.addChild(objTrans);
+
+ // Create a simple shape leaf node, add it to the scene graph.
+ // ColorCube is a Convenience Utility class
+ objTrans.addChild(new ColorCube(0.4));
+
+ //Create a raster
+ BufferedImage bImage = new BufferedImage(200, 200 ,
+ BufferedImage.TYPE_INT_ARGB);
+ ImageComponent2D buffer =
+ new ImageComponent2D(ImageComponent.FORMAT_RGBA, bImage, true, true);
+ buffer.setCapability(ImageComponent2D.ALLOW_IMAGE_READ);
+
+ drawRaster = new Raster(new Point3f(0.0f, 0.0f, 0.0f),
+ Raster.RASTER_COLOR,
+ 0, 0, 200, 200, buffer, null);
+
+ drawRaster.setCapability(Raster.ALLOW_IMAGE_WRITE);
+ Shape3D shape = new Shape3D(drawRaster);
+ objRoot.addChild(shape);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private OnScreenCanvas3D createOnScreenCanvasAndUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ OnScreenCanvas3D onScrCanvas = new OnScreenCanvas3D(config, false);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(onScrCanvas);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return onScrCanvas;
+ }
+
+ private OffScreenCanvas3D createOffScreenCanvas() {
+ // request an offscreen Canvas3D with a single buffer configuration
+ GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();
+ template.setDoubleBuffer(GraphicsConfigTemplate3D.UNNECESSARY);
+ GraphicsConfiguration gc =
+ GraphicsEnvironment.getLocalGraphicsEnvironment().
+ getDefaultScreenDevice().getBestConfiguration(template);
+
+ // Create a offscreen Canvas3D using the single buffer configuration.
+ OffScreenCanvas3D offScrCanvas =
+ new OffScreenCanvas3D(gc, true, drawRaster);
+
+ return offScrCanvas;
+ }
+
+ /**
+ * Creates new form PrintFromButton
+ */
+ public PrintFromButton() {
+ // Initialize the GUI components
+ JPopupMenu.setDefaultLightWeightPopupEnabled(false);
+ initComponents();
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+
+ // Create an OnScreenCanvas3D and SimpleUniverse; add canvas to drawing panel
+ OnScreenCanvas3D onScreenCanvas = createOnScreenCanvasAndUniverse();
+ drawingPanel.add(onScreenCanvas, java.awt.BorderLayout.CENTER);
+
+ // Creante an OffScreenCanvas3D
+ offScreenCanvas = createOffScreenCanvas();
+
+ // set the offscreen to match the onscreen
+ Screen3D sOn = onScreenCanvas.getScreen3D();
+ Screen3D sOff = offScreenCanvas.getScreen3D();
+ sOff.setSize(sOn.getSize());
+ sOff.setPhysicalScreenWidth(sOn.getPhysicalScreenWidth());
+ sOff.setPhysicalScreenHeight(sOn.getPhysicalScreenHeight());
+
+ // attach the same view to the offscreen canvas
+ View view = univ.getViewer().getView();
+ view.addCanvas3D(offScreenCanvas);
+
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ guiPanel = new javax.swing.JPanel();
+ myButton = new javax.swing.JButton();
+ drawingPanel = new javax.swing.JPanel();
+ jMenuBar1 = new javax.swing.JMenuBar();
+ fileMenu = new javax.swing.JMenu();
+ exitMenuItem = new javax.swing.JMenuItem();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("Window Title");
+ guiPanel.setLayout(new java.awt.GridBagLayout());
+
+ myButton.setText("Print");
+ myButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ myButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
+ guiPanel.add(myButton, gridBagConstraints);
+
+ getContentPane().add(guiPanel, java.awt.BorderLayout.NORTH);
+
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ fileMenu.setText("File");
+ exitMenuItem.setText("Exit");
+ exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ exitMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(exitMenuItem);
+
+ jMenuBar1.add(fileMenu);
+
+ setJMenuBar(jMenuBar1);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ private void myButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_myButtonActionPerformed
+ offScreenCanvas.print(false);
+ }//GEN-LAST:event_myButtonActionPerformed
+
+ private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
+ System.exit(0);
+ }//GEN-LAST:event_exitMenuItemActionPerformed
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new PrintFromButton().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ private javax.swing.JMenuItem exitMenuItem;
+ private javax.swing.JMenu fileMenu;
+ private javax.swing.JPanel guiPanel;
+ private javax.swing.JMenuBar jMenuBar1;
+ private javax.swing.JButton myButton;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/oriented_shape3d/MouseRotateY.java b/src/main/java/org/jdesktop/j3d/examples/oriented_shape3d/MouseRotateY.java
new file mode 100644
index 0000000..473eaf7
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/oriented_shape3d/MouseRotateY.java
@@ -0,0 +1,200 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.oriented_shape3d;
+
+import java.awt.AWTEvent;
+import java.awt.event.MouseEvent;
+import java.util.Enumeration;
+
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.WakeupCriterion;
+import org.jogamp.java3d.WakeupOnAWTEvent;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseBehavior;
+import org.jogamp.vecmath.Matrix4d;
+import org.jogamp.vecmath.Vector3d;
+
+/**
+ * MouseRotateY is a Java3D behavior object that lets users control the
+ * rotation of an object via a mouse.
+ * <p>
+ * To use this utility, first create a transform group that this
+ * rotate behavior will operate on. Then,
+ *<blockquote><pre>
+ *
+ * MouseRotateY behavior = new MouseRotateY();
+ * behavior.setTransformGroup(objTrans);
+ * objTrans.addChild(behavior);
+ * behavior.setSchedulingBounds(bounds);
+ *
+ *</pre></blockquote>
+ * The above code will add the rotate behavior to the transform
+ * group. The user can rotate any object attached to the objTrans.
+ */
+
+public class MouseRotateY extends MouseBehavior {
+ double y_angle;
+ double y_factor;
+
+ /**
+ * Creates a rotate behavior given the transform group.
+ * @param transformGroup The transformGroup to operate on.
+ */
+ public MouseRotateY(TransformGroup transformGroup) {
+ super(transformGroup);
+ }
+
+ /**
+ * Creates a default mouse rotate behavior.
+ **/
+ public MouseRotateY() {
+ super(0);
+ }
+
+ /**
+ * Creates a rotate behavior.
+ * Note that this behavior still needs a transform
+ * group to work on (use setTransformGroup(tg)) and
+ * the transform group must add this behavior.
+ * @param flags interesting flags (wakeup conditions).
+ */
+ public MouseRotateY(int flags) {
+ super(flags);
+ }
+
+ public void initialize() {
+ super.initialize();
+ y_angle = 0;
+ y_factor = .03;
+ if ((flags & INVERT_INPUT) == INVERT_INPUT) {
+ invert = true;
+ y_factor *= -1;
+ }
+ }
+
+ public double getYFactor() {
+ return y_factor;
+ }
+
+ public void setFactor( double factor) {
+ y_factor = factor;
+
+ }
+
+
+ public void processStimulus (Enumeration criteria) {
+ WakeupCriterion wakeup;
+ AWTEvent[] event;
+ int id;
+ int dx;
+
+ while (criteria.hasMoreElements()) {
+ wakeup = (WakeupCriterion) criteria.nextElement();
+ if (wakeup instanceof WakeupOnAWTEvent) {
+ event = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
+ for (int i=0; i<event.length; i++) {
+ processMouseEvent((MouseEvent) event[i]);
+
+ if (((buttonPress)&&((flags & MANUAL_WAKEUP) == 0)) ||
+ ((wakeUp)&&((flags & MANUAL_WAKEUP) != 0))){
+
+ id = event[i].getID();
+ if ((id == MouseEvent.MOUSE_DRAGGED) &&
+ !((MouseEvent)event[i]).isMetaDown() &&
+ !((MouseEvent)event[i]).isAltDown()){
+
+ x = ((MouseEvent)event[i]).getX();
+
+ dx = x - x_last;
+
+ if (!reset){
+ y_angle = dx * y_factor;
+
+ transformY.rotY(y_angle);
+
+ transformGroup.getTransform(currXform);
+
+ //Vector3d translation = new Vector3d();
+ //Matrix3f rotation = new Matrix3f();
+ Matrix4d mat = new Matrix4d();
+
+ // Remember old matrix
+ currXform.get(mat);
+
+ // Translate to origin
+ currXform.setTranslation(new Vector3d(0.0,0.0,0.0));
+ if (invert) {
+ currXform.mul(currXform, transformX);
+ currXform.mul(currXform, transformY);
+ } else {
+ currXform.mul(transformX, currXform);
+ currXform.mul(transformY, currXform);
+ }
+
+ // Set old translation back
+ Vector3d translation = new
+ Vector3d(mat.m03, mat.m13, mat.m23);
+ currXform.setTranslation(translation);
+
+ // Update xform
+ transformGroup.setTransform(currXform);
+ }
+ else {
+ reset = false;
+ }
+
+ x_last = x;
+ }
+ else if (id == MouseEvent.MOUSE_PRESSED) {
+ x_last = ((MouseEvent)event[i]).getX();
+ }
+ }
+ }
+ }
+ }
+
+ wakeupOn (mouseCriterion);
+
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/oriented_shape3d/OrientedPtTest.java b/src/main/java/org/jdesktop/j3d/examples/oriented_shape3d/OrientedPtTest.java
new file mode 100644
index 0000000..2810378
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/oriented_shape3d/OrientedPtTest.java
@@ -0,0 +1,309 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.oriented_shape3d;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.Font;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Font3D;
+import org.jogamp.java3d.FontExtrusion;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.OrientedShape3D;
+import org.jogamp.java3d.Text3D;
+import org.jogamp.java3d.TextureAttributes;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.geometry.Cone;
+import org.jogamp.java3d.utils.geometry.Cylinder;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class OrientedPtTest extends Applet {
+
+ // setup font stuff
+ private String fontName = "TestFont";
+ private String textString = "OrientedShape3D";
+ float sl = textString.length();
+
+ // paths to texture image files
+ private java.net.URL earthImage = null;
+ private java.net.URL stoneImage = null;
+
+ private SimpleUniverse u;
+
+ public BranchGroup createSceneGraph() {
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ TransformGroup objScale = new TransformGroup();
+ Transform3D textMat = new Transform3D();
+ // Assuming uniform size chars, set scale to fit string in view
+ textMat.setScale(1.2/sl);
+ objScale.setTransform(textMat);
+
+
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ objRoot.addChild(objTrans);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ Appearance apText = new Appearance();
+ Material m = new Material();
+ m.setLightingEnable(true);
+ apText.setMaterial(m);
+
+
+ Appearance apEarth= new Appearance();
+ Material mm = new Material();
+ mm.setLightingEnable(true);
+ apEarth.setMaterial(mm);
+
+ Appearance apStone = new Appearance();
+ apStone.setMaterial(mm);
+
+// create 3D text
+ Font3D f3d = new Font3D(new Font(fontName, Font.PLAIN, 2),
+ new FontExtrusion());
+ Point3f textPt = new Point3f( -sl/2.0f, 3.0f, 0.0f);
+ Text3D txt = new Text3D(f3d, textString, textPt);
+ OrientedShape3D textShape = new OrientedShape3D();
+ textShape.setGeometry(txt);
+ textShape.setAppearance(apText);
+
+ textShape.setAlignmentMode(OrientedShape3D.ROTATE_ABOUT_POINT);
+ // text is centered around 0, 3, 0. Make it rotate around 0,5,0
+ Point3f rotationPt = new Point3f(0.0f, 5.0f, 0.0f);
+ textShape.setRotationPoint(rotationPt);
+ objScale.addChild( textShape );
+
+ // also add a small Sphere at the rotation point to
+ // show that we are rotating around the right point
+ Sphere sphere = new Sphere(0.2f);
+ TransformGroup sphereGroup = new TransformGroup();
+ Transform3D sphereXform = new Transform3D();
+ sphereXform.set(new Vector3f(rotationPt));
+ sphereGroup.setTransform(sphereXform);
+ sphereGroup.addChild(sphere);
+ objScale.addChild(sphereGroup);
+
+
+ // Create a simple shape leaf node, add it to the scene graph.
+
+ Transform3D cubeMat = new Transform3D();
+ TransformGroup cubeTrans = new TransformGroup(cubeMat);
+ cubeMat.set(new Vector3d(0.9, 0.0, -1.0));
+ cubeTrans.setTransform(cubeMat);
+ cubeTrans.addChild(new ColorCube(0.3));
+ objTrans.addChild(cubeTrans);
+
+ TextureLoader stoneTex = new TextureLoader(stoneImage, new String("RGB"),
+ TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, this);
+ if (stoneTex != null) apStone.setTexture(stoneTex.getTexture());
+
+ TextureAttributes texAttr = new TextureAttributes();
+ texAttr.setTextureMode(TextureAttributes.REPLACE);
+ apStone.setTextureAttributes(texAttr);
+
+ Transform3D coneMat = new Transform3D();
+ TransformGroup coneTrans = new TransformGroup(coneMat);
+ coneMat.set(new Vector3d(0.0, 0.0, 0.0));
+ coneTrans.setTransform(coneMat);
+ coneTrans.addChild(new Cone(.2f, 0.8f,Cone.GENERATE_NORMALS |
+ Cone.GENERATE_TEXTURE_COORDS | Cone.GENERATE_TEXTURE_COORDS_Y_UP, apStone));
+ objTrans.addChild(coneTrans);
+
+ TextureLoader earthTex = new TextureLoader(earthImage, new String("RGB"),
+ TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, this);
+ if (earthTex != null) apEarth.setTexture(earthTex.getTexture());
+ apEarth.setTextureAttributes(texAttr);
+
+ Transform3D cylinderMat = new Transform3D();
+ TransformGroup cylinderTrans = new TransformGroup(cylinderMat);
+ cylinderMat.set(new Vector3d(-0.9, 0.5, -1.0));
+ cylinderTrans.setTransform(cylinderMat);
+ cylinderTrans.addChild(new Cylinder(.35f, 2.0f,Cylinder.GENERATE_NORMALS |
+ Cylinder.GENERATE_TEXTURE_COORDS |
+ Cylinder.GENERATE_TEXTURE_COORDS_Y_UP, apEarth));
+ objTrans.addChild(cylinderTrans);
+
+ objTrans.addChild(objScale);
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
+ Background bgNode = new Background(bgColor);
+ bgNode.setApplicationBounds(bounds);
+ objRoot.addChild(bgNode);
+
+ // Set up the ambient light
+ Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
+ AmbientLight ambientLightNode = new AmbientLight(ambientColor);
+ ambientLightNode.setInfluencingBounds(bounds);
+ objRoot.addChild(ambientLightNode);
+
+ // Set up the directional lights
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);
+ Color3f light2Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
+
+ DirectionalLight light1
+ = new DirectionalLight(light1Color, light1Direction);
+ light1.setInfluencingBounds(bounds);
+ objRoot.addChild(light1);
+
+ DirectionalLight light2
+ = new DirectionalLight(light2Color, light2Direction);
+ light2.setInfluencingBounds(bounds);
+ objRoot.addChild(light2);
+
+ apText.setMaterial(mm);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ public OrientedPtTest() {
+ }
+
+ public OrientedPtTest(java.net.URL earthURL, java.net.URL stoneURL) {
+ earthImage = earthURL;
+ stoneImage = stoneURL;
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ // the paths to the image files for an applet
+ earthImage = Resources.getResource("resources/images/earth.jpg");
+ if (earthImage == null) {
+ System.err.println("resources/images/earth.jpg not found");
+ System.exit(1);
+ }
+
+ stoneImage = Resources.getResource("resources/images/stone.jpg");
+ if (stoneImage == null) {
+ System.err.println("resources/images/stone.jpg not found");
+ System.exit(1);
+ }
+
+ setLayout(new BorderLayout());
+ Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
+ add("Center", c);
+
+ // Create a simple scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph();
+ u = new SimpleUniverse(c);
+
+ // add mouse behaviors to the ViewingPlatform
+ ViewingPlatform viewingPlatform = u.getViewingPlatform();
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+
+ // add orbit behavior to the viewing platform
+ OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+
+ u.addBranchGraph(scene);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ //
+ // The following allows OrientedPtTest to be run as an application
+ // as well as an applet
+ //
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.net.URL earthURL = null;
+ java.net.URL stoneURL = null;
+ earthURL = Resources.getResource("resources/images/earth.jpg");
+ if (earthURL == null) {
+ System.err.println("resources/images/earth.jpg not found");
+ System.exit(1);
+ }
+
+ stoneURL = Resources.getResource("resources/images/stone.jpg");
+ if (stoneURL == null) {
+ System.err.println("resources/images/stone.jpg not found");
+ System.exit(1);
+ }
+
+ new MainFrame(new OrientedPtTest(earthURL, stoneURL), 400, 400);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/oriented_shape3d/OrientedTest.java b/src/main/java/org/jdesktop/j3d/examples/oriented_shape3d/OrientedTest.java
new file mode 100644
index 0000000..0f062e1
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/oriented_shape3d/OrientedTest.java
@@ -0,0 +1,329 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.oriented_shape3d;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.Font;
+import java.awt.GraphicsConfiguration;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Font3D;
+import org.jogamp.java3d.FontExtrusion;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.OrientedShape3D;
+import org.jogamp.java3d.Text3D;
+import org.jogamp.java3d.TextureAttributes;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseTranslate;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseZoom;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.geometry.Cone;
+import org.jogamp.java3d.utils.geometry.Cylinder;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class OrientedTest extends Applet {
+
+ // setup font stuff
+ private String fontName = "TestFont";
+ private String textString = "OrientedShape3D";
+ float sl = textString.length();
+
+ // paths to texture image files
+ private java.net.URL earthImage = null;
+ private java.net.URL stoneImage = null;
+
+ private SimpleUniverse u = null;
+
+ public BranchGroup createSceneGraph() {
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ TransformGroup objScale = new TransformGroup();
+ Transform3D textMat = new Transform3D();
+ // Assuming uniform size chars, set scale to fit string in view
+ textMat.setScale(1.2/sl);
+ objScale.setTransform(textMat);
+
+
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ objRoot.addChild(objTrans);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ Appearance apText = new Appearance();
+ Material m = new Material();
+ m.setLightingEnable(true);
+ apText.setMaterial(m);
+
+
+ Appearance apEarth= new Appearance();
+ Material mm = new Material();
+ mm.setLightingEnable(true);
+ apEarth.setMaterial(mm);
+
+ Appearance apStone = new Appearance();
+ apStone.setMaterial(mm);
+
+// create 3D text
+ Font3D f3d = new Font3D(new Font(fontName, Font.PLAIN, 2),
+ new FontExtrusion());
+ Text3D txt = new Text3D(f3d, textString,
+ new Point3f( -sl/2.0f, 3.0f, 0.0f));
+ OrientedShape3D textShape = new OrientedShape3D();
+ textShape.setGeometry(txt);
+ textShape.setAppearance(apText);
+ textShape.setAlignmentAxis( 0.0f, 1.0f, 0.0f);
+ objScale.addChild( textShape );
+
+
+ // Create a simple shape leaf node, add it to the scene graph.
+
+ Transform3D cubeMat = new Transform3D();
+ TransformGroup cubeTrans = new TransformGroup(cubeMat);
+ cubeMat.set(new Vector3d(0.9, 0.0, -1.0));
+ cubeTrans.setTransform(cubeMat);
+ cubeTrans.addChild(new ColorCube(0.3));
+ objTrans.addChild(cubeTrans);
+
+ TextureLoader stoneTex = new TextureLoader(stoneImage, new String("RGB"),
+ TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, this);
+ if (stoneTex != null) apStone.setTexture(stoneTex.getTexture());
+
+ TextureAttributes texAttr = new TextureAttributes();
+ texAttr.setTextureMode(TextureAttributes.MODULATE);
+ apStone.setTextureAttributes(texAttr);
+
+
+ Transform3D coneMat = new Transform3D();
+ TransformGroup coneTrans = new TransformGroup(coneMat);
+ coneMat.set(new Vector3d(0.0, 0.0, 0.0));
+ coneTrans.setTransform(coneMat);
+ coneTrans.addChild(new Cone(.2f, 0.8f, Cone.GENERATE_NORMALS |
+ Cone.GENERATE_TEXTURE_COORDS |
+ Cone.GENERATE_TEXTURE_COORDS_Y_UP, apStone));
+ objTrans.addChild(coneTrans);
+
+ TextureLoader earthTex = new TextureLoader(earthImage, new String("RGB"),
+ TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, this);
+ if (earthTex != null) apEarth.setTexture(earthTex.getTexture());
+
+ apEarth.setTextureAttributes(texAttr);
+
+ Transform3D cylinderMat = new Transform3D();
+ TransformGroup cylinderTrans = new TransformGroup(cylinderMat);
+ cylinderMat.set(new Vector3d(-0.9, 0.5, -1.0));
+ cylinderTrans.setTransform(cylinderMat);
+ cylinderTrans.addChild(new Cylinder(.35f, 2.0f, Cylinder.GENERATE_NORMALS |
+ Cylinder.GENERATE_TEXTURE_COORDS |
+ Cylinder.GENERATE_TEXTURE_COORDS_Y_UP, apEarth));
+ objTrans.addChild(cylinderTrans);
+
+ objTrans.addChild(objScale);
+
+
+
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
+ Background bgNode = new Background(bgColor);
+ bgNode.setApplicationBounds(bounds);
+ objRoot.addChild(bgNode);
+
+ // Set up the ambient light
+ Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
+ AmbientLight ambientLightNode = new AmbientLight(ambientColor);
+ ambientLightNode.setInfluencingBounds(bounds);
+ objRoot.addChild(ambientLightNode);
+
+ // Set up the directional lights
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);
+ Color3f light2Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
+
+ DirectionalLight light1
+ = new DirectionalLight(light1Color, light1Direction);
+ light1.setInfluencingBounds(bounds);
+ objRoot.addChild(light1);
+
+ DirectionalLight light2
+ = new DirectionalLight(light2Color, light2Direction);
+ light2.setInfluencingBounds(bounds);
+ objRoot.addChild(light2);
+
+ apText.setMaterial(mm);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ public OrientedTest() {
+ }
+
+ public OrientedTest(java.net.URL earthURL, java.net.URL stoneURL) {
+ earthImage = earthURL;
+ stoneImage = stoneURL;
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ // the paths to the image files for an applet
+ earthImage = Resources.getResource("resources/images/earth.jpg");
+ if (earthImage == null) {
+ System.err.println("resources/images/earth.jpg not found");
+ System.exit(1);
+ }
+
+ stoneImage = Resources.getResource("resources/images/stone.jpg");
+ if (stoneImage == null) {
+ System.err.println("resources/images/stone.jpg not found");
+ System.exit(1);
+ }
+
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+
+ // Create a simple scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph();
+ u = new SimpleUniverse(c, 4);
+
+ // add mouse behaviors to ViewingPlatform
+ ViewingPlatform viewingPlatform = u.getViewingPlatform();
+
+ // there is a special rotate behavior, so can't use the utility
+ // method
+ MouseRotateY rotate = new MouseRotateY(MouseRotateY.INVERT_INPUT);
+ rotate.setTransformGroup(viewingPlatform.getMultiTransformGroup().
+ getTransformGroup(0));
+ BranchGroup rotateBG = new BranchGroup();
+ rotateBG.addChild(rotate);
+ viewingPlatform.addChild(rotateBG);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ rotate.setSchedulingBounds(bounds);
+
+ MouseZoom zoom =
+ new MouseZoom(c, MouseZoom.INVERT_INPUT);
+ zoom.setTransformGroup(viewingPlatform.getMultiTransformGroup().
+ getTransformGroup(1));
+ zoom.setSchedulingBounds(bounds);
+ BranchGroup zoomBG = new BranchGroup();
+ zoomBG.addChild(zoom);
+ viewingPlatform.addChild(zoomBG);
+
+ MouseTranslate translate =
+ new MouseTranslate(c, MouseTranslate.INVERT_INPUT);
+ translate.setTransformGroup(viewingPlatform.getMultiTransformGroup().
+ getTransformGroup(2));
+ translate.setSchedulingBounds(bounds);
+ BranchGroup translateBG = new BranchGroup();
+ translateBG.addChild(translate);
+ viewingPlatform.addChild(translateBG);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+
+ u.addBranchGraph(scene);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ //
+ // The following allows OrientedTest to be run as an application
+ // as well as an applet
+ //
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.net.URL earthURL = null;
+ java.net.URL stoneURL = null;
+
+ earthURL = Resources.getResource("resources/images/earth.jpg");
+ if (earthURL == null) {
+ System.err.println("resources/images/earth.jpg not found");
+ System.exit(1);
+ }
+
+ stoneURL = Resources.getResource("resources/images/stone.jpg");
+ if (stoneURL == null) {
+ System.err.println("resources/images/stone.jpg not found");
+ System.exit(1);
+ }
+
+ new MainFrame(new OrientedTest(earthURL, stoneURL), 400, 400);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/overlay2d/Canvas3D2D.java b/src/main/java/org/jdesktop/j3d/examples/overlay2d/Canvas3D2D.java
new file mode 100644
index 0000000..f0e20cb
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/overlay2d/Canvas3D2D.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.overlay2d;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.J3DGraphics2D;
+
+/**
+ * This is an extension to the Canvas3D with the postRender method overridden to draw some things on the
+ * 2DGraphics of the Canvas3D
+ */
+public class Canvas3D2D extends Canvas3D
+{
+
+ public Canvas3D2D(GraphicsConfiguration gc)
+ {
+ super(gc);
+ }
+
+ @Override
+ public void postRender()
+ {
+ J3DGraphics2D g = getGraphics2D();
+
+ // draw a cross hair
+ g.drawLine((this.getWidth() / 2) - 5, (this.getHeight() / 2), (this.getWidth() / 2) + 5, (this.getHeight() / 2));
+ g.drawLine((this.getWidth() / 2), (this.getHeight() / 2) - 5, (this.getWidth() / 2), (this.getHeight() / 2) + 5);
+
+ g.drawString("This is an example String", 50, 20);
+
+ // etc e.g.
+ //g.drawImage(getBufferedImage(), 10, 50, null);
+
+ g.flush(false);
+
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/jdesktop/j3d/examples/overlay2d/Overlay2D.java b/src/main/java/org/jdesktop/j3d/examples/overlay2d/Overlay2D.java
new file mode 100644
index 0000000..adf4d8f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/overlay2d/Overlay2D.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.overlay2d;
+
+import java.awt.GraphicsConfiguration;
+import java.net.URL;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.TextureAttributes;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TriangleArray;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.TexCoord2f;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * Simple Java 3D example program to show use of the 2DGraphics overlay.
+ */
+public class Overlay2D extends javax.swing.JFrame
+{
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ public BranchGroup createSceneGraph()
+ {
+ final BranchGroup objRoot = new BranchGroup();
+
+ // Create a triangle with each point a different color. Remember to
+ // draw the points in counter-clockwise order. That is the default
+ // way of determining which is the front of a polygon.
+ // o (1)
+ // / \
+ // / \
+ // (2) o-----o (0)
+ Shape3D shape = new Shape3D();
+ TriangleArray tri = new TriangleArray(3, GeometryArray.COORDINATES | GeometryArray.COLOR_3 | GeometryArray.TEXTURE_COORDINATE_2);
+ tri.setCoordinate(0, new Point3f(0.5f, 0.0f, 0.0f));
+ tri.setCoordinate(1, new Point3f(0.0f, 0.5f, 0.0f));
+ tri.setCoordinate(2, new Point3f(-0.5f, 0.0f, 0.0f));
+ tri.setColor(0, new Color3f(1.0f, 0.0f, 0.0f));
+ tri.setColor(1, new Color3f(0.0f, 1.0f, 0.0f));
+ tri.setColor(2, new Color3f(0.0f, 0.0f, 1.0f));
+ tri.setTextureCoordinate(0, 0, new TexCoord2f(1.0f, 0.0f));
+ tri.setTextureCoordinate(0, 1, new TexCoord2f(0.0f, 1.0f));
+ tri.setTextureCoordinate(0, 2, new TexCoord2f(0.0f, 0.0f));
+
+ // Because we're about to spin this triangle, be sure to draw
+ // backfaces. If we don't, the back side of the triangle is invisible.
+ Appearance ap = new Appearance();
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setCullFace(PolygonAttributes.CULL_NONE);
+ ap.setPolygonAttributes(pa);
+
+ // Add a transformed texture to the cube, for interest sake
+ URL earthURL = Resources.getResource("resources/images/earth.jpg");
+ Texture earthTex = new TextureLoader(earthURL, this).getTexture();
+ ap.setTexture(earthTex);
+
+ TextureAttributes textureAttributes = new TextureAttributes();
+ Transform3D textureTransform = new Transform3D();
+ textureTransform.rotZ(Math.PI / 3f);
+ textureTransform.setTranslation(new Vector3f(10, 1, 0));
+ textureAttributes.setTextureTransform(textureTransform);
+
+ ap.setTextureAttributes(textureAttributes);
+
+ shape.setAppearance(ap);
+
+ // Set up a simple RotationInterpolator
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 5.0);
+ TransformGroup tg = new TransformGroup();
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, 4000);
+ tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, tg, yAxis, 0.0f, (float) Math.PI * 2.0f);
+ rotator.setSchedulingBounds(bounds);
+
+ shape.setGeometry(tri);
+ tg.addChild(rotator);
+ tg.addChild(shape);
+ objRoot.addChild(tg);
+ objRoot.compile();
+ return objRoot;
+
+ }
+
+ private Canvas3D2D createUniverse()
+ {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D2D c = new Canvas3D2D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ public Overlay2D()
+ {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D2D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("Overlay2D");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(250, 250));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[])
+ {
+
+ System.setProperty("sun.awt.noerasebackground", "true");
+ //System.setProperty("j3d.rend", "jogl2es2");
+
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
+ public void run()
+ {
+ new Overlay2D().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/package_info/PackageInfo.form b/src/main/java/org/jdesktop/j3d/examples/package_info/PackageInfo.form
new file mode 100644
index 0000000..a82c39c
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/package_info/PackageInfo.form
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="Package Info"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[400, 400]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JTextArea" name="myTextArea">
+ <Properties>
+ <Property name="columns" type="int" value="20"/>
+ <Property name="editable" type="boolean" value="false"/>
+ <Property name="rows" type="int" value="5"/>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/package_info/PackageInfo.java b/src/main/java/org/jdesktop/j3d/examples/package_info/PackageInfo.java
new file mode 100644
index 0000000..d44e2a9
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/package_info/PackageInfo.java
@@ -0,0 +1,139 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.package_info;
+
+import javax.swing.JTextArea;
+
+public class PackageInfo extends javax.swing.JFrame {
+
+ private void pkgInfo(JTextArea textArea,
+ ClassLoader classLoader,
+ String pkgName,
+ String className) {
+
+ try {
+ classLoader.loadClass(pkgName + "." + className);
+
+ Package p = Package.getPackage(pkgName);
+ if (p == null) {
+ textArea.append("WARNING: Package.getPackage(" +
+ pkgName +
+ ") is null\n");
+ } else {
+ textArea.append(p.toString() + "\n");
+ textArea.append("Specification Title = " +
+ p.getSpecificationTitle() + "\n");
+ textArea.append("Specification Vendor = " +
+ p.getSpecificationVendor() + "\n");
+ textArea.append("Specification Version = " +
+ p.getSpecificationVersion() + "\n");
+
+ textArea.append("Implementation Vendor = " +
+ p.getImplementationVendor() + "\n");
+ textArea.append("Implementation Version = " +
+ p.getImplementationVersion() + "\n");
+ }
+ } catch (ClassNotFoundException e) {
+ textArea.append("Unable to load " + pkgName + "\n");
+ }
+
+ textArea.append("\n");
+ }
+
+ /**
+ * Creates new form PackageInfo
+ */
+ public PackageInfo() {
+ initComponents();
+
+ ClassLoader classLoader = getClass().getClassLoader();
+
+ pkgInfo(myTextArea, classLoader, "org.jogamp.vecmath", "Point3d");
+ pkgInfo(myTextArea, classLoader, "org.jogamp.java3d", "SceneGraphObject");
+ pkgInfo(myTextArea, classLoader, "com.sun.j3d.utils.universe", "SimpleUniverse");
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ jScrollPane1 = new javax.swing.JScrollPane();
+ myTextArea = new javax.swing.JTextArea();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("Package Info");
+ jScrollPane1.setPreferredSize(new java.awt.Dimension(400, 400));
+ myTextArea.setColumns(20);
+ myTextArea.setEditable(false);
+ myTextArea.setRows(5);
+ jScrollPane1.setViewportView(myTextArea);
+
+ getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new PackageInfo().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JScrollPane jScrollPane1;
+ private javax.swing.JTextArea myTextArea;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/package_info/QueryProperties.form b/src/main/java/org/jdesktop/j3d/examples/package_info/QueryProperties.form
new file mode 100644
index 0000000..daef961
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/package_info/QueryProperties.form
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="QueryProperties"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[400, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JTextArea" name="myTextArea">
+ <Properties>
+ <Property name="columns" type="int" value="20"/>
+ <Property name="editable" type="boolean" value="false"/>
+ <Property name="rows" type="int" value="5"/>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/package_info/QueryProperties.java b/src/main/java/org/jdesktop/j3d/examples/package_info/QueryProperties.java
new file mode 100644
index 0000000..16a3116
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/package_info/QueryProperties.java
@@ -0,0 +1,203 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.package_info;
+
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.JTextArea;
+
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.GraphicsConfigTemplate3D;
+import org.jogamp.java3d.VirtualUniverse;
+
+public class QueryProperties extends javax.swing.JFrame {
+
+ public static void printProps(JTextArea textArea, Map map, String[] propList) {
+ // Create an alphabetical list of keys
+ List keyList = new ArrayList(map.keySet());
+ Collections.sort(keyList);
+ Iterator it;
+
+ // Collection used to remember the properties we've already
+ // printed, so we don't print them twice
+ HashSet hs = new HashSet();
+
+ // Print out the values for the caller-specified properties
+ String key;
+ for (int i = 0; i < propList.length; i++) {
+ int len = propList[i].length();
+ int idxWild = propList[i].indexOf('*');
+ if (idxWild < 0) {
+ key = propList[i];
+ if (!hs.contains(key)) {
+ textArea.append(key + " = " + map.get(key) + "\n");
+ hs.add(key);
+ }
+ }
+ else if (idxWild == len-1) {
+ String pattern = propList[i].substring(0, len-1);
+ it = keyList.iterator();
+ while (it.hasNext()) {
+ key = (String)it.next();
+ if (key.startsWith(pattern) && !hs.contains(key)) {
+ textArea.append(key + " = " + map.get(key) + "\n");
+ hs.add(key);
+ }
+ }
+ }
+ else {
+ textArea.append(propList[i] +
+ " = ERROR: KEY WITH EMBEDDED WILD CARD IGNORED\n");
+ }
+ }
+
+ // Print out the values for those properties not already printed
+ it = keyList.iterator();
+ while (it.hasNext()) {
+ key = (String)it.next();
+ if (!hs.contains(key)) {
+ textArea.append(key + " = " + map.get(key) + "\n");
+ }
+ }
+
+ }
+
+ /** Creates new form QueryProperties */
+ public QueryProperties() {
+ initComponents();
+
+ VirtualUniverse vu = new VirtualUniverse();
+ Map vuMap = vu.getProperties();
+ final String[] vuPropList = {
+ "j3d.version",
+ "j3d.vendor",
+ "j3d.specification.version",
+ "j3d.specification.vendor",
+ "j3d.*"
+ // Just print all other properties in alphabetical order
+ };
+
+ printProps(myTextArea, vuMap, vuPropList);
+ myTextArea.append("\n");
+
+ GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();
+
+ /* We need to set this to force choosing a pixel format
+ that support the canvas.
+ */
+ template.setStereo(template.PREFERRED);
+ template.setSceneAntialiasing(template.PREFERRED);
+
+ GraphicsConfiguration config =
+ GraphicsEnvironment.getLocalGraphicsEnvironment().
+ getDefaultScreenDevice().getBestConfiguration(template);
+
+ Map c3dMap = new Canvas3D(config).queryProperties();
+ final String[] c3dPropList = {
+ "native.*",
+ "doubleBufferAvailable",
+ "stereoAvailable",
+ "sceneAntialiasing*",
+ "compressedGeometry.majorVersionNumber",
+ "compressedGeometry.minorVersionNumber",
+ "compressedGeometry.*",
+ "textureUnitStateMax",
+ "textureWidthMax",
+ "textureHeightMax",
+ // Just print all other properties in alphabetical order
+ };
+
+ printProps(myTextArea, c3dMap, c3dPropList);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ jScrollPane1 = new javax.swing.JScrollPane();
+ myTextArea = new javax.swing.JTextArea();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("QueryProperties");
+ jScrollPane1.setPreferredSize(new java.awt.Dimension(400, 500));
+ myTextArea.setColumns(20);
+ myTextArea.setEditable(false);
+ myTextArea.setRows(5);
+ jScrollPane1.setViewportView(myTextArea);
+
+ getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new QueryProperties().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JScrollPane jScrollPane1;
+ private javax.swing.JTextArea myTextArea;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/BoltCG.java b/src/main/java/org/jdesktop/j3d/examples/picking/BoltCG.java
new file mode 100644
index 0000000..44db05f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/BoltCG.java
@@ -0,0 +1,359 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.CompressedGeometry;
+import org.jogamp.java3d.CompressedGeometryHeader;
+
+class BoltCG extends CompressedGeometry {
+
+ BoltCG() {
+ super(cgHeader, cgData) ;
+ }
+
+ private static final byte cgData[] = {
+ 25, 0, -120, 16, -124, 64, 33, -35,
+ 0, 67, 60, 48, -121, 90, 1, 3,
+ 116, -62, 25, 105, -60, 60, -32, 8,
+ 5, -58, 16, -9, -114, 32, -1, -104,
+ 67, 16, 0, -117, -128, 97, 40, 62,
+ -62, -128, -122, 5, 67, 48, 10, -76,
+ -32, 21, 1, 6, 40, 10, -128, 86,
+ -123, 24, -96, 76, 65, 74, 88, 2,
+ -117, -80, -59, 21, 113, -118, -40, -28,
+ 21, 110, 6, 40, 27, 64, 81, 23,
+ -124, -7, 47, 54, 13, -3, -4, 69,
+ 40, 25, -69, -99, -123, 64, 8, 48,
+ 3, 64, 16, 23, 16, 97, -39, 8,
+ -20, -125, 0, 36, 2, 1, -123, 2,
+ 8, -120, 48, 27, 122, 91, 65, -67,
+ 108, 18, 26, 13, -12, -35, 95, -48,
+ 107, 63, -5, 91, -46, 12, 84, -44,
+ -53, -120, 54, -45, -98, 115, 64, -69,
+ 92, 126, -55, 1, 6, -80, 34, -49,
+ -24, 53, -30, 61, -19, 9, 6, -76,
+ 10, -115, -24, 53, 87, -54, -2, -127,
+ 113, 68, -15, -33, 16, 97, -9, 113,
+ -54, -30, 12, 75, 34, -48, -48, 107,
+ 86, -32, -10, -125, 97, -42, 19, -78,
+ 12, 0, -48, 4, 4, 68, 8, 12,
+ -67, -69, 32, -64, 9, 0, 0, 92,
+ 65, -121, 116, 42, 10, 13, 98, -52,
+ -97, 16, 34, 104, 114, 75, 66, 12,
+ -45, 11, -82, 32, -34, -74, -127, -15,
+ 6, 74, 51, 70, -81, 32, -42, 27,
+ 105, 13, 6, -97, 13, 111, -24, 22,
+ -12, 22, -19, -95, 6, -49, -85, -48,
+ 16, 107, 2, 44, -8, -125, 6, 73,
+ -123, -97, 16, 37, 40, 68, -22, -30,
+ 12, 58, 97, 80, -112, 104, -16, -104,
+ -72, -125, 122, -38, 22, -12, 25, -114,
+ -39, 124, 64, -111, -115, -112, -49, -24,
+ 53, -34, 85, -23, 5, 6, -82, -26,
+ 15, 104, 54, 1, -31, 62, 32, 68,
+ -17, 100, -58, 84, 27, 33, -54, -66,
+ -125, 55, -2, -89, 32, -119, 122, -73,
+ -25, -36, 105, -128, 8, 53, -128, 2,
+ 76, -71, 9, -56, -128, 30, 112, -59,
+ -48, 96, -37, 0, 0, 0, 9, -112,
+ 28, -117, 100, 64, 127, 58, 113, -58,
+ 13, 96, 0, -109, 46, 70, 50, 80,
+ 103, -88, 56, -86, 13, 96, 0, -109,
+ 46, 67, 114, -112, 95, -74, 49, 84,
+ 49, -74, -72, 15, 96, 2, 80, 6,
+ 55, 80, 0, -36, 82, 0, 40, 3,
+ 108, 1, -58, -95, -63, -84, 0, 18,
+ 101, -56, -74, 87, 10, 56, 39, 31,
+ -32, -43, -32, 9, 50, -28, 87, 46,
+ -125, 28, -61, -117, -48, 107, 0, 4,
+ -103, 114, 19, -105, -65, -98, 117, -60,
+ 32, -63, -84, 0, 18, 101, -116, -74,
+ 45, 1, -15, 1, -57, 0, -29, -116,
+ 26, -64, 1, 38, 92, -116, 101, 111,
+ 79, 124, 113, 83, -6, -68, 8, 37,
+ -36, -83, -4, -93, -4, 109, 46, 55,
+ 6, -81, 0, 73, -105, 33, -71, 63,
+ -57, -40, -36, 82, 28, 26, -64, 1,
+ 38, 92, -117, 100, -113, 71, 71, 113,
+ -2, 13, 96, 0, -109, 46, 69, 114,
+ 47, -41, -99, -72, -67, 6, -80, 0,
+ 73, -107, -63, 72, -64, -113, -83, 99,
+ 72, 53, 97, -6, 65, 57, -67, 60,
+ -38, -26, -63, -78, 105, 11, 112, 85,
+ 110, 101, -95, 58, -128, 16, 107, -125,
+ 90, -60, 3, 0, 0, 1, 0, 32,
+ 64, 67, -32, -54, -41, -103, 113, 6,
+ -55, -92, 45, -63, 85, -71, -106, -34,
+ -22, 0, 55, -79, -36, -28, 62, -95,
+ -68, 97, -73, -41, -70, -122, -13, 117,
+ -50, 94, -22, 32, 80, 21, 77, -39,
+ 6, 0, 48, 6, 2, 10, 13, 61,
+ 106, -104, 80, 32, -68, -125, 64, -75,
+ 100, 17, 91, -78, 90, -67, -42, 24,
+ 55, 27, -39, 61, 0, -56, 63, -40,
+ -71, -95, -124, 49, 74, 37, 3, 7,
+ -83, 118, -18, 13, -79, 30, -96, -126,
+ 80, 77, 53, 19, -32, -47, -121, -103,
+ 104, -122, 82, 89, -19, 56, 92, 45,
+ -96, -73, 42, -128, 16, 109, -120, -11,
+ 4, 18, -126, 105, -88, 126, 70, -127,
+ -56, -24, 48, -43, -36, 20, -25, -48,
+ -60, -115, -4, -98, -42, -31, -84, 8,
+ -35, -13, 59, -96, -36, 11, 1, 64,
+ 69, 65, -126, 80, -85, 10, 4, 22,
+ -48, 97, 109, -42, -114, 71, 112, -106,
+ -58, -51, 6, 104, 48, 82, 8, -19,
+ -74, -36, -81, -100, -56, -122, 85, 34,
+ -111, -37, 125, -83, 103, 65, -89, 125,
+ -30, -15, 36, -20, -5, 81, -63, 68,
+ 27, -17, -89, -83, 3, -63, -89, 33,
+ -24, 66, 0, 7, 50, 45, 2, -56,
+ 17, 6, -99, -9, -117, -60, -109, -77,
+ -19, 122, 5, 14, 96, 110, 114, 71,
+ -92, 117, 39, 107, 93, -50, 105, 49,
+ 110, -75, 80, 46, -125, -68, -18, -125,
+ 80, 60, 10, 1, -111, 6, -76, 10,
+ 48, -96, 65, 105, 6, -120, 27, 8,
+ 68, -77, -109, -59, 90, -64, 16, 106,
+ -61, -12, -26, 17, 26, 10, 54, -53,
+ 40, -88, 1, 6, -14, 124, 52, 32,
+ -39, 13, -117, 66, 13, 63, -111, -80,
+ -96, 65, 117, 6, 103, -11, -120, 104,
+ 54, -49, 116, 92, 65, -102, -84, -125,
+ 50, 12, 87, -109, 67, 64, -124, 106,
+ -22, -22, 12, 28, -24, -48, -48, 109,
+ 94, -22, -48, -125, 10, -96, 75, -120,
+ 17, 39, -119, 104, 65, -92, -110, 68,
+ 36, 27, 99, -87, -73, -96, -56, -42,
+ -85, 18, 12, 8, 3, -22, 0, 28,
+ 1, 120, 34, -112, -6, -81, 52, -64,
+ 4, 24, -88, 0, 0, 14, 0, -104,
+ 39, 32, 44, 23, -98, -125, 6, 44,
+ 0, 0, 3, -128, 38, 22, -56, 95,
+ 13, -25, 24, 49, 80, 0, 0, 28,
+ 1, 48, -58, -28, -38, -113, 42, -125,
+ 21, 0, 0, 1, -80, 19, 70, -24,
+ 73, -46, -13, 80, -32, -59, 64, 0,
+ 0, 108, 7, -94, -37, -127, -1, 30,
+ 127, -125, 21, 0, 0, 1, -64, 30,
+ -118, -18, -124, -124, 121, 122, 12, 84,
+ 0, 0, 7, 0, 78, 19, -81, -32,
+ 99, -56, 65, -125, 22, 0, 0, 1,
+ -64, 30, 11, 110, 64, 117, 0, 0,
+ 2, -106, 48, 106, 2, 56, -102, 99,
+ 126, 15, 53, 37, 65, -81, -8, -30,
+ 104, -36, -75, -8, -98, 82, 28, 24,
+ -88, 0, 0, 13, -128, -104, 91, 93,
+ -20, -41, -97, -32, -59, 64, 0, 0,
+ 112, 7, -94, -69, 31, 56, -98, 94,
+ -125, 21, 0, 0, 1, -64, 24, 77,
+ -96, -39, -12, 65, -125, 41, 86, -79,
+ 58, 14, -56, 87, 102, -112, 105, -50,
+ 18, -42, 11, 91, 10, -54, -9, 6,
+ 61, -1, -87, 3, 51, 55, -14, 86,
+ 108, 80, 111, -5, -18, -110, 55, 34,
+ 112, -43, 114, -123, 6, 1, 63, 9,
+ 32, -11, 21, 28, 87, 36, 4, 32,
+ -56, 83, -3, 36, -82, -1, -60, -86,
+ -31, -63, -88, -40, 98, 73, -99, -72,
+ 71, 27, 59, 6, 3, 38, -110, 12,
+ 111, -92, 4, -39, -8, 49, -111, 74,
+ -112, 51, 28, -18, -90, -64, 37, 6,
+ 80, -54, -38, -51, 106, -93, 73, -80,
+ 5, 8, 50, 119, 84, -116, 47, 110,
+ 123, -10, -60, 45, 6, 45, 104, 81,
+ -116, 106, 15, 126, -40, -40, 48, 101,
+ 42, -30, 109, 90, -16, 69, 123, -81,
+ -47, 6, 112, 0, 0, 9, 1, 4,
+ 78, 1, 17, -114, -67, 6, 12, -32,
+ 0, 0, 18, 2, 9, 108, -111, -28,
+ 29, 113, -125, 56, 0, 0, 4, -128,
+ -124, 99, 119, 92, 87, 85, 65, -100,
+ 0, 0, 2, 64, 106, 53, -112, 31,
+ 101, -80, 30, 13, -35, -80, 85, -86,
+ -95, -63, -109, -1, 117, -46, -38, 46,
+ -94, -70, 127, 6, -112, 0, 0, 119,
+ 1, 124, -82, 39, 15, 46, -113, 65,
+ -92, 0, 0, 29, -128, 127, 19, -67,
+ -4, -112, -82, -127, 6, 13, 40, 0,
+ 0, -18, 2, -15, 108, -81, -40, 29,
+ 49, -125, 72, 0, 0, 59, 0, -70,
+ 99, 9, -61, -106, -91, 65, -112, 31,
+ 102, -44, 27, 62, -118, 116, 65, -92,
+ 0, 0, 29, -64, 117, 65, -100, 0,
+ 0, 2, 64, 122, 27, -111, -127, -35,
+ -75, 33, -63, -80, 8, -92, 34, -40,
+ -52, 86, -70, -1, 6, 108, 0, 0,
+ 10, 1, 4, -82, 122, 114, -114, -81,
+ 65, -100, 0, 0, 2, 64, 115, 26,
+ -113, -107, -98, -115, -46, -95, -63, -71,
+ 0, 0, 28, -128, 87, 65, -123, -57,
+ -69, -22, 12, 4, 9, -32, 118, 65,
+ -128, 24, 7, -128, -96, -127, 27, -128,
+ 101, -12, 27, 36, 13, -93, -96, -50,
+ -29, 89, -31, 6, -114, 0, 0, 29,
+ -96, 48, -96, 65, -7, 6, -4, 72,
+ 30, -79, 32, -56, 32, 59, -32, 60,
+ 96, 23, -48, 110, -124, 50, -80, -127,
+ 116, -126, -89, 100, 25, -128, 0, 120,
+ 15, 72, 51, 119, -74, 52, 32, -38,
+ -8, -94, -70, 5, 65, -123, 30, 16,
+ 104, -96, 0, 1, -36, 3, 42, 13,
+ -1, 127, 124, 26, -122, -64, 5, -22,
+ -4, 74, 12, 0, 68, -102, -48, 99,
+ 117, 1, 73, 6, -72, -55, -17, -120,
+ 54, 115, -83, -3, 73, 6, -46, 15,
+ -85, -88, 50, 112, -91, 104, 65, -110,
+ 43, 22, -12, 27, 27, 83, 104, 65,
+ -114, -126, -105, -64, -119, -33, 105, -120,
+ -71, 76, 0, 65, -81, -99, -54, 82,
+ 13, 3, 78, 81, 80, 107, -25, 76,
+ -122, -125, 0, -60, 23, -28, 10, -17,
+ -97, 42, -24, -125, 112, 0, 0, 56,
+ -128, -76, -125, 32, -43, -89, -92, 27,
+ -65, 50, -99, -112, 96, 1, 0, -32,
+ 40, -96, 72, 49, -107, 57, 6, -34,
+ -109, 104, 40, 51, 12, 68, 67, 64,
+ -128, 98, 11, -78, 12, -64, 16, 24,
+ 7, -108, 25, -64, 0, 0, 9, -128,
+ -16, 109, 72, 0, 0, 14, -48, 30,
+ -20, 56, 55, -23, 7, 43, -96, -54,
+ -29, -35, 97, 6, -88, 69, 13, 8,
+ 49, 69, -46, -6, -127, 14, 68, -125,
+ -34, 80, 103, 0, 0, 0, 36, 2,
+ 58, 12, 110, 53, -44, 80, 110, -112,
+ 112, -54, -125, 127, -33, -40, 80, 32,
+ -68, -125, 59, -18, -74, 36, 25, 0,
+ 0, 0, 7, -66, 3, -14, 13, -1,
+ -12, 31, 104, 64, -118, 46, -105, 100,
+ 24, 1, 32, 104, 14, -120, 55, 32,
+ 0, 3, -112, 15, -29, 85, 84, -127,
+ 5, -120, 9, 65, -112, 0, 0, 0,
+ 123, -32, 63, 32, -38, -57, 127, 55,
+ -44, 24, -97, 40, 18, -4, -125, 105,
+ 56, -15, 95, 80, 96, -68, 16, -93,
+ 122, 5, 110, -88, 40, 32, -64, 20,
+ 113, -11, 6, 11, -59, 8, -69, 32,
+ -64, 12, 0, -64, 111, 64, -83, -43,
+ 7, 100, 24, -128, -96, 88, 12, 104,
+ 53, -4, 0, 0, 0, -124, 7, -64,
+ -118, -33, -106, -102, -13, -84, 0, 65,
+ -100, 0, 0, 0, -104, 9, 72, 50,
+ 13, 56, 126, 65, -70, -4, -6, -49,
+ -88, 50, 112, -39, -59, -115, 6, -83,
+ 1, -13, 1, -53, 0, -8, -125, 37,
+ 13, 34, -41, 16, 107, -25, 116, -122,
+ -125, 0, -60, 7, -16, -118, 102, 102,
+ -36, -66, -118, 0, 65, -67, -1, -30,
+ 10, 12, -99, 74, 94, -48, 110, -31,
+ 108, 104, 65, -102, -87, 103, -60, 8,
+ 34, -100, 36, -2, -125, 124, -84, -5,
+ -97, 16, 98, 43, -46, 27, 34, 12,
+ 127, -101, 127, 64, -80, -47, -16, -19,
+ 8, 53, -33, 88, -8, -125, 20, 109,
+ 19, 95, -48, 111, -111, -1, -117, 66,
+ 13, -57, 92, 63, -96, 93, -104, -99,
+ 119, -60, 24, 84, -16, 82, -8, -125,
+ 3, 80, 2, -38, 16, 103, -116, 101,
+ -19, 2, -18, 110, -26, 68, 24, -117,
+ -98, -56, -125, 5, -64, -35, -112, 96,
+ 4, 0, 32, 63, -102, 89, 15, 119,
+ -122, 112, 12, 32, -38, -68, 70, -110,
+ 91, -114, -68, 111, 2, 16, 96, -65,
+ -23, -123, 2, 13, 7, 118, -36, 104,
+ -127, 46, -26, -117, -92, -19, 36, 102,
+ 0, -128, -64, 61, -61, 84, 87, -73,
+ 74, 32, -24, 50, 11, 10, 111, 57,
+ -79, -36, -28, 10, 93, 24, 4, 22,
+ 106, -32, -42, 17, -42, -29, -104, -37,
+ 74, 105, -73, -9, -48, 112, -35, -82,
+ 107, 119, 73, 10, -33, 78, -4, -79,
+ -97, 96, -54, -14, 54, -128, 58, 97,
+ 8, 111, 4, 3, -50, -37, -53, 64,
+ -124, 0, 14, -103, 65, -41, -127, 8,
+ 53, 6, -14, 65, 65, -97, -48, 115,
+ 113, -51, -74, 42, 50, 82, 57, 40,
+ -86, -53, -100, -41, -66, -74, 106, -125,
+ 82, 116, -39, -48, 38, 51, 107, 121,
+ 44, 88, -28, 34, 96, 4, -78, 4,
+ 75, 118, -64, 16, 96, 4, -127, -96,
+ 45, -110, 88, 14, -31, 3, 0, 65,
+ -65, -128, 10, 25, 44, -61, 81, -40,
+ -16, 3, -85, -100, 0, 20, 6, -12,
+ 3, 49, -63, -107, 14, 15, 71, -16,
+ 99, 19, -81, -37, -102, -15, -37, 32,
+ -21, -7, 6, -91, -81, 91, -119, -4,
+ 88, -77, -20, 26, -49, -96, -54, 23,
+ 112, -72, -41, -35, 64, 8, 53, 11,
+ 14, 102, 65, -123, -35, -52, -94, 55,
+ 24, -7, -45, -72, -75, -123, 0, 0,
+ 22, -64, 111, -16, 2, 13, 97, -46,
+ 48, -96, 65, 0, 86, 40, 32, -120,
+ 21, -124, -115, 46, 54, 29, -69, 11,
+ 88, 0, -96, 96, 11, -32, 60, 20,
+ -94, 25, 99, 53, 97, -125, 8, 91,
+ -48, 2, 101, 113, -54, -128, -20, 0,
+ 10, -85, -70, -117, 50, 32, 1, 6,
+ 75, 84, 46, -99, -38, -53, -51, 9,
+ -59, -59, 52, 25, 121, 16, 0, 119,
+ 27, -114, -108, 39, 21, 4, -111, -26,
+ 116, 64, 2, 13, 121, -104, 105, 63,
+ -115, 58, -42, 122, -125, 106, -15, 25,
+ -112, 99, 35, -32, 8, 5, -96, 0
+ } ;
+
+ private static final CompressedGeometryHeader cgHeader ;
+
+ static {
+ cgHeader = new CompressedGeometryHeader() ;
+ cgHeader.majorVersionNumber = 1 ;
+ cgHeader.minorVersionNumber = 0 ;
+ cgHeader.minorMinorVersionNumber = 1 ;
+ cgHeader.bufferType = CompressedGeometryHeader.TRIANGLE_BUFFER ;
+ cgHeader.bufferDataPresent = CompressedGeometryHeader.NORMAL_IN_BUFFER ;
+ cgHeader.start = 0 ;
+ cgHeader.size = cgData.length ;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/ColorCube.java b/src/main/java/org/jdesktop/j3d/examples/picking/ColorCube.java
new file mode 100644
index 0000000..a92f641
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/ColorCube.java
@@ -0,0 +1,122 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.QuadArray;
+
+class ColorCube extends QuadArray {
+ private static final float[] verts = {
+ // front face
+ 1.0f, -1.0f, 1.0f,
+ 1.0f, 1.0f, 1.0f,
+ -1.0f, 1.0f, 1.0f,
+ -1.0f, -1.0f, 1.0f,
+ // back face
+ -1.0f, -1.0f, -1.0f,
+ -1.0f, 1.0f, -1.0f,
+ 1.0f, 1.0f, -1.0f,
+ 1.0f, -1.0f, -1.0f,
+ // right face
+ 1.0f, -1.0f, -1.0f,
+ 1.0f, 1.0f, -1.0f,
+ 1.0f, 1.0f, 1.0f,
+ 1.0f, -1.0f, 1.0f,
+ // left face
+ -1.0f, -1.0f, 1.0f,
+ -1.0f, 1.0f, 1.0f,
+ -1.0f, 1.0f, -1.0f,
+ -1.0f, -1.0f, -1.0f,
+ // top face
+ 1.0f, 1.0f, 1.0f,
+ 1.0f, 1.0f, -1.0f,
+ -1.0f, 1.0f, -1.0f,
+ -1.0f, 1.0f, 1.0f,
+ // bottom face
+ -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 static final float[] colors = {
+ // front face (red)
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ // back face (green)
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ // right face (blue)
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ // left face (yellow)
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ // top face (magenta)
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ // bottom face (cyan)
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ };
+
+ ColorCube() {
+ super(24, QuadArray.COORDINATES | QuadArray.COLOR_3);
+
+ setCoordinates(0, verts);
+ setColors(0, colors);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/ColorPyramidDown.java b/src/main/java/org/jdesktop/j3d/examples/picking/ColorPyramidDown.java
new file mode 100644
index 0000000..3cf18cb
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/ColorPyramidDown.java
@@ -0,0 +1,122 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.QuadArray;
+
+class ColorPyramidDown extends QuadArray {
+ private static final float[] verts = {
+ // front face
+ 0.0f, -1.0f, 0.0f,
+ 1.0f, 1.0f, 1.0f,
+ -1.0f, 1.0f, 1.0f,
+ 0.0f, -1.0f, 0.0f,
+ // back face
+ 0.0f, -1.0f, 0.0f,
+ -1.0f, 1.0f, -1.0f,
+ 1.0f, 1.0f, -1.0f,
+ 0.0f, -1.0f, 0.0f,
+ // right face
+ 0.0f, -1.0f, 0.0f,
+ 1.0f, 1.0f, -1.0f,
+ 1.0f, 1.0f, 1.0f,
+ 0.0f, -1.0f, 0.0f,
+ // left face
+ 0.0f, -1.0f, 0.0f,
+ -1.0f, 1.0f, 1.0f,
+ -1.0f, 1.0f, -1.0f,
+ 0.0f, -1.0f, 0.0f,
+ // top face
+ 1.0f, 1.0f, 1.0f,
+ 1.0f, 1.0f, -1.0f,
+ -1.0f, 1.0f, -1.0f,
+ -1.0f, 1.0f, 1.0f,
+ // bottom face
+ 0.0f, -1.0f, 0.0f,
+ 0.0f, -1.0f, 0.0f,
+ 0.0f, -1.0f, 0.0f,
+ 0.0f, -1.0f, 0.0f,
+ };
+
+ private static final float[] colors = {
+ // front face (green)
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ // back face (red)
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ // right face (yellow)
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ // left face (magenta)
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ // top face (blue)
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ // bottom face (cyan)
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ };
+
+ ColorPyramidDown() {
+ super(24, QuadArray.COORDINATES | QuadArray.COLOR_3);
+
+ setCoordinates(0, verts);
+ setColors(0, colors);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/ColorPyramidUp.java b/src/main/java/org/jdesktop/j3d/examples/picking/ColorPyramidUp.java
new file mode 100644
index 0000000..c59211d
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/ColorPyramidUp.java
@@ -0,0 +1,124 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.QuadArray;
+
+class ColorPyramidUp extends QuadArray {
+ private static final float[] verts = {
+ // front face
+ 1.0f, -1.0f, 1.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ -1.0f, -1.0f, 1.0f,
+ // back face
+ -1.0f, -1.0f, -1.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 1.0f, -1.0f, -1.0f,
+ // right face
+ 1.0f, -1.0f, -1.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 1.0f, -1.0f, 1.0f,
+ // left face
+ -1.0f, -1.0f, 1.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ -1.0f, -1.0f, -1.0f,
+ // top face
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ // bottom face
+ -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 static final float[] colors = {
+
+ // front face (cyan)
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ 0.0f, 1.0f, 1.0f,
+ // back face (magenta)
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 1.0f,
+ // right face (yellow)
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f,
+ // left face (blue)
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f, 1.0f,
+ // top face (green)
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ // bottom face (red)
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f,
+
+ };
+
+ ColorPyramidUp() {
+ super(24, QuadArray.COORDINATES | QuadArray.COLOR_3);
+
+ setCoordinates(0, verts);
+ setColors(0, colors);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/Cube.java b/src/main/java/org/jdesktop/j3d/examples/picking/Cube.java
new file mode 100644
index 0000000..4c5faf4
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/Cube.java
@@ -0,0 +1,113 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Geometry;
+import org.jogamp.java3d.QuadArray;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.vecmath.Vector3f;
+
+public class Cube extends Shape3D {
+ private static final float[] verts = {
+ // front face
+ 1.0f, -1.0f, 1.0f,
+ 1.0f, 1.0f, 1.0f,
+ -1.0f, 1.0f, 1.0f,
+ -1.0f, -1.0f, 1.0f,
+ // back face
+ -1.0f, -1.0f, -1.0f,
+ -1.0f, 1.0f, -1.0f,
+ 1.0f, 1.0f, -1.0f,
+ 1.0f, -1.0f, -1.0f,
+ // right face
+ 1.0f, -1.0f, -1.0f,
+ 1.0f, 1.0f, -1.0f,
+ 1.0f, 1.0f, 1.0f,
+ 1.0f, -1.0f, 1.0f,
+ // left face
+ -1.0f, -1.0f, 1.0f,
+ -1.0f, 1.0f, 1.0f,
+ -1.0f, 1.0f, -1.0f,
+ -1.0f, -1.0f, -1.0f,
+ // top face
+ 1.0f, 1.0f, 1.0f,
+ 1.0f, 1.0f, -1.0f,
+ -1.0f, 1.0f, -1.0f,
+ -1.0f, 1.0f, 1.0f,
+ // bottom face
+ -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 static final Vector3f[] normals = {
+ new Vector3f( 0.0f, 0.0f, 1.0f), // front face
+ new Vector3f( 0.0f, 0.0f, -1.0f), // back face
+ new Vector3f( 1.0f, 0.0f, 0.0f), // right face
+ new Vector3f(-1.0f, 0.0f, 0.0f), // left face
+ new Vector3f( 0.0f, 1.0f, 0.0f), // top face
+ new Vector3f( 0.0f, -1.0f, 0.0f), // bottom face
+ };
+
+ public Cube() {
+ super();
+
+ int i;
+
+ QuadArray cube = new QuadArray(24, QuadArray.COORDINATES |
+ QuadArray.NORMALS);
+
+ cube.setCoordinates(0, verts);
+ for (i = 0; i < 24; i++) {
+ cube.setNormal(i, normals[i/4]);
+ }
+
+ cube.setCapability(Geometry.ALLOW_INTERSECT);
+ setGeometry(cube);
+ setAppearance(new Appearance());
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/CubeIQA.java b/src/main/java/org/jdesktop/j3d/examples/picking/CubeIQA.java
new file mode 100644
index 0000000..e9dcd12
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/CubeIQA.java
@@ -0,0 +1,140 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.IndexedQuadArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class CubeIQA extends IndexedQuadArray {
+ CubeIQA() {
+ super(8, GeometryArray.COORDINATES | GeometryArray.COLOR_3, 24);
+
+
+ Point3f verts[] = new Point3f[8];
+ Color3f colors[] = new Color3f[8];
+
+ verts[0] = new Point3f(1.0f, 1.0f, 1.0f);
+ verts[1] = new Point3f(-1.0f, 1.0f, 1.0f);
+ verts[2] = new Point3f(-1.0f,-1.0f, 1.0f);
+ verts[3] = new Point3f( 1.0f,-1.0f, 1.0f);
+ verts[4] = new Point3f( 1.0f, 1.0f,-1.0f);
+ verts[5] = new Point3f( -1.0f, 1.0f,-1.0f);
+ verts[6] = new Point3f( -1.0f,-1.0f,-1.0f);
+ verts[7] = new Point3f( 1.0f,-1.0f,-1.0f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+ colors[3] = new Color3f(1.0f, 1.0f, 0.0f);
+ colors[4] = new Color3f(1.0f, 0.0f, 1.0f);
+ colors[5] = new Color3f(0.0f, 1.0f, 1.0f);
+ colors[6] = new Color3f(0.0f, 1.0f, 1.0f);
+ colors[7] = new Color3f(0.0f, 1.0f, 1.0f);
+
+ int pntsIndex[] = new int[24];
+ int clrsIndex[] = new int[24];
+
+ pntsIndex[0] = 0;
+ clrsIndex[0] = 0;
+ pntsIndex[1] = 3;
+ clrsIndex[1] = 0;
+ pntsIndex[2] = 7;
+ clrsIndex[2] = 0;
+ pntsIndex[3] = 4;
+ clrsIndex[3] = 0;
+
+ pntsIndex[4] = 1;
+ clrsIndex[4] = 1;
+ pntsIndex[5] = 5;
+ clrsIndex[5] = 1;
+ pntsIndex[6] = 6;
+ clrsIndex[6] = 1;
+ pntsIndex[7] = 2;
+ clrsIndex[7] = 1;
+
+ pntsIndex[8] = 0;
+ clrsIndex[8] = 2;
+ pntsIndex[9] = 4;
+ clrsIndex[9] = 2;
+ pntsIndex[10] = 5;
+ clrsIndex[10] = 2;
+ pntsIndex[11] = 1;
+ clrsIndex[11] = 2;
+
+ pntsIndex[12] = 3;
+ clrsIndex[12] = 3;
+ pntsIndex[13] = 2;
+ clrsIndex[13] = 3;
+ pntsIndex[14] = 6;
+ clrsIndex[14] = 3;
+ pntsIndex[15] = 7;
+ clrsIndex[15] = 3;
+
+ pntsIndex[16] = 0;
+ clrsIndex[16] = 4;
+ pntsIndex[17] = 1;
+ clrsIndex[17] = 4;
+ pntsIndex[18] = 2;
+ clrsIndex[18] = 4;
+ pntsIndex[19] = 3;
+ clrsIndex[19] = 4;
+
+ pntsIndex[20] = 7;
+ clrsIndex[20] = 5;
+ pntsIndex[21] = 6;
+ clrsIndex[21] = 5;
+ pntsIndex[22] = 5;
+ clrsIndex[22] = 5;
+ pntsIndex[23] = 4;
+ clrsIndex[23] = 5;
+
+ setCoordinates(0, verts);
+ setCoordinateIndices(0, pntsIndex);
+ setColors(0, colors);
+ setColorIndices(0, clrsIndex);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/CubeQA.java b/src/main/java/org/jdesktop/j3d/examples/picking/CubeQA.java
new file mode 100644
index 0000000..246e506
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/CubeQA.java
@@ -0,0 +1,137 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.QuadArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class CubeQA extends QuadArray {
+ CubeQA() {
+ super(24, GeometryArray.COORDINATES | GeometryArray.COLOR_3);
+
+
+ Point3f verts[] = new Point3f[8];
+ Color3f colors[] = new Color3f[6];
+
+ verts[0] = new Point3f(1.0f, 1.0f, 1.0f);
+ verts[1] = new Point3f(-1.0f, 1.0f, 1.0f);
+ verts[2] = new Point3f(-1.0f,-1.0f, 1.0f);
+ verts[3] = new Point3f( 1.0f,-1.0f, 1.0f);
+ verts[4] = new Point3f( 1.0f, 1.0f,-1.0f);
+ verts[5] = new Point3f( -1.0f, 1.0f,-1.0f);
+ verts[6] = new Point3f( -1.0f,-1.0f,-1.0f);
+ verts[7] = new Point3f( 1.0f,-1.0f,-1.0f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+ colors[3] = new Color3f(1.0f, 1.0f, 0.0f);
+ colors[4] = new Color3f(1.0f, 0.0f, 1.0f);
+ colors[5] = new Color3f(0.0f, 1.0f, 1.0f);
+
+ Point3f pnts[] = new Point3f[24];
+ Color3f clrs[] = new Color3f[24];
+
+ pnts[0] = verts[0];
+ clrs[0] = colors[0];
+ pnts[1] = verts[3];
+ clrs[1] = colors[0];
+ pnts[2] = verts[7];
+ clrs[2] = colors[0];
+ pnts[3] = verts[4];
+ clrs[3] = colors[0];
+
+ pnts[4] = verts[1];
+ clrs[4] = colors[1];
+ pnts[5] = verts[5];
+ clrs[5] = colors[1];
+ pnts[6] = verts[6];
+ clrs[6] = colors[1];
+ pnts[7] = verts[2];
+ clrs[7] = colors[1];
+
+ pnts[8] = verts[0];
+ clrs[8] = colors[2];
+ pnts[9] = verts[4];
+ clrs[9] = colors[2];
+ pnts[10] = verts[5];
+ clrs[10] = colors[2];
+ pnts[11] = verts[1];
+ clrs[11] = colors[2];
+
+ pnts[12] = verts[3];
+ clrs[12] = colors[3];
+ pnts[13] = verts[2];
+ clrs[13] = colors[3];
+ pnts[14] = verts[6];
+ clrs[14] = colors[3];
+ pnts[15] = verts[7];
+ clrs[15] = colors[3];
+
+ pnts[16] = verts[0];
+ clrs[16] = colors[4];
+ pnts[17] = verts[1];
+ clrs[17] = colors[4];
+ pnts[18] = verts[2];
+ clrs[18] = colors[4];
+ pnts[19] = verts[3];
+ clrs[19] = colors[4];
+
+ pnts[20] = verts[7];
+ clrs[20] = colors[5];
+ pnts[21] = verts[6];
+ clrs[21] = colors[5];
+ pnts[22] = verts[5];
+ clrs[22] = colors[5];
+ pnts[23] = verts[4];
+ clrs[23] = colors[5];
+
+
+ setCoordinates(0, pnts);
+ setColors(0, clrs);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/GullCG.java b/src/main/java/org/jdesktop/j3d/examples/picking/GullCG.java
new file mode 100644
index 0000000..dee9e2a
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/GullCG.java
@@ -0,0 +1,578 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.CompressedGeometry;
+import org.jogamp.java3d.CompressedGeometryHeader;
+
+class GullCG extends CompressedGeometry {
+
+ GullCG() {
+ super(cgHeader, cgData) ;
+ }
+
+ private static final byte cgData[] = {
+ 25, 0, -120, 16, -58, -52, 33, -35,
+ -128, 67, -36, 0, -127, -72, 97, 14,
+ 64, 2, 29, 104, 4, 2, -45, 8,
+ 125, -89, 16, 51, -116, 33, -1, -104,
+ 71, -64, 48, -106, 31, 1, 32, -52,
+ 2, -127, 6, 5, 5, 32, 10, -78,
+ -128, 20, 14, 6, 40, 74, -128, 81,
+ -43, 24, -94, 44, 1, 86, -104, 98,
+ -96, 49, 5, 34, 112, 10, -68, -29,
+ 21, -115, -56, 40, 8, -64, 81, -74,
+ -128, -90, 13, 49, 71, 30, 2, -81,
+ -68, -30, -62, 122, 56, 37, -107, 60,
+ -109, 120, 0, 0, 26, -32, 18, 85,
+ -128, 14, -16, 71, -13, 66, -33, 103,
+ 127, -81, 78, -61, -106, -112, 0, 1,
+ -32, 13, -86, -96, 4, -103, -36, 59,
+ -23, 25, 39, 18, 11, 122, -80, 1,
+ -34, -22, -112, -109, -80, -71, -7, -39,
+ -40, 0, -127, 0, 0, 0, 0, 43,
+ 97, -102, 118, 16, 83, -32, -121, -87,
+ -32, -86, -4, 32, 121, 8, 33, -48,
+ -100, -39, 64, 0, 0, 50, 0, -47,
+ -9, -97, -118, 53, 75, -122, 89, -54,
+ -10, 8, 0, 69, -98, 0, 0, 54,
+ 3, -67, 0, 29, -17, 2, 64, 0,
+ 5, 126, -93, -56, -31, 15, 74, -95,
+ -128, 5, -64, 0, 3, -46, 8, 0,
+ 36, 0, 0, 58, 93, -92, 0, 0,
+ 30, 0, 87, 4, 0, 23, 4, 68,
+ 36, 64, 30, -17, -25, -121, -40, 22,
+ 13, 48, 78, -43, 73, -64, -10, 48,
+ 51, -25, -1, -82, -65, 3, 55, -71,
+ 41, 124, -50, -118, -64, 4, -102, 112,
+ 0, 1, -20, 5, 98, 59, -58, -95,
+ -87, 42, -9, -112, -99, -107, -91, -11,
+ 127, 5, 36, -46, -112, 121, 9, -39,
+ -17, -1, -41, 0, 0, 0, 112, 4,
+ -121, -19, -124, -16, -44, 66, -40, 36,
+ 116, -83, -96, -128, 7, -37, 100, -37,
+ 121, 11, 123, -81, -106, 43, 82, 14,
+ -85, -8, 41, -95, 67, 81, 18, 125,
+ 15, 39, -114, -88, 63, -10, 0, -11,
+ 5, 4, 73, -38, 13, 80, -64, 7,
+ 64, 56, 14, -56, 108, 3, -64, 96,
+ 5, -33, 81, 24, 11, -115, 26, -95,
+ -104, 95, -69, -95, -112, 15, 0, -128,
+ 40, 30, 67, -27, 1, 107, -55, 102,
+ -39, 97, 67, 103, 66, 79, 67, 37,
+ -60, 62, -95, -88, -32, 105, 72, 106,
+ -113, -59, -108, 54, -64, 43, 50, 9,
+ 86, 30, 45, 72, 101, 31, -51, -120,
+ 106, -8, 75, -24, 98, 111, -106, -12,
+ 54, 104, 54, 47, 87, -115, -61, -106,
+ 64, -47, 13, -80, 10, -116, -122, 39,
+ -3, 118, -7, 0, 0, 0, 0, 42,
+ -13, -118, 27, 96, 9, 27, -20, 71,
+ -8, -96, -50, 61, 111, 87, 102, -83,
+ -93, -54, 47, -37, 51, -113, 27, 122,
+ 98, -52, -91, -75, 1, 53, -96, 8,
+ 97, -120, 54, -44, 55, -1, -10, 105,
+ -108, -84, -4, -101, -64, 67, 41, -4,
+ 105, 67, 117, -60, 92, 67, 115, -4,
+ -65, 124, -125, 90, 64, 118, -85, 97,
+ 67, 39, 126, 96, 67, 78, 80, 65,
+ -15, 12, -57, 61, 94, 67, 50, 3,
+ -93, 33, -107, -2, -44, 16, 91, -34,
+ -115, -88, 109, 24, 75, -120, 109, -113,
+ -108, 20, 49, 52, 59, 122, 25, 51,
+ -29, 23, -85, -39, 33, -50, -28, 104,
+ -122, -16, 2, 0, -128, 90, 67, 20,
+ 1, -93, 124, -122, 31, 91, 113, -59,
+ 13, -55, -7, 121, 12, -57, 10, -10,
+ -122, 120, 0, 1, -8, 8, -56, 33,
+ -49, -59, 94, -78, -45, -85, 6, -33,
+ 105, -55, -121, -77, 99, -113, 91, 105,
+ -2, 77, -37, 70, -118, -2, 52, 102,
+ -122, -45, -120, -66, -122, 25, -7, 65,
+ 65, 19, 67, -69, 33, -92, 1, 0,
+ 0, 23, 16, -37, 31, 40, 113, -90,
+ 120, 118, -84, -48, -55, -17, -37, 16,
+ -59, 62, -88, 28, -126, 21, 70, 1,
+ -108, 3, 80, 1, -96, 45, 107, -115,
+ 124, 58, -60, 102, -128, 0, 7, 64,
+ 27, -60, 125, -107, 127, 42, -40, -83,
+ 57, -15, -71, 1, -32, -50, -60, 42,
+ 123, 106, 60, -16, -32, -66, 85, 26,
+ -14, -31, 82, -20, -49, -128, -120, 94,
+ -64, 0, -25, 50, 85, 26, -52, -80,
+ 23, -21, 7, -120, 1, 118, 53, -55,
+ 75, -83, -96, 2, 24, -16, 0, 0,
+ 0, 4, 18, -77, 92, -101, -64, 8,
+ 84, 72, -22, -33, 85, -126, -42, -69,
+ -41, -79, -49, -69, 126, -128, 5, 0,
+ -1, -128, 125, 54, 0, -53, 47, 110,
+ 91, -59, 64, 13, 119, 115, -59, 63,
+ 93, -28, -6, -23, -61, -128, 1, 40,
+ 0, 0, 80, 75, 64, -18, -33, -123,
+ -2, -117, -74, -116, 26, -106, -80, 6,
+ 91, -70, 21, -23, -44, 0, -121, 12,
+ 7, 64, 0, 5, 38, -73, 118, -79,
+ -114, 104, 118, 0, -5, 87, 2, 85,
+ -46, 94, 115, -112, -117, 72, 124, 100,
+ -32, 106, 106, 81, -98, -121, -100, 116,
+ 76, -121, -23, -112, 40, 43, 40, -92,
+ 57, -96, 4, 121, 47, -29, -65, 81,
+ -26, 2, -128, 16, 6, 62, -85, 86,
+ -67, -8, 74, -35, -77, -62, -5, -81,
+ -106, 56, 0, 0, 31, 1, -91, -48,
+ 0, 67, 27, -62, 100, 43, 80, 68,
+ 61, -48, 1, 24, 0, 45, 1, -16,
+ 7, 18, 1, -23, -88, -84, 127, -6,
+ 11, 37, -98, 14, 57, 107, -61, -52,
+ -114, -128, 1, 91, -92, -95, -82, -128,
+ 16, -64, 1, 108, 0, -128, 55, 111,
+ -101, 96, -80, 61, -90, -94, 122, 49,
+ -21, 14, -2, -73, 99, 115, 81, 11,
+ 90, -118, 74, -99, 30, -9, -9, 67,
+ -57, 80, 42, 79, -14, 3, -86, -91,
+ -94, 51, -1, 83, 64, -118, 50, 53,
+ -59, 74, -89, 126, -23, 32, 13, 57,
+ 40, -123, 76, 97, -41, 91, -115, -23,
+ 107, -83, -37, 81, 67, 27, -73, -113,
+ 58, 22, -80, 4, 88, 64, 109, -10,
+ -64, 14, -80, -19, -43, 15, 62, -80,
+ -116, -14, -121, -11, 110, -25, 38, -109,
+ 3, 55, -103, 85, -65, -79, -117, -37,
+ 66, -102, 97, -70, -123, 43, 104, -128,
+ 21, 100, 40, 71, -55, -125, 104, 33,
+ -43, 82, 84, -102, 7, -3, -32, -114,
+ 20, -37, -27, -4, -107, 116, 67, 3,
+ -7, -91, -9, -99, -25, -44, -71, -57,
+ 4, 5, -75, 74, 0, 1, 107, -120,
+ -19, -92, 21, -66, 100, 8, -124, -6,
+ -79, 18, -44, -27, 12, 12, -112, -32,
+ -108, -68, 99, 123, -89, -39, 98, -53,
+ 51, -10, -128, 10, 42, -48, -9, -108,
+ -34, -100, -7, -52, -123, -39, 100, -46,
+ 85, 45, 16, 0, 12, 97, -58, -25,
+ 32, 111, -32, 0, -48, 0, -48, 10,
+ -73, 86, -18, 104, 114, -102, -80, 32,
+ 0, 88, 0, 64, 7, -25, -127, 66,
+ -6, -75, 74, 73, 78, -51, -125, 4,
+ -103, -88, 1, 78, -62, 54, 84, 90,
+ -14, 32, 35, -18, -40, -67, -44, 106,
+ -102, -128, 2, 107, -24, -124, -64, 66,
+ -51, 15, 100, -87, 44, 0, 70, 125,
+ -120, 95, 33, 50, 123, 70, 83, 0,
+ -115, 122, 22, -102, 35, 92, -112, 94,
+ -87, -121, -66, -64, -105, -65, -15, 17,
+ -22, 122, -80, 33, 94, -5, 5, 75,
+ -35, 114, 65, 99, 99, 94, 28, -52,
+ -3, -77, 42, -16, -24, -87, 84, 12,
+ -76, 76, 90, 110, -120, 0, 86, -36,
+ -95, 85, 0, -122, -62, -125, 97, 67,
+ 13, 0, -127, -78, -19, 63, -3, -46,
+ 80, 0, -84, 0, 10, -128, 46, 3,
+ 40, 4, 55, 114, -8, -38, 16, -59,
+ -12, 84, -90, -35, -83, 111, 64, 21,
+ -128, 3, 96, 30, 3, -112, 12, -111,
+ -120, 13, -24, 14, -32, 5, 29, 16,
+ 1, 12, 123, -6, -60, 86, 82, 25,
+ 59, -56, 11, -74, -16, 4, 0, -104,
+ -91, 0, 16, -53, 59, 29, 101, 43,
+ 119, -41, -23, -100, 6, 74, 81, 56,
+ 10, -6, 32, 1, 91, -27, -31, -124,
+ 5, -40, -22, -90, 46, -78, -128, 5,
+ 99, -64, 0, 0, 0, 19, -128, 33,
+ -106, 5, -44, -26, -57, -97, -113, -64,
+ 20, -93, 72, 2, 55, 48, 8, 111,
+ 80, 31, -32, 31, -16, 12, -30, -26,
+ -88, 9, -69, -128, 8, 98, 3, 64,
+ 120, 5, -67, 118, -12, 59, -118, -122,
+ -115, 122, -6, -122, -125, -95, -77, -95,
+ -105, 73, -28, -6, -122, -86, -127, 51,
+ -95, -105, 125, -22, -6, -122, -38, -31,
+ -65, 84, -86, -14, 95, 71, -97, 67,
+ 111, -66, -81, -47, -124, 92, 22, 1,
+ -43, 16, 1, 13, 97, -18, -63, -82,
+ -46, -120, 106, -110, -122, -17, 120, 97,
+ -87, 82, 67, -99, 75, -48, -33, 95,
+ 79, 2, -32, -32, -104, 13, 41, 0,
+ 8, 103, 79, -105, -115, 112, 112, 70,
+ 3, 21, 84, 51, -101, -53, 18, 8,
+ 14, -62, -83, 72, 100, 72, 72, -24,
+ 102, 71, -73, -117, 17, 30, -65, -32,
+ -40, 36, 4, 46, -51, 76, 44, 96,
+ -44, 0, -57, 102, 54, -31, -2, 80,
+ 0, -71, 98, -72, 80, 46, 82, -64,
+ 8, 96, -80, 0, 32, 0, 16, 8,
+ 55, 106, -98, -121, -19, 64, 11, -108,
+ 36, 103, 8, -88, 8, 0, 46, -116,
+ -101, 104, -128, 50, -54, 112, 93, 73,
+ 64, 0, 115, -128, 0, 3, -32, 14,
+ -100, 25, 96, 0, -66, 0, 0, 22,
+ 49, -64, 12, -76, -124, 35, -95, 56,
+ 1, -10, 0, 11, -32, 122, 1, 98,
+ 20, 114, -38, 16, -18, -124, -32, 7,
+ -40, 0, 47, -128, 0, 5, 104, 97,
+ -53, 8, 127, -70, 35, -128, 29, -32,
+ 0, -66, 0, 0, 20, 7, -17, 104,
+ 124, -70, 47, -34, 0, 11, -32, 0,
+ 1, 93, 124, -78, -121, -29, -93, 56,
+ 0, 22, 0, 11, -32, 0, 1, 82,
+ -58, 122, -38, 31, 110, -101, 125, -128,
+ 2, -8, 0, 0, 86, -26, 28, -74,
+ -121, -29, -92, 56, 1, -106, 0, 11,
+ -32, 0, 1, -2, -104, 0, 35, 53,
+ -127, 65, -82, 34, 38, -51, -74, -34,
+ 0, -71, 123, 66, 111, -63, -24, 16,
+ 1, 12, 0, 17, 0, 0, 21, 5,
+ -48, -125, 109, 48, 7, -118, -125, 83,
+ -68, 10, 115, -112, 1, 0, -128, 18,
+ -47, -89, 61, 121, -86, 77, 58, 16,
+ 109, 92, 65, 86, 127, -82, -100, 31,
+ 96, 0, 64, 0, 0, 30, -7, 68,
+ -116, 32, 0, 3, -32, 28, 72, 13,
+ -110, -125, 43, 0, 17, 107, -64, 23,
+ -92, 0, 46, -64, 1, -96, 13, 1,
+ 91, -112, 1, 12, 5, -2, -66, -122,
+ -110, -104, 81, 19, 30, -2, 60, 2,
+ 18, 96, 48, -112, 20, 51, 16, 38,
+ -51, 126, 67, 56, 33, -82, -78, -87,
+ -117, -10, 10, -52, -86, -18, -97, 120,
+ 62, -47, 67, -9, -86, 81, -17, 0,
+ 8, 0, 24, 5, -127, -5, -38, 0,
+ 47, 67, -9, -128, 4, 0, 0, 2,
+ -80, -1, 97, 7, -9, -82, 81, -53,
+ 0, 8, 0, 0, 5, 4, 112, 3,
+ -19, -96, -14, -11, -56, 57, 96, 1,
+ 0, 0, 0, -82, -116, 0, 125, -108,
+ 31, 30, -71, 71, -68, 0, 32, 0,
+ 0, 21, 7, -53, 104, 61, -67, 35,
+ 0, 5, 96, 1, 0, 0, 0, -84,
+ 3, 45, -96, -8, -11, 12, 0, 21,
+ -128, 4, 0, 0, 3, -8, 15, -77,
+ -64, -108, 16, -30, 14, 61, 105, -40,
+ -81, 27, 124, -75, 64, 40, 6, -11,
+ -54, 32, -32, 1, 0, 0, 0, -111,
+ -63, -106, -116, -125, 115, 5, 0, 33,
+ 76, 0, 1, -64, 61, -96, 25, 26,
+ -116, 24, 37, 66, -113, -55, 42, 77,
+ 19, -35, -4, -73, -111, -110, -14, 12,
+ -23, 12, 0, 101, -91, 0, 0, 1,
+ 0, 104, 70, 0, 43, -39, -99, -46,
+ 78, 45, -5, 58, -30, 2, -127, 27,
+ 44, -22, 80, -118, 53, -24, 58, -3,
+ -17, -76, -90, 95, 18, 55, -16, -39,
+ -4, -121, -55, -25, -11, -38, 85, 68,
+ 60, -76, 15, -5, 124, 40, 0, 86,
+ -14, 12, -2, 3, 124, -16, 63, 0,
+ -69, -91, 102, 2, -128, 16, 6, 48,
+ 31, 43, 94, -4, 50, 42, 14, 90,
+ -126, -95, 107, -18, -96, 0, -102, 71,
+ -11, -68, 16, -37, 11, -59, 122, -2,
+ 64, 1, -64, 59, 1, -38, 24, 80,
+ -48, 5, 64, 0, 15, -46, 104, -82,
+ -57, -19, -4, -115, 115, 112, 92, 20,
+ -28, -3, -127, 64, 125, -64, 127, -64,
+ 56, -125, -113, 74, 118, 43, 78, -35,
+ 107, 47, -18, 91, -121, -111, 0, 0,
+ 0, 126, -128, 63, -23, 31, 102, -65,
+ 32, 53, -30, -104, 102, 86, -16, -16,
+ 8, 86, 2, -20, 31, 24, -11, -56,
+ 1, 78, 0, 16, -127, -104, 10, 18,
+ 102, -51, 8, 122, 0, 86, 0, 19,
+ 1, -120, 10, -32, 34, -55, 65, 111,
+ 64, 16, 119, -128, 5, -128, 98, 3,
+ -82, -103, 100, -64, 0, 7, -80, 31,
+ -111, -128, 11, -108, 89, 16, 106, -107,
+ -56, 1, 118, -75, -10, 121, -92, 0,
+ -69, 121, 5, 32, -79, 43, -104, 2,
+ -20, 123, -2, -51, 72, 1, 118, -6,
+ 40, -5, -105, 48, 2, 24, 56, 0,
+ 4, 0, 4, 2, -15, 90, 90, 93,
+ -4, 1, -117, 86, -87, -89, 67, 0,
+ 86, -98, -94, 121, 1, -66, -34, 0,
+ -64, 18, 10, 86, -40, 21, 115, 0,
+ 70, -28, 1, -22, 1, -14, 0, -126,
+ 33, 12, -87, 38, -3, -30, -104, -28,
+ 124, 89, -63, -58, 77, -76, -79, -89,
+ 98, 8, -64, 7, 0, 56, 11, -62,
+ 59, -45, 18, 46, -62, -51, -128, 14,
+ 0, 96, 25, -128, -33, 93, 64, 45,
+ -35, -101, 120, 31, 0, -96, 58, -128,
+ -122, -120, 7, 0, 0, 1, -39, 12,
+ 0, 124, 2, 0, -80, 70, -36, -127,
+ 119, 16, -122, -16, 62, 0, -128, 126,
+ -19, 54, 70, 121, 108, 26, 17, -117,
+ 107, -52, -30, 35, -36, 19, 93, -128,
+ 28, 102, -39, -122, -61, 118, 1, 12,
+ 0, 28, 10, -128, -13, 114, -33, 14,
+ 66, -109, 7, 48, 2, 24, -24, 3,
+ -52, -92, 110, 123, 124, -96, 8, 67,
+ 40, 8, -87, -111, -117, -71, -98, -124,
+ 73, -128, 3, 96, 30, 2, 105, 8,
+ 32, 64, -74, 41, 48, -6, -67, -105,
+ -56, 43, 106, -53, -75, 0, 67, 113,
+ 2, 121, -89, 114, 4, -128, 57, -60,
+ 80, -50, 56, -107, 16, -46, -64, 45,
+ 72, 96, 88, 107, 8, 105, -64, 55,
+ -31, -112, 108, -89, -76, -59, 0, 107,
+ -124, 42, 26, -53, -21, -116, 92, 14,
+ -100, -107, -109, -62, 94, 64, 33, -75,
+ -128, -121, -12, -102, -122, 17, -119, 101,
+ 67, 88, 27, -27, 41, 13, -76, 22,
+ -20, -126, 0, 0, 0, 0, 71, 67,
+ 113, -66, 51, -95, -92, -122, 12, -94,
+ -126, 33, -13, 103, 35, 46, -1, -47,
+ 40, 68, -101, 48, 41, -100, -119, -79,
+ 47, 60, 83, 64, 67, 101, -122, 51,
+ -103, -119, 107, -62, -102, 1, 12, 8,
+ 22, -2, 42, -73, 77, 6, 91, 32,
+ 2, 49, -73, -89, -63, 8, 98, -45,
+ -21, -16, 10, 50, 41, -87, 74, -76,
+ 53, 91, 75, -43, -40, 0, 42, 1,
+ -96, 36, -46, 0, 111, -85, 57, 94,
+ 93, 119, -104, 116, 17, -104, -65, 84,
+ 97, 100, -102, 37, 15, -68, 126, 73,
+ 47, -111, 115, -53, -46, -72, 0, 102,
+ -60, -123, 119, 1, -54, 64, 4, 2,
+ 0, 118, 71, 92, 0, 12, 12, -128,
+ -34, -55, -65, 74, -85, -111, 78, -125,
+ -3, 127, -100, -111, -80, -128, 10, -108,
+ -56, 16, 1, -109, -24, 21, -44, -115,
+ -9, -32, -16, 35, 37, 14, -22, -69,
+ -106, -15, 64, 3, 45, -22, 33, 86,
+ -64, 32, -41, 32, 117, 52, 62, -27,
+ -101, -118, -74, -125, -66, 56, -13, 93,
+ 113, -56, 21, 79, -76, -128, 0, -103,
+ 122, 126, -48, 20, 93, -90, 47, 42,
+ -40, 8, 17, -83, -94, -33, 8, 93,
+ -113, 10, 79, 62, -128, 23, 109, -25,
+ -8, 1, 33, 90, 0, 33, -118, 5,
+ -44, -54, -64, 127, -113, 64, 16, -64,
+ 2, 80, 15, 1, -5, -27, -38, -16,
+ -83, 41, -118, 15, -37, -57, -79, -94,
+ -51, 50, -59, -47, 20, -59, 64, 15,
+ -75, 107, -53, -91, -96, -9, -128, 1,
+ 48, 0, 0, 80, 94, -19, 92, -10,
+ -127, -20, 0, 14, 82, 125, 83, -24,
+ -121, 56, -124, 61, -67, -88, -73, 64,
+ 120, 0, 0, 84, 0, -61, -19, 99,
+ 32, -33, -26, -76, -26, -17, -51, -122,
+ 38, -111, -84, -36, 12, 93, -77, -66,
+ -85, -86, 0, 107, -68, 6, -36, 92,
+ -74, 30, 102, 71, 64, 3, 93, 78,
+ -80, -75, -7, 5, 93, -6, -57, -74,
+ -79, 79, -109, 78, 22, 117, 108, -111,
+ 122, 52, 96, -49, 38, -117, -125, 123,
+ 10, 114, 121, 85, 96, -48, 0, -96,
+ 31, 16, 13, 39, -42, 113, 50, -109,
+ -9, 90, 59, 93, 15, -8, -79, 116,
+ -14, 77, -128, 29, 104, -19, -42, -97,
+ -94, -62, 6, -33, 44, 0, -5, 108,
+ -3, 91, -19, 7, -83, -27, 81, 49,
+ 24, -12, -109, 123, -51, 60, 39, 111,
+ -50, 23, -78, 53, -10, 14, -80, -93,
+ 122, -87, 33, -78, -30, 59, -95, -96,
+ 10, -128, 0, 30, 61, 92, -112, -53,
+ -25, 104, -76, 24, -79, 9, 37, 32,
+ 22, 4, -57, 1, 109, 65, 7, 26,
+ -98, 59, 106, -101, 103, -64, -116, -52,
+ 11, 29, 23, 106, 107, 106, -51, -15,
+ 120, -5, -20, 1, 54, -16, -47, -77,
+ 0, 38, -81, -54, 18, -8, 32, -122,
+ 69, 70, 117, 23, 44, 0, 0, 30,
+ 0, -68, 0, 109, -128, -45, -37, 80,
+ 48, 5, 118, -25, -85, 50, 110, 108,
+ -111, 51, -47, 23, 16, -96, 45, 99,
+ -51, -110, -12, 96, -63, -42, 20, 120,
+ 89, 86, 41, 120, 32, 5, 41, -5,
+ 0, 13, -99, 104, -100, -128, 10, -80,
+ 16, 0, 104, 15, -104, 5, 106, -85,
+ 125, 9, 57, -1, 91, -16, 0, 44,
+ 7, -32, 3, -10, 55, 40, -1, 80,
+ 65, -126, -64, 66, -20, -37, 66, -59,
+ 95, 64, 4, 55, -20, 26, 13, -37,
+ -126, 125, -106, -48, 1, 13, -48, -65,
+ -90, -126, -79, -123, 21, 32, 8, 108,
+ 95, -91, -111, 115, 44, -101, -112, 1,
+ 82, 16, 0, 103, 1, -51, 0, -112,
+ -14, 103, -112, -122, 98, 46, -43, -71,
+ 41, 126, -76, 0, -71, 79, 2, 127,
+ 108, -2, -128, 23, 109, 93, -111, -74,
+ 90, 0, 33, -96, 63, -94, -107, -86,
+ 70, 92, -64, 21, -67, 64, 0, -128,
+ 127, -64, 51, 0, 23, 126, -40, 69,
+ 68, 0, -101, 71, -5, -84, -127, -82,
+ 104, -123, 85, 80, -55, -81, 47, -88,
+ 109, -46, 27, -11, 74, -83, 49, -35,
+ 116, 113, 112, 0, 86, 0, -72, 15,
+ 32, 4, -37, 124, 11, 126, -116, -32,
+ 11, -113, 126, 40, -92, 0, 33, -110,
+ -2, 87, 53, -51, 64, -81, -51, 74,
+ -36, 121, -4, 102, -15, 117, -19, 4,
+ 93, -32, 4, 49, 0, 96, 60, 3,
+ -23, 26, 19, -124, -92, 33, 13, -94,
+ -16, -6, -122, -83, -127, 54, 33, -118,
+ -99, -79, 32, -107, 112, 30, -8, -122,
+ -125, -66, -77, -95, -91, 122, 16, -114,
+ -122, 92, 123, 113, 65, 69, 125, 125,
+ 67, 66, 48, -43, 80, -53, 78, -49,
+ 29, 37, 10, 121, -59, 36, -61, -114,
+ -109, -28, 103, -92, 0, 46, -57, -115,
+ 72, 127, -12, 0, -55, 101, -48, -119,
+ -117, 22, -64, 1, 25, -110, 21, -60,
+ 66, 26, 43, -21, -59, -55, -62, -58,
+ -21, 46, -96, -128, 25, 101, 0, 0,
+ 1, -64, 31, 9, 64, 1, -75, -73,
+ -55, 82, 0, -89, 94, 13, -76, -56,
+ 74, -1, 83, 115, 72, -21, -104, 43,
+ 56, -75, -32, -10, 74, -11, -66, 126,
+ 11, 72, 113, -40, 29, -51, -12, -127,
+ 6, -85, -116, -85, 78, 30, -65, -44,
+ -111, -1, -95, -111, 62, -33, 68, -55,
+ -29, -91, 112, -93, 37, 1, 72, -111,
+ -114, 0, 125, -96, -32, -38, 9, 70,
+ 76, -102, 5, -28, -116, -109, -53, -58,
+ -7, -37, -7, 0, 10, 114, 100, -105,
+ -47, -53, 59, 46, -37, -23, 64, 2,
+ -73, 112, 103, -16, 4, 102, -18, 104,
+ 21, -40, 70, -70, 0, 88, 0, 1,
+ -113, -123, 88, -89, -55, -112, -84, -45,
+ -107, -82, 28, -128, 40, 105, 24, 55,
+ 61, -73, -40, 15, -72, 0, 8, 4,
+ 47, -27, 88, -18, -3, 74, 50, 104,
+ -111, 31, -27, -4, -115, 115, 111, -92,
+ 22, -12, -10, -128, 3, -128, 10, 3,
+ 78, -56, 97, 127, 104, 8, 105, 24,
+ 53, -2, -43, 119, -21, -12, -13, 104,
+ -95, 71, -19, -4, 13, -13, -57, -20,
+ 16, -16, -36, -84, 95, 88, 52, -5,
+ 8, 1, 78, 97, -68, -67, 120, -40,
+ 0, 66, 1, -96, 40, 64, 2, -20,
+ -2, -57, -88, 2, -84, 0, 38, 0,
+ -16, 21, -2, 60, -102, -38, -12, -115,
+ 88, 0, 88, 1, -32, 43, 95, 57,
+ -9, -115, 32, -3, 113, -28, -45, 31,
+ -62, 57, 7, -5, -30, -105, 106, 102,
+ 59, -44, 32, 7, 56, 0, 52, 6,
+ 96, 61, 3, 54, -24, 0, 1, -56,
+ 11, 0, 92, -70, 40, 85, 113, 0,
+ 16, -42, -79, 73, -73, 106, 66, 21,
+ 104, 64, 11, -79, -20, 11, 14, 32,
+ 1, 88, 119, -60, 14, 96, 16, -34,
+ 64, 0, 32, 63, -32, 23, -48, -35,
+ 82, -20, -92, 110, -102, -15, 52, 8,
+ 67, 24, 17, 83, 35, 2, 58, -84,
+ -120, -41, 50, -55, -65, 123, 39, -42,
+ 6, -71, 71, 19, 1, 126, 60, 2,
+ 4, 98, 87, 124, 19, 60, -112, -41,
+ 111, 63, -96, 9, -119, -109, 47, 24,
+ 113, -108, -126, 55, 2, -66, 88, -60,
+ 120, -127, -24, 18, -64, 78, 40, 99,
+ 32, -21, 56, -5, -66, 100, -80, 19,
+ -116, -37, 77, -75, -18, -64, 33, -128,
+ 3, -128, -80, 25, -4, 71, -122, 61,
+ 103, 39, 20, 54, -81, -54, -99, -112,
+ -64, 7, 0, -56, 11, -63, 106, -71,
+ -25, 100, -103, 51, 0, 28, 3, 64,
+ 51, 0, -33, 90, -44, 89, -39, -101,
+ 8, 31, 3, 96, 44, 0, -122, 101,
+ 9, 114, 67, 0, 0, -1, -64, -1,
+ 0, 88, 35, 82, 67, -71, 8, 43,
+ 0, 64, -1, -64, -1, -128, 126, 1,
+ -110, 101, 95, -6, -37, 113, 0, 9,
+ -79, 19, -26, 112, 41, -51, -83, 18,
+ 113, -108, 52, -113, -25, -44, 54, 33,
+ 13, -59, 13, 5, -11, 97, 12, -58,
+ 8, -50, -122, 90, -17, -102, -46, 26,
+ -82, 9, -80, -116, 83, -23, -56, 69,
+ 73, 84, 0, -28, 7, -12, 3, 47,
+ 17, -68, 43, -26, -62, 32, 92, 25,
+ -15, -43, 24, 1, 13, -98, -18, -64,
+ -122, -51, 120, 98, -102, 24, 71, -35,
+ -127, 5, 90, 48, -42, -92, 49, -36,
+ 36, 116, 52, -29, -21, -11, 72, -59,
+ 21, -22, 106, -14, -73, -16, 36, 16,
+ 19, 105, 110, -105, -16, 41, 71, 54,
+ 80, -38, 109, 73, -110, -63, 21, 72,
+ 35, 38, 59, 49, 8, -109, 24, 88,
+ 29, 72, -125, 50, 91, -93, 16, 9,
+ -77, -53, 126, 20, -64, 33, 2, 58,
+ -90, 8, -109, 102, 61, 41, -112, 70,
+ 65, -9, 75, 17, 38, 22, -12, 83,
+ 35, 125, -4, -14, -62, -95, -106, -103,
+ -66, -82, 70, -60, -16, 115, 17, 30,
+ -4, 0, 11, 1, -8, 0, -126, -120,
+ 75, 65, -47, -42, -58, 126, -55, -128,
+ 0, 15, 96, 52, 115, 14, -37, 79,
+ -70, 71, 10, 60, -102, 74, 34, 124,
+ -25, 10, 5, 112, -24, -46, -68, 105,
+ 23, -34, -3, 4, 95, -20, 69, -37,
+ 50, -98, 8, 17, -113, 97, 20, 72,
+ 33, -107, 88, -45, -56, -49, -80, -85,
+ -30, 36, 85, -77, 9, 68, 33, -94,
+ -67, -97, 72, -52, 35, -108, -95, 23,
+ 96, 40, 22, 40, 64, 12, 87, -122,
+ -9, 27, -23, 2, 8, -73, -6, -26,
+ -112, 22, 4, -44, 116, 85, 2, -116,
+ -109, -24, -101, -34, 56, 1, -74, 16,
+ 0, 1, -16, 14, 61, 89, 56, 51,
+ -21, -107, -101, -72, -17, 64, 46, -64,
+ 2, -80, 13, 1, -37, 16, 1, 4,
+ 0, 0, 0, 0, -63, 118, 101, -103,
+ 91, -60, 32, 4, -40, 52, 58, 119,
+ 64, 32, 0, -52, 0, 0, 0, -120
+ } ;
+
+ private static final CompressedGeometryHeader cgHeader ;
+
+ static {
+ cgHeader = new CompressedGeometryHeader() ;
+ cgHeader.majorVersionNumber = 1 ;
+ cgHeader.minorVersionNumber = 0 ;
+ cgHeader.minorMinorVersionNumber = 1 ;
+ cgHeader.bufferType = CompressedGeometryHeader.TRIANGLE_BUFFER ;
+ cgHeader.bufferDataPresent = CompressedGeometryHeader.NORMAL_IN_BUFFER ;
+ cgHeader.start = 0 ;
+ cgHeader.size = cgData.length ;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/IcosahedronITSA.java b/src/main/java/org/jdesktop/j3d/examples/picking/IcosahedronITSA.java
new file mode 100644
index 0000000..5d87553
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/IcosahedronITSA.java
@@ -0,0 +1,182 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.IndexedTriangleStripArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class IcosahedronITSA extends IndexedTriangleStripArray {
+
+ private static final int[] sVertCnt = {
+ 3, 11, 5, 4, 5, 4
+ };
+
+ IcosahedronITSA() {
+ super(12, GeometryArray.COORDINATES | GeometryArray.COLOR_3, 32, sVertCnt);
+
+ Point3f verts[] = new Point3f[12];
+ Color3f colors[] = new Color3f[12];
+
+ verts[0] = new Point3f(0.0f, 1.4f, 0.8652f);
+ verts[1] = new Point3f(0.0f, 1.4f, -0.8652f);
+ verts[2] = new Point3f(1.4f, 0.8652f, 0.0f);
+ verts[3] = new Point3f(1.4f, -0.8652f, 0.0f);
+ verts[4] = new Point3f(0.0f, -1.4f, -0.8652f);
+ verts[5] = new Point3f(0.0f, -1.4f, 0.8652f);
+ verts[6] = new Point3f(0.8652f, 0.0f, 1.4f);
+ verts[7] = new Point3f(-0.8652f, 0.0f, 1.4f);
+ verts[8] = new Point3f(0.8652f, 0.0f, -1.4f);
+ verts[9] = new Point3f(-0.8652f, 0.0f, -1.4f);
+ verts[10] = new Point3f(-1.4f, 0.8652f, 0.0f);
+ verts[11] = new Point3f(-1.4f, -0.8652f, 0.0f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+ colors[3] = new Color3f(1.0f, 1.0f, 0.0f);
+ colors[4] = new Color3f(0.0f, 1.0f, 1.0f);
+ colors[5] = new Color3f(1.0f, 0.0f, 1.0f);
+ colors[6] = new Color3f(0.0f, 0.5f, 0.0f);
+ colors[7] = new Color3f(0.0f, 0.0f, 0.5f);
+ colors[8] = new Color3f(0.5f, 0.5f, 0.0f);
+ colors[9] = new Color3f(0.0f, 0.5f, 0.5f);
+ colors[10] = new Color3f(0.5f, 0.0f, 0.5f);
+ colors[11] = new Color3f(0.5f, 0.5f, 0.5f);
+
+ int pntsIndex[] = new int[32];
+ int clrsIndex[] = new int[32];
+
+ pntsIndex[0] = 4;
+ clrsIndex[0] = 4;
+ pntsIndex[1] = 5;
+ clrsIndex[1] = 5;
+ pntsIndex[2] = 11;
+ clrsIndex[2] = 11;
+
+ pntsIndex[3] = 11;
+ clrsIndex[3] = 11;
+ pntsIndex[4] = 5;
+ clrsIndex[4] = 5;
+ pntsIndex[5] = 7;
+ clrsIndex[5] = 7;
+
+ pntsIndex[6] = 6;
+ clrsIndex[6] = 6;
+
+ pntsIndex[7] = 0;
+ clrsIndex[7] = 0;
+
+ pntsIndex[8] = 2;
+ clrsIndex[8] = 2;
+
+ pntsIndex[9] = 1;
+ clrsIndex[9] = 1;
+
+ pntsIndex[10] = 8;
+ clrsIndex[10] = 8;
+
+ pntsIndex[11] = 9;
+ clrsIndex[11] = 9;
+
+ pntsIndex[12] = 4;
+ clrsIndex[12] = 4;
+
+ pntsIndex[13] = 11;
+ clrsIndex[13] = 11;
+
+ pntsIndex[14] = 2;
+ clrsIndex[14] = 2;
+ pntsIndex[15] = 6;
+ clrsIndex[15] = 6;
+ pntsIndex[16] = 3;
+ clrsIndex[16] = 3;
+
+ pntsIndex[17] = 5;
+ clrsIndex[17] = 5;
+
+ pntsIndex[18] = 4;
+ clrsIndex[18] = 4;
+
+ pntsIndex[19] = 4;
+ clrsIndex[19] = 4;
+ pntsIndex[20] = 8;
+ clrsIndex[20] = 8;
+ pntsIndex[21] = 3;
+ clrsIndex[21] = 3;
+
+ pntsIndex[22] = 2;
+ clrsIndex[22] = 2;
+
+ pntsIndex[23] = 0;
+ clrsIndex[23] = 0;
+ pntsIndex[24] = 1;
+ clrsIndex[24] = 1;
+ pntsIndex[25] = 10;
+ clrsIndex[25] = 10;
+
+ pntsIndex[26] = 9;
+ clrsIndex[26] = 9;
+
+ pntsIndex[27] = 11;
+ clrsIndex[27] = 11;
+
+ pntsIndex[28] = 0;
+ clrsIndex[28] = 0;
+ pntsIndex[29] = 10;
+ clrsIndex[29] = 10;
+ pntsIndex[30] = 7;
+ clrsIndex[30] = 7;
+
+ pntsIndex[31] = 11;
+ clrsIndex[31] = 11;
+
+ setCoordinates(0, verts);
+ setCoordinateIndices(0, pntsIndex);
+ setColors(0, colors);
+ setColorIndices(0, clrsIndex);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/IcosahedronTSA.java b/src/main/java/org/jdesktop/j3d/examples/picking/IcosahedronTSA.java
new file mode 100644
index 0000000..065b410
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/IcosahedronTSA.java
@@ -0,0 +1,179 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.TriangleStripArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class IcosahedronTSA extends TriangleStripArray {
+ private static final int[] sVertCnt = {
+ 3, 11, 5, 4, 5, 4
+ };
+
+ IcosahedronTSA() {
+ super(32, GeometryArray.COORDINATES | GeometryArray.COLOR_3, sVertCnt);
+
+ Point3f verts[] = new Point3f[12];
+ Color3f colors[] = new Color3f[12];
+
+ verts[0] = new Point3f(0.0f, 1.4f, 0.8652f);
+ verts[1] = new Point3f(0.0f, 1.4f, -0.8652f);
+ verts[2] = new Point3f(1.4f, 0.8652f, 0.0f);
+ verts[3] = new Point3f(1.4f, -0.8652f, 0.0f);
+ verts[4] = new Point3f(0.0f, -1.4f, -0.8652f);
+ verts[5] = new Point3f(0.0f, -1.4f, 0.8652f);
+ verts[6] = new Point3f(0.8652f, 0.0f, 1.4f);
+ verts[7] = new Point3f(-0.8652f, 0.0f, 1.4f);
+ verts[8] = new Point3f(0.8652f, 0.0f, -1.4f);
+ verts[9] = new Point3f(-0.8652f, 0.0f, -1.4f);
+ verts[10] = new Point3f(-1.4f, 0.8652f, 0.0f);
+ verts[11] = new Point3f(-1.4f, -0.8652f, 0.0f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+ colors[3] = new Color3f(1.0f, 1.0f, 0.0f);
+ colors[4] = new Color3f(0.0f, 1.0f, 1.0f);
+ colors[5] = new Color3f(1.0f, 0.0f, 1.0f);
+ colors[6] = new Color3f(0.0f, 0.5f, 0.0f);
+ colors[7] = new Color3f(0.0f, 0.0f, 0.5f);
+ colors[8] = new Color3f(0.5f, 0.5f, 0.0f);
+ colors[9] = new Color3f(0.0f, 0.5f, 0.5f);
+ colors[10] = new Color3f(0.5f, 0.0f, 0.5f);
+ colors[11] = new Color3f(0.5f, 0.5f, 0.5f);
+
+ Point3f pnts[] = new Point3f[32];
+ Color3f clrs[] = new Color3f[32];
+
+ pnts[0] = verts[4];
+ clrs[0] = colors[4];
+ pnts[1] = verts[5];
+ clrs[1] = colors[5];
+ pnts[2] = verts[11];
+ clrs[2] = colors[11];
+
+ pnts[3] = verts[11];
+ clrs[3] = colors[11];
+ pnts[4] = verts[5];
+ clrs[4] = colors[5];
+ pnts[5] = verts[7];
+ clrs[5] = colors[7];
+
+ pnts[6] = verts[6];
+ clrs[6] = colors[6];
+
+ pnts[7] = verts[0];
+ clrs[7] = colors[0];
+
+ pnts[8] = verts[2];
+ clrs[8] = colors[2];
+
+ pnts[9] = verts[1];
+ clrs[9] = colors[1];
+
+ pnts[10] = verts[8];
+ clrs[10] = colors[8];
+
+ pnts[11] = verts[9];
+ clrs[11] = colors[9];
+
+ pnts[12] = verts[4];
+ clrs[12] = colors[4];
+
+ pnts[13] = verts[11];
+ clrs[13] = colors[11];
+
+ pnts[14] = verts[2];
+ clrs[14] = colors[2];
+ pnts[15] = verts[6];
+ clrs[15] = colors[6];
+ pnts[16] = verts[3];
+ clrs[16] = colors[3];
+
+ pnts[17] = verts[5];
+ clrs[17] = colors[5];
+
+ pnts[18] = verts[4];
+ clrs[18] = colors[4];
+
+ pnts[19] = verts[4];
+ clrs[19] = colors[4];
+ pnts[20] = verts[8];
+ clrs[20] = colors[8];
+ pnts[21] = verts[3];
+ clrs[21] = colors[3];
+
+ pnts[22] = verts[2];
+ clrs[22] = colors[2];
+
+ pnts[23] = verts[0];
+ clrs[23] = colors[0];
+ pnts[24] = verts[1];
+ clrs[24] = colors[1];
+ pnts[25] = verts[10];
+ clrs[25] = colors[10];
+
+ pnts[26] = verts[9];
+ clrs[26] = colors[9];
+
+ pnts[27] = verts[11];
+ clrs[27] = colors[11];
+
+ pnts[28] = verts[0];
+ clrs[28] = colors[0];
+ pnts[29] = verts[10];
+ clrs[29] = colors[10];
+ pnts[30] = verts[7];
+ clrs[30] = colors[7];
+
+ pnts[31] = verts[11];
+ clrs[31] = colors[11];
+
+ setCoordinates(0, pnts);
+ setColors(0, clrs);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/IntersectInfoBehavior.java b/src/main/java/org/jdesktop/j3d/examples/picking/IntersectInfoBehavior.java
new file mode 100644
index 0000000..56c12da
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/IntersectInfoBehavior.java
@@ -0,0 +1,271 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import java.awt.AWTEvent;
+import java.awt.event.MouseEvent;
+import java.util.Enumeration;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Node;
+import org.jogamp.java3d.PickInfo;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.WakeupCriterion;
+import org.jogamp.java3d.WakeupOnAWTEvent;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.pickfast.PickCanvas;
+import org.jogamp.java3d.utils.pickfast.PickIntersection;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Color4f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * Class: IntersectInfoBehavior
+ *
+ * Description: Used to respond to mouse pick and drag events
+ * in the 3D window. Displays information about the pick.
+ *
+ * Version: 1.0
+ *
+ */
+public class IntersectInfoBehavior extends Behavior {
+
+ float size;
+ PickCanvas pickCanvas;
+ PickInfo[] pickInfoArr;
+ Appearance oldlook, redlookwf, redlook, greenlook, bluelook;
+ Node oldNode = null;
+ GeometryArray oldGeom = null;
+ Color3f redColor = new Color3f (1.0f, 0.0f, 0.0f);
+ TransformGroup[] sphTrans = new TransformGroup [6];
+ Sphere[] sph = new Sphere [6];
+ Transform3D spht3 = new Transform3D();
+
+ public IntersectInfoBehavior(Canvas3D canvas3D, BranchGroup branchGroup,
+ float size) {
+ pickCanvas = new PickCanvas(canvas3D, branchGroup);
+ pickCanvas.setTolerance(5.0f);
+ pickCanvas.setMode(PickInfo.PICK_GEOMETRY);
+ pickCanvas.setFlags(PickInfo.LOCAL_TO_VWORLD | PickInfo.CLOSEST_GEOM_INFO);
+ this.size = size;
+ // Create an Appearance.
+ redlook = new Appearance();
+ Color3f objColor = new Color3f(0.5f, 0.0f, 0.0f);
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ redlook.setMaterial(new Material(objColor, black, objColor, white, 50.0f));
+ redlook.setCapability (Appearance.ALLOW_MATERIAL_WRITE);
+
+ redlookwf = new Appearance ();
+ redlookwf.setMaterial(new Material(objColor, black, objColor, white, 50.0f));
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setPolygonMode(pa.POLYGON_LINE);
+ pa.setCullFace(pa.CULL_NONE);
+ redlookwf.setPolygonAttributes(pa);
+
+ oldlook = new Appearance();
+ objColor = new Color3f(1.0f, 1.0f, 1.0f);
+ oldlook.setMaterial(new Material(objColor, black, objColor, white, 50.0f));
+
+ greenlook = new Appearance();
+ objColor = new Color3f(0.0f, 0.8f, 0.0f);
+ greenlook.setMaterial(new Material(objColor, black, objColor, white, 50.0f));
+ bluelook = new Appearance();
+ objColor = new Color3f(0.0f, 0.0f, 0.8f);
+ bluelook.setMaterial(new Material(objColor, black, objColor, white, 50.0f));
+ for (int i=0;i<6;i++) {
+ switch (i) {
+ case 0:
+ sph[i] = new Sphere(size*1.15f, redlook);
+ break;
+ case 1:
+ sph[i] = new Sphere(size*1.1f, greenlook);
+ break;
+ default:
+ sph[i] = new Sphere(size, bluelook);
+ break;
+ }
+ sph[i].setPickable (false);
+ sphTrans[i] = new TransformGroup ();
+ sphTrans[i].setCapability (TransformGroup.ALLOW_TRANSFORM_READ);
+ sphTrans[i].setCapability (TransformGroup.ALLOW_TRANSFORM_WRITE);
+
+ // Add sphere, transform
+ branchGroup.addChild (sphTrans[i]);
+ sphTrans[i].addChild (sph[i]);
+ }
+ }
+
+ public void initialize() {
+ wakeupOn (new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED));
+ }
+
+ public void processStimulus (Enumeration criteria) {
+ WakeupCriterion wakeup;
+ AWTEvent[] event;
+ int eventId;
+
+ while (criteria.hasMoreElements()) {
+ wakeup = (WakeupCriterion) criteria.nextElement();
+ if (wakeup instanceof WakeupOnAWTEvent) {
+ event = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
+ for (int i=0; i<event.length; i++) {
+ eventId = event[i].getID();
+ if (eventId == MouseEvent.MOUSE_PRESSED) {
+ int x = ((MouseEvent)event[i]).getX();
+ int y = ((MouseEvent)event[i]).getY();
+ pickCanvas.setShapeLocation(x, y);
+
+ pickInfoArr = pickCanvas.pickAllSorted();
+ // Use this to do picking benchmarks
+ /*
+ long start = System.currentTimeMillis();
+ for (int l=0;l<2;l++) {
+ if (l == 0) System.out.print ("BOUNDS: ");
+ if (l == 1) System.out.print ("GEOMETRY: ");
+
+ for (int k=0;k<1000;k++) {
+ if (l == 0) {
+ pickCanvas.setMode(PickTool.BOUNDS);
+ pickResult = pickCanvas.pickAllSorted();
+ }
+ if (l == 1) {
+ pickCanvas.setMode(PickTool.GEOMETRY);
+ pickResult = pickCanvas.pickAllSorted();
+ }
+ }
+ long delta = System.currentTimeMillis() - start;
+ System.out.println ("\t"+delta+" ms / 1000 picks");
+ }
+ */
+ if (pickInfoArr != null) {
+
+ // Get closest intersection results
+ Transform3D l2vw = pickInfoArr[0].getLocalToVWorld();
+ PickInfo.IntersectionInfo[] iInfoArr = pickInfoArr[0].getIntersectionInfos();
+ PickIntersection pi = new PickIntersection(l2vw, iInfoArr[0]);
+
+ // Safe to assume the return geometry is of GeometryArray type.
+ GeometryArray curGeomArray = (GeometryArray) iInfoArr[0].getGeometry();
+
+ // Position sphere at intersection point
+ Vector3d v = new Vector3d();
+ Point3d intPt = pi.getPointCoordinatesVW();
+ v.set(intPt);
+ spht3.setTranslation (v);
+ sphTrans[0].setTransform (spht3);
+
+ // Position sphere at closest vertex
+ Point3d closestVert = pi.getClosestVertexCoordinatesVW();
+ v.set(closestVert);
+ spht3.setTranslation (v);
+ sphTrans[1].setTransform (spht3);
+
+ Point3d []ptw = pi.getPrimitiveCoordinatesVW();
+ Point3d []pt = pi.getPrimitiveCoordinates();
+ int []coordidx = pi.getPrimitiveCoordinateIndices();
+ Point3d ptcoord = new Point3d();
+ for (int k=0;k<pt.length;k++) {
+ v.set(ptw[k]);
+ spht3.setTranslation (v);
+ sphTrans[k+2].setTransform (spht3);
+ }
+
+ // Get interpolated color (if available)
+ Color4f iColor4 = null;
+ Color3f iColor = null;
+ Vector3f iNormal = null;
+
+ if (curGeomArray != null) {
+ int vf = curGeomArray.getVertexFormat();
+
+ if (((vf &
+ (GeometryArray.COLOR_3 |
+ GeometryArray.COLOR_4)) != 0) &&
+ (null != (iColor4 =
+ pi.getPointColor()))) {
+ iColor =
+ new Color3f(iColor4.x, iColor4.y, iColor4.z);
+
+ // Change the point's color
+ redlook.setMaterial(new Material(iColor, new Color3f (0.0f, 0.0f, 0.0f), iColor, new Color3f(1.0f, 1.0f, 1.0f), 50.0f));
+ }
+ if (((vf & GeometryArray.NORMALS) != 0) &&
+ (null != (iNormal =
+ pi.getPointNormal()))) {
+ System.out.println ("Interpolated normal: "+iNormal);
+ }
+ }
+
+ System.out.println ("=============");
+ System.out.println ("Coordinates of intersection pt:"+intPt);
+ System.out.println ("Coordinates of vertices: ");
+ for (int k=0;k<pt.length;k++) {
+ System.out.println (k + ":" + ptw[k].x + " " + ptw[k].y + " " + ptw[k].z);
+ }
+ System.out.println ("Closest vertex: "+closestVert);
+ if (iColor != null) {
+ System.out.println ("Interpolated color: "+iColor);
+ }
+ if (iNormal != null) {
+ System.out.println ("Interpolated normal: "+iNormal);
+ }
+ }
+ }
+ }
+ }
+ }
+ wakeupOn (new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED));
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/IntersectTest.java b/src/main/java/org/jdesktop/j3d/examples/picking/IntersectTest.java
new file mode 100644
index 0000000..a95c377
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/IntersectTest.java
@@ -0,0 +1,251 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.LineArray;
+import org.jogamp.java3d.PointArray;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.View;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.behaviors.keyboard.KeyNavigatorBehavior;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class IntersectTest extends Applet {
+
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 1000.0);
+
+ private SimpleUniverse u = null;
+
+ public BranchGroup createSceneGraph () {
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Set up the ambient light
+ Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
+ AmbientLight ambientLightNode = new AmbientLight(ambientColor);
+ ambientLightNode.setInfluencingBounds(bounds);
+ objRoot.addChild(ambientLightNode);
+
+ // Set up the directional lights
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f);
+ Color3f light2Color = new Color3f(0.3f, 0.3f, 0.4f);
+ Vector3f light2Direction = new Vector3f(-6.0f, -2.0f, -1.0f);
+
+ DirectionalLight light1
+ = new DirectionalLight(light1Color, light1Direction);
+ light1.setInfluencingBounds(bounds);
+ objRoot.addChild(light1);
+
+ DirectionalLight light2
+ = new DirectionalLight(light2Color, light2Direction);
+ light2.setInfluencingBounds(bounds);
+ objRoot.addChild(light2);
+
+ Transform3D t3 = new Transform3D ();
+
+ // Shapes
+ for (int x=0;x<3;x++) {
+ for (int y=0;y<3;y++) {
+ for (int z=0;z<3;z++) {
+ t3.setTranslation (new Vector3d(-4+x*4.0, -4+y*4.0, -20-z*4.0));
+ TransformGroup objTrans = new TransformGroup(t3);
+
+ objRoot.addChild(objTrans);
+
+ // Create a simple shape leaf node, add it to the scene graph.
+ GeometryArray geom = null;
+
+ if (((x+y+z) % 2) == 0) {
+ geom = new RandomColorCube();
+ }
+ else {
+ geom = new RandomColorTetrahedron();
+ }
+
+ Shape3D shape = new Shape3D(geom);
+
+ objTrans.addChild(shape);
+ }
+ }
+ }
+
+ // Lines
+ Point3f[] verts = {
+ new Point3f (-2.0f, 0.0f, 0.0f),new Point3f(2.0f, 0.0f, 0.0f)
+ };
+ Color3f grey = new Color3f (0.7f, 0.7f, 0.7f);
+ Color3f[] colors = {
+ grey, grey
+ };
+
+ for (int y=0;y<5;y++) {
+ for (int z=0;z<5;z++) {
+ t3.setTranslation (new Vector3d(7.0, -4+y*2.0, -20.0-z*2.0));
+ TransformGroup objTrans = new TransformGroup(t3);
+
+ objRoot.addChild(objTrans);
+
+ LineArray la = new LineArray (verts.length,
+ LineArray.COORDINATES |
+ LineArray.COLOR_3);
+ la.setCoordinates (0, verts);
+ la.setColors (0, colors);
+
+
+ Shape3D shape = new Shape3D();
+ shape.setGeometry (la);
+
+
+ objTrans.addChild(shape);
+ }
+ }
+
+ // Points
+ for (double x=-2.0;x<=2.0;x+=1.0) {
+ for (double y=-2.0;y<=2.0;y+=1.0) {
+ for (double z=-2.0;z<=2.0;z+=1.0) {
+ t3.setTranslation (new Vector3d(-10.0+2.0*x, 0.0+2.0*y,-20.0+2.0*z));
+ TransformGroup objTrans = new TransformGroup(t3);
+
+ objRoot.addChild(objTrans);
+
+ PointArray pa = new PointArray (1,
+ PointArray.COORDINATES |
+ PointArray.COLOR_3);
+
+ pa.setCoordinate (0, new Point3d (0.0, 0.0, 0.0));
+ pa.setColor (0, grey);
+
+ Shape3D shape = new Shape3D();
+ shape.setGeometry (pa);
+
+
+ objTrans.addChild(shape);
+ }
+ }
+ }
+
+ return objRoot;
+ }
+
+ public IntersectTest () {
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ setLayout(new BorderLayout());
+
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+
+ // Create a simple scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph();
+ u = new SimpleUniverse(c);
+
+ // Add picking behavior
+ IntersectInfoBehavior behavior =
+ new IntersectInfoBehavior (c, scene,0.05f);
+ behavior.setSchedulingBounds (bounds);
+ scene.addChild (behavior);
+
+ TransformGroup vpTrans =
+ u.getViewingPlatform().getViewPlatformTransform();
+
+ KeyNavigatorBehavior keybehavior = new KeyNavigatorBehavior (vpTrans);
+ keybehavior.setSchedulingBounds (bounds);
+ scene.addChild (keybehavior);
+ scene.setCapability (Group.ALLOW_CHILDREN_EXTEND);
+ scene.compile();
+ u.addBranchGraph(scene);
+
+ View view = u.getViewer().getView();
+ view.setBackClipDistance (100000);
+
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ //
+ // The following allows IntersectTest to be run as an application
+ // as well as an applet
+ //
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ String s = "\n\nIntersectTest:\n-----------\n";
+ s += "Pick with the mouse over the primitives\n";
+ s += "- A sphere will be placed to indicate the picked point.\n";
+ s += "If color information is available, the sphere will change color to reflect\n";
+ s += "the interpolated color.\n";
+ s += "- Other spheres will be placed to show the vertices of the selected polygon\n";
+ s += "- Information will be displayed about the picking operation\n\n\n";
+
+ System.out.println (s);
+
+ new MainFrame(new IntersectTest(), 640, 640);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/MorphingBehavior.java b/src/main/java/org/jdesktop/j3d/examples/picking/MorphingBehavior.java
new file mode 100644
index 0000000..0aaf1e1
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/MorphingBehavior.java
@@ -0,0 +1,102 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import java.util.Enumeration;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.Morph;
+import org.jogamp.java3d.WakeupOnElapsedFrames;
+
+// User-defined morphing behavior class
+public class MorphingBehavior extends Behavior {
+
+ Alpha alpha;
+ Morph morph;
+ double weights[];
+
+ WakeupOnElapsedFrames w = new WakeupOnElapsedFrames(0);
+
+ // Override Behavior's initialize method to setup wakeup criteria
+ public void initialize() {
+ alpha.setStartTime(System.currentTimeMillis());
+
+ // Establish initial wakeup criteria
+ wakeupOn(w);
+ }
+
+ // Override Behavior's stimulus method to handle the event
+ public void processStimulus(Enumeration criteria) {
+
+ // NOTE: This assumes 3 objects. It should be generalized to
+ // "n" objects.
+
+ double val = alpha.value();
+ if (val < 0.5) {
+ double a = val * 2.0;
+ weights[0] = 1.0 - a;
+ weights[1] = a;
+ weights[2] = 0.0;
+ }
+ else {
+ double a = (val - 0.5) * 2.0;
+ weights[0] = 0.0;
+ weights[1] = 1.0f - a;
+ weights[2] = a;
+ }
+
+ morph.setWeights(weights);
+
+ // Set wakeup criteria for next time
+ wakeupOn(w);
+ }
+
+ public MorphingBehavior(Alpha a, Morph m) {
+ alpha = a;
+ morph = m;
+ weights = morph.getWeights();
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/OctahedronITFA.java b/src/main/java/org/jdesktop/j3d/examples/picking/OctahedronITFA.java
new file mode 100644
index 0000000..b81a00b
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/OctahedronITFA.java
@@ -0,0 +1,117 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.IndexedTriangleFanArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class OctahedronITFA extends IndexedTriangleFanArray {
+ private static final int[] sVertCnt = {
+ 6, 6
+ };
+
+ OctahedronITFA() {
+ super(6, GeometryArray.COORDINATES | GeometryArray.COLOR_3, 12, sVertCnt);
+
+ Point3f verts[] = new Point3f[6];
+ Color3f colors[] = new Color3f[6];
+
+ verts[0] = new Point3f(0.0f,0.0f,-1.5f);
+ verts[1] = new Point3f(0.0f,0.0f,1.5f);
+ verts[2] = new Point3f(0.0f,-1.5f,0.0f);
+ verts[3] = new Point3f(0.0f,1.5f,0.0f);
+ verts[4] = new Point3f(1.5f,0.0f,0.0f);
+ verts[5] = new Point3f(-1.5f,0.0f,0.0f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+ colors[3] = new Color3f(1.0f, 1.0f, 0.0f);
+ colors[4] = new Color3f(1.0f, 0.0f, 1.0f);
+ colors[5] = new Color3f(0.0f, 1.0f, 1.0f);
+
+ int pntsIndex[] = new int[12];
+ int clrsIndex[] = new int[12];
+
+ pntsIndex[0] = 4;
+ clrsIndex[0] = 4;
+ pntsIndex[1] = 2;
+ clrsIndex[1] = 2;
+ pntsIndex[2] = 0;
+ clrsIndex[2] = 0;
+
+ pntsIndex[3] = 3;
+ clrsIndex[3] = 3;
+
+ pntsIndex[4] = 1;
+ clrsIndex[4] = 1;
+
+ pntsIndex[5] = 2;
+ clrsIndex[5] = 2;
+
+ pntsIndex[6] = 5;
+ clrsIndex[6] = 5;
+ pntsIndex[7] = 1;
+ clrsIndex[7] = 1;
+ pntsIndex[8] = 3;
+ clrsIndex[8] = 3;
+
+ pntsIndex[9] = 0;
+ clrsIndex[9] = 0;
+
+ pntsIndex[10] = 2;
+ clrsIndex[10] = 2;
+
+ pntsIndex[11] = 1;
+ clrsIndex[11] = 1;
+
+ setCoordinates(0, verts);
+ setCoordinateIndices(0, pntsIndex);
+ setColors(0, colors);
+ setColorIndices(0, clrsIndex);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/OctahedronTFA.java b/src/main/java/org/jdesktop/j3d/examples/picking/OctahedronTFA.java
new file mode 100644
index 0000000..18e1328
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/OctahedronTFA.java
@@ -0,0 +1,116 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.TriangleFanArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class OctahedronTFA extends TriangleFanArray {
+ private static final int[] sVertCnt = {
+ 6, 6
+ };
+
+ OctahedronTFA() {
+ super(12, GeometryArray.COORDINATES | GeometryArray.COLOR_3, sVertCnt);
+
+ Point3f verts[] = new Point3f[6];
+ Color3f colors[] = new Color3f[6];
+
+ verts[0] = new Point3f(0.0f,0.0f,-1.5f);
+ verts[1] = new Point3f(0.0f,0.0f,1.5f);
+ verts[2] = new Point3f(0.0f,-1.5f,0.0f);
+ verts[3] = new Point3f(0.0f,1.5f,0.0f);
+ verts[4] = new Point3f(1.5f,0.0f,0.0f);
+ verts[5] = new Point3f(-1.5f,0.0f,0.0f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+ colors[3] = new Color3f(1.0f, 1.0f, 0.0f);
+ colors[4] = new Color3f(1.0f, 0.0f, 1.0f);
+ colors[5] = new Color3f(0.0f, 1.0f, 1.0f);
+
+
+ Point3f pnts[] = new Point3f[12];
+ Color3f clrs[] = new Color3f[12];
+
+ pnts[0] = verts[4];
+ clrs[0] = colors[4];
+ pnts[1] = verts[2];
+ clrs[1] = colors[2];
+ pnts[2] = verts[0];
+ clrs[2] = colors[0];
+
+ pnts[3] = verts[3];
+ clrs[3] = colors[3];
+
+ pnts[4] = verts[1];
+ clrs[4] = colors[1];
+
+ pnts[5] = verts[2];
+ clrs[5] = colors[2];
+
+ pnts[6] = verts[5];
+ clrs[6] = colors[5];
+ pnts[7] = verts[1];
+ clrs[7] = colors[1];
+ pnts[8] = verts[3];
+ clrs[8] = colors[3];
+
+ pnts[9] = verts[0];
+ clrs[9] = colors[0];
+
+ pnts[10] = verts[2];
+ clrs[10] = colors[2];
+
+ pnts[11] = verts[1];
+ clrs[11] = colors[1];
+
+ setCoordinates(0, pnts);
+ setColors(0, clrs);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/PickHighlightBehavior.java b/src/main/java/org/jdesktop/j3d/examples/picking/PickHighlightBehavior.java
new file mode 100644
index 0000000..afc5630
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/PickHighlightBehavior.java
@@ -0,0 +1,102 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Bounds;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.utils.picking.PickResult;
+import org.jogamp.java3d.utils.picking.PickTool;
+import org.jogamp.java3d.utils.picking.behaviors.PickMouseBehavior;
+import org.jogamp.vecmath.Color3f;
+
+public class PickHighlightBehavior extends PickMouseBehavior {
+ Appearance savedAppearance = null;
+ Shape3D oldShape = null;
+ Appearance highlightAppearance;
+
+ public PickHighlightBehavior(Canvas3D canvas, BranchGroup root,
+ Bounds bounds) {
+ super(canvas, root, bounds);
+ this.setSchedulingBounds(bounds);
+ root.addChild(this);
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f highlightColor = new Color3f(0.0f, 1.0f, 0.0f);
+ Material highlightMaterial = new Material(highlightColor, black,
+ highlightColor, white,
+ 80.0f);
+ highlightAppearance = new Appearance();
+ highlightAppearance.setMaterial(new Material(highlightColor, black,
+ highlightColor, white,
+ 80.0f));
+
+ pickCanvas.setMode(PickTool.BOUNDS);
+ }
+
+ public void updateScene(int xpos, int ypos) {
+ PickResult pickResult = null;
+ Shape3D shape = null;
+
+ pickCanvas.setShapeLocation(xpos, ypos);
+
+ pickResult = pickCanvas.pickClosest();
+ if (pickResult != null) {
+ shape = (Shape3D) pickResult.getNode(PickResult.SHAPE3D);
+ }
+
+ if (oldShape != null){
+ oldShape.setAppearance(savedAppearance);
+ }
+ if (shape != null) {
+ savedAppearance = shape.getAppearance();
+ oldShape = shape;
+ shape.setAppearance(highlightAppearance);
+ }
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/PickTest.java b/src/main/java/org/jdesktop/j3d/examples/picking/PickTest.java
new file mode 100644
index 0000000..e36c28b
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/PickTest.java
@@ -0,0 +1,442 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.BoxLayout;
+import javax.swing.ButtonGroup;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.border.BevelBorder;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Geometry;
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Morph;
+import org.jogamp.java3d.PickInfo;
+import org.jogamp.java3d.PointAttributes;
+import org.jogamp.java3d.QuadArray;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.View;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.pickfast.behaviors.PickRotateBehavior;
+import org.jogamp.java3d.utils.pickfast.behaviors.PickTranslateBehavior;
+import org.jogamp.java3d.utils.pickfast.behaviors.PickZoomBehavior;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * PickTest shows how to use the Picking utilities on various GeometryArray
+ * subclasses and Morph object.
+ * Type of Geometry : CompressedGeometry ( GullCG.java )
+ * IndexedQuadArray ( CubeIQA.java )
+ * TriangleArray ( TetrahedronTA.java )
+ * IndexedTriangleArray ( TetrahedronITA.java )
+ * TriangleFanArray ( OctahedronTFA.java )
+ * IndexedTriangleFanArray ( OctahedronITA.java )
+ * TriangleStripArray ( IcosahedronTFA.java )
+ * IndexedTriangleStripArray ( IcosahedronITA.java )
+ * PointArray( TetrahedronPA.java )
+ * LineArray( TetrahedronLA.java )
+ * IndexLineArray( TetrahedronILA.java )
+ * LineStripArray( TetrahedronLSA.java )
+ * IndexLineStripArray( TetrahedronILSA.java )
+ *
+ * Morph Object uses : QuadArray ( ColorCube.java, ColorPyramidDown.java,
+ * and ColorPyramidUp.java ).
+ */
+
+public class PickTest extends Applet implements ActionListener {
+
+ private View view = null;
+ private QuadArray geomMorph[] = new QuadArray[3];
+ private Morph morph;
+
+ private PickRotateBehavior behavior1;
+ private PickZoomBehavior behavior2;
+ private PickTranslateBehavior behavior3;
+
+ private SimpleUniverse u = null;
+
+ public BranchGroup createSceneGraph(Canvas3D canvas)
+ {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(1.0);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bunch of objects with a behavior and add them
+ // into the scene graph.
+
+ int row, col;
+ int numRows = 4, numCols = 4;
+
+ for (int i = 0; i < numRows; i++) {
+ double ypos = (double)(i - numRows/2) * 0.45 + 0.25;
+ for (int j = 0; j < numCols; j++) {
+ double xpos = (double)(j - numCols/2) * 0.45 + 0.25;
+ objScale.addChild(createObject(i * numCols + j, 0.1, xpos, ypos));
+ }
+ }
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Add a light.
+ Color3f lColor = new Color3f(1.0f, 1.0f, 1.0f) ;
+ Vector3f lDir = new Vector3f(0.0f, 0.0f, -1.0f) ;
+
+ DirectionalLight lgt = new DirectionalLight(lColor, lDir) ;
+ lgt.setInfluencingBounds(bounds) ;
+ objRoot.addChild(lgt) ;
+
+
+ // Now create the Alpha object that controls the speed of the
+ // morphing operation.
+ Alpha morphAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE |
+ Alpha.DECREASING_ENABLE,
+ 0, 0,
+ 4000, 1000, 500,
+ 4000, 1000, 500);
+
+ // Finally, create the morphing behavior
+ MorphingBehavior mBeh = new MorphingBehavior(morphAlpha, morph);
+ mBeh.setSchedulingBounds(bounds);
+ objRoot.addChild(mBeh);
+
+ behavior1 = new PickRotateBehavior(objRoot, canvas, bounds);
+ objRoot.addChild(behavior1);
+
+ behavior2 = new PickZoomBehavior(objRoot, canvas, bounds);
+ objRoot.addChild(behavior2);
+
+ behavior3 = new PickTranslateBehavior(objRoot, canvas, bounds);
+ objRoot.addChild(behavior3);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+
+ private Group createObject(int index, double scale, double xpos, double ypos){
+
+ Shape3D shape = null;
+ Geometry geom = null;
+
+ // Create a transform group node to scale and position the object.
+ Transform3D t = new Transform3D();
+ t.set(scale, new Vector3d(xpos, ypos, 0.0));
+ TransformGroup objTrans = new TransformGroup(t);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ objTrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
+
+ // Create a second transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime.
+ TransformGroup spinTg = new TransformGroup();
+ spinTg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ spinTg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ spinTg.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
+
+ Appearance appearance = new Appearance();
+
+ switch(index) {
+ case 0:
+ geom = new GullCG();
+ break;
+ case 1:
+ geom = new TetrahedronTA();
+ break;
+ case 2:
+ geom = new OctahedronTFA();
+ break;
+ case 3:
+ geom = new IcosahedronTSA();
+ break;
+ case 4:
+ geom = new CubeIQA();
+ break;
+ case 5:
+ geom = new TetrahedronITA();
+ break;
+ case 6:
+ geom = new OctahedronITFA();
+ break;
+ case 7:
+ geom = new IcosahedronITSA();
+ break;
+ case 8:
+ geomMorph[0] = new ColorPyramidUp();
+ geomMorph[1] = new ColorCube();
+ geomMorph[2] = new ColorPyramidDown();
+ break;
+ case 9:
+ geom = new TetrahedronLA();
+ break;
+ case 10:
+ geom = new TetrahedronILA();
+ break;
+ case 11:
+ geom = new TetrahedronLSA();
+ break;
+ case 12:
+ geom = new TetrahedronILSA();
+ break;
+ case 13:
+ geom = new TetrahedronPA();
+ break;
+ case 14:
+ geom = new TetrahedronIPA();
+ break;
+ // TODO: other geo types, Text3D?
+ case 15:
+ geom = new TetrahedronTA();
+ break;
+ }
+
+ Material m = new Material() ;
+
+ if(index == 8) {
+ m.setLightingEnable(false) ;
+ appearance.setMaterial(m) ;
+ morph = new Morph((GeometryArray[]) geomMorph, appearance);
+ morph.setCapability(Morph.ALLOW_WEIGHTS_READ);
+ morph.setCapability(Morph.ALLOW_WEIGHTS_WRITE);
+ spinTg.addChild(morph);
+ } else {
+ // Geometry picking require this to be set.
+ if (index == 0)
+ m.setLightingEnable(true) ;
+ else
+ m.setLightingEnable(false) ;
+ appearance.setMaterial(m) ;
+
+ if ((index == 13) || (index == 14)) {
+ PointAttributes pa = new PointAttributes();
+ pa.setPointSize(4.0f);
+ appearance.setPointAttributes(pa);
+ }
+
+ shape = new Shape3D(geom,appearance);
+ shape.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
+ shape.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
+ shape.setCapability(Shape3D.ENABLE_PICK_REPORTING);
+ spinTg.addChild(shape);
+ }
+
+ // add it to the scene graph.
+ objTrans.addChild(spinTg);
+
+ return objTrans;
+ }
+
+ private void setPickMode(int mode) {
+ behavior1.setMode(mode);
+ behavior2.setMode(mode);
+ behavior3.setMode(mode);
+ }
+
+ private void setPickTolerance(float tolerance) {
+ behavior1.setTolerance(tolerance);
+ behavior2.setTolerance(tolerance);
+ behavior3.setTolerance(tolerance);
+ }
+
+ private void setViewMode(int mode) {
+ view.setProjectionPolicy(mode);
+ }
+
+ // GUI stuff
+
+ String pickModeString = new String("Pick Mode");
+ String boundsString = new String("BOUNDS");
+ String geometryString = new String("GEOMETRY");
+ String toleranceString = new String("Pick Tolerance");
+ String tolerance0String = new String("0");
+ String tolerance2String = new String("2");
+ String tolerance4String = new String("4");
+ String tolerance8String = new String("8");
+ String viewModeString = new String("View Mode");
+ String perspectiveString = new String("Perspective");
+ String parallelString = new String("Parallel");
+
+ private void addRadioButton(JPanel panel, ButtonGroup bg, String ownerName,
+ String buttonName, boolean selected) {
+ JRadioButton item;
+ item = new JRadioButton(buttonName);
+ item.setName(ownerName);
+ item.addActionListener(this);
+ if (selected) {
+ item.setSelected(true);
+ }
+ panel.add(item);
+ bg.add(item);
+ }
+
+ private void setupGUI(JPanel panel) {
+ ButtonGroup bg;
+
+ panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
+ panel.setBorder(new BevelBorder(BevelBorder.RAISED));
+
+ panel.add(new JLabel(pickModeString));
+ bg = new ButtonGroup();
+ addRadioButton(panel, bg, pickModeString, boundsString, true);
+ addRadioButton(panel, bg, pickModeString, geometryString, false);
+
+ panel.add(new JLabel(toleranceString));
+ bg = new ButtonGroup();
+ addRadioButton(panel, bg, toleranceString, tolerance0String,false);
+ addRadioButton(panel, bg, toleranceString, tolerance2String,true);
+ addRadioButton(panel, bg, toleranceString, tolerance4String,false);
+ addRadioButton(panel, bg, toleranceString, tolerance8String,false);
+
+ panel.add(new JLabel(viewModeString));
+ bg = new ButtonGroup();
+ addRadioButton(panel, bg, viewModeString, perspectiveString, true);
+ addRadioButton(panel, bg, viewModeString, parallelString, false);
+
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ String name = ((Component)e.getSource()).getName();
+ String value = e.getActionCommand();
+ //System.out.println("action: name = " + name + " value = " + value);
+ if (name == pickModeString) {
+ if (value == boundsString) {
+ setPickMode(PickInfo.PICK_BOUNDS);
+ } else if (value == geometryString) {
+ setPickMode(PickInfo.PICK_GEOMETRY);
+ } else {
+ System.out.println("Unknown pick mode: " + value);
+ }
+ } else if (name == toleranceString) {
+ if (value == tolerance0String) {
+ setPickTolerance(0.0f);
+ } else if (value == tolerance2String) {
+ setPickTolerance(2.0f);
+ } else if (value == tolerance4String) {
+ setPickTolerance(4.0f);
+ } else if (value == tolerance8String) {
+ setPickTolerance(8.0f);
+ } else {
+ System.out.println("Unknown tolerance: " + value);
+ }
+ } else if (name == viewModeString) {
+ if (value == perspectiveString) {
+ setViewMode(View.PERSPECTIVE_PROJECTION);
+ } else if (value == parallelString) {
+ setViewMode(View.PARALLEL_PROJECTION);
+ }
+ } else {
+ System.out.println("Unknown action name: " + name);
+ }
+ }
+
+ public PickTest (){
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ setLayout(new BorderLayout());
+ Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
+ add("Center", c);
+
+ JPanel guiPanel = new JPanel();
+ setupGUI(guiPanel);
+ add(guiPanel, BorderLayout.EAST);
+
+ // Create a scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph(c);
+ u = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+ view = u.getViewer().getView();
+
+ u.addBranchGraph(scene);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+
+ public static void main(String argv[])
+ {
+
+ BranchGroup group;
+
+ new MainFrame(new PickTest(), 750, 550);
+ }
+}
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/PickText3DBounds.java b/src/main/java/org/jdesktop/j3d/examples/picking/PickText3DBounds.java
new file mode 100644
index 0000000..35ef883
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/PickText3DBounds.java
@@ -0,0 +1,254 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.Font;
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.Font3D;
+import org.jogamp.java3d.FontExtrusion;
+import org.jogamp.java3d.Light;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointLight;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Text3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.picking.PickTool;
+import org.jogamp.java3d.utils.picking.behaviors.PickRotateBehavior;
+import org.jogamp.java3d.utils.picking.behaviors.PickTranslateBehavior;
+import org.jogamp.java3d.utils.picking.behaviors.PickZoomBehavior;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+
+public class PickText3DBounds extends Applet {
+
+ private SimpleUniverse u = null;
+
+ public BranchGroup createSceneGraph(Canvas3D canvas) {
+ Color3f eColor = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f sColor = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f objColor = new Color3f(0.6f, 0.6f, 0.6f);
+ Color3f lColor1 = new Color3f(1.0f, 0.0f, 0.0f);
+ Color3f lColor2 = new Color3f(0.0f, 1.0f, 0.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+
+ Transform3D t;
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the background
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objScale.addChild(bg);
+
+ Material m = new Material(objColor, eColor, objColor, sColor, 100.0f);
+ Appearance a = new Appearance();
+ m.setLightingEnable(true);
+ a.setMaterial(m);
+ Font3D f3d = new Font3D(new Font("TestFont", Font.PLAIN, 1),
+ new FontExtrusion());
+ Text3D txt = new Text3D(f3d, new String("TEXT3D"),
+ new Point3f(-2.0f, 0.0f, 0.0f));
+ // txt.setCapability(Geometry.ALLOW_INTERSECT);
+ Shape3D s3D = new Shape3D();
+ s3D.setGeometry(txt);
+ s3D.setAppearance(a);
+
+ // Create a transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime.
+ TransformGroup spinTg = new TransformGroup();
+ spinTg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ spinTg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ spinTg.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
+
+ spinTg.addChild(s3D);
+ objScale.addChild(spinTg);
+
+ // Create the transform group node for the each light and initialize
+ // it to the identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add them to the root
+ // of the subgraph.
+
+ // Create transformations for the positional lights
+ t = new Transform3D();
+ Vector3d lPos1 = new Vector3d(0.0, 0.0, 2.0);
+ t.set(lPos1);
+ TransformGroup l1Trans = new TransformGroup(t);
+ l1Trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ l1Trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ l1Trans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
+ objScale.addChild(l1Trans);
+
+ t = new Transform3D();
+ Vector3d lPos2 = new Vector3d(0.5, 0.8, 2.0);
+ t.set(lPos2);
+ TransformGroup l2Trans = new TransformGroup(t);
+ l2Trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ l2Trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ l2Trans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
+
+ objScale.addChild(l2Trans);
+
+ // Create Geometry for point lights
+ ColoringAttributes caL1 = new ColoringAttributes();
+ ColoringAttributes caL2 = new ColoringAttributes();
+ caL1.setColor(lColor1);
+ caL2.setColor(lColor2);
+ Appearance appL1 = new Appearance();
+ Appearance appL2 = new Appearance();
+ appL1.setColoringAttributes(caL1);
+ appL2.setColoringAttributes(caL2);
+ l1Trans.addChild(new Sphere(0.05f,
+ Sphere.GENERATE_NORMALS, 15, appL1));
+ l2Trans.addChild(new Sphere(0.05f,
+ Sphere.GENERATE_NORMALS, 15, appL2));
+
+ // Create lights
+ AmbientLight aLgt = new AmbientLight(alColor);
+
+ Light lgt1;
+ Light lgt2;
+
+ Point3f lPoint = new Point3f(0.0f, 0.0f, 0.0f);
+ Point3f atten = new Point3f(1.0f, 0.0f, 0.0f);
+ lgt1 = new PointLight(lColor1, lPoint, atten);
+ lgt2 = new PointLight(lColor2, lPoint, atten);
+
+ // Set the influencing bounds
+ aLgt.setInfluencingBounds(bounds);
+ lgt1.setInfluencingBounds(bounds);
+ lgt2.setInfluencingBounds(bounds);
+
+ // Add the lights into the scene graph
+ objScale.addChild(aLgt);
+ l1Trans.addChild(lgt1);
+ l2Trans.addChild(lgt2);
+
+
+ PickRotateBehavior behavior1 =
+ new PickRotateBehavior(objRoot, canvas, bounds);
+ behavior1.setMode(PickTool.BOUNDS);
+ objRoot.addChild(behavior1);
+
+ PickZoomBehavior behavior2 =
+ new PickZoomBehavior(objRoot, canvas, bounds);
+ behavior2.setMode(PickTool.BOUNDS);
+ objRoot.addChild(behavior2);
+
+ PickTranslateBehavior behavior3 =
+ new PickTranslateBehavior(objRoot, canvas, bounds);
+ behavior3.setMode(PickTool.BOUNDS);
+ objRoot.addChild(behavior3);
+
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ public PickText3DBounds() {
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+
+ u = new SimpleUniverse(c);
+ BranchGroup scene = createSceneGraph(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+
+ u.addBranchGraph(scene);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ //
+ // The following allows Text3DMotion to be run as an application
+ // as well as an applet
+ //
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ new MainFrame(new PickText3DBounds(), 700, 700);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/PickText3DGeometry.java b/src/main/java/org/jdesktop/j3d/examples/picking/PickText3DGeometry.java
new file mode 100644
index 0000000..577c217
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/PickText3DGeometry.java
@@ -0,0 +1,273 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.Font;
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.Font3D;
+import org.jogamp.java3d.FontExtrusion;
+import org.jogamp.java3d.Geometry;
+import org.jogamp.java3d.Light;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointLight;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Text3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.picking.PickTool;
+import org.jogamp.java3d.utils.picking.behaviors.PickRotateBehavior;
+import org.jogamp.java3d.utils.picking.behaviors.PickTranslateBehavior;
+import org.jogamp.java3d.utils.picking.behaviors.PickZoomBehavior;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+
+public class PickText3DGeometry extends Applet {
+
+ private SimpleUniverse u = null;
+
+ public BranchGroup createSceneGraph(Canvas3D canvas) {
+ Color3f eColor = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f sColor = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f objColor = new Color3f(0.6f, 0.6f, 0.6f);
+ Color3f lColor1 = new Color3f(1.0f, 0.0f, 0.0f);
+ Color3f lColor2 = new Color3f(0.0f, 1.0f, 0.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+
+ Transform3D t;
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the background
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objScale.addChild(bg);
+
+ Material m = new Material(objColor, eColor, objColor, sColor, 100.0f);
+ Appearance a = new Appearance();
+ m.setLightingEnable(true);
+ a.setMaterial(m);
+ Font3D f3d = new Font3D(new Font("TestFont", Font.PLAIN, 1),
+ new FontExtrusion());
+
+ Text3D text3D = new Text3D(f3d, new String("TEXT3D"),
+ new Point3f(-2.0f, 0.7f, 0.0f));
+ text3D.setCapability(Geometry.ALLOW_INTERSECT);
+ Shape3D s3D1 = new Shape3D();
+ s3D1.setGeometry(text3D);
+ s3D1.setAppearance(a);
+
+ // Create a transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime.
+ TransformGroup spinTg1 = new TransformGroup();
+ spinTg1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ spinTg1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ spinTg1.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
+
+ spinTg1.addChild(s3D1);
+ objScale.addChild(spinTg1);
+
+ Text3D pick = new Text3D(f3d, new String("Pick me"),
+ new Point3f(-2.0f, -0.7f, 0.0f));
+ pick.setCapability(Geometry.ALLOW_INTERSECT);
+ Shape3D s3D2 = new Shape3D();
+ s3D2.setGeometry(pick);
+ s3D2.setAppearance(a);
+
+ // Create a transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime.
+ TransformGroup spinTg2 = new TransformGroup();
+ spinTg2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ spinTg2.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ spinTg2.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
+
+ spinTg2.addChild(s3D2);
+ objScale.addChild(spinTg2);
+
+ // Create the transform group node for the each light and initialize
+ // it to the identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add them to the root
+ // of the subgraph.
+
+ // Create transformations for the positional lights
+ t = new Transform3D();
+ Vector3d lPos1 = new Vector3d(0.0, 0.0, 2.0);
+ t.set(lPos1);
+ TransformGroup l1Trans = new TransformGroup(t);
+ l1Trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ l1Trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ l1Trans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
+ objScale.addChild(l1Trans);
+
+ t = new Transform3D();
+ Vector3d lPos2 = new Vector3d(0.5, 1.2, 2.0);
+ t.set(lPos2);
+ TransformGroup l2Trans = new TransformGroup(t);
+ l2Trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ l2Trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ l2Trans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
+ objScale.addChild(l2Trans);
+
+ // Create Geometry for point lights
+ ColoringAttributes caL1 = new ColoringAttributes();
+ ColoringAttributes caL2 = new ColoringAttributes();
+ caL1.setColor(lColor1);
+ caL2.setColor(lColor2);
+ Appearance appL1 = new Appearance();
+ Appearance appL2 = new Appearance();
+ appL1.setColoringAttributes(caL1);
+ appL2.setColoringAttributes(caL2);
+ l1Trans.addChild(new Sphere(0.05f,
+ Sphere.GENERATE_NORMALS | Sphere.ENABLE_GEOMETRY_PICKING, 15, appL1));
+ l2Trans.addChild(new Sphere(0.05f,
+ Sphere.GENERATE_NORMALS | Sphere.ENABLE_GEOMETRY_PICKING, 15, appL2));
+
+ // Create lights
+ AmbientLight aLgt = new AmbientLight(alColor);
+
+ Light lgt1;
+ Light lgt2;
+
+ Point3f lPoint = new Point3f(0.0f, 0.0f, 0.0f);
+ Point3f atten = new Point3f(1.0f, 0.0f, 0.0f);
+ lgt1 = new PointLight(lColor1, lPoint, atten);
+ lgt2 = new PointLight(lColor2, lPoint, atten);
+
+ // Set the influencing bounds
+ aLgt.setInfluencingBounds(bounds);
+ lgt1.setInfluencingBounds(bounds);
+ lgt2.setInfluencingBounds(bounds);
+
+ // Add the lights into the scene graph
+ objScale.addChild(aLgt);
+ l1Trans.addChild(lgt1);
+ l2Trans.addChild(lgt2);
+
+ PickRotateBehavior behavior1 =
+ new PickRotateBehavior(objRoot, canvas, bounds);
+ behavior1.setMode(PickTool.GEOMETRY);
+ behavior1.setTolerance(0.0f);
+ objRoot.addChild(behavior1);
+
+ PickZoomBehavior behavior2 =
+ new PickZoomBehavior(objRoot, canvas, bounds);
+ behavior2.setMode(PickTool.GEOMETRY);
+ behavior2.setTolerance(0.0f);
+ objRoot.addChild(behavior2);
+
+ PickTranslateBehavior behavior3 =
+ new PickTranslateBehavior(objRoot, canvas, bounds);
+ behavior3.setMode(PickTool.GEOMETRY);
+ behavior3.setTolerance(0.0f);
+ objRoot.addChild(behavior3);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ public PickText3DGeometry() {
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+
+ u = new SimpleUniverse(c);
+ BranchGroup scene = createSceneGraph(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+
+ u.addBranchGraph(scene);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ //
+ // The following allows Text3DMotion to be run as an application
+ // as well as an applet
+ //
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ new MainFrame(new PickText3DGeometry(), 700, 700);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/RandomColorCube.java b/src/main/java/org/jdesktop/j3d/examples/picking/RandomColorCube.java
new file mode 100644
index 0000000..e278580
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/RandomColorCube.java
@@ -0,0 +1,133 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.QuadArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class RandomColorCube extends QuadArray {
+ RandomColorCube() {
+ super(24, GeometryArray.COORDINATES | GeometryArray.COLOR_3);
+
+ Point3f verts[] = new Point3f[8];
+ Color3f colors[] = new Color3f[3];
+
+ verts[0] = new Point3f(0.5f, 0.5f, 0.5f);
+ verts[1] = new Point3f(-0.5f, 0.5f, 0.5f);
+ verts[2] = new Point3f(-0.5f,-0.5f, 0.5f);
+ verts[3] = new Point3f( 0.5f,-0.5f, 0.5f);
+ verts[4] = new Point3f( 0.5f, 0.5f,-0.5f);
+ verts[5] = new Point3f( -0.5f, 0.5f,-0.5f);
+ verts[6] = new Point3f( -0.5f,-0.5f,-0.5f);
+ verts[7] = new Point3f( 0.5f,-0.5f,-0.5f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+
+ Point3f pnts[] = new Point3f[24];
+ Color3f clrs[] = new Color3f[24];
+
+ pnts[0] = verts[0];
+ clrs[0] = colors[(int)(Math.random()*3.0)];
+ pnts[1] = verts[3];
+ clrs[1] = colors[(int)(Math.random()*3.0)];
+ pnts[2] = verts[7];
+ clrs[2] = colors[(int)(Math.random()*3.0)];
+ pnts[3] = verts[4];
+ clrs[3] = colors[(int)(Math.random()*3.0)];
+
+ pnts[4] = verts[1];
+ clrs[4] = colors[(int)(Math.random()*3.0)];
+ pnts[5] = verts[5];
+ clrs[5] = colors[(int)(Math.random()*3.0)];
+ pnts[6] = verts[6];
+ clrs[6] = colors[(int)(Math.random()*3.0)];
+ pnts[7] = verts[2];
+ clrs[7] = colors[(int)(Math.random()*3.0)];
+
+ pnts[8] = verts[0];
+ clrs[8] = colors[(int)(Math.random()*3.0)];
+ pnts[9] = verts[4];
+ clrs[9] = colors[(int)(Math.random()*3.0)];
+ pnts[10] = verts[5];
+ clrs[10] = colors[(int)(Math.random()*3.0)];
+ pnts[11] = verts[1];
+ clrs[11] = colors[(int)(Math.random()*3.0)];
+
+ pnts[12] = verts[3];
+ clrs[12] = colors[(int)(Math.random()*3.0)];
+ pnts[13] = verts[2];
+ clrs[13] = colors[(int)(Math.random()*3.0)];
+ pnts[14] = verts[6];
+ clrs[14] = colors[(int)(Math.random()*3.0)];
+ pnts[15] = verts[7];
+ clrs[15] = colors[(int)(Math.random()*3.0)];
+
+ pnts[16] = verts[0];
+ clrs[16] = colors[(int)(Math.random()*3.0)];
+ pnts[17] = verts[1];
+ clrs[17] = colors[(int)(Math.random()*3.0)];
+ pnts[18] = verts[2];
+ clrs[18] = colors[(int)(Math.random()*3.0)];
+ pnts[19] = verts[3];
+ clrs[19] = colors[(int)(Math.random()*3.0)];
+
+ pnts[20] = verts[7];
+ clrs[20] = colors[(int)(Math.random()*3.0)];
+ pnts[21] = verts[6];
+ clrs[21] = colors[(int)(Math.random()*3.0)];
+ pnts[22] = verts[5];
+ clrs[22] = colors[(int)(Math.random()*3.0)];
+ pnts[23] = verts[4];
+ clrs[23] = colors[(int)(Math.random()*3.0)];
+
+
+ setCoordinates(0, pnts);
+ setColors(0, clrs);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/RandomColorTetrahedron.java b/src/main/java/org/jdesktop/j3d/examples/picking/RandomColorTetrahedron.java
new file mode 100644
index 0000000..dd8c1b0
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/RandomColorTetrahedron.java
@@ -0,0 +1,103 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.TriangleArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class RandomColorTetrahedron extends TriangleArray {
+
+ RandomColorTetrahedron() {
+ super(12, GeometryArray.COORDINATES | GeometryArray.COLOR_3);
+
+ Point3f verts[] = new Point3f[4];
+ Color3f colors[] = new Color3f[4];
+
+ verts[0] = new Point3f(0.5f,0.5f,0.5f);
+ verts[1] = new Point3f(0.5f,-0.5f,-0.5f);
+ verts[2] = new Point3f(-0.5f,-0.5f,0.5f);
+ verts[3] = new Point3f(-0.5f,0.5f,-0.5f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+
+ Point3f pnts[] = new Point3f[12];
+ Color3f clrs[] = new Color3f[12];
+
+ pnts[0] = verts[2];
+ clrs[0] = colors[(int)(Math.random() * 3.0)];
+ pnts[1] = verts[1];
+ clrs[1] = colors[(int)(Math.random() * 3.0)];
+ pnts[2] = verts[0];
+ clrs[2] = colors[(int)(Math.random() * 3.0)];
+
+ pnts[3] = verts[3];
+ clrs[3] = colors[(int)(Math.random() * 3.0)];
+ pnts[4] = verts[2];
+ clrs[4] = colors[(int)(Math.random() * 3.0)];
+ pnts[5] = verts[0];
+ clrs[5] = colors[(int)(Math.random() * 3.0)];
+
+ pnts[6] = verts[1];
+ clrs[6] = colors[(int)(Math.random() * 3.0)];
+ pnts[7] = verts[2];
+ clrs[7] = colors[(int)(Math.random() * 3.0)];
+ pnts[8] = verts[3];
+ clrs[8] = colors[(int)(Math.random() * 3.0)];
+
+ pnts[9] = verts[1];
+ clrs[9] = colors[(int)(Math.random() * 3.0)];
+ pnts[10] = verts[3];
+ clrs[10] = colors[(int)(Math.random() * 3.0)];
+ pnts[11] = verts[0];
+ clrs[11] = colors[(int)(Math.random() * 3.0)];
+
+ setCoordinates(0, pnts);
+ setColors(0, clrs);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/Tetrahedron.java b/src/main/java/org/jdesktop/j3d/examples/picking/Tetrahedron.java
new file mode 100644
index 0000000..5f8859b
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/Tetrahedron.java
@@ -0,0 +1,117 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Geometry;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.TriangleArray;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.TexCoord2f;
+import org.jogamp.vecmath.Vector3f;
+
+public class Tetrahedron extends Shape3D {
+ private static final float sqrt3 = (float) Math.sqrt(3.0);
+ private static final float sqrt3_3 = sqrt3 / 3.0f;
+ private static final float sqrt24_3 = (float) Math.sqrt(24.0) / 3.0f;
+
+ private static final float ycenter = 0.5f * sqrt24_3;
+ private static final float zcenter = -sqrt3_3;
+
+ private static final Point3f p1 = new Point3f(-1.0f, -ycenter, -zcenter);
+ private static final Point3f p2 = new Point3f(1.0f, -ycenter, -zcenter);
+ private static final Point3f p3 =
+ new Point3f(0.0f, -ycenter, -sqrt3 - zcenter);
+ private static final Point3f p4 =
+ new Point3f(0.0f, sqrt24_3 - ycenter, 0.0f);
+
+ private static final Point3f[] verts = {
+ p1, p2, p4, // front face
+ p1, p4, p3, // left, back face
+ p2, p3, p4, // right, back face
+ p1, p3, p2, // bottom face
+ };
+
+ private TexCoord2f texCoord[] = {
+ new TexCoord2f(0.0f, 0.0f),
+ new TexCoord2f(1.0f, 0.0f),
+ new TexCoord2f(0.5f, sqrt3 / 2.0f),
+ };
+
+ public Tetrahedron() {
+ int i;
+
+ TriangleArray tetra = new TriangleArray(12, TriangleArray.COORDINATES |
+ TriangleArray.NORMALS | TriangleArray.TEXTURE_COORDINATE_2);
+
+ tetra.setCoordinates(0, verts);
+ for (i = 0; i < 12; i++) {
+ tetra.setTextureCoordinate(0, i, texCoord[i%3]);
+ }
+
+ int face;
+ Vector3f normal = new Vector3f();
+ Vector3f v1 = new Vector3f();
+ Vector3f v2 = new Vector3f();
+ Point3f [] pts = new Point3f[3];
+ for (i = 0; i < 3; i++) pts[i] = new Point3f();
+
+ for (face = 0; face < 4; face++) {
+ tetra.getCoordinates(face*3, pts);
+ v1.sub(pts[1], pts[0]);
+ v2.sub(pts[2], pts[0]);
+ normal.cross(v1, v2);
+ normal.normalize();
+ for (i = 0; i < 3; i++) {
+ tetra.setNormal((face * 3 + i), normal);
+ }
+ }
+
+ tetra.setCapability(Geometry.ALLOW_INTERSECT);
+
+ this.setGeometry(tetra);
+ this.setAppearance(new Appearance());
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronILA.java b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronILA.java
new file mode 100644
index 0000000..507edf1
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronILA.java
@@ -0,0 +1,108 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.IndexedLineArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class TetrahedronILA extends IndexedLineArray {
+
+ TetrahedronILA() {
+ super(4, GeometryArray.COORDINATES | GeometryArray.COLOR_3, 12);
+
+ Point3f verts[] = new Point3f[4];
+ Color3f colors[] = new Color3f[4];
+
+ verts[0] = new Point3f(1.0f,1.0f,1.0f);
+ verts[1] = new Point3f(1.0f,-1.0f,-1.0f);
+ verts[2] = new Point3f(-1.0f,-1.0f,1.0f);
+ verts[3] = new Point3f(-1.0f,1.0f,-1.0f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+ colors[3] = new Color3f(1.0f, 1.0f, 0.0f);
+
+ int[] pntsIndex = new int[12];
+ int[] clrsIndex = new int[12];
+
+ pntsIndex[0] = 0;
+ clrsIndex[0] = 0;
+ pntsIndex[1] = 1;
+ clrsIndex[1] = 1;
+
+ pntsIndex[2] = 1;
+ clrsIndex[2] = 1;
+ pntsIndex[3] = 2;
+ clrsIndex[3] = 2;
+
+ pntsIndex[4] = 2;
+ clrsIndex[4] = 2;
+ pntsIndex[5] = 0;
+ clrsIndex[5] = 0;
+
+ pntsIndex[6] = 1;
+ clrsIndex[6] = 1;
+ pntsIndex[7] = 3;
+ clrsIndex[7] = 3;
+
+ pntsIndex[8] = 2;
+ clrsIndex[8] = 2;
+ pntsIndex[9] = 3;
+ clrsIndex[9] = 3;
+
+ pntsIndex[10] = 0;
+ clrsIndex[10] = 0;
+ pntsIndex[11] = 3;
+ clrsIndex[11] = 3;
+
+ setCoordinates(0, verts);
+ setCoordinateIndices(0, pntsIndex);
+ setColors(0, colors);
+ setColorIndices(0, clrsIndex);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronILSA.java b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronILSA.java
new file mode 100644
index 0000000..27af0ae
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronILSA.java
@@ -0,0 +1,99 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.IndexedLineStripArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class TetrahedronILSA extends IndexedLineStripArray {
+
+ private static final int[] lineLengths = {
+ 4, 4
+ };
+ TetrahedronILSA() {
+ super(4, GeometryArray.COORDINATES | GeometryArray.COLOR_3, 8, lineLengths);
+
+ Point3f verts[] = new Point3f[4];
+ Color3f colors[] = new Color3f[4];
+
+ verts[0] = new Point3f(1.0f,1.0f,1.0f);
+ verts[1] = new Point3f(1.0f,-1.0f,-1.0f);
+ verts[2] = new Point3f(-1.0f,-1.0f,1.0f);
+ verts[3] = new Point3f(-1.0f,1.0f,-1.0f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+ colors[3] = new Color3f(1.0f, 1.0f, 0.0f);
+
+ int pntsIndex[] = new int[8];
+ int clrsIndex[] = new int[8];
+
+ pntsIndex[0] = 0;
+ clrsIndex[0] = 0;
+ pntsIndex[1] = 1;
+ clrsIndex[1] = 1;
+ pntsIndex[2] = 3;
+ clrsIndex[2] = 3;
+ pntsIndex[3] = 2;
+ clrsIndex[3] = 2;
+
+ pntsIndex[4] = 1;
+ clrsIndex[4] = 1;
+ pntsIndex[5] = 2;
+ clrsIndex[5] = 2;
+ pntsIndex[6] = 0;
+ clrsIndex[6] = 0;
+ pntsIndex[7] = 3;
+ clrsIndex[7] = 3;
+
+ setCoordinates(0, verts);
+ setCoordinateIndices(0, pntsIndex);
+ setColors(0, colors);
+ setColorIndices(0, clrsIndex);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronIPA.java b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronIPA.java
new file mode 100644
index 0000000..3daec58
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronIPA.java
@@ -0,0 +1,83 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.IndexedPointArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class TetrahedronIPA extends IndexedPointArray {
+
+ TetrahedronIPA() {
+ super(4, GeometryArray.COORDINATES | GeometryArray.COLOR_3, 4);
+
+ Point3f verts[] = new Point3f[4];
+ Color3f colors[] = new Color3f[4];
+
+ verts[0] = new Point3f(1.0f,1.0f,1.0f);
+ verts[1] = new Point3f(1.0f,-1.0f,-1.0f);
+ verts[2] = new Point3f(-1.0f,-1.0f,1.0f);
+ verts[3] = new Point3f(-1.0f,1.0f,-1.0f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+ colors[3] = new Color3f(1.0f, 1.0f, 0.0f);
+
+ int pntsIndex[] = new int[4];
+ int clrsIndex[] = new int[4];
+
+ pntsIndex[0] = clrsIndex[0] = 0;
+ pntsIndex[1] = clrsIndex[1] = 1;
+ pntsIndex[2] = clrsIndex[2] = 2;
+ pntsIndex[3] = clrsIndex[3] = 3;
+
+ setCoordinates(0, verts);
+ setCoordinateIndices(0, pntsIndex);
+ setColors(0, colors);
+ setColorIndices(0, clrsIndex);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronITA.java b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronITA.java
new file mode 100644
index 0000000..b4d7a48
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronITA.java
@@ -0,0 +1,106 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.IndexedTriangleArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class TetrahedronITA extends IndexedTriangleArray {
+
+ TetrahedronITA() {
+ super(4, GeometryArray.COORDINATES | GeometryArray.COLOR_3, 12);
+
+ Point3f verts[] = new Point3f[4];
+ Color3f colors[] = new Color3f[4];
+
+ verts[0] = new Point3f(1.0f,1.0f,1.0f);
+ verts[1] = new Point3f(1.0f,-1.0f,-1.0f);
+ verts[2] = new Point3f(-1.0f,-1.0f,1.0f);
+ verts[3] = new Point3f(-1.0f,1.0f,-1.0f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+ colors[3] = new Color3f(1.0f, 1.0f, 0.0f);
+
+ int pntsIndex[] = new int[12];
+ int clrsIndex[] = new int[12];
+
+ pntsIndex[0] = 2;
+ clrsIndex[0] = 0;
+ pntsIndex[1] = 1;
+ clrsIndex[1] = 0;
+ pntsIndex[2] = 0;
+ clrsIndex[2] = 0;
+
+ pntsIndex[3] = 3;
+ clrsIndex[3] = 1;
+ pntsIndex[4] = 2;
+ clrsIndex[4] = 1;
+ pntsIndex[5] = 0;
+ clrsIndex[5] = 1;
+
+ pntsIndex[6] = 1;
+ clrsIndex[6] = 2;
+ pntsIndex[7] = 2;
+ clrsIndex[7] = 2;
+ pntsIndex[8] = 3;
+ clrsIndex[8] = 2;
+
+ pntsIndex[9] = 1;
+ clrsIndex[9] = 3;
+ pntsIndex[10] = 3;
+ clrsIndex[10] = 3;
+ pntsIndex[11] = 0;
+ clrsIndex[11] = 3;
+
+ setCoordinates(0, verts);
+ setCoordinateIndices(0, pntsIndex);
+ setColors(0, colors);
+ setColorIndices(0, clrsIndex);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronLA.java b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronLA.java
new file mode 100644
index 0000000..52ed5b6
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronLA.java
@@ -0,0 +1,106 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.LineArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class TetrahedronLA extends LineArray {
+
+ TetrahedronLA() {
+ super(12, GeometryArray.COORDINATES | GeometryArray.COLOR_3);
+
+ Point3f verts[] = new Point3f[4];
+ Color3f colors[] = new Color3f[4];
+
+ verts[0] = new Point3f(1.0f,1.0f,1.0f);
+ verts[1] = new Point3f(1.0f,-1.0f,-1.0f);
+ verts[2] = new Point3f(-1.0f,-1.0f,1.0f);
+ verts[3] = new Point3f(-1.0f,1.0f,-1.0f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+ colors[3] = new Color3f(1.0f, 1.0f, 0.0f);
+
+ Point3f pnts[] = new Point3f[12];
+ Color3f clrs[] = new Color3f[12];
+
+ pnts[0] = verts[0];
+ clrs[0] = colors[0];
+ pnts[1] = verts[1];
+ clrs[1] = colors[1];
+
+ pnts[2] = verts[1];
+ clrs[2] = colors[1];
+ pnts[3] = verts[2];
+ clrs[3] = colors[2];
+
+ pnts[4] = verts[2];
+ clrs[4] = colors[2];
+ pnts[5] = verts[0];
+ clrs[5] = colors[0];
+
+ pnts[6] = verts[1];
+ clrs[6] = colors[1];
+ pnts[7] = verts[3];
+ clrs[7] = colors[3];
+
+ pnts[8] = verts[2];
+ clrs[8] = colors[2];
+ pnts[9] = verts[3];
+ clrs[9] = colors[3];
+
+ pnts[10] = verts[0];
+ clrs[10] = colors[0];
+ pnts[11] = verts[3];
+ clrs[11] = colors[3];
+
+ setCoordinates(0, pnts);
+ setColors(0, clrs);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronLSA.java b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronLSA.java
new file mode 100644
index 0000000..5d598fd
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronLSA.java
@@ -0,0 +1,96 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.LineStripArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class TetrahedronLSA extends LineStripArray {
+ private static final int[] lineLengths = {
+ 4, 4
+ };
+ TetrahedronLSA() {
+ super(8, GeometryArray.COORDINATES | GeometryArray.COLOR_3, lineLengths);
+
+ Point3f verts[] = new Point3f[4];
+ Color3f colors[] = new Color3f[4];
+
+ verts[0] = new Point3f(1.0f,1.0f,1.0f);
+ verts[1] = new Point3f(1.0f,-1.0f,-1.0f);
+ verts[2] = new Point3f(-1.0f,-1.0f,1.0f);
+ verts[3] = new Point3f(-1.0f,1.0f,-1.0f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+ colors[3] = new Color3f(1.0f, 1.0f, 0.0f);
+
+ Point3f pnts[] = new Point3f[8];
+ Color3f clrs[] = new Color3f[8];
+
+ pnts[0] = verts[0];
+ clrs[0] = colors[0];
+ pnts[1] = verts[1];
+ clrs[1] = colors[1];
+ pnts[2] = verts[3];
+ clrs[2] = colors[3];
+ pnts[3] = verts[2];
+ clrs[3] = colors[2];
+
+ pnts[4] = verts[1];
+ clrs[4] = colors[1];
+ pnts[5] = verts[2];
+ clrs[5] = colors[2];
+ pnts[6] = verts[0];
+ clrs[6] = colors[0];
+ pnts[7] = verts[3];
+ clrs[7] = colors[3];
+
+ setCoordinates(0, pnts);
+ setColors(0, clrs);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronPA.java b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronPA.java
new file mode 100644
index 0000000..137efef
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronPA.java
@@ -0,0 +1,73 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.PointArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class TetrahedronPA extends PointArray {
+
+ TetrahedronPA() {
+ super(4, GeometryArray.COORDINATES | GeometryArray.COLOR_3);
+
+ Point3f verts[] = new Point3f[4];
+ Color3f colors[] = new Color3f[4];
+
+ verts[0] = new Point3f(1.0f,1.0f,1.0f);
+ verts[1] = new Point3f(1.0f,-1.0f,-1.0f);
+ verts[2] = new Point3f(-1.0f,-1.0f,1.0f);
+ verts[3] = new Point3f(-1.0f,1.0f,-1.0f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+ colors[3] = new Color3f(1.0f, 1.0f, 0.0f);
+
+ setCoordinates(0, verts);
+ setColors(0, colors);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronTA.java b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronTA.java
new file mode 100644
index 0000000..aeaef87
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/TetrahedronTA.java
@@ -0,0 +1,104 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import org.jogamp.java3d.GeometryArray;
+import org.jogamp.java3d.TriangleArray;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3f;
+
+class TetrahedronTA extends TriangleArray {
+
+ TetrahedronTA() {
+ super(12, GeometryArray.COORDINATES | GeometryArray.COLOR_3);
+
+ Point3f verts[] = new Point3f[4];
+ Color3f colors[] = new Color3f[4];
+
+ verts[0] = new Point3f(1.0f,1.0f,1.0f);
+ verts[1] = new Point3f(1.0f,-1.0f,-1.0f);
+ verts[2] = new Point3f(-1.0f,-1.0f,1.0f);
+ verts[3] = new Point3f(-1.0f,1.0f,-1.0f);
+
+ colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
+ colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
+ colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
+ colors[3] = new Color3f(1.0f, 1.0f, 0.0f);
+
+ Point3f pnts[] = new Point3f[12];
+ Color3f clrs[] = new Color3f[12];
+
+ pnts[0] = verts[2];
+ clrs[0] = colors[0];
+ pnts[1] = verts[1];
+ clrs[1] = colors[0];
+ pnts[2] = verts[0];
+ clrs[2] = colors[0];
+
+ pnts[3] = verts[3];
+ clrs[3] = colors[1];
+ pnts[4] = verts[2];
+ clrs[4] = colors[1];
+ pnts[5] = verts[0];
+ clrs[5] = colors[1];
+
+ pnts[6] = verts[1];
+ clrs[6] = colors[2];
+ pnts[7] = verts[2];
+ clrs[7] = colors[2];
+ pnts[8] = verts[3];
+ clrs[8] = colors[2];
+
+ pnts[9] = verts[1];
+ clrs[9] = colors[3];
+ pnts[10] = verts[3];
+ clrs[10] = colors[3];
+ pnts[11] = verts[0];
+ clrs[11] = colors[3];
+
+ setCoordinates(0, pnts);
+ setColors(0, clrs);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/TickTockPicking.form b/src/main/java/org/jdesktop/j3d/examples/picking/TickTockPicking.form
new file mode 100644
index 0000000..8d60ac0
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/TickTockPicking.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="TickTockPicking"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/picking/TickTockPicking.java b/src/main/java/org/jdesktop/j3d/examples/picking/TickTockPicking.java
new file mode 100644
index 0000000..b9d76f9
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/picking/TickTockPicking.java
@@ -0,0 +1,488 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.picking;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointAttributes;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.TextureAttributes;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TransparencyAttributes;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class TickTockPicking extends javax.swing.JFrame {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+ // path the the texture map image
+ private java.net.URL texImage = null;
+
+ public BranchGroup createSceneGraph(Canvas3D c) {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and behaviors
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objScale.addChild(bg);
+
+ // Set up the global lights
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+
+ AmbientLight aLgt = new AmbientLight(alColor);
+ aLgt.setInfluencingBounds(bounds);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ lgt1.setInfluencingBounds(bounds);
+ objScale.addChild(aLgt);
+ objScale.addChild(lgt1);
+
+ // Create a pair of transform group nodes and initialize them to
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behaviors can modify them at runtime. Add them to the
+ // root of the subgraph.
+ TransformGroup objTrans1 = new TransformGroup();
+ objTrans1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(objTrans1);
+
+ TransformGroup objTrans2 = new TransformGroup();
+ objTrans2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans1.addChild(objTrans2);
+
+ // Create the positioning and scaling transform group node.
+ Transform3D t = new Transform3D();
+ t.set(0.3, new Vector3d(0.0, -1.5, 0.0));
+ TransformGroup objTrans3 = new TransformGroup(t);
+ objTrans2.addChild(objTrans3);
+
+ // Create a simple shape leaf node, set it's appearance, and
+ // add it to the scene graph.
+ Shape3D shape = new Cube();
+ Appearance a = new Appearance();
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
+ a.setMaterial(new Material(objColor, black, objColor,
+ white, 80.0f));
+ shape.setAppearance(a);
+ shape.setCapability(shape.ALLOW_APPEARANCE_READ);
+ shape.setCapability(shape.ALLOW_APPEARANCE_WRITE);
+ objTrans3.addChild(shape);
+
+ // Create a new Behavior object that will perform the desired
+ // rotation on the specified transform object and add it into
+ // the scene graph.
+ Transform3D yAxis1 = new Transform3D();
+ yAxis1.rotX(Math.PI/2.0);
+ Alpha tickTockAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE |
+ Alpha.DECREASING_ENABLE,
+ 0, 0,
+ 5000, 2500, 200,
+ 5000, 2500, 200);
+
+ RotationInterpolator tickTock =
+ new RotationInterpolator(tickTockAlpha, objTrans1, yAxis1,
+ -(float) Math.PI/2.0f,
+ (float) Math.PI/2.0f);
+ tickTock.setSchedulingBounds(bounds);
+ objTrans2.addChild(tickTock);
+
+ // Create a new Behavior object that will perform the desired
+ // rotation on the specified transform object and add it into
+ // the scene graph.
+ Transform3D yAxis2 = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans2, yAxis2,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator.setSchedulingBounds(bounds);
+ objTrans2.addChild(rotator);
+
+ // Now create the simple picking behavior
+ PickHighlightBehavior pickBeh = new
+ PickHighlightBehavior(c, objRoot, bounds);
+
+ // Create a bunch of objects with a behavior and add them
+ // into the scene graph.
+
+ int row, col;
+ Appearance[][] app = new Appearance[3][3];
+
+ for (row = 0; row < 3; row++)
+ for (col = 0; col < 3; col++)
+ app[row][col] = createAppearance(row * 3 + col);
+
+ for (int i = 0; i < 3; i++) {
+ double ypos = (double)(i - 1) * 1.5;
+ for (int j = 0; j < 3; j++) {
+ double xpos = (double)(j - 1) * 1.5;
+ objScale.addChild(createObject(app[i][j], 0.3, xpos, ypos));
+ }
+ }
+
+ // Have Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+
+ private Appearance createAppearance(int idx) {
+ Appearance app = new Appearance();
+
+ // Globally used colors
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+
+ switch (idx) {
+ // Unlit solid
+ case 0:
+ {
+ // Set up the coloring properties
+ Color3f objColor = new Color3f(1.0f, 0.2f, 0.4f);
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(objColor);
+ app.setColoringAttributes(ca);
+ break;
+ }
+
+
+ // Unlit wire frame
+ case 1:
+ {
+ // Set up the coloring properties
+ Color3f objColor = new Color3f(1.0f, 0.4f, 0.0f);
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(objColor);
+ app.setColoringAttributes(ca);
+
+ // Set up the polygon attributes
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setPolygonMode(pa.POLYGON_LINE);
+ pa.setCullFace(pa.CULL_NONE);
+ app.setPolygonAttributes(pa);
+ break;
+ }
+
+ // Unlit points
+ case 2:
+ {
+ // Set up the coloring properties
+ Color3f objColor = new Color3f(1.0f, 1.0f, 0.0f);
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(objColor);
+ app.setColoringAttributes(ca);
+
+ // Set up the polygon attributes
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setPolygonMode(pa.POLYGON_POINT);
+ pa.setCullFace(pa.CULL_NONE);
+ app.setPolygonAttributes(pa);
+
+ // Set up point attributes
+ PointAttributes pta = new PointAttributes();
+ pta.setPointSize(5.0f);
+ app.setPointAttributes(pta);
+ break;
+ }
+
+ // Lit solid
+ case 3:
+ {
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ white, 80.0f));
+ break;
+ }
+
+ // Texture mapped, lit solid
+ case 4:
+ {
+ // Set up the texture map
+ TextureLoader tex = new TextureLoader(texImage, this);
+ app.setTexture(tex.getTexture());
+
+ TextureAttributes texAttr = new TextureAttributes();
+ texAttr.setTextureMode(TextureAttributes.MODULATE);
+ app.setTextureAttributes(texAttr);
+
+ // Set up the material properties
+ app.setMaterial(new Material(white, black, white, black, 1.0f));
+ break;
+ }
+
+ // Transparent, lit solid
+ case 5:
+ {
+ // Set up the transparency properties
+ TransparencyAttributes ta = new TransparencyAttributes();
+ ta.setTransparencyMode(ta.BLENDED);
+ ta.setTransparency(0.6f);
+ app.setTransparencyAttributes(ta);
+
+ // Set up the polygon attributes
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setCullFace(pa.CULL_NONE);
+ app.setPolygonAttributes(pa);
+
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.7f, 0.8f, 1.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ black, 1.0f));
+ break;
+ }
+
+ // Lit solid, no specular
+ case 6:
+ {
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ black, 80.0f));
+ break;
+ }
+
+ // Lit solid, specular only
+ case 7:
+ {
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
+ app.setMaterial(new Material(black, black, black,
+ white, 80.0f));
+ break;
+ }
+
+ // Another lit solid with a different color
+ case 8:
+ {
+ // Set up the material properties
+ Color3f objColor = new Color3f(0.8f, 0.8f, 0.0f);
+ app.setMaterial(new Material(objColor, black, objColor,
+ white, 80.0f));
+ break;
+ }
+
+ default:
+ {
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(new Color3f(0.0f, 1.0f, 0.0f));
+ app.setColoringAttributes(ca);
+ }
+ }
+
+ return app;
+ }
+
+
+ private Group createObject(Appearance app, double scale,
+ double xpos, double ypos) {
+
+ // Create a transform group node to scale and position the object.
+ Transform3D t = new Transform3D();
+ t.set(scale, new Vector3d(xpos, ypos, 0.0));
+ TransformGroup objTrans = new TransformGroup(t);
+
+ // Create a second transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime.
+ TransformGroup spinTg = new TransformGroup();
+ spinTg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ spinTg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+
+ // Create a simple shape leaf node and set the appearance
+ Shape3D shape = new Tetrahedron();
+ shape.setAppearance(app);
+ shape.setCapability(shape.ALLOW_APPEARANCE_READ);
+ shape.setCapability(shape.ALLOW_APPEARANCE_WRITE);
+
+ // add it to the scene graph.
+ spinTg.addChild(shape);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into
+ // the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 5000, 0, 0,
+ 0, 0, 0);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, spinTg, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ rotator.setSchedulingBounds(bounds);
+
+ // Add the behavior and the transform group to the object
+ objTrans.addChild(rotator);
+ objTrans.addChild(spinTg);
+
+ return objTrans;
+ }
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form HelloUniverse
+ */
+ public TickTockPicking() {
+
+ // the path to the image for an applet
+ texImage = Resources.getResource("resources/images/stone.jpg");
+ if (texImage == null) {
+ System.err.println("resources/images/stone.jpg not found");
+ System.exit(1);
+ }
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph(c);
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("TickTockPicking");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new TickTockPicking().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/platform_geometry/SimpleGeometry.java b/src/main/java/org/jdesktop/j3d/examples/platform_geometry/SimpleGeometry.java
new file mode 100644
index 0000000..5cb03a5
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/platform_geometry/SimpleGeometry.java
@@ -0,0 +1,213 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.platform_geometry;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.TransparencyAttributes;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseTranslate;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.geometry.Cylinder;
+import org.jogamp.java3d.utils.universe.PlatformGeometry;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3d;
+
+/**
+ * This class demonstrates the use of the Universe builder for stand-alone
+ * applications along with the use of the PlatformGeometry node that is
+ * present in the Java 3D Universe Builder utility. The standard
+ * HelloWorld application is brought up. A transparent cylinder has been
+ * added to the PlatfromGeometry node of the ViewingPlatform and the
+ * MouseTranslate utility has been used to allow this sphere to be dragged
+ * around the canvas.
+ */
+public class SimpleGeometry extends Applet {
+
+ SimpleUniverse u = null;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(objTrans);
+
+ // Create a simple shape leaf node, add it to the scene graph.
+ objTrans.addChild(new ColorCube());
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into
+ // the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+
+
+ // Have Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ /*
+ * Create the geometry to add to the platform geometry.
+ */
+ PlatformGeometry createAimer() {
+
+ PlatformGeometry pg = new PlatformGeometry();
+
+ // This TransformGroup will be used by the MouseTranslate
+ // utiltiy to move the cylinder around the canvas. when the
+ // the user holds down mouse button 3.
+ TransformGroup moveTG = new TransformGroup();
+ moveTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ moveTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ MouseTranslate mouseT = new MouseTranslate(moveTG);
+ moveTG.addChild(mouseT);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ mouseT.setSchedulingBounds(bounds);
+ pg.addChild(moveTG);
+
+ // This TransformGroup is used to place the cylinder in the scene.
+ // The cylinder will be rotated 90 degrees so it will appear as
+ // a circle on the screen (could be made into a nice gun site...).
+ // The cylinder is also displaced a little in Z so it is in front
+ // of the viewer.
+ Transform3D xForm = new Transform3D();
+ xForm.rotX(Math.PI/2.0);
+ xForm.setTranslation(new Vector3d(0.0, 0.0, -0.7));
+ TransformGroup placementTG = new TransformGroup(xForm);
+ moveTG.addChild(placementTG);
+
+ // Create the cylinder - make it thin and transparent.
+ Appearance cylinderAppearance = new Appearance();
+ TransparencyAttributes transAttrs =
+ new TransparencyAttributes(TransparencyAttributes.FASTEST, 0.5f);
+ // cylinderAppearance.setTransparencyAttributes(transAttrs);
+ Cylinder aimer = new Cylinder(0.06f, 0.005f, 0, cylinderAppearance);
+ placementTG.addChild(aimer);
+
+ return pg;
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+
+ // Create a simple scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph();
+
+ u = new SimpleUniverse(c);
+
+ PlatformGeometry pg = createAimer();
+
+ // Now set the just created PlatformGeometry.
+ ViewingPlatform vp = u.getViewingPlatform();
+ vp.setPlatformGeometry(pg);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+
+ // Add everthing to the scene graph - it will now be displayed.
+ u.addBranchGraph(scene);
+ }
+
+ public SimpleGeometry(String[] args) {
+ }
+
+ public SimpleGeometry() {
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ new MainFrame(new SimpleGeometry(args), 256, 256);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/print_canvas3d/ImageDisplayer.java b/src/main/java/org/jdesktop/j3d/examples/print_canvas3d/ImageDisplayer.java
new file mode 100644
index 0000000..36dfeb0
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/print_canvas3d/ImageDisplayer.java
@@ -0,0 +1,138 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.print_canvas3d;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.image.BufferedImage;
+
+import javax.swing.JFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
+
+class ImageDisplayer extends JFrame implements ActionListener {
+ BufferedImage bImage;
+
+ private class ImagePanel extends JPanel {
+ public void paint(Graphics g) {
+ g.setColor(Color.black);
+ g.fillRect(0, 0, getSize().width, getSize().height);
+ g.drawImage(bImage, 0, 0, this);
+ }
+
+ private ImagePanel() {
+ setPreferredSize(new Dimension(bImage.getWidth(),
+ bImage.getHeight()));
+ }
+ }
+
+ private JMenuItem printItem;
+ private JMenuItem closeItem;
+
+ private void freeResources() {
+ this.removeAll();
+ this.setVisible(false);
+ bImage = null;
+ }
+
+ public void actionPerformed (ActionEvent event) {
+ Object target = event.getSource();
+
+ if (target == printItem) {
+ new ImagePrinter(bImage).print();
+ }
+ else if (target == closeItem) {
+ freeResources();
+ }
+ }
+
+ private JMenuBar createMenuBar() {
+ JMenuBar menuBar = new JMenuBar();
+ JMenu fileMenu = new JMenu("File");
+ printItem = new JMenuItem("Print...");
+ printItem.addActionListener(this);
+ closeItem = new JMenuItem("Close");
+ closeItem.addActionListener(this);
+ fileMenu.add(printItem);
+ fileMenu.add(new JSeparator());
+ fileMenu.add(closeItem);
+ menuBar.add(fileMenu);
+ return menuBar;
+ }
+
+ ImageDisplayer(BufferedImage bImage) {
+ this.bImage = bImage;
+ this.setTitle("Off-screen Canvas3D Snapshot");
+
+ // Create and initialize menu bar
+ this.setJMenuBar(createMenuBar());
+
+ // Create scroll pane, and embedded image panel
+ ImagePanel imagePanel = new ImagePanel();
+ JScrollPane scrollPane = new JScrollPane(imagePanel);
+ scrollPane.getViewport().setPreferredSize(new Dimension(700, 700));
+
+ // Handle the close event
+ this.addWindowListener(new WindowAdapter() {
+ public void windowClosing(WindowEvent winEvent) {
+ freeResources();
+ }
+ });
+
+ // Add scroll pane to the frame and make it visible
+ this.getContentPane().add(scrollPane);
+ this.pack();
+ this.setVisible(true);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/print_canvas3d/ImagePrinter.java b/src/main/java/org/jdesktop/j3d/examples/print_canvas3d/ImagePrinter.java
new file mode 100644
index 0000000..85b00ac
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/print_canvas3d/ImagePrinter.java
@@ -0,0 +1,115 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.print_canvas3d;
+
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BufferedImage;
+import java.awt.image.ImageObserver;
+import java.awt.print.PageFormat;
+import java.awt.print.Printable;
+import java.awt.print.PrinterException;
+import java.awt.print.PrinterJob;
+
+class ImagePrinter implements Printable, ImageObserver {
+ BufferedImage bImage;
+
+ public int print(Graphics g, PageFormat pf, int pi)
+ throws PrinterException {
+
+
+ if (pi >= 1) {
+ return Printable.NO_SUCH_PAGE;
+ }
+
+ Graphics2D g2d = (Graphics2D)g;
+ //g2d.translate(pf.getImageableX(), pf.getImageableY());
+ AffineTransform t2d = new AffineTransform();
+ t2d.translate(pf.getImageableX(), pf.getImageableY());
+ double xscale = pf.getImageableWidth() / (double)bImage.getWidth();
+ double yscale = pf.getImageableHeight() / (double)bImage.getHeight();
+ double scale = Math.min(xscale, yscale);
+ t2d.scale(scale, scale);
+ try {
+ g2d.drawImage(bImage,t2d, this);
+ }
+ catch (Exception ex) {
+ ex.printStackTrace();
+ return Printable.NO_SUCH_PAGE;
+ }
+ return Printable.PAGE_EXISTS;
+ }
+
+ void print() {
+ PrinterJob printJob = PrinterJob.getPrinterJob();
+ PageFormat pageFormat = printJob.defaultPage();
+ pageFormat.setOrientation(PageFormat.LANDSCAPE);
+ pageFormat = printJob.validatePage(pageFormat);
+ printJob.setPrintable(this, pageFormat);
+ if (printJob.printDialog()) {
+ try {
+ printJob.print();
+ }
+ catch (PrinterException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+
+ public boolean imageUpdate(Image img,
+ int infoflags,
+ int x,
+ int y,
+ int width,
+ int height) {
+ return false;
+ }
+
+ ImagePrinter(BufferedImage bImage) {
+ this.bImage = bImage;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/print_canvas3d/OffScreenCanvas3D.java b/src/main/java/org/jdesktop/j3d/examples/print_canvas3d/OffScreenCanvas3D.java
new file mode 100644
index 0000000..782e5ad
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/print_canvas3d/OffScreenCanvas3D.java
@@ -0,0 +1,84 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.print_canvas3d;
+
+import java.awt.GraphicsConfiguration;
+import java.awt.image.BufferedImage;
+
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ImageComponent;
+import org.jogamp.java3d.ImageComponent2D;
+
+
+class OffScreenCanvas3D extends Canvas3D {
+ OffScreenCanvas3D(GraphicsConfiguration graphicsConfiguration,
+ boolean offScreen) {
+
+ super(graphicsConfiguration, offScreen);
+ }
+
+ BufferedImage doRender(int width, int height) {
+
+ BufferedImage bImage =
+ new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+
+ ImageComponent2D buffer =
+ new ImageComponent2D(ImageComponent.FORMAT_RGBA, bImage);
+
+ setOffScreenBuffer(buffer);
+ renderOffScreenBuffer();
+ waitForOffScreenRendering();
+ bImage = getOffScreenBuffer().getImage();
+
+ // To release the reference of buffer inside Java 3D.
+ setOffScreenBuffer(null);
+
+ return bImage;
+ }
+
+ public void postSwap() {
+ // No-op since we always wait for off-screen rendering to complete
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/print_canvas3d/PrintCanvas3D.form b/src/main/java/org/jdesktop/j3d/examples/print_canvas3d/PrintCanvas3D.form
new file mode 100644
index 0000000..5150ee2
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/print_canvas3d/PrintCanvas3D.form
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <NonVisualComponents>
+ <Menu class="javax.swing.JMenuBar" name="jMenuBar1">
+ <SubComponents>
+ <Menu class="javax.swing.JMenu" name="fileMenu">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="File"/>
+ </Properties>
+ <SubComponents>
+ <MenuItem class="javax.swing.JMenuItem" name="snapShotMenuItem">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Snapshot"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="snapShotMenuItemActionPerformed"/>
+ </Events>
+ </MenuItem>
+ <MenuItem class="javax.swing.JMenuItem" name="printMenuItem">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Print"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="printMenuItemActionPerformed"/>
+ </Events>
+ </MenuItem>
+ <MenuItem class="javax.swing.JMenuItem" name="exitMenuItem">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Exit"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="exitMenuItemActionPerformed"/>
+ </Events>
+ </MenuItem>
+ </SubComponents>
+ </Menu>
+ </SubComponents>
+ </Menu>
+ </NonVisualComponents>
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="Window Title"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="menuBar" type="java.lang.String" value="jMenuBar1"/>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/print_canvas3d/PrintCanvas3D.java b/src/main/java/org/jdesktop/j3d/examples/print_canvas3d/PrintCanvas3D.java
new file mode 100644
index 0000000..23b881f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/print_canvas3d/PrintCanvas3D.java
@@ -0,0 +1,402 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.print_canvas3d;
+
+import java.awt.Dimension;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
+import java.awt.Point;
+import java.awt.image.BufferedImage;
+import java.io.FileNotFoundException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.swing.JPopupMenu;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GraphicsConfigTemplate3D;
+import org.jogamp.java3d.Screen3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.loaders.IncorrectFormatException;
+import org.jogamp.java3d.loaders.ParsingErrorException;
+import org.jogamp.java3d.loaders.Scene;
+import org.jogamp.java3d.loaders.objectfile.ObjectFile;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseRotate;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseTranslate;
+import org.jogamp.java3d.utils.behaviors.mouse.MouseZoom;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class PrintCanvas3D extends javax.swing.JFrame {
+
+ private static final boolean noTriangulate = false;
+ private static final boolean noStripify = false;
+ private static final double creaseAngle = 60.0;
+ private Canvas3D onScreenCanvas3D;
+ private OffScreenCanvas3D offScreenCanvas3D;
+ private URL filename = null;
+ private static final int OFF_SCREEN_SCALE = 3;
+
+ private SimpleUniverse univ = null;
+
+ public BranchGroup createSceneGraph(String args[]) {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.7);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ objScale.addChild(objTrans);
+
+ int flags = ObjectFile.RESIZE;
+ if (!noTriangulate) flags |= ObjectFile.TRIANGULATE;
+ if (!noStripify) flags |= ObjectFile.STRIPIFY;
+ ObjectFile f =
+ new ObjectFile(flags,
+ (float)(creaseAngle * Math.PI / 180.0));
+ Scene scene = null;
+ try {
+ scene = f.load(filename);
+ }
+ catch (FileNotFoundException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+ catch (ParsingErrorException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+ catch (IncorrectFormatException e) {
+ System.err.println(e);
+ System.exit(1);
+ }
+
+ objTrans.addChild(scene.getSceneGroup());
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Create the rotate behavior node
+ MouseRotate behavior = new MouseRotate();
+ behavior.setTransformGroup(objTrans);
+ objTrans.addChild(behavior);
+ behavior.setSchedulingBounds(bounds);
+
+ // Create the zoom behavior node
+ MouseZoom behavior2 = new MouseZoom();
+ behavior2.setTransformGroup(objTrans);
+ objTrans.addChild(behavior2);
+ behavior2.setSchedulingBounds(bounds);
+
+ // Create the translate behavior node
+ MouseTranslate behavior3 = new MouseTranslate();
+ behavior3.setTransformGroup(objTrans);
+ objTrans.addChild(behavior3);
+ behavior3.setSchedulingBounds(bounds);
+
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
+ Background bgNode = new Background(bgColor);
+ bgNode.setApplicationBounds(bounds);
+ objRoot.addChild(bgNode);
+
+ // Set up the ambient light
+ Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
+ AmbientLight ambientLightNode = new AmbientLight(ambientColor);
+ ambientLightNode.setInfluencingBounds(bounds);
+ objRoot.addChild(ambientLightNode);
+
+ // Set up the directional lights
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f);
+ Color3f light2Color = new Color3f(0.3f, 0.3f, 0.4f);
+ Vector3f light2Direction = new Vector3f(-6.0f, -2.0f, -1.0f);
+
+ DirectionalLight light1
+ = new DirectionalLight(light1Color, light1Direction);
+ light1.setInfluencingBounds(bounds);
+ objRoot.addChild(light1);
+
+ DirectionalLight light2
+ = new DirectionalLight(light2Color, light2Direction);
+ light2.setInfluencingBounds(bounds);
+ objRoot.addChild(light2);
+
+ return objRoot;
+ }
+
+ private void usage() {
+ System.out.println("Usage: java PrintCanvas3D <.obj file>");
+ System.exit(0);
+ } // End of usage
+
+ private OffScreenCanvas3D createOffScreenCanvas(Canvas3D onScreenCanvas3D) {
+ // Create the off-screen Canvas3D object
+ // request an offscreen Canvas3D with a single buffer configuration
+ GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();
+ template.setDoubleBuffer(GraphicsConfigTemplate3D.UNNECESSARY);
+ GraphicsConfiguration gc =
+ GraphicsEnvironment.getLocalGraphicsEnvironment().
+ getDefaultScreenDevice().getBestConfiguration(template);
+
+ offScreenCanvas3D = new OffScreenCanvas3D(gc, true);
+ // Set the off-screen size based on a scale factor times the
+ // on-screen size
+ Screen3D sOn = onScreenCanvas3D.getScreen3D();
+ Screen3D sOff = offScreenCanvas3D.getScreen3D();
+ Dimension dim = sOn.getSize();
+ dim.width *= OFF_SCREEN_SCALE;
+ dim.height *= OFF_SCREEN_SCALE;
+ sOff.setSize(dim);
+ sOff.setPhysicalScreenWidth(sOn.getPhysicalScreenWidth() *
+ OFF_SCREEN_SCALE);
+ sOff.setPhysicalScreenHeight(sOn.getPhysicalScreenHeight() *
+ OFF_SCREEN_SCALE);
+
+ // attach the offscreen canvas to the view
+ univ.getViewer().getView().addCanvas3D(offScreenCanvas3D);
+
+ return offScreenCanvas3D;
+
+ }
+
+ private Canvas3D createUniverse() {
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form PrintCanvas3D
+ */
+ public PrintCanvas3D(String args[]) {
+
+ if (args.length == 0) {
+ filename = Resources.getResource("resources/geometry/beethoven.obj");
+ if (filename == null) {
+ System.err.println("resources/geometry/beethoven.obj not found");
+ System.exit(1);
+ }
+ } else {
+ for (int i = 0 ; i < args.length ; i++) {
+ if (args[i].startsWith("-")) {
+ System.err.println("Argument '" + args[i] + "' ignored.");
+ } else {
+ try{
+ filename = new URL(args[i]);
+ }
+ catch (MalformedURLException e) {
+ System.err.println(e.getMessage());
+ System.exit(1);
+ }
+ }
+ }
+ }
+
+ if (filename == null) {
+ usage();
+ }
+
+ // Initialize the GUI components
+ JPopupMenu.setDefaultLightWeightPopupEnabled(false);
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ onScreenCanvas3D = createUniverse();
+ drawingPanel.add(onScreenCanvas3D, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ BranchGroup scene = createSceneGraph(args);
+
+ // Create the off-screen Canvas3D object
+ createOffScreenCanvas(onScreenCanvas3D);
+
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+ jMenuBar1 = new javax.swing.JMenuBar();
+ fileMenu = new javax.swing.JMenu();
+ snapShotMenuItem = new javax.swing.JMenuItem();
+ printMenuItem = new javax.swing.JMenuItem();
+ exitMenuItem = new javax.swing.JMenuItem();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("Window Title");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ fileMenu.setText("File");
+ snapShotMenuItem.setText("Snapshot");
+ snapShotMenuItem.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ snapShotMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(snapShotMenuItem);
+
+ printMenuItem.setText("Print");
+ printMenuItem.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ printMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(printMenuItem);
+
+ exitMenuItem.setText("Exit");
+ exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ exitMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(exitMenuItem);
+
+ jMenuBar1.add(fileMenu);
+
+ setJMenuBar(jMenuBar1);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ private void printMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_printMenuItemActionPerformed
+ Point loc = onScreenCanvas3D.getLocationOnScreen();
+ offScreenCanvas3D.setOffScreenLocation(loc);
+ Dimension dim = onScreenCanvas3D.getSize();
+ dim.width *= OFF_SCREEN_SCALE;
+ dim.height *= OFF_SCREEN_SCALE;
+ BufferedImage bImage =
+ offScreenCanvas3D.doRender(dim.width, dim.height);
+
+ new ImagePrinter(bImage).print();
+
+ }//GEN-LAST:event_printMenuItemActionPerformed
+
+ private void snapShotMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_snapShotMenuItemActionPerformed
+ Point loc = onScreenCanvas3D.getLocationOnScreen();
+ offScreenCanvas3D.setOffScreenLocation(loc);
+ Dimension dim = onScreenCanvas3D.getSize();
+ dim.width *= OFF_SCREEN_SCALE;
+ dim.height *= OFF_SCREEN_SCALE;
+ BufferedImage bImage =
+ offScreenCanvas3D.doRender(dim.width, dim.height);
+
+ new ImageDisplayer(bImage);
+
+
+ }//GEN-LAST:event_snapShotMenuItemActionPerformed
+
+ private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
+ System.exit(0);
+ }//GEN-LAST:event_exitMenuItemActionPerformed
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[]) {
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new PrintCanvas3D(args).setVisible(true);;
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ private javax.swing.JMenuItem exitMenuItem;
+ private javax.swing.JMenu fileMenu;
+ private javax.swing.JMenuBar jMenuBar1;
+ private javax.swing.JMenuItem printMenuItem;
+ private javax.swing.JMenuItem snapShotMenuItem;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediate.form b/src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediate.form
new file mode 100644
index 0000000..3c5f559
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediate.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="PureImmediate"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[250, 250]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediate.java b/src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediate.java
new file mode 100644
index 0000000..7648cba
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediate.java
@@ -0,0 +1,186 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.pure_immediate;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.Geometry;
+import org.jogamp.java3d.GraphicsContext3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+
+/**
+ * Pure immediate mode example program. In pure immediate mode, the
+ * renderer must be stopped on the Canvas being rendered into. In our
+ * example, this is done immediately after the canvas is created. A
+ * separate thread is started up to do the immediate mode rendering.
+ */
+public class PureImmediate extends javax.swing.JFrame implements Runnable {
+
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ private Canvas3D canvas;
+ private GraphicsContext3D gc = null;
+ private Geometry cube = null;
+ private Transform3D cmt = new Transform3D();
+
+ // One rotation (2*PI radians) every 6 seconds
+ private Alpha rotAlpha = new Alpha(-1, 6000);
+
+ //
+ // Renders a single frame by clearing the canvas, drawing the
+ // geometry, and swapping the draw and display buffer.
+ //
+ public void render() {
+ if (gc == null) {
+ // Set up Graphics context
+ gc = canvas.getGraphicsContext3D();
+ gc.setAppearance(new Appearance());
+
+ // Set up geometry
+ cube = new ColorCube(0.4).getGeometry();
+ }
+
+ // Compute angle of rotation based on alpha value
+ double angle = rotAlpha.value() * 2.0*Math.PI;
+ cmt.rotY(angle);
+
+ // Render the geometry for this frame
+ gc.clear();
+ gc.setModelTransform(cmt);
+ gc.draw(cube);
+ canvas.swap();
+ }
+
+ //
+ // Run method for our immediate mode rendering thread.
+ //
+ public void run() {
+ System.out.println("PureImmediate.run: starting main loop");
+ while (true) {
+ render();
+ Thread.yield();
+ }
+ }
+
+
+ private void createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ canvas = new Canvas3D(config);
+ canvas.stopRenderer();
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(canvas);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+ }
+
+ /**
+ * Creates new form PureImmediate
+ */
+ public PureImmediate() {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ createUniverse();
+ drawingPanel.add(canvas, java.awt.BorderLayout.CENTER);
+
+ // Start a new thread that will continuously render
+ new Thread(this).start();
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("PureImmediate");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(250, 250));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new PureImmediate().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediateStereo.form b/src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediateStereo.form
new file mode 100644
index 0000000..dd881b5
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediateStereo.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="PureImmediateStereo"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[512, 256]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediateStereo.java b/src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediateStereo.java
new file mode 100644
index 0000000..9e0f0e5
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/pure_immediate/PureImmediateStereo.java
@@ -0,0 +1,308 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.pure_immediate;
+
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
+import java.util.Map;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GraphicsConfigTemplate3D;
+import org.jogamp.java3d.GraphicsContext3D;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.utils.geometry.Cone;
+import org.jogamp.java3d.utils.geometry.Primitive;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * Pure immediate mode stereo example program for stereo. In pure
+ * immediate mode, the renderer must be stopped on the Canvas being
+ * rendered into. In our example, this is done immediately after the
+ * canvas is created. A separate thread is started up to do the
+ * immediate mode rendering.
+ */
+
+public class PureImmediateStereo extends javax.swing.JFrame implements Runnable {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ // Set this to true when the graphics card use shared z buffer
+ // in stereo mode.
+ public static String defaultSharedStereoZbuffer = Boolean.TRUE.toString();
+
+ private boolean sharedStereoZbuffer;
+ private boolean stereoSupport;
+ private Canvas3D canvas;
+ private GraphicsContext3D gc;
+ private Shape3D leftConeBody, rightConeBody;
+ private Shape3D leftConeCap, rightConeCap;
+ private Transform3D cmt = new Transform3D();
+ private Vector3f leftTrans, rightTrans;
+
+ // One rotation (2*PI radians) every 6 seconds
+ private Alpha rotAlpha = new Alpha(-1, 6000);
+ private double angle;
+
+ // Compute data which is common for both
+ // left and right eye
+ void computeSharedData() {
+ // Compute angle of rotation based on alpha value
+ angle = rotAlpha.value() * 2.0*Math.PI;
+ cmt.rotY(angle);
+ }
+
+ // Render the geometry in right eye
+ void renderLeft() {
+ cmt.setTranslation(leftTrans);
+ gc.setModelTransform(cmt);
+
+ if (sharedStereoZbuffer) {
+ // Graphics card shared same z buffer in stereo mode,
+ // in this case we have to explicitly clearing both
+ // frame buffers.
+ gc.clear();
+ }
+ gc.draw(leftConeBody);
+ gc.draw(leftConeCap);
+ }
+
+ // Render the geometry for right eye
+ void renderRight() {
+ cmt.setTranslation(rightTrans);
+ gc.setModelTransform(cmt);
+
+ if (sharedStereoZbuffer) {
+ // Graphics card shared same z buffer in stereo mode,
+ // in this case we have to explicitly clearing both
+ // frame buffers.
+ gc.clear();
+ }
+ gc.draw(rightConeBody);
+ gc.draw(rightConeCap);
+ }
+
+ //
+ // Run method for our immediate mode rendering thread.
+ //
+ public void run() {
+ // Set up Graphics context
+ gc = canvas.getGraphicsContext3D();
+
+ // We always need to set this for PureImmediate
+ // stereo mode
+ gc.setBufferOverride(true);
+
+ Color3f lightColor = new Color3f(1, 1, 1);
+ Vector3f lightDir = new Vector3f(0, 0, -1);
+ DirectionalLight light = new DirectionalLight(lightColor,
+ lightDir);
+
+ gc.addLight(light);
+
+ Appearance redApp = new Appearance();
+ Appearance greenApp = new Appearance();
+ Color3f ambientColor = new Color3f(0, 0, 0);
+ Color3f emissiveColor = new Color3f(0, 0, 0);
+ Color3f diffuseColor = new Color3f(1, 0, 0);
+ Color3f specularColor = new Color3f(1, 1, 1);
+ redApp.setMaterial(new Material(ambientColor, emissiveColor,
+ diffuseColor, specularColor, 5));
+ diffuseColor = new Color3f(0, 1, 0);
+
+ greenApp.setMaterial(new Material(ambientColor, emissiveColor,
+ diffuseColor, specularColor, 5));
+
+ // Set up geometry
+ Cone leftCone = new Cone(0.4f, 0.6f,
+ Primitive.GENERATE_NORMALS, redApp);
+ Cone rightCone = new Cone(0.4f, 0.6f,
+ Primitive.GENERATE_NORMALS, greenApp);
+ leftConeBody = leftCone.getShape(Cone.BODY);
+ leftConeCap = leftCone.getShape(Cone.CAP);
+
+ rightConeBody = rightCone.getShape(Cone.BODY);
+ rightConeCap = rightCone.getShape(Cone.CAP);
+ leftTrans = new Vector3f(-0.6f, 0, 0);
+ rightTrans = new Vector3f(0.6f, 0, 0);
+
+
+ while (true) {
+ // compute data which is can be used
+ // for both left and right eye
+ computeSharedData();
+
+ if (stereoSupport) {
+ if (!sharedStereoZbuffer) {
+ gc.setStereoMode(GraphicsContext3D.STEREO_BOTH);
+ // This clear both left and right buffers, we
+ // must set STEREO_BOTH before it. Otherwise
+ // it only clear LEFT or RIGHT buffer unless
+ // this is invoke twice for each buffer.
+ gc.clear();
+ }
+
+ gc.setStereoMode(GraphicsContext3D.STEREO_LEFT);
+ renderLeft();
+
+ gc.setStereoMode(GraphicsContext3D.STEREO_RIGHT);
+ renderRight();
+ } else {
+ gc.clear();
+ renderLeft();
+ }
+
+ // This swap both left and right buffers so
+ // there is no need to set STEREO_BOTH before it
+ canvas.swap();
+
+ // Be polite to other threads !
+ Thread.yield();
+ }
+ }
+
+
+ private void createUniverse() {
+ // Preferred to use Stereo
+ GraphicsConfigTemplate3D gct = new GraphicsConfigTemplate3D();
+ gct.setStereo(GraphicsConfigTemplate3D.PREFERRED);
+
+ GraphicsConfiguration config =
+ GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getBestConfiguration(gct);
+
+ canvas = new Canvas3D(config);
+ Map map = canvas.queryProperties();
+
+ stereoSupport = canvas.getStereoAvailable();
+
+ if (stereoSupport) {
+ System.out.println("This machine support stereo, you should see a red cone on the left and green cone on the right.");
+ // User can overide the above default behavior using
+ // java3d property.
+ String str = System.getProperty("j3d.sharedstereozbuffer",
+ defaultSharedStereoZbuffer);
+ sharedStereoZbuffer = (new Boolean(str)).booleanValue();
+ } else {
+ System.out.println("Stereo is not support, you should only see the left red cone.");
+ }
+
+ if (!canvas.getDoubleBufferAvailable()) {
+ System.out.println("Double buffer is not support !");
+ }
+
+ // we must stop the Renderer in PureImmediate mode
+ canvas.stopRenderer();
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(canvas);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ // Start a new thread that will continuously render
+ (new Thread(this)).start();
+ }
+
+ /**
+ * Creates new form PureImmediateStereo
+ */
+ public PureImmediateStereo() {
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ createUniverse();
+ drawingPanel.add(canvas, java.awt.BorderLayout.CENTER);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("PureImmediateStereo");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(512, 256));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new PureImmediateStereo().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/read_raster/ReadRaster.java b/src/main/java/org/jdesktop/j3d/examples/read_raster/ReadRaster.java
new file mode 100644
index 0000000..780e3fe
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/read_raster/ReadRaster.java
@@ -0,0 +1,236 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.read_raster;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.GraphicsConfiguration;
+import java.awt.image.BufferedImage;
+import java.util.Enumeration;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.GraphicsContext3D;
+import org.jogamp.java3d.ImageComponent;
+import org.jogamp.java3d.ImageComponent2D;
+import org.jogamp.java3d.Raster;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+
+public class ReadRaster extends Applet {
+
+ private SimpleUniverse u = null;
+
+ public BranchGroup createSceneGraph(BufferedImage bImage,
+ Raster readRaster) {
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Raster shape. Add it to the root of the subgraph
+
+ ImageComponent2D drawImageComponent = new ImageComponent2D(
+ ImageComponent.FORMAT_RGB, bImage, true, true);
+
+ Raster drawRaster= new Raster(new Point3f(0.0f, 0.0f, 0.0f),
+ Raster.RASTER_COLOR, 0, 0, bImage.getWidth(),
+ bImage.getHeight(), drawImageComponent, null);
+ Shape3D shape = new Shape3D(drawRaster);
+ drawRaster.setCapability(Raster.ALLOW_IMAGE_WRITE);
+ objRoot.addChild(shape);
+
+ // Ceate the transform greup node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+
+ TransformGroup cubeScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setTranslation(new Vector3d(-0.5, 0.5, 0.0));
+ cubeScale.setTransform(t3d);
+
+ cubeScale.addChild(objTrans);
+ objRoot.addChild(cubeScale);
+
+ // Create a simple shape leaf node, add it to the scene graph.
+ objTrans.addChild(new ColorCube(0.3));
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into
+ // the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+ myRotationInterpolator rotator =
+ new myRotationInterpolator(drawRaster, readRaster,
+ rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ public ReadRaster() {
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+
+ int width = 128;
+ int height = 128;
+
+ ImageComponent2D readImageComponent = new ImageComponent2D(
+ ImageComponent.FORMAT_RGB, width, height, false, true);
+
+ Raster readRaster = new Raster(new Point3f(0.0f,0.0f,0.0f),
+ Raster.RASTER_COLOR, 0, 0, width,
+ height, readImageComponent, null);
+
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new myCanvas3D(config, readRaster);
+ add("Center", c);
+
+ // Create a simple scene and attach it to the virtual universe
+ BufferedImage bImage = new BufferedImage(width, height,
+ BufferedImage.TYPE_INT_RGB);
+
+ BranchGroup scene = createSceneGraph(bImage, readRaster);
+ u = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+
+ u.addBranchGraph(scene);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ //
+ // The following allows ReadRaster to be run as an application
+ // as well as an applet
+ //
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ new MainFrame(new ReadRaster(), 256, 256);
+ }
+}
+
+
+class myCanvas3D extends Canvas3D {
+
+ Raster readRaster;
+ GraphicsContext3D gc;
+
+ public myCanvas3D(GraphicsConfiguration graphicsConfiguration,
+ Raster readRaster) {
+
+ super(graphicsConfiguration);
+ this.readRaster = readRaster;
+ gc = getGraphicsContext3D();
+ }
+
+ public void postSwap() {
+ super.postSwap();
+ synchronized(readRaster) {
+ gc.readRaster(readRaster);
+ }
+ }
+}
+
+
+class myRotationInterpolator extends RotationInterpolator {
+ Point3f wPos = new Point3f(0.025f, -0.025f, 0.0f);
+ Raster drawRaster;
+ Raster readRaster;
+ BufferedImage bImage;
+ ImageComponent2D newImageComponent;
+
+ public myRotationInterpolator(Raster drawRaster, Raster readRaster,
+ Alpha alpha,
+ TransformGroup target,
+ Transform3D axisOfRotation,
+ float minimumAngle,
+ float maximumAngle) {
+
+ super(alpha, target, axisOfRotation, minimumAngle, maximumAngle);
+ this.drawRaster = drawRaster;
+ this.readRaster = readRaster;
+ }
+
+ public void processStimulus(Enumeration criteria) {
+
+ synchronized(readRaster) {
+ bImage = readRaster.getImage().getImage();
+ }
+ newImageComponent = new ImageComponent2D(ImageComponent.FORMAT_RGB,
+ bImage, true, true);
+ drawRaster.setImage(newImageComponent);
+ super.processStimulus(criteria);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sound/AudioReverberate.java b/src/main/java/org/jdesktop/j3d/examples/sound/AudioReverberate.java
new file mode 100644
index 0000000..f54b43f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sound/AudioReverberate.java
@@ -0,0 +1,177 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.sound;
+
+import java.net.URL;
+import java.util.Enumeration;
+
+import org.jogamp.java3d.AuralAttributes;
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.MediaContainer;
+import org.jogamp.java3d.PointSound;
+import org.jogamp.java3d.WakeupOnBehaviorPost;
+import org.jogamp.java3d.WakeupOnElapsedTime;
+import org.jogamp.vecmath.Point3f;
+
+/*
+ * Pick the JavaSound reverb type that matches the input parameters
+ * as best as possible.
+ *
+ * Hae Reverb Types Size Persistance Delay
+ * ================ ----------- ------------ -----------
+ * 1 None (dry)
+ * 2 "Closet" very small very short <.5 fast smooth
+ * 3 "Garage" med. large medium 1.0 medium
+ * 4 "Acoustic Lab" med. small short .5 med. fast
+ * 5 "Cavern" large long >2.0 very slow
+ * 6 "Dungeon" medium med. long 1.5 med. slow
+ *
+ *
+ * Order is NOT controllable, nor does it have a natural parallel.
+ * For this reason Order and Reflection are tied together as to
+ * affect 'Decay Speed'. This speed paired with the size of the
+ * space implied by the Delay parameter determine the JavaSound
+ * Reverb type that is set:
+ *
+ * | Short: Long:
+ * Speed | Coeff <= 0.9 Coeff > 0.9
+ * Size | Order <= 8 Order > 8
+ * ---------------------------------------------------------------
+ * small (<100ms) | 2 "Closet" 4 "Acoustic Lab"
+ * medium (<500ms) | 3 "Garage" 6 "Dungeon"
+ * large (>500ms) | 6 "Dungeon" 5 "Cavern"
+ */
+// User defined audio behavior class
+public class AudioReverberate extends Behavior {
+ WakeupOnElapsedTime wt;
+ WakeupOnBehaviorPost wp;
+ PointSound psound = new PointSound();
+ AuralAttributes sScape = null;
+ static int WAKEUP_SOUND = 0;
+ long dur;
+ long time;
+ boolean firstTime = true;
+ URL url = null;
+ int lCount = 0;
+ int loopCount = 0;
+
+ // Override Behavior's initialize method to setup wakeup criteria
+ public void initialize() {
+ MediaContainer sample = new MediaContainer();
+ sample.setCacheEnable(true);
+ sample.setURLObject(url);
+ psound.setSoundData(sample);
+ Point3f soundPos = new Point3f(-23.0f, 0.0f, 0.0f);
+ psound.setPosition(soundPos);
+ psound.setLoop(3);
+ firstTime = true;
+ System.out.println("Reverb Name Size Reflect Order Delay ");
+ System.out.println("----------- ---- ------- ----- ----- ");
+ WakeupOnElapsedTime wp = new WakeupOnElapsedTime(5000);
+ wakeupOn(wp);
+ }
+
+ // Override Behavior's stimulus method to handle the event
+ public void processStimulus(Enumeration criteria) {
+ // time = System.currentTimeMillis();
+ if (firstTime) {
+ wt = new WakeupOnElapsedTime(10000);
+ firstTime = false;
+ }
+ else
+ psound.setEnable(false) ;
+
+ if (++lCount > 6)
+ lCount = 1;
+
+ if (lCount == 1) {
+ sScape.setReverbDelay(10.0f) ;
+ sScape.setReflectionCoefficient(0.5f) ;
+ sScape.setReverbOrder(5) ;
+ System.out.println("Closet sm 0.5 5 10.0 ");
+ }
+ else if (lCount == 2) {
+ sScape.setReverbDelay(10.0f) ;
+ sScape.setReflectionCoefficient(0.999f) ;
+ sScape.setReverbOrder(9) ;
+ System.out.println("Acoustic Lab sm 0.999 9 10.0 ");
+ }
+ else if (lCount == 3) {
+ sScape.setReverbDelay(200.0f) ;
+ sScape.setReflectionCoefficient(0.4f) ;
+ sScape.setReverbOrder(3) ;
+ System.out.println("Garage med 0.4 3 200.0 ");
+ }
+ else if (lCount == 4) {
+ sScape.setReverbDelay(200.0f) ;
+ sScape.setReflectionCoefficient(0.99f) ;
+ sScape.setReverbOrder(10) ;
+ System.out.println("Dungeon med 0.99 10 200.0 ");
+ }
+ else if (lCount == 5) {
+ sScape.setReverbDelay(600.0f) ;
+ sScape.setReflectionCoefficient(0.33f) ;
+ sScape.setReverbOrder(7) ;
+ System.out.println("Dungeon lrg 0.33 7 600.0 ");
+ }
+ else if (lCount == 6) {
+ sScape.setReverbDelay(600.0f) ;
+ sScape.setReflectionCoefficient(1.0f) ;
+ sScape.setReverbOrder(20) ;
+ System.out.println("Cavern lrg 1.0 20 600.0 ");
+ }
+ psound.setEnable(true);
+ wakeupOn(wt);
+ }
+
+ //
+ // Constructor for rotation behavior. Parameter: front and back Sound nodes
+ //
+ public AudioReverberate(PointSound psound, URL url, AuralAttributes sscape) {
+ this.psound = psound;
+ this.url = url;
+ this.sScape = sscape;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sound/BackgroundSoundBehavior.java b/src/main/java/org/jdesktop/j3d/examples/sound/BackgroundSoundBehavior.java
new file mode 100644
index 0000000..bc8f5e6
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sound/BackgroundSoundBehavior.java
@@ -0,0 +1,85 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.sound;
+
+import java.net.URL;
+import java.util.Enumeration;
+
+import org.jogamp.java3d.BackgroundSound;
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.Bounds;
+import org.jogamp.java3d.MediaContainer;
+import org.jogamp.java3d.WakeupCondition;
+import org.jogamp.java3d.WakeupOnElapsedFrames;
+import org.jogamp.vecmath.Point3d;
+
+public class BackgroundSoundBehavior extends Behavior {
+
+ private WakeupCondition condition = new WakeupOnElapsedFrames(0);
+
+ /** Creates a new instance of BackgroundSoundBehavior */
+ public BackgroundSoundBehavior(BackgroundSound bgs, URL url) {
+
+ Bounds b = new BoundingSphere(new Point3d(), 20);
+ bgs.setSoundData(new MediaContainer(url));
+ bgs.setEnable(true);
+ bgs.setPause(false);
+ bgs.setLoop(-1);
+ bgs.setContinuousEnable(true);
+ bgs.setSchedulingBounds(b);
+
+ }
+
+ public void initialize() {
+
+ wakeupOn(condition);
+ }
+
+ public void processStimulus(Enumeration enumeration) {
+ wakeupOn(condition);
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sound/BackgroundSoundTest.form b/src/main/java/org/jdesktop/j3d/examples/sound/BackgroundSoundTest.form
new file mode 100644
index 0000000..9a2f209
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sound/BackgroundSoundTest.form
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="BackgroundSoundTest"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[800, 600]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/sound/BackgroundSoundTest.java b/src/main/java/org/jdesktop/j3d/examples/sound/BackgroundSoundTest.java
new file mode 100644
index 0000000..b2011d0
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sound/BackgroundSoundTest.java
@@ -0,0 +1,289 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+package org.jdesktop.j3d.examples.sound;
+
+import java.awt.GraphicsConfiguration;
+import java.net.URL;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BackgroundSound;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.Bounds;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.LineArray;
+import org.jogamp.java3d.LineAttributes;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Sound;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.behaviors.keyboard.KeyNavigatorBehavior;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.Viewer;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * This is a test for a BackgroundSound.
+ * This program is ported from an earlier version of BackgroundSoundTest, in the j3d-incubator project,
+ * contributed by David Grace ([email protected]).
+ *
+ */
+public class BackgroundSoundTest extends javax.swing.JFrame {
+
+ private URL url = null;
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ //The activation radius for the ViewPlatform
+ private float activationRadius = 1;
+
+ private Shape3D getDefaultGrid(int noOfLines, double size, double height){
+
+ Shape3D shape = new Shape3D();
+ double lineLength = noOfLines * size / 2;
+ LineArray la = new LineArray(noOfLines * 4, LineArray.COORDINATES);
+ int count = 0;
+ for (int i=0; i<noOfLines; i++){
+ la.setCoordinate(count, new Point3d(-lineLength, height, i*size - lineLength));
+ count++;
+ la.setCoordinate(count, new Point3d(lineLength, height, i*size - lineLength));
+ count++;
+ }
+ for (int i=0; i<noOfLines; i++){
+ la.setCoordinate(count, new Point3d(i*size - lineLength, height, -lineLength));
+ count++;
+ la.setCoordinate(count, new Point3d(i*size - lineLength, height, lineLength));
+ count++;
+ }
+ shape.setGeometry(la);
+ Appearance a = new Appearance();
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(0.3f, 0.3f, 0.3f);
+ a.setColoringAttributes(ca);
+ LineAttributes sla = new LineAttributes();
+ sla.setLineWidth(1.0f);
+ a.setLineAttributes(sla);
+ shape.setAppearance(a);
+
+ return shape;
+ }
+
+
+ private Sphere createSoundBoundingGeometry(Sound sound){
+ Bounds bounds = sound.getSchedulingBounds();
+ assert ((bounds != null) && (bounds instanceof BoundingSphere));
+ BoundingSphere bs = (BoundingSphere) bounds;
+ float radius = (float) bs.getRadius();
+
+ return getSphere(radius);
+ }
+
+ private Sphere getSphere(float radius){
+
+ Appearance a = new Appearance();
+ Material m = new Material();
+
+ m.setDiffuseColor(1, 0, 0);
+ m.setAmbientColor(1, 0, 0);
+ m.setShininess(8);
+ a.setMaterial(m);
+
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setPolygonMode(PolygonAttributes.POLYGON_LINE);
+ pa.setCullFace(PolygonAttributes.CULL_NONE);
+ a.setPolygonAttributes(pa);
+ return new Sphere(radius, a);
+ }
+
+ private TransformGroup createSoundNodeGeometry(float x, float y, float z){
+
+ TransformGroup rootTransformGroup = new TransformGroup();
+ Transform3D t3D = new Transform3D();
+ t3D.setTranslation(new Vector3f(x, y, z));
+ rootTransformGroup.setTransform(t3D);
+ ColorCube cc = new ColorCube(0.1);
+ rootTransformGroup.addChild(cc);
+ return rootTransformGroup;
+ }
+
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ AmbientLight al = new AmbientLight();
+ al.setInfluencingBounds(bounds);
+
+ DirectionalLight dl = new DirectionalLight();
+ dl.setDirection(-1, -1, -1);
+ dl.setInfluencingBounds(bounds);
+ objRoot.addChild(al);
+ objRoot.addChild(dl);
+
+ /*
+ * Create Sound and Behavior objects that will play the sound
+ */
+ BackgroundSound bgs = new BackgroundSound();
+ BackgroundSoundBehavior player = new BackgroundSoundBehavior( bgs, url);
+ player.setSchedulingBounds(bounds);
+ objRoot.addChild(bgs);
+ objRoot.addChild(player);
+
+ objRoot.addChild(getDefaultGrid(40, 1, -1));
+ objRoot.addChild(createSoundNodeGeometry(0, 0, 0));
+ objRoot.addChild(createSoundBoundingGeometry(bgs));
+ return objRoot;
+ }
+
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+ TransformGroup viewingPlatformTransformGroup = viewingPlatform.getViewPlatformTransform();
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ Viewer viewer = univ.getViewer();
+
+ viewer.createAudioDevice();
+ viewer.getView().setBackClipDistance(1000.0f);
+
+ // Ensure at least 50 msec per frame.
+ viewer.getView().setMinimumFrameCycleTime(30);
+
+ viewer.getView().getViewPlatform().setActivationRadius(activationRadius);
+
+ BranchGroup bg = new BranchGroup();
+ KeyNavigatorBehavior knb = new KeyNavigatorBehavior(c, viewingPlatformTransformGroup);
+ Bounds b = new BoundingSphere(new Point3d(), Double.POSITIVE_INFINITY);
+ knb.setSchedulingBounds(b);
+ bg.addChild(knb);
+ univ.addBranchGraph(bg);
+
+ return c;
+ }
+
+ /**
+ * Creates new form BackgroundSoundTest
+ */
+ public BackgroundSoundTest() {
+ // Initialize the GUI components
+ initComponents();
+
+ url = Resources.getResource("resources/audio/magic_bells.wav");
+ if (url == null) {
+ System.err.println("resources/audio/magic_bells.wav not found");
+ System.exit(1);
+ }
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("BackgroundSoundTest");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(800, 600));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new BackgroundSoundTest().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sound/PointSoundBehavior.java b/src/main/java/org/jdesktop/j3d/examples/sound/PointSoundBehavior.java
new file mode 100644
index 0000000..754847c
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sound/PointSoundBehavior.java
@@ -0,0 +1,89 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.sound;
+
+import java.net.URL;
+import java.util.Enumeration;
+
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.Bounds;
+import org.jogamp.java3d.MediaContainer;
+import org.jogamp.java3d.PointSound;
+import org.jogamp.java3d.WakeupCondition;
+import org.jogamp.java3d.WakeupOnElapsedFrames;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+
+public class PointSoundBehavior extends Behavior {
+
+ private WakeupCondition condition = new WakeupOnElapsedFrames(0);
+
+ /** Creates a new instance of PointSoundBehavior */
+ public PointSoundBehavior(PointSound ps, URL url, Point3f pos) {
+
+ Bounds b = new BoundingSphere(new Point3d(), 40);
+ ps.setSoundData(new MediaContainer(url));
+ ps.setPosition(pos);
+ float distanceAtZero = 30;
+ ps.setDistanceGain(new float []{0, distanceAtZero}, new float []{1, 0});
+ ps.setEnable(true);
+ ps.setPause(false);
+ ps.setContinuousEnable(true);
+ ps.setSchedulingBounds(b);
+ ps.setLoop(-1);
+
+ }
+
+ public void initialize() {
+
+ wakeupOn(condition);
+ }
+
+ public void processStimulus(Enumeration enumeration) {
+ wakeupOn(condition);
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sound/PointSoundTest.form b/src/main/java/org/jdesktop/j3d/examples/sound/PointSoundTest.form
new file mode 100644
index 0000000..41f5f7d
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sound/PointSoundTest.form
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="PointSound Test"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[800, 600]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/sound/PointSoundTest.java b/src/main/java/org/jdesktop/j3d/examples/sound/PointSoundTest.java
new file mode 100644
index 0000000..a39bc87
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sound/PointSoundTest.java
@@ -0,0 +1,318 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.sound;
+
+import java.awt.GraphicsConfiguration;
+import java.net.URL;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.Bounds;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.LineArray;
+import org.jogamp.java3d.LineAttributes;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointSound;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Sound;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.behaviors.keyboard.KeyNavigatorBehavior;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.Viewer;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * This is a test for a PointSound.
+ * This program is ported from an earlier version of PointSoundTest, in the j3d-incubator project,
+ * contributed by David Grace ([email protected]).
+ *
+ */
+public class PointSoundTest extends javax.swing.JFrame {
+
+ private URL url = null;
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ //The activation radius for the ViewPlatform
+ private float activationRadius = 1;
+
+ private Shape3D getDefaultGrid(int noOfLines, double size, double height){
+
+ Shape3D shape = new Shape3D();
+ double lineLength = noOfLines * size / 2;
+ LineArray la = new LineArray(noOfLines * 4, LineArray.COORDINATES);
+ int count = 0;
+ for (int i=0; i<noOfLines; i++){
+ la.setCoordinate(count, new Point3d(-lineLength, height, i*size - lineLength));
+ count++;
+ la.setCoordinate(count, new Point3d(lineLength, height, i*size - lineLength));
+ count++;
+ }
+ for (int i=0; i<noOfLines; i++){
+ la.setCoordinate(count, new Point3d(i*size - lineLength, height, -lineLength));
+ count++;
+ la.setCoordinate(count, new Point3d(i*size - lineLength, height, lineLength));
+ count++;
+ }
+ shape.setGeometry(la);
+ Appearance a = new Appearance();
+ ColoringAttributes ca = new ColoringAttributes();
+ ca.setColor(0.3f, 0.3f, 0.3f);
+ a.setColoringAttributes(ca);
+ LineAttributes sla = new LineAttributes();
+ sla.setLineWidth(1.0f);
+ a.setLineAttributes(sla);
+ shape.setAppearance(a);
+
+ return shape;
+ }
+
+ private Group createSoundBoundingGeometries(PointSound ps) {
+ Group group = new Group();
+ Sphere sphere1 = getInnerBoundingSphere(ps);
+ group.addChild(sphere1);
+
+ assert(ps.getDistanceGainLength() == 2);
+
+ // create geometry for outer Bounding Sphere
+ float [] ds = new float [ps.getDistanceGainLength()];
+ float [] as = new float [ps.getDistanceGainLength()];
+ ps.getDistanceGain(ds, as);
+ float distanceAtZero = ds[ps.getDistanceGainLength() - 1];
+
+ Sphere sphere2 = getSphere(distanceAtZero, false);
+ group.addChild(sphere2);
+
+ return group;
+ }
+
+ private Sphere getInnerBoundingSphere(Sound sound){
+ Bounds bounds = sound.getSchedulingBounds();
+ assert ((bounds != null) && (bounds instanceof BoundingSphere));
+ BoundingSphere bs = (BoundingSphere) bounds;
+ float radius = (float) bs.getRadius();
+
+ return getSphere(radius, true);
+ }
+
+ private Sphere getSphere(float radius, boolean inner){
+
+ Appearance a = new Appearance();
+ Material m = new Material();
+
+ if (inner) {
+ m.setDiffuseColor(1, 0, 0);
+ m.setAmbientColor(1, 0, 0);
+ m.setShininess(8);
+ } else {
+ m.setDiffuseColor(0, 1, 0);
+ m.setAmbientColor(0, 1, 0);
+ m.setShininess(8);
+ }
+ a.setMaterial(m);
+
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setPolygonMode(PolygonAttributes.POLYGON_LINE);
+ pa.setCullFace(PolygonAttributes.CULL_NONE);
+ a.setPolygonAttributes(pa);
+ return new Sphere(radius, a);
+ }
+
+ private TransformGroup createSoundNodeGeometry(float x, float y, float z){
+
+ TransformGroup rootTransformGroup = new TransformGroup();
+ Transform3D t3D = new Transform3D();
+ t3D.setTranslation(new Vector3f(x, y, z));
+ rootTransformGroup.setTransform(t3D);
+ ColorCube cc = new ColorCube(0.1);
+ rootTransformGroup.addChild(cc);
+ return rootTransformGroup;
+ }
+
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ AmbientLight al = new AmbientLight();
+ al.setInfluencingBounds(bounds);
+
+ DirectionalLight dl = new DirectionalLight();
+ dl.setDirection(-1, -1, -1);
+ dl.setInfluencingBounds(bounds);
+ objRoot.addChild(al);
+ objRoot.addChild(dl);
+
+ /*
+ * Create Sound and Behavior objects that will play the sound
+ */
+ PointSound ps = new PointSound();
+ PointSoundBehavior player = new PointSoundBehavior( ps, url, new Point3f(0.0f, 0.0f, 0.0f));
+ player.setSchedulingBounds(bounds);
+ objRoot.addChild(ps);
+ objRoot.addChild(player);
+
+ objRoot.addChild(getDefaultGrid(40, 1, -1));
+ objRoot.addChild(createSoundNodeGeometry(0, 0, 0));
+ objRoot.addChild(createSoundBoundingGeometries(ps));
+ return objRoot;
+ }
+
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+ TransformGroup viewingPlatformTransformGroup = viewingPlatform.getViewPlatformTransform();
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ Viewer viewer = univ.getViewer();
+
+ viewer.createAudioDevice();
+ viewer.getView().setBackClipDistance(1000.0f);
+
+ // Ensure at least 50 msec per frame.
+ viewer.getView().setMinimumFrameCycleTime(30);
+
+ viewer.getView().getViewPlatform().setActivationRadius(activationRadius);
+
+ BranchGroup bg = new BranchGroup();
+ KeyNavigatorBehavior knb = new KeyNavigatorBehavior(c, viewingPlatformTransformGroup);
+ Bounds b = new BoundingSphere(new Point3d(), Double.POSITIVE_INFINITY);
+ knb.setSchedulingBounds(b);
+ bg.addChild(knb);
+ univ.addBranchGraph(bg);
+
+ return c;
+ }
+
+
+ /**
+ * Creates new form PointSoundTest
+ */
+ public PointSoundTest() {
+ // Initialize the GUI components
+ initComponents();
+
+ url = Resources.getResource("resources/audio/magic_bells.wav");
+ if (url == null) {
+ System.err.println("resources/audio/magic_bells.wav not found");
+ System.exit(1);
+ }
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("PointSound Test");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(800, 600));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new PointSoundTest().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sound/ReverberateSound.java b/src/main/java/org/jdesktop/j3d/examples/sound/ReverberateSound.java
new file mode 100644
index 0000000..9cf7ad0
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sound/ReverberateSound.java
@@ -0,0 +1,202 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.sound;
+
+/*
+ * ReverberateSound
+ *
+ * Same as MoveSound except this calls UniverseBuilderJS to use the
+ * JavaSoundMixer AudioDevice rather than the HolosketchMixer device.
+ *
+ * NOTE: To run this anywhere but the Solaris Eng Menlo Park network
+ * the URL path must be set to the java3d/javaone directory.
+ */
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.GraphicsConfiguration;
+import java.net.URL;
+
+import javax.swing.JOptionPane;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AudioDevice;
+import org.jogamp.java3d.AuralAttributes;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.PointSound;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Soundscape;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Point3d;
+
+public class ReverberateSound extends Applet {
+
+ // File name of sound sample
+ private static URL url = null;
+ private SimpleUniverse u = null;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the subgraph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create the transform group node and initialize it to the identity.
+ // Enable the TRANSFORM_WRITE capability so that our behavior code
+ // can modify it at runtime. Add it to the root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // Create a simple shape leaf node and add it into the scene graph.
+ objTrans.addChild(new ColorCube(0.4));
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotation = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 20000, 0, 0,
+ 0, 0, 0);
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotation,
+ objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+
+ //
+ // Create an AuralAttribute with reverb params set
+ //
+ Soundscape soundScape2 = new Soundscape();
+ AuralAttributes attributes2 = new AuralAttributes();
+ attributes2.setReverbOrder(6);
+ attributes2.setCapability(AuralAttributes.ALLOW_REVERB_ORDER_WRITE);
+ attributes2.setCapability(AuralAttributes.ALLOW_REVERB_DELAY_WRITE);
+ attributes2.setCapability(AuralAttributes.ALLOW_REFLECTION_COEFFICIENT_WRITE);
+ soundScape2.setApplicationBounds(bounds);
+ soundScape2.setAuralAttributes(attributes2);
+ objRoot.addChild(soundScape2);
+
+ //
+ // Create a sound node and add it to the scene graph
+ //
+ PointSound sound = new PointSound();
+ sound.setCapability(PointSound.ALLOW_ENABLE_WRITE);
+ sound.setCapability(PointSound.ALLOW_INITIAL_GAIN_WRITE);
+ sound.setCapability(PointSound.ALLOW_SOUND_DATA_WRITE);
+ sound.setCapability(PointSound.ALLOW_DURATION_READ);
+ sound.setCapability(PointSound.ALLOW_POSITION_WRITE);
+ sound.setCapability(PointSound.ALLOW_LOOP_WRITE);
+ sound.setSchedulingBounds(bounds);
+
+ objTrans.addChild(sound);
+ //
+ // Create a new Behavior object that will play the sound
+ //
+ AudioReverberate player = new AudioReverberate(sound, url, attributes2);
+ player.setSchedulingBounds(bounds);
+ objTrans.addChild(player);
+
+ return objRoot;
+ }
+
+ public ReverberateSound() {
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ url = Resources.getResource("resources/audio/hello_universe.au");
+ if (url == null) {
+ System.err.println("resources/audio/hello_universe.au not found");
+ System.exit(1);
+ }
+
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+
+ /*
+ * Create a simple scene and attach it to the virtual universe
+ */
+ u = new SimpleUniverse(c);
+ AudioDevice audioDev = u.getViewer().createAudioDevice();
+ BranchGroup scene = createSceneGraph();
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+
+ u.addBranchGraph(scene);
+
+ JOptionPane.showMessageDialog(this,
+ ("This program is still a work in progress.\n" +
+ "Please check back in Java 3D 1.5.\n"),
+ "Incomplete Work",
+ JOptionPane.INFORMATION_MESSAGE);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ //
+ // The following allows ReverberateSound to be run as an application
+ // as well as an applet
+ //
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ new MainFrame(new ReverberateSound(), 256, 256);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sound/SimpleSounds.java b/src/main/java/org/jdesktop/j3d/examples/sound/SimpleSounds.java
new file mode 100644
index 0000000..c5df424
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sound/SimpleSounds.java
@@ -0,0 +1,262 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.sound;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.GraphicsConfiguration;
+import java.net.URL;
+
+import javax.swing.JOptionPane;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AudioDevice;
+import org.jogamp.java3d.BackgroundSound;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.PointSound;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Point3d;
+
+/*
+ * This Java3D program:
+ * Creates an instance of the JavaSoundMixer AudioDevice, initializing it
+ * and attaching it to the PhysicalEnvironment by using
+ * SimpleUniverse.
+ * Creates one cached Background and two cached Point sound sources.
+ * Creates and executes a custom behavior (SimpleSoundsBehavior) that
+ * starts the sound playing and transforms the PointSound source
+ * by modifying the TransformGroup that contains the Sound nodes.
+ *
+ * Usage:
+ * java SimpleSounds [URLpath [name1 [name2 [name2]]]]
+ *
+ * The first optional command line parameter is the URL path to directory
+ * containing "file:" or "http:" and then directory path string.
+ * If you are using the suppled default sound files in the same directory
+ * as this test program then only the URLpath need be supplied on the
+ * command line.
+ * If this parameter is not included then the current path to the directory
+ * this program is running in is used for an application
+ * and the codebase is used for an applet.
+ * The second thru fourth optional command line parameters are sound file names
+ * If not given, the default file names are:
+ * techno_machine.au
+ * hello_universe.au
+ * roar.au
+ * that correspond to the 3 'voice' quality, 8-bit, u-law, 8-kHz samples
+ * included in the same directory as this test program.
+ *
+ * Java Sound engine has been advertised to support the following 8- and 16-
+ * bit, linear and u-law, mono and stereo sound sample file formats: AU,
+ * AIFF, WAV, and PCM. Non-cached MIDI and RMF files are also supported.
+ * Neither compressed formats (DVI, GSM, MOD) nor A-law formated files are
+ * supported at this time, but they will be converted.
+ */
+
+public class SimpleSounds extends Applet {
+
+ private static URL[] url = new URL[3];
+ private SimpleUniverse u = null;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the subgraph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create the transform group node and initialize it to the identity.
+ // Enable the TRANSFORM_WRITE capability so that our behavior code
+ // can modify it at runtime. Add it to the root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // Create a simple shape leaf node and add it into the scene graph.
+ objTrans.addChild(new ColorCube(0.4));
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotation = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 20000, 0, 0,
+ 0, 0, 0);
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotation,
+ objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+ /*
+ * Create a sound node and add it to the scene graph
+ */
+ BackgroundSound sound1 = new BackgroundSound();
+ PointSound sound2 = new PointSound();
+ PointSound sound3 = new PointSound();
+ sound1.setCapability(PointSound.ALLOW_ENABLE_WRITE);
+ sound1.setCapability(PointSound.ALLOW_INITIAL_GAIN_WRITE);
+ sound1.setCapability(PointSound.ALLOW_SOUND_DATA_WRITE);
+ sound1.setCapability(PointSound.ALLOW_SCHEDULING_BOUNDS_WRITE);
+ sound1.setCapability(PointSound.ALLOW_CONT_PLAY_WRITE);
+ sound1.setCapability(PointSound.ALLOW_RELEASE_WRITE);
+ sound1.setCapability(PointSound.ALLOW_DURATION_READ);
+ sound1.setCapability(PointSound.ALLOW_IS_PLAYING_READ);
+ sound1.setCapability(PointSound.ALLOW_LOOP_WRITE);
+ sound2.setCapability(PointSound.ALLOW_ENABLE_WRITE);
+ sound2.setCapability(PointSound.ALLOW_INITIAL_GAIN_WRITE);
+ sound2.setCapability(PointSound.ALLOW_SOUND_DATA_WRITE);
+ sound2.setCapability(PointSound.ALLOW_SCHEDULING_BOUNDS_WRITE);
+ sound2.setCapability(PointSound.ALLOW_CONT_PLAY_WRITE);
+ sound2.setCapability(PointSound.ALLOW_RELEASE_WRITE);
+ sound2.setCapability(PointSound.ALLOW_DURATION_READ);
+ sound2.setCapability(PointSound.ALLOW_IS_PLAYING_READ);
+ sound2.setCapability(PointSound.ALLOW_POSITION_WRITE);
+ sound2.setCapability(PointSound.ALLOW_LOOP_WRITE);
+ sound3.setCapability(PointSound.ALLOW_ENABLE_WRITE);
+ sound3.setCapability(PointSound.ALLOW_INITIAL_GAIN_WRITE);
+ sound3.setCapability(PointSound.ALLOW_SOUND_DATA_WRITE);
+ sound3.setCapability(PointSound.ALLOW_SCHEDULING_BOUNDS_WRITE);
+ sound3.setCapability(PointSound.ALLOW_CONT_PLAY_WRITE);
+ sound3.setCapability(PointSound.ALLOW_RELEASE_WRITE);
+ sound3.setCapability(PointSound.ALLOW_DURATION_READ);
+ sound3.setCapability(PointSound.ALLOW_IS_PLAYING_READ);
+ sound3.setCapability(PointSound.ALLOW_POSITION_WRITE);
+
+ BoundingSphere soundBounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ sound1.setSchedulingBounds(soundBounds);
+ sound2.setSchedulingBounds(soundBounds);
+ sound3.setSchedulingBounds(soundBounds);
+ objTrans.addChild(sound1);
+ objTrans.addChild(sound2);
+ objTrans.addChild(sound3);
+
+
+ /*
+ * Create a new Behavior object that will play the sound
+ */
+ SimpleSoundsBehavior player = new SimpleSoundsBehavior(
+ sound1, sound2, sound3,
+ url[0], url[1], url[2], soundBounds);
+ player.setSchedulingBounds(soundBounds);
+ objTrans.addChild(player);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ public SimpleSounds() {
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+
+ url[0] = Resources.getResource("resources/audio/techno_machine.au");
+ if (url == null) {
+ System.err.println("resources/audio/techno_machine.au not found");
+ System.exit(1);
+ }
+
+ url[1] = Resources.getResource("resources/audio/hello_universe.au");
+ if (url == null) {
+ System.err.println("resources/audio/hello_universe.au not found");
+ System.exit(1);
+ }
+
+ url[2] = Resources.getResource("resources/audio/roar.au");
+ if (url == null) {
+ System.err.println("resources/audio/roar.au not found");
+ System.exit(1);
+ }
+
+ /*
+ * Create a simple scene and attach it to the virtual universe
+ */
+ u = new SimpleUniverse(c);
+ AudioDevice audioDev = u.getViewer().createAudioDevice();
+ BranchGroup scene = createSceneGraph();
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+
+ u.addBranchGraph(scene);
+
+ JOptionPane.showMessageDialog(this,
+ ("This program is still a work in progress.\n" +
+ "Please check back in Java 3D 1.5.\n"),
+ "Incomplete Work",
+ JOptionPane.INFORMATION_MESSAGE);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ /*
+ * The following allows SimpleSounds to be run as an application
+ * as well as an applet
+ */
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ new MainFrame(new SimpleSounds(), args, 256, 256);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sound/SimpleSoundsBehavior.java b/src/main/java/org/jdesktop/j3d/examples/sound/SimpleSoundsBehavior.java
new file mode 100644
index 0000000..3c7560e
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sound/SimpleSoundsBehavior.java
@@ -0,0 +1,187 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.sound;
+
+import java.net.URL;
+import java.util.Enumeration;
+
+import org.jogamp.java3d.BackgroundSound;
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.MediaContainer;
+import org.jogamp.java3d.PointSound;
+import org.jogamp.java3d.Sound;
+import org.jogamp.java3d.WakeupOnBehaviorPost;
+import org.jogamp.java3d.WakeupOnElapsedTime;
+import org.jogamp.vecmath.Point3f;
+
+// User defined audio behavior class
+public class SimpleSoundsBehavior extends Behavior {
+ WakeupOnElapsedTime wt;
+ WakeupOnBehaviorPost wp;
+ BackgroundSound sound1 = new BackgroundSound();
+ PointSound sound2 = new PointSound();
+ PointSound sound3 = new PointSound();
+ static int WAKEUP_SOUND = 0;
+ int soundIndex = 0;
+ URL URLName1;
+ URL URLName2;
+ URL URLName3;
+ BoundingSphere bounds;
+
+ // Override Behavior's initialize method to setup wakeup criteria
+ public void initialize() {
+ MediaContainer sample1 = new MediaContainer();
+ MediaContainer sample2 = new MediaContainer();
+ MediaContainer sample3 = new MediaContainer();
+ sample1.setCapability(MediaContainer.ALLOW_URL_WRITE);
+ sample1.setCapability(MediaContainer.ALLOW_URL_READ);
+ sample1.setURLObject(URLName1);
+ //sample1.setCacheEnable(false);
+ sound1.setLoop(0);
+ sound1.setContinuousEnable(false);
+ sound1.setReleaseEnable(false);
+ sound1.setSoundData(sample1);
+ sound1.setInitialGain(0.7f);
+ sample2.setCapability(MediaContainer.ALLOW_URL_WRITE);
+ sample2.setCapability(MediaContainer.ALLOW_URL_READ);
+ sample2.setURLObject(URLName2);
+ sound2.setLoop(Sound.INFINITE_LOOPS);
+ sound2.setContinuousEnable(false);
+ sound2.setReleaseEnable(false);
+ sound2.setSoundData(sample2);
+ sound2.setInitialGain(2.0f);
+ Point3f sound2Pos = new Point3f(-30.0f, 0.0f, 0.0f);
+ sound2.setPosition(sound2Pos);
+ sample3.setCapability(MediaContainer.ALLOW_URL_WRITE);
+ sample3.setCapability(MediaContainer.ALLOW_URL_READ);
+ sample3.setURLObject(URLName3);
+ sound3.setContinuousEnable(false);
+ sound3.setReleaseEnable(false);
+ sound3.setSoundData(sample3);
+ sound3.setInitialGain(4.0f);
+ Point3f sound3Pos = new Point3f(30.0f, 0.0f, 0.0f);
+ sound3.setPosition(sound3Pos);
+
+ wt = new WakeupOnElapsedTime(2000);
+ WakeupOnElapsedTime wp = new WakeupOnElapsedTime(5000);
+ wakeupOn(wp);
+ }
+
+ // Override Behavior's stimulus method to handle the event
+ public void processStimulus(Enumeration criteria) {
+
+ switch (soundIndex)
+ {
+ // Active
+ case 0:
+ // System.out.println("****Enable First Sound");
+ sound1.setEnable(true);
+ wakeupOn(wt);
+ break;
+ case 1:
+ // System.out.println("********Enable Second Sound");
+ sound2.setEnable(true);
+ wakeupOn(wt);
+ break;
+ case 2:
+ case 4:
+ case 6:
+ case 8:
+ case 10:
+ // System.out.println("************Enable Third Sound");
+ sound3.setEnable(true);
+ wakeupOn(wt);
+ break;
+ case 3:
+ case 5:
+ case 7:
+ case 9:
+ // System.out.println("************Disable Third Sound");
+ sound3.setEnable(false);
+ wakeupOn(wt);
+ break;
+
+ case 11:
+ // System.out.println("********Disable Second Sound");
+ sound2.setEnable(false) ;
+ wakeupOn(wt);
+ break;
+ case 12:
+ // System.out.println("****Disable First Sound");
+ sound1.setEnable(false) ;
+ System.out.println("SimpleSounds: test complete");
+ wt = new WakeupOnElapsedTime(400000);
+ wakeupOn(wt);
+ break;
+
+ default:
+ break;
+ }
+ soundIndex++;
+ }
+
+ //
+ // Constructor for rotation behavior.
+ // Parameters: sound node
+ // sample file name
+ // sound node's bounds
+ //
+ public SimpleSoundsBehavior(BackgroundSound sound1,
+ PointSound sound2,
+ PointSound sound3,
+ URL urlName1,
+ URL urlName2,
+ URL urlName3,
+ BoundingSphere soundBounds) {
+ this.sound1 = sound1;
+ this.sound2 = sound2;
+ this.sound3 = sound3;
+ this.URLName1 = urlName1;
+ this.URLName2 = urlName2;
+ this.URLName3 = urlName3;
+ this.bounds = (BoundingSphere)soundBounds.clone();
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotion.form b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotion.form
new file mode 100644
index 0000000..036d770
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotion.form
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="SphereMotion"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[700, 700]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotion.java b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotion.java
new file mode 100644
index 0000000..f98085b
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotion.java
@@ -0,0 +1,365 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.sphere_motion;
+
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Light;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointLight;
+import org.jogamp.java3d.PositionInterpolator;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.SpotLight;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class SphereMotion extends javax.swing.JFrame {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ // Constants for type of light to use
+ private static final int DIRECTIONAL_LIGHT = 0;
+ private static final int POINT_LIGHT = 1;
+ private static final int SPOT_LIGHT = 2;
+
+ // Flag indicates type of lights: directional, point, or spot
+ // lights. This flag is set based on command line argument
+ private static int lightType = POINT_LIGHT;
+
+ public BranchGroup createSceneGraph() {
+ Color3f eColor = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f sColor = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f objColor = new Color3f(0.6f, 0.6f, 0.6f);
+ Color3f lColor1 = new Color3f(1.0f, 0.0f, 0.0f);
+ Color3f lColor2 = new Color3f(0.0f, 1.0f, 0.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+
+ Transform3D t;
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // Set up the background
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objScale.addChild(bg);
+
+ // Create a Sphere object, generate one copy of the sphere,
+ // and add it into the scene graph.
+ Material m = new Material(objColor, eColor, objColor, sColor, 100.0f);
+ Appearance a = new Appearance();
+ m.setLightingEnable(true);
+ a.setMaterial(m);
+ Sphere sph = new Sphere(1.0f, Sphere.GENERATE_NORMALS, 80, a);
+ objScale.addChild(sph);
+
+ // Create the transform group node for the each light and initialize
+ // it to the identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add them to the root
+ // of the subgraph.
+ TransformGroup l1RotTrans = new TransformGroup();
+ l1RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l1RotTrans);
+
+ TransformGroup l2RotTrans = new TransformGroup();
+ l2RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l2RotTrans);
+
+ // Create transformations for the positional lights
+ t = new Transform3D();
+ Vector3d lPos1 = new Vector3d(0.0, 0.0, 2.0);
+ t.set(lPos1);
+ TransformGroup l1Trans = new TransformGroup(t);
+ l1RotTrans.addChild(l1Trans);
+
+ t = new Transform3D();
+ Vector3d lPos2 = new Vector3d(0.5, 0.8, 2.0);
+ t.set(lPos2);
+ TransformGroup l2Trans = new TransformGroup(t);
+ l2RotTrans.addChild(l2Trans);
+
+ // Create Geometry for point lights
+ ColoringAttributes caL1 = new ColoringAttributes();
+ ColoringAttributes caL2 = new ColoringAttributes();
+ caL1.setColor(lColor1);
+ caL2.setColor(lColor2);
+ Appearance appL1 = new Appearance();
+ Appearance appL2 = new Appearance();
+ appL1.setColoringAttributes(caL1);
+ appL2.setColoringAttributes(caL2);
+ l1Trans.addChild(new Sphere(0.05f, appL1));
+ l2Trans.addChild(new Sphere(0.05f, appL2));
+
+ // Create lights
+ AmbientLight aLgt = new AmbientLight(alColor);
+
+ Light lgt1 = null;
+ Light lgt2 = null;
+
+ Point3f lPoint = new Point3f(0.0f, 0.0f, 0.0f);
+ Point3f atten = new Point3f(1.0f, 0.0f, 0.0f);
+ Vector3f lDirect1 = new Vector3f(lPos1);
+ Vector3f lDirect2 = new Vector3f(lPos2);
+ lDirect1.negate();
+ lDirect2.negate();
+
+ switch (lightType) {
+ case DIRECTIONAL_LIGHT:
+ lgt1 = new DirectionalLight(lColor1, lDirect1);
+ lgt2 = new DirectionalLight(lColor2, lDirect2);
+ break;
+ case POINT_LIGHT:
+ lgt1 = new PointLight(lColor1, lPoint, atten);
+ lgt2 = new PointLight(lColor2, lPoint, atten);
+ break;
+ case SPOT_LIGHT:
+ lgt1 = new SpotLight(lColor1, lPoint, atten, lDirect1,
+ 25.0f * (float)Math.PI / 180.0f, 10.0f);
+ lgt2 = new SpotLight(lColor2, lPoint, atten, lDirect2,
+ 25.0f * (float)Math.PI / 180.0f, 10.0f);
+ break;
+ }
+
+ // Set the influencing bounds
+ aLgt.setInfluencingBounds(bounds);
+ lgt1.setInfluencingBounds(bounds);
+ lgt2.setInfluencingBounds(bounds);
+
+ // Add the lights into the scene graph
+ objScale.addChild(aLgt);
+ l1Trans.addChild(lgt1);
+ l2Trans.addChild(lgt2);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotor1Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+ RotationInterpolator rotator1 =
+ new RotationInterpolator(rotor1Alpha,
+ l1RotTrans,
+ yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator1.setSchedulingBounds(bounds);
+ l1RotTrans.addChild(rotator1);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Alpha rotor2Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 1000, 0, 0,
+ 0, 0, 0);
+ RotationInterpolator rotator2 =
+ new RotationInterpolator(rotor2Alpha,
+ l2RotTrans,
+ yAxis,
+ 0.0f, 0.0f);
+ bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ rotator2.setSchedulingBounds(bounds);
+ l2RotTrans.addChild(rotator2);
+
+ // Create a position interpolator and attach it to the view
+ // platform
+ TransformGroup vpTrans =
+ univ.getViewingPlatform().getViewPlatformTransform();
+ Transform3D axisOfTranslation = new Transform3D();
+ Alpha transAlpha = new Alpha(-1,
+ Alpha.INCREASING_ENABLE |
+ Alpha.DECREASING_ENABLE,
+ 0, 0,
+ 5000, 0, 0,
+ 5000, 0, 0);
+ axisOfTranslation.rotY(-Math.PI/2.0);
+ PositionInterpolator translator =
+ new PositionInterpolator(transAlpha,
+ vpTrans,
+ axisOfTranslation,
+ 2.0f, 3.5f);
+ translator.setSchedulingBounds(bounds);
+ objScale.addChild(translator);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse() {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form SphereMotion
+ */
+ public SphereMotion(final String[] args) {
+
+ // Parse the Input Arguments
+ String usage = "Usage: java SphereMotion [-point | -spot | -dir]";
+ for (int i = 0; i < args.length; i++) {
+ if (args[i].startsWith("-")) {
+ if (args[i].equals("-point")) {
+ System.out.println("Using point lights");
+ lightType = POINT_LIGHT;
+ }
+ else if (args[i].equals("-spot")) {
+ System.out.println("Using spot lights");
+ lightType = SPOT_LIGHT;
+ }
+ else if (args[i].equals("-dir")) {
+ System.out.println("Using directional lights");
+ lightType = DIRECTIONAL_LIGHT;
+ }
+ else {
+ System.out.println(usage);
+ System.exit(0);
+ }
+ }
+ else {
+ System.out.println(usage);
+ System.exit(0);
+ }
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("SphereMotion");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[]) {
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ SphereMotion sphereMotion = new SphereMotion(args);
+ sphereMotion.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotionGL2ES2.java b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotionGL2ES2.java
new file mode 100644
index 0000000..547c998
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotionGL2ES2.java
@@ -0,0 +1,363 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.sphere_motion;
+
+import java.awt.GraphicsConfiguration;
+import java.io.File;
+import java.io.IOException;
+
+import org.jdesktop.j3d.examples.gl2es2pipeline.SimpleShaderAppearance;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.Light;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointLight;
+import org.jogamp.java3d.PositionInterpolator;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.SpotLight;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class SphereMotionGL2ES2 extends javax.swing.JFrame
+{
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ // Constants for type of light to use
+ private static final int DIRECTIONAL_LIGHT = 0;
+ private static final int POINT_LIGHT = 1;
+ private static final int SPOT_LIGHT = 2;
+
+ // Flag indicates type of lights: directional, point, or spot
+ // lights. This flag is set based on command line argument
+ private static int lightType = POINT_LIGHT;
+
+ public BranchGroup createSceneGraph()
+ {
+ Color3f eColor = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f sColor = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f objColor = new Color3f(0.6f, 0.6f, 0.6f);
+ Color3f lColor1 = new Color3f(1.0f, 0.0f, 0.0f);
+ Color3f lColor2 = new Color3f(0.0f, 1.0f, 0.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+
+ Transform3D t;
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+
+ // Set up the background
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objScale.addChild(bg);
+
+ // Create a Sphere object, generate one copy of the sphere,
+ // and add it into the scene graph.
+ ShaderAppearance a = new ShaderAppearance();
+ Material m = new Material(objColor, eColor, objColor, sColor, 100.0f);
+ m.setLightingEnable(true);
+ String vertexProgram = null;
+ String fragmentProgram = null;
+ try
+ {
+ vertexProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2.vert"));
+ fragmentProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2.frag"));
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_VERTEX, vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_FRAGMENT, fragmentProgram);
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+ shaderProgram.setShaders(shaders);
+
+ a.setShaderProgram(shaderProgram);
+ a.setMaterial(m);
+ Sphere sph = new Sphere(1.0f, Sphere.GENERATE_NORMALS, 200, a);
+ objScale.addChild(sph);
+
+ // Create the transform group node for the each light and initialize
+ // it to the identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add them to the root
+ // of the subgraph.
+ TransformGroup l1RotTrans = new TransformGroup();
+ l1RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l1RotTrans);
+
+ TransformGroup l2RotTrans = new TransformGroup();
+ l2RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l2RotTrans);
+
+ // Create transformations for the positional lights
+ t = new Transform3D();
+ Vector3d lPos1 = new Vector3d(0.0, 0.0, 2.0);
+ t.set(lPos1);
+ TransformGroup l1Trans = new TransformGroup(t);
+ l1RotTrans.addChild(l1Trans);
+
+ t = new Transform3D();
+ Vector3d lPos2 = new Vector3d(0.5, 0.8, 2.0);
+ t.set(lPos2);
+ TransformGroup l2Trans = new TransformGroup(t);
+ l2RotTrans.addChild(l2Trans);
+
+ // Create Geometry for point lights
+ ColoringAttributes caL1 = new ColoringAttributes();
+ ColoringAttributes caL2 = new ColoringAttributes();
+ caL1.setColor(lColor1);
+ caL2.setColor(lColor2);
+ Appearance appL1 = new SimpleShaderAppearance(false, false);
+ Appearance appL2 = new SimpleShaderAppearance(false, false);
+ appL1.setColoringAttributes(caL1);
+ appL2.setColoringAttributes(caL2);
+ l1Trans.addChild(new Sphere(0.05f, appL1));
+ l2Trans.addChild(new Sphere(0.05f, appL2));
+
+ // Create lights
+ AmbientLight aLgt = new AmbientLight(alColor);
+
+ Light lgt1 = null;
+ Light lgt2 = null;
+
+ Point3f lPoint = new Point3f(0.0f, 0.0f, 0.0f);
+ Point3f atten = new Point3f(1.0f, 0.0f, 0.0f);
+ Vector3f lDirect1 = new Vector3f(lPos1);
+ Vector3f lDirect2 = new Vector3f(lPos2);
+ lDirect1.negate();
+ lDirect2.negate();
+
+ switch (lightType)
+ {
+ case DIRECTIONAL_LIGHT:
+ lgt1 = new DirectionalLight(lColor1, lDirect1);
+ lgt2 = new DirectionalLight(lColor2, lDirect2);
+ break;
+ case POINT_LIGHT:
+ lgt1 = new PointLight(lColor1, lPoint, atten);
+ lgt2 = new PointLight(lColor2, lPoint, atten);
+ break;
+ case SPOT_LIGHT:
+ lgt1 = new SpotLight(lColor1, lPoint, atten, lDirect1, 25.0f * (float) Math.PI / 180.0f, 10.0f);
+ lgt2 = new SpotLight(lColor2, lPoint, atten, lDirect2, 25.0f * (float) Math.PI / 180.0f, 10.0f);
+ break;
+ }
+
+ // Set the influencing bounds
+ aLgt.setInfluencingBounds(bounds);
+ lgt1.setInfluencingBounds(bounds);
+ lgt2.setInfluencingBounds(bounds);
+
+ // Add the lights into the scene graph
+ objScale.addChild(aLgt);
+ l1Trans.addChild(lgt1);
+ l2Trans.addChild(lgt2);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotor1Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 4000, 0, 0, 0, 0, 0);
+ RotationInterpolator rotator1 = new RotationInterpolator(rotor1Alpha, l1RotTrans, yAxis, 0.0f, (float) Math.PI * 2.0f);
+ rotator1.setSchedulingBounds(bounds);
+ l1RotTrans.addChild(rotator1);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Alpha rotor2Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 1000, 0, 0, 0, 0, 0);
+ RotationInterpolator rotator2 = new RotationInterpolator(rotor2Alpha, l2RotTrans, yAxis, 0.0f, 0.0f);
+ bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ rotator2.setSchedulingBounds(bounds);
+ l2RotTrans.addChild(rotator2);
+
+ // Create a position interpolator and attach it to the view
+ // platform
+ TransformGroup vpTrans = univ.getViewingPlatform().getViewPlatformTransform();
+ Transform3D axisOfTranslation = new Transform3D();
+ Alpha transAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE, 0, 0, 5000, 0, 0, 5000, 0, 0);
+ axisOfTranslation.rotY(-Math.PI / 2.0);
+ PositionInterpolator translator = new PositionInterpolator(transAlpha, vpTrans, axisOfTranslation, 2.0f, 3.5f);
+ translator.setSchedulingBounds(bounds);
+ objScale.addChild(translator);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse()
+ {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form SphereMotion
+ */
+ public SphereMotionGL2ES2(final String[] args)
+ {
+
+ // Parse the Input Arguments
+ String usage = "Usage: java SphereMotion [-point | -spot | -dir]";
+ for (int i = 0; i < args.length; i++)
+ {
+ if (args[i].startsWith("-"))
+ {
+ if (args[i].equals("-point"))
+ {
+ System.out.println("Using point lights");
+ lightType = POINT_LIGHT;
+ }
+ else if (args[i].equals("-spot"))
+ {
+ System.out.println("Using spot lights");
+ lightType = SPOT_LIGHT;
+ }
+ else if (args[i].equals("-dir"))
+ {
+ System.out.println("Using directional lights");
+ lightType = DIRECTIONAL_LIGHT;
+ }
+ else
+ {
+ System.out.println(usage);
+ System.exit(0);
+ }
+ }
+ else
+ {
+ System.out.println(usage);
+ System.exit(0);
+ }
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("SphereMotionGL2ES2");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[])
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend", "jogl2es2");
+ System.setProperty("j3d.displaylist", "false");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
+ public void run()
+ {
+ SphereMotionGL2ES2 sphereMotion = new SphereMotionGL2ES2(args);
+ sphereMotion.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotionGL2ES3_Texture.java b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotionGL2ES3_Texture.java
new file mode 100644
index 0000000..a1cee22
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotionGL2ES3_Texture.java
@@ -0,0 +1,376 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+package org.jdesktop.j3d.examples.sphere_motion;
+
+import java.awt.GraphicsConfiguration;
+import java.io.File;
+import java.io.IOException;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jdesktop.j3d.examples.gl2es2pipeline.SimpleShaderAppearance;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.Light;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointLight;
+import org.jogamp.java3d.PositionInterpolator;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderAttributeSet;
+import org.jogamp.java3d.ShaderAttributeValue;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.SpotLight;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class SphereMotionGL2ES3_Texture extends javax.swing.JFrame
+{
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ // Constants for type of light to use
+ private static final int DIRECTIONAL_LIGHT = 0;
+ private static final int POINT_LIGHT = 1;
+ private static final int SPOT_LIGHT = 2;
+
+ // Flag indicates type of lights: directional, point, or spot
+ // lights. This flag is set based on command line argument
+ private static int lightType = POINT_LIGHT;
+
+ public BranchGroup createSceneGraph()
+ {
+ Color3f eColor = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f sColor = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f objColor = new Color3f(0.6f, 0.6f, 0.6f);
+ Color3f lColor1 = new Color3f(1.0f, 0.0f, 0.0f);
+ Color3f lColor2 = new Color3f(0.0f, 1.0f, 0.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+
+ Transform3D t;
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+
+ // Set up the background
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objScale.addChild(bg);
+
+ // Create a Sphere object, generate one copy of the sphere,
+ // and add it into the scene graph.
+ ShaderAppearance a = new ShaderAppearance();
+ Material m = new Material(objColor, eColor, objColor, sColor, 100.0f);
+ m.setLightingEnable(true);
+ String vertexProgram = null;
+ String fragmentProgram = null;
+ try
+ {
+ vertexProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2_texture.vert"));
+ fragmentProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2_texture.frag"));
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_VERTEX, vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_FRAGMENT, fragmentProgram);
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+ shaderProgram.setShaders(shaders);
+ shaderProgram.setShaderAttrNames(new String[] { "BaseMap" });
+
+ a.setShaderProgram(shaderProgram);
+
+ ShaderAttributeSet shaderAttributeSet = new ShaderAttributeSet();
+ shaderAttributeSet.put(new ShaderAttributeValue("BaseMap", new Integer(0)));
+ a.setShaderAttributeSet(shaderAttributeSet);
+
+
+ a.setMaterial(m);
+ Texture txtr = new TextureLoader(Resources.getResource("resources/images/earth.jpg"), this).getTexture();
+ a.setTexture(txtr);
+ Sphere sph = new Sphere(1.0f, Sphere.GENERATE_NORMALS | Sphere.GENERATE_TEXTURE_COORDS, 200, a);
+ objScale.addChild(sph);
+
+ // Create the transform group node for the each light and initialize
+ // it to the identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add them to the root
+ // of the subgraph.
+ TransformGroup l1RotTrans = new TransformGroup();
+ l1RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l1RotTrans);
+
+ TransformGroup l2RotTrans = new TransformGroup();
+ l2RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l2RotTrans);
+
+ // Create transformations for the positional lights
+ t = new Transform3D();
+ Vector3d lPos1 = new Vector3d(0.0, 0.0, 2.0);
+ t.set(lPos1);
+ TransformGroup l1Trans = new TransformGroup(t);
+ l1RotTrans.addChild(l1Trans);
+
+ t = new Transform3D();
+ Vector3d lPos2 = new Vector3d(0.5, 0.8, 2.0);
+ t.set(lPos2);
+ TransformGroup l2Trans = new TransformGroup(t);
+ l2RotTrans.addChild(l2Trans);
+
+ // Create Geometry for point lights
+ ColoringAttributes caL1 = new ColoringAttributes();
+ ColoringAttributes caL2 = new ColoringAttributes();
+ caL1.setColor(lColor1);
+ caL2.setColor(lColor2);
+ Appearance appL1 = new SimpleShaderAppearance(false, false);
+ Appearance appL2 = new SimpleShaderAppearance(false, false);
+ appL1.setColoringAttributes(caL1);
+ appL2.setColoringAttributes(caL2);
+ l1Trans.addChild(new Sphere(0.05f, appL1));
+ l2Trans.addChild(new Sphere(0.05f, appL2));
+
+ // Create lights
+ AmbientLight aLgt = new AmbientLight(alColor);
+
+ Light lgt1 = null;
+ Light lgt2 = null;
+
+ Point3f lPoint = new Point3f(0.0f, 0.0f, 0.0f);
+ Point3f atten = new Point3f(1.0f, 0.0f, 0.0f);
+ Vector3f lDirect1 = new Vector3f(lPos1);
+ Vector3f lDirect2 = new Vector3f(lPos2);
+ lDirect1.negate();
+ lDirect2.negate();
+
+ switch (lightType)
+ {
+ case DIRECTIONAL_LIGHT:
+ lgt1 = new DirectionalLight(lColor1, lDirect1);
+ lgt2 = new DirectionalLight(lColor2, lDirect2);
+ break;
+ case POINT_LIGHT:
+ lgt1 = new PointLight(lColor1, lPoint, atten);
+ lgt2 = new PointLight(lColor2, lPoint, atten);
+ break;
+ case SPOT_LIGHT:
+ lgt1 = new SpotLight(lColor1, lPoint, atten, lDirect1, 25.0f * (float) Math.PI / 180.0f, 10.0f);
+ lgt2 = new SpotLight(lColor2, lPoint, atten, lDirect2, 25.0f * (float) Math.PI / 180.0f, 10.0f);
+ break;
+ }
+
+ // Set the influencing bounds
+ aLgt.setInfluencingBounds(bounds);
+ lgt1.setInfluencingBounds(bounds);
+ lgt2.setInfluencingBounds(bounds);
+
+ // Add the lights into the scene graph
+ objScale.addChild(aLgt);
+ l1Trans.addChild(lgt1);
+ l2Trans.addChild(lgt2);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotor1Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 4000, 0, 0, 0, 0, 0);
+ RotationInterpolator rotator1 = new RotationInterpolator(rotor1Alpha, l1RotTrans, yAxis, 0.0f, (float) Math.PI * 2.0f);
+ rotator1.setSchedulingBounds(bounds);
+ l1RotTrans.addChild(rotator1);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Alpha rotor2Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 1000, 0, 0, 0, 0, 0);
+ RotationInterpolator rotator2 = new RotationInterpolator(rotor2Alpha, l2RotTrans, yAxis, 0.0f, 0.0f);
+ bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ rotator2.setSchedulingBounds(bounds);
+ l2RotTrans.addChild(rotator2);
+
+ // Create a position interpolator and attach it to the view
+ // platform
+ TransformGroup vpTrans = univ.getViewingPlatform().getViewPlatformTransform();
+ Transform3D axisOfTranslation = new Transform3D();
+ Alpha transAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE, 0, 0, 5000, 0, 0, 5000, 0, 0);
+ axisOfTranslation.rotY(-Math.PI / 2.0);
+ PositionInterpolator translator = new PositionInterpolator(transAlpha, vpTrans, axisOfTranslation, 2.0f, 3.5f);
+ translator.setSchedulingBounds(bounds);
+ objScale.addChild(translator);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse()
+ {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form SphereMotion
+ */
+ public SphereMotionGL2ES3_Texture(final String[] args)
+ {
+
+ // Parse the Input Arguments
+ String usage = "Usage: java SphereMotion [-point | -spot | -dir]";
+ for (int i = 0; i < args.length; i++)
+ {
+ if (args[i].startsWith("-"))
+ {
+ if (args[i].equals("-point"))
+ {
+ System.out.println("Using point lights");
+ lightType = POINT_LIGHT;
+ }
+ else if (args[i].equals("-spot"))
+ {
+ System.out.println("Using spot lights");
+ lightType = SPOT_LIGHT;
+ }
+ else if (args[i].equals("-dir"))
+ {
+ System.out.println("Using directional lights");
+ lightType = DIRECTIONAL_LIGHT;
+ }
+ else
+ {
+ System.out.println(usage);
+ System.exit(0);
+ }
+ }
+ else
+ {
+ System.out.println(usage);
+ System.exit(0);
+ }
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("SphereMotionGL2ES2_Texture");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[])
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ System.setProperty("j3d.rend", "jogl2es2");
+ System.setProperty("j3d.displaylist", "false");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
+ public void run()
+ {
+ SphereMotionGL2ES3_Texture sphereMotion = new SphereMotionGL2ES3_Texture(args);
+ sphereMotion.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotionGLSL_FFP.java b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotionGLSL_FFP.java
new file mode 100644
index 0000000..ce1fdc0
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/SphereMotionGLSL_FFP.java
@@ -0,0 +1,361 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.sphere_motion;
+
+import java.awt.GraphicsConfiguration;
+import java.io.File;
+import java.io.IOException;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GLSLShaderProgram;
+import org.jogamp.java3d.Light;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.PointLight;
+import org.jogamp.java3d.PositionInterpolator;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shader;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.SourceCodeShader;
+import org.jogamp.java3d.SpotLight;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.shader.StringIO;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class SphereMotionGLSL_FFP extends javax.swing.JFrame
+{
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ // Constants for type of light to use
+ private static final int DIRECTIONAL_LIGHT = 0;
+ private static final int POINT_LIGHT = 1;
+ private static final int SPOT_LIGHT = 2;
+
+ // Flag indicates type of lights: directional, point, or spot
+ // lights. This flag is set based on command line argument
+ private static int lightType = POINT_LIGHT;
+
+ public BranchGroup createSceneGraph()
+ {
+ Color3f eColor = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f sColor = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f objColor = new Color3f(0.6f, 0.6f, 0.6f);
+ Color3f lColor1 = new Color3f(1.0f, 0.0f, 0.0f);
+ Color3f lColor2 = new Color3f(0.0f, 1.0f, 0.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
+
+ Transform3D t;
+
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create a bounds for the background and lights
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+
+ // Set up the background
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ objScale.addChild(bg);
+
+ // Create a Sphere object, generate one copy of the sphere,
+ // and add it into the scene graph.
+ ShaderAppearance a = new ShaderAppearance();
+ Material m = new Material(objColor, eColor, objColor, sColor, 100.0f);
+ m.setLightingEnable(true);
+ String vertexProgram = null;
+ String fragmentProgram = null;
+ try
+ {
+ vertexProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/sphere_motion/phong_ffp.vert"));
+ fragmentProgram = StringIO.readFully(
+ new File(System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/sphere_motion/phong_ffp.frag"));
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_VERTEX, vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_FRAGMENT, fragmentProgram);
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+ shaderProgram.setShaders(shaders);
+
+ a.setShaderProgram(shaderProgram);
+ a.setMaterial(m);
+ Sphere sph = new Sphere(1.0f, Sphere.GENERATE_NORMALS, 200, a);
+ objScale.addChild(sph);
+
+ // Create the transform group node for the each light and initialize
+ // it to the identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add them to the root
+ // of the subgraph.
+ TransformGroup l1RotTrans = new TransformGroup();
+ l1RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l1RotTrans);
+
+ TransformGroup l2RotTrans = new TransformGroup();
+ l2RotTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objScale.addChild(l2RotTrans);
+
+ // Create transformations for the positional lights
+ t = new Transform3D();
+ Vector3d lPos1 = new Vector3d(0.0, 0.0, 2.0);
+ t.set(lPos1);
+ TransformGroup l1Trans = new TransformGroup(t);
+ l1RotTrans.addChild(l1Trans);
+
+ t = new Transform3D();
+ Vector3d lPos2 = new Vector3d(0.5, 0.8, 2.0);
+ t.set(lPos2);
+ TransformGroup l2Trans = new TransformGroup(t);
+ l2RotTrans.addChild(l2Trans);
+
+ // Create Geometry for point lights
+ ColoringAttributes caL1 = new ColoringAttributes();
+ ColoringAttributes caL2 = new ColoringAttributes();
+ caL1.setColor(lColor1);
+ caL2.setColor(lColor2);
+ Appearance appL1 = new Appearance();
+ Appearance appL2 = new Appearance();
+ appL1.setColoringAttributes(caL1);
+ appL2.setColoringAttributes(caL2);
+ l1Trans.addChild(new Sphere(0.05f, appL1));
+ l2Trans.addChild(new Sphere(0.05f, appL2));
+
+ // Create lights
+ AmbientLight aLgt = new AmbientLight(alColor);
+
+ Light lgt1 = null;
+ Light lgt2 = null;
+
+ Point3f lPoint = new Point3f(0.0f, 0.0f, 0.0f);
+ Point3f atten = new Point3f(1.0f, 0.0f, 0.0f);
+ Vector3f lDirect1 = new Vector3f(lPos1);
+ Vector3f lDirect2 = new Vector3f(lPos2);
+ lDirect1.negate();
+ lDirect2.negate();
+
+ switch (lightType)
+ {
+ case DIRECTIONAL_LIGHT:
+ lgt1 = new DirectionalLight(lColor1, lDirect1);
+ lgt2 = new DirectionalLight(lColor2, lDirect2);
+ break;
+ case POINT_LIGHT:
+ lgt1 = new PointLight(lColor1, lPoint, atten);
+ lgt2 = new PointLight(lColor2, lPoint, atten);
+ break;
+ case SPOT_LIGHT:
+ lgt1 = new SpotLight(lColor1, lPoint, atten, lDirect1, 25.0f * (float) Math.PI / 180.0f, 10.0f);
+ lgt2 = new SpotLight(lColor2, lPoint, atten, lDirect2, 25.0f * (float) Math.PI / 180.0f, 10.0f);
+ break;
+ }
+
+ // Set the influencing bounds
+ aLgt.setInfluencingBounds(bounds);
+ lgt1.setInfluencingBounds(bounds);
+ lgt2.setInfluencingBounds(bounds);
+
+ // Add the lights into the scene graph
+ objScale.addChild(aLgt);
+ l1Trans.addChild(lgt1);
+ l2Trans.addChild(lgt2);
+
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotor1Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 4000, 0, 0, 0, 0, 0);
+ RotationInterpolator rotator1 = new RotationInterpolator(rotor1Alpha, l1RotTrans, yAxis, 0.0f, (float) Math.PI * 2.0f);
+ rotator1.setSchedulingBounds(bounds);
+ l1RotTrans.addChild(rotator1);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into the
+ // scene graph.
+ Alpha rotor2Alpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 1000, 0, 0, 0, 0, 0);
+ RotationInterpolator rotator2 = new RotationInterpolator(rotor2Alpha, l2RotTrans, yAxis, 0.0f, 0.0f);
+ bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ rotator2.setSchedulingBounds(bounds);
+ l2RotTrans.addChild(rotator2);
+
+ // Create a position interpolator and attach it to the view
+ // platform
+ TransformGroup vpTrans = univ.getViewingPlatform().getViewPlatformTransform();
+ Transform3D axisOfTranslation = new Transform3D();
+ Alpha transAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE, 0, 0, 5000, 0, 0, 5000, 0, 0);
+ axisOfTranslation.rotY(-Math.PI / 2.0);
+ PositionInterpolator translator = new PositionInterpolator(transAlpha, vpTrans, axisOfTranslation, 2.0f, 3.5f);
+ translator.setSchedulingBounds(bounds);
+ objScale.addChild(translator);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse()
+ {
+ // Get the preferred graphics configuration for the default screen
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D c = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form SphereMotion
+ */
+ public SphereMotionGLSL_FFP(final String[] args)
+ {
+
+ // Parse the Input Arguments
+ String usage = "Usage: java SphereMotion [-point | -spot | -dir]";
+ for (int i = 0; i < args.length; i++)
+ {
+ if (args[i].startsWith("-"))
+ {
+ if (args[i].equals("-point"))
+ {
+ System.out.println("Using point lights");
+ lightType = POINT_LIGHT;
+ }
+ else if (args[i].equals("-spot"))
+ {
+ System.out.println("Using spot lights");
+ lightType = SPOT_LIGHT;
+ }
+ else if (args[i].equals("-dir"))
+ {
+ System.out.println("Using directional lights");
+ lightType = DIRECTIONAL_LIGHT;
+ }
+ else
+ {
+ System.out.println(usage);
+ System.exit(0);
+ }
+ }
+ else
+ {
+ System.out.println(usage);
+ System.exit(0);
+ }
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("SphereMotionGLSL_FFP");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[])
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
+ public void run()
+ {
+ SphereMotionGLSL_FFP sphereMotion = new SphereMotionGLSL_FFP(args);
+ sphereMotion.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_ffp.frag b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_ffp.frag
new file mode 100644
index 0000000..ba72696
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_ffp.frag
@@ -0,0 +1,66 @@
+#version 120
+
+// Per-pixel normal (input from vertex shader)
+varying vec3 normalDirection;
+varying vec3 viewDirection;
+varying vec4 position;
+
+const int numberOfLights = 2;
+
+void main()
+{
+ vec3 lightDirection;
+ float attenuation;
+
+ // initialize total lighting with ambient lighting
+ vec3 totalLighting = vec3(gl_FrontMaterial.emission) + (vec3(gl_LightModel.ambient) * vec3(gl_FrontMaterial.ambient));
+
+ for (int index = 0; index < numberOfLights; index++) // for all light sources
+ {
+ if (0.0 == gl_LightSource[index].position.w) // directional light?
+ {
+ attenuation = 1.0; // no attenuation
+ lightDirection = normalize(vec3(gl_LightSource[index].position));
+ }
+ else // point light or spotlight (or other kind of light)
+ {
+ vec3 positionToLightSource = vec3(gl_LightSource[index].position - position);
+ float distance = length(positionToLightSource);
+ lightDirection = normalize(positionToLightSource);
+ attenuation = 1.0 / (gl_LightSource[index].constantAttenuation
+ + gl_LightSource[index].linearAttenuation * distance
+ + gl_LightSource[index].quadraticAttenuation * distance * distance);
+
+
+ if (gl_LightSource[index].spotCutoff <= 90.0) // spotlight?
+ {
+ float clampedCosine = max(0.0, dot(-lightDirection, normalize(gl_LightSource[index].spotDirection)));
+ if (clampedCosine < cos(radians(gl_LightSource[index].spotCutoff))) // outside of spotlight cone?
+ {
+ attenuation = 0.0;
+ }
+ else
+ {
+ attenuation = attenuation * pow(clampedCosine, gl_LightSource[index].spotExponent);
+ }
+ }
+ }
+
+ vec3 diffuseReflection = attenuation * vec3(gl_LightSource[index].diffuse) * vec3(gl_FrontMaterial.diffuse)* max(0.0, dot(normalDirection, lightDirection));
+
+ vec3 specularReflection;
+ if (dot(normalDirection, lightDirection) < 0.0) // light source on the wrong side?
+ {
+ specularReflection = vec3(0.0, 0.0, 0.0); // no specular reflection
+ }
+ else // light source on the right side
+ {
+ specularReflection = attenuation * vec3(gl_LightSource[index].specular) * vec3(gl_FrontMaterial.specular)
+ * pow(max(0.0, dot(reflect(-lightDirection, normalDirection), viewDirection)), gl_FrontMaterial.shininess);
+ }
+
+ totalLighting = totalLighting + diffuseReflection + specularReflection;
+ }
+
+ gl_FragColor = vec4(totalLighting, 1.0);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_ffp.vert b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_ffp.vert
new file mode 100644
index 0000000..caf1732
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_ffp.vert
@@ -0,0 +1,19 @@
+
+
+// A GLSL vertex program for doing Phone shading (per-fragment lighting)
+
+// Per-pixel normal (output to fragment shader)
+varying vec3 normalDirection;
+varying vec3 viewDirection;
+varying vec4 position;
+
+void main()
+{
+ normalDirection = normalize(vec3(gl_NormalMatrix * gl_Normal));
+ vec3 v = vec3(gl_ModelViewMatrix * gl_Vertex);
+ viewDirection = normalize(-v.xyz);
+ position = vec4(v,1);
+
+ // Transform the vertex
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2.frag b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2.frag
new file mode 100644
index 0000000..af65808
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2.frag
@@ -0,0 +1,96 @@
+#version 120
+
+// Per-pixel normal (input from vertex shader)
+varying vec3 normalDirection;
+varying vec3 viewDirection;
+varying vec4 position;
+
+uniform vec4 glLightModelambient;
+
+
+struct material
+{
+ int lightEnabled;
+ vec4 ambient;
+ vec4 diffuse;
+ vec4 emission;// note vec4 extra 1.0 sent through for ease
+ vec3 specular;
+ float shininess;
+};
+uniform material glFrontMaterial;
+
+struct lightSource
+{
+ int enabled;
+ vec4 position;
+ vec4 diffuse;
+ vec4 specular;
+ float constantAttenuation, linearAttenuation, quadraticAttenuation;
+ float spotCutoff, spotExponent;
+ vec3 spotDirection;
+};
+
+uniform int numberOfLights;
+const int maxLights = 2;
+uniform lightSource glLightSource[maxLights];
+
+void main()
+{
+ vec3 lightDirection;
+ float attenuation;
+
+ // initialize total lighting with ambient lighting
+ vec3 totalLighting = vec3(glFrontMaterial.emission) + (vec3(glLightModelambient) * vec3(glFrontMaterial.ambient));
+
+ for (int index = 0; index < numberOfLights; index++) // for all light sources
+ {
+ if(glLightSource[index].enabled == 1)
+ {
+ if (0.0 == glLightSource[index].position.w) // directional light?
+ {
+ attenuation = 1.0; // no attenuation
+ lightDirection = normalize(vec3(glLightSource[index].position));
+
+ }
+ else // point light or spotlight (or other kind of light)
+ {
+ vec3 positionToLightSource = vec3(glLightSource[index].position - position);
+ float distance = length(positionToLightSource);
+ lightDirection = normalize(positionToLightSource);
+ attenuation = 1.0 / (glLightSource[index].constantAttenuation
+ + glLightSource[index].linearAttenuation * distance
+ + glLightSource[index].quadraticAttenuation * distance * distance);
+
+ if (glLightSource[index].spotCutoff <= 90.0) // spotlight?
+ {
+ float clampedCosine = max(0.0, dot(-lightDirection, normalize(glLightSource[index].spotDirection)));
+ if (clampedCosine < cos(radians(glLightSource[index].spotCutoff))) // outside of spotlight cone?
+ {
+ attenuation = 0.0;
+ }
+ else
+ {
+ attenuation = attenuation * pow(clampedCosine, glLightSource[index].spotExponent);
+ }
+ }
+ }
+
+ vec3 diffuseReflection = attenuation * vec3(glLightSource[index].diffuse) * vec3(glFrontMaterial.diffuse)* max(0.0, dot(normalDirection, lightDirection));
+
+ vec3 specularReflection;
+ if (dot(normalDirection, lightDirection) < 0.0) // light source on the wrong side?
+ {
+ specularReflection = vec3(0.0, 0.0, 0.0); // no specular reflection
+ }
+ else // light source on the right side
+ {
+ specularReflection = attenuation * vec3(glLightSource[index].specular) * vec3(glFrontMaterial.specular)
+ * pow(max(0.0, dot(reflect(-lightDirection, normalDirection), viewDirection)), glFrontMaterial.shininess);
+ }
+
+ totalLighting = totalLighting + diffuseReflection + specularReflection;
+ }
+ }
+
+ gl_FragColor = vec4(totalLighting, 1.0);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2.vert b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2.vert
new file mode 100644
index 0000000..4d8fb67
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2.vert
@@ -0,0 +1,31 @@
+// GL2ES2: Java3D built-in attributes, these are calculated and passsed in if declared here
+attribute vec4 glVertex;
+attribute vec3 glNormal;
+
+// GL2ES2: Java3D built-in uniforms, these are calculated and passsed in if declared here
+uniform mat4 glModelViewProjectionMatrix;
+uniform mat4 glModelViewMatrix;
+uniform mat3 glNormalMatrix;
+
+
+// Per-pixel normal (output to fragment shader)
+varying vec3 normalDirection;
+varying vec3 viewDirection;
+varying vec4 position;
+
+void main()
+{
+ normalDirection = normalize(vec3(glNormalMatrix * glNormal));
+ vec3 v = vec3(glModelViewMatrix * glVertex);
+ viewDirection = normalize(-v.xyz);
+ position = vec4(v,1);
+
+ // Transform the vertex
+ gl_Position = glModelViewProjectionMatrix * glVertex;
+}
+
+
+
+
+
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2_texture.frag b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2_texture.frag
new file mode 100644
index 0000000..2b1a258
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2_texture.frag
@@ -0,0 +1,105 @@
+#version 120
+
+// Per-pixel normal (input from vertex shader)
+varying vec3 normalDirection;
+varying vec3 viewDirection;
+varying vec4 position;
+
+varying vec2 glTexCoord0;
+uniform sampler2D BaseMap;
+
+uniform vec4 glLightModelambient;
+
+
+struct material
+{
+ int lightEnabled;
+ vec4 ambient;
+ vec4 diffuse;
+ vec4 emission;
+ vec3 specular;
+ float shininess;
+};
+uniform material glFrontMaterial;
+
+struct lightSource
+{
+ int enabled;
+ vec4 position;
+ vec4 diffuse;
+ vec4 specular;
+ float constantAttenuation, linearAttenuation, quadraticAttenuation;
+ float spotCutoff, spotExponent;
+ vec3 spotDirection;
+};
+
+uniform int numberOfLights;
+const int maxLights = 2;
+uniform lightSource glLightSource[maxLights];
+
+void main()
+{
+ vec4 baseMap = texture2D( BaseMap, glTexCoord0.st );
+
+ vec3 lightDirection;
+ float attenuation;
+
+ // initialize total lighting with ambient lighting
+ vec3 totalDiffuseLighting = vec3(glFrontMaterial.emission) + (vec3(glLightModelambient) * vec3(glFrontMaterial.ambient));
+ vec3 totalSpecularLighting;
+
+ for (int index = 0; index < numberOfLights; index++) // for all light sources
+ {
+ if(glLightSource[index].enabled == 1)
+ {
+ if (0.0 == glLightSource[index].position.w) // directional light?
+ {
+ attenuation = 1.0; // no attenuation
+ lightDirection = normalize(vec3(glLightSource[index].position));
+
+ }
+ else // point light or spotlight (or other kind of light)
+ {
+ vec3 positionToLightSource = vec3(glLightSource[index].position - position);
+ float distance = length(positionToLightSource);
+ lightDirection = normalize(positionToLightSource);
+ attenuation = 1.0 / (glLightSource[index].constantAttenuation
+ + glLightSource[index].linearAttenuation * distance
+ + glLightSource[index].quadraticAttenuation * distance * distance);
+
+ if (glLightSource[index].spotCutoff <= 90.0) // spotlight?
+ {
+ float clampedCosine = max(0.0, dot(-lightDirection, normalize(glLightSource[index].spotDirection)));
+ if (clampedCosine < cos(radians(glLightSource[index].spotCutoff))) // outside of spotlight cone?
+ {
+ attenuation = 0.0;
+ }
+ else
+ {
+ attenuation = attenuation * pow(clampedCosine, glLightSource[index].spotExponent);
+ }
+ }
+ }
+
+ vec3 diffuseReflection = attenuation * vec3(glLightSource[index].diffuse) * vec3(glFrontMaterial.diffuse)* max(0.0, dot(normalDirection, lightDirection));
+
+ vec3 specularReflection;
+ if (dot(normalDirection, lightDirection) < 0.0) // light source on the wrong side?
+ {
+ specularReflection = vec3(0.0, 0.0, 0.0); // no specular reflection
+ }
+ else // light source on the right side
+ {
+ specularReflection = attenuation * vec3(glLightSource[index].specular) * vec3(glFrontMaterial.specular)
+ * pow(max(0.0, dot(reflect(-lightDirection, normalDirection), viewDirection)), glFrontMaterial.shininess);
+ }
+
+ totalDiffuseLighting = totalDiffuseLighting + diffuseReflection;
+ totalSpecularLighting = totalSpecularLighting + specularReflection;
+ }
+ }
+
+ totalDiffuseLighting = totalDiffuseLighting * baseMap.rgb;
+
+ gl_FragColor = vec4(totalDiffuseLighting + totalSpecularLighting, 1.0);
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2_texture.vert b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2_texture.vert
new file mode 100644
index 0000000..7e492e3
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/sphere_motion/phong_gl2es2_texture.vert
@@ -0,0 +1,35 @@
+// GL2ES2: Java3D built-in attributes, these are calculated and passsed in if declared here
+attribute vec4 glVertex;
+attribute vec3 glNormal;
+attribute vec2 glMultiTexCoord0;
+
+// GL2ES2: Java3D built-in uniforms, these are calculated and passsed in if declared here
+uniform mat4 glModelViewProjectionMatrix;
+uniform mat4 glModelViewMatrix;
+uniform mat3 glNormalMatrix;
+
+
+// Per-pixel normal (output to fragment shader)
+varying vec3 normalDirection;
+varying vec3 viewDirection;
+varying vec4 position;
+
+varying vec2 glTexCoord0;
+
+void main()
+{
+ normalDirection = normalize(vec3(glNormalMatrix * glNormal));
+ vec3 v = vec3(glModelViewMatrix * glVertex);
+ viewDirection = normalize(-v.xyz);
+ position = vec4(v,1);
+ glTexCoord0 = glMultiTexCoord0.st;
+
+ // Transform the vertex
+ gl_Position = glModelViewProjectionMatrix * glVertex;
+}
+
+
+
+
+
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/spline_anim/SplineAnim.java b/src/main/java/org/jdesktop/j3d/examples/spline_anim/SplineAnim.java
new file mode 100644
index 0000000..4b4d28f
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/spline_anim/SplineAnim.java
@@ -0,0 +1,631 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.spline_anim;
+
+import java.applet.Applet;
+import java.awt.Button;
+import java.awt.Choice;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.GraphicsConfiguration;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.ItemSelectable;
+import java.awt.Label;
+import java.awt.Panel;
+import java.awt.Scrollbar;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.AdjustmentEvent;
+import java.awt.event.AdjustmentListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Light;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.behaviors.interpolators.KBKeyFrame;
+import org.jogamp.java3d.utils.behaviors.interpolators.KBRotPosScaleSplinePathInterpolator;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.geometry.Cone;
+import org.jogamp.java3d.utils.geometry.Sphere;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3d;
+import org.jogamp.vecmath.Vector3f;
+
+
+
+/*
+ * This program demonstrates the use of KBRotPosScaleSplinePathInterpolator
+ * in order to to do spline animation paths using Kochanek-Bartels (also
+ * known as TCB or Tension-Continuity-Bias ) splines. A cone red cone
+ * is animated along a spline path specified by 5 knot points, which
+ * are showns as cyan spheres.
+ *
+ * Use the left mouse button to changes orientation of scene.
+ * Use the middle mouse button to zoom in/out
+ * Use the right mouse button to pan the scene
+ */
+public class SplineAnim extends Applet implements ActionListener,
+ AdjustmentListener,
+ ItemListener {
+
+ // 3D Canvas
+ Canvas3D canvas;
+
+ // UI Components
+ Panel controlPanel;
+ Panel canvasPanel;
+ Button animateButton;
+ Choice interpChoice;
+ Scrollbar speedSlider;
+ Label speedLabel;
+ Label interpLabel;
+
+ // Scene Graph
+ BoundingSphere bounds;
+ BranchGroup root;
+ BranchGroup behaviorBranch;
+ Transform3D sceneTransform;
+ TransformGroup sceneTransformGroup;
+ Transform3D objTransform;
+ TransformGroup objTransformGroup;
+ Transform3D lightTransform1;
+ Transform3D lightTransform2;
+ TransformGroup light1TransformGroup;
+ TransformGroup light2TransformGroup;
+
+ // Key Frames & Interpolator
+ int duration = 5000;
+ Alpha animAlpha;
+ Transform3D yAxis;
+ KBKeyFrame[] linearKeyFrames = new KBKeyFrame[6];
+ KBKeyFrame[] splineKeyFrames = new KBKeyFrame[6];
+ KBRotPosScaleSplinePathInterpolator splineInterpolator;
+ KBRotPosScaleSplinePathInterpolator linearInterpolator;
+
+ // Data: Knot positions & transform groups
+ Vector3f pos0 = new Vector3f(-5.0f, -5.0f, 0.0f);
+ Vector3f pos1 = new Vector3f(-5.0f, 5.0f, 0.0f);
+ Vector3f pos2 = new Vector3f( 0.0f, 5.0f, 0.0f);
+ Vector3f pos3 = new Vector3f( 0.0f, -5.0f, 0.0f);
+ Vector3f pos4 = new Vector3f( 5.0f, -5.0f, 0.0f);
+ Vector3f pos5 = new Vector3f( 5.0f, 5.0f, 0.0f);
+ TransformGroup k0TransformGroup;
+ TransformGroup k1TransformGroup;
+ TransformGroup k2TransformGroup;
+ TransformGroup k3TransformGroup;
+ TransformGroup k4TransformGroup;
+ TransformGroup k5TransformGroup;
+
+ // Flags
+ boolean animationOn = true;
+ boolean linear = false;
+
+ private SimpleUniverse u = null;
+
+ public SplineAnim() {
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ this.setLayout(new FlowLayout());
+
+ // Create the canvas and the UI
+ canvasPanel = new Panel();
+ controlPanel = new Panel();
+ createCanvasPanel(canvasPanel);
+ this.add(canvasPanel);
+ createControlPanel(controlPanel);
+ this.add(controlPanel);
+
+ // Create the scene.
+ BranchGroup scene = createSceneGraph();
+
+ // Setup keyframe data for our animation
+ setupSplineKeyFrames ();
+ setupLinearKeyFrames ();
+
+ // Setup alpha, create the interpolators and start them. We
+ // create both a linear and a spline interpolator and turn on
+ // one depending on user selection. The default is spline.
+ setupAnimationData ();
+ createInterpolators();
+ startInterpolator();
+
+ // Add viewing platform
+ u = new SimpleUniverse(canvas);
+
+ // add mouse behaviors to ViewingPlatform
+ ViewingPlatform viewingPlatform = u.getViewingPlatform();
+
+ viewingPlatform.setNominalViewingTransform();
+
+ // add orbit behavior to the ViewingPlatform
+ OrbitBehavior orbit = new OrbitBehavior(canvas,
+ OrbitBehavior.REVERSE_ALL);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+
+ u.addBranchGraph(scene);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ /*
+ * This creates the control panel which contains a choice menu to
+ * toggle between spline and linear interpolation, a slider to
+ * adjust the speed of the animation and a animation start/stop
+ * button.
+ */
+ private void createControlPanel(Panel p) {
+
+ GridBagLayout gl = new GridBagLayout();
+ GridBagConstraints gbc = new GridBagConstraints();
+
+ p.setLayout (gl);
+ gbc.weightx = 100; gbc.weighty = 100;
+ gbc.fill = GridBagConstraints.BOTH;
+
+ gbc.gridx = 0; gbc.gridy = 0;
+ gbc.gridwidth = 1; gbc.gridheight = 1;
+ interpLabel = new Label("Interpolation Type", Label.LEFT);
+ p.add(interpLabel, gbc);
+
+ gbc.gridx = 1; gbc.gridy = 0;
+ gbc.gridwidth = 1; gbc.gridheight = 1;
+ interpChoice = new Choice();
+ interpChoice.add("Spline");
+ interpChoice.add("Linear");
+ p.add(interpChoice, gbc);
+ interpChoice.addItemListener (this);
+
+ gbc.gridx = 0; gbc.gridy = 2;
+ gbc.gridwidth = 2; gbc.gridheight = 1;
+ speedSlider = new Scrollbar(Scrollbar.HORIZONTAL, 2, 1, 0, 11);
+ speedSlider.setUnitIncrement (1);
+ p.add(speedSlider, gbc);
+ speedSlider.addAdjustmentListener(this);
+
+ gbc.gridx = 0; gbc.gridy = 3;
+ gbc.gridwidth = 2; gbc.gridheight = 1;
+ speedLabel = new Label(" - Animation Speed +", Label.CENTER);
+ p.add(speedLabel, gbc);
+
+ gbc.gridx = 0; gbc.gridy = 5;
+ gbc.gridwidth = 2; gbc.gridheight = 1;
+ animateButton = new Button("Stop Animation");
+ p.add(animateButton, gbc);
+ animateButton.addActionListener (this);
+
+
+ }
+
+ /*
+ * This creates the Java3D canvas
+ */
+ private void createCanvasPanel(Panel p) {
+
+ GridBagLayout gl = new GridBagLayout();
+ GridBagConstraints gbc = new GridBagConstraints();
+
+ p.setLayout(gl);
+ gbc.gridx = 0; gbc.gridy = 0;
+ gbc.gridwidth = 5; gbc.gridheight = 5;
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ canvas = new Canvas3D(config);
+ canvas.setSize(490,490);
+ p.add(canvas,gbc);
+
+ }
+
+ /*
+ * This creates the scene with 5 knot points represented by cyan
+ * spheres, a cone obejct that will be transformed, and two directional
+ * lights + and ambient light.
+ */
+ public BranchGroup createSceneGraph() {
+
+ // Colors for lights and objects
+ Color3f aColor = new Color3f(0.2f, 0.2f, 0.2f);
+ Color3f eColor = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f sColor = new Color3f(1.0f, 1.0f, 1.0f);
+ Color3f coneColor = new Color3f(0.9f, 0.1f, 0.1f);
+ Color3f sphereColor= new Color3f(0.1f, 0.7f, 0.9f);
+ Color3f bgColor = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f lightColor = new Color3f(1.0f, 1.0f, 1.0f);
+
+ // Root of the branch grsph
+ BranchGroup root = new BranchGroup();
+
+ // Create transforms such that all objects appears in the scene
+ sceneTransform = new Transform3D();
+ sceneTransform.setScale(0.14f);
+ Transform3D yrot = new Transform3D();
+ yrot.rotY(-Math.PI/5.0d);
+ sceneTransform.mul(yrot);
+ sceneTransformGroup = new TransformGroup(sceneTransform);
+ sceneTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ sceneTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ root.addChild(sceneTransformGroup);
+
+ // Create bounds for the background and lights
+ bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0f);
+
+ // Set up the background
+ Background bg = new Background(bgColor);
+ bg.setApplicationBounds(bounds);
+ sceneTransformGroup.addChild(bg);
+
+ // Create the transform group node for the lights
+ lightTransform1 = new Transform3D();
+ lightTransform2 = new Transform3D();
+ Vector3d lightPos1 = new Vector3d(0.0, 0.0, 2.0);
+ Vector3d lightPos2 = new Vector3d(1.0, 0.0, -2.0);
+ lightTransform1.set(lightPos1);
+ lightTransform2.set(lightPos2);
+ light1TransformGroup = new TransformGroup(lightTransform1);
+ light2TransformGroup = new TransformGroup(lightTransform2);
+ sceneTransformGroup.addChild(light1TransformGroup);
+ sceneTransformGroup.addChild(light2TransformGroup);
+
+ // Create lights
+ AmbientLight ambLight = new AmbientLight(aColor);
+ Light dirLight1;
+ Light dirLight2;
+
+ Vector3f lightDir1 = new Vector3f(lightPos1);
+ Vector3f lightDir2 = new Vector3f(lightPos2);
+ lightDir1.negate();
+ lightDir2.negate();
+ dirLight1 = new DirectionalLight(lightColor, lightDir1);
+ dirLight2 = new DirectionalLight(lightColor, lightDir2);
+
+ // Set the influencing bounds
+ ambLight.setInfluencingBounds(bounds);
+ dirLight1.setInfluencingBounds(bounds);
+ dirLight2.setInfluencingBounds(bounds);
+
+ // Add the lights into the scene graph
+ sceneTransformGroup.addChild(ambLight);
+ sceneTransformGroup.addChild(dirLight1);
+ sceneTransformGroup.addChild(dirLight2);
+
+ // Create a cone and add it to the scene graph.
+ objTransform = new Transform3D();
+ objTransformGroup = new TransformGroup(objTransform);
+ objTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ sceneTransformGroup.addChild(objTransformGroup);
+
+ Material m = new Material(coneColor, eColor, coneColor, sColor, 100.0f);
+ Appearance a = new Appearance();
+ m.setLightingEnable(true);
+ a.setMaterial(m);
+ Cone cone = new Cone(0.4f, 1.0f);
+ cone.setAppearance(a);
+ objTransformGroup.addChild(cone);
+
+ // Create transform groups for each knot point
+ // knot point 0
+ Transform3D t3dKnot = new Transform3D();
+ t3dKnot.set (pos0);
+ TransformGroup k0TransformGroup = new TransformGroup(t3dKnot);
+ sceneTransformGroup.addChild(k0TransformGroup);
+
+ // knot point 1
+ t3dKnot = new Transform3D();
+ t3dKnot.set (pos1);
+ TransformGroup k1TransformGroup = new TransformGroup(t3dKnot);
+ sceneTransformGroup.addChild(k1TransformGroup);
+
+ // knot point 2
+ t3dKnot = new Transform3D();
+ t3dKnot.set (pos2);
+ TransformGroup k2TransformGroup = new TransformGroup(t3dKnot);
+ sceneTransformGroup.addChild(k2TransformGroup);
+
+ // knot point 3
+ t3dKnot = new Transform3D();
+ t3dKnot.set (pos3);
+ TransformGroup k3TransformGroup = new TransformGroup(t3dKnot);
+ sceneTransformGroup.addChild(k3TransformGroup);
+
+ // knot point 4
+ t3dKnot = new Transform3D();
+ t3dKnot.set (pos4);
+ TransformGroup k4TransformGroup = new TransformGroup(t3dKnot);
+ sceneTransformGroup.addChild(k4TransformGroup);
+
+ // knot point 5
+ t3dKnot = new Transform3D();
+ t3dKnot.set (pos5);
+ TransformGroup k5TransformGroup = new TransformGroup(t3dKnot);
+ sceneTransformGroup.addChild(k5TransformGroup);
+
+ // Create spheres for each knot point's transform group
+ ColoringAttributes sphereColorAttr = new ColoringAttributes();
+ sphereColorAttr.setColor(sphereColor);
+ Appearance sphereAppearance = new Appearance();
+ sphereAppearance.setColoringAttributes(sphereColorAttr);
+ k0TransformGroup.addChild(new Sphere(0.10f, sphereAppearance));
+ k1TransformGroup.addChild(new Sphere(0.10f, sphereAppearance));
+ k2TransformGroup.addChild(new Sphere(0.10f, sphereAppearance));
+ k3TransformGroup.addChild(new Sphere(0.10f, sphereAppearance));
+ k4TransformGroup.addChild(new Sphere(0.10f, sphereAppearance));
+ k5TransformGroup.addChild(new Sphere(0.10f, sphereAppearance));
+
+ return root;
+ }
+
+ /*
+ * This sets up the key frame data for the spline interpolator. Each knot
+ * point has a scale and rotation component specified. The second argument
+ * to KBKeyFrame (in this case 0) tells the interpolator that this is
+ * to be interpolated using splines. The last three arguments to
+ * KBKeyFrame are Tension, Continuity, and Bias components for each
+ * key frame.
+ */
+ private void setupSplineKeyFrames () {
+ // Prepare spline keyframe data
+ Point3f p = new Point3f (pos0); // position
+ float head = (float)Math.PI/2.0f; // heading
+ float pitch = 0.0f; // pitch
+ float bank = 0.0f; // bank
+ Point3f s = new Point3f(1.0f, 1.0f, 1.0f); // uniform scale
+ splineKeyFrames[0] =
+ new KBKeyFrame(0.0f, 0, p, head, pitch, bank, s, 0.0f, 0.0f, 0.0f);
+
+ p = new Point3f (pos1);
+ head = 0.0f; // heading
+ pitch = 0.0f; // pitch
+ bank = (float)-Math.PI/2.0f; // bank
+ s = new Point3f(1.0f, 1.0f, 1.0f); // uniform scale
+ splineKeyFrames[1] =
+ new KBKeyFrame(0.2f, 0, p, head, pitch, bank, s, 0.0f, 0.0f, 0.0f);
+
+ p = new Point3f (pos2);
+ head = 0.0f; // heading
+ pitch = 0.0f; // pitch
+ bank = 0.0f; // bank
+ s = new Point3f(0.7f, 0.7f, 0.7f); // uniform scale
+ splineKeyFrames[2] =
+ new KBKeyFrame(0.4f, 0, p, head, pitch, bank, s, 0.0f, 0.0f, 0.0f);
+
+ p = new Point3f (pos3);
+ head = (float)Math.PI/2.0f; // heading
+ pitch = 0.0f; // pitch
+ bank = (float)Math.PI/2.0f; // bank
+ s = new Point3f(0.5f, 0.5f, 0.5f); // uniform scale
+ splineKeyFrames[3] =
+ new KBKeyFrame(0.6f, 0, p, head, pitch, bank, s, 0.0f, 0.0f, 0.0f);
+
+ p = new Point3f (pos4);
+ head = (float)-Math.PI/2.0f; // heading
+ pitch = (float)-Math.PI/2.0f; // pitch
+ bank = (float)Math.PI/2.0f; // bank
+ s = new Point3f(0.4f, 0.4f, 0.4f); // uniform scale
+ splineKeyFrames[4] =
+ new KBKeyFrame(0.8f, 0, p, head, pitch, bank, s, 0.0f, 0.0f, 0.0f);
+
+ p = new Point3f (pos5);
+ head = 0.0f; // heading
+ pitch = 0.0f; // pitch
+ bank = 0.0f; // bank
+ s = new Point3f(1.0f, 1.0f, 1.0f); // uniform scale
+ splineKeyFrames[5] =
+ new KBKeyFrame(1.0f, 0, p, head, pitch, bank, s, 0.0f, 0.0f, 0.0f);
+ }
+
+ /*
+ * This sets up the key frame data for the linear interpolator. Each knot
+ * point has a scale and rotation component specified. The second argument
+ * to KBKeyFrame (in this case 1) tells the interpolator that this is
+ * to be interpolated linearly. The last three arguments to TCBKeyFrame
+ * are Tension, Continuity, and Bias components for each key frame.
+ */
+ private void setupLinearKeyFrames () {
+ // Prepare linear keyframe data
+ Point3f p = new Point3f (pos0);
+ float head = 0.0f; // heading
+ float pitch = 0.0f; // pitch
+ float bank = 0.0f; // bank
+ Point3f s = new Point3f(1.0f, 1.0f, 1.0f); // uniform scale
+ linearKeyFrames[0] =
+ new KBKeyFrame(0.0f, 1, p, head, pitch, bank, s, 0.0f, 0.0f, 0.0f);
+
+ p = new Point3f (pos1);
+ linearKeyFrames[1] =
+ new KBKeyFrame(0.2f, 1, p, head, pitch, bank, s, 0.0f, 0.0f, 0.0f);
+
+ p = new Point3f (pos2);
+ linearKeyFrames[2] =
+ new KBKeyFrame(0.4f, 1, p, head, pitch, bank, s, 0.0f, 0.0f, 0.0f);
+
+ p = new Point3f (pos3);
+ linearKeyFrames[3] =
+ new KBKeyFrame(0.6f, 1, p, head, pitch, bank, s, 0.0f, 0.0f, 0.0f);
+
+ p = new Point3f (pos4);
+ linearKeyFrames[4] =
+ new KBKeyFrame(0.8f, 1, p, head, pitch, bank, s, 0.0f, 0.0f, 0.0f);
+
+ p = new Point3f (pos5);
+ linearKeyFrames[5] =
+ new KBKeyFrame(1.0f, 1, p, head, pitch, bank, s, 0.0f, 0.0f, 0.0f);
+ }
+
+
+ /*
+ * This sets up alpha for the interpolator
+ */
+ private void setupAnimationData () {
+ yAxis = new Transform3D();
+ animAlpha = new Alpha (-1,Alpha.INCREASING_ENABLE,0,0,duration,0,0,0,0,0);
+ }
+
+ /*
+ * create a spline and a linear interpolator, but we will activate only
+ * one in startInterpolator()
+ */
+ private void createInterpolators () {
+
+ behaviorBranch = new BranchGroup();
+
+ // create spline interpolator
+ splineInterpolator =
+ new KBRotPosScaleSplinePathInterpolator(animAlpha, objTransformGroup,
+ yAxis, splineKeyFrames);
+ splineInterpolator.setSchedulingBounds(bounds);
+ behaviorBranch.addChild(splineInterpolator);
+
+ // create linear interpolator
+ linearInterpolator =
+ new KBRotPosScaleSplinePathInterpolator(animAlpha, objTransformGroup,
+ yAxis, linearKeyFrames);
+ linearInterpolator.setSchedulingBounds(bounds);
+ behaviorBranch.addChild(linearInterpolator);
+ objTransformGroup.addChild(behaviorBranch);
+
+ }
+
+ /*
+ * This activates one of the interpolators depending on the state of the
+ * linear boolean flag which may be toggled by the user using the choice
+ * menu.
+ */
+ public void startInterpolator () {
+ if (animationOn) {
+ if (linear) {
+ splineInterpolator.setEnable(false);
+ linearInterpolator.setEnable(true);
+ } else {
+ linearInterpolator.setEnable(false);
+ splineInterpolator.setEnable(true);
+ }
+ }
+ }
+
+
+ /*
+ * Toggle animation
+ */
+ public void actionPerformed (ActionEvent event) {
+ Object source = event.getSource();
+ if (source == animateButton) {
+ try {
+ // toggle animation
+ if (animationOn) {
+ animationOn = false;
+ splineInterpolator.setEnable(false);
+ linearInterpolator.setEnable(false);
+ animateButton.setLabel("Start Animation");
+ } else {
+ animationOn = true;
+ startInterpolator();
+ animateButton.setLabel("Stop Animation");
+ }
+ } catch (Exception e) {
+ System.err.println ("Exception " + e);
+ }
+ }
+ }
+
+ /*
+ * Toggle the interpolators
+ */
+ public void itemStateChanged (ItemEvent event) {
+ Object source = event.getSource();
+ ItemSelectable ie = event.getItemSelectable();
+ if (source == interpChoice) {
+ try {
+ if (ie.getSelectedObjects()[0] == "Spline") {
+ linear = false;
+ }
+ if (ie.getSelectedObjects()[0] == "Linear") {
+ linear = true;
+ }
+ startInterpolator();
+ } catch (Exception e) {
+ System.err.println ("Exception " + e);
+ }
+ }
+ }
+
+
+ /*
+ * Adjust the speed of the animations
+ */
+ public void adjustmentValueChanged (AdjustmentEvent e) {
+ int value = e.getValue();
+ duration = 6000 - (500 * value);
+ animAlpha.setIncreasingAlphaDuration(duration);
+ }
+
+
+
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ Frame frame = new MainFrame(new SplineAnim(), 500, 600);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/stencil/StencilOutline.java b/src/main/java/org/jdesktop/j3d/examples/stencil/StencilOutline.java
new file mode 100644
index 0000000..3c7b405
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/stencil/StencilOutline.java
@@ -0,0 +1,524 @@
+/*
+ * Copyright (c) 2016 JogAmp Community. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+package org.jdesktop.j3d.examples.stencil;
+
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
+import java.io.FileNotFoundException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Enumeration;
+
+import javax.swing.JOptionPane;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.ColoringAttributes;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.GraphicsConfigTemplate3D;
+import org.jogamp.java3d.Group;
+import org.jogamp.java3d.LineAttributes;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.Node;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.RenderingAttributes;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.ShaderAppearance;
+import org.jogamp.java3d.ShaderError;
+import org.jogamp.java3d.ShaderErrorListener;
+import org.jogamp.java3d.ShaderProgram;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.loaders.IncorrectFormatException;
+import org.jogamp.java3d.loaders.ParsingErrorException;
+import org.jogamp.java3d.loaders.Scene;
+import org.jogamp.java3d.loaders.objectfile.ObjectFile;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.universe.PlatformGeometry;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+/**
+ * Simple Java 3D example program to display an .obj object with shader programs.
+ * And then add a stencil based outline around it
+ */
+public class StencilOutline extends javax.swing.JFrame
+{
+
+ private String shaderName = "polkadot3d";
+ private boolean spin = false;
+ private boolean noTriangulate = false;
+ private boolean noStripify = false;
+ private double creaseAngle = 60.0;
+ private URL filename = null;
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ public BranchGroup createSceneGraph()
+ {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.7);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ objScale.addChild(objTrans);
+
+ int flags = ObjectFile.RESIZE;
+ if (!noTriangulate)
+ flags |= ObjectFile.TRIANGULATE;
+ if (!noStripify)
+ flags |= ObjectFile.STRIPIFY;
+ ObjectFile f = new ObjectFile(flags, (float) (creaseAngle * Math.PI / 180.0));
+ Scene s = null;
+ try
+ {
+ s = f.load(filename);
+ }
+ catch (FileNotFoundException e)
+ {
+ System.err.println(e);
+ System.exit(1);
+ }
+ catch (ParsingErrorException e)
+ {
+ System.err.println(e);
+ System.exit(1);
+ }
+ catch (IncorrectFormatException e)
+ {
+ System.err.println(e);
+ System.exit(1);
+ }
+
+ //Uncomment to use the gl2es2 pipeline, also see other commented code
+ // Set vertex and fragment shader program for all Shape3D nodes in scene
+ /* String vertexProgram = null;
+ String fragmentProgram = null;
+ try
+ {
+ vertexProgram = StringIO.readFully(new File(
+ System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/" + shaderName + ".vert"));
+ fragmentProgram = StringIO.readFully(new File(
+ System.getProperty("user.dir") + "/src/classes/org/jdesktop/j3d/examples/gl2es2pipeline/" + shaderName + ".frag"));
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+ Shader[] shaders = new Shader[2];
+ shaders[0] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_VERTEX, vertexProgram);
+ shaders[1] = new SourceCodeShader(Shader.SHADING_LANGUAGE_GLSL, Shader.SHADER_TYPE_FRAGMENT, fragmentProgram);
+ ShaderProgram shaderProgram = new GLSLShaderProgram();
+
+
+ shaderProgram.setShaders(shaders);
+ setShaderProgram(s.getSceneGroup(), shaderProgram);*/
+
+ setOutline(s.getSceneGroup());
+
+ objTrans.addChild(s.getSceneGroup());
+
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+
+ if (spin)
+ {
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 4000, 0, 0, 0, 0, 0);
+
+ RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, objTrans, yAxis, 0.0f, (float) Math.PI * 2.0f);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+ }
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
+ Background bgNode = new Background(bgColor);
+ bgNode.setApplicationBounds(bounds);
+ objRoot.addChild(bgNode);
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse()
+ {
+ // Critical!!! notice this is not using this call, but explicitly asks for a stencil buffer
+ //GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+ GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();
+ template.setStencilSize(16);
+ // Return the GraphicsConfiguration that best fits our needs.
+ GraphicsConfiguration config = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
+ .getBestConfiguration(template);
+
+ // Create a Canvas3D using the preferred configuration
+ Canvas3D canvas3d = new Canvas3D(config);
+
+ // Create simple universe with view branch
+ univ = new SimpleUniverse(canvas3d);
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+
+ // Add a ShaderErrorListener
+ univ.addShaderErrorListener(new ShaderErrorListener() {
+ @Override
+ public void errorOccurred(ShaderError error)
+ {
+ error.printVerbose();
+ JOptionPane.showMessageDialog(StencilOutline.this, error.toString(), "ShaderError", JOptionPane.ERROR_MESSAGE);
+ }
+ });
+
+ // add mouse behaviors to the ViewingPlatform
+ ViewingPlatform viewingPlatform = univ.getViewingPlatform();
+
+ PlatformGeometry pg = new PlatformGeometry();
+
+ // Set up the ambient light
+ Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
+ AmbientLight ambientLightNode = new AmbientLight(ambientColor);
+ ambientLightNode.setInfluencingBounds(bounds);
+ pg.addChild(ambientLightNode);
+
+ // Set up the directional lights
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);
+ Color3f light2Color = new Color3f(1.0f, 1.0f, 1.0f);
+ Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
+
+ DirectionalLight light1 = new DirectionalLight(light1Color, light1Direction);
+ light1.setInfluencingBounds(bounds);
+ pg.addChild(light1);
+
+ DirectionalLight light2 = new DirectionalLight(light2Color, light2Direction);
+ light2.setInfluencingBounds(bounds);
+ pg.addChild(light2);
+
+ viewingPlatform.setPlatformGeometry(pg);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ if (!spin)
+ {
+ OrbitBehavior orbit = new OrbitBehavior(canvas3d, OrbitBehavior.REVERSE_ALL);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+ }
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return canvas3d;
+ }
+
+ private static void usage()
+ {
+ System.out.println("Usage: java ObjLoadGLSL [-s] [-S shaderName] [-n] [-t] [-c degrees] <.obj file>");
+ System.out.println(" -s Spin (no user interaction)");
+ System.out.println(" -S Set shader name (default is 'simple')");
+ System.out.println(" -n No triangulation");
+ System.out.println(" -t No stripification");
+ System.out.println(" -c Set crease angle for normal generation (default is 60 without");
+ System.out.println(" smoothing group info, otherwise 180 within smoothing groups)");
+ System.exit(0);
+ } // End of usage
+
+ // Set shader program for all nodes in specified branch graph
+ private void setShaderProgram(BranchGroup g, ShaderProgram shaderProgram)
+ {
+ ShaderAppearance myApp = new ShaderAppearance();
+ Material mat = new Material();
+ myApp.setShaderProgram(shaderProgram);
+ myApp.setMaterial(mat);
+ setShaderProgram(g, myApp);
+ }
+
+ // Recursively set shader program for all children of specified group
+ private void setShaderProgram(Group g, ShaderAppearance myApp)
+ {
+
+ Enumeration<Node> e = g.getAllChildren();
+ while (e.hasMoreElements())
+ {
+ Node n = e.nextElement();
+ if (n instanceof Group)
+ {
+ setShaderProgram((Group) n, myApp);
+ }
+ else if (n instanceof Shape3D)
+ {
+ Shape3D s = (Shape3D) n;
+ s.setAppearance(myApp);
+ }
+ }
+ }
+
+ private Color3f c = new Color3f(1.0f, 1.0f, 0);
+ private int outlineStencilMask = (int) (c.x * 255) + (int) (c.y * 255) + (int) (c.z * 255);
+
+ // Recursively set an outline onto all Shape3D nodes
+ private void setOutline(Group g)
+ {
+
+ Enumeration<Node> e = g.getAllChildren();
+ while (e.hasMoreElements())
+ {
+ Node n = e.nextElement();
+ if (n instanceof Group)
+ {
+ setOutline((Group) n);
+ }
+ else if (n instanceof Shape3D)
+ {
+ // start by giving the current appearance a rendering attribute
+ Shape3D s = (Shape3D) n;
+ Appearance sapp = s.getAppearance();
+
+ // get and ensure rend atts exist
+ RenderingAttributes ra1 = sapp.getRenderingAttributes();
+ if (ra1 == null)
+ {
+ ra1 = new RenderingAttributes();
+ sapp.setRenderingAttributes(ra1);
+ }
+
+ ra1.setStencilEnable(true);
+ ra1.setStencilWriteMask(outlineStencilMask);
+ ra1.setStencilFunction(RenderingAttributes.ALWAYS, outlineStencilMask, outlineStencilMask);
+ ra1.setStencilOp(RenderingAttributes.STENCIL_REPLACE, //
+ RenderingAttributes.STENCIL_REPLACE, //
+ RenderingAttributes.STENCIL_REPLACE);
+
+ sapp.setRenderingAttributes(ra1);
+
+ // now attach an outline shape
+ Shape3D outliner = new Shape3D();
+
+ ////////////////////////////////
+ //Outliner gear, note empty geom should be ignored
+
+ //Uncomment to use the gl2es2 pipeline, also see other commented code
+ //Appearance app = new SimpleShaderAppearance(c);
+
+ //Comment to use the gl2es2 pipeline, also see other commented code
+ Appearance app = new Appearance();
+
+ // lineAntialiasing MUST be true, to force this to be done during rendering pass (otherwise it's hidden)
+ LineAttributes la = new LineAttributes(4, LineAttributes.PATTERN_SOLID, true);
+ app.setLineAttributes(la);
+ PolygonAttributes pa = new PolygonAttributes(PolygonAttributes.POLYGON_LINE, PolygonAttributes.CULL_BACK, 0.0f, true, 0.0f);
+ app.setPolygonAttributes(pa);
+ ColoringAttributes colorAtt = new ColoringAttributes(c, ColoringAttributes.FASTEST);
+ app.setColoringAttributes(colorAtt);
+
+ RenderingAttributes ra2 = new RenderingAttributes();
+ ra2.setStencilEnable(true);
+ ra2.setStencilWriteMask(outlineStencilMask);
+ ra2.setStencilFunction(RenderingAttributes.NOT_EQUAL, outlineStencilMask, outlineStencilMask);
+ ra2.setStencilOp(RenderingAttributes.STENCIL_KEEP, //
+ RenderingAttributes.STENCIL_KEEP, //
+ RenderingAttributes.STENCIL_KEEP);
+
+ // draw it even when hidden, which we don't want now
+ ra2.setDepthBufferEnable(false);
+ ra2.setDepthTestFunction(RenderingAttributes.ALWAYS);
+
+ app.setRenderingAttributes(ra2);
+
+ outliner.setAppearance(app);
+
+ // use the same geometry ass teh shape we are outlining!
+ outliner.setGeometry(s.getGeometry());
+
+ g.addChild(outliner);
+
+ }
+ }
+ }
+
+ /**
+ * Creates new form ObjLoadGLSL
+ */
+ public StencilOutline(String args[])
+ {
+ if (args.length != 0)
+ {
+ for (int i = 0; i < args.length; i++)
+ {
+ if (args[i].startsWith("-"))
+ {
+ if (args[i].equals("-s"))
+ {
+ spin = true;
+ }
+ else if (args[i].equals("-n"))
+ {
+ noTriangulate = true;
+ }
+ else if (args[i].equals("-t"))
+ {
+ noStripify = true;
+ }
+ else if (args[i].equals("-c"))
+ {
+ if (i < args.length - 1)
+ {
+ creaseAngle = (new Double(args[++i])).doubleValue();
+ }
+ else
+ usage();
+ }
+ else if (args[i].equals("-S"))
+ {
+ if (i < args.length - 1)
+ {
+ shaderName = args[++i];
+ }
+ else
+ usage();
+ }
+ else
+ {
+ usage();
+ }
+ }
+ else
+ {
+ try
+ {
+ if ((args[i].indexOf("file:") == 0) || (args[i].indexOf("http") == 0))
+ {
+ filename = new URL(args[i]);
+ }
+ else if (args[i].charAt(0) != '/')
+ {
+ filename = new URL("file:./" + args[i]);
+ }
+ else
+ {
+ filename = new URL("file:" + args[i]);
+ }
+ }
+ catch (MalformedURLException e)
+ {
+ System.err.println(e);
+ System.exit(1);
+ }
+ }
+ }
+ }
+
+ if (filename == null)
+ {
+ filename = Resources.getResource("resources/geometry/galleon.obj");
+ if (filename == null)
+ {
+ System.err.println("resources/geometry/galleon.obj not found");
+ System.exit(1);
+ }
+ }
+
+ // Initialize the GUI components
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents()
+ {
+ drawingPanel = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("StencilOutline");
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(700, 700));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[])
+ {
+ System.setProperty("sun.awt.noerasebackground", "true");
+
+ System.setProperty("j3d.stencilClear", "true");
+
+ //Uncomment to use the gl2es2 pipeline, also see other commented code
+ //System.setProperty("j3d.rend", "jogl2es2");
+
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
+ public void run()
+ {
+ StencilOutline objLoadGLSL = new StencilOutline(args);
+ objLoadGLSL.setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/swing_interaction/SwingInteraction.form b/src/main/java/org/jdesktop/j3d/examples/swing_interaction/SwingInteraction.form
new file mode 100644
index 0000000..591580c
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/swing_interaction/SwingInteraction.form
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <NonVisualComponents>
+ <Menu class="javax.swing.JMenuBar" name="jMenuBar1">
+ <SubComponents>
+ <Menu class="javax.swing.JMenu" name="fileMenu">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="File"/>
+ </Properties>
+ <SubComponents>
+ <MenuItem class="javax.swing.JMenuItem" name="exitMenuItem">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Exit"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="exitMenuItemActionPerformed"/>
+ </Events>
+ </MenuItem>
+ </SubComponents>
+ </Menu>
+ </SubComponents>
+ </Menu>
+ </NonVisualComponents>
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="Swing Interaction Test"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="menuBar" type="java.lang.String" value="jMenuBar1"/>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="guiPanel">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="North"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JButton" name="rotateButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Rotate"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="rotateButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="4" insetsLeft="4" insetsBottom="4" insetsRight="4" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="drawingPanel">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 500]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/main/java/org/jdesktop/j3d/examples/swing_interaction/SwingInteraction.java b/src/main/java/org/jdesktop/j3d/examples/swing_interaction/SwingInteraction.java
new file mode 100644
index 0000000..e360059
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/swing_interaction/SwingInteraction.java
@@ -0,0 +1,259 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.swing_interaction;
+
+import java.awt.GraphicsConfiguration;
+import java.util.Enumeration;
+
+import javax.swing.JPopupMenu;
+
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.WakeupCriterion;
+import org.jogamp.java3d.WakeupOnBehaviorPost;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Point3d;
+
+/**
+ * Simple Java 3D test program created in NetBeans to illustrate interacting
+ * with a Java 3D scene graph from an Swing-based program.
+ */
+public class SwingInteraction extends javax.swing.JFrame {
+
+ private SimpleUniverse univ = null;
+ private BranchGroup scene = null;
+
+ private TransformGroup objTrans;
+ private RotateBehavior awtBehavior;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // Create a simple shape leaf node, add it to the scene graph.
+ objTrans.addChild(new ColorCube(0.4));
+
+ // create the RotateBehavior
+ awtBehavior = new RotateBehavior(objTrans);
+ BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
+ 100.0);
+ awtBehavior.setSchedulingBounds(bounds);
+ objRoot.addChild(awtBehavior);
+
+ return objRoot;
+ }
+
+ private Canvas3D createUniverse() {
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+
+ univ = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ univ.getViewingPlatform().setNominalViewingTransform();
+
+ // Ensure at least 5 msec per frame (i.e., < 200Hz)
+ univ.getViewer().getView().setMinimumFrameCycleTime(5);
+
+ return c;
+ }
+
+ /**
+ * Creates new form SwingInteraction
+ */
+ public SwingInteraction() {
+ // Initialize the GUI components
+ JPopupMenu.setDefaultLightWeightPopupEnabled(false);
+ initComponents();
+
+ // Create Canvas3D and SimpleUniverse; add canvas to drawing panel
+ Canvas3D c = createUniverse();
+ drawingPanel.add(c, java.awt.BorderLayout.CENTER);
+
+ // Create the content branch and add it to the universe
+ scene = createSceneGraph();
+ univ.addBranchGraph(scene);
+ }
+
+ /**
+ * Behavior class that waits for a behavior post from the AWT event handler
+ */
+ class RotateBehavior extends Behavior {
+
+ private TransformGroup transformGroup;
+ private Transform3D trans = new Transform3D();
+ private WakeupCriterion criterion;
+ private float angle = 0.0f;
+
+ private final int ROTATE = 1;
+
+ // create a new RotateBehavior
+ RotateBehavior(TransformGroup tg) {
+ transformGroup = tg;
+ }
+
+ // initialize behavior to wakeup on a behavior post with id = ROTATE
+ public void initialize() {
+ criterion = new WakeupOnBehaviorPost(this, ROTATE);
+ wakeupOn(criterion);
+ }
+
+ // processStimulus to rotate the cube
+ public void processStimulus(Enumeration criteria) {
+ angle += Math.toRadians(10.0);
+ trans.rotY(angle);
+ transformGroup.setTransform(trans);
+ wakeupOn(criterion);
+ }
+
+ // when the mouse is clicked, postId for the behavior
+ void rotate() {
+ postId(ROTATE);
+ }
+ }
+
+ // ----------------------------------------------------------------
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ guiPanel = new javax.swing.JPanel();
+ rotateButton = new javax.swing.JButton();
+ drawingPanel = new javax.swing.JPanel();
+ jMenuBar1 = new javax.swing.JMenuBar();
+ fileMenu = new javax.swing.JMenu();
+ exitMenuItem = new javax.swing.JMenuItem();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("Swing Interaction Test");
+ guiPanel.setLayout(new java.awt.GridBagLayout());
+
+ rotateButton.setText("Rotate");
+ rotateButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ rotateButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
+ guiPanel.add(rotateButton, gridBagConstraints);
+
+ getContentPane().add(guiPanel, java.awt.BorderLayout.NORTH);
+
+ drawingPanel.setLayout(new java.awt.BorderLayout());
+
+ drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
+ getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
+
+ fileMenu.setText("File");
+ exitMenuItem.setText("Exit");
+ exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ exitMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(exitMenuItem);
+
+ jMenuBar1.add(fileMenu);
+
+ setJMenuBar(jMenuBar1);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ private void rotateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rotateButtonActionPerformed
+ awtBehavior.rotate();
+ }//GEN-LAST:event_rotateButtonActionPerformed
+
+ private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
+ System.exit(0);
+ }//GEN-LAST:event_exitMenuItemActionPerformed
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new SwingInteraction().setVisible(true);
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel drawingPanel;
+ private javax.swing.JMenuItem exitMenuItem;
+ private javax.swing.JMenu fileMenu;
+ private javax.swing.JPanel guiPanel;
+ private javax.swing.JMenuBar jMenuBar1;
+ private javax.swing.JButton rotateButton;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/text2d/MoverBehavior.java b/src/main/java/org/jdesktop/j3d/examples/text2d/MoverBehavior.java
new file mode 100644
index 0000000..6005d5b
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/text2d/MoverBehavior.java
@@ -0,0 +1,151 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.text2d;
+
+import java.awt.AWTEvent;
+import java.awt.event.KeyEvent;
+import java.util.Enumeration;
+
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.Bounds;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.WakeupCondition;
+import org.jogamp.java3d.WakeupCriterion;
+import org.jogamp.java3d.WakeupOnAWTEvent;
+import org.jogamp.java3d.WakeupOr;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+// Mover behavior class - used to allow viewer to move using arrow keys
+class MoverBehavior extends Behavior
+{
+ WakeupOnAWTEvent w1 = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);
+ WakeupCriterion[] w2 = {w1};
+ WakeupCondition w = new WakeupOr(w2);
+ TransformGroup viewTransformGroup;
+ double rotation = 0.0; // holds current rotation radians
+
+ public void initialize() {
+ // Establish initial wakeup criteria
+ wakeupOn(w);
+ }
+
+
+ /**
+ * Override Behavior's stimulus method to handle the event.
+ */
+ public void processStimulus(Enumeration criteria) {
+ WakeupOnAWTEvent ev;
+ WakeupCriterion genericEvt;
+ AWTEvent[] events;
+
+ while (criteria.hasMoreElements()) {
+ genericEvt = (WakeupCriterion) criteria.nextElement();
+ if (genericEvt instanceof WakeupOnAWTEvent) {
+ ev = (WakeupOnAWTEvent) genericEvt;
+ events = ev.getAWTEvent();
+ processManualEvent(events);
+ }
+ }
+ // Set wakeup criteria for next time
+ wakeupOn(w);
+ }
+
+
+ /**
+ * Process a keyboard event to move or rotate the viewer.
+ */
+ void processManualEvent(AWTEvent[] events) {
+
+ for (int i = 0; i < events.length; ++i) {
+ if (events[i] instanceof KeyEvent) {
+ KeyEvent event = (KeyEvent)events[i];
+ if (event.getKeyCode() == KeyEvent.VK_EQUALS) {
+ continue;
+ }
+ Transform3D t = new Transform3D();
+ viewTransformGroup.getTransform(t);
+ Vector3f viewDir = new Vector3f(0f, 0f, -1f);
+ Vector3f translation = new Vector3f();
+ t.get(translation);
+ t.transform(viewDir);
+ if (event.getKeyCode() == KeyEvent.VK_UP) {
+ translation.x += viewDir.x;
+ translation.y += viewDir.y;
+ translation.z += viewDir.z;
+ }
+ else if (event.getKeyCode() == KeyEvent.VK_DOWN) {
+ translation.x -= viewDir.x;
+ translation.y -= viewDir.y;
+ translation.z -= viewDir.z;
+ }
+ else if (event.getKeyCode() == KeyEvent.VK_RIGHT) {
+ rotation += -.1;
+ }
+ else if (event.getKeyCode() == KeyEvent.VK_LEFT) {
+ rotation += .1;
+ }
+ t.rotY(rotation);
+ t.setTranslation(translation);
+ viewTransformGroup.setTransform(t);
+ }
+ }
+ }
+
+
+ /**
+ * Constructor
+ */
+ public MoverBehavior(TransformGroup trans) {
+ viewTransformGroup = trans;
+ Bounds bound = new BoundingSphere(new Point3d(0.0,0.0,0.0),10000.0);
+ this.setSchedulingBounds(bound);
+ }
+}
+
+
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/text2d/Text2DTest.java b/src/main/java/org/jdesktop/j3d/examples/text2d/Text2DTest.java
new file mode 100644
index 0000000..49a0ac2
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/text2d/Text2DTest.java
@@ -0,0 +1,205 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.text2d;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.Font;
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.PolygonAttributes;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.geometry.Text2D;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class Text2DTest extends Applet {
+
+ private SimpleUniverse u = null;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ TransformGroup textTranslationGroup;
+ Transform3D textTranslation;
+ float yPos = -.5f;
+ Shape3D textObject = new Text2D("Rotating Yellow Text",
+ new Color3f(1f, 1f, 0f),
+ "Serif",
+ 60,
+ Font.BOLD);
+ Appearance app = textObject.getAppearance();
+
+ PolygonAttributes pa = app.getPolygonAttributes();
+ if (pa == null)
+ pa = new PolygonAttributes();
+ pa.setCullFace(PolygonAttributes.CULL_NONE);
+ if (app.getPolygonAttributes() == null)
+ app.setPolygonAttributes(pa);
+ objTrans.addChild(textObject);
+
+
+ textTranslation = new Transform3D();
+ textTranslation.setTranslation(new Vector3f(0f, yPos, 0f));
+ textTranslationGroup = new TransformGroup(textTranslation);
+ textTranslationGroup.addChild(objTrans);
+ objScale.addChild(textTranslationGroup);
+ yPos += .5f;
+
+ /* Blue 40point text*/
+ textObject = new Text2D("Blue 40point Text",
+ new Color3f(0f, 0f, 1f),
+ "Serif",
+ 40,
+ Font.BOLD);
+ textTranslation = new Transform3D();
+ textTranslation.setTranslation(new Vector3f(0f, yPos, 0f));
+ textTranslationGroup = new TransformGroup(textTranslation);
+ textTranslationGroup.addChild(textObject);
+ objScale.addChild(textTranslationGroup);
+ yPos += .5f;
+
+ /* Green italic text*/
+ textObject = new Text2D("Green Italic Text",
+ new Color3f(0f, 1f, 0f),
+ "Serif",
+ 70,
+ Font.ITALIC);
+ textTranslation = new Transform3D();
+ textTranslation.setTranslation(new Vector3f(0f, yPos, 0f));
+ textTranslationGroup = new TransformGroup(textTranslation);
+ textTranslationGroup.addChild(textObject);
+ objScale.addChild(textTranslationGroup);
+ yPos += .5f;
+
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into
+ // the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+
+ return objRoot;
+ }
+
+ public Text2DTest() {
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+
+ // Create a simple scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph();
+ u = new SimpleUniverse(c);
+ MoverBehavior navigator =
+ new MoverBehavior(u.getViewingPlatform().getViewPlatformTransform());
+ scene.addChild(navigator);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ scene.compile();
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+
+ u.addBranchGraph(scene);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ //
+ // The following allows HelloUniverse to be run as an application
+ // as well as an applet
+ //
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ new MainFrame(new Text2DTest(), 256, 256);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/text3d/Text3DLoad.java b/src/main/java/org/jdesktop/j3d/examples/text3d/Text3DLoad.java
new file mode 100644
index 0000000..a61531e
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/text3d/Text3DLoad.java
@@ -0,0 +1,308 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.text3d;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.Button;
+import java.awt.Font;
+import java.awt.GraphicsConfiguration;
+import java.awt.Panel;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Background;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.Font3D;
+import org.jogamp.java3d.FontExtrusion;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.Text3D;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.Vector3f;
+
+public class Text3DLoad extends Applet implements ActionListener {
+
+ private String fontName = "TestFont";
+ private String textString = null;
+ private double tessellation = 0.0;
+
+ private SimpleUniverse u;
+
+ private Button button;
+ private boolean behaviorsOn = false;
+ private OrbitBehavior orbit;
+
+ public BranchGroup createSceneGraph() {
+ float sl = textString.length();
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ // Assuming uniform size chars, set scale to fit string in view
+ t3d.setScale(1.2/sl);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ objScale.addChild(objTrans);
+
+ Font3D f3d;
+ if (tessellation > 0.0) {
+ f3d = new Font3D(new Font(fontName, Font.PLAIN, 2),
+ tessellation,
+ new FontExtrusion());
+ }
+ else {
+ f3d = new Font3D(new Font(fontName, Font.PLAIN, 2),
+ new FontExtrusion());
+ }
+ Text3D txt = new Text3D(f3d, textString,
+ new Point3f( -sl/2.0f, -1.f, -1.f));
+ Shape3D sh = new Shape3D();
+ Appearance app = new Appearance();
+ Material mm = new Material();
+ mm.setLightingEnable(true);
+ app.setMaterial(mm);
+ sh.setGeometry(txt);
+ sh.setAppearance(app);
+ objTrans.addChild(sh);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ if (false) {
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+ }
+
+ // Set up the background
+ Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
+ Background bgNode = new Background(bgColor);
+ bgNode.setApplicationBounds(bounds);
+ objRoot.addChild(bgNode);
+
+ // Set up the ambient light
+ Color3f ambientColor = new Color3f(0.3f, 0.3f, 0.3f);
+ AmbientLight ambientLightNode = new AmbientLight(ambientColor);
+ ambientLightNode.setInfluencingBounds(bounds);
+ objRoot.addChild(ambientLightNode);
+
+ // Set up the directional lights
+ Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);
+ Color3f light2Color = new Color3f(1.0f, 1.0f, 0.9f);
+ Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
+
+ DirectionalLight light1
+ = new DirectionalLight(light1Color, light1Direction);
+ light1.setInfluencingBounds(bounds);
+ objRoot.addChild(light1);
+
+ DirectionalLight light2
+ = new DirectionalLight(light2Color, light2Direction);
+ light2.setInfluencingBounds(bounds);
+ objRoot.addChild(light2);
+
+ return objRoot;
+ }
+
+ private void usage()
+ {
+ System.out.println(
+ "Usage: java Text3DLoad [-f fontname] [-t tessellation] [<text>]");
+ System.exit(0);
+ } // End of usage
+
+ public Text3DLoad() {}
+
+ public Text3DLoad(String args[]) {
+
+ if (args.length == 0) {
+// usage();
+ textString = "Java3D";
+ }
+ else {
+ for (int i = 0 ; i < args.length ; i++) {
+ if (args[i].startsWith("-")) {
+ if (args[i].equals("-f")) {
+ if (i < args.length - 1) {
+ fontName = args[++i];
+ }
+ else {
+ usage();
+ }
+ }
+ else if (args[i].equals("-t")) {
+ if (i < args.length - 1) {
+ tessellation = Double.parseDouble(args[++i]);
+ }
+ else {
+ usage();
+ }
+ }
+ else {
+ System.err.println("Argument '" + args[i] +
+ "' ignored.");
+ }
+ }
+ else {
+ textString = args[i];
+ }
+ }
+ }
+
+ if (textString == null) {
+ usage();
+ }
+
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+
+ if (textString == null) {
+ textString = "Java3D";
+ }
+ setLayout(new BorderLayout());
+
+ button = new Button("remove behaviors");
+ button.addActionListener(this);
+ Panel p = new Panel();
+ p.add(button);
+ add("South", p);
+
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+
+ // Create a simple scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph();
+
+ // create a SimpleUniverse with 4 TransformGroups for the mouse
+ // behaviors
+ u = new SimpleUniverse(c);
+
+ // add the behaviors to the ViewingPlatform
+ ViewingPlatform viewingPlatform = u.getViewingPlatform();
+
+ viewingPlatform.setNominalViewingTransform();
+
+ // add orbit behavior to ViewingPlatform
+ orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL |
+ OrbitBehavior.STOP_ZOOM);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+
+ behaviorsOn = true;
+
+
+ u.addBranchGraph(scene);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ if (e.getSource() == button) {
+ ViewingPlatform v = u.getViewingPlatform();
+ if (behaviorsOn) {
+ v.setViewPlatformBehavior(null);
+ button.setLabel("add behaviors");
+ behaviorsOn = false;
+ }
+ else {
+ v.setViewPlatformBehavior(orbit);
+ button.setLabel("remove behaviors");
+ behaviorsOn = true;
+ }
+ }
+ }
+
+ //
+ // The following allows Text3DLoad to be run as an application
+ // as well as an applet
+ //
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ new MainFrame(new Text3DLoad(args), 700, 700);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/texture/MultiTextureTest.java b/src/main/java/org/jdesktop/j3d/examples/texture/MultiTextureTest.java
new file mode 100644
index 0000000..49f9406
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/texture/MultiTextureTest.java
@@ -0,0 +1,344 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.texture;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.Choice;
+import java.awt.GraphicsConfiguration;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.image.BufferedImage;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.ImageComponent;
+import org.jogamp.java3d.ImageComponent2D;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.Texture2D;
+import org.jogamp.java3d.TextureAttributes;
+import org.jogamp.java3d.TextureUnitState;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.behaviors.vp.OrbitBehavior;
+import org.jogamp.java3d.utils.geometry.Box;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.java3d.utils.universe.ViewingPlatform;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+public class MultiTextureTest extends Applet implements ItemListener{
+
+ Choice choice;
+ TextureUnitState textureUnitState[] = new TextureUnitState[2];
+ Texture stoneTex;
+ Texture skyTex;
+ Texture lightTex;
+
+ private java.net.URL stoneImage = null;
+ private java.net.URL skyImage = null;
+
+ private SimpleUniverse u = null;
+
+ public Texture createLightMap(){
+
+ int width = 128;
+ int height = 128;
+ BufferedImage bimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+ int [] rgbArray = new int[width * height];
+ int index, index2;
+ int rgbInc = 256 / (width / 2 - 20);
+ int rgbValue = 0;
+ int k = width/2 - 5;
+ int i, j, rgb;
+
+ rgb = 0xff;
+ rgbValue = rgb | (rgb << 8) | (rgb << 16) | (rgb << 24);
+ for ( i = width / 2 - 1, j = 0; j < 10; j++, i--) {
+ rgbArray[i] = rgbValue;
+ }
+
+ for (; i > 8; i--, rgb -= rgbInc) {
+ rgbValue = rgb | (rgb << 8) | (rgb << 16) | (rgb << 24);
+ rgbArray[i] = rgbValue;
+ }
+
+ for (; i >= 0; i--) {
+ rgbArray[i] = rgbValue;
+ }
+
+ for (i = 0; i < width/2; i++) {
+ rgbValue = rgbArray[i];
+ index = i;
+ index2 = (width - i - 1);
+ for (j = 0; j < height; j++) {
+ rgbArray[index] = rgbArray[index2] = rgbValue;
+ index += width;
+ index2 += width;
+ }
+ }
+
+ bimage.setRGB(0, 0, width, height, rgbArray, 0, width);
+
+
+ ImageComponent2D grayImage = new ImageComponent2D(ImageComponent.FORMAT_RGB, bimage, true, true);
+
+ lightTex = new Texture2D(Texture.BASE_LEVEL, Texture.RGB, width, height);
+ lightTex.setImage(0, grayImage);
+
+ return lightTex;
+ }
+
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create a Transformgroup to scale all objects so they
+ // appear in the scene.
+ TransformGroup objScale = new TransformGroup();
+ Transform3D t3d = new Transform3D();
+ t3d.setScale(0.4);
+ objScale.setTransform(t3d);
+ objRoot.addChild(objScale);
+
+ TransformGroup objTrans = new TransformGroup();
+ //write-enable for behaviors
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
+ objTrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
+ objScale.addChild(objTrans);
+
+ Appearance ap = new Appearance();
+
+ // load textures
+ TextureAttributes texAttr1 = new TextureAttributes();
+ texAttr1.setTextureMode(TextureAttributes.DECAL);
+ TextureAttributes texAttr2 = new TextureAttributes();
+ texAttr2.setTextureMode(TextureAttributes.MODULATE);
+
+ TextureLoader tex = new TextureLoader(stoneImage, new String("RGB"),
+ TextureLoader.BY_REFERENCE | TextureLoader.Y_UP,
+ this);
+ if (tex == null)
+ return null;
+ stoneTex = tex.getTexture();
+
+ tex = new TextureLoader(skyImage, new String("RGB"),
+ TextureLoader.BY_REFERENCE | TextureLoader.Y_UP,
+ this);
+ if (tex == null)
+ return null;
+ skyTex = tex.getTexture();
+
+ lightTex = createLightMap();
+
+
+ textureUnitState[0] = new TextureUnitState(stoneTex, texAttr1, null);
+ textureUnitState[0].setCapability(TextureUnitState.ALLOW_STATE_WRITE);
+
+ textureUnitState[1] = new TextureUnitState(lightTex, texAttr2, null);
+ textureUnitState[1].setCapability(TextureUnitState.ALLOW_STATE_WRITE);
+
+ ap.setTextureUnitState(textureUnitState);
+
+ //Create a Box
+ Box BoxObj = new Box(1.5f, 1.5f, 0.8f, Box.GENERATE_NORMALS |
+ Box.GENERATE_TEXTURE_COORDS |
+ Box.GENERATE_TEXTURE_COORDS_Y_UP, ap, 2);
+ // add it to the scene graph.
+ objTrans.addChild(BoxObj);
+
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ //Shine it with two lights.
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Color3f lColor2 = new Color3f(0.2f, 0.2f, 0.1f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
+ Vector3f lDir2 = new Vector3f(0.0f, 0.0f, -1.0f);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ DirectionalLight lgt2 = new DirectionalLight(lColor2, lDir2);
+ lgt1.setInfluencingBounds(bounds);
+ lgt2.setInfluencingBounds(bounds);
+ objScale.addChild(lgt1);
+ objScale.addChild(lgt2);
+
+ // Let Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ public MultiTextureTest (){
+ }
+
+ public MultiTextureTest(java.net.URL stoneURL, java.net.URL skyURL) {
+ stoneImage = stoneURL;
+ skyImage = skyURL;
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ if (stoneImage == null) {
+ // the path to the image for an applet
+ stoneImage = Resources.getResource("resources/images/stone.jpg");
+ if (stoneImage == null) {
+ System.err.println("resources/images/stone.jpg not found");
+ System.exit(1);
+ }
+
+ if (skyImage == null) {
+ // the path to the image for an applet
+ skyImage = Resources.getResource("resources/images/bg.jpg");
+ if (skyImage == null) {
+ System.err.println("resources/images/bg.jpg not found");
+ System.exit(1);
+ }
+ }
+ }
+
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+
+ BranchGroup scene = createSceneGraph();
+ u = new SimpleUniverse(c);
+
+ ViewingPlatform viewingPlatform = u.getViewingPlatform();
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ viewingPlatform.setNominalViewingTransform();
+
+ // add orbit behavior but disable translate
+ OrbitBehavior orbit =
+ new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL |
+ OrbitBehavior.DISABLE_TRANSLATE);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
+ orbit.setSchedulingBounds(bounds);
+ viewingPlatform.setViewPlatformBehavior(orbit);
+
+ u.addBranchGraph(scene);
+
+ // create the gui
+ choice = new Choice();
+ choice.addItem("stone + light");
+ choice.addItem("stone");
+ choice.addItem("lightMap");
+ choice.addItem("sky");
+ choice.addItem("stone + sky");
+ choice.addItemListener(this);
+ add("North", choice);
+
+ }
+
+ public void destroy() {
+ // Cleanup reference to Java3D
+ textureUnitState = new TextureUnitState[2];
+ u.cleanup();
+ }
+
+ public void itemStateChanged(ItemEvent e)
+ {
+ int index = choice.getSelectedIndex();
+
+ switch (index) {
+ case 0 : /* stone + light */
+ textureUnitState[0].setTexture(stoneTex);
+ textureUnitState[1].setTexture(lightTex);
+ break;
+ case 1 : /* stone */
+ textureUnitState[0].setTexture(stoneTex);
+ textureUnitState[1].setTexture(null);
+ break;
+ case 2 : /* light */
+ textureUnitState[0].setTexture(null);
+ textureUnitState[1].setTexture(lightTex);
+ break;
+ case 3 : /* sky */
+ textureUnitState[0].setTexture(null);
+ textureUnitState[1].setTexture(skyTex);
+ break;
+ case 4 : /* stone + sky */
+ textureUnitState[0].setTexture(stoneTex);
+ textureUnitState[1].setTexture(skyTex);
+ break;
+ default: /* both */
+ break;
+ }
+ }
+
+ public static void main(String argv[])
+{
+ java.net.URL stoneURL = null;
+ java.net.URL skyURL = null;
+ // the path to the image for an application
+
+ stoneURL = Resources.getResource("resources/images/stone.jpg");
+ if (stoneURL == null) {
+ System.err.println("resources/images/stone.jpg not found");
+ System.exit(1);
+ }
+
+ skyURL = Resources.getResource("resources/images/bg.jpg");
+ if (skyURL == null) {
+ System.err.println("resources/images/bg.jpg not found");
+ System.exit(1);
+ }
+
+ new MainFrame(new MultiTextureTest(stoneURL, skyURL), 750, 750);
+ }
+}
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/texture/TextureImage.java b/src/main/java/org/jdesktop/j3d/examples/texture/TextureImage.java
new file mode 100644
index 0000000..59f8aa5
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/texture/TextureImage.java
@@ -0,0 +1,196 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.texture;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.GraphicsConfiguration;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.TextureAttributes;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.geometry.Box;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Point3d;
+
+public class TextureImage extends Applet {
+
+ private static final String defaultFileName = "resources/images/stone.jpg";
+ private java.net.URL texImage = null;
+
+ private SimpleUniverse u = null;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // Create appearance object for textured cube
+ Appearance app = new Appearance();
+ Texture tex = new TextureLoader(texImage,
+ TextureLoader.BY_REFERENCE | TextureLoader.Y_UP,
+ this).getTexture();
+ app.setTexture(tex);
+ TextureAttributes texAttr = new TextureAttributes();
+ texAttr.setTextureMode(TextureAttributes.MODULATE);
+ app.setTextureAttributes(texAttr);
+
+ // Create textured cube and add it to the scene graph.
+ Box textureCube = new Box(0.4f, 0.4f, 0.4f,
+ Box.GENERATE_TEXTURE_COORDS |
+ Box.GENERATE_TEXTURE_COORDS_Y_UP, app);
+ objTrans.addChild(textureCube);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into
+ // the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ public TextureImage() {
+ }
+
+ public TextureImage(java.net.URL url) {
+ texImage = url;
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ if (texImage == null) {
+ // the path to the image for an applet
+ texImage = Resources.getResource(defaultFileName);
+ if (texImage == null) {
+ System.err.println(defaultFileName + " not found");
+ System.exit(1);
+ }
+ }
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+
+ // Create a simple scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph();
+ u = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+
+ u.addBranchGraph(scene);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ //
+ // The following allows TextureImage to be run as an application
+ // as well as an applet
+ //
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.net.URL url = null;
+ if (args.length > 0) {
+ try {
+ final String name = args[0];
+ if (name.startsWith("http:") ||
+ name.startsWith("https:") ||
+ name.startsWith("ftp:") ||
+ name.startsWith("file:")) {
+ url = new java.net.URL(name);
+ } else {
+ url = new java.net.URL("file:" + name);
+ }
+ } catch (java.net.MalformedURLException ex) {
+ System.out.println(ex.getMessage());
+ System.exit(1);
+ }
+ } else {
+ // the path to the image for an application
+ url = Resources.getResource(defaultFileName);
+ if (url == null) {
+ System.err.println(defaultFileName + " not found");
+ System.exit(1);
+ }
+ }
+ new MainFrame(new TextureImage(url), 256, 256);
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/texture/TextureImageNPOT.java b/src/main/java/org/jdesktop/j3d/examples/texture/TextureImageNPOT.java
new file mode 100644
index 0000000..f55493c
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/texture/TextureImageNPOT.java
@@ -0,0 +1,249 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.texture;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.GraphicsConfiguration;
+import java.util.Map;
+
+import javax.swing.JOptionPane;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.ScaleInterpolator;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.TextureAttributes;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.geometry.Box;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Point3d;
+
+public class TextureImageNPOT extends Applet {
+
+ private static final String defaultFileName = "resources/images/Java3d.jpg";
+ private java.net.URL texImage = null;
+
+ private SimpleUniverse u = null;
+ private boolean allowNonPowerOfTwo = true;
+ private boolean mipmap = true;
+
+ public BranchGroup createSceneGraph() {
+ // Create the root of the branch graph
+ BranchGroup objRoot = new BranchGroup();
+
+ // Create the transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // root of the subgraph.
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // Create the scaling transform group node and initialize it to the
+ // identity. Enable the TRANSFORM_WRITE capability so that
+ // our behavior code can modify it at runtime. Add it to the
+ // objTrans group
+ TransformGroup objScale = new TransformGroup();
+ objScale.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objTrans.addChild(objScale);
+
+ // Create appearance object for textured cube
+ Appearance app = new Appearance();
+ int flags = TextureLoader.BY_REFERENCE | TextureLoader.Y_UP;
+
+ if (allowNonPowerOfTwo) {
+ flags |= TextureLoader.ALLOW_NON_POWER_OF_TWO;
+ }
+ if (mipmap) {
+ flags |= TextureLoader.GENERATE_MIPMAP;
+ }
+ Texture tex = new TextureLoader(texImage, flags, this).getTexture();
+ tex.setMagFilter(Texture.BASE_LEVEL_LINEAR);
+ if (mipmap) {
+ tex.setMinFilter(Texture.MULTI_LEVEL_LINEAR);
+ } else {
+ tex.setMinFilter(Texture.BASE_LEVEL_LINEAR);
+ }
+ app.setTexture(tex);
+ TextureAttributes texAttr = new TextureAttributes();
+ texAttr.setTextureMode(TextureAttributes.MODULATE);
+ app.setTextureAttributes(texAttr);
+
+ // Create textured cube and add it to the scene graph.
+ Box textureCube = new Box(0.4f, 0.4f, 0.4f,
+ Box.GENERATE_TEXTURE_COORDS |
+ Box.GENERATE_TEXTURE_COORDS_Y_UP, app);
+ objScale.addChild(textureCube);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into
+ // the scene graph.
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 50000, 0, 0,
+ 0, 0, 0);
+
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+
+ // Create a new Behavior object that will perform the desired
+ // operation on the specified transform object and add it into
+ // the scene graph.
+ Alpha scaleAlpha = new Alpha(-1,
+ Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE,
+ 0, 0,
+ 8000, 0, 0,
+ 8000, 0, 0);
+
+ ScaleInterpolator scaler =
+ new ScaleInterpolator(scaleAlpha, objScale, yAxis,
+ 0.01f, 1.5f);
+ scaler.setSchedulingBounds(bounds);
+ objScale.addChild(scaler);
+
+ // Have Java 3D perform optimizations on this scene graph.
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ public TextureImageNPOT() {
+ }
+
+ public TextureImageNPOT(java.net.URL url) {
+ texImage = url;
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ if (texImage == null) {
+ // the path to the image for an applet
+ texImage = Resources.getResource(defaultFileName);
+ if (texImage == null) {
+ System.err.println(defaultFileName + " not found");
+ System.exit(1);
+ }
+ }
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+
+ Map map = c.queryProperties();
+ Boolean value = (Boolean) map.get("textureNonPowerOfTwoAvailable");
+ String errorStr = null;
+ if (value == null) {
+ errorStr = "Canvas3D: textureNonPowerOfTwoAvailable property not found";
+ } else if (!value) {
+ errorStr = "Non-power-of-two textures are not available";
+ }
+
+ if (errorStr != null) {
+ String errorMessage = errorStr + "\n" +
+ "You should expect to see a white cube as a result";
+// System.err.println(errorMessage);
+ JOptionPane.showMessageDialog(this,
+ errorMessage,
+ "Insufficient Capabilities",
+ JOptionPane.ERROR_MESSAGE);
+ }
+
+ add("Center", c);
+
+ // Create a simple scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph();
+ u = new SimpleUniverse(c);
+
+ // This will move the ViewPlatform back a bit so the
+ // objects in the scene can be viewed.
+ u.getViewingPlatform().setNominalViewingTransform();
+
+ u.addBranchGraph(scene);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+ //
+ // The following allows TextureImageNPOT to be run as an application
+ // as well as an applet
+ //
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.net.URL url = null;
+ if (args.length > 0) {
+ try {
+ url = new java.net.URL("file:" + args[0]);
+ } catch (java.net.MalformedURLException ex) {
+ System.out.println(ex.getMessage());
+ System.exit(1);
+ }
+ } else {
+ // the path to the image for an application
+ url = Resources.getResource(defaultFileName);
+ if (url == null) {
+ System.err.println(defaultFileName + " not found");
+ System.exit(1);
+ }
+ }
+ new MainFrame(new TextureImageNPOT(url), 512, 512);
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/texture_by_ref/AnimateTexturesBehavior.java b/src/main/java/org/jdesktop/j3d/examples/texture_by_ref/AnimateTexturesBehavior.java
new file mode 100644
index 0000000..a0fb1e1
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/texture_by_ref/AnimateTexturesBehavior.java
@@ -0,0 +1,323 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.texture_by_ref;
+
+import java.awt.image.BufferedImage;
+import java.util.Enumeration;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.ImageComponent;
+import org.jogamp.java3d.ImageComponent2D;
+import org.jogamp.java3d.Texture2D;
+import org.jogamp.java3d.WakeupCriterion;
+import org.jogamp.java3d.WakeupOnElapsedFrames;
+import org.jogamp.java3d.utils.image.TextureLoader;
+
+public class AnimateTexturesBehavior extends Behavior {
+
+
+ // what image are we on
+ private int current;
+ private int max;
+
+ // the images
+ private ImageComponent2D[] images;
+
+ // the target
+ private Texture2D texture;
+ private Appearance appearance;
+
+ // the wakeup criterion
+ private WakeupCriterion wakeupC;
+
+ // are the images flipped?
+ private boolean flip;
+
+ // need the current type because by copy changes all images
+ // to TYPE_INT_ARGB
+ private int currentType;
+
+ // for custom types
+ public static final int TYPE_CUSTOM_RGBA = 0x01;
+ public static final int TYPE_CUSTOM_RGB = 0x02;
+
+ private int customType;
+
+ // create a new AnimateTextureBehavior
+ // initialize the images
+ public AnimateTexturesBehavior(Texture2D texP,
+ java.net.URL[] fnames,
+ Appearance appP,
+ TextureByReference applet) {
+ int size = fnames.length;
+ images = new ImageComponent2D[size];
+ BufferedImage bImage;
+ TextureLoader loader;
+ for (int i = 0; i < size; i++) {
+ loader = new TextureLoader(fnames[i],
+ TextureLoader.BY_REFERENCE |
+ TextureLoader.Y_UP, applet);
+ images[i] = loader.getImage();
+ bImage = images[i].getImage();
+
+ // convert the image to TYPE_4BYTE_ABGR
+ currentType = BufferedImage.TYPE_4BYTE_ABGR;
+ bImage = ImageOps.convertImage(bImage, currentType);
+ // flip the image
+ flip = true;
+ ImageOps.flipImage(bImage);
+
+ // set the image on the ImageComponent to the new one
+ images[i].set(bImage);
+
+ images[i].setCapability(ImageComponent.ALLOW_IMAGE_READ);
+ images[i].setCapability(ImageComponent.ALLOW_FORMAT_READ);
+ }
+ texture = texP;
+ current = 0;
+ max = size;
+ wakeupC = new WakeupOnElapsedFrames(20);
+ appearance = appP;
+ }
+
+ // initialize to the first image
+ public void initialize() {
+ texture.setImage(0, images[current]);
+ if (current < max-1) current++;
+ else current = 0;
+ wakeupOn(wakeupC);
+ }
+
+ // procesStimulus changes the ImageComponent of the texture
+ public void processStimulus(Enumeration criteria) {
+ // ImageOps.printType(images[current].getImage());
+ texture.setImage(0, images[current]);
+ appearance.setTexture(texture);
+ if (current < max-1) current++;
+ else current = 0;
+ wakeupOn(wakeupC);
+ }
+
+ // flip the image -- useful depending on yUp
+ public void setFlipImages(boolean b) {
+ // double check that flipping is necessary
+ if (b != flip) {
+ BufferedImage bImage;
+
+ // these are the same for all images so get info once
+ int format = images[0].getFormat();
+ boolean byRef = images[0].isByReference();
+ boolean yUp = images[0].isYUp();
+
+ // flip all the images
+ // have to new ImageComponents because can't set the image at runtime
+ for (int i = 0; i < images.length; i++) {
+ bImage = images[i].getImage();
+ ImageOps.flipImage(bImage);
+ // if we are byRef and the bImage type does not match currentType
+ // we need to convert it. If we are not byRef we will
+ // save converting until it is changed to byRef
+ if (byRef && bImage.getType() != currentType) {
+ if (currentType != BufferedImage.TYPE_CUSTOM) {
+ bImage = ImageOps.convertImage(bImage, currentType);
+ }
+ else if (customType == this.TYPE_CUSTOM_RGBA) {
+ bImage = ImageOps.convertToCustomRGBA(bImage);
+ }
+ else {
+ bImage = ImageOps.convertToCustomRGB(bImage);
+ }
+ }
+ images[i] = new ImageComponent2D(format, bImage, byRef, yUp);
+ images[i].setCapability(ImageComponent.ALLOW_IMAGE_READ);
+ images[i].setCapability(ImageComponent.ALLOW_FORMAT_READ);
+ }
+
+ // set flip to new value
+ flip = b;
+ }
+ }
+
+ // create new ImageComponents with yUp set to the parameter. yUp on
+ // an ImageComponent cannot be changed at runtim
+ public void setYUp(boolean b) {
+ // double check that changing yUp is necessary
+ if (b != images[0].isYUp()) {
+
+ // these are the same for all images so get info once
+ int format = images[0].getFormat();
+ boolean byRef = images[0].isByReference();
+
+ // reset yUp on all the images -- have to new ImageComponents because
+ // cannot change the value at runtime
+ for (int i = 0; i < images.length; i++) {
+ // if we are byRef and the bImage type does not match currentType
+ // we need to convert it. If we are not byRef we will
+ // save converting until it is changed to byRef
+ BufferedImage bImage = images[i].getImage();
+ if (byRef && bImage.getType() != currentType) {
+ // bImage = ImageOps.convertImage(bImage, currentType);
+ if (currentType != BufferedImage.TYPE_CUSTOM) {
+ bImage = ImageOps.convertImage(bImage, currentType);
+ }
+ else if (customType == this.TYPE_CUSTOM_RGBA) {
+ bImage = ImageOps.convertToCustomRGBA(bImage);
+ }
+ else {
+ bImage = ImageOps.convertToCustomRGB(bImage);
+ }
+ }
+ images[i] = new ImageComponent2D(format, bImage,
+ byRef, b);
+ images[i].setCapability(ImageComponent.ALLOW_IMAGE_READ);
+ images[i].setCapability(ImageComponent.ALLOW_FORMAT_READ);
+ }
+ }
+ }
+
+ // create new ImageComponents with ByReference set by parameter.
+ // by reference cannot be changed on an image component at runtime
+ public void setByReference(boolean b) {
+ // double check that changing is necessary
+ if (b != images[0].isByReference()) {
+
+ // these are the same for all images so get info once
+ int format = images[0].getFormat();
+ boolean yUp = images[0].isYUp();
+
+ // reset yUp on all the images
+ // have to new ImageComponents because cannot set value
+ for (int i = 0; i < images.length; i++) {
+ // if the bImage type does not match currentType and we are setting
+ // to byRef we need to convert it
+ BufferedImage bImage = images[i].getImage();
+ if (bImage.getType() != currentType && b) {
+ // bImage = ImageOps.convertImage(bImage, currentType);
+ if (currentType != BufferedImage.TYPE_CUSTOM) {
+ bImage = ImageOps.convertImage(bImage, currentType);
+ }
+ else if (customType == this.TYPE_CUSTOM_RGBA) {
+ bImage = ImageOps.convertToCustomRGBA(bImage);
+ }
+ else {
+ bImage = ImageOps.convertToCustomRGB(bImage);
+ }
+ }
+ images[i] = new ImageComponent2D(format, bImage, b, yUp);
+ images[i].setCapability(ImageComponent.ALLOW_IMAGE_READ);
+ images[i].setCapability(ImageComponent.ALLOW_FORMAT_READ);
+ }
+ }
+ }
+
+ // make a new wakeup criterion object based on the new delay time
+ public void setFrameDelay(int delay) {
+ wakeupC = new WakeupOnElapsedFrames(delay);
+ }
+
+ //change the type of image
+ public void setImageType(int newType) {
+ currentType = newType;
+
+ // only need to change the images if we are byRef otherwise will change
+ // them when we chnage to byRef
+ if (images[0].isByReference() == true) {
+ // this information is the same for all
+ int format = images[0].getFormat();
+ boolean yUp = images[0].isYUp();
+ boolean byRef = true;
+ for (int i = 0; i < images.length; i++) {
+ BufferedImage bImage = images[i].getImage();
+ bImage = ImageOps.convertImage(bImage, currentType);
+ images[i] = new ImageComponent2D(format, bImage, byRef, yUp);
+ images[i].setCapability(ImageComponent.ALLOW_IMAGE_READ);
+ images[i].setCapability(ImageComponent.ALLOW_FORMAT_READ);
+ }
+ }
+ }
+
+ public void setImageTypeCustomRGBA() {
+ currentType = BufferedImage.TYPE_CUSTOM;
+ customType = this.TYPE_CUSTOM_RGBA;
+
+ // only need to change images if we are byRef otherwise will change
+ // them when we change to byRef
+ if (images[0].isByReference()) {
+ // this information is the same for all
+ int format = images[0].getFormat();
+ boolean yUp = images[0].isYUp();
+ boolean byRef = true;
+ for (int i = 0; i < images.length; i++) {
+ BufferedImage bImage = images[i].getImage();
+ bImage = ImageOps.convertToCustomRGBA(bImage);
+ images[i] = new ImageComponent2D(format, bImage, byRef, yUp);
+ images[i].setCapability(ImageComponent.ALLOW_IMAGE_READ);
+ images[i].setCapability(ImageComponent.ALLOW_FORMAT_READ);
+ }
+ }
+ }
+
+ public void setImageTypeCustomRGB() {
+ currentType = BufferedImage.TYPE_CUSTOM;
+ customType = this.TYPE_CUSTOM_RGB;
+
+ // only need to change images if we are byRef otherwise will change
+ // them when we change to byRef
+ if (images[0].isByReference()) {
+ // this information is the same for all
+ int format = images[0].getFormat();
+ boolean yUp = images[0].isYUp();
+ boolean byRef = true;
+ for (int i = 0; i < images.length; i++) {
+ BufferedImage bImage = images[i].getImage();
+ bImage = ImageOps.convertToCustomRGB(bImage);
+ images[i] = new ImageComponent2D(format, bImage, byRef, yUp);
+ images[i].setCapability(ImageComponent.ALLOW_IMAGE_READ);
+ images[i].setCapability(ImageComponent.ALLOW_FORMAT_READ);
+ }
+ }
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/texture_by_ref/ImageOps.java b/src/main/java/org/jdesktop/j3d/examples/texture_by_ref/ImageOps.java
new file mode 100644
index 0000000..aa689b6
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/texture_by_ref/ImageOps.java
@@ -0,0 +1,181 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.texture_by_ref;
+
+import java.awt.Transparency;
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.DataBuffer;
+import java.awt.image.DataBufferByte;
+import java.awt.image.Raster;
+import java.awt.image.WritableRaster;
+
+// some useful, static image operations
+
+public class ImageOps {
+
+ // flip the image
+ public static void flipImage(BufferedImage bImage) {
+ int width = bImage.getWidth();
+ int height = bImage.getHeight();
+ int[] rgbArray = new int[width*height];
+ bImage.getRGB(0, 0, width, height, rgbArray, 0, width);
+ int[] tempArray = new int[width*height];
+ int y2 = 0;
+ for (int y = height-1; y >= 0; y--) {
+ for (int x = 0; x < width; x++) {
+ tempArray[y2*width+x] = rgbArray[y*width+x];
+ }
+ y2++;
+ }
+ bImage.setRGB(0, 0, width, height, tempArray, 0, width);
+ }
+
+
+ // convert the image to a specified BufferedImage type and return it
+ public static BufferedImage convertImage(BufferedImage bImage, int type) {
+ int width = bImage.getWidth();
+ int height = bImage.getHeight();
+ BufferedImage newImage = new BufferedImage(width, height, type);
+ int[] rgbArray = new int[width*height];
+ bImage.getRGB(0, 0, width, height, rgbArray, 0, width);
+ newImage.setRGB(0, 0, width, height, rgbArray, 0, width);
+ return newImage;
+ }
+
+ // print out some of the types of BufferedImages
+ static void printType(BufferedImage bImage) {
+ int type = bImage.getType();
+ if (type == BufferedImage.TYPE_4BYTE_ABGR) {
+ System.out.println("TYPE_4BYTE_ABGR");
+ }
+ else if (type == BufferedImage.TYPE_INT_ARGB) {
+ System.out.println("TYPE_INT_ARGB");
+ }
+ else if (type == BufferedImage.TYPE_3BYTE_BGR) {
+ System.out.println("TYPE_3BYTE_BGR");
+ }
+ else if (type == BufferedImage.TYPE_CUSTOM) {
+ System.out.println("TYPE_CUSTOM");
+ }
+ else System.out.println(type);
+ }
+
+ public static BufferedImage convertToCustomRGBA(BufferedImage bImage) {
+ if (bImage.getType() != BufferedImage.TYPE_INT_ARGB) {
+ ImageOps.convertImage(bImage, BufferedImage.TYPE_INT_ARGB);
+ }
+
+ int width = bImage.getWidth();
+ int height = bImage.getHeight();
+
+ ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+ int[] nBits = {8, 8, 8, 8};
+ ColorModel cm = new ComponentColorModel(cs, nBits, true, false,
+ Transparency.OPAQUE, 0);
+ int[] bandOffset = {0, 1, 2, 3};
+
+ WritableRaster newRaster =
+ Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height,
+ width*4, 4, bandOffset, null);
+ byte[] byteData = ((DataBufferByte)newRaster.getDataBuffer()).getData();
+ Raster origRaster = bImage.getData();
+ int[] pixel = new int[4];
+ int k = 0;
+ for (int j = 0; j < height; j++) {
+ for (int i = 0; i < width; i++) {
+ pixel = origRaster.getPixel(i, j, pixel);
+ byteData[k++] = (byte)(pixel[0]);
+ byteData[k++] = (byte)(pixel[1]);
+ byteData[k++] = (byte)(pixel[2]);
+ byteData[k++] = (byte)(pixel[3]);
+ }
+ }
+ BufferedImage newImage = new BufferedImage(cm, newRaster, false, null);
+// if (newImage.getType() == BufferedImage.TYPE_CUSTOM) {
+// System.out.println("Type is custom");
+// }
+ return newImage;
+ }
+
+ public static BufferedImage convertToCustomRGB(BufferedImage bImage) {
+ if (bImage.getType() != BufferedImage.TYPE_INT_ARGB) {
+ ImageOps.convertImage(bImage, BufferedImage.TYPE_INT_ARGB);
+ }
+
+ int width = bImage.getWidth();
+ int height = bImage.getHeight();
+
+ ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+ int[] nBits = {8, 8, 8};
+ ColorModel cm = new ComponentColorModel(cs, nBits, false, false,
+ Transparency.OPAQUE, 0);
+ int[] bandOffset = {0, 1, 2};
+
+ WritableRaster newRaster =
+ Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height,
+ width*3, 3, bandOffset, null);
+ byte[] byteData = ((DataBufferByte)newRaster.getDataBuffer()).getData();
+ Raster origRaster = bImage.getData();
+ int[] pixel = new int[4];
+ int k = 0;
+ for (int j = 0; j < height; j++) {
+ for (int i = 0; i < width; i++) {
+ pixel = origRaster.getPixel(i, j, pixel);
+ byteData[k++] = (byte)(pixel[0]);
+ byteData[k++] = (byte)(pixel[1]);
+ byteData[k++] = (byte)(pixel[2]);
+ }
+ }
+ BufferedImage newImage = new BufferedImage(cm, newRaster, false, null);
+// if (newImage.getType() == BufferedImage.TYPE_CUSTOM) {
+// System.out.println("Type is custom");
+// }
+ return newImage;
+ }
+}
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/texture_by_ref/Tetrahedron.java b/src/main/java/org/jdesktop/j3d/examples/texture_by_ref/Tetrahedron.java
new file mode 100644
index 0000000..063529c
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/texture_by_ref/Tetrahedron.java
@@ -0,0 +1,228 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.texture_by_ref;
+
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.Shape3D;
+import org.jogamp.java3d.TriangleArray;
+import org.jogamp.vecmath.Point2f;
+import org.jogamp.vecmath.Point3f;
+import org.jogamp.vecmath.TexCoord2f;
+import org.jogamp.vecmath.Vector3f;
+
+
+public class Tetrahedron extends Shape3D {
+
+ private static final float sqrt3 = (float) Math.sqrt(3.0);
+ private static final float sqrt3_3 = sqrt3 / 3.0f;
+ private static final float sqrt24_3 = (float) Math.sqrt(24.0) / 3.0f;
+
+ private static final float ycenter = 0.5f * sqrt24_3;
+ private static final float zcenter = -sqrt3_3;
+
+ private static final Point3f p1 = new Point3f(-1.0f, -ycenter, -zcenter);
+ private static final Point3f p2 = new Point3f(1.0f, -ycenter, -zcenter);
+ private static final Point3f p3 = new Point3f(0.0f, -ycenter, -sqrt3 - zcenter);
+ private static final Point3f p4 = new Point3f(0.0f, sqrt24_3 - ycenter, 0.0f);
+
+ private static final Point3f[] verts = {
+ p1, p2, p4, // front face
+ p1, p4, p3, // left, back face
+ p2, p3, p4, // right, back face
+ p1, p3, p2, // bottom face
+ };
+
+ private Point2f texCoord[] = {
+ new Point2f(-0.25f, 0.0f),
+ new Point2f(1.25f, 0.0f),
+ new Point2f(0.5f, 2.0f),
+ };
+
+ private TriangleArray geometryByRef;
+ private TriangleArray geometryByCopy;
+
+ // for geometry by reference
+ private Point3f[] verticesArray = new Point3f[12];
+ private TexCoord2f[] textureCoordsArray = new TexCoord2f[12];
+ private Vector3f[] normalsArray = new Vector3f[12];
+
+ // default to geometry by copy
+ public Tetrahedron() {
+ this(false);
+ }
+
+ // creates a tetrahedron with geometry by reference or by copy depending on
+ // the byRef parameter
+ public Tetrahedron(boolean byRef) {
+ if (byRef) {
+ createGeometryByRef();
+ this.setGeometry(geometryByRef);
+ }
+ else {
+ createGeometryByCopy();
+ this.setGeometry(geometryByCopy);
+ }
+ this.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
+ this.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
+ setAppearance(new Appearance());
+ }
+
+ // create the geometry by reference and
+ // store it in the geometryByRef variable
+ public void createGeometryByRef() {
+// System.out.println("createGeometryByRef");
+ geometryByRef = new TriangleArray(12, TriangleArray.COORDINATES |
+ TriangleArray.NORMALS |
+ TriangleArray.TEXTURE_COORDINATE_2 |
+ TriangleArray.BY_REFERENCE);
+
+ int i;
+
+ // the coordinates
+ for (i = 0; i < 12; i++) {
+ verticesArray[i] = new Point3f(verts[i]);
+ }
+ geometryByRef.setCoordRef3f(verticesArray);
+// System.out.println("coordinates set");
+// Point3f[] temp1 = geometryByRef.getCoordRef3f();
+// for (i = 0; i < 12; i++) {
+// System.out.println(temp1[i]);
+// }
+
+ // the texture coordinates
+ for (i = 0; i < 12; i++) {
+ textureCoordsArray[i] = new TexCoord2f(texCoord[i%3]);
+ }
+ geometryByRef.setTexCoordRef2f(0, textureCoordsArray);
+// System.out.println("texture coords set");
+// TexCoord2f[] temp2 = geometryByRef.getTexCoordRef2f(0);
+// for (i = 0; i < 12; i++) {
+// System.out.println(temp2[i]);
+// }
+
+ // the normals
+ Vector3f normal = new Vector3f();
+ Vector3f v1 = new Vector3f();
+ Vector3f v2 = new Vector3f();
+ Point3f[] pts = new Point3f[3];
+ for (int face = 0; face < 4; face++) {
+ pts[0] = new Point3f(verts[face*3]);
+ pts[1] = new Point3f(verts[face*3+1]);
+ pts[2] = new Point3f(verts[face*3+2]);
+ v1.sub(pts[1], pts[0]);
+ v2.sub(pts[2], pts[0]);
+ normal.cross(v1, v2);
+ normal.normalize();
+ for (i = 0; i < 3; i++) {
+ normalsArray[face*3+i] = new Vector3f(normal);
+ }
+ }
+ geometryByRef.setNormalRef3f(normalsArray);
+// System.out.println("normals set");
+// Vector3f[] temp3 = geometryByRef.getNormalRef3f();
+// for (i = 0; i < 12; i++) {
+// System.out.println(temp3[i]);
+// }
+ }
+
+ // create the geometry by copy and store it in the geometryByCopy variable
+ public void createGeometryByCopy() {
+ int i;
+ geometryByCopy = new TriangleArray(12, TriangleArray.COORDINATES |
+ TriangleArray.NORMALS |
+ TriangleArray.TEXTURE_COORDINATE_2);
+
+ geometryByCopy.setCoordinates(0, verts);
+
+ for (i = 0; i < 12; i++) {
+ geometryByCopy.setTextureCoordinate(0, i,
+ new TexCoord2f(texCoord[i%3]));
+ }
+
+ int face;
+ Vector3f normal = new Vector3f();
+ Vector3f v1 = new Vector3f();
+ Vector3f v2 = new Vector3f();
+ Point3f [] pts = new Point3f[3];
+ for (i = 0; i < 3; i++) pts[i] = new Point3f();
+
+ for (face = 0; face < 4; face++) {
+ geometryByCopy.getCoordinates(face*3, pts);
+ v1.sub(pts[1], pts[0]);
+ v2.sub(pts[2], pts[0]);
+ normal.cross(v1, v2);
+ normal.normalize();
+ for (i = 0; i < 3; i++) {
+ geometryByCopy.setNormal((face * 3 + i), normal);
+ }
+ }
+ }
+
+ // set the geometry to geometryByRef or geometryByCopy depending on the
+ // parameter. Create geometryByRef or geometryByCopy if necessary
+ public void setByReference(boolean b) {
+// System.out.println("Tetrahedron.setByReference " + b);
+ // by reference is true
+ if (b) {
+ // if there is no geometryByRef, create it
+ if (geometryByRef == null) {
+ createGeometryByRef();
+ }
+ // set the geometry
+ this.setGeometry(geometryByRef);
+ }
+ // by reference is false
+ else {
+ // if there is no geometryByCopy, create it
+ if (geometryByCopy == null) {
+ createGeometryByCopy();
+ }
+ // set the geometry
+ this.setGeometry(geometryByCopy);
+ }
+ }
+}
+
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/texture_by_ref/TextureByReference.java b/src/main/java/org/jdesktop/j3d/examples/texture_by_ref/TextureByReference.java
new file mode 100644
index 0000000..b30b9a2
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/texture_by_ref/TextureByReference.java
@@ -0,0 +1,581 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.texture_by_ref;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.GraphicsConfiguration;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.image.BufferedImage;
+
+import javax.swing.BoxLayout;
+import javax.swing.ButtonGroup;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JSlider;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.jdesktop.j3d.examples.Resources;
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.AmbientLight;
+import org.jogamp.java3d.Appearance;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.DirectionalLight;
+import org.jogamp.java3d.ImageComponent2D;
+import org.jogamp.java3d.Material;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Texture;
+import org.jogamp.java3d.Texture2D;
+import org.jogamp.java3d.TextureAttributes;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.image.TextureLoader;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Color3f;
+import org.jogamp.vecmath.Point3d;
+import org.jogamp.vecmath.Vector3f;
+
+
+public class TextureByReference extends Applet
+implements ItemListener, ActionListener, ChangeListener {
+
+ // need reference to animation behavior
+ private AnimateTexturesBehavior animate;
+
+ // need reference to tetrahedron
+ private Tetrahedron tetra;
+
+ // the gui buttons
+ private JCheckBox flipB;
+ private JRadioButton texByRef;
+ private JRadioButton texByCopy;
+ private JRadioButton geomByRef;
+ private JRadioButton geomByCopy;
+ private JRadioButton img4ByteABGR;
+ private JRadioButton img3ByteBGR;
+ private JRadioButton imgIntARGB;
+ private JRadioButton imgCustomRGBA;
+ private JRadioButton imgCustomRGB;
+ private JRadioButton yUp;
+ private JRadioButton yDown;
+ private JButton animationB;
+ private JSlider frameDelay;
+
+ private SimpleUniverse universe = null;
+
+ // image files used for the Texture animation for the applet,
+ // or if no parameters are passed in for the application
+ public static final String[] defaultFiles = {
+ "resources/images/animation1.gif",
+ "resources/images/animation2.gif",
+ "resources/images/animation3.gif",
+ "resources/images/animation4.gif",
+ "resources/images/animation5.gif",
+ "resources/images/animation6.gif",
+ "resources/images/animation7.gif",
+ "resources/images/animation8.gif",
+ "resources/images/animation9.gif",
+ "resources/images/animation10.gif"};
+
+ private java.net.URL[] urls = null;
+
+
+ public TextureByReference() {
+ }
+
+ public TextureByReference(java.net.URL[] fnamesP) {
+ urls = fnamesP;
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ if (urls == null) {
+ urls = new java.net.URL[defaultFiles.length];
+ for (int i = 0; i < defaultFiles.length; i++) {
+ urls[i] = Resources.getResource(defaultFiles[i]);
+ if (urls[i] == null) {
+ System.err.println(defaultFiles[i] + " not found");
+ System.exit(1);
+ }
+ /*
+ try {
+ urls[i] = new java.net.URL(getCodeBase().toString() +
+ defaultFiles[i]);
+ }
+ catch (java.net.MalformedURLException ex) {
+ System.out.println(ex.getMessage());
+ System.exit(1);
+ }
+ */
+ }
+ }
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D canvas = new Canvas3D(config);
+
+ add("Center", canvas);
+
+ // create a simple scene graph and attach it to a simple universe
+ BranchGroup scene = createSceneGraph();
+ universe = new SimpleUniverse(canvas);
+ universe.getViewingPlatform().setNominalViewingTransform();
+ universe.addBranchGraph(scene);
+
+ // create the gui
+ JPanel gui = buildGui();
+
+ this.add("South", gui);
+ }
+
+ public void destroy() {
+ universe.cleanup();
+ }
+
+ public JPanel buildGui() {
+ flipB = new JCheckBox("flip image", true);
+ flipB.addItemListener(this);
+ javax.swing.Box flipBox = new javax.swing.Box(BoxLayout.Y_AXIS);
+ flipBox.add(flipB);
+ Component strut1 = flipBox.createVerticalStrut(flipB.getPreferredSize().height);
+ Component strut2 = flipBox.createVerticalStrut(flipB.getPreferredSize().height);
+ Component strut3 = flipBox.createVerticalStrut(flipB.getPreferredSize().height);
+ Component strut4 = flipBox.createVerticalStrut(flipB.getPreferredSize().height);
+ Component strut5 = flipBox.createVerticalStrut(flipB.getPreferredSize().height);
+ flipBox.add(strut1);
+ flipBox.add(strut2);
+ flipBox.add(strut3);
+ flipBox.add(strut4);
+ flipBox.add(strut5);
+
+ yUp = new JRadioButton("y up");
+ yUp.addActionListener(this);
+ yUp.setSelected(true);
+ yDown = new JRadioButton("y down");
+ yDown.addActionListener(this);
+ ButtonGroup yGroup = new ButtonGroup();
+ yGroup.add(yUp);
+ yGroup.add(yDown);
+ JLabel yLabel = new JLabel("Image Orientation:");
+ javax.swing.Box yBox = new javax.swing.Box(BoxLayout.Y_AXIS);
+ yBox.add(yLabel);
+ yBox.add(yUp);
+ yBox.add(yDown);
+ strut1 = yBox.createVerticalStrut(yUp.getPreferredSize().height);
+ strut2 = yBox.createVerticalStrut(yUp.getPreferredSize().height);
+ strut3 = yBox.createVerticalStrut(yUp.getPreferredSize().height);
+ yBox.add(strut1);
+ yBox.add(strut2);
+ yBox.add(strut3);
+
+ texByRef = new JRadioButton("by reference");
+ texByRef.addActionListener(this);
+ texByRef.setSelected(true);
+ texByCopy = new JRadioButton("by copy");
+ texByCopy.addActionListener(this);
+ ButtonGroup texGroup = new ButtonGroup();
+ texGroup.add(texByRef);
+ texGroup.add(texByCopy);
+ JLabel texLabel = new JLabel("Texture:*");
+ javax.swing.Box texBox = new javax.swing.Box(BoxLayout.Y_AXIS);
+ texBox.add(texLabel);
+ texBox.add(texByRef);
+ texBox.add(texByCopy);
+ strut1 = texBox.createVerticalStrut(texByRef.getPreferredSize().height);
+ strut2 = texBox.createVerticalStrut(texByRef.getPreferredSize().height);
+ strut3 = texBox.createVerticalStrut(texByRef.getPreferredSize().height);
+ texBox.add(strut1);
+ texBox.add(strut2);
+ texBox.add(strut3);
+
+ geomByRef = new JRadioButton("by reference");
+ geomByRef.addActionListener(this);
+ geomByRef.setSelected(true);
+ geomByCopy = new JRadioButton("by copy");
+ geomByCopy.addActionListener(this);
+ ButtonGroup geomGroup = new ButtonGroup();
+ geomGroup.add(geomByRef);
+ geomGroup.add(geomByCopy);
+ JLabel geomLabel = new JLabel("Geometry:");
+ javax.swing.Box geomBox = new javax.swing.Box(BoxLayout.Y_AXIS);
+ geomBox.add(geomLabel);
+ geomBox.add(geomByRef);
+ geomBox.add(geomByCopy);
+ strut1 = geomBox.createVerticalStrut(geomByRef.getPreferredSize().height);
+ strut2 = geomBox.createVerticalStrut(geomByRef.getPreferredSize().height);
+ strut3 = geomBox.createVerticalStrut(geomByRef.getPreferredSize().height);
+ geomBox.add(strut1);
+ geomBox.add(strut2);
+ geomBox.add(strut3);
+
+ img4ByteABGR = new JRadioButton("TYPE_4BYTE_ABGR");
+ img4ByteABGR.addActionListener(this);
+ img4ByteABGR.setSelected(true);
+ img3ByteBGR = new JRadioButton("TYPE_3BYTE_BGR");
+ img3ByteBGR.addActionListener(this);
+ imgIntARGB = new JRadioButton("TYPE_INT_ARGB");
+ imgIntARGB.addActionListener(this);
+ imgCustomRGBA = new JRadioButton("TYPE_CUSTOM RGBA");
+ imgCustomRGBA.addActionListener(this);
+ imgCustomRGB = new JRadioButton("TYPE_CUSTOM RGB");
+ imgCustomRGB.addActionListener(this);
+ ButtonGroup imgGroup = new ButtonGroup();
+ imgGroup.add(img4ByteABGR);
+ imgGroup.add(img3ByteBGR);
+ imgGroup.add(imgIntARGB);
+ imgGroup.add(imgCustomRGBA);
+ imgGroup.add(imgCustomRGB);
+ JLabel imgLabel = new JLabel("Image Type:*");
+ javax.swing.Box imgBox = new javax.swing.Box(BoxLayout.Y_AXIS);
+ imgBox.add(imgLabel);
+ imgBox.add(img4ByteABGR);
+ imgBox.add(img3ByteBGR);
+ imgBox.add(imgIntARGB);
+ imgBox.add(imgCustomRGBA);
+ imgBox.add(imgCustomRGB);
+
+ javax.swing.Box topBox = new javax.swing.Box(BoxLayout.X_AXIS);
+ topBox.add(flipBox);
+ topBox.add(texBox);
+ topBox.add(geomBox);
+ topBox.add(yBox);
+ Component strut = topBox.createRigidArea(new Dimension(10, 10));
+ topBox.add(strut);
+ topBox.add(imgBox);
+
+ frameDelay = new JSlider(0, 50, 0);
+ frameDelay.addChangeListener(this);
+ frameDelay.setSnapToTicks(true);
+ frameDelay.setPaintTicks(true);
+ frameDelay.setPaintLabels(true);
+ frameDelay.setMajorTickSpacing(10);
+ frameDelay.setMinorTickSpacing(1);
+ frameDelay.setValue(20);
+ JLabel delayL = new JLabel("frame delay");
+ javax.swing.Box delayBox = new javax.swing.Box(BoxLayout.X_AXIS);
+ delayBox.add(delayL);
+ delayBox.add(frameDelay);
+
+ animationB = new JButton(" stop animation ");
+ animationB.addActionListener(this);
+
+ JLabel texInfo1 = new JLabel("*To use ImageComponent by reference feature, use TYPE_4BYTE_ABGR on Solaris");
+ JLabel texInfo2 = new JLabel("and TYPE_3BYTE_BGR on Windows");
+
+ JPanel buttonP = new JPanel();
+ GridBagLayout gridbag = new GridBagLayout();
+ GridBagConstraints c = new GridBagConstraints();
+ buttonP.setLayout(gridbag);
+ c.anchor = GridBagConstraints.CENTER;
+ c.gridwidth = GridBagConstraints.REMAINDER;
+ gridbag.setConstraints(topBox, c);
+ buttonP.add(topBox);
+ gridbag.setConstraints(delayBox, c);
+ buttonP.add(delayBox);
+ gridbag.setConstraints(animationB, c);
+ buttonP.add(animationB);
+ gridbag.setConstraints(texInfo1, c);
+ buttonP.add(texInfo1);
+ gridbag.setConstraints(texInfo2, c);
+ buttonP.add(texInfo2);
+
+ return buttonP;
+
+ }
+
+ public BranchGroup createSceneGraph() {
+
+ // create the root of the branch group
+ BranchGroup objRoot = new BranchGroup();
+
+ // create the transform group node and initialize it
+ // enable the TRANSFORM_WRITE capability so that it can be modified
+ // at runtime. Add it to the root of the subgraph
+ Transform3D rotate = new Transform3D();
+ TransformGroup objTrans = new TransformGroup(rotate);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // bounds
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // set up some light
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -0.5f, -1.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+
+ AmbientLight aLgt = new AmbientLight(alColor);
+ aLgt.setInfluencingBounds(bounds);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ lgt1.setInfluencingBounds(bounds);
+ objRoot.addChild(aLgt);
+ objRoot.addChild(lgt1);
+
+
+ Appearance appearance = new Appearance();
+
+ // enable the TEXTURE_WRITE so we can modify it at runtime
+ appearance.setCapability(Appearance.ALLOW_TEXTURE_WRITE);
+
+ // load the first texture
+ TextureLoader loader = new TextureLoader(urls[0],
+ TextureLoader.BY_REFERENCE |
+ TextureLoader.Y_UP,
+ this);
+ // get the texture from the loader
+ Texture2D tex = (Texture2D)loader.getTexture();
+
+ // get the BufferedImage to convert to TYPE_4BYTE_ABGR and flip
+ // get the ImageComponent because we need it anyway
+ ImageComponent2D imageComp = (ImageComponent2D)tex.getImage(0);
+ BufferedImage bImage = imageComp.getImage();
+ // convert the image
+ bImage = ImageOps.convertImage(bImage, BufferedImage.TYPE_4BYTE_ABGR);
+ // flip the image
+ ImageOps.flipImage(bImage);
+ imageComp.set(bImage);
+
+ tex.setCapability(Texture.ALLOW_IMAGE_WRITE);
+ tex.setBoundaryModeS(Texture.CLAMP);
+ tex.setBoundaryModeT(Texture.CLAMP);
+ tex.setBoundaryColor(1.0f, 1.0f, 1.0f, 1.0f);
+
+ // set the image of the texture
+ tex.setImage(0, imageComp);
+
+ // set the texture on the appearance
+ appearance.setTexture(tex);
+
+ // set texture attributes
+ TextureAttributes texAttr = new TextureAttributes();
+ texAttr.setTextureMode(TextureAttributes.MODULATE);
+ appearance.setTextureAttributes(texAttr);
+
+ // set material properties
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ appearance.setMaterial(new Material(white, black, white, black, 1.0f));
+
+ // create a scale transform
+ Transform3D scale = new Transform3D();
+ scale.set(.6);
+ TransformGroup objScale = new TransformGroup(scale);
+ objTrans.addChild(objScale);
+
+ tetra = new Tetrahedron(true);
+ tetra.setAppearance(appearance);
+ objScale.addChild(tetra);
+
+ // create the behavior
+ animate = new AnimateTexturesBehavior(tex,
+ urls,
+ appearance,
+ this);
+ animate.setSchedulingBounds(bounds);
+
+ objTrans.addChild(animate);
+
+ // add a rotation behavior so we can see all sides of the tetrahedron
+ Transform3D yAxis = new Transform3D();
+ Alpha rotorAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotorAlpha,
+ objTrans,
+ yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+
+
+ // have java3d perform optimizations on this scene graph
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ // callback for the animation button and delay text field
+ public void actionPerformed(ActionEvent e) {
+ Object o = e.getSource();
+
+ // for the animation button
+ if (o == animationB) {
+ if (animate.getEnable()) {
+ animate.setEnable(false);
+ animationB.setText("start animation");
+ }
+ else {
+ animate.setEnable(true);
+ animationB.setText(" stop animation ");
+ }
+ }
+
+ // for the texByRef button
+ else if (o == texByRef && texByRef.isSelected()) {
+ animate.setByReference(true);
+ }
+ // texByCopy button
+ else if (o == texByCopy && texByCopy.isSelected()) {
+ animate.setByReference(false);
+ }
+ // yUp button
+ else if (o == yUp && yUp.isSelected()) {
+ animate.setYUp(true);
+ }
+ // ydown button
+ else if (o == yDown && yDown.isSelected()) {
+ animate.setYUp(false);
+ }
+ //geomByRef button
+ else if (o == geomByRef) {
+ tetra.setByReference(true);
+ }
+ // geomByCopy button
+ else if (o == geomByCopy) {
+ tetra.setByReference(false);
+ }
+ // TYPE_INT_ARGB
+ else if (o == imgIntARGB) {
+ animate.setImageType(BufferedImage.TYPE_INT_ARGB);
+ }
+ // TYPE_4BYTE_ABGR
+ else if (o == img4ByteABGR) {
+ animate.setImageType(BufferedImage.TYPE_4BYTE_ABGR);
+ }
+ // TYPE_3BYTE_BGR
+ else if (o == img3ByteBGR) {
+ animate.setImageType(BufferedImage.TYPE_3BYTE_BGR);
+ }
+ // TYPE_CUSTOM RGBA
+ else if (o == imgCustomRGBA) {
+ animate.setImageTypeCustomRGBA();
+ }
+ // TYPE_CUSTOM RGB
+ else if (o == imgCustomRGB) {
+ animate.setImageTypeCustomRGB();
+ }
+ }
+
+ // callback for the checkboxes
+ public void itemStateChanged(ItemEvent e) {
+ Object o = e.getSource();
+ // for the flip checkbox
+ if (o == flipB) {
+ if (e.getStateChange() == ItemEvent.DESELECTED) {
+ animate.setFlipImages(false);
+ }
+ else animate.setFlipImages(true);
+ }
+ }
+
+ // callback for the slider
+ public void stateChanged(ChangeEvent e) {
+ Object o = e.getSource();
+ // for the frame delay
+ if (o == frameDelay) {
+ animate.setFrameDelay(frameDelay.getValue());
+ }
+ }
+
+ // allows TextureByReference to be run as an application as well as an applet
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ java.net.URL fnames[] = null;
+ if (args.length > 1) {
+ fnames = new java.net.URL[args.length];
+ for (int i = 0; i < args.length; i++) {
+ try {
+ fnames[i] = new java.net.URL("file:" + args[i]);
+ }
+ catch (java.net.MalformedURLException ex) {
+ System.out.println(ex.getMessage());
+ }
+ }
+ }
+ else {
+ fnames = new java.net.URL[TextureByReference.defaultFiles.length];
+ for (int i = 0; i < TextureByReference.defaultFiles.length; i++) {
+ fnames[i] = Resources.getResource(defaultFiles[i]);
+ if (fnames[i] == null) {
+ System.err.println(TextureByReference.defaultFiles[i] + " not found");
+ System.exit(1);
+ }
+
+/*
+ try {
+ fnames[i] = new java.net.URL("file:" +
+ TextureByReference.defaultFiles[i]);
+ }
+ catch (java.net.MalformedURLException ex) {
+ System.out.println(ex.getMessage());
+ System.exit(1);
+ }
+ */
+ }
+ }
+ new MainFrame((new TextureByReference(fnames)), 650, 750);
+ }
+}
+
+
+
+
+
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/ButtonPositionControls.java b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/ButtonPositionControls.java
new file mode 100644
index 0000000..82f3393
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/ButtonPositionControls.java
@@ -0,0 +1,214 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.virtual_input_device;
+
+import java.awt.BorderLayout;
+import java.awt.Button;
+import java.awt.GridLayout;
+import java.awt.Panel;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+
+import org.jogamp.java3d.InputDevice;
+import org.jogamp.vecmath.Vector3f;
+
+public class ButtonPositionControls extends Panel implements PositionControls, MouseListener {
+ private final static int STILL=0;
+ private final static int MOVING_UP=1;
+ private final static int MOVING_DOWN=2;
+ private final static int MOVING_LEFT=3;
+ private final static int MOVING_RIGHT=4;
+ private final static int MOVING_FORWARD=5;
+ private final static int MOVING_BACK=6;
+
+ // initial mode
+ private int mode = STILL;
+
+ Vector3f position = new Vector3f();
+ Vector3f orig_position = new Vector3f();
+
+ private Button leftB = new Button("Move Left");
+ private Button rightB = new Button("Move Right");
+ private Button upB = new Button("Move Up");
+ private Button downB = new Button("Move Down");
+
+ private Button forwardB = new Button("Move Forward");
+ private Button backwardB = new Button("Move Back");
+
+ private Button reset = new Button("Reset");
+ private InputDevice device;
+
+ private float step_rate = 0.0023f; // movement rate per millisecond
+ private long time_last_state_change = System.currentTimeMillis();
+
+ // the constructor arguments are the intitial X, Y, and Z positions
+ public ButtonPositionControls( float x, float y, float z ) {
+
+ // up, down, right, and left movement buttons
+ Panel panPanel = new Panel();
+ panPanel.setLayout( new BorderLayout() );
+ panPanel.add("North", upB);
+ panPanel.add("East", rightB);
+ panPanel.add("South", downB);
+ panPanel.add("West", leftB);
+
+ // forward, backward, and reset buttons
+ Panel p = new Panel();
+ p.setLayout( new GridLayout(0,1,0,0) );
+ p.add(forwardB);
+ p.add(backwardB);
+ p.add(reset);
+
+ // set the initial position
+ position.x = x;
+ position.y = y;
+ position.z = z;
+ orig_position.set(position);
+
+ // add a mouse listener to each button
+ upB.addMouseListener(this);
+ downB.addMouseListener(this);
+ leftB.addMouseListener(this);
+ rightB.addMouseListener(this);
+ forwardB.addMouseListener(this);
+ backwardB.addMouseListener(this);
+ reset.addMouseListener(this);
+
+ this.setLayout( new BorderLayout() );
+ add("East", p );
+ add("West", panPanel );
+ }
+
+ public void setDevice ( InputDevice device) {
+ this.device = device;
+ }
+
+ public void getPosition(Vector3f pos ) {
+ calculateMotion();
+ pos.set(position);
+ }
+
+ public void setPosition(Vector3f pos ) {
+ position.set(pos);
+ }
+
+ public void setStepRate( float stepRate ) {
+ step_rate = stepRate;
+ }
+
+ private void calculateMotion() {
+
+ long current_time = System.currentTimeMillis();
+ long elapsed_time = current_time - time_last_state_change;
+
+ switch(mode) {
+ case STILL:
+ break;
+ case MOVING_LEFT:
+ position.x = orig_position.x - step_rate*elapsed_time;
+ break;
+ case MOVING_RIGHT:
+ position.x = orig_position.x + step_rate*elapsed_time;
+ break;
+ case MOVING_UP:
+ position.y = orig_position.y + step_rate*elapsed_time;
+ break;
+ case MOVING_DOWN:
+ position.y = orig_position.y - step_rate*elapsed_time;
+ break;
+ case MOVING_FORWARD:
+ position.z = orig_position.z - step_rate*elapsed_time;
+ break;
+ case MOVING_BACK:
+ position.z = orig_position.z + step_rate*elapsed_time;
+ break;
+ default:
+ throw( new RuntimeException("Unknown motion"));
+ }
+ }
+
+ public void mouseClicked( MouseEvent e ) {
+ }
+
+ public void mouseEntered( MouseEvent e ) {
+ }
+
+ public void mouseExited( MouseEvent e ) {
+ }
+
+ public void mousePressed( MouseEvent e ) {
+ if (e.getSource()==leftB && mode != MOVING_LEFT) {
+ time_last_state_change = System.currentTimeMillis();
+ mode = MOVING_LEFT;
+ orig_position.set(position);
+ } else if (e.getSource()==rightB && mode != MOVING_RIGHT) {
+ time_last_state_change = System.currentTimeMillis();
+ mode = MOVING_RIGHT;
+ orig_position.set(position);
+ } else if (e.getSource()==upB && mode != MOVING_UP) {
+ time_last_state_change = System.currentTimeMillis();
+ mode = MOVING_UP;
+ orig_position.set(position);
+ } else if (e.getSource()==downB && mode != MOVING_DOWN) {
+ time_last_state_change = System.currentTimeMillis();
+ mode = MOVING_DOWN;
+ orig_position.set(position);
+ } else if (e.getSource()==forwardB && mode != MOVING_FORWARD) {
+ time_last_state_change = System.currentTimeMillis();
+ mode = MOVING_FORWARD;
+ orig_position.set(position);
+ } else if (e.getSource()==backwardB && mode != MOVING_BACK) {
+ time_last_state_change = System.currentTimeMillis();
+ mode = MOVING_BACK;
+ orig_position.set(position);
+ } else if (e.getSource()==reset) {
+ device.setNominalPositionAndOrientation();
+ }
+ }
+
+ public void mouseReleased( MouseEvent e ) {
+ mode = STILL;
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/PositionControls.java b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/PositionControls.java
new file mode 100644
index 0000000..eeff16d
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/PositionControls.java
@@ -0,0 +1,69 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.virtual_input_device;
+
+import org.jogamp.vecmath.Vector3f;
+
+// Classes that implement this interface must be a
+// subclass of java.awt.Component
+public interface PositionControls {
+
+ /**
+ * Get the position
+ */
+ public void getPosition( Vector3f pos);
+
+ /**
+ * Set the position
+ */
+ public void setPosition( Vector3f pos);
+
+ /**
+ * Increment added to position each time mouse is pressed
+ * or if the mouse is held down each time the Sensor is
+ * read
+ */
+ public void setStepRate( float stepRate );
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/README.txt b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/README.txt
new file mode 100644
index 0000000..f769dac
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/README.txt
@@ -0,0 +1,195 @@
+ Java 3D (TM) Input Device Driver Development Guide
+
+Topics
+
+ * Write Once, Run Anywhere (TM)
+ * Overview of the InputDevice and Sensor APIs
+ * Recipe for an Application Program that Uses Input Devices
+ * Location for Installation of Device Drivers
+ * Using a Preexistent Native Driver
+ * Package Naming Conventions
+ * Device Driver Constructor
+ * Driver Scheduling and Blocking Semantics
+
+
+Write Once, Run Anywhere
+
+Platform independence is the cornerstone of the Java (TM) platform.
+This vision now extends to external input devices as well. The
+overarching goal of the Java 3D input device architecture is to enable
+Java programs that use devices to run in a platform independent
+manner.
+
+We encourage developers to use Java APIs for their drivers. APIs such
+as the javax.comm API allow platform independent access to serial and
+parallel ports. However, even if a driver is partially written with
+native code, the Java 3D InputDevice interface is layered on top of the
+driver such that once the native portion of the driver has been
+installed into the local JRE, the application code is platform
+independent.
+
+In a future release, the Java 3D team is going to release a registry
+mechanism that will reside in the JRE as part of the Java 3D
+installation and allow registration of device drivers. The
+SimpleUniverse utility will be modified to allow querying of devices by
+generic characteristics, and will subsequently look up and instantiate
+the appropriate device driver registered with the registry mechanism.
+The Java 3D team also expects to release a set of generic mappings for
+devices. This will enable applications to count on the same behavior
+from different drivers for similar types of devices. There will also
+be personalized profiles that enable a user to specify device mappings
+for features like dominant hand preference and eye position.
+
+
+Overview of the InputDevice and Sensor APIs
+
+Java 3D abstracts the concept of a device via the InputDevice
+interface. The developer's implementation of the InputDevice interface
+is layered on top of the device driver. The device may be a real
+device such as a joystick or it may be a virtual device such as a piece
+of Java code that does transform calculations.
+
+A device sends data back to Java 3D by placing values into Sensor
+objects which the device code manages and updates. The Sensor class
+encapsulates a transform and a timestamp. The transform is specified
+in the TrackerBase coordinate system.
+
+Java 3D schedules calls to the device's pollAndProcessInput routine,
+which is a method in the InputDevice interface. This method is
+responsible for updating the devices sensor values. The sensors'
+values and time stamps are read by a user's behavior code and/or each
+frame (by the Java 3D implementation) when head tracking is enabled.
+There are several options for scheduling, and they are detailed in the
+InputDevice javadoc and in the section below entitled "Driver
+Scheduling and Blocking Semantics."
+
+Please read the javadocs for InputDevice and Sensor for more detailed
+information. There is also a sample program in the Java 3D release
+called VirtualInputDevice, which implements these concepts in Java code.
+
+
+Recipe for an Application Program that Uses Input Devices
+
+Please see the Java 3D example program in the examples directory called
+VirtualInputDevice for an example of using this code recipe:
+ 1) Implement the InputDevice interface with a class of your own
+ 2) Call the device's constructor from your main program
+ 3) Call initialize() on the device
+ 4) Call PhysicalEnvironment.addInputDevice(InputDevice) or if you are
+ using SimpleUniverse, call SimpleUniverse.getViewer().
+ getPhysicalEnvironment().addInputDevice(InputDevice)
+ 5) Assuming you want to modify the viewer's transform with the device:
+ add a WakeupOnElapsedFrames behavior to your scene graph that wakes
+ up every frame and in the processStimulus method modify the view
+ transform with the transform you pull out of Sensor.getRead.
+
+In a future release, it will be possible to replace steps 2, 3, & 4 with
+a single method call to the SimpleUniverse utility.
+
+
+Location for Installation of Device Drivers
+
+There are two suggested ways to package and distribute drivers.
+
+If a driver is written entirely in Java and if it is tightly coupled
+with a particular application without the expectation of reuse in other
+applications, then it should be bundled and distributed with the
+application itself.
+
+If a driver is not associated with any particular application program,
+if it contains any native code, or if it is expected to be used by more
+than one application program, then it should be installed directly into
+the end user's local JRE. It is expected that most drivers for real
+devices fall into this category. On the Solaris platform, the Java
+portion of the driver should be installed into jre/lib/ext as a
+uniquely named jar file and if there is native code it should be
+compiled into a shared object and installed into jre/lib/sparc. On the
+Win32 platform, the Java portion of the driver should be installed into
+jre\lib\ext as a uniquely named jar file and if there is native code it
+should be compiled into a standard dynamically linked library (dll) and
+installed into jre\bin.
+
+
+Using a Preexistent Native Driver
+
+It is possible to make a Java 3D driver out of a preexistent native
+driver. In order to do this, you need to create an InputDevice
+interface that uses JNI to access the associated native driver methods
+whenever the corresponding InputDevice interface method is called from
+Java 3D. The native portion of the driver must be installed into the
+target JRE.
+
+
+Package Naming Conventions
+
+All device drivers that are installed into the JRE should be part of a
+package that follows both standard Java and Java 3D naming
+conventions. For instance, an input device driver should be placed
+into a package called
+com.<company_name>.j3d.drivers.input.<device_name>. The package should
+be jarred up into a jar file that has a unique name.
+
+Any native .so or .dll files installed into the JRE should be uniquely
+named.
+
+
+Device Driver Constructor
+
+The constructor arguments for a device driver must be an array of
+strings. So a driver should have a single public constructor that
+takes an array of strings. The idea behind this requirement is that
+eventually the Java 3D registry will contain an array of string
+arguments to be sent to the device constructor at instantiation time.
+The SimpleUniverse API will also make a provision for optional String
+arguments to be added to the array of String arguments found in the
+registry.
+
+
+Driver Scheduling and Blocking Semantics
+
+When a device is registered with Java 3D via the
+PhysicalEnvironment.addInputDevice(InputDevice) method call,
+InputDevice.getProcessingMode() is called on the registered device.
+This method should return one of the three processing modes defined in
+the InputDevice interface: BLOCKING, NON_BLOCKING, and DEMAND_DRIVEN.
+
+ BLOCKING signifies that the driver for a device is a blocking driver
+ and that it should be scheduled for regular reads by Java 3D. A
+ blocking driver is defined as a driver that can cause the thread
+ accessing the driver (the Java 3D implementation thread calling the
+ pollAndProcessInput method) to block while the data is being accessed
+ from the driver.
+
+ NON_BLOCKING signifies that the driver for a device is a non-blocking
+ driver and that it should be scheduled for regular reads by Java 3D.
+ A non-blocking driver is defined as a driver that does not cause the
+ calling thread to block while data is being retrieved from the
+ driver. If no data is available from the device, pollAndProcessInput
+ should return without updating the sensor read value.
+
+ DEMAND_DRIVEN signifies that the Java 3D implementation should not
+ schedule regular reads on the sensors of this device; the Java 3D
+ implementation will only call pollAndProcessInput when one of the
+ device's sensors' getRead methods is called. A DEMAND_DRIVEN driver
+ must always provide the current value of the sensor on demand
+ whenever pollAndProcessInput is called. This means that DEMAND_DRIVEN
+ drivers are non-blocking by definition.
+
+It is important that you correctly classify your driver. If it is a
+NON_BLOCKING driver, most Java 3D implementations will choose to add
+inertia inside the scheduling thread to avoid starvation of the other
+Java 3D threads. If it is a BLOCKING driver, most Java 3D
+implementations will choose to spawn a separate scheduling thread for
+each BLOCKING device. If your driver is a DEMAND_DRIVEN driver, your
+driver must always provide the current value upon request along with
+the current time stamp.
+
+When running drivers with the Solaris operating system using the
+Solaris reference 1.2 JRE and green threads, you should be aware that
+there is a bug that forces all drivers to be BLOCKING. Thus, you
+should be careful to always use native threads on the Solaris reference
+1.2 JRE in order to get the expected behavior. This is not an issue
+with the Solaris 1.2 Performance JRE release, which is native threads
+only.
+
+
diff --git a/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/RotationControls.java b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/RotationControls.java
new file mode 100644
index 0000000..ea5b8c9
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/RotationControls.java
@@ -0,0 +1,71 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.virtual_input_device;
+
+// Classes that implement this interface must be a subclass
+// of java.awt.Component
+
+public interface RotationControls {
+
+ /**
+ * Get the angle of Rotation around the X Axis
+ */
+ public abstract float getXAngle();
+
+ /**
+ * Get the angle or Rotation around the Y Axis
+ */
+ public abstract float getYAngle();
+
+ /**
+ * Get the angle or Rotation around the Z Axis
+ */
+ public abstract float getZAngle();
+
+ /**
+ * Reset angles to original angle.
+ */
+ public abstract void reset();
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/SensorBehavior.java b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/SensorBehavior.java
new file mode 100644
index 0000000..0cb0ca6
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/SensorBehavior.java
@@ -0,0 +1,77 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.virtual_input_device;
+
+import java.util.Enumeration;
+
+import org.jogamp.java3d.Behavior;
+import org.jogamp.java3d.Sensor;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.WakeupOnElapsedFrames;
+
+public class SensorBehavior extends Behavior {
+
+ private WakeupOnElapsedFrames conditions = new WakeupOnElapsedFrames(0);
+ private TransformGroup transformGroup;
+ private Sensor sensor;
+ private Transform3D transform = new Transform3D();
+
+ public SensorBehavior( TransformGroup tg, Sensor sensor ) {
+ transformGroup = tg;
+ this.sensor = sensor;
+ }
+
+ public void initialize() {
+ wakeupOn( conditions );
+ }
+
+ public void processStimulus( Enumeration criteria ) {
+ sensor.getRead( transform );
+ transformGroup.setTransform( transform );
+ wakeupOn( conditions );
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/VirtualInputDevice.java b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/VirtualInputDevice.java
new file mode 100644
index 0000000..380dae9
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/VirtualInputDevice.java
@@ -0,0 +1,265 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.virtual_input_device;
+
+import java.awt.BorderLayout;
+import java.awt.Frame;
+import java.awt.Panel;
+
+import org.jogamp.java3d.InputDevice;
+import org.jogamp.java3d.Sensor;
+import org.jogamp.java3d.SensorRead;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.vecmath.Vector3f;
+
+public class VirtualInputDevice implements InputDevice {
+
+ private Vector3f position = new Vector3f();
+ private Transform3D newTransform = new Transform3D();
+ Sensor sensors[] = new Sensor[1];
+
+ // The wheel controls control the view platform orientation
+ private RotationControls rotControls;
+
+ // The button position controls control the view platform position
+ private PositionControls positionControls;
+
+ private Transform3D rotTransX = new Transform3D();
+ private Transform3D rotTransY = new Transform3D();
+ private Transform3D rotTransZ = new Transform3D();
+
+ private Vector3f initPos = new Vector3f();
+
+ private int processingMode;
+ private SensorRead sensorRead = new SensorRead();
+
+ // These are the settable parameters.
+ private boolean printvalues;
+ private int xscreeninitloc;
+ private int yscreeninitloc;
+ private int xscreensize;
+ private int yscreensize;
+ private float xobjinitloc;
+ private float yobjinitloc;
+ private float zobjinitloc;
+ private float xaxisrotinit;
+ private float yaxisrotinit;
+ private float zaxisrotinit;
+
+ /*
+ * Create a device, and use the string arguments in args to construct
+ * the device with user preferences.
+ */
+ public VirtualInputDevice( String[] args ) {
+
+ // default user-definable values
+ printvalues = false;
+ xscreeninitloc = 400;
+ yscreeninitloc = 0;
+ xscreensize = 400;
+ yscreensize = 200;
+ xobjinitloc = 0.0f;
+ yobjinitloc = 0.0f;
+ zobjinitloc = 2.2f;
+ xaxisrotinit = 0.0f;
+ yaxisrotinit = 0.0f;
+ zaxisrotinit = 0.0f;
+
+
+ for(int i=0 ; i<args.length ; i+=2) {
+ if(args[i] == null)
+ break;
+ else if(args[i] == "printvalues")
+ printvalues = (Boolean.valueOf(args[i+1])).booleanValue();
+ else if(args[i] == "xscreeninitloc")
+ xscreeninitloc = (Integer.valueOf(args[i+1])).intValue();
+ else if(args[i] == "yscreeninitloc")
+ yscreeninitloc = (Integer.valueOf(args[i+1])).intValue();
+ else if(args[i] == "xscreensize")
+ xscreensize = (Integer.valueOf(args[i+1])).intValue();
+ else if(args[i] == "yscreensize")
+ yscreensize = (Integer.valueOf(args[i+1])).intValue();
+ else if(args[i] == "xobjinitloc")
+ xobjinitloc = (Float.valueOf(args[i+1])).floatValue();
+ else if(args[i] == "yobjinitloc")
+ yobjinitloc = (Float.valueOf(args[i+1])).floatValue();
+ else if(args[i] == "zobjinitloc")
+ zobjinitloc = (Integer.valueOf(args[i+1])).floatValue();
+ }
+
+ if(printvalues == true) {
+ System.out.println("Initial values for VirtualInputDevice:");
+ System.out.println("xscreeninitloc = " + xscreeninitloc);
+ System.out.println("yscreeninitloc = " + yscreeninitloc);
+ System.out.println("xscreeninitsize = " + xscreensize);
+ System.out.println("yscreeninitsize = " + yscreensize);
+ System.out.println("xobjinitloc = " + xobjinitloc);
+ System.out.println("yobjinitloc = " + yobjinitloc);
+ System.out.println("zobjinitloc = " + zobjinitloc);
+ System.out.println("xaxisrotinit = " + xaxisrotinit);
+ System.out.println("yaxisrotinit = " + yaxisrotinit);
+ System.out.println("zaxisrotinit = " + zaxisrotinit);
+ }
+
+
+ // initialize the InputDevice GUI
+ Frame deviceFrame = new Frame();
+ deviceFrame.setSize(xscreensize,yscreensize);
+ deviceFrame.setLocation(xscreeninitloc, yscreeninitloc);
+ deviceFrame.setTitle("Virtual Input Device");
+ ButtonPositionControls positionControls;
+ // initialize position with initial x, y, and z position
+ positionControls = new ButtonPositionControls( xobjinitloc,
+ yobjinitloc, zobjinitloc);
+ WheelControls rotControls;
+ // initialize rotations with initial angles in radians)
+ rotControls = new WheelControls(xaxisrotinit, yaxisrotinit,
+ zaxisrotinit);
+ positionControls.setDevice (this);
+ Panel devicePanel = new Panel();
+ devicePanel.setLayout( new BorderLayout() );
+ devicePanel.add("East", positionControls );
+ devicePanel.add("West", rotControls );
+ deviceFrame.add( devicePanel );
+ deviceFrame.pack();
+ deviceFrame.setVisible(true);
+
+ initPos.set(xobjinitloc, yobjinitloc, zobjinitloc);
+
+ this.positionControls = positionControls;
+ this.rotControls = rotControls;
+
+ // default processing mode
+ processingMode = InputDevice.DEMAND_DRIVEN;
+
+ sensors[0] = new Sensor(this);
+ }
+
+ public void close() {
+ }
+
+ public int getProcessingMode() {
+ return processingMode;
+ }
+
+ public int getSensorCount() {
+ return sensors.length;
+ }
+
+ public Sensor getSensor( int sensorIndex ) {
+ return sensors[sensorIndex];
+ }
+
+ public boolean initialize() {
+ return true;
+ }
+
+ public void pollAndProcessInput() {
+
+ sensorRead.setTime( System.currentTimeMillis() );
+
+ rotTransX.rotX(-rotControls.getXAngle());
+ rotTransY.rotY(-rotControls.getYAngle());
+ rotTransZ.rotZ(-rotControls.getZAngle());
+
+ positionControls.getPosition(position);
+ newTransform.set(position);
+ newTransform.mul( rotTransX );
+
+ newTransform.mul(rotTransY);
+ newTransform.mul(rotTransZ);
+
+ sensorRead.set( newTransform );
+ sensors[0].setNextSensorRead( sensorRead );
+ }
+
+
+ public void processStreamInput() {
+ }
+
+
+ public void setNominalPositionAndOrientation() {
+
+ sensorRead.setTime( System.currentTimeMillis() );
+
+ rotTransX.rotX(xaxisrotinit);
+ rotTransY.rotY(yaxisrotinit);
+ rotTransZ.rotZ(zaxisrotinit);
+
+ position.set(initPos);
+
+ newTransform.set( position );
+
+ newTransform.mul(rotTransX);
+ newTransform.mul(rotTransY);
+ newTransform.mul(rotTransZ);
+
+ sensorRead.set( newTransform );
+ sensors[0].setNextSensorRead( sensorRead );
+ rotControls.reset();
+ positionControls.setPosition(initPos);
+ }
+
+
+
+ public void setProcessingMode( int mode ) {
+
+ // A typical driver might implement only one of these modes, and
+ // throw an exception when there is an attempt to switch modes.
+ // However, this example allows one to use any processing mode.
+
+ switch(mode) {
+ case InputDevice.DEMAND_DRIVEN:
+ case InputDevice.NON_BLOCKING:
+ case InputDevice.BLOCKING:
+ processingMode = mode;
+ break;
+ default:
+ throw new IllegalArgumentException("Processing mode must " +
+ "be one of DEMAND_DRIVEN, NON_BLOCKING, or BLOCKING");
+ }
+ }
+
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/VirtualInputDeviceTest.java b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/VirtualInputDeviceTest.java
new file mode 100644
index 0000000..281bc63
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/VirtualInputDeviceTest.java
@@ -0,0 +1,144 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.virtual_input_device;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.GraphicsConfiguration;
+
+import org.jogamp.java3d.Alpha;
+import org.jogamp.java3d.BoundingSphere;
+import org.jogamp.java3d.BranchGroup;
+import org.jogamp.java3d.Canvas3D;
+import org.jogamp.java3d.InputDevice;
+import org.jogamp.java3d.RotationInterpolator;
+import org.jogamp.java3d.Transform3D;
+import org.jogamp.java3d.TransformGroup;
+import org.jogamp.java3d.utils.applet.MainFrame;
+import org.jogamp.java3d.utils.geometry.ColorCube;
+import org.jogamp.java3d.utils.universe.SimpleUniverse;
+import org.jogamp.vecmath.Point3d;
+
+public class VirtualInputDeviceTest extends Applet {
+
+ private SimpleUniverse u = null;
+
+ public BranchGroup createSceneGraph() {
+
+ BranchGroup objRoot = new BranchGroup();
+ TransformGroup objTrans = new TransformGroup();
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+ objTrans.addChild(new ColorCube(0.2));
+ Transform3D yAxis = new Transform3D();
+ Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotationAlpha, objTrans, yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+ return objRoot;
+ }
+
+
+ public VirtualInputDeviceTest() {
+
+ }
+
+ public void init() {System.setProperty("sun.awt.noerasebackground", "true");
+ // These are the string arguments given to the VirtualInputDevice
+ // constructor. These are settable parameters. Look in the
+ // VirtualInputDevice constructor for a complete list.
+ String[] args = new String[10];
+ args[0] = "printvalues";
+ args[1] = "true";
+ args[2] = "yscreeninitloc";
+ args[3] = "50";
+ args[4] = null;
+
+ InputDevice device = new VirtualInputDevice( args );
+
+ // now create the VirtualInputDeviceTest Canvas
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config =
+ SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D c = new Canvas3D(config);
+ add("Center", c);
+
+ // Create a simple scene and attach it to the virtual universe
+ BranchGroup scene = createSceneGraph();
+ u = new SimpleUniverse(c);
+
+ // The InputDevice must be initialized before registering it
+ // with the PhysicalEnvironment object.
+ device.initialize();
+
+ // Register the VirtualInputDevice with Java 3D
+ u.getViewer().getPhysicalEnvironment().addInputDevice( device );
+
+ TransformGroup viewTrans =
+ u.getViewingPlatform().getViewPlatformTransform();
+ SensorBehavior s = new SensorBehavior( viewTrans, device.getSensor(0) );
+ s.setSchedulingBounds( new BoundingSphere
+ ( new Point3d(0.0,0.0,0.0), Float.MAX_VALUE ));
+ scene.addChild( s );
+ u.addBranchGraph(scene);
+ }
+
+ public void destroy() {
+ u.cleanup();
+ }
+
+
+ public static void main(String[] args) {System.setProperty("sun.awt.noerasebackground", "true");
+ new MainFrame(new VirtualInputDeviceTest(), 350, 350);
+ }
+}
diff --git a/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/WheelControls.java b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/WheelControls.java
new file mode 100644
index 0000000..60181af
--- /dev/null
+++ b/src/main/java/org/jdesktop/j3d/examples/virtual_input_device/WheelControls.java
@@ -0,0 +1,410 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+package org.jdesktop.j3d.examples.virtual_input_device;
+
+import java.awt.Canvas;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Polygon;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.awt.geom.AffineTransform;
+
+public class WheelControls extends Canvas implements RotationControls, MouseMotionListener, MouseListener {
+
+ private final static int NONE=0;
+ private final static int SLIDE_Y=1;
+ private final static int SLIDE_X=2;
+ private final static int SLIDE_Z=3;
+
+ private int mode = NONE;
+
+ private Dimension size;
+ private int thickness;
+ private int diameter;
+ private int space;
+ private int pipSize;
+ private int pipOffset; // Amount pip is below wheel
+ private int margin; // Margin between edge of Canvas and
+ // controls
+
+ private Polygon yPip;
+ private Rectangle yBackClip;
+
+ private Polygon xPip;
+ private Rectangle xBackClip;
+
+ private Polygon zPip;
+
+ private Rectangle yArea;
+ private Rectangle xArea;
+ private Rectangle zArea;
+
+ private Point oldMousePos = new Point();
+
+ float yAngle = 0.0f;
+ float xAngle = 0.0f;
+ float zAngle = 0.0f;
+
+ float yOrigAngle;
+ float xOrigAngle;
+ float zOrigAngle;
+
+ float angleStep = (float)Math.PI/30.0f;
+
+ public WheelControls() {
+ this(0.0f, 0.0f, 0.0f);
+ }
+
+ public WheelControls( float rotX, float rotY, float rotZ ) {
+ size = new Dimension( 200, 200 );
+
+ xAngle = constrainAngle(rotX);
+ yAngle = constrainAngle(rotY);
+ zAngle = constrainAngle(rotZ);
+
+ yOrigAngle = yAngle;
+ xOrigAngle = xAngle;
+ zOrigAngle = zAngle;
+
+ setSizes();
+
+ yPip = new Polygon();
+ yPip.addPoint( 0, 0 );
+ yPip.addPoint( -pipSize/2, pipSize );
+ yPip.addPoint( pipSize/2, pipSize );
+
+ xPip = new Polygon();
+ xPip.addPoint(0,0);
+ xPip.addPoint( pipSize, -pipSize/2 );
+ xPip.addPoint( pipSize, pipSize/2 );
+
+ zPip = new Polygon();
+ zPip.addPoint( diameter/2, pipOffset );
+ zPip.addPoint( diameter/2-pipSize/2, pipOffset-pipSize );
+ zPip.addPoint( diameter/2+pipSize/2, pipOffset-pipSize );
+
+ addMouseListener( this );
+ addMouseMotionListener( this );
+ }
+
+ private void setSizes() {
+ margin = 10;
+ int width = size.width - margin*2;
+ thickness = width * 7 / 100;
+ diameter = width * 70 / 100;
+ space = width * 10 / 100;
+ pipSize = width * 7 / 100;
+
+ pipOffset = thickness/2;
+
+ }
+
+ public void paint( Graphics g ) {
+ Graphics2D g2 = (Graphics2D)g;
+
+ g.drawOval( margin,margin, diameter, diameter );
+ zArea = new Rectangle( margin, margin, diameter, diameter );
+ drawZPip( g2, zAngle );
+
+ g.drawRect( margin, margin+diameter+space,
+ diameter, thickness ); // Y Wheel
+ yArea = new Rectangle( margin, margin+diameter+space, margin+diameter,
+ thickness+pipOffset );
+ yBackClip = new Rectangle( margin-thickness,
+ margin+diameter+space+thickness,
+ margin+diameter+thickness*2, thickness );
+ drawYPip( g2, yAngle );
+
+ g.drawRect( margin+diameter+space, margin,
+ thickness, diameter ); // X Wheel
+ xArea = new Rectangle( margin+diameter+space, margin,
+ thickness+pipOffset, margin+diameter );
+ xBackClip = new Rectangle( margin+diameter+space+thickness,
+ margin-thickness,
+ thickness, margin+diameter+thickness*2 );
+ drawXPip( g2, xAngle );
+
+
+ }
+
+ public float getXAngle() {
+ return xAngle;
+ }
+
+ public float getYAngle() {
+ return yAngle;
+ }
+
+ public float getZAngle() {
+ return zAngle;
+ }
+
+
+ public void reset() {
+ // Overwrite the old pip
+ drawYPip( (Graphics2D)(this.getGraphics()),
+ yAngle );
+ yAngle = yOrigAngle;
+ // Draw the new Pip
+ drawYPip( (Graphics2D)(this.getGraphics()),
+ yAngle );
+
+ // Overwrite the old pip
+ drawXPip( (Graphics2D)(this.getGraphics()),
+ xAngle );
+ xAngle = xOrigAngle;
+ // Draw the new Pip
+ drawXPip( (Graphics2D)(this.getGraphics()),
+ xAngle );
+
+ drawZPip( (Graphics2D)(this.getGraphics()),
+ zAngle );
+
+ zAngle = zOrigAngle;
+
+ drawZPip( (Graphics2D)(this.getGraphics()),
+ zAngle );
+ oldMousePos.setLocation(0,0);
+ }
+
+
+ private void drawXPip( Graphics2D g2, float angle ) {
+ AffineTransform trans = new AffineTransform();
+ int y;
+ int xOrig = margin+diameter+space;
+ int yOrig = margin;
+ Color origColor = g2.getColor();
+
+ if (angle <= Math.PI) {
+ y = yOrig + diameter - (int)((Math.abs( angle-Math.PI/2 )/(Math.PI/2)) * diameter/2);
+ } else
+ y = yOrig + (int)((Math.abs( (angle-Math.PI*1.5) )/(Math.PI/2)) * diameter/2);
+
+ if (angle<Math.PI/2 || angle > Math.PI*1.5)
+ g2.setColor( Color.red ); // Infront of wheel
+ else {
+ g2.setColor( Color.black ); // Behind Wheel
+ g2.setClip( xBackClip );
+ }
+
+ g2.setXORMode( getBackground() );
+ trans.setToTranslation( xOrig+pipOffset, y );
+ g2.setTransform( trans );
+ g2.fillPolygon( xPip );
+
+ // Reset graphics context
+ trans.setToIdentity();
+ g2.setTransform( trans );
+ g2.setColor(origColor);
+ g2.setPaintMode();
+ }
+
+ private void drawYPip( Graphics2D g2, float angle ) {
+ AffineTransform trans = new AffineTransform();
+ int x;
+ int xOrig = margin;
+ int yOrig = margin+diameter+space;
+ Color origColor = g2.getColor();
+
+ if (angle <= Math.PI) {
+ x = xOrig + diameter - (int)((Math.abs( angle-Math.PI/2 )/(Math.PI/2)) * diameter/2);
+ } else
+ x = xOrig + (int)((Math.abs( (angle-Math.PI*1.5) )/(Math.PI/2)) * diameter/2);
+
+ if (angle<Math.PI/2 || angle > Math.PI*1.5)
+ g2.setColor( Color.red ); // Infront on wheel
+ else {
+ g2.setColor( Color.black ); // Behind Wheel
+ g2.setClip( yBackClip );
+ }
+
+ g2.setXORMode( getBackground() );
+ trans.setToTranslation( x, yOrig+pipOffset );
+ g2.setTransform( trans );
+ g2.fillPolygon( yPip );
+
+ // Reset graphics context
+ trans.setToIdentity();
+ g2.setTransform( trans );
+ g2.setColor(origColor);
+ g2.setPaintMode();
+ }
+
+ private void drawZPip( Graphics2D g2, float zAngle ) {
+ AffineTransform trans = new AffineTransform();
+ Color origColor = g2.getColor();
+
+ trans.translate( margin, margin );
+ trans.rotate(zAngle, diameter/2, diameter/2 );
+
+ g2.setXORMode( getBackground() );
+ g2.setTransform(trans);
+ g2.setColor( Color.red );
+ g2.fillPolygon( zPip );
+
+ // Reset graphics context
+ trans.setToIdentity();
+ g2.setTransform( trans );
+ g2.setColor( origColor );
+ g2.setPaintMode();
+ }
+
+ public Dimension getPreferredSize() {
+ return size;
+ }
+
+ public void setSize( Dimension d ) {
+ // Set size to smallest dimension
+ if (d.width<d.height)
+ size.width = size.height = d.width;
+ else
+ size.width = size.height = d.height;
+ setSizes();
+ }
+
+ public void mouseClicked( MouseEvent e ) {
+ }
+
+ public void mouseEntered( MouseEvent e ) {
+ }
+
+ public void mouseExited( MouseEvent e ) {
+ }
+
+ public void mousePressed( MouseEvent e ) {
+ if ( yArea.contains( e.getPoint() )) {
+ mode = SLIDE_Y;
+ oldMousePos = e.getPoint();
+ } else if (xArea.contains( e.getPoint() )) {
+ mode = SLIDE_X;
+ oldMousePos = e.getPoint();
+ } else if (zArea.contains( e.getPoint() )) {
+ mode = SLIDE_Z;
+ oldMousePos = e.getPoint();
+ }
+ }
+
+ public void mouseReleased( MouseEvent e ) {
+ mode = NONE;
+ }
+
+ public void mouseDragged( MouseEvent e ) {
+ Point pos = e.getPoint();
+
+ int diffX = pos.x - oldMousePos.x;
+ int diffY = pos.y - oldMousePos.y;
+
+ switch(mode) {
+ case NONE:
+ break;
+ case SLIDE_Y:
+ // Overwrite the old pip
+ drawYPip( (Graphics2D)((Canvas)e.getSource()).getGraphics(),
+ yAngle );
+ if (diffX<0)
+ yAngle -= angleStep;
+ else if (diffX>0)
+ yAngle += angleStep;
+
+ yAngle = constrainAngle(yAngle);
+
+ // Draw the new Pip
+ drawYPip( (Graphics2D)((Canvas)e.getSource()).getGraphics(),
+ yAngle );
+ oldMousePos = pos;
+ break;
+ case SLIDE_X:
+ // Overwrite the old pip
+ drawXPip( (Graphics2D)((Canvas)e.getSource()).getGraphics(),
+ xAngle );
+ if (diffY<0)
+ xAngle -= angleStep;
+ else if (diffY>0)
+ xAngle += angleStep;
+
+ xAngle = constrainAngle(xAngle);
+
+ // Draw the new Pip
+ drawXPip( (Graphics2D)((Canvas)e.getSource()).getGraphics(),
+ xAngle );
+ oldMousePos = pos;
+ break;
+ case SLIDE_Z:
+ drawZPip( (Graphics2D)((Canvas)e.getSource()).getGraphics(),
+ zAngle );
+
+ if (diffX<0)
+ zAngle -= angleStep;
+ else if (diffX>0)
+ zAngle += angleStep;
+
+ zAngle = constrainAngle( zAngle );
+ drawZPip( (Graphics2D)((Canvas)e.getSource()).getGraphics(),
+ zAngle );
+ oldMousePos = pos;
+ break;
+ default:
+ throw( new RuntimeException("Internal Error"));
+ }
+ }
+
+ public void mouseMoved( MouseEvent e ) {
+ }
+
+ /**
+ * Constrain angle to be 0<angle<2PI
+ */
+ private float constrainAngle( float angle ) {
+ if ( angle > (float)Math.PI*2 ) return angle-(float)Math.PI*2;
+ if ( angle < 0.0f) return angle+(float)Math.PI*2;
+ return angle;
+ }
+}
diff --git a/src/main/resources/audio/hello_universe.au b/src/main/resources/audio/hello_universe.au
new file mode 100644
index 0000000..08d7456
--- /dev/null
+++ b/src/main/resources/audio/hello_universe.au
Binary files differ
diff --git a/src/main/resources/audio/magic_bells.wav b/src/main/resources/audio/magic_bells.wav
new file mode 100644
index 0000000..f89a7fd
--- /dev/null
+++ b/src/main/resources/audio/magic_bells.wav
Binary files differ
diff --git a/src/main/resources/audio/roar.au b/src/main/resources/audio/roar.au
new file mode 100644
index 0000000..202b628
--- /dev/null
+++ b/src/main/resources/audio/roar.au
Binary files differ
diff --git a/src/main/resources/audio/techno_machine.au b/src/main/resources/audio/techno_machine.au
new file mode 100644
index 0000000..12e47ea
--- /dev/null
+++ b/src/main/resources/audio/techno_machine.au
Binary files differ
diff --git a/src/main/resources/geometry/ballcone.lws b/src/main/resources/geometry/ballcone.lws
new file mode 100644
index 0000000..43979d0
--- /dev/null
+++ b/src/main/resources/geometry/ballcone.lws
@@ -0,0 +1,102 @@
+LWSC
+1
+
+FirstFrame 1
+LastFrame 60
+FrameStep 1
+PreviewFirstFrame 1
+PreviewLastFrame 60
+PreviewFrameStep 1
+FramesPerSecond 30.000000
+
+LoadObject greenball.lwo
+ShowObject 8 7
+ObjectMotion (unnamed)
+ 9
+ 1
+ 0 0 0 -0 -0 -0 1 1 1
+ 0 0 0 0 0
+EndBehavior 1
+ShadowOptions 7
+
+LoadObject redcone.lwo
+ShowObject 8 7
+ObjectMotion (unnamed)
+ 9
+ 3
+ 87.0955 0 16.23071 -0 -0 -0 1 1 1
+ 0 0 0 0 0
+ 18.11593 72.5 15.02915 -8.899995 78.10001 -52.8 1 1 1
+ 30 0 0 0 0
+ -95.00599 33 20.31446 5.900002 34.99998 9.699986 1 1 1
+ 59 0 0 0 0
+EndBehavior 1
+ShadowOptions 7
+
+AmbientColor 255 255 255
+AmbIntensity 0.250000
+
+AddLight
+LightName Light
+ShowLight 1 7
+LightMotion (unnamed)
+ 9
+ 1
+ -163.7345 2 44.50352 45 35 -0 1 1 1
+ 0 0 0 0 0
+EndBehavior 1
+LightColor 255 255 255
+LgtIntensity 1.000000
+LightType 0
+ShadowType 1
+
+ShowCamera 1 7
+CameraMotion (unnamed)
+ 9
+ 3
+ -35.53939 20 -285.3626 -0 -0 -0 1 1 1
+ 0 0 0 0 0
+ 138.9237 20 -218.272 -48 -2.9 -0 1 1 1
+ 30 0 0 0 0
+ 187.5021 20 -33.65044 -75.70002 -3.4 -0 1 1 1
+ 60 0 0 0 0
+EndBehavior 1
+ZoomFactor 3.200000
+Resolution 1
+PixelAspectRatio -1
+CustomPixelRatio 1.000000
+SegmentMemory 2200000
+Antialiasing 0
+AdaptiveSampling 1
+AdaptiveThreshold 16
+FilmSize 2
+FieldRendering 0
+MotionBlur 0
+DepthOfField 0
+
+SolidBackdrop 1
+BackdropColor 0 0 0
+ZenithColor 0 40 80
+SkyColor 120 180 240
+GroundColor 50 40 30
+NadirColor 100 80 60
+FogType 0
+DitherIntensity 1
+AnimatedDither 0
+
+RenderMode 2
+RayTraceEffects 0
+DataOverlayLabel
+
+ViewMode 5
+ViewAimpoint 0.000000 0.000000 0.000000
+ViewDirection 0.300197 -0.314159 0.000000
+ViewZoomFactor 4.000000
+GridNumber 40
+GridSize 50.000000
+ShowMotionPath 1
+ShowBGImage 0
+ShowFogRadius 0
+ShowRedraw 0
+ShowSafeAreas 0
+ShowFieldChart 0
diff --git a/src/main/resources/geometry/beethoven.obj b/src/main/resources/geometry/beethoven.obj
new file mode 100644
index 0000000..a64cfd0
--- /dev/null
+++ b/src/main/resources/geometry/beethoven.obj
@@ -0,0 +1,9278 @@
+# Tue Oct 27 19:18:13 1992
+#
+# A Bust of Beethoven
+#
+# Courtesy of:
+#
+# Viewpoint Animation Engineering
+# 870 West Center
+# Orem, Utah 84057
+# (801)224-2222
+# 1-800-DATASET
+#
+# (c) Copyright 1992 Viewpoint Animation Engineering Inc.
+# Sun Microsystems has been authorized to freely distribute
+# these Datasets. They are provided for unlimited use in
+# existing or modified form. The actual Dataset (ie, geometry)
+# may not, however, be resold in existing or modified form.
+#
+
+g
+v 0.606929 -5.258410 2.044219
+v 0.749451 -5.282475 2.101935
+v 1.104195 -5.305782 1.786403
+v 0.942787 -5.310546 1.944346
+v 1.223796 -5.327607 1.727047
+v 1.387634 -5.352595 1.669870
+v 1.499742 -5.392315 1.631342
+v 1.662819 -5.424446 1.628694
+v 1.705207 -5.429660 1.425738
+v 2.428539 -5.597278 1.106718
+v 2.816964 -5.698190 0.778881
+v 0.000000 -0.629419 0.700115
+v 0.000000 -0.689031 0.749186
+v 0.000000 -0.921285 0.651340
+v 0.000000 -0.768149 0.766285
+v 0.000000 -1.143949 0.667317
+v 0.000000 -0.557739 0.616228
+v 0.000000 -1.170529 0.755149
+v 0.000000 -1.195244 0.832548
+v 0.000000 -1.255585 0.924864
+v 0.000000 -1.386623 1.039014
+v 0.000000 -1.612841 1.117056
+v 0.000000 -1.838287 1.090171
+v 0.000000 -2.000022 0.997148
+v 0.228664 -1.938785 0.914844
+v 0.085459 -1.988895 0.953370
+v 0.302674 -1.925339 0.896202
+v 0.275138 -1.989268 0.980982
+v 0.185271 -2.036472 1.142150
+v 0.159347 -2.077863 1.229946
+v 0.081716 -2.186846 1.384890
+v 0.056561 -2.283902 1.486748
+v 0.068819 -2.419917 1.574930
+v 0.142751 -2.654662 1.791003
+v 0.773483 -3.525448 1.920056
+v 0.919514 -3.599237 1.892229
+v 0.216434 -2.825996 1.883388
+v 0.357668 -3.214574 1.963003
+v 0.582558 -3.428350 1.799299
+v 0.787973 -3.572078 1.805144
+v 0.811570 -3.535260 1.639753
+v 0.654987 -3.823292 1.726999
+v 0.503207 -4.138469 1.786812
+v 0.317156 -4.423326 1.863373
+v 0.508878 -5.273241 1.855637
+v 0.459840 -5.250568 1.768653
+v 0.194708 -5.182790 1.835237
+v 0.087132 -4.772663 1.922207
+v 0.000000 -5.119201 1.917972
+v 2.656234 -5.605168 0.169326
+v 2.500285 -5.523783 -0.077034
+v 0.000000 3.401886 2.677039
+v 0.000000 3.455461 3.197253
+v 0.000000 3.835356 3.347418
+v 0.000000 4.234554 3.301640
+v 0.000000 5.544172 1.141834
+v 0.000000 5.222569 1.996588
+v 0.000000 2.150469 -2.446399
+v 0.000000 1.411211 -2.377300
+v 0.000000 3.007780 -2.138084
+v 0.000000 4.160317 -1.992613
+v 0.000000 4.685857 -1.432630
+v 0.000000 5.232615 -0.488459
+v 0.000000 5.530680 0.336697
+v 2.351196 -5.435412 -0.151886
+v 1.417944 -2.541195 1.493780
+v 1.259329 -2.426003 1.563345
+v 1.236121 -2.711167 1.686120
+v 1.409394 -2.865327 1.613634
+v 1.224993 -2.938594 1.776514
+v 1.399548 -3.105691 1.685054
+v 1.202295 -3.145272 1.833352
+v 1.379981 -3.366113 1.738770
+v 1.106314 -3.590680 1.974236
+v 1.334269 -3.716449 1.839816
+v 1.002768 -4.057680 2.052466
+v 1.232172 -4.121325 1.915639
+v 0.921851 -4.498998 2.102010
+v 1.149484 -4.521899 1.949742
+v 0.821686 -4.948648 2.109915
+v 1.055671 -4.969047 1.934536
+v 0.665033 -4.949267 2.067833
+v 0.790397 -4.471575 2.070390
+v 0.871066 -4.030221 2.020681
+v 1.011326 -3.548462 1.932144
+v 1.155576 -3.109339 1.814467
+v 1.175242 -2.848861 1.705078
+v 1.170322 -2.683542 1.625350
+v 1.649166 -3.153598 1.425104
+v 1.725446 -2.901864 1.298102
+v 1.915900 -3.340909 1.329336
+v 1.974884 -3.126890 1.261171
+v 2.246661 -3.436337 1.323768
+v 2.290493 -3.340302 1.279632
+v 2.534990 -3.502395 1.347507
+v 2.140607 -3.727898 1.472833
+v 2.317251 -3.857045 1.497275
+v 1.835587 -3.589522 1.435310
+v 2.013046 -3.668311 1.428434
+v 1.584067 -3.394486 1.523631
+v 1.682448 -3.490690 1.451628
+v 1.529117 -3.611627 1.612823
+v 1.548203 -3.500728 1.581314
+v 2.122380 -3.823961 1.506380
+v 2.060160 -3.909763 1.538973
+v 2.231689 -4.015099 1.562255
+v 2.010254 -3.717139 1.449443
+v 2.076778 -3.804394 1.495765
+v 1.961209 -3.864456 1.531278
+v 1.986340 -3.832651 1.514372
+v 1.608903 -3.661776 1.551223
+v 1.668334 -3.515077 1.467304
+v 1.597241 -3.534766 1.528002
+v 1.617885 -3.613874 1.534346
+v 1.988031 -3.767161 1.485134
+v 1.655153 -3.556152 1.491457
+v 1.812183 -3.626549 1.434301
+v 1.798499 -3.643519 1.450996
+v 1.790407 -3.668857 1.471051
+v 1.787096 -3.693876 1.484562
+v 1.763082 -3.742047 1.509739
+v 1.873679 -4.202039 1.614515
+v 2.045680 -4.339208 1.644113
+v 1.659365 -4.027687 1.614704
+v 1.502733 -3.882563 1.688551
+v 1.422880 -4.194795 1.751814
+v 1.338830 -4.586100 1.776423
+v 1.219358 -5.001400 1.765408
+v 1.321242 -5.037073 1.701719
+v 1.481364 -4.614100 1.694944
+v 1.586808 -4.326046 1.684303
+v 1.770696 -4.440989 1.659695
+v 1.957850 -4.535209 1.648452
+v 1.652831 -4.684212 1.684831
+v 1.850858 -4.739279 1.666618
+v 1.460594 -5.078399 1.663402
+v 1.631559 -5.124405 1.645831
+v 1.326262 -2.155088 1.413261
+v 1.485772 -2.251122 1.373872
+v 1.880520 -2.569602 1.112499
+v 1.710357 -2.035759 1.113492
+v 1.545319 -1.781823 1.127396
+v 1.362923 -1.931386 1.228796
+v 1.082675 -2.159156 1.209878
+v 1.115181 -2.219535 1.300111
+v 2.050930 -1.831655 0.828760
+v 1.702970 -1.478868 0.875829
+v 1.402433 -1.226174 0.788059
+v 1.535905 -1.298107 0.807226
+v 1.644327 -1.327048 0.804401
+v 1.764862 -1.361831 0.781579
+v 2.288634 -1.645988 0.611225
+v 1.883102 -1.374386 0.712727
+v 2.035308 -1.272274 0.521232
+v 2.395414 -1.414058 0.447712
+v 2.509845 -0.986878 0.206504
+v 2.208626 -0.922418 0.257252
+v 2.639863 -2.438321 0.958418
+v 2.725734 -1.886749 0.497114
+v 2.764515 -1.590138 0.284429
+v 2.831744 -1.098893 0.044976
+v 1.775468 -2.806755 1.258097
+v 1.655526 -2.682360 1.299566
+v 2.033635 -2.703922 1.074109
+v 1.839602 -2.218849 1.044937
+v 2.056288 -3.001260 1.208765
+v 2.384792 -3.212572 1.263918
+v 2.356952 -4.120360 1.544871
+v 2.459801 -3.955877 1.483205
+v 2.178010 -4.430263 1.632940
+v 2.075841 -4.618856 1.646803
+v 1.971436 -4.813312 1.649093
+v 1.782910 -5.179061 1.642088
+v 2.722473 -3.521854 1.297529
+v 2.320522 -0.635532 0.139770
+v 2.572149 -0.716555 0.062678
+v 2.866314 -0.799157 -0.133476
+v 2.292457 -0.145070 -0.109027
+v 2.443170 -0.179462 -0.315260
+v 2.730895 -0.264831 -0.543768
+v 2.458838 0.001204 -0.795894
+v 2.292063 0.126813 -0.573476
+v 2.192149 0.196353 -0.366311
+v 2.321326 0.143332 -0.986568
+v 2.204225 0.285265 -0.793519
+v 2.086512 0.412325 -0.602341
+v 1.979496 0.526511 -1.052944
+v 1.901332 0.677905 -0.887785
+v 2.119281 0.374709 -1.296339
+v 2.404395 0.114204 -1.034763
+v 2.182306 0.325784 -1.359781
+v 2.489319 -0.022626 -0.860502
+v 2.735065 -0.303741 -0.600112
+v 2.972152 -1.121362 -0.018465
+v 2.979924 -0.812304 -0.196070
+v 2.922423 -1.641673 0.257410
+v 2.873500 -1.930568 0.473403
+v 2.375135 0.046336 -1.144438
+v 2.172337 0.226998 -1.422520
+v 2.491158 -0.102854 -1.005916
+v 2.796512 -0.410669 -0.688888
+v 2.990258 -0.891358 -0.298409
+v 3.003446 -1.208466 -0.126238
+v 2.626737 -0.141303 -1.176234
+v 3.305729 -0.660061 -1.106242
+v 3.189751 -0.546391 -1.211410
+v 3.498145 -0.805415 -0.915226
+v 3.598299 -1.111347 -0.580610
+v 3.594934 -1.309430 -0.426668
+v 2.960597 -1.718621 0.127997
+v 2.892831 -2.040189 0.309357
+v 3.561625 -1.803253 -0.127527
+v 3.572524 -2.193293 0.073111
+v 2.723940 -2.593923 0.991446
+v 2.101627 -2.776564 0.955989
+v 1.952771 -2.425001 0.870612
+v 1.810815 -2.786959 1.099059
+v 2.079275 -2.975586 1.069559
+v 2.419624 -3.200458 1.048395
+v 2.758584 -3.526407 1.034976
+v 2.414672 -4.011502 1.178445
+v 2.324448 -4.181604 1.220485
+v 2.173626 -4.477980 1.310844
+v 2.088244 -4.632308 1.348621
+v 1.971255 -4.860397 1.375835
+v 1.807332 -5.201816 1.406577
+v 3.032909 -4.274755 0.871277
+v 3.221893 -3.685248 0.761669
+v 3.384109 -3.157457 0.609178
+v 3.006850 -3.159979 0.786586
+v 2.761079 -3.343132 0.934009
+v 2.989856 -4.359622 0.888982
+v 2.837555 -4.575955 0.958111
+v 2.743621 -4.770766 1.013783
+v 2.647256 -5.006955 1.036057
+v 2.543676 -5.328383 1.063651
+v 2.636712 -2.719342 0.706883
+v 2.675142 -2.784636 0.772986
+v 3.022010 -2.935674 0.717220
+v 3.488740 -2.821402 0.417224
+v 2.408273 -2.931587 0.890975
+v 2.481620 -3.157896 0.992837
+v 2.536210 -2.948206 0.958051
+v 2.663577 -2.834692 0.861852
+v 2.882174 -2.937345 0.843545
+v 2.925337 -3.100878 0.894157
+v 2.756874 -3.229780 1.007085
+v 2.555491 -3.089174 1.022268
+v 2.674389 -2.937617 0.933123
+v 2.780405 -2.972446 0.918971
+v 2.626996 -2.987327 0.979362
+v 2.629518 -3.052213 1.002425
+v 2.750973 -3.111114 0.986978
+v 2.807915 -3.045099 0.930632
+v 2.717701 -3.030117 0.972204
+v 4.313962 -1.233717 -1.113217
+v 4.624830 -1.455210 -1.033928
+v 4.330608 -1.411916 -0.776805
+v 4.324175 -1.485486 -0.686738
+v 4.248341 -1.902899 -0.362860
+v 4.634851 -1.565367 -0.797032
+v 4.566785 -1.925704 -0.443689
+v 4.188893 -2.337274 -0.205079
+v 4.137861 -2.703013 -0.100062
+v 4.022866 -3.369608 0.033900
+v 3.764290 -3.909375 0.369424
+v 4.456349 -2.398925 -0.204624
+v 4.359573 -2.784669 -0.104717
+v 4.125014 -3.394157 -0.000466
+v 3.898481 -4.088530 -0.065554
+v 4.241738 -3.465072 -0.094279
+v 4.479900 -2.866124 -0.178521
+v 4.576882 -2.437436 -0.255504
+v 4.648549 -1.977384 -0.494981
+v 3.513140 -4.435121 0.544512
+v 3.497720 -4.482059 0.557091
+v 3.379102 -4.700961 0.630729
+v 3.324800 -4.792911 0.649540
+v 3.166105 -5.047532 0.719668
+v 2.974409 -5.394820 0.804852
+v 3.670990 -4.569324 0.278001
+v 3.529665 -4.810116 0.407969
+v 3.328219 -5.106425 0.519180
+v 3.048547 -5.432866 0.657509
+v 1.874501 0.840434 -0.825335
+v 1.653189 0.929418 -0.708563
+v 1.789908 0.559574 -0.484963
+v 2.022252 0.544661 -0.586962
+v 1.619546 1.085665 -0.484865
+v 1.709339 0.708810 -0.303075
+v 1.494055 1.265579 -0.284350
+v 1.608594 0.873861 -0.115187
+v 1.679156 0.633915 0.029714
+v 1.778391 0.482136 -0.139324
+v 1.872463 0.346143 -0.310705
+v 2.145294 0.339204 -0.375192
+v 1.915717 0.040941 -0.014837
+v 2.201232 0.000293 -0.064496
+v 1.764515 0.177998 0.117671
+v 1.676031 0.329475 0.229159
+v 1.555784 0.021224 0.505726
+v 1.718960 -0.160742 0.469903
+v 1.270392 -0.147104 0.784968
+v 1.526734 -0.330392 0.664287
+v 1.394744 -0.413036 0.760716
+v 0.965119 -0.260672 0.954350
+v 1.133576 -0.529377 0.876480
+v 0.660852 -0.430087 1.026409
+v 0.890434 -0.667131 1.030138
+v 1.083905 -0.908114 0.962937
+v 1.292102 -0.754556 0.823783
+v 1.497409 -0.724919 0.744497
+v 1.774028 -0.557820 0.533113
+v 1.918869 -0.331560 0.339632
+v 2.293218 -0.484214 0.339257
+v 1.870448 -0.652197 0.450844
+v 2.204633 -0.761890 0.492489
+v 1.920558 -0.911602 0.635633
+v 2.150011 -1.077666 0.738764
+v 1.173329 -0.937966 0.974752
+v 1.359247 -0.802611 0.864891
+v 1.564809 -0.797042 0.792898
+v 1.863340 -0.977168 0.914090
+v 2.107739 -1.143225 0.953456
+v 1.715824 -0.929656 0.966024
+v 1.618376 -0.925175 1.029689
+v 1.369610 -1.015338 1.119676
+v 1.832846 -1.020531 1.185262
+v 1.626036 -1.076742 1.288613
+v 1.714100 -1.093595 1.318990
+v 1.848709 -1.143001 1.341502
+v 1.983526 -1.157101 1.274700
+v 2.045247 -1.153720 1.168849
+v 1.929603 0.766195 -0.868969
+v 2.116741 0.495058 -0.601314
+v 2.255911 0.276612 -0.416612
+v 2.281261 -0.081355 -0.119904
+v 2.360604 -0.599489 0.198334
+v 2.290626 -0.891433 0.390191
+v 2.149541 -1.234854 0.593719
+v 2.050488 -1.366728 0.809457
+v 1.947857 -1.381446 0.959888
+v 1.772848 -1.328383 1.095626
+v 1.564976 -1.261520 1.034313
+v 1.497288 -1.339130 0.841721
+v 1.364580 -1.180787 0.924075
+v 0.979704 -2.071305 1.342422
+v 1.002919 -2.144323 1.415971
+v 1.288682 -1.818864 1.337446
+v 1.184800 -2.360092 1.620601
+v 1.499328 -1.619904 1.259788
+v 1.150655 -2.577878 1.705708
+v 1.138570 -2.355695 1.608074
+v 1.076103 -2.441460 1.640501
+v 0.986579 -2.344266 1.588933
+v 0.946039 -2.139567 1.405321
+v 0.911458 -2.006588 1.293084
+v 1.226792 -1.758778 1.263937
+v 1.430329 -1.605903 1.242139
+v 1.185289 -1.494439 1.039594
+v 1.106210 -1.685248 1.170283
+v 1.003208 -1.853189 1.204180
+v 1.062459 -1.710216 1.147465
+v 0.987919 -1.577734 0.943063
+v 1.011487 -1.466149 0.849459
+v 1.412549 -1.265471 0.846861
+v 1.163166 -1.083631 0.749894
+v 1.215025 -1.139879 0.631844
+v 1.090440 -1.023507 0.678469
+v 1.140061 -1.085619 0.548845
+v 1.322738 -1.282287 0.839324
+v 1.125903 -1.247879 0.726983
+v 0.975960 -1.253640 0.439031
+v 0.951070 -1.490338 0.657946
+v 0.923414 -1.563252 0.752181
+v 0.831620 -1.507736 0.611914
+v 0.772368 -1.363330 0.594727
+v 0.706202 -1.445747 0.661758
+v 1.053160 -0.947260 0.364276
+v 0.899215 -1.079844 0.440476
+v 0.696132 -1.182176 0.597604
+v 0.541634 -1.357723 0.706386
+v 1.031870 -0.910848 0.501241
+v 0.972473 -0.904372 0.702188
+v 0.953346 -0.798897 0.560640
+v 0.945703 -0.793197 0.352311
+v 0.840242 -0.927747 0.424596
+v 0.620113 -1.068009 0.584601
+v 0.406030 -1.181369 0.658817
+v 0.776626 -0.858709 0.397058
+v 0.588595 -1.031782 0.557169
+v 0.552893 -0.992161 0.508997
+v 0.372288 -1.143575 0.620912
+v 0.344751 -1.110140 0.559124
+v 0.223761 -1.185662 0.654281
+v 0.250869 -1.226516 0.715051
+v 0.123685 -1.159181 0.616287
+v 0.306132 -1.328286 0.761379
+v 0.881827 -0.723916 0.435746
+v 0.723647 -0.597074 0.645566
+v 0.757860 -0.781188 0.456694
+v 0.882614 -0.775412 0.755154
+v 0.666779 -0.552895 0.796182
+v 0.611036 -0.525612 0.788876
+v 0.562304 -0.416580 0.969606
+v 0.876471 -0.148345 0.904860
+v 1.138099 -0.091895 0.774442
+v 1.485183 0.079724 0.500447
+v 1.596159 0.379360 0.235293
+v 1.566675 0.634397 0.073622
+v 1.512450 0.897163 -0.076482
+v 1.412367 1.281826 -0.310801
+v 1.237959 0.865933 -0.239116
+v 1.313157 0.598818 -0.121402
+v 1.265388 0.325109 -0.014263
+v 1.172174 0.003799 0.288578
+v 1.038911 -0.054216 0.599331
+v 0.525206 -0.699021 0.685298
+v 0.542374 -0.842300 0.544174
+v 0.503536 -0.631044 0.705220
+v 0.501866 -0.586513 0.662164
+v 0.455321 -0.546323 0.782268
+v 0.379120 -0.507010 0.863837
+v 0.299927 -0.673631 0.765450
+v 0.304694 -0.630063 0.726692
+v 0.325211 -0.748447 0.738581
+v 0.224965 -0.434611 0.626931
+v 0.215350 -0.596543 0.743346
+v 0.127284 -0.764450 0.768490
+v 0.113276 -0.678553 0.767337
+v 0.137651 -0.622930 0.687754
+v 0.096537 -0.571215 0.609019
+v 0.322935 -0.900350 0.611039
+v 0.108917 -0.939211 0.646315
+v 0.016477 -0.926391 0.649357
+v -0.000578 -1.149405 0.652702
+v 0.139737 -1.171606 0.699986
+v -0.004388 -1.174172 0.722007
+v -0.007583 -1.191200 0.792125
+v 0.127929 -1.193892 0.754604
+v 0.241360 -1.278164 0.814638
+v 0.130370 -1.254810 0.861437
+v 0.033090 -1.254034 0.896798
+v 0.274387 -1.437386 0.895555
+v 0.260266 -1.429410 0.950578
+v 0.166855 -1.398997 0.996518
+v 0.490997 -1.452079 1.079063
+v 0.672423 -1.321110 1.058253
+v 0.733092 -1.446843 0.883670
+v 0.777042 -1.374494 1.179787
+v 0.852626 -1.500311 1.052535
+v 0.806198 -1.468259 0.783523
+v 0.957618 -1.550179 0.980468
+v 1.061248 -1.693582 1.249920
+v 0.991865 -1.643754 1.309478
+v 0.918461 -1.559019 1.397034
+v 0.600731 -1.529273 1.201757
+v 1.043674 -1.738987 1.307451
+v 0.961809 -1.793360 1.514807
+v 0.871396 -1.707364 1.600356
+v 0.643279 -1.597424 1.344353
+v 0.616929 -1.647787 1.441685
+v 0.803006 -1.788214 1.656914
+v 0.729624 -1.999230 1.428804
+v 0.923605 -2.047241 1.528758
+v 0.887021 -2.089621 1.740125
+v 0.908608 -2.268117 1.570879
+v 0.804780 -2.017978 1.533626
+v 0.752157 -2.040502 1.662394
+v 0.544718 -2.044484 1.668407
+v 0.628571 -2.050575 1.845255
+v 0.697121 -2.147149 1.901156
+v 0.550252 -1.907047 1.787284
+v 0.487346 -1.724542 1.549441
+v 0.395899 -1.825250 1.640423
+v 0.250850 -1.637978 1.015846
+v 0.244374 -1.658235 0.946017
+v 0.123817 -1.642736 1.107774
+v 0.075363 -1.842817 1.071423
+v 0.245409 -1.810659 0.985872
+v 0.304946 -1.805198 0.974470
+v 0.296986 -1.699174 1.051869
+v 0.439278 -1.770717 1.223794
+v 0.314085 -1.883325 1.371367
+v 0.179735 -1.984468 1.494798
+v 0.324830 -1.841375 1.003657
+v 0.222738 -1.894406 1.155335
+v 0.172525 -1.978736 1.231043
+v 0.114834 -2.162851 1.420513
+v 0.093712 -2.255516 1.488580
+v 0.112533 -2.125553 1.543084
+v 0.124040 -2.383260 1.618812
+v 0.150668 -2.039182 1.681016
+v 0.190912 -2.607809 1.821257
+v 0.240723 -2.602026 1.811898
+v 0.306947 -2.582094 1.862173
+v 0.405686 -2.474868 1.990988
+v 0.226778 -2.090173 1.907548
+v 0.348400 -2.002303 1.884293
+v 0.429880 -2.105294 1.813437
+v 0.510107 -2.120671 1.944439
+v 0.581623 -2.187905 2.008629
+v 0.478191 -2.157100 2.001021
+v 0.940866 -2.328458 1.660947
+v 1.015872 -2.421969 1.749243
+v 1.130258 -2.672200 1.895345
+v 1.133006 -3.056261 1.998462
+v 0.829619 -3.395835 1.961927
+v 0.886282 -2.900060 1.864000
+v 0.973873 -2.665101 1.909583
+v 0.872574 -2.480379 1.729201
+v 0.924078 -2.539847 1.804793
+v 0.850053 -2.399683 1.656877
+v 0.677365 -3.395529 1.913464
+v 0.490297 -3.081067 2.001696
+v 0.442003 -3.181398 2.023786
+v 0.371433 -2.706441 1.897063
+v 0.289637 -2.717131 1.956565
+v 0.833722 -2.319913 1.588685
+v 0.723318 -2.277545 1.887690
+v 0.833002 -2.323450 1.837793
+v 0.692294 -2.371743 1.913054
+v 0.838047 -2.453222 1.883920
+v 0.641657 -2.588223 1.940398
+v 0.835450 -2.392535 1.666195
+v 0.863047 -2.464924 1.733322
+v 0.611144 -2.550968 2.004122
+v 0.586612 -2.676337 1.973955
+v 0.692440 -3.060730 1.993670
+v 0.766932 -3.933840 1.811139
+v 0.735525 -3.893854 1.701079
+v 0.728226 -4.163616 1.817632
+v 0.672600 -4.211015 1.737881
+v 0.642157 -4.510410 1.854692
+v 0.587140 -4.550395 1.720699
+v 0.570267 -4.186787 1.772454
+v 0.442477 -4.489280 1.785019
+v 0.572488 -4.948374 1.875073
+v 0.520362 -4.931837 1.776638
+v 0.271754 -4.840917 1.837813
+v 3.741771 -4.171817 -0.347126
+v 4.043613 -3.575043 -0.555009
+v 4.223952 -3.061474 -0.724218
+v 4.403008 -2.606096 -0.807085
+v 4.509541 -2.165012 -0.978357
+v 4.644337 -1.741958 -1.085475
+v 4.074585 -2.737126 -1.284806
+v 4.247483 -2.277002 -1.454847
+v 3.940585 -3.141079 -1.091841
+v 3.749558 -3.689571 -0.831686
+v 3.503217 -4.203363 -0.577819
+v 3.511727 -4.552409 -0.171128
+v 3.298432 -4.835660 -0.094779
+v 3.069507 -5.126623 -0.010901
+v 2.856514 -5.366696 0.088825
+v 2.682419 -5.306578 -0.162887
+v 2.865412 -5.074536 -0.246702
+v 3.115006 -4.827193 -0.302164
+v 3.337063 -4.542685 -0.391358
+v 1.269260 1.255200 -0.337076
+v 0.808878 -0.108006 0.862693
+v 0.785511 -0.113481 0.744561
+v 1.288147 1.331118 -0.224217
+v 1.428511 1.249858 0.363487
+v 1.360651 1.219843 0.665852
+v 1.426867 1.333607 0.370559
+v 1.450856 1.457047 0.528348
+v 1.384062 1.438226 0.638337
+v 1.470071 1.493236 0.369380
+v 1.594261 1.558343 0.626987
+v 1.484255 1.632078 0.642222
+v 1.620929 1.647771 0.357712
+v 1.650435 1.617243 0.680182
+v 1.545264 1.742151 0.824324
+v 1.389575 1.760656 0.867844
+v 1.383596 1.808758 1.025872
+v 1.655757 1.825900 0.954174
+v 1.597150 1.914643 1.006309
+v 1.392070 1.994927 1.179577
+v 1.762705 1.655988 0.631224
+v 1.762992 1.805720 0.775415
+v 1.949500 1.849836 0.823902
+v 1.760768 1.850647 1.065403
+v 1.743619 1.997952 1.234624
+v 1.497468 2.133743 1.191102
+v 1.400213 2.173737 1.276591
+v 1.756102 2.216640 1.319918
+v 1.420383 2.453469 1.475121
+v 0.681201 -0.189988 0.897274
+v 0.475894 -0.298390 0.931689
+v 0.290747 -0.351774 0.892697
+v 0.276279 -0.316745 0.701162
+v 1.338810 2.729682 1.686965
+v 1.295536 2.975859 1.876092
+v 1.249168 3.130029 2.062850
+v 1.228711 3.220825 2.196595
+v 1.062347 3.349826 2.391934
+v 0.814242 3.416641 2.460567
+v 0.605427 3.436728 2.625397
+v 0.377767 3.416682 2.699480
+v 0.191664 3.352134 2.742179
+v 0.327215 3.617606 3.165959
+v 0.490340 3.727078 3.028905
+v 0.833423 3.579124 2.952278
+v 1.186570 3.537148 2.883776
+v 1.274514 3.429492 2.340806
+v 1.515386 3.462934 2.499302
+v 1.729657 2.985728 2.126961
+v 1.587334 3.273247 2.279883
+v 1.802587 2.673030 2.071795
+v 1.883505 2.421195 1.852780
+v 1.770470 1.547581 0.014896
+v 1.763543 1.690838 0.209278
+v 1.789812 1.745170 0.195716
+v 1.652398 1.635196 0.100315
+v 1.616211 1.631821 0.140151
+v 1.702170 1.691207 0.287679
+v 2.024910 1.684896 0.590685
+v 2.081244 1.739766 0.560523
+v 2.101686 1.841926 0.704701
+v 2.311996 1.667058 0.544330
+v 2.139216 1.493633 0.307465
+v 1.568122 1.452308 -0.160167
+v 1.847430 1.192309 -0.235521
+v 2.039961 1.263559 -0.106670
+v 2.001783 1.178930 -0.538870
+v 2.120274 1.181434 -0.439203
+v 1.955666 1.112051 -0.650840
+v 2.035204 1.058208 -0.740662
+v 2.506671 1.354212 -0.177264
+v 2.556798 1.425842 0.234125
+v 2.625577 1.667848 0.406381
+v 2.572188 1.665942 0.610608
+v 2.313997 1.937125 1.043955
+v 1.347179 1.435083 -0.164662
+v 2.370565 2.188644 1.319938
+v 1.795360 2.312256 1.448602
+v 2.298796 2.378327 1.484097
+v 2.431922 2.420861 1.791865
+v 2.274832 2.708370 1.953293
+v 2.127402 2.763782 2.172931
+v 2.027815 3.057472 2.207687
+v 2.211272 3.151361 2.175526
+v 2.077582 3.593789 2.544059
+v 2.205795 3.053233 1.995680
+v 2.234578 2.853686 1.921466
+v 2.492220 2.763751 1.681460
+v 1.682721 3.872787 2.699838
+v 1.591274 3.687533 2.795306
+v 1.469790 4.226974 3.125912
+v 1.419313 4.085230 3.114769
+v 0.969239 4.032842 3.237621
+v 0.446240 4.025191 3.175913
+v 0.293380 4.202842 3.126171
+v 0.507507 4.749091 2.927829
+v 0.273753 4.902920 2.635112
+v 0.000000 4.879436 2.662164
+v 0.855572 4.443953 3.264785
+v 1.001219 4.433220 3.168902
+v 2.634762 2.917107 1.571458
+v 2.373444 3.230135 1.701438
+v 2.245007 3.762857 1.971262
+v 2.174998 3.974638 1.861146
+v 1.772471 3.917193 2.561741
+v 1.696145 3.988359 2.581486
+v 2.020528 4.126190 2.057333
+v 1.720966 4.401711 2.028207
+v 1.417985 4.554327 2.447087
+v 1.350400 4.347244 2.806280
+v 1.200152 4.613357 3.063192
+v 1.304464 4.997022 2.246442
+v 0.873342 4.709630 3.173557
+v 0.696170 4.784035 2.819126
+v 0.424844 4.978543 2.246064
+v 0.000000 5.085917 2.309147
+v 0.696076 5.193224 2.026187
+v 0.635427 5.515653 1.331738
+v 1.511739 4.938085 1.521488
+v 1.906790 4.422846 1.795979
+v 2.354552 3.705653 1.670219
+v 2.644936 3.814625 1.425739
+v 2.421550 3.779236 0.825727
+v 2.203040 4.216619 1.154116
+v 2.251699 4.269145 0.470671
+v 1.788527 4.809611 0.096426
+v 1.601388 4.895715 0.838140
+v 2.543023 3.228183 1.363687
+v 2.588333 3.236537 1.228543
+v 2.629558 3.164815 0.666688
+v 2.336965 3.754007 -0.076831
+v 2.695441 2.594186 0.979715
+v 2.703436 2.831996 0.591982
+v 2.430008 2.811457 0.125791
+v 2.207136 3.078765 -0.379399
+v 2.904035 2.247210 0.893879
+v 2.666324 2.010223 0.643661
+v 2.569228 2.368971 0.316299
+v 2.560933 2.359419 -0.171605
+v 2.265315 2.576830 -0.675925
+v 2.336648 2.029389 -0.421402
+v 2.284415 2.022634 -0.855935
+v 2.150451 1.476840 -0.584277
+v 2.167788 1.514616 -0.809225
+v 2.643453 1.925415 -0.018950
+v 1.612726 0.873944 -1.296869
+v 2.079375 1.110581 -1.195821
+v 1.716492 0.726429 -1.388435
+v 1.884749 0.517371 -1.562625
+v 1.960825 0.442513 -1.610592
+v 1.942914 0.314387 -1.681620
+v 1.429990 0.889587 -1.614208
+v 1.505516 0.653872 -1.835689
+v 0.931704 0.787899 -2.066129
+v 0.917302 1.019552 -1.951271
+v 0.000000 0.904195 -2.214862
+v 0.000000 1.030543 -2.178484
+v 0.951775 0.729199 -2.150724
+v 0.000000 0.845559 -2.297620
+v 1.555206 0.591727 -1.909888
+v 0.894334 1.458678 -2.053686
+v 1.639151 1.530680 -1.825240
+v 0.916245 0.591191 -2.197576
+v 0.000000 0.707846 -2.344431
+v 1.516843 0.444141 -1.941028
+v 2.894158 -0.293492 -1.693660
+v 2.208730 -0.084916 -2.252010
+v 1.643629 0.058334 -2.438439
+v 0.948287 0.148704 -2.635463
+v 0.000000 0.168425 -2.853323
+v 1.029458 2.243869 -2.273440
+v 1.684247 2.196377 -1.812778
+v 1.695385 2.763007 -1.398141
+v 1.876909 2.728275 -1.166568
+v 0.875196 3.021261 -1.978715
+v 1.782151 3.542078 -0.994194
+v 2.107162 3.384693 -0.769274
+v 0.844364 4.033239 -1.650793
+v 1.796315 4.118073 -0.761666
+v 0.742722 4.663668 -1.204837
+v 0.846059 5.265105 -0.353710
+v 0.689895 5.512417 0.378273
+v 2.173945 1.466511 -1.022513
+v 4.311844 -1.200631 -1.185389
+v 4.281209 -1.236017 -1.866678
+v 4.413421 -1.366023 -1.817253
+v 4.075917 -1.655770 -2.427462
+v 3.189816 -1.098227 -2.690340
+v 2.386931 -0.750937 -2.861997
+v 1.719496 -0.583459 -3.013854
+v 0.992348 -0.495836 -3.177464
+v 0.000000 -0.488963 -3.319090
+v 0.917138 -0.807683 -3.231596
+v 0.000000 -0.804943 -3.302980
+v 1.668542 -0.878633 -3.086971
+v 2.298172 -1.040506 -2.959992
+v 3.115793 -1.320478 -2.781168
+v 4.383541 -1.803513 -1.704460
+v 3.742640 -2.357771 -2.279376
+v 3.677979 -2.906064 -1.683045
+v 3.638811 -3.241707 -1.353842
+v 3.512533 -3.726455 -0.968948
+v 3.287627 -4.201365 -0.669328
+v 3.104445 -4.543452 -0.512972
+v 2.882289 -4.753160 -0.407417
+v 2.636978 -4.999932 -0.302704
+v 2.492217 -5.233891 -0.221049
+v 0.681818 -1.565714 -2.716835
+v 0.000000 -1.514726 -2.809973
+v 1.350166 -1.675141 -2.539728
+v 1.847815 -1.745939 -2.457083
+v 2.756224 -1.990174 -2.296259
+v 0.518024 -2.108149 -2.289217
+v 0.000000 -2.056348 -2.351995
+v 1.086792 -2.191168 -2.149774
+v 1.538274 -2.289064 -2.018205
+v 1.964073 -2.352004 -1.909482
+v 2.640020 -2.518011 -1.714509
+v 0.447870 -2.510344 -2.135957
+v 0.000000 -2.394556 -2.209325
+v 0.983234 -2.583103 -1.999717
+v 1.466647 -2.710105 -1.839738
+v 2.073789 -2.822868 -1.612534
+v 2.705886 -3.010171 -1.356652
+v 0.342392 -3.011335 -2.034681
+v 0.000000 -2.933987 -2.082818
+v 0.865371 -3.113704 -1.900680
+v 1.355650 -3.234251 -1.735384
+v 1.782574 -3.384361 -1.495969
+v 2.213447 -3.537353 -1.179812
+v 2.642006 -3.590153 -0.976034
+v 0.208197 -3.462166 -2.003835
+v 0.000000 -3.389574 -2.041322
+v 0.730909 -3.568524 -1.898096
+v 1.243983 -3.663187 -1.705608
+v 1.658564 -3.768527 -1.451286
+v 2.096884 -3.938877 -1.011877
+v 2.555869 -3.972320 -0.738809
+v 0.090155 -3.819369 -2.045353
+v 0.000000 -3.752511 -2.078401
+v 0.670606 -3.915647 -1.926927
+v 1.159382 -3.987731 -1.720752
+v 1.552317 -4.103237 -1.436285
+v 2.010662 -4.250180 -0.897486
+v 2.468651 -4.337706 -0.565898
+v 0.097358 -4.207095 -2.087483
+v 0.000000 -4.202299 -2.120784
+v 0.635255 -4.234691 -1.945461
+v 1.120766 -4.323770 -1.724594
+v 1.502728 -4.482214 -1.405541
+v 1.882566 -4.595675 -0.852173
+v 2.412344 -4.644467 -0.439763
+v 0.110803 -4.449912 -2.120649
+v 0.000000 -4.442326 -2.166266
+v 0.124695 -4.685015 -2.152756
+v 0.000000 -4.702721 -2.231823
+v 0.115238 -4.992694 -2.207529
+v 0.000000 -4.968038 -2.257743
+v 0.620858 -4.483344 -1.979611
+v 0.611104 -4.723975 -2.018918
+v 0.595195 -5.038123 -2.079089
+v 1.086496 -4.588467 -1.746181
+v 1.064364 -4.823517 -1.765696
+v 1.031392 -5.100853 -1.806217
+v 1.469167 -4.728073 -1.396747
+v 1.415856 -4.954430 -1.408992
+v 1.376496 -5.234863 -1.426483
+v 1.790332 -4.906054 -0.797175
+v 1.686224 -5.163830 -0.782295
+v 1.596255 -5.436766 -0.777835
+v 2.260912 -4.951986 -0.323219
+v 2.121402 -5.166779 -0.272905
+v 2.015332 -5.387508 -0.191249
+v 0.000000 -1.988895 0.953370
+v 0.000000 -2.036472 1.142150
+v 0.000000 -2.077863 1.229946
+v 0.000000 -2.186846 1.384890
+v 0.000000 -2.283902 1.486748
+v 0.000000 -2.419917 1.574930
+v 0.000000 -2.654662 1.791003
+v 0.000000 -2.825996 1.883388
+v 0.000000 -3.214574 1.963003
+v 0.000000 -3.428350 1.799299
+v 0.000000 -3.572078 1.805144
+v 0.000000 -3.823292 1.726999
+v 0.000000 -4.138469 1.786812
+v 0.000000 -4.423326 1.863373
+v 0.000000 -4.772663 1.922207
+v 0.000000 -6.030879 1.934725
+v 0.173271 -6.030879 1.848678
+v 0.409214 -6.030879 1.779429
+v 0.452853 -6.030879 1.869895
+v 0.540109 -6.030879 2.066025
+v 0.666940 -6.030879 2.126052
+v 0.838990 -6.030879 1.962155
+v 0.982628 -6.030879 1.797889
+v 1.089061 -6.030879 1.736157
+v 1.234861 -6.030879 1.676691
+v 1.334627 -6.030879 1.636621
+v 1.479750 -6.030879 1.633867
+v 1.517471 -6.030879 1.422787
+v 2.161167 -6.030879 1.090996
+v 2.506828 -6.030879 0.750036
+v 2.363794 -6.030879 0.116081
+v 2.225014 -6.030879 -0.140141
+v 2.092339 -6.030879 -0.217990
+v 1.793452 -6.030879 -0.258928
+v 1.420514 -6.030879 -0.868995
+v 1.224949 -6.030879 -1.543609
+v 0.917840 -6.030879 -1.938543
+v 0.529666 -6.030879 -2.222338
+v 0.102551 -6.030879 -2.355920
+v 0.000000 -6.030879 -2.408144
+v -0.606929 -5.258410 2.044219
+v -0.749451 -5.282475 2.101935
+v -1.104195 -5.305782 1.786403
+v -0.942787 -5.310546 1.944346
+v -1.223796 -5.327607 1.727047
+v -1.387634 -5.352595 1.669870
+v -1.499742 -5.392315 1.631342
+v -1.662819 -5.424446 1.628694
+v -1.705207 -5.429660 1.425738
+v -2.428539 -5.597278 1.106718
+v -2.816964 -5.698190 0.778881
+v -0.228664 -1.938785 0.914844
+v -0.085459 -1.988895 0.953370
+v -0.302674 -1.925339 0.896202
+v -0.275138 -1.989268 0.980982
+v -0.185271 -2.036472 1.142150
+v -0.159347 -2.077863 1.229946
+v -0.081716 -2.186846 1.384890
+v -0.056561 -2.283902 1.486748
+v -0.068819 -2.419917 1.574930
+v -0.142751 -2.654662 1.791003
+v -0.773483 -3.525448 1.920056
+v -0.919514 -3.599237 1.892229
+v -0.216434 -2.825996 1.883388
+v -0.357668 -3.214574 1.963003
+v -0.582558 -3.428350 1.799299
+v -0.787973 -3.572078 1.805144
+v -0.811570 -3.535260 1.639753
+v -0.654987 -3.823292 1.726999
+v -0.503207 -4.138469 1.786812
+v -0.317156 -4.423326 1.863373
+v -0.508878 -5.273241 1.855637
+v -0.459840 -5.250568 1.768653
+v -0.194708 -5.182790 1.835237
+v -0.087132 -4.772663 1.922207
+v -2.656234 -5.605168 0.169326
+v -2.500285 -5.523783 -0.077034
+v -2.351196 -5.435412 -0.151886
+v -1.417944 -2.541195 1.493780
+v -1.259329 -2.426003 1.563345
+v -1.236121 -2.711167 1.686120
+v -1.409394 -2.865327 1.613634
+v -1.224993 -2.938594 1.776514
+v -1.399548 -3.105691 1.685054
+v -1.202295 -3.145272 1.833352
+v -1.379981 -3.366113 1.738770
+v -1.106314 -3.590680 1.974236
+v -1.334269 -3.716449 1.839816
+v -1.002768 -4.057680 2.052466
+v -1.232172 -4.121325 1.915639
+v -0.921851 -4.498998 2.102010
+v -1.149484 -4.521899 1.949742
+v -0.821686 -4.948648 2.109915
+v -1.055671 -4.969047 1.934536
+v -0.665033 -4.949267 2.067833
+v -0.790397 -4.471575 2.070390
+v -0.871066 -4.030221 2.020681
+v -1.011326 -3.548462 1.932144
+v -1.155576 -3.109339 1.814467
+v -1.175242 -2.848861 1.705078
+v -1.170322 -2.683542 1.625350
+v -1.649166 -3.153598 1.425104
+v -1.725446 -2.901864 1.298102
+v -1.915900 -3.340909 1.329336
+v -1.974884 -3.126890 1.261171
+v -2.246661 -3.436337 1.323768
+v -2.290493 -3.340302 1.279632
+v -2.534990 -3.502395 1.347507
+v -2.140607 -3.727898 1.472833
+v -2.317251 -3.857045 1.497275
+v -1.835587 -3.589522 1.435310
+v -2.013046 -3.668311 1.428434
+v -1.584067 -3.394486 1.523631
+v -1.682448 -3.490690 1.451628
+v -1.529117 -3.611627 1.612823
+v -1.548203 -3.500728 1.581314
+v -2.122380 -3.823961 1.506380
+v -2.060160 -3.909763 1.538973
+v -2.231689 -4.015099 1.562255
+v -2.010254 -3.717139 1.449443
+v -2.076778 -3.804394 1.495765
+v -1.961209 -3.864456 1.531278
+v -1.986340 -3.832651 1.514372
+v -1.608903 -3.661776 1.551223
+v -1.668334 -3.515077 1.467304
+v -1.597241 -3.534766 1.528002
+v -1.617885 -3.613874 1.534346
+v -1.988031 -3.767161 1.485134
+v -1.655153 -3.556152 1.491457
+v -1.812183 -3.626549 1.434301
+v -1.798499 -3.643519 1.450996
+v -1.790407 -3.668857 1.471051
+v -1.787096 -3.693876 1.484562
+v -1.763082 -3.742047 1.509739
+v -1.873679 -4.202039 1.614515
+v -2.045680 -4.339208 1.644113
+v -1.659365 -4.027687 1.614704
+v -1.502733 -3.882563 1.688551
+v -1.422880 -4.194795 1.751814
+v -1.338830 -4.586100 1.776423
+v -1.219358 -5.001400 1.765408
+v -1.321242 -5.037073 1.701719
+v -1.481364 -4.614100 1.694944
+v -1.586808 -4.326046 1.684303
+v -1.770696 -4.440989 1.659695
+v -1.957850 -4.535209 1.648452
+v -1.652831 -4.684212 1.684831
+v -1.850858 -4.739279 1.666618
+v -1.460594 -5.078399 1.663402
+v -1.631559 -5.124405 1.645831
+v -1.326262 -2.155088 1.413261
+v -1.485772 -2.251122 1.373872
+v -1.880520 -2.569602 1.112499
+v -1.710357 -2.035759 1.113492
+v -1.545319 -1.781823 1.127396
+v -1.362923 -1.931386 1.228796
+v -1.082675 -2.159156 1.209878
+v -1.115181 -2.219535 1.300111
+v -2.050930 -1.831655 0.828760
+v -1.702970 -1.478868 0.875829
+v -1.402433 -1.226174 0.788059
+v -1.535905 -1.298107 0.807226
+v -1.644327 -1.327048 0.804401
+v -1.764862 -1.361831 0.781579
+v -2.288634 -1.645988 0.611225
+v -1.883102 -1.374386 0.712727
+v -2.035308 -1.272274 0.521232
+v -2.395414 -1.414058 0.447712
+v -2.509845 -0.986878 0.206504
+v -2.208626 -0.922418 0.257252
+v -2.639863 -2.438321 0.958418
+v -2.725734 -1.886749 0.497114
+v -2.764515 -1.590138 0.284429
+v -2.831744 -1.098893 0.044976
+v -1.775468 -2.806755 1.258097
+v -1.655526 -2.682360 1.299566
+v -2.033635 -2.703922 1.074109
+v -1.839602 -2.218849 1.044937
+v -2.056288 -3.001260 1.208765
+v -2.384792 -3.212572 1.263918
+v -2.356952 -4.120360 1.544871
+v -2.459801 -3.955877 1.483205
+v -2.178010 -4.430263 1.632940
+v -2.075841 -4.618856 1.646803
+v -1.971436 -4.813312 1.649093
+v -1.782910 -5.179061 1.642088
+v -2.722473 -3.521854 1.297529
+v -2.320522 -0.635532 0.139770
+v -2.572149 -0.716555 0.062678
+v -2.866314 -0.799157 -0.133476
+v -2.292457 -0.145070 -0.109027
+v -2.443170 -0.179462 -0.315260
+v -2.730895 -0.264831 -0.543768
+v -2.458838 0.001204 -0.795894
+v -2.292063 0.126813 -0.573476
+v -2.192149 0.196353 -0.366311
+v -2.321326 0.143332 -0.986568
+v -2.204225 0.285265 -0.793519
+v -2.086512 0.412325 -0.602341
+v -1.979496 0.526511 -1.052944
+v -1.901332 0.677905 -0.887785
+v -2.119281 0.374709 -1.296339
+v -2.404395 0.114204 -1.034763
+v -2.182306 0.325784 -1.359781
+v -2.489319 -0.022626 -0.860502
+v -2.735065 -0.303741 -0.600112
+v -2.972152 -1.121362 -0.018465
+v -2.979924 -0.812304 -0.196070
+v -2.922423 -1.641673 0.257410
+v -2.873500 -1.930568 0.473403
+v -2.375135 0.046336 -1.144438
+v -2.172337 0.226998 -1.422520
+v -2.491158 -0.102854 -1.005916
+v -2.796512 -0.410669 -0.688888
+v -2.990258 -0.891358 -0.298409
+v -3.003446 -1.208466 -0.126238
+v -2.626737 -0.141303 -1.176234
+v -3.305729 -0.660061 -1.106242
+v -3.189751 -0.546391 -1.211410
+v -3.498145 -0.805415 -0.915226
+v -3.598299 -1.111347 -0.580610
+v -3.594934 -1.309430 -0.426668
+v -2.960597 -1.718621 0.127997
+v -2.892831 -2.040189 0.309357
+v -3.561625 -1.803253 -0.127527
+v -3.572524 -2.193293 0.073111
+v -2.723940 -2.593923 0.991446
+v -2.101627 -2.776564 0.955989
+v -1.952771 -2.425001 0.870612
+v -1.810815 -2.786959 1.099059
+v -2.079275 -2.975586 1.069559
+v -2.419624 -3.200458 1.048395
+v -2.758584 -3.526407 1.034976
+v -2.414672 -4.011502 1.178445
+v -2.324448 -4.181604 1.220485
+v -2.173626 -4.477980 1.310844
+v -2.088244 -4.632308 1.348621
+v -1.971255 -4.860397 1.375835
+v -1.807332 -5.201816 1.406577
+v -3.032909 -4.274755 0.871277
+v -3.221893 -3.685248 0.761669
+v -3.384109 -3.157457 0.609178
+v -3.006850 -3.159979 0.786586
+v -2.761079 -3.343132 0.934009
+v -2.989856 -4.359622 0.888982
+v -2.837555 -4.575955 0.958111
+v -2.743621 -4.770766 1.013783
+v -2.647256 -5.006955 1.036057
+v -2.543676 -5.328383 1.063651
+v -2.636712 -2.719342 0.706883
+v -2.675142 -2.784636 0.772986
+v -3.022010 -2.935674 0.717220
+v -3.488740 -2.821402 0.417224
+v -2.408273 -2.931587 0.890975
+v -2.481620 -3.157896 0.992837
+v -2.536210 -2.948206 0.958051
+v -2.663577 -2.834692 0.861852
+v -2.882174 -2.937345 0.843545
+v -2.925337 -3.100878 0.894157
+v -2.756874 -3.229780 1.007085
+v -2.555491 -3.089174 1.022268
+v -2.674389 -2.937617 0.933123
+v -2.780405 -2.972446 0.918971
+v -2.626996 -2.987327 0.979362
+v -2.629518 -3.052213 1.002425
+v -2.750973 -3.111114 0.986978
+v -2.807915 -3.045099 0.930632
+v -2.717701 -3.030117 0.972204
+v -4.313962 -1.233717 -1.113217
+v -4.624830 -1.455210 -1.033928
+v -4.330608 -1.411916 -0.776805
+v -4.324175 -1.485486 -0.686738
+v -4.248341 -1.902899 -0.362860
+v -4.634851 -1.565367 -0.797032
+v -4.566785 -1.925704 -0.443689
+v -4.188893 -2.337274 -0.205079
+v -4.137861 -2.703013 -0.100062
+v -4.022866 -3.369608 0.033900
+v -3.764290 -3.909375 0.369424
+v -4.456349 -2.398925 -0.204624
+v -4.359573 -2.784669 -0.104717
+v -4.125014 -3.394157 -0.000466
+v -3.898481 -4.088530 -0.065554
+v -4.241738 -3.465072 -0.094279
+v -4.479900 -2.866124 -0.178521
+v -4.576882 -2.437436 -0.255504
+v -4.648549 -1.977384 -0.494981
+v -3.513140 -4.435121 0.544512
+v -3.497720 -4.482059 0.557091
+v -3.379102 -4.700961 0.630729
+v -3.324800 -4.792911 0.649540
+v -3.166105 -5.047532 0.719668
+v -2.974409 -5.394820 0.804852
+v -3.670990 -4.569324 0.278001
+v -3.529665 -4.810116 0.407969
+v -3.328219 -5.106425 0.519180
+v -3.048547 -5.432866 0.657509
+v -1.874501 0.840434 -0.825335
+v -1.653189 0.929418 -0.708563
+v -1.789908 0.559574 -0.484963
+v -2.022252 0.544661 -0.586962
+v -1.619546 1.085665 -0.484865
+v -1.709339 0.708810 -0.303075
+v -1.494055 1.265579 -0.284350
+v -1.608594 0.873861 -0.115187
+v -1.679156 0.633915 0.029714
+v -1.778391 0.482136 -0.139324
+v -1.872463 0.346143 -0.310705
+v -2.145294 0.339204 -0.375192
+v -1.915717 0.040941 -0.014837
+v -2.201232 0.000293 -0.064496
+v -1.764515 0.177998 0.117671
+v -1.676031 0.329475 0.229159
+v -1.555784 0.021224 0.505726
+v -1.718960 -0.160742 0.469903
+v -1.270392 -0.147104 0.784968
+v -1.526734 -0.330392 0.664287
+v -1.394744 -0.413036 0.760716
+v -0.965119 -0.260672 0.954350
+v -1.133576 -0.529377 0.876480
+v -0.660852 -0.430087 1.026409
+v -0.890434 -0.667131 1.030138
+v -1.083905 -0.908114 0.962937
+v -1.292102 -0.754556 0.823783
+v -1.497409 -0.724919 0.744497
+v -1.774028 -0.557820 0.533113
+v -1.918869 -0.331560 0.339632
+v -2.293218 -0.484214 0.339257
+v -1.870448 -0.652197 0.450844
+v -2.204633 -0.761890 0.492489
+v -1.920558 -0.911602 0.635633
+v -2.150011 -1.077666 0.738764
+v -1.173329 -0.937966 0.974752
+v -1.359247 -0.802611 0.864891
+v -1.564809 -0.797042 0.792898
+v -1.863340 -0.977168 0.914090
+v -2.107739 -1.143225 0.953456
+v -1.715824 -0.929656 0.966024
+v -1.618376 -0.925175 1.029689
+v -1.369610 -1.015338 1.119676
+v -1.832846 -1.020531 1.185262
+v -1.626036 -1.076742 1.288613
+v -1.714100 -1.093595 1.318990
+v -1.848709 -1.143001 1.341502
+v -1.983526 -1.157101 1.274700
+v -2.045247 -1.153720 1.168849
+v -1.929603 0.766195 -0.868969
+v -2.116741 0.495058 -0.601314
+v -2.255911 0.276612 -0.416612
+v -2.281261 -0.081355 -0.119904
+v -2.360604 -0.599489 0.198334
+v -2.290626 -0.891433 0.390191
+v -2.149541 -1.234854 0.593719
+v -2.050488 -1.366728 0.809457
+v -1.947857 -1.381446 0.959888
+v -1.772848 -1.328383 1.095626
+v -1.564976 -1.261520 1.034313
+v -1.497288 -1.339130 0.841721
+v -1.364580 -1.180787 0.924075
+v -0.979704 -2.071305 1.342422
+v -1.002919 -2.144323 1.415971
+v -1.288682 -1.818864 1.337446
+v -1.184800 -2.360092 1.620601
+v -1.499328 -1.619904 1.259788
+v -1.150655 -2.577878 1.705708
+v -1.138570 -2.355695 1.608074
+v -1.076103 -2.441460 1.640501
+v -0.986579 -2.344266 1.588933
+v -0.946039 -2.139567 1.405321
+v -0.911458 -2.006588 1.293084
+v -1.226792 -1.758778 1.263937
+v -1.430329 -1.605903 1.242139
+v -1.185289 -1.494439 1.039594
+v -1.106210 -1.685248 1.170283
+v -1.003208 -1.853189 1.204180
+v -1.062459 -1.710216 1.147465
+v -0.987919 -1.577734 0.943063
+v -1.011487 -1.466149 0.849459
+v -1.412549 -1.265471 0.846861
+v -1.163166 -1.083631 0.749894
+v -1.215025 -1.139879 0.631844
+v -1.090440 -1.023507 0.678469
+v -1.140061 -1.085619 0.548845
+v -1.322738 -1.282287 0.839324
+v -1.125903 -1.247879 0.726983
+v -0.975960 -1.253640 0.439031
+v -0.951070 -1.490338 0.657946
+v -0.923414 -1.563252 0.752181
+v -0.831620 -1.507736 0.611914
+v -0.772368 -1.363330 0.594727
+v -0.706202 -1.445747 0.661758
+v -1.053160 -0.947260 0.364276
+v -0.899215 -1.079844 0.440476
+v -0.696132 -1.182176 0.597604
+v -0.541634 -1.357723 0.706386
+v -1.031870 -0.910848 0.501241
+v -0.972473 -0.904372 0.702188
+v -0.953346 -0.798897 0.560640
+v -0.945703 -0.793197 0.352311
+v -0.840242 -0.927747 0.424596
+v -0.620113 -1.068009 0.584601
+v -0.406030 -1.181369 0.658817
+v -0.776626 -0.858709 0.397058
+v -0.588595 -1.031782 0.557169
+v -0.552893 -0.992161 0.508997
+v -0.372288 -1.143575 0.620912
+v -0.344751 -1.110140 0.559124
+v -0.223761 -1.185662 0.654281
+v -0.250869 -1.226516 0.715051
+v -0.123685 -1.159181 0.616287
+v -0.306132 -1.328286 0.761379
+v -0.881827 -0.723916 0.435746
+v -0.723647 -0.597074 0.645566
+v -0.757860 -0.781188 0.456694
+v -0.882614 -0.775412 0.755154
+v -0.666779 -0.552895 0.796182
+v -0.611036 -0.525612 0.788876
+v -0.562304 -0.416580 0.969606
+v -0.876471 -0.148345 0.904860
+v -1.138099 -0.091895 0.774442
+v -1.485183 0.079724 0.500447
+v -1.596159 0.379360 0.235293
+v -1.566675 0.634397 0.073622
+v -1.512450 0.897163 -0.076482
+v -1.412367 1.281826 -0.310801
+v -1.237959 0.865933 -0.239116
+v -1.313157 0.598818 -0.121402
+v -1.265388 0.325109 -0.014263
+v -1.172174 0.003799 0.288578
+v -1.038911 -0.054216 0.599331
+v -0.525206 -0.699021 0.685298
+v -0.542374 -0.842300 0.544174
+v -0.503536 -0.631044 0.705220
+v -0.501866 -0.586513 0.662164
+v -0.455321 -0.546323 0.782268
+v -0.379120 -0.507010 0.863837
+v -0.299927 -0.673631 0.765450
+v -0.304694 -0.630063 0.726692
+v -0.325211 -0.748447 0.738581
+v -0.224965 -0.434611 0.626931
+v -0.215350 -0.596543 0.743346
+v -0.127284 -0.764450 0.768490
+v -0.113276 -0.678553 0.767337
+v -0.137651 -0.622930 0.687754
+v -0.096537 -0.571215 0.609019
+v -0.322935 -0.900350 0.611039
+v -0.108917 -0.939211 0.646315
+v -0.016477 -0.926391 0.649357
+v 0.000578 -1.149405 0.652702
+v -0.139737 -1.171606 0.699986
+v 0.004388 -1.174172 0.722007
+v 0.007583 -1.191200 0.792125
+v -0.127929 -1.193892 0.754604
+v -0.241360 -1.278164 0.814638
+v -0.130370 -1.254810 0.861437
+v -0.033090 -1.254034 0.896798
+v -0.274387 -1.437386 0.895555
+v -0.260266 -1.429410 0.950578
+v -0.166855 -1.398997 0.996518
+v -0.490997 -1.452079 1.079063
+v -0.672423 -1.321110 1.058253
+v -0.733092 -1.446843 0.883670
+v -0.777042 -1.374494 1.179787
+v -0.852626 -1.500311 1.052535
+v -0.806198 -1.468259 0.783523
+v -0.957618 -1.550179 0.980468
+v -1.061248 -1.693582 1.249920
+v -0.991865 -1.643754 1.309478
+v -0.918461 -1.559019 1.397034
+v -0.600731 -1.529273 1.201757
+v -1.043674 -1.738987 1.307451
+v -0.961809 -1.793360 1.514807
+v -0.871396 -1.707364 1.600356
+v -0.643279 -1.597424 1.344353
+v -0.616929 -1.647787 1.441685
+v -0.803006 -1.788214 1.656914
+v -0.729624 -1.999230 1.428804
+v -0.923605 -2.047241 1.528758
+v -0.887021 -2.089621 1.740125
+v -0.908608 -2.268117 1.570879
+v -0.804780 -2.017978 1.533626
+v -0.752157 -2.040502 1.662394
+v -0.544718 -2.044484 1.668407
+v -0.628571 -2.050575 1.845255
+v -0.697121 -2.147149 1.901156
+v -0.550252 -1.907047 1.787284
+v -0.487346 -1.724542 1.549441
+v -0.395899 -1.825250 1.640423
+v -0.250850 -1.637978 1.015846
+v -0.244374 -1.658235 0.946017
+v -0.123817 -1.642736 1.107774
+v -0.075363 -1.842817 1.071423
+v -0.245409 -1.810659 0.985872
+v -0.304946 -1.805198 0.974470
+v -0.296986 -1.699174 1.051869
+v -0.439278 -1.770717 1.223794
+v -0.314085 -1.883325 1.371367
+v -0.179735 -1.984468 1.494798
+v -0.324830 -1.841375 1.003657
+v -0.222738 -1.894406 1.155335
+v -0.172525 -1.978736 1.231043
+v -0.114834 -2.162851 1.420513
+v -0.093712 -2.255516 1.488580
+v -0.112533 -2.125553 1.543084
+v -0.124040 -2.383260 1.618812
+v -0.150668 -2.039182 1.681016
+v -0.190912 -2.607809 1.821257
+v -0.240723 -2.602026 1.811898
+v -0.306947 -2.582094 1.862173
+v -0.405686 -2.474868 1.990988
+v -0.226778 -2.090173 1.907548
+v -0.348400 -2.002303 1.884293
+v -0.429880 -2.105294 1.813437
+v -0.510107 -2.120671 1.944439
+v -0.581623 -2.187905 2.008629
+v -0.478191 -2.157100 2.001021
+v -0.940866 -2.328458 1.660947
+v -1.015872 -2.421969 1.749243
+v -1.130258 -2.672200 1.895345
+v -1.133006 -3.056261 1.998462
+v -0.829619 -3.395835 1.961927
+v -0.886282 -2.900060 1.864000
+v -0.973873 -2.665101 1.909583
+v -0.872574 -2.480379 1.729201
+v -0.924078 -2.539847 1.804793
+v -0.850053 -2.399683 1.656877
+v -0.677365 -3.395529 1.913464
+v -0.490297 -3.081067 2.001696
+v -0.442003 -3.181398 2.023786
+v -0.371433 -2.706441 1.897063
+v -0.289637 -2.717131 1.956565
+v -0.833722 -2.319913 1.588685
+v -0.723318 -2.277545 1.887690
+v -0.833002 -2.323450 1.837793
+v -0.692294 -2.371743 1.913054
+v -0.838047 -2.453222 1.883920
+v -0.641657 -2.588223 1.940398
+v -0.835450 -2.392535 1.666195
+v -0.863047 -2.464924 1.733322
+v -0.611144 -2.550968 2.004122
+v -0.586612 -2.676337 1.973955
+v -0.692440 -3.060730 1.993670
+v -0.766932 -3.933840 1.811139
+v -0.735525 -3.893854 1.701079
+v -0.728226 -4.163616 1.817632
+v -0.672600 -4.211015 1.737881
+v -0.642157 -4.510410 1.854692
+v -0.587140 -4.550395 1.720699
+v -0.570267 -4.186787 1.772454
+v -0.442477 -4.489280 1.785019
+v -0.572488 -4.948374 1.875073
+v -0.520362 -4.931837 1.776638
+v -0.271754 -4.840917 1.837813
+v -3.741771 -4.171817 -0.347126
+v -4.043613 -3.575043 -0.555009
+v -4.223952 -3.061474 -0.724218
+v -4.403008 -2.606096 -0.807085
+v -4.509541 -2.165012 -0.978357
+v -4.644337 -1.741958 -1.085475
+v -4.074585 -2.737126 -1.284806
+v -4.247483 -2.277002 -1.454847
+v -3.940585 -3.141079 -1.091841
+v -3.749558 -3.689571 -0.831686
+v -3.503217 -4.203363 -0.577819
+v -3.511727 -4.552409 -0.171128
+v -3.298432 -4.835660 -0.094779
+v -3.069507 -5.126623 -0.010901
+v -2.856514 -5.366696 0.088825
+v -2.682419 -5.306578 -0.162887
+v -2.865412 -5.074536 -0.246702
+v -3.115006 -4.827193 -0.302164
+v -3.337063 -4.542685 -0.391358
+v -1.269260 1.255200 -0.337076
+v -0.808878 -0.108006 0.862693
+v -0.785511 -0.113481 0.744561
+v -1.288147 1.331118 -0.224217
+v -1.428511 1.249858 0.363487
+v -1.360651 1.219843 0.665852
+v -1.426867 1.333607 0.370559
+v -1.450856 1.457047 0.528348
+v -1.384062 1.438226 0.638337
+v -1.470071 1.493236 0.369380
+v -1.594261 1.558343 0.626987
+v -1.484255 1.632078 0.642222
+v -1.620929 1.647771 0.357712
+v -1.650435 1.617243 0.680182
+v -1.545264 1.742151 0.824324
+v -1.389575 1.760656 0.867844
+v -1.383596 1.808758 1.025872
+v -1.655757 1.825900 0.954174
+v -1.597150 1.914643 1.006309
+v -1.392070 1.994927 1.179577
+v -1.762705 1.655988 0.631224
+v -1.762992 1.805720 0.775415
+v -1.949500 1.849836 0.823902
+v -1.760768 1.850647 1.065403
+v -1.743619 1.997952 1.234624
+v -1.497468 2.133743 1.191102
+v -1.400213 2.173737 1.276591
+v -1.756102 2.216640 1.319918
+v -1.420383 2.453469 1.475121
+v -0.681201 -0.189988 0.897274
+v -0.475894 -0.298390 0.931689
+v -0.290747 -0.351774 0.892697
+v -0.276279 -0.316745 0.701162
+v -1.338810 2.729682 1.686965
+v -1.295536 2.975859 1.876092
+v -1.249168 3.130029 2.062850
+v -1.228711 3.220825 2.196595
+v -1.062347 3.349826 2.391934
+v -0.814242 3.416641 2.460567
+v -0.605427 3.436728 2.625397
+v -0.377767 3.416682 2.699480
+v -0.191664 3.352134 2.742179
+v -0.327215 3.617606 3.165959
+v -0.490340 3.727078 3.028905
+v -0.833423 3.579124 2.952278
+v -1.186570 3.537148 2.883776
+v -1.274514 3.429492 2.340806
+v -1.515386 3.462934 2.499302
+v -1.729657 2.985728 2.126961
+v -1.587334 3.273247 2.279883
+v -1.802587 2.673030 2.071795
+v -1.883505 2.421195 1.852780
+v -1.770470 1.547581 0.014896
+v -1.763543 1.690838 0.209278
+v -1.789812 1.745170 0.195716
+v -1.652398 1.635196 0.100315
+v -1.616211 1.631821 0.140151
+v -1.702170 1.691207 0.287679
+v -2.024910 1.684896 0.590685
+v -2.081244 1.739766 0.560523
+v -2.101686 1.841926 0.704701
+v -2.311996 1.667058 0.544330
+v -2.139216 1.493633 0.307465
+v -1.568122 1.452308 -0.160167
+v -1.847430 1.192309 -0.235521
+v -2.039961 1.263559 -0.106670
+v -2.001783 1.178930 -0.538870
+v -2.120274 1.181434 -0.439203
+v -1.955666 1.112051 -0.650840
+v -2.035204 1.058208 -0.740662
+v -2.506671 1.354212 -0.177264
+v -2.556798 1.425842 0.234125
+v -2.625577 1.667848 0.406381
+v -2.572188 1.665942 0.610608
+v -2.313997 1.937125 1.043955
+v -1.347179 1.435083 -0.164662
+v -2.370565 2.188644 1.319938
+v -1.795360 2.312256 1.448602
+v -2.298796 2.378327 1.484097
+v -2.431922 2.420861 1.791865
+v -2.274832 2.708370 1.953293
+v -2.127402 2.763782 2.172931
+v -2.027815 3.057472 2.207687
+v -2.211272 3.151361 2.175526
+v -2.077582 3.593789 2.544059
+v -2.205795 3.053233 1.995680
+v -2.234578 2.853686 1.921466
+v -2.492220 2.763751 1.681460
+v -1.682721 3.872787 2.699838
+v -1.591274 3.687533 2.795306
+v -1.469790 4.226974 3.125912
+v -1.419313 4.085230 3.114769
+v -0.969239 4.032842 3.237621
+v -0.446240 4.025191 3.175913
+v -0.293380 4.202842 3.126171
+v -0.507507 4.749091 2.927829
+v -0.273753 4.902920 2.635112
+v -0.855572 4.443953 3.264785
+v -1.001219 4.433220 3.168902
+v -2.634762 2.917107 1.571458
+v -2.373444 3.230135 1.701438
+v -2.245007 3.762857 1.971262
+v -2.174998 3.974638 1.861146
+v -1.772471 3.917193 2.561741
+v -1.696145 3.988359 2.581486
+v -2.020528 4.126190 2.057333
+v -1.720966 4.401711 2.028207
+v -1.417985 4.554327 2.447087
+v -1.350400 4.347244 2.806280
+v -1.200152 4.613357 3.063192
+v -1.304464 4.997022 2.246442
+v -0.873342 4.709630 3.173557
+v -0.696170 4.784035 2.819126
+v -0.424844 4.978543 2.246064
+v -0.696076 5.193224 2.026187
+v -0.635427 5.515653 1.331738
+v -1.511739 4.938085 1.521488
+v -1.906790 4.422846 1.795979
+v -2.354552 3.705653 1.670219
+v -2.644936 3.814625 1.425739
+v -2.421550 3.779236 0.825727
+v -2.203040 4.216619 1.154116
+v -2.251699 4.269145 0.470671
+v -1.788527 4.809611 0.096426
+v -1.601388 4.895715 0.838140
+v -2.543023 3.228183 1.363687
+v -2.588333 3.236537 1.228543
+v -2.629558 3.164815 0.666688
+v -2.336965 3.754007 -0.076831
+v -2.695441 2.594186 0.979715
+v -2.703436 2.831996 0.591982
+v -2.430008 2.811457 0.125791
+v -2.207136 3.078765 -0.379399
+v -2.904035 2.247210 0.893879
+v -2.666324 2.010223 0.643661
+v -2.569228 2.368971 0.316299
+v -2.560933 2.359419 -0.171605
+v -2.265315 2.576830 -0.675925
+v -2.336648 2.029389 -0.421402
+v -2.284415 2.022634 -0.855935
+v -2.150451 1.476840 -0.584277
+v -2.167788 1.514616 -0.809225
+v -2.643453 1.925415 -0.018950
+v -1.612726 0.873944 -1.296869
+v -2.079375 1.110581 -1.195821
+v -1.716492 0.726429 -1.388435
+v -1.884749 0.517371 -1.562625
+v -1.960825 0.442513 -1.610592
+v -1.942914 0.314387 -1.681620
+v -1.429990 0.889587 -1.614208
+v -1.505516 0.653872 -1.835689
+v -0.931704 0.787899 -2.066129
+v -0.917302 1.019552 -1.951271
+v -0.951775 0.729199 -2.150724
+v -1.555206 0.591727 -1.909888
+v -0.894334 1.458678 -2.053686
+v -1.639151 1.530680 -1.825240
+v -0.916245 0.591191 -2.197576
+v -1.516843 0.444141 -1.941028
+v -2.894158 -0.293492 -1.693660
+v -2.208730 -0.084916 -2.252010
+v -1.643629 0.058334 -2.438439
+v -0.948287 0.148704 -2.635463
+v -1.029458 2.243869 -2.273440
+v -1.684247 2.196377 -1.812778
+v -1.695385 2.763007 -1.398141
+v -1.876909 2.728275 -1.166568
+v -0.875196 3.021261 -1.978715
+v -1.782151 3.542078 -0.994194
+v -2.107162 3.384693 -0.769274
+v -0.844364 4.033239 -1.650793
+v -1.796315 4.118073 -0.761666
+v -0.742722 4.663668 -1.204837
+v -0.846059 5.265105 -0.353710
+v -0.689895 5.512417 0.378273
+v -2.173945 1.466511 -1.022513
+v -4.311844 -1.200631 -1.185389
+v -4.281209 -1.236017 -1.866678
+v -4.413421 -1.366023 -1.817253
+v -4.075917 -1.655770 -2.427462
+v -3.189816 -1.098227 -2.690340
+v -2.386931 -0.750937 -2.861997
+v -1.719496 -0.583459 -3.013854
+v -0.992348 -0.495836 -3.177464
+v -0.917138 -0.807683 -3.231596
+v -1.668542 -0.878633 -3.086971
+v -2.298172 -1.040506 -2.959992
+v -3.115793 -1.320478 -2.781168
+v -4.383541 -1.803513 -1.704460
+v -3.742640 -2.357771 -2.279376
+v -3.677979 -2.906064 -1.683045
+v -3.638811 -3.241707 -1.353842
+v -3.512533 -3.726455 -0.968948
+v -3.287627 -4.201365 -0.669328
+v -3.104445 -4.543452 -0.512972
+v -2.882289 -4.753160 -0.407417
+v -2.636978 -4.999932 -0.302704
+v -2.492217 -5.233891 -0.221049
+v -0.681818 -1.565714 -2.716835
+v -1.350166 -1.675141 -2.539728
+v -1.847815 -1.745939 -2.457083
+v -2.756224 -1.990174 -2.296259
+v -0.518024 -2.108149 -2.289217
+v -1.086792 -2.191168 -2.149774
+v -1.538274 -2.289064 -2.018205
+v -1.964073 -2.352004 -1.909482
+v -2.640020 -2.518011 -1.714509
+v -0.447870 -2.510344 -2.135957
+v -0.983234 -2.583103 -1.999717
+v -1.466647 -2.710105 -1.839738
+v -2.073789 -2.822868 -1.612534
+v -2.705886 -3.010171 -1.356652
+v -0.342392 -3.011335 -2.034681
+v -0.865371 -3.113704 -1.900680
+v -1.355650 -3.234251 -1.735384
+v -1.782574 -3.384361 -1.495969
+v -2.213447 -3.537353 -1.179812
+v -2.642006 -3.590153 -0.976034
+v -0.208197 -3.462166 -2.003835
+v -0.730909 -3.568524 -1.898096
+v -1.243983 -3.663187 -1.705608
+v -1.658564 -3.768527 -1.451286
+v -2.096884 -3.938877 -1.011877
+v -2.555869 -3.972320 -0.738809
+v -0.090155 -3.819369 -2.045353
+v -0.670606 -3.915647 -1.926927
+v -1.159382 -3.987731 -1.720752
+v -1.552317 -4.103237 -1.436285
+v -2.010662 -4.250180 -0.897486
+v -2.468651 -4.337706 -0.565898
+v -0.097358 -4.207095 -2.087483
+v -0.635255 -4.234691 -1.945461
+v -1.120766 -4.323770 -1.724594
+v -1.502728 -4.482214 -1.405541
+v -1.882566 -4.595675 -0.852173
+v -2.412344 -4.644467 -0.439763
+v -0.110803 -4.449912 -2.120649
+v -0.124695 -4.685015 -2.152756
+v -0.115238 -4.992694 -2.207529
+v -0.620858 -4.483344 -1.979611
+v -0.611104 -4.723975 -2.018918
+v -0.595195 -5.038123 -2.079089
+v -1.086496 -4.588467 -1.746181
+v -1.064364 -4.823517 -1.765696
+v -1.031392 -5.100853 -1.806217
+v -1.469167 -4.728073 -1.396747
+v -1.415856 -4.954430 -1.408992
+v -1.376496 -5.234863 -1.426483
+v -1.790332 -4.906054 -0.797175
+v -1.686224 -5.163830 -0.782295
+v -1.596255 -5.436766 -0.777835
+v -2.260912 -4.951986 -0.323219
+v -2.121402 -5.166779 -0.272905
+v -2.015332 -5.387508 -0.191249
+v -0.173271 -6.030879 1.848678
+v -0.409214 -6.030879 1.779429
+v -0.452853 -6.030879 1.869895
+v -0.540109 -6.030879 2.066025
+v -0.666940 -6.030879 2.126052
+v -0.838990 -6.030879 1.962155
+v -0.982628 -6.030879 1.797889
+v -1.089061 -6.030879 1.736157
+v -1.234861 -6.030879 1.676691
+v -1.334627 -6.030879 1.636621
+v -1.479750 -6.030879 1.633867
+v -1.517471 -6.030879 1.422787
+v -2.161167 -6.030879 1.090996
+v -2.506828 -6.030879 0.750036
+v -2.363794 -6.030879 0.116081
+v -2.225014 -6.030879 -0.140141
+v -2.092339 -6.030879 -0.217990
+v -1.793452 -6.030879 -0.258928
+v -1.420514 -6.030879 -0.868995
+v -1.224949 -6.030879 -1.543609
+v -0.917840 -6.030879 -1.938543
+v -0.529666 -6.030879 -2.222338
+v -0.102551 -6.030879 -2.355920
+v -1.161072 1.934412 1.775005
+v -0.205103 1.936063 2.501672
+v -0.231208 1.908201 2.470483
+v -0.290521 1.948551 2.542588
+v -0.315073 1.898174 2.508136
+v -0.302358 1.896070 2.416183
+v -0.407271 1.991888 2.515717
+v -0.599913 2.066898 2.561939
+v -0.818046 2.102397 2.491977
+v -1.070202 2.131116 2.231782
+v -1.126455 2.071561 1.968115
+v -0.439859 1.931271 2.550236
+v -0.626491 2.010932 2.565123
+v -0.817392 2.051739 2.467993
+v -1.046103 2.082681 2.201493
+v -1.094903 2.041015 1.980764
+v -0.446881 1.905963 2.506279
+v -0.641413 1.975450 2.479286
+v -0.807406 2.027692 2.422028
+v -1.015578 2.066997 2.215932
+v -0.333298 1.800984 2.196625
+v -0.377943 1.841381 2.221563
+v -0.514841 1.864908 2.234809
+v -0.580052 1.863718 2.233138
+v -0.675458 1.862439 2.223293
+v -0.784839 1.848392 2.147633
+v -0.853135 1.815021 1.987908
+v -0.723749 1.742288 2.068501
+v -0.576331 1.718729 2.132130
+v -0.426383 1.724865 2.150666
+v -0.399649 1.812594 2.196756
+v -0.502009 1.827583 2.212311
+v -0.463364 1.743613 2.168622
+v -0.714552 1.765103 2.129313
+v -0.755854 1.823434 2.135508
+v -0.654012 1.819856 2.204495
+v -0.634942 1.797914 2.197154
+v -0.574174 1.795299 2.193897
+v -0.534733 1.806213 2.186273
+v -0.571565 1.824729 2.221417
+v 1.161072 1.934412 1.775005
+v 0.205103 1.936063 2.501672
+v 0.231208 1.908201 2.470483
+v 0.290521 1.948551 2.542588
+v 0.315073 1.898174 2.508136
+v 0.302358 1.896070 2.416183
+v 0.407271 1.991888 2.515717
+v 0.599913 2.066898 2.561939
+v 0.818046 2.102397 2.491977
+v 1.070202 2.131116 2.231782
+v 1.126455 2.071561 1.968115
+v 0.439859 1.931271 2.550236
+v 0.626491 2.010932 2.565123
+v 0.817392 2.051739 2.467993
+v 1.046103 2.082681 2.201493
+v 1.094903 2.041015 1.980764
+v 0.446881 1.905963 2.506279
+v 0.641413 1.975450 2.479286
+v 0.807406 2.027692 2.422028
+v 1.015578 2.066997 2.215932
+v 0.333298 1.800984 2.196625
+v 0.377943 1.841381 2.221563
+v 0.514841 1.864908 2.234809
+v 0.580052 1.863718 2.233138
+v 0.675458 1.862439 2.223293
+v 0.784839 1.848392 2.147633
+v 0.853135 1.815021 1.987908
+v 0.723749 1.742288 2.068501
+v 0.576331 1.718729 2.132130
+v 0.426383 1.724865 2.150666
+v 0.399649 1.812594 2.196756
+v 0.502009 1.827583 2.212311
+v 0.463364 1.743613 2.168622
+v 0.714552 1.765103 2.129313
+v 0.755854 1.823434 2.135508
+v 0.654012 1.819856 2.204495
+v 0.634942 1.797914 2.197154
+v 0.574174 1.795299 2.193897
+v 0.534733 1.806213 2.186273
+v 0.571565 1.824729 2.221417
+g face
+v -0.093362 -0.478222 0.606843
+v -0.096537 -0.571215 0.609019
+v 0.000000 -0.557739 0.616228
+v 0.000000 -0.471817 0.617078
+v -0.224965 -0.434611 0.626931
+v -1.199660 0.612319 -0.114440
+v -1.237960 0.865933 -0.239116
+v -1.313160 0.598818 -0.121402
+v -1.265390 0.325109 -0.014263
+v -1.142100 0.357713 0.080797
+v -1.172170 0.003799 0.288578
+v -0.992640 0.087790 0.368875
+v -1.038910 -0.054216 0.599331
+v -0.958007 0.004663 0.540421
+v -1.269260 1.255200 -0.337076
+v -1.303610 1.165410 -0.035682
+v -1.256730 0.831771 0.001709
+v -1.246660 0.626933 0.095034
+v -1.181300 0.382558 0.276478
+v -0.997234 0.135594 0.524613
+v -0.968603 0.047490 0.672441
+v -1.360370 1.129340 0.147805
+v -1.313170 0.827262 0.178592
+v -1.321880 0.686917 0.300153
+v -1.237000 0.437886 0.578947
+v -1.129690 0.202209 0.825170
+v -1.071810 0.081753 0.940408
+v -0.864304 -0.095589 1.086810
+v -0.808878 -0.108006 0.862693
+v -0.785511 -0.113481 0.744561
+v -1.301330 1.309030 -0.013709
+v -1.288150 1.331120 -0.224217
+v -1.403780 1.253150 0.124680
+v -1.417140 1.199590 0.285955
+v -1.372150 1.077010 0.298650
+v -1.428510 1.249860 0.363487
+v -1.351640 0.730680 0.417285
+v -1.244320 0.569741 0.680281
+v -1.371090 0.959788 0.536405
+v -1.360650 1.219840 0.665852
+v -1.144610 0.348289 0.821948
+v -1.065100 0.150062 0.951618
+v -0.886429 -0.041894 1.134850
+v -0.951259 0.096646 1.220690
+v -1.077680 0.293950 1.020550
+v -1.260920 0.785572 0.842069
+v -1.205980 0.682387 0.998162
+v -1.175680 0.520922 0.896839
+v -1.082510 0.416250 1.082090
+v -1.086010 0.590441 1.157260
+v -0.941793 0.371891 1.296540
+v -0.964148 0.504018 1.389580
+v -0.949137 0.239988 1.242380
+v -1.286810 1.013720 0.965487
+v -1.225430 0.911496 1.117280
+v -1.130180 0.804388 1.263720
+v -0.997671 0.714594 1.469850
+v -1.352830 1.415070 0.762690
+v -1.384060 1.438230 0.638337
+v -1.296410 1.289840 1.082120
+v -1.257880 1.181680 1.267510
+v -1.158700 1.081660 1.421420
+v -1.019550 0.988808 1.650430
+v -1.341190 1.656330 0.806411
+v -1.389580 1.760660 0.867844
+v -1.484250 1.632080 0.642222
+v -1.347490 1.616120 0.871266
+v -1.383600 1.808760 1.025870
+v -1.303420 1.449820 1.148840
+v -1.256240 1.372250 1.340420
+v -1.196870 1.303990 1.524600
+v -1.065900 1.208650 1.713030
+v -0.844796 0.640292 1.682190
+v -1.146210 1.461500 1.746290
+v -1.067970 1.423930 1.772310
+v -1.219040 1.507420 1.661650
+v -1.291480 1.584950 1.514980
+v -1.347950 1.675160 1.340080
+v -1.292020 2.293510 1.742080
+v -1.420380 2.453470 1.475120
+v -1.400210 2.173740 1.276590
+v -1.300410 2.066510 1.595890
+v -1.392070 1.994930 1.179580
+v -1.353710 1.887300 1.475900
+v -1.161070 1.934410 1.775000
+v -1.157430 2.098690 1.982790
+v -1.250400 1.794070 1.692510
+v -1.155300 1.726210 1.778390
+v -1.032680 1.655970 1.835790
+v -1.082280 1.857610 1.861660
+v -0.991261 1.747170 1.862720
+v -0.668830 -0.133086 1.384820
+v -0.605833 -0.237692 1.331600
+v -0.696418 -0.024416 1.423380
+v -0.679076 -0.223769 1.086720
+v -0.681201 -0.189988 0.897274
+v -0.517345 -0.299060 1.422630
+v -0.476360 -0.318326 1.244490
+v -0.472171 -0.319164 1.084520
+v -0.475894 -0.298390 0.931689
+v -0.618100 -0.168267 1.439310
+v -0.532043 -0.188259 1.563740
+v -0.416522 -0.315333 1.583620
+v -0.385661 -0.338703 1.486310
+v -0.297379 -0.368494 1.459970
+v -0.314927 -0.362307 1.352310
+v -0.310459 -0.370836 1.191030
+v -0.325354 -0.370500 1.071870
+v -0.290747 -0.351774 0.892697
+v -0.282196 -0.332769 1.656780
+v -0.259483 -0.362621 1.545810
+v -0.096673 -0.315136 1.717020
+v -0.077760 -0.351505 1.598900
+v 0.000000 -0.307163 1.716780
+v 0.000000 -0.337078 1.603980
+v -0.114170 -0.383655 1.537160
+v 0.000000 -0.375667 1.547440
+v 0.000000 -0.391969 1.438520
+v -0.122677 -0.386415 1.441040
+v 0.000000 -0.391004 1.315190
+v -0.135317 -0.392239 1.310280
+v -0.132397 -0.409716 1.158290
+v 0.000000 -0.407300 1.140260
+v -0.145465 -0.408123 1.028540
+v 0.000000 -0.409347 0.992633
+v -0.152053 -0.370044 0.861140
+v 0.000000 -0.371925 0.821067
+v -0.143397 -0.343689 0.728104
+v 0.000000 -0.357342 0.720637
+v -0.276279 -0.316745 0.701162
+v -0.412154 -0.205409 1.683940
+v -0.291315 -0.209898 1.767570
+v -0.082305 -0.236690 1.770270
+v 0.000000 -0.220695 1.764880
+v -0.133829 -0.186136 1.773570
+v -0.065653 -0.117723 1.807720
+v -0.070935 -0.066474 1.825450
+v 0.000000 -0.045579 1.862470
+v 0.000000 -0.084188 1.832630
+v -0.257796 -0.128864 1.752620
+v -0.238682 -0.059001 1.755530
+v -0.404022 -0.057416 1.674290
+v -0.476644 -0.050701 1.594780
+v -0.552883 -0.047095 1.536380
+v -0.720680 0.102483 1.443240
+v -0.607757 0.091845 1.513090
+v -0.439127 0.053185 1.618930
+v -0.357720 0.057270 1.690590
+v -0.226956 0.072274 1.806520
+v -0.060318 0.073730 1.867360
+v 0.000000 0.080414 1.903300
+v -0.324676 0.127456 1.723340
+v -0.386141 0.220323 1.722300
+v -0.320505 0.141799 1.735790
+v -0.313339 0.209882 1.781010
+v -0.471391 0.225149 1.664460
+v -0.575916 0.238576 1.580050
+v -0.762829 0.246984 1.495240
+v 0.000000 0.170935 1.880760
+v -0.069361 0.164459 1.852260
+v -0.228307 0.154997 1.812360
+v -0.232922 0.168293 1.816180
+v -0.208160 0.220833 1.858250
+v -0.071777 0.180417 1.857890
+v -0.086023 0.243535 1.937800
+v 0.000000 0.186778 1.884070
+v 0.000000 0.248996 1.949030
+v 0.000000 0.284272 2.000520
+v -0.073650 0.277933 1.972740
+v -0.193681 0.263527 1.914400
+v -0.291142 0.266477 1.832640
+v -0.385333 0.280193 1.767300
+v -0.469844 0.312862 1.700040
+v 0.000000 -0.158265 1.773120
+v -0.561159 0.337266 1.690720
+v -0.584340 0.353769 1.689610
+v -0.636702 0.376537 1.671820
+v -0.790274 0.394847 1.584180
+v -0.449321 0.382192 1.738560
+v -0.343124 0.350456 1.820890
+v -0.266822 0.342211 1.911510
+v -0.158775 0.331242 1.974930
+v -0.048600 0.326522 1.987690
+v 0.000000 0.329461 2.020690
+v 0.000000 0.360331 2.013300
+v -0.043045 0.364480 1.993380
+v -0.158212 0.381306 1.951390
+v -0.245268 0.380848 1.900760
+v -0.323899 0.382911 1.813410
+v -0.460064 0.430666 1.719220
+v -0.344289 0.406637 1.838350
+v -0.255007 0.404932 1.888850
+v -0.163628 0.408450 1.947750
+v -0.055541 0.407330 1.965750
+v 0.000000 0.397424 1.979670
+v -0.341215 0.414218 1.842250
+v -0.238620 0.413229 1.880990
+v -0.145206 0.414588 1.947080
+v -0.044394 0.411907 1.967160
+v 0.000000 0.405890 1.975040
+v -0.041735 0.456187 2.014060
+v 0.000000 0.449223 2.046360
+v -0.147160 0.464641 2.001630
+v -0.239029 0.456758 1.916500
+v 0.000000 0.468383 2.078790
+v -0.036770 0.483633 2.077600
+v -0.143092 0.491804 2.049900
+v -0.245183 0.479875 2.009130
+v -0.336416 0.460032 1.919260
+v -0.355035 0.528230 1.975800
+v -0.258464 0.547844 2.041550
+v -0.142186 0.547709 2.091550
+v -0.050051 0.532402 2.144200
+v 0.000000 0.543088 2.148740
+v -0.439771 0.529104 1.876300
+v -0.512286 0.500570 1.830430
+v -0.568693 0.448882 1.789900
+v -0.671436 0.503081 1.745060
+v -0.682462 0.624455 1.810730
+v -0.507632 0.602478 1.874390
+v -0.444401 0.608461 1.914910
+v -0.340154 0.602725 2.000630
+v -0.240880 0.683499 2.070510
+v -0.325949 0.684599 2.026640
+v -0.108692 0.664232 2.098680
+v -0.027575 0.656342 2.150100
+v 0.000000 0.645054 2.156220
+v -0.438461 0.691844 1.983870
+v -0.511163 0.702227 1.932830
+v -0.689729 0.709366 1.860790
+v -0.891639 0.946287 1.846110
+v -0.716621 0.885393 1.914950
+v -0.498711 0.814368 1.963000
+v -0.389916 0.804071 1.971210
+v -0.315485 0.798910 2.040160
+v -0.202297 0.784284 2.081740
+v -0.101304 0.756621 2.102680
+v 0.000000 0.733657 2.141210
+v -0.900515 1.168060 1.855280
+v -0.744744 1.111770 1.937700
+v -0.557360 1.060150 1.999370
+v -0.384455 1.036980 2.017960
+v -0.380896 0.915372 1.960480
+v -0.350573 0.859098 1.972070
+v -0.353165 0.939698 1.987900
+v -0.367133 0.885010 2.009860
+v -0.301454 0.849319 2.016930
+v -0.199972 0.853192 2.031510
+v -0.082569 0.793510 2.122340
+v 0.000000 0.780302 2.164550
+v -0.358499 1.135870 2.037620
+v -0.313961 1.103500 2.124300
+v -0.251755 1.128250 2.250790
+v -0.250109 1.208260 2.229810
+v -0.323421 1.229790 2.152580
+v -0.212153 1.253090 2.310310
+v -0.214941 1.113430 2.316770
+v -0.357993 0.947133 2.009700
+v -0.308167 0.891267 2.099580
+v -0.247574 0.867584 2.074510
+v -0.291854 0.903935 2.126860
+v -0.308845 0.977413 2.145640
+v -0.574497 1.282930 1.940310
+v -0.724999 1.319760 1.889190
+v -0.908878 1.385870 1.836020
+v -0.326531 1.428440 2.164670
+v -0.577303 1.442310 2.013200
+v -0.726249 1.452890 1.930770
+v -0.900317 1.605210 1.870220
+v -0.257015 0.962623 2.219960
+v -0.250845 0.892540 2.227110
+v -0.182226 0.953741 2.371370
+v -0.208692 0.933330 2.285780
+v -0.195555 0.856733 2.343280
+v -0.171110 1.096160 2.405780
+v -0.139966 1.250390 2.417840
+v -0.051121 1.071320 2.469410
+v -0.071682 0.913681 2.486600
+v -0.100151 0.855922 2.444620
+v -0.102183 0.818842 2.433270
+v 0.000000 0.792142 2.449910
+v 0.000000 0.840963 2.492670
+v -0.059178 1.246130 2.463700
+v 0.000000 0.886066 2.498860
+v -0.121931 0.787974 2.314020
+v 0.000000 0.766279 2.367210
+v -0.174241 0.798512 2.303950
+v -0.213937 0.842269 2.215590
+v -0.229106 0.881785 2.146730
+v -0.093307 0.808868 2.228290
+v 0.000000 0.786166 2.264680
+v 0.000000 1.053570 2.468260
+v 0.000000 1.229670 2.477250
+v -0.042104 1.464000 2.473990
+v 0.000000 1.458020 2.487130
+v -0.115906 1.453990 2.403130
+v -0.185694 1.451130 2.339330
+v -0.106878 1.643710 2.419960
+v -0.164299 1.648270 2.357180
+v -0.037208 1.628410 2.478790
+v 0.000000 1.632590 2.493390
+v -0.240430 1.443970 2.255740
+v -0.202382 1.662460 2.251160
+v -0.332835 1.572990 2.174000
+v -0.253130 1.697940 2.196700
+v -0.037269 1.737820 2.438030
+v 0.000000 1.736630 2.457110
+v -0.105125 1.744450 2.385540
+v -0.158929 1.753980 2.331870
+v -0.190782 1.754250 2.261330
+v 0.000000 1.798820 2.481980
+v -0.041248 1.806650 2.452090
+v -0.097157 1.822920 2.416960
+v -0.172705 1.811710 2.356280
+v -0.216690 1.801130 2.302180
+v 0.000000 1.877800 2.552490
+v -0.072641 1.877620 2.537150
+v -0.141212 1.891060 2.463150
+v -0.175663 1.864470 2.419200
+v -0.089632 1.951090 2.575130
+v 0.000000 1.950430 2.577960
+v -0.205103 1.936060 2.501670
+v -0.115729 2.036890 2.610800
+v 0.000000 2.036210 2.622140
+v -0.252663 1.989710 2.539370
+v -0.085173 2.167280 2.647380
+v -0.252006 2.124340 2.626060
+v 0.000000 2.159480 2.640980
+v -0.091552 2.284040 2.652810
+v 0.000000 2.293240 2.639980
+v -0.122377 2.449250 2.671430
+v 0.000000 2.464330 2.680670
+v -0.256576 2.242650 2.659330
+v -0.277904 2.352280 2.638330
+v -0.280946 2.483560 2.690420
+v -1.338810 2.729680 1.686960
+v -1.160740 2.631570 2.028080
+v -1.065750 2.240780 2.276640
+v -1.295540 2.975860 1.876090
+v -1.154180 2.995130 2.188520
+v -1.249170 3.130030 2.062850
+v -1.017870 2.801590 2.307950
+v -1.015220 2.535920 2.280150
+v -0.790139 2.242040 2.551460
+v -0.780496 2.403310 2.560650
+v -0.791082 2.619560 2.551870
+v -0.800991 2.757300 2.609270
+v -1.027720 2.971150 2.358950
+v -1.109560 3.179230 2.324380
+v -1.228710 3.220820 2.196590
+v -1.043430 3.136330 2.441580
+v -0.781910 3.122770 2.650590
+v -0.789318 2.959370 2.657880
+v -0.446992 2.315500 2.667020
+v -0.568644 2.185580 2.607600
+v -0.522196 2.517120 2.682310
+v -0.586157 2.743110 2.692680
+v -0.602808 2.919160 2.693570
+v -0.603620 3.150900 2.688750
+v -0.799644 3.349260 2.564250
+v -0.585669 3.349910 2.649700
+v -1.062350 3.349830 2.391930
+v -0.422407 2.216430 2.612500
+v -0.391108 2.079320 2.559520
+v -0.346132 2.728440 2.675420
+v -0.180790 2.723130 2.728600
+v 0.000000 2.710170 2.727390
+v -0.389971 2.934710 2.670120
+v -0.405038 3.159280 2.711480
+v -0.384682 3.356130 2.689160
+v -0.814242 3.416640 2.460570
+v -0.605427 3.436730 2.625400
+v -0.377767 3.416680 2.699480
+v -0.211126 2.919880 2.740860
+v 0.000000 2.910910 2.767900
+v -0.197682 3.162690 2.774020
+v 0.000000 3.144180 2.752770
+v -0.200928 3.325560 2.708730
+v 0.000000 3.326770 2.713900
+v -0.191664 3.352130 2.742180
+v 0.000000 3.401890 2.677040
+v -0.208998 1.854240 2.366980
+v -0.229374 1.759780 2.204760
+v -0.246421 1.801440 2.229940
+v -0.241221 1.860710 2.361540
+v -0.231208 1.908200 2.470480
+v -0.290521 1.948550 2.542590
+v -0.302358 1.896070 2.416180
+v -0.407271 1.991890 2.515720
+v -0.599913 2.066900 2.561940
+v -0.818046 2.102400 2.491980
+v -1.070200 2.131120 2.231780
+v -1.126450 2.071560 1.968110
+v -0.307572 1.872320 2.361670
+v -0.475958 1.930650 2.426880
+v -0.446881 1.905960 2.506280
+v -0.780522 2.033020 2.339350
+v -0.807406 2.027690 2.422030
+v -1.015580 2.067000 2.215930
+v -0.641413 1.975450 2.479290
+v -0.620493 2.011650 2.394590
+v -0.629815 1.956980 2.395600
+v -0.760623 1.981490 2.329840
+v -0.944004 1.965180 2.203410
+v -1.094900 2.041010 1.980760
+v -1.040670 1.945300 2.026940
+v -0.463554 1.897020 2.396540
+v -0.609915 1.901720 2.358040
+v -0.726872 1.912960 2.337280
+v -0.907400 1.883050 2.198460
+v -1.004430 1.870950 2.022640
+v -1.005850 1.818500 1.898240
+v -0.285824 1.747610 2.214400
+v -0.328278 1.863980 2.301020
+v -0.333298 1.800980 2.196620
+v -0.831780 1.666180 1.958780
+v -0.898667 1.795490 1.943100
+v -0.703251 1.604550 2.013350
+v -0.564198 1.582560 2.064260
+v -0.383179 1.640270 2.168660
+v -0.915714 1.837150 1.968280
+v -0.893380 1.850760 1.991170
+v -0.866850 1.875440 2.160580
+v -0.708905 1.891690 2.276660
+v -0.592987 1.899010 2.291460
+v -0.463218 1.893060 2.312850
+v -0.377943 1.841380 2.221560
+v -0.514841 1.864910 2.234810
+v -0.580052 1.863720 2.233140
+v -0.675458 1.862440 2.223290
+v -0.784839 1.848390 2.147630
+v -0.853135 1.815020 1.987910
+v -0.723749 1.742290 2.068500
+v -0.576331 1.718730 2.132130
+v -0.426383 1.724860 2.150670
+v -1.516680 1.232530 0.172000
+v -1.555220 1.277520 0.221274
+v -1.680120 1.420700 0.135408
+v -1.697720 1.391360 0.061103
+v -1.765080 1.567610 0.096612
+v -1.770470 1.547580 0.014896
+v -1.683400 1.622780 0.120248
+v -1.763540 1.690840 0.209278
+v -1.623390 1.500220 0.141284
+v -1.540010 1.379850 0.211439
+v -1.426870 1.333610 0.370559
+v -1.595580 1.533600 0.190428
+v -1.667350 1.639440 0.175785
+v -1.521430 1.461090 0.243872
+v -1.470070 1.493240 0.369380
+v -1.653510 1.657960 0.269810
+v -1.702170 1.691210 0.287679
+v -1.600080 1.577410 0.262643
+v -1.539740 1.557420 0.265791
+v -1.530220 1.576600 0.297969
+v -1.620930 1.647770 0.357712
+v -1.604820 1.692020 0.267614
+v -1.584260 1.546140 -0.121393
+v -1.568120 1.452310 -0.160167
+v -1.347180 1.435080 -0.164662
+v -1.422740 1.573020 -0.136412
+v -1.408440 1.438590 -0.048195
+v -1.391820 1.301760 0.001039
+v -1.446990 1.306250 0.057701
+v -1.418000 1.564940 -0.075583
+v -0.111949 0.905611 2.245480
+v -0.134010 0.910055 2.241230
+v -0.095349 0.907946 2.164640
+v -0.099877 0.914423 2.209320
+v -0.144862 0.933115 2.126330
+v -0.164937 0.939185 2.144470
+v -0.150751 0.928509 2.203970
+v -0.157148 0.945174 2.174930
+v 0.096537 -0.571215 0.609019
+v 0.093362 -0.478222 0.606843
+v 0.224965 -0.434611 0.626931
+v 1.313160 0.598818 -0.121402
+v 1.237960 0.865933 -0.239116
+v 1.199660 0.612319 -0.114440
+v 1.142100 0.357713 0.080797
+v 1.265390 0.325109 -0.014263
+v 0.992640 0.087790 0.368875
+v 1.172170 0.003799 0.288578
+v 0.958007 0.004663 0.540421
+v 1.038910 -0.054216 0.599331
+v 1.303610 1.165410 -0.035682
+v 1.269260 1.255200 -0.337076
+v 1.256730 0.831771 0.001709
+v 1.246660 0.626933 0.095034
+v 1.181300 0.382558 0.276478
+v 0.997234 0.135594 0.524613
+v 0.968603 0.047490 0.672441
+v 1.313170 0.827262 0.178592
+v 1.360370 1.129340 0.147805
+v 1.321880 0.686917 0.300153
+v 1.237000 0.437886 0.578947
+v 1.129690 0.202209 0.825170
+v 1.071810 0.081753 0.940408
+v 0.808878 -0.108006 0.862693
+v 0.864304 -0.095589 1.086810
+v 0.785511 -0.113481 0.744561
+v 1.288150 1.331120 -0.224217
+v 1.301330 1.309030 -0.013709
+v 1.403780 1.253150 0.124680
+v 1.372150 1.077010 0.298650
+v 1.417140 1.199590 0.285955
+v 1.428510 1.249860 0.363487
+v 1.351640 0.730680 0.417285
+v 1.244320 0.569741 0.680281
+v 1.371090 0.959788 0.536405
+v 1.360650 1.219840 0.665852
+v 1.144610 0.348289 0.821948
+v 1.065100 0.150062 0.951618
+v 0.886429 -0.041894 1.134850
+v 0.951259 0.096646 1.220690
+v 1.077680 0.293950 1.020550
+v 1.260920 0.785572 0.842069
+v 1.175680 0.520922 0.896839
+v 1.205980 0.682387 0.998162
+v 1.082510 0.416250 1.082090
+v 1.086010 0.590441 1.157260
+v 0.964148 0.504018 1.389580
+v 0.941793 0.371891 1.296540
+v 0.949137 0.239988 1.242380
+v 1.286810 1.013720 0.965487
+v 1.225430 0.911496 1.117280
+v 1.130180 0.804388 1.263720
+v 0.997671 0.714594 1.469850
+v 1.384060 1.438230 0.638337
+v 1.352830 1.415070 0.762690
+v 1.296410 1.289840 1.082120
+v 1.257880 1.181680 1.267510
+v 1.158700 1.081660 1.421420
+v 1.019550 0.988808 1.650430
+v 1.484250 1.632080 0.642222
+v 1.389580 1.760660 0.867844
+v 1.341190 1.656330 0.806411
+v 1.347490 1.616120 0.871266
+v 1.383600 1.808760 1.025870
+v 1.303420 1.449820 1.148840
+v 1.256240 1.372250 1.340420
+v 1.196870 1.303990 1.524600
+v 1.065900 1.208650 1.713030
+v 0.844796 0.640292 1.682190
+v 1.067970 1.423930 1.772310
+v 1.146210 1.461500 1.746290
+v 1.219040 1.507420 1.661650
+v 1.291480 1.584950 1.514980
+v 1.347950 1.675160 1.340080
+v 1.300410 2.066510 1.595890
+v 1.400210 2.173740 1.276590
+v 1.420380 2.453470 1.475120
+v 1.292020 2.293510 1.742080
+v 1.353710 1.887300 1.475900
+v 1.392070 1.994930 1.179580
+v 1.161070 1.934410 1.775000
+v 1.157430 2.098690 1.982790
+v 1.250400 1.794070 1.692510
+v 1.155300 1.726210 1.778390
+v 1.032680 1.655970 1.835790
+v 1.082280 1.857610 1.861660
+v 0.991261 1.747170 1.862720
+v 0.605833 -0.237692 1.331600
+v 0.668830 -0.133086 1.384820
+v 0.696418 -0.024416 1.423380
+v 0.679076 -0.223769 1.086720
+v 0.681201 -0.189988 0.897274
+v 0.476360 -0.318326 1.244490
+v 0.517345 -0.299060 1.422630
+v 0.472171 -0.319164 1.084520
+v 0.475894 -0.298390 0.931689
+v 0.618100 -0.168267 1.439310
+v 0.532043 -0.188259 1.563740
+v 0.385661 -0.338703 1.486310
+v 0.416522 -0.315333 1.583620
+v 0.314927 -0.362307 1.352310
+v 0.297379 -0.368494 1.459970
+v 0.310459 -0.370836 1.191030
+v 0.325354 -0.370500 1.071870
+v 0.290747 -0.351774 0.892697
+v 0.259483 -0.362621 1.545810
+v 0.282196 -0.332769 1.656780
+v 0.077760 -0.351505 1.598900
+v 0.096673 -0.315136 1.717020
+v 0.114170 -0.383655 1.537160
+v 0.122677 -0.386415 1.441040
+v 0.135317 -0.392239 1.310280
+v 0.132397 -0.409716 1.158290
+v 0.145465 -0.408123 1.028540
+v 0.152053 -0.370044 0.861140
+v 0.143397 -0.343689 0.728104
+v 0.276279 -0.316745 0.701162
+v 0.412154 -0.205409 1.683940
+v 0.291315 -0.209898 1.767570
+v 0.133829 -0.186136 1.773570
+v 0.082305 -0.236690 1.770270
+v 0.257796 -0.128864 1.752620
+v 0.065653 -0.117723 1.807720
+v 0.070935 -0.066474 1.825450
+v 0.238682 -0.059001 1.755530
+v 0.404022 -0.057416 1.674290
+v 0.476644 -0.050701 1.594780
+v 0.552883 -0.047095 1.536380
+v 0.720680 0.102483 1.443240
+v 0.607757 0.091845 1.513090
+v 0.439127 0.053185 1.618930
+v 0.357720 0.057270 1.690590
+v 0.226956 0.072274 1.806520
+v 0.060318 0.073730 1.867360
+v 0.324676 0.127456 1.723340
+v 0.313339 0.209882 1.781010
+v 0.320505 0.141799 1.735790
+v 0.386141 0.220323 1.722300
+v 0.471391 0.225149 1.664460
+v 0.575916 0.238576 1.580050
+v 0.762829 0.246984 1.495240
+v 0.069361 0.164459 1.852260
+v 0.228307 0.154997 1.812360
+v 0.208160 0.220833 1.858250
+v 0.232922 0.168293 1.816180
+v 0.086023 0.243535 1.937800
+v 0.071777 0.180417 1.857890
+v 0.073650 0.277933 1.972740
+v 0.193681 0.263527 1.914400
+v 0.291142 0.266477 1.832640
+v 0.385333 0.280193 1.767300
+v 0.469844 0.312862 1.700040
+v 0.561159 0.337266 1.690720
+v 0.636702 0.376537 1.671820
+v 0.584340 0.353769 1.689610
+v 0.790274 0.394847 1.584180
+v 0.343124 0.350456 1.820890
+v 0.449321 0.382192 1.738560
+v 0.266822 0.342211 1.911510
+v 0.158775 0.331242 1.974930
+v 0.048600 0.326522 1.987690
+v 0.043045 0.364480 1.993380
+v 0.158212 0.381306 1.951390
+v 0.245268 0.380848 1.900760
+v 0.323899 0.382911 1.813410
+v 0.460064 0.430666 1.719220
+v 0.344289 0.406637 1.838350
+v 0.255007 0.404932 1.888850
+v 0.163628 0.408450 1.947750
+v 0.055541 0.407330 1.965750
+v 0.341215 0.414218 1.842250
+v 0.238620 0.413229 1.880990
+v 0.145206 0.414588 1.947080
+v 0.044394 0.411907 1.967160
+v 0.041735 0.456187 2.014060
+v 0.147160 0.464641 2.001630
+v 0.239029 0.456758 1.916500
+v 0.036770 0.483633 2.077600
+v 0.143092 0.491804 2.049900
+v 0.245183 0.479875 2.009130
+v 0.336416 0.460032 1.919260
+v 0.355035 0.528230 1.975800
+v 0.258464 0.547844 2.041550
+v 0.142186 0.547709 2.091550
+v 0.050051 0.532402 2.144200
+v 0.439771 0.529104 1.876300
+v 0.512286 0.500570 1.830430
+v 0.568693 0.448882 1.789900
+v 0.671436 0.503081 1.745060
+v 0.682462 0.624455 1.810730
+v 0.507632 0.602478 1.874390
+v 0.444401 0.608461 1.914910
+v 0.340154 0.602725 2.000630
+v 0.325949 0.684599 2.026640
+v 0.240880 0.683499 2.070510
+v 0.108692 0.664232 2.098680
+v 0.027575 0.656342 2.150100
+v 0.438461 0.691844 1.983870
+v 0.511163 0.702227 1.932830
+v 0.689729 0.709366 1.860790
+v 0.891639 0.946287 1.846110
+v 0.716621 0.885393 1.914950
+v 0.498711 0.814368 1.963000
+v 0.389916 0.804071 1.971210
+v 0.315485 0.798910 2.040160
+v 0.202297 0.784284 2.081740
+v 0.101304 0.756621 2.102680
+v 0.900515 1.168060 1.855280
+v 0.744744 1.111770 1.937700
+v 0.557360 1.060150 1.999370
+v 0.380896 0.915372 1.960480
+v 0.384455 1.036980 2.017960
+v 0.350573 0.859098 1.972070
+v 0.367133 0.885010 2.009860
+v 0.353165 0.939698 1.987900
+v 0.301454 0.849319 2.016930
+v 0.199972 0.853192 2.031510
+v 0.082569 0.793510 2.122340
+v 0.313961 1.103500 2.124300
+v 0.358499 1.135870 2.037620
+v 0.250109 1.208260 2.229810
+v 0.251755 1.128250 2.250790
+v 0.323421 1.229790 2.152580
+v 0.212153 1.253090 2.310310
+v 0.214941 1.113430 2.316770
+v 0.357993 0.947133 2.009700
+v 0.308167 0.891267 2.099580
+v 0.247574 0.867584 2.074510
+v 0.308845 0.977413 2.145640
+v 0.291854 0.903935 2.126860
+v 0.574497 1.282930 1.940310
+v 0.724999 1.319760 1.889190
+v 0.908878 1.385870 1.836020
+v 0.577303 1.442310 2.013200
+v 0.326531 1.428440 2.164670
+v 0.726249 1.452890 1.930770
+v 0.900317 1.605210 1.870220
+v 0.257015 0.962623 2.219960
+v 0.250845 0.892540 2.227110
+v 0.195555 0.856733 2.343280
+v 0.208692 0.933330 2.285780
+v 0.182226 0.953741 2.371370
+v 0.171110 1.096160 2.405780
+v 0.139966 1.250390 2.417840
+v 0.071682 0.913681 2.486600
+v 0.051121 1.071320 2.469410
+v 0.100151 0.855922 2.444620
+v 0.102183 0.818842 2.433270
+v 0.059178 1.246130 2.463700
+v 0.121931 0.787974 2.314020
+v 0.174241 0.798512 2.303950
+v 0.213937 0.842269 2.215590
+v 0.229106 0.881785 2.146730
+v 0.093307 0.808868 2.228290
+v 0.042104 1.464000 2.473990
+v 0.115906 1.453990 2.403130
+v 0.185694 1.451130 2.339330
+v 0.164299 1.648270 2.357180
+v 0.106878 1.643710 2.419960
+v 0.037208 1.628410 2.478790
+v 0.240430 1.443970 2.255740
+v 0.202382 1.662460 2.251160
+v 0.332835 1.572990 2.174000
+v 0.253130 1.697940 2.196700
+v 0.037269 1.737820 2.438030
+v 0.105125 1.744450 2.385540
+v 0.158929 1.753980 2.331870
+v 0.190782 1.754250 2.261330
+v 0.041248 1.806650 2.452090
+v 0.097157 1.822920 2.416960
+v 0.172705 1.811710 2.356280
+v 0.216690 1.801130 2.302180
+v 0.072641 1.877620 2.537150
+v 0.141212 1.891060 2.463150
+v 0.175663 1.864470 2.419200
+v 0.089632 1.951090 2.575130
+v 0.205103 1.936060 2.501670
+v 0.115729 2.036890 2.610800
+v 0.252006 2.124340 2.626060
+v 0.085173 2.167280 2.647380
+v 0.252663 1.989710 2.539370
+v 0.091552 2.284040 2.652810
+v 0.122377 2.449250 2.671430
+v 0.256576 2.242650 2.659330
+v 0.277904 2.352280 2.638330
+v 0.280946 2.483560 2.690420
+v 1.338810 2.729680 1.686960
+v 1.160740 2.631570 2.028080
+v 1.065750 2.240780 2.276640
+v 1.295540 2.975860 1.876090
+v 1.249170 3.130030 2.062850
+v 1.154180 2.995130 2.188520
+v 1.015220 2.535920 2.280150
+v 1.017870 2.801590 2.307950
+v 0.780496 2.403310 2.560650
+v 0.790139 2.242040 2.551460
+v 0.791082 2.619560 2.551870
+v 0.800991 2.757300 2.609270
+v 1.027720 2.971150 2.358950
+v 1.228710 3.220820 2.196590
+v 1.109560 3.179230 2.324380
+v 1.043430 3.136330 2.441580
+v 0.789318 2.959370 2.657880
+v 0.781910 3.122770 2.650590
+v 0.568644 2.185580 2.607600
+v 0.446992 2.315500 2.667020
+v 0.522196 2.517120 2.682310
+v 0.586157 2.743110 2.692680
+v 0.602808 2.919160 2.693570
+v 0.603620 3.150900 2.688750
+v 0.585669 3.349910 2.649700
+v 0.799644 3.349260 2.564250
+v 1.062350 3.349830 2.391930
+v 0.422407 2.216430 2.612500
+v 0.391108 2.079320 2.559520
+v 0.346132 2.728440 2.675420
+v 0.180790 2.723130 2.728600
+v 0.389971 2.934710 2.670120
+v 0.405038 3.159280 2.711480
+v 0.384682 3.356130 2.689160
+v 0.814242 3.416640 2.460570
+v 0.605427 3.436730 2.625400
+v 0.377767 3.416680 2.699480
+v 0.211126 2.919880 2.740860
+v 0.197682 3.162690 2.774020
+v 0.200928 3.325560 2.708730
+v 0.191664 3.352130 2.742180
+v 0.208998 1.854240 2.366980
+v 0.229374 1.759780 2.204760
+v 0.246421 1.801440 2.229940
+v 0.241221 1.860710 2.361540
+v 0.231208 1.908200 2.470480
+v 0.290521 1.948550 2.542590
+v 0.302358 1.896070 2.416180
+v 0.407271 1.991890 2.515720
+v 0.599913 2.066900 2.561940
+v 0.818046 2.102400 2.491980
+v 1.070200 2.131120 2.231780
+v 1.126450 2.071560 1.968110
+v 0.307572 1.872320 2.361670
+v 0.475958 1.930650 2.426880
+v 0.446881 1.905960 2.506280
+v 1.015580 2.067000 2.215930
+v 0.807406 2.027690 2.422030
+v 0.780522 2.033020 2.339350
+v 0.620493 2.011650 2.394590
+v 0.641413 1.975450 2.479290
+v 0.629815 1.956980 2.395600
+v 0.760623 1.981490 2.329840
+v 0.944004 1.965180 2.203410
+v 1.040670 1.945300 2.026940
+v 1.094900 2.041010 1.980760
+v 0.609915 1.901720 2.358040
+v 0.463554 1.897020 2.396540
+v 0.726872 1.912960 2.337280
+v 0.907400 1.883050 2.198460
+v 1.004430 1.870950 2.022640
+v 1.005850 1.818500 1.898240
+v 0.285824 1.747610 2.214400
+v 0.328278 1.863980 2.301020
+v 0.333298 1.800980 2.196620
+v 0.898667 1.795490 1.943100
+v 0.831780 1.666180 1.958780
+v 0.703251 1.604550 2.013350
+v 0.564198 1.582560 2.064260
+v 0.383179 1.640270 2.168660
+v 0.915714 1.837150 1.968280
+v 0.893380 1.850760 1.991170
+v 0.866850 1.875440 2.160580
+v 0.708905 1.891690 2.276660
+v 0.592987 1.899010 2.291460
+v 0.463218 1.893060 2.312850
+v 0.377943 1.841380 2.221560
+v 0.514841 1.864910 2.234810
+v 0.580052 1.863720 2.233140
+v 0.675458 1.862440 2.223290
+v 0.784839 1.848390 2.147630
+v 0.853135 1.815020 1.987910
+v 0.723749 1.742290 2.068500
+v 0.576331 1.718730 2.132130
+v 0.426383 1.724860 2.150670
+v 1.555220 1.277520 0.221274
+v 1.516680 1.232530 0.172000
+v 1.697720 1.391360 0.061103
+v 1.680120 1.420700 0.135408
+v 1.770470 1.547580 0.014896
+v 1.765080 1.567610 0.096612
+v 1.763540 1.690840 0.209278
+v 1.683400 1.622780 0.120248
+v 1.623390 1.500220 0.141284
+v 1.540010 1.379850 0.211439
+v 1.426870 1.333610 0.370559
+v 1.667350 1.639440 0.175785
+v 1.595580 1.533600 0.190428
+v 1.521430 1.461090 0.243872
+v 1.470070 1.493240 0.369380
+v 1.702170 1.691210 0.287679
+v 1.653510 1.657960 0.269810
+v 1.600080 1.577410 0.262643
+v 1.539740 1.557420 0.265791
+v 1.530220 1.576600 0.297969
+v 1.620930 1.647770 0.357712
+v 1.604820 1.692020 0.267614
+v 1.568120 1.452310 -0.160167
+v 1.584260 1.546140 -0.121393
+v 1.422740 1.573020 -0.136412
+v 1.347180 1.435080 -0.164662
+v 1.391820 1.301760 0.001039
+v 1.408440 1.438590 -0.048195
+v 1.446990 1.306250 0.057701
+v 1.418000 1.564940 -0.075583
+v 0.157148 0.945174 2.174930
+v 0.150751 0.928509 2.203970
+v 0.144862 0.933115 2.126330
+v 0.164937 0.939185 2.144470
+v 0.095349 0.907946 2.164640
+v 0.099877 0.914423 2.209320
+v 0.111949 0.905611 2.245480
+v 0.134010 0.910055 2.241230
+vn 0.332949 -0.705421 0.625720
+vn -0.260047 -0.789584 0.555817
+vn 0.532304 -0.547688 0.645515
+vn -0.440163 0.835449 -0.329062
+vn 0.471369 -0.780150 0.411312
+vn -0.327196 0.807469 0.490853
+vn 0.440163 -0.835448 0.329064
+vn -0.922405 -0.239534 0.302973
+vn 0.574315 0.804608 -0.150892
+vn 0.880972 -0.472727 0.020456
+vn -0.332949 -0.705421 0.625720
+vn 0.260047 -0.789584 0.555817
+vn -0.532304 -0.547688 0.645515
+vn 0.440163 0.835449 -0.329062
+vn -0.471369 -0.780150 0.411312
+vn 0.327196 0.807469 0.490853
+vn -0.440163 -0.835448 0.329064
+vn 0.922405 -0.239534 0.302973
+vn -0.574315 0.804608 -0.150892
+vn -0.880972 -0.472727 0.020456
+vn 0.096987 -0.993719 0.055816
+vn -0.676183 -0.320676 0.663282
+vn -0.096987 -0.993719 0.055818
+vn 0.676184 -0.320676 0.663282
+vn -0.939601 -0.296607 0.170803
+vn -0.672056 0.082543 0.735886
+vn -0.355352 0.041895 0.933793
+vn 0.592319 -0.120476 0.796645
+vn 0.705290 -0.153974 0.691996
+vn 0.394027 -0.066319 0.916703
+vn 0.287416 -0.062043 0.955794
+vn 0.133377 -0.051606 0.989721
+vn 0.011289 -0.026583 0.999583
+vn 0.403044 -0.127509 0.906254
+vn 0.483554 -0.241174 0.841434
+vn 0.759763 -0.555162 0.338461
+vn -0.630798 0.239138 0.738178
+vn -0.909154 0.166336 0.381801
+vn -0.987974 0.139405 0.066883
+vn -0.881686 0.108986 0.459077
+vn -0.868909 0.106364 0.483408
+vn 0.697988 -0.592670 -0.401939
+vn 0.502056 -0.425307 -0.753030
+vn 0.000000 0.081285 -0.996691
+vn 0.000000 -0.273743 -0.961803
+vn 0.000000 0.289750 -0.957102
+vn 0.000000 0.459618 -0.888117
+vn 0.000000 0.764240 -0.644932
+vn 0.000000 0.898676 -0.438614
+vn 0.000000 0.944688 -0.327972
+vn 0.200513 -0.221996 -0.954208
+vn 0.602386 0.213580 0.769100
+vn 0.518785 0.283933 0.806377
+vn 0.574210 0.261001 0.775991
+vn 0.648485 0.210243 0.731618
+vn 0.582966 0.189917 0.789989
+vn 0.657902 0.149876 0.738039
+vn 0.576627 0.140213 0.804886
+vn 0.655242 0.120524 0.745742
+vn 0.548586 0.085622 0.831699
+vn 0.623644 0.065462 0.778963
+vn 0.302198 0.055408 0.951634
+vn 0.589216 -0.022250 0.807669
+vn 0.178633 0.016982 0.983769
+vn 0.602782 -0.103612 0.791150
+vn 0.003301 -0.017352 0.999844
+vn 0.638096 -0.174661 0.749885
+vn -0.624887 0.112438 0.772576
+vn -0.583184 0.172695 0.793772
+vn -0.662041 0.212324 0.718763
+vn -0.514252 0.297546 0.804370
+vn 0.581346 0.184565 0.792447
+vn 0.527918 0.212525 0.822275
+vn 0.270288 0.273170 0.923213
+vn 0.227464 0.248221 0.941619
+vn 0.074044 0.366548 0.927448
+vn 0.070724 0.317242 0.945704
+vn 0.113155 0.341724 0.932963
+vn 0.021131 0.358451 0.933309
+vn 0.174841 0.291507 0.940454
+vn 0.207586 0.210474 0.955305
+vn -0.015614 0.337833 0.941076
+vn 0.649281 0.137389 0.748036
+vn 0.521131 0.092430 0.848457
+vn 0.658302 0.126354 0.742073
+vn 0.698391 0.096456 0.709187
+vn -0.007617 0.378960 0.925382
+vn 0.071756 0.279278 0.957525
+vn 0.148503 0.228260 0.962208
+vn 0.084036 0.432319 0.897796
+vn 0.037269 0.462611 0.885778
+vn 0.085702 0.358906 0.929431
+vn 0.092997 0.423873 0.900935
+vn 0.578345 0.189784 0.793410
+vn 0.503826 0.169966 0.846918
+vn 0.653025 0.152927 0.741735
+vn 0.537542 0.259210 0.802408
+vn 0.175271 0.485911 0.856254
+vn 0.480349 0.346259 0.805835
+vn 0.243788 0.307629 0.919745
+vn 0.333496 0.475182 0.814238
+vn 0.306370 0.434431 0.846999
+vn 0.275085 0.360708 0.891189
+vn 0.291053 0.279260 0.915042
+vn 0.079687 0.186105 0.979293
+vn 0.077906 0.124928 0.989103
+vn 0.319400 0.172440 0.931798
+vn 0.595356 0.092896 0.798073
+vn 0.546608 -0.021804 0.837105
+vn 0.551343 -0.124465 0.824942
+vn 0.575099 -0.164672 0.801339
+vn 0.343682 -0.092859 0.934484
+vn 0.283986 -0.071210 0.956180
+vn 0.290856 0.047039 0.955610
+vn 0.098141 0.082151 0.991776
+vn 0.064815 0.044293 0.996914
+vn 0.100796 -0.023640 0.994626
+vn 0.074774 -0.024916 0.996889
+vn 0.166430 -0.069780 0.983581
+vn 0.073847 -0.072652 0.994620
+vn 0.445449 0.351574 0.823390
+vn 0.548867 0.270792 0.790833
+vn 0.605772 0.186708 0.773421
+vn 0.443076 0.285121 0.849935
+vn 0.549052 0.445335 0.707261
+vn 0.413496 0.414990 0.810435
+vn 0.436072 0.437467 0.786425
+vn 0.340697 0.455336 0.822554
+vn -0.121934 -0.295562 0.947510
+vn -0.195797 -0.351663 0.915421
+vn -0.031391 -0.427943 0.903260
+vn 0.251222 -0.524346 0.813602
+vn 0.449781 0.446229 0.773677
+vn 0.602904 -0.515127 0.609221
+vn 0.857528 -0.284734 0.428453
+vn 0.432131 0.415593 0.800341
+vn 0.416336 0.359925 0.834936
+vn 0.903724 -0.121910 0.410391
+vn 0.333786 0.391667 0.857429
+vn 0.403423 0.497640 0.767857
+vn 0.413539 0.418225 0.808748
+vn 0.467588 0.370380 0.802608
+vn 0.627609 0.502314 0.594801
+vn 0.693293 0.348298 0.630898
+vn 0.723581 0.273386 0.633790
+vn 0.600324 0.220819 0.768667
+vn 0.428859 0.599311 0.675949
+vn 0.404483 0.632677 0.660389
+vn 0.241671 0.174188 0.954596
+vn 0.268367 0.223146 0.937115
+vn 0.137882 0.077206 0.987435
+vn 0.073427 0.011380 0.997236
+vn 0.066278 -0.028333 0.997399
+vn 0.026416 -0.059801 0.997861
+vn 0.402357 0.496327 0.769265
+vn 0.949941 0.094642 0.297750
+vn 0.516046 0.438872 0.735587
+vn 0.580118 0.489634 0.650939
+vn 0.986210 0.160836 -0.039000
+vn 0.654373 0.593785 0.468204
+vn 0.693446 0.650831 0.309115
+vn 0.693484 0.709322 0.126266
+vn 0.739462 0.638881 0.212199
+vn 0.924673 0.064474 -0.375265
+vn 0.668375 0.733729 0.122133
+vn 0.772927 0.632876 0.045294
+vn 0.890443 0.172735 -0.421039
+vn 0.742605 0.662379 -0.098960
+vn 0.839209 0.381341 -0.387694
+vn 0.653531 0.756515 -0.024128
+vn 0.801970 0.591140 -0.086016
+vn 0.771021 0.577440 -0.268496
+vn 0.800345 0.591484 -0.097949
+vn 0.829800 0.557718 0.019575
+vn 0.777953 0.266323 0.569089
+vn 0.838833 0.407129 0.361393
+vn 0.747375 0.266674 0.608536
+vn 0.812027 0.222115 0.539700
+vn 0.809816 0.579091 -0.094084
+vn 0.747960 0.573313 -0.334466
+vn 0.729200 0.682344 0.051709
+vn 0.751051 0.648506 0.123946
+vn 0.809553 0.449405 0.377703
+vn 0.798346 0.279899 0.533198
+vn 0.591526 0.786790 0.176235
+vn 0.520694 0.818933 0.241303
+vn 0.545418 0.819952 0.173777
+vn 0.516019 0.787254 0.337573
+vn 0.477368 0.633843 0.608575
+vn 0.427488 0.496537 0.755451
+vn 0.776200 0.229312 0.587307
+vn 0.809287 0.154015 0.566863
+vn 0.400767 0.415315 0.816639
+vn 0.416198 0.371368 0.829979
+vn 0.642333 0.082771 0.761943
+vn 0.469891 0.445664 0.761962
+vn 0.700191 0.419308 0.577852
+vn 0.604433 0.651239 0.458855
+vn 0.496230 0.667044 0.555704
+vn 0.518102 0.625584 0.583279
+vn 0.568506 0.365915 0.736822
+vn 0.452971 -0.021158 0.891274
+vn 0.449302 -0.007126 0.893352
+vn 0.460345 0.002674 0.887736
+vn 0.447709 -0.051573 0.892691
+vn 0.425665 -0.096364 0.899735
+vn 0.410701 -0.075548 0.908635
+vn 0.506335 -0.026854 0.861918
+vn 0.541817 0.061001 0.838280
+vn 0.554974 0.173119 0.813655
+vn 0.606292 0.103491 0.788479
+vn 0.404823 -0.048978 0.913083
+vn 0.492288 -0.027548 0.869996
+vn 0.491358 -0.022101 0.870677
+vn 0.483934 -0.065043 0.872684
+vn 0.470505 -0.095908 0.877170
+vn 0.468701 -0.116106 0.875693
+vn 0.583549 0.282527 0.761347
+vn 0.213775 0.658841 0.721269
+vn 0.506827 0.459824 0.729170
+vn 0.494828 0.286137 0.820531
+vn -0.010535 0.551231 0.834286
+vn 0.062663 0.213471 0.974938
+vn -0.165120 0.545670 0.821572
+vn 0.153462 0.725558 0.670831
+vn 0.500488 0.511510 0.698476
+vn 0.608014 0.128125 0.783520
+vn 0.321675 -0.108302 0.940636
+vn -0.120314 0.103516 0.987324
+vn 0.247188 0.537758 0.806048
+vn 0.374128 0.432952 0.820110
+vn 0.156908 0.456295 0.875885
+vn 0.168941 0.292593 0.941195
+vn 0.335480 0.253231 0.907374
+vn 0.444862 0.305537 0.841870
+vn 0.323026 0.370636 0.870795
+vn 0.474345 0.809620 0.345705
+vn 0.829394 0.553534 0.075540
+vn 0.436288 0.721510 0.537659
+vn 0.375898 0.598493 0.707465
+vn 0.320930 0.452886 0.831804
+vn 0.755328 0.483434 0.442459
+vn 0.436894 0.441323 0.783810
+vn 0.298031 0.319168 0.899616
+vn 0.364277 0.203223 0.908847
+vn 0.571431 -0.012155 0.820560
+vn 0.780122 -0.083273 0.620061
+vn 0.328764 0.253859 0.909654
+vn 0.327258 0.097229 0.939920
+vn 0.382594 -0.093835 0.919139
+vn 0.832774 -0.376269 0.406090
+vn 0.859009 -0.376217 0.347223
+vn 0.896604 -0.232388 0.376957
+vn 0.917818 -0.072919 0.390247
+vn 0.937726 0.091499 0.335108
+vn 0.724000 -0.096170 0.683064
+vn 0.685200 -0.104080 0.720880
+vn 0.651068 -0.147306 0.744588
+vn 0.629368 -0.180769 0.755790
+vn 0.633565 -0.196288 0.748375
+vn 0.652072 -0.273790 0.706995
+vn 0.897256 -0.379094 0.226318
+vn 0.843247 -0.454665 0.286730
+vn 0.816272 -0.548726 0.180552
+vn 0.788794 -0.598870 0.138414
+vn 0.858618 -0.263514 -0.439699
+vn 0.950752 0.307872 0.035844
+vn 0.930675 0.357309 0.078581
+vn 0.935591 0.327946 0.130844
+vn 0.922134 0.361440 0.137947
+vn 0.620249 0.480142 0.620286
+vn 0.660931 0.493747 0.565140
+vn 0.687403 0.458399 0.563337
+vn 0.901677 0.351337 0.252073
+vn 0.888387 0.389753 0.242614
+vn 0.808058 0.406371 0.426502
+vn 0.827315 0.348580 0.440501
+vn 0.633442 0.428809 0.644107
+vn 0.515068 0.462280 0.721805
+vn 0.684726 0.326895 0.651376
+vn 0.419711 0.361219 0.832685
+vn 0.561359 0.201082 0.802772
+vn 0.466082 0.103907 0.878619
+vn 0.218659 0.331612 0.917726
+vn 0.399955 0.093929 0.911709
+vn -0.317084 -0.316295 0.894100
+vn -0.217677 -0.394486 0.892747
+vn -0.446178 -0.404349 0.798390
+vn 0.286324 0.406956 0.867413
+vn 0.440008 0.442910 0.781168
+vn 0.604948 0.225627 0.763630
+vn 0.708900 0.263736 0.654144
+vn 0.620996 0.283541 0.730731
+vn 0.471391 0.706010 0.528526
+vn -0.494493 0.022290 0.868896
+vn 0.081645 0.758668 0.646342
+vn 0.314889 0.818008 0.481361
+vn 0.381940 0.891911 0.242109
+vn 0.295807 0.907113 0.299407
+vn 0.063403 0.878951 0.472678
+vn -0.518829 0.151814 0.841290
+vn 0.233190 0.871844 0.430709
+vn -0.408115 0.174426 0.896113
+vn -0.230970 0.115807 0.966044
+vn 0.157661 0.014923 0.987381
+vn 0.589572 -0.019729 0.807475
+vn 0.722804 0.008457 0.691002
+vn 0.791895 0.079491 -0.605462
+vn 0.600584 -0.336333 -0.725382
+vn 0.465217 -0.484913 -0.740563
+vn 0.756085 -0.312526 -0.575033
+vn 0.888120 -0.279886 -0.364562
+vn 0.747127 -0.528200 -0.403493
+vn 0.513083 -0.767078 -0.385147
+vn 0.161390 -0.971826 -0.171779
+vn 0.041647 -0.976245 0.212628
+vn -0.132164 -0.876472 0.462957
+vn -0.441067 -0.806915 0.392871
+vn 0.462347 0.574898 0.675076
+vn -0.557382 -0.752183 0.351491
+vn 0.901540 0.361228 0.238203
+vn 0.783321 0.541586 0.305112
+vn -0.615491 -0.738999 0.273955
+vn -0.595928 -0.794386 0.117565
+vn -0.687678 -0.709875 0.152238
+vn -0.773549 -0.633595 -0.013403
+vn -0.834875 -0.550285 0.013046
+vn -0.829717 -0.551329 -0.087217
+vn -0.775534 -0.629547 0.047101
+vn -0.762020 -0.642569 -0.080184
+vn -0.775954 -0.630645 0.013500
+vn -0.701713 -0.711998 -0.025626
+vn -0.480682 -0.872693 0.085740
+vn -0.760446 -0.646635 0.059881
+vn -0.572235 -0.800166 0.179673
+vn -0.182950 -0.908112 0.376645
+vn -0.229092 -0.172632 0.957974
+vn -0.064898 0.677294 0.732845
+vn 0.054346 0.850959 0.522413
+vn -0.025155 0.784707 0.619356
+vn -0.111660 0.597000 0.794433
+vn -0.130412 0.483777 0.865420
+vn -0.125941 0.441113 0.888571
+vn -0.136030 0.428580 0.893205
+vn -0.497048 0.292541 0.816923
+vn -0.581759 0.320224 0.747671
+vn -0.566320 0.529324 0.631742
+vn -0.399080 0.839800 0.368064
+vn -0.165219 0.962939 0.213192
+vn 0.180975 -0.892235 0.413720
+vn 0.130051 -0.852940 0.505550
+vn -0.062184 -0.688056 0.722988
+vn 0.068609 -0.816413 0.573378
+vn -0.061690 -0.769669 0.635455
+vn -0.175486 -0.771548 0.611488
+vn -0.892300 0.172524 0.417177
+vn -0.955963 0.171365 0.238262
+vn -0.873843 0.206208 0.440315
+vn -0.896771 0.216759 0.385768
+vn -0.874857 0.211666 0.435686
+vn -0.899490 0.211098 0.382564
+vn -0.875055 0.165775 0.454750
+vn -0.878962 0.165507 0.447251
+vn 0.723029 -0.558915 -0.406009
+vn 0.781299 -0.477731 -0.401678
+vn 0.831795 -0.407465 -0.376947
+vn 0.871899 -0.363653 -0.327947
+vn 0.912045 -0.318589 -0.258215
+vn 0.970989 -0.140447 -0.193533
+vn 0.757787 -0.468292 -0.454380
+vn 0.799657 -0.442882 -0.405469
+vn 0.696283 -0.493220 -0.521464
+vn 0.597297 -0.541008 -0.592070
+vn 0.510427 -0.578979 -0.635804
+vn 0.682250 -0.605090 -0.410367
+vn 0.653076 -0.625387 -0.427062
+vn 0.614932 -0.657449 -0.435452
+vn 0.600506 -0.677242 -0.425131
+vn 0.341334 -0.558359 -0.756126
+vn 0.347423 -0.553980 -0.756573
+vn 0.409246 -0.579187 -0.705025
+vn 0.469042 -0.592805 -0.654662
+vn -0.426812 0.324483 0.844122
+vn -0.150214 0.365475 0.918621
+vn -0.080542 0.963814 0.254115
+vn -0.058293 0.238730 0.969335
+vn -0.058293 0.238730 0.969335
+vn -0.206539 -0.059777 0.976611
+vn 0.785461 -0.455791 -0.418695
+vn 0.668092 -0.269279 -0.693644
+vn 0.905060 -0.412957 0.101653
+vn 0.869465 -0.491241 0.052086
+vn 0.898076 -0.180334 -0.401172
+vn 0.973660 -0.211736 -0.084582
+vn 0.980274 -0.144070 0.135302
+vn 0.814324 -0.271889 0.512789
+vn 0.814324 -0.271889 0.512789
+vn 0.918624 0.166841 0.358181
+vn 0.741154 0.463785 0.485380
+vn 0.947449 -0.041439 0.317211
+vn 0.611572 0.545655 0.572923
+vn 0.904994 -0.020831 0.424913
+vn 0.923378 0.204457 0.324916
+vn 0.826855 0.443832 0.345433
+vn 0.760719 0.415339 0.498799
+vn 0.720624 0.492087 0.488418
+vn 0.697442 0.552508 0.456410
+vn 0.702097 0.562458 0.436694
+vn 0.834179 0.400987 0.378622
+vn 0.847666 0.399057 0.349595
+vn 0.693729 0.606736 0.388086
+vn 0.504100 0.776103 0.378876
+vn 0.148598 0.922908 0.355188
+vn -0.059750 0.931927 0.357689
+vn -0.175523 0.877956 0.445404
+vn 0.021067 0.923668 0.382615
+vn 0.230269 0.943136 0.239732
+vn 0.637623 0.752392 0.165357
+vn 0.738008 0.607392 0.293972
+vn 0.858757 0.080580 0.506007
+vn 0.817873 0.223196 0.530347
+vn 0.869330 0.494203 0.005449
+vn 0.778333 0.622013 0.085425
+vn 0.875076 0.479485 -0.065848
+vn 0.682816 0.696418 -0.220827
+vn 0.647693 0.760553 0.045311
+vn 0.789251 -0.079380 0.608918
+vn 0.956814 0.162151 -0.241276
+vn 0.912472 0.221945 -0.343707
+vn 0.923227 0.185843 -0.336326
+vn 0.930107 0.110649 -0.350226
+vn 0.962716 -0.104994 0.249308
+vn 0.996259 0.074426 -0.043913
+vn 0.897520 0.083880 -0.432923
+vn 0.893919 0.164722 -0.416864
+vn 0.896055 -0.119118 -0.427664
+vn 0.910937 0.031813 -0.411317
+vn 0.887784 -0.310259 -0.339969
+vn 0.967287 -0.247903 -0.053858
+vn 0.898863 -0.087684 -0.429368
+vn 0.870952 0.132239 -0.473240
+vn 0.820854 -0.498538 -0.278674
+vn 0.673284 0.686365 -0.274940
+vn 0.606195 0.754232 -0.252313
+vn 0.675961 0.541808 -0.499520
+vn 0.618021 0.547814 -0.563870
+vn 0.665292 0.299502 -0.683874
+vn 0.505279 0.723903 -0.469741
+vn 0.324758 0.671254 -0.666296
+vn 0.374322 0.087651 -0.923147
+vn 0.000000 0.639223 -0.769021
+vn 0.000000 0.035307 -0.999376
+vn 0.310246 0.557940 -0.769708
+vn 0.000000 0.598163 -0.801375
+vn 0.517378 0.521388 -0.678583
+vn 0.340138 -0.257223 -0.904512
+vn 0.619196 -0.230144 -0.750753
+vn 0.293751 0.486414 -0.822868
+vn 0.000000 0.512469 -0.858706
+vn 0.470447 0.495624 -0.730094
+vn 0.557935 0.805652 -0.199084
+vn 0.452387 0.755121 -0.474488
+vn 0.344960 0.717142 -0.605566
+vn 0.237320 0.671919 -0.701573
+vn 0.000000 0.657200 -0.753716
+vn 0.378004 0.106861 -0.919616
+vn 0.718351 0.133214 -0.682808
+vn 0.689578 0.310031 -0.654494
+vn 0.809509 0.216230 -0.545839
+vn 0.421755 0.326961 -0.845706
+vn 0.678838 0.317455 -0.662119
+vn 0.851847 0.161232 -0.498359
+vn 0.471194 0.400313 -0.785955
+vn 0.695682 0.479424 -0.534957
+vn 0.409728 0.658083 -0.631703
+vn 0.324420 0.864075 -0.384872
+vn 0.383642 0.914346 -0.129580
+vn 0.895950 -0.235518 -0.376569
+vn 0.552213 0.817527 0.163434
+vn 0.620789 0.719209 -0.312026
+vn 0.880295 0.271967 -0.388735
+vn 0.654011 0.067286 -0.753487
+vn 0.445700 0.495602 -0.745473
+vn 0.370129 0.481660 -0.794360
+vn 0.282468 0.437842 -0.853526
+vn 0.194704 0.381776 -0.903514
+vn 0.000000 0.346752 -0.937957
+vn 0.134093 -0.255637 -0.957428
+vn 0.000000 -0.278526 -0.960429
+vn 0.167318 -0.218170 -0.961461
+vn 0.157411 -0.193966 -0.968297
+vn 0.193518 -0.145853 -0.970195
+vn 0.883346 -0.269483 -0.383509
+vn 0.372707 -0.602315 -0.705908
+vn 0.284389 -0.674901 -0.680905
+vn 0.266465 -0.623440 -0.735064
+vn 0.210330 -0.583672 -0.784276
+vn 0.163290 -0.531374 -0.831251
+vn 0.142215 -0.491701 -0.859072
+vn 0.101835 -0.448198 -0.888115
+vn 0.076807 -0.381437 -0.921198
+vn 0.088509 -0.378576 -0.921329
+vn 0.079068 -0.607429 -0.790429
+vn 0.000000 -0.605434 -0.795896
+vn 0.074285 -0.610089 -0.788843
+vn 0.029425 -0.633697 -0.773022
+vn -0.067163 -0.611468 -0.788414
+vn 0.096433 -0.513376 -0.852728
+vn 0.000000 -0.512619 -0.858616
+vn 0.129979 -0.519215 -0.844702
+vn 0.137003 -0.542535 -0.828785
+vn 0.105013 -0.595112 -0.796752
+vn -0.079301 -0.653155 -0.753060
+vn 0.135006 -0.304248 -0.942977
+vn 0.000000 -0.300841 -0.953674
+vn 0.204273 -0.314048 -0.927171
+vn 0.243386 -0.350578 -0.904355
+vn 0.275302 -0.444189 -0.852588
+vn 0.022468 -0.570516 -0.820979
+vn 0.158274 -0.161865 -0.974037
+vn 0.000000 -0.161161 -0.986928
+vn 0.243947 -0.171140 -0.954568
+vn 0.336061 -0.218423 -0.916163
+vn 0.439956 -0.321892 -0.838346
+vn 0.400605 -0.446572 -0.800055
+vn 0.109754 -0.532448 -0.839317
+vn 0.199636 -0.021538 -0.979633
+vn 0.000000 -0.017694 -0.999843
+vn 0.273388 -0.047857 -0.960713
+vn 0.413696 -0.125495 -0.901724
+vn 0.538408 -0.266793 -0.799336
+vn 0.501708 -0.413970 -0.759551
+vn 0.180764 -0.480264 -0.858295
+vn 0.266299 0.069839 -0.961357
+vn 0.000000 0.084146 -0.996453
+vn 0.303219 0.021856 -0.952670
+vn 0.472055 -0.071805 -0.878640
+vn 0.628723 -0.209727 -0.748814
+vn 0.596804 -0.347012 -0.723469
+vn 0.233182 -0.415250 -0.879314
+vn 0.306329 0.115426 -0.944902
+vn 0.000000 0.137574 -0.990492
+vn 0.336512 0.061863 -0.939645
+vn 0.521998 -0.032046 -0.852345
+vn 0.700901 -0.166964 -0.693441
+vn 0.670696 -0.320363 -0.668980
+vn 0.278649 -0.402161 -0.872136
+vn 0.338844 0.155528 -0.927898
+vn 0.000000 0.188747 -0.982026
+vn 0.370116 0.153131 -0.916278
+vn 0.000000 0.169274 -0.985569
+vn 0.366869 0.132995 -0.920717
+vn 0.000000 0.134384 -0.990929
+vn 0.366650 0.102371 -0.924710
+vn 0.389342 0.122674 -0.912888
+vn 0.413330 0.115606 -0.903213
+vn 0.566003 0.001137 -0.824403
+vn 0.607024 0.023898 -0.794324
+vn 0.648586 0.030749 -0.760520
+vn 0.749269 -0.163297 -0.641818
+vn 0.795439 -0.141070 -0.589387
+vn 0.843796 -0.106096 -0.526072
+vn 0.724763 -0.344747 -0.596547
+vn 0.786972 -0.324776 -0.524590
+vn 0.854710 -0.241359 -0.459582
+vn 0.337017 -0.403246 -0.850772
+vn 0.402275 -0.400267 -0.823384
+vn 0.485908 -0.248850 -0.837835
+vn -0.880669 0.068701 0.468725
+vn -0.890116 0.075529 0.449431
+vn -0.690705 0.079408 0.718763
+vn -0.394663 0.066423 0.916422
+vn 0.723350 -0.098931 0.683358
+vn 0.602617 -0.086043 0.793378
+vn 0.407468 -0.066327 0.910808
+vn 0.341247 -0.066881 0.937591
+vn 0.178897 -0.034900 0.983249
+vn 0.017878 0.003394 0.999834
+vn 0.402357 -0.193102 0.894886
+vn 0.490618 -0.333994 0.804824
+vn 0.758839 -0.598216 0.257490
+vn 0.778436 -0.501585 -0.377425
+vn 0.629626 -0.266786 -0.729655
+vn 0.292935 -0.028191 -0.955717
+vn 0.527437 -0.076844 -0.846112
+vn 0.883476 -0.184844 -0.430467
+vn 0.864677 -0.099711 -0.492333
+vn 0.669031 0.021270 -0.742930
+vn 0.426770 0.097026 -0.899140
+vn 0.358671 0.125462 -0.924995
+vn 0.000000 0.137946 -0.990440
+vn -0.721592 -0.640278 -0.263341
+vn -0.697988 -0.592670 -0.401939
+vn -0.502056 -0.425307 -0.753030
+vn -0.200513 -0.221996 -0.954208
+vn -0.602386 0.213580 0.769100
+vn -0.518785 0.283933 0.806377
+vn -0.574210 0.261001 0.775991
+vn -0.648485 0.210243 0.731618
+vn -0.582966 0.189917 0.789989
+vn -0.657902 0.149876 0.738039
+vn -0.576627 0.140213 0.804886
+vn -0.655242 0.120524 0.745743
+vn -0.548585 0.085622 0.831699
+vn -0.623643 0.065462 0.778963
+vn -0.302198 0.055408 0.951634
+vn -0.589216 -0.022250 0.807669
+vn -0.178633 0.016982 0.983769
+vn -0.602782 -0.103612 0.791150
+vn -0.178820 -0.035670 0.983235
+vn -0.613247 -0.157314 0.774068
+vn 0.241697 0.064364 0.968215
+vn 0.222498 0.105295 0.969230
+vn 0.202843 0.146011 0.968264
+vn -0.581346 0.184565 0.792447
+vn -0.527918 0.212525 0.822275
+vn -0.270288 0.273170 0.923213
+vn -0.227464 0.248221 0.941619
+vn -0.074044 0.366548 0.927448
+vn -0.070724 0.317242 0.945704
+vn -0.113156 0.341724 0.932963
+vn -0.021131 0.358451 0.933309
+vn -0.174841 0.291507 0.940454
+vn -0.207586 0.210474 0.955306
+vn 0.015614 0.337833 0.941076
+vn -0.649281 0.137389 0.748036
+vn -0.521131 0.092429 0.848457
+vn -0.658302 0.126354 0.742073
+vn -0.698391 0.096456 0.709187
+vn 0.007616 0.378960 0.925382
+vn -0.071756 0.279278 0.957525
+vn -0.148503 0.228260 0.962208
+vn -0.084036 0.432319 0.897796
+vn -0.037269 0.462611 0.885778
+vn -0.085702 0.358906 0.929431
+vn -0.092997 0.423873 0.900935
+vn -0.578344 0.189784 0.793410
+vn -0.503826 0.169966 0.846918
+vn -0.653025 0.152927 0.741736
+vn -0.537542 0.259210 0.802408
+vn -0.175271 0.485911 0.856254
+vn -0.480350 0.346259 0.805834
+vn -0.243788 0.307629 0.919746
+vn -0.333496 0.475182 0.814238
+vn -0.306371 0.434431 0.846998
+vn -0.275086 0.360708 0.891189
+vn -0.291053 0.279260 0.915042
+vn -0.079687 0.186105 0.979293
+vn -0.077906 0.124928 0.989103
+vn -0.319400 0.172440 0.931798
+vn -0.595356 0.092896 0.798073
+vn -0.546608 -0.021804 0.837105
+vn -0.551343 -0.124464 0.824942
+vn -0.568879 -0.174571 0.803680
+vn -0.305639 -0.119565 0.944611
+vn -0.283986 -0.071210 0.956180
+vn -0.290856 0.047039 0.955610
+vn -0.098141 0.082151 0.991776
+vn -0.064814 0.044293 0.996914
+vn -0.100796 -0.023640 0.994626
+vn -0.074774 -0.024916 0.996889
+vn -0.099669 -0.082218 0.991618
+vn -0.059714 -0.077254 0.995222
+vn -0.445449 0.351574 0.823390
+vn -0.548867 0.270792 0.790833
+vn -0.605772 0.186707 0.773421
+vn -0.443076 0.285121 0.849935
+vn -0.387899 0.439155 0.810356
+vn -0.413496 0.414989 0.810435
+vn -0.436072 0.437467 0.786425
+vn -0.340697 0.455336 0.822554
+vn -0.176869 0.487885 0.854801
+vn -0.237891 0.494049 0.836256
+vn -0.386196 0.438893 0.811311
+vn -0.449781 0.446229 0.773677
+vn -0.452086 0.426728 0.783276
+vn -0.365855 0.460683 0.808654
+vn -0.432131 0.415593 0.800341
+vn -0.416336 0.359925 0.834936
+vn -0.295931 0.385626 0.873909
+vn -0.333786 0.391667 0.857429
+vn -0.403423 0.497640 0.767857
+vn -0.413539 0.418225 0.808748
+vn -0.467588 0.370380 0.802608
+vn -0.627608 0.502314 0.594801
+vn -0.693293 0.348298 0.630898
+vn -0.723581 0.273386 0.633790
+vn -0.600324 0.220819 0.768667
+vn -0.428859 0.599311 0.675949
+vn -0.404483 0.632677 0.660389
+vn -0.241671 0.174188 0.954596
+vn -0.268367 0.223146 0.937115
+vn -0.137881 0.077206 0.987435
+vn -0.073427 0.011380 0.997236
+vn -0.066278 -0.028333 0.997399
+vn -0.048131 -0.063038 0.996850
+vn -0.402357 0.496327 0.769265
+vn -0.453406 0.415528 0.788517
+vn -0.516046 0.438872 0.735587
+vn -0.580118 0.489634 0.650939
+vn -0.691007 0.528668 0.492971
+vn -0.654373 0.593785 0.468204
+vn -0.693446 0.650830 0.309115
+vn -0.693484 0.709322 0.126266
+vn -0.739462 0.638880 0.212199
+vn -0.784170 0.574051 0.235675
+vn -0.668376 0.733729 0.122133
+vn -0.772927 0.632876 0.045294
+vn -0.798986 0.598844 0.054845
+vn -0.742605 0.662378 -0.098960
+vn -0.772493 0.622660 -0.124696
+vn -0.653531 0.756515 -0.024128
+vn -0.801970 0.591140 -0.086016
+vn -0.771021 0.577440 -0.268496
+vn -0.800345 0.591484 -0.097949
+vn -0.829800 0.557717 0.019575
+vn -0.402621 0.410303 0.818259
+vn -0.747574 0.507108 0.428922
+vn -0.327401 0.464572 0.822789
+vn -0.358374 0.528290 0.769725
+vn -0.809816 0.579091 -0.094084
+vn -0.747960 0.573313 -0.334466
+vn -0.729200 0.682344 0.051709
+vn -0.751051 0.648506 0.123946
+vn -0.699686 0.557932 0.446263
+vn -0.461228 0.442142 0.769272
+vn -0.591526 0.786790 0.176235
+vn -0.520694 0.818933 0.241303
+vn -0.545418 0.819952 0.173777
+vn -0.516019 0.787254 0.337573
+vn -0.477368 0.633843 0.608575
+vn -0.427488 0.496537 0.755451
+vn -0.414836 0.409638 0.812470
+vn -0.373704 0.420141 0.826938
+vn -0.400767 0.415315 0.816639
+vn -0.416198 0.371368 0.829979
+vn -0.273407 0.253699 0.927839
+vn -0.900794 0.394140 0.182274
+vn -0.900794 0.394140 0.182274
+vn -0.662096 0.710348 0.238818
+vn -0.555647 0.806042 0.203844
+vn -0.607701 0.780967 0.144187
+vn -0.678347 0.726133 0.112147
+vn -0.354960 0.429563 0.830349
+vn -0.395584 0.623221 0.674618
+vn -0.395584 0.623221 0.674618
+vn -0.436265 0.364181 0.822827
+vn -0.371782 0.690148 0.620866
+vn -0.371782 0.690148 0.620866
+vn -0.295859 0.531974 0.793392
+vn -0.295859 0.531974 0.793392
+vn -0.268899 0.478963 0.835636
+vn -0.474345 0.809620 0.345705
+vn -0.829394 0.553534 0.075540
+vn -0.436288 0.721510 0.537659
+vn -0.375898 0.598493 0.707465
+vn -0.320930 0.452886 0.831804
+vn -0.755328 0.483434 0.442459
+vn -0.436894 0.441323 0.783810
+vn -0.298031 0.319168 0.899616
+vn -0.305066 0.278678 0.910644
+vn -0.328764 0.253859 0.909654
+vn -0.291424 0.164553 0.942335
+vn -0.799548 -0.534189 -0.274526
+vn -0.854314 -0.442305 -0.272971
+vn -0.951509 -0.271426 0.144769
+vn -0.917818 -0.072919 0.390247
+vn -0.937726 0.091499 0.335108
+vn -0.750785 -0.594673 -0.287553
+vn -0.723888 -0.619714 -0.303217
+vn -0.685325 -0.661416 -0.304725
+vn -0.660050 -0.690933 -0.294867
+vn -0.613815 -0.759738 -0.214545
+vn -0.207044 0.516952 0.830598
+vn -0.723029 -0.558915 -0.406009
+vn -0.781299 -0.477731 -0.401678
+vn -0.831795 -0.407465 -0.376947
+vn -0.871899 -0.363653 -0.327947
+vn -0.912045 -0.318589 -0.258215
+vn -0.970989 -0.140447 -0.193533
+vn -0.757787 -0.468292 -0.454380
+vn -0.799657 -0.442881 -0.405469
+vn -0.696283 -0.493219 -0.521464
+vn -0.597297 -0.541008 -0.592070
+vn -0.510428 -0.578979 -0.635804
+vn -0.682250 -0.605090 -0.410367
+vn -0.653076 -0.625387 -0.427062
+vn -0.614932 -0.657449 -0.435452
+vn -0.600506 -0.677242 -0.425131
+vn -0.341334 -0.558359 -0.756126
+vn -0.347423 -0.553980 -0.756573
+vn -0.409245 -0.579187 -0.705025
+vn -0.469042 -0.592805 -0.654662
+vn -0.785461 -0.455791 -0.418695
+vn -0.668092 -0.269279 -0.693644
+vn -0.905060 -0.412957 0.101653
+vn -0.869465 -0.491241 0.052086
+vn -0.898076 -0.180334 -0.401172
+vn -0.973660 -0.211736 -0.084582
+vn -0.980274 -0.144070 0.135302
+vn -0.814324 -0.271889 0.512789
+vn -0.814324 -0.271889 0.512789
+vn -0.918624 0.166842 0.358181
+vn -0.741154 0.463785 0.485380
+vn -0.947449 -0.041438 0.317210
+vn -0.611572 0.545655 0.572923
+vn -0.904994 -0.020831 0.424913
+vn -0.923378 0.204457 0.324916
+vn -0.826855 0.443832 0.345433
+vn -0.760719 0.415339 0.498799
+vn -0.720624 0.492087 0.488418
+vn -0.697442 0.552508 0.456410
+vn -0.702097 0.562458 0.436694
+vn -0.834179 0.400987 0.378622
+vn -0.847666 0.399057 0.349595
+vn -0.693729 0.606736 0.388086
+vn -0.618380 0.687391 0.380921
+vn -0.148598 0.922908 0.355188
+vn 0.099817 0.962574 0.251969
+vn -0.767986 0.606101 0.206977
+vn -0.738007 0.607392 0.293972
+vn -0.858757 0.080580 0.506007
+vn -0.817873 0.223196 0.530347
+vn -0.869330 0.494203 0.005449
+vn -0.778333 0.622013 0.085425
+vn -0.875076 0.479485 -0.065848
+vn -0.682816 0.696418 -0.220827
+vn -0.678736 0.732540 0.051991
+vn -0.789251 -0.079380 0.608918
+vn -0.956814 0.162151 -0.241276
+vn -0.912472 0.221945 -0.343707
+vn -0.923227 0.185843 -0.336326
+vn -0.930107 0.110649 -0.350226
+vn -0.962716 -0.104994 0.249308
+vn -0.996259 0.074427 -0.043913
+vn -0.897520 0.083880 -0.432923
+vn -0.893919 0.164722 -0.416864
+vn -0.896055 -0.119118 -0.427664
+vn -0.910937 0.031813 -0.411317
+vn -0.887784 -0.310259 -0.339969
+vn -0.967287 -0.247903 -0.053858
+vn -0.898863 -0.087684 -0.429367
+vn -0.886747 0.067331 -0.457326
+vn -0.820854 -0.498538 -0.278673
+vn -0.673284 0.686365 -0.274940
+vn -0.606194 0.754232 -0.252314
+vn -0.675961 0.541809 -0.499520
+vn -0.618021 0.547814 -0.563870
+vn -0.665292 0.299502 -0.683874
+vn -0.505279 0.723903 -0.469741
+vn -0.324758 0.671254 -0.666296
+vn -0.374322 0.087651 -0.923147
+vn -0.310246 0.557940 -0.769708
+vn -0.517378 0.521388 -0.678583
+vn -0.340138 -0.257223 -0.904512
+vn -0.619196 -0.230144 -0.750753
+vn -0.293751 0.486414 -0.822868
+vn -0.470447 0.495624 -0.730094
+vn -0.557935 0.805652 -0.199084
+vn -0.452387 0.755121 -0.474488
+vn -0.344960 0.717142 -0.605566
+vn -0.237320 0.671919 -0.701573
+vn -0.378004 0.106861 -0.919616
+vn -0.718351 0.133214 -0.682808
+vn -0.689578 0.310031 -0.654494
+vn -0.809509 0.216230 -0.545838
+vn -0.421755 0.326961 -0.845706
+vn -0.678838 0.317455 -0.662119
+vn -0.851847 0.161232 -0.498359
+vn -0.471194 0.400313 -0.785955
+vn -0.695682 0.479424 -0.534957
+vn -0.409728 0.658084 -0.631703
+vn -0.324420 0.864075 -0.384872
+vn -0.288714 0.934711 -0.207268
+vn -0.895950 -0.235519 -0.376569
+vn -0.552213 0.817527 0.163434
+vn -0.620789 0.719209 -0.312026
+vn -0.880295 0.271967 -0.388735
+vn -0.654011 0.067286 -0.753487
+vn -0.445700 0.495602 -0.745473
+vn -0.370129 0.481660 -0.794360
+vn -0.282467 0.437843 -0.853526
+vn -0.194704 0.381776 -0.903514
+vn -0.134094 -0.255637 -0.957428
+vn -0.167318 -0.218170 -0.961461
+vn -0.157411 -0.193966 -0.968297
+vn -0.193518 -0.145853 -0.970195
+vn -0.883346 -0.269483 -0.383509
+vn -0.372707 -0.602315 -0.705908
+vn -0.284389 -0.674901 -0.680905
+vn -0.266465 -0.623440 -0.735064
+vn -0.210330 -0.583671 -0.784276
+vn -0.163290 -0.531374 -0.831251
+vn -0.142215 -0.491701 -0.859072
+vn -0.101835 -0.448198 -0.888115
+vn -0.076807 -0.381437 -0.921198
+vn -0.088509 -0.378576 -0.921329
+vn -0.079068 -0.607429 -0.790429
+vn -0.074285 -0.610089 -0.788843
+vn -0.029424 -0.633697 -0.773022
+vn 0.067163 -0.611468 -0.788414
+vn -0.096433 -0.513376 -0.852728
+vn -0.129979 -0.519215 -0.844702
+vn -0.137003 -0.542535 -0.828785
+vn -0.105012 -0.595112 -0.796752
+vn 0.079301 -0.653155 -0.753060
+vn -0.135006 -0.304248 -0.942977
+vn -0.204273 -0.314048 -0.927171
+vn -0.243386 -0.350578 -0.904355
+vn -0.275302 -0.444189 -0.852588
+vn -0.022468 -0.570516 -0.820979
+vn -0.158274 -0.161865 -0.974037
+vn -0.243947 -0.171140 -0.954568
+vn -0.336061 -0.218423 -0.916163
+vn -0.439956 -0.321892 -0.838346
+vn -0.400605 -0.446572 -0.800055
+vn -0.109754 -0.532448 -0.839317
+vn -0.199636 -0.021538 -0.979633
+vn -0.273388 -0.047857 -0.960713
+vn -0.413696 -0.125495 -0.901724
+vn -0.538408 -0.266793 -0.799336
+vn -0.501708 -0.413970 -0.759551
+vn -0.180764 -0.480264 -0.858295
+vn -0.266299 0.069839 -0.961357
+vn -0.303219 0.021856 -0.952670
+vn -0.472055 -0.071805 -0.878640
+vn -0.628723 -0.209727 -0.748814
+vn -0.596804 -0.347012 -0.723469
+vn -0.233182 -0.415251 -0.879314
+vn -0.306329 0.115426 -0.944902
+vn -0.336512 0.061863 -0.939645
+vn -0.521998 -0.032046 -0.852345
+vn -0.700901 -0.166964 -0.693441
+vn -0.670696 -0.320363 -0.668980
+vn -0.278649 -0.402161 -0.872136
+vn -0.338844 0.155528 -0.927899
+vn -0.370116 0.153131 -0.916278
+vn -0.366869 0.132995 -0.920717
+vn -0.366650 0.102371 -0.924710
+vn -0.389342 0.122674 -0.912888
+vn -0.413330 0.115606 -0.903213
+vn -0.566003 0.001137 -0.824403
+vn -0.607024 0.023898 -0.794324
+vn -0.648586 0.030749 -0.760520
+vn -0.749269 -0.163297 -0.641818
+vn -0.795439 -0.141070 -0.589387
+vn -0.843796 -0.106096 -0.526072
+vn -0.724763 -0.344747 -0.596547
+vn -0.786972 -0.324776 -0.524590
+vn -0.854710 -0.241359 -0.459582
+vn -0.337017 -0.403246 -0.850771
+vn -0.402275 -0.400267 -0.823384
+vn -0.485908 -0.248850 -0.837835
+vn -0.773523 -0.589367 -0.233044
+vn -0.778436 -0.501585 -0.377425
+vn -0.629626 -0.266786 -0.729655
+vn -0.292935 -0.028191 -0.955717
+vn -0.527437 -0.076844 -0.846112
+vn -0.883477 -0.184843 -0.430467
+vn -0.864677 -0.099711 -0.492333
+vn -0.669031 0.021270 -0.742930
+vn -0.426770 0.097026 -0.899140
+vn -0.358671 0.125462 -0.924995
+vn 0.627073 -0.111635 0.770920
+vn 0.627073 -0.111635 0.770920
+vn 0.595190 -0.161019 0.787287
+vn 0.595190 -0.161019 0.787287
+vn 0.656620 -0.061834 0.751682
+vn 0.656620 -0.061834 0.751682
+vn -0.542180 0.369117 0.754846
+vn -0.538712 0.356049 0.763557
+vn -0.452694 0.343683 0.822770
+vn -0.291627 0.335422 0.895793
+vn -0.226948 0.277663 0.933487
+vn -0.237942 0.227136 0.944348
+vn -0.237942 0.227136 0.944348
+vn -0.226948 0.277663 0.933487
+vn -0.291627 0.335422 0.895793
+vn -0.452694 0.343683 0.822770
+vn -0.538712 0.356049 0.763557
+vn -0.522250 0.508353 0.684714
+vn -0.518989 0.574123 0.633272
+vn -0.522428 0.591810 0.613865
+vn -0.516000 0.605509 0.605890
+vn -0.517128 0.565105 0.642833
+vn 0.918894 -0.353792 0.174546
+vn 0.918894 -0.353792 0.174546
+vn 0.873308 -0.487103 0.007921
+vn 0.853171 -0.521407 0.015309
+vn 0.880686 -0.471698 0.043516
+vn 0.882640 -0.465839 0.062778
+vn 0.888832 -0.450220 0.085324
+vn 0.893194 -0.429553 0.132995
+vn 0.840967 -0.539308 0.043839
+vn 0.840967 -0.539308 0.043839
+vn 0.853171 -0.521407 0.015309
+vn 0.873308 -0.487103 0.007921
+vn 0.880686 -0.471698 0.043516
+vn 0.882640 -0.465839 0.062778
+vn 0.888832 -0.450220 0.085324
+vn 0.893194 -0.429553 0.132995
+vn 0.939475 -0.288121 0.185400
+vn 0.939475 -0.288121 0.185400
+vn 0.573576 0.664666 0.478780
+vn 0.449451 0.630971 0.632352
+vn 0.349559 0.679393 0.645162
+vn 0.483575 0.704932 0.518869
+vn 0.223400 0.704019 0.674129
+vn 0.420007 0.686787 0.593227
+vn 0.223976 0.672852 0.705057
+vn 0.534282 0.599621 0.595816
+vn 0.170947 0.530884 0.830024
+vn 0.593948 0.416422 0.688345
+vn 0.088895 0.494920 0.864380
+vn 0.582938 0.296662 0.756422
+vn 0.300255 0.750204 0.589102
+vn 0.775652 0.350674 0.524778
+vn 0.506343 0.824002 0.254240
+vn 0.901844 0.276854 0.331707
+vn 0.530901 0.825210 0.192801
+vn 0.911424 0.209264 0.354280
+vn 0.674685 0.671689 0.305996
+vn 0.600817 0.706114 0.374730
+vn 0.598850 0.637791 0.484357
+vn 0.787274 0.455513 0.415581
+vn 0.890740 0.213891 0.401041
+vn 0.904150 0.012156 0.427042
+vn 0.948872 -0.157890 0.273336
+vn 0.877723 -0.406240 0.254108
+vn 0.790425 -0.521832 0.320811
+vn 0.686049 0.709282 0.162039
+vn 0.749420 0.614790 0.245770
+vn 0.719531 0.663693 0.204415
+vn 0.749420 0.614790 0.245770
+vn 0.719531 0.663693 0.204415
+vn 0.686049 0.709282 0.162039
+vn 0.624078 -0.343144 0.701982
+vn 0.523755 -0.440076 0.729393
+vn 0.412846 -0.528113 0.742061
+vn 0.412846 -0.528113 0.742061
+vn 0.523755 -0.440076 0.729393
+vn 0.624078 -0.343144 0.701982
+vn 0.808537 -0.027561 0.587799
+vn 0.946588 -0.259753 0.191047
+vn 0.976977 -0.117484 0.178080
+vn 0.968393 0.151657 0.198029
+vn 0.897670 0.126681 0.422067
+vn -0.161109 0.780577 0.603940
+vn -0.158319 0.581766 0.797799
+vn -0.049724 0.650731 0.757678
+vn -0.294269 0.500087 0.814444
+vn 0.221684 0.390190 0.893649
+vn -0.190112 0.648891 0.736748
+vn 0.706576 0.359084 0.609761
+vn -0.094555 0.527366 0.844360
+vn 0.352175 0.618989 0.702015
+vn 0.292781 0.685325 0.666790
+vn 0.102978 0.685603 0.720655
+vn -0.249493 0.570902 0.782192
+vn -0.330858 0.531987 0.779438
+vn -0.222929 0.657917 0.719338
+vn -0.362748 0.663553 0.654302
+vn -0.503150 0.560902 0.657442
+vn -0.517499 0.519484 0.679950
+vn -0.609163 0.521054 0.597849
+vn -0.674086 0.561273 0.480188
+vn -0.663502 0.590652 0.459233
+vn -0.138923 0.765759 0.627943
+vn -0.188934 0.760750 0.620938
+vn -0.607112 0.552177 0.571415
+vn -0.216672 0.742646 0.633664
+vn -0.573847 0.634858 0.517354
+vn -0.690702 0.510844 0.511829
+vn -0.608543 0.641438 0.467153
+vn -0.606077 0.680336 0.412085
+vn -0.336308 0.727851 0.597603
+vn -0.734526 0.329784 0.593056
+vn 0.538953 0.672200 0.507618
+vn 0.598071 0.707983 0.375594
+vn 0.799701 0.536873 0.268788
+vn 0.968393 0.151657 0.198029
+vn 0.976977 -0.117484 0.178080
+vn 0.000000 0.918200 0.396117
+vn 0.000000 0.809747 0.586779
+vn 0.000000 0.536133 0.844133
+vn 0.000000 0.099690 0.995019
+vn 0.000000 -0.361986 0.932183
+vn 0.000000 -0.557803 0.829974
+vn 0.344563 -0.518463 0.782607
+vn 0.378461 -0.524331 0.762788
+vn 0.256890 -0.512429 0.819405
+vn 0.448309 0.218253 0.866824
+vn 0.475266 0.293719 0.829368
+vn 0.476055 0.258285 0.840631
+vn 0.452144 0.261612 0.852716
+vn 0.312141 0.190793 0.930680
+vn 0.400881 0.229952 0.886801
+vn 0.401913 0.276564 0.872914
+vn 0.286784 0.340625 0.895393
+vn 0.180846 0.336515 0.924150
+vn 0.250766 0.397931 0.882478
+vn 0.191958 0.476407 0.858014
+vn 0.080898 0.560262 0.824355
+vn 0.052502 0.589959 0.805724
+vn -0.057820 0.679562 0.731336
+vn -0.166571 0.738903 0.652899
+vn -0.102120 0.745014 0.659186
+vn -0.148518 0.784407 0.602202
+vn 0.125130 0.885238 0.447992
+vn 0.352489 0.732690 0.582166
+vn 0.079675 0.947394 0.309994
+vn 0.604669 0.505393 0.615592
+vn 0.076091 0.970268 0.229763
+vn 0.182335 0.946402 0.266603
+vn 0.071017 0.960610 0.268671
+vn 0.306467 0.874299 0.376404
+vn 0.239843 0.876792 0.416786
+vn 0.627463 0.608572 0.485727
+vn 0.383075 0.749817 0.539470
+vn 0.379921 0.751732 0.539035
+vn 0.845970 0.333580 0.416005
+vn 0.705077 0.405400 0.581822
+vn 0.362848 0.504205 0.783657
+vn 0.791135 0.028158 0.610994
+vn 0.949841 0.037193 0.310514
+vn 0.363475 0.058217 0.929783
+vn 0.357532 -0.368025 0.858329
+vn 0.549575 -0.298530 0.780286
+vn 0.618932 -0.208696 0.757212
+vn -0.344562 -0.518463 0.782607
+vn -0.378461 -0.524331 0.762788
+vn -0.256889 -0.512429 0.819405
+vn -0.448309 0.218253 0.866824
+vn -0.475266 0.293719 0.829368
+vn -0.476055 0.258285 0.840631
+vn -0.452144 0.261612 0.852716
+vn -0.312141 0.190793 0.930680
+vn -0.400881 0.229952 0.886801
+vn -0.401913 0.276564 0.872914
+vn -0.286784 0.340625 0.895393
+vn -0.180846 0.336515 0.924150
+vn -0.250766 0.397931 0.882478
+vn -0.191958 0.476407 0.858014
+vn -0.080898 0.560263 0.824355
+vn -0.052502 0.589960 0.805724
+vn 0.057820 0.679562 0.731336
+vn 0.166571 0.738903 0.652899
+vn 0.102120 0.745014 0.659186
+vn 0.148518 0.784407 0.602202
+vn -0.125130 0.885238 0.447991
+vn -0.352489 0.732690 0.582166
+vn -0.079675 0.947394 0.309994
+vn -0.604669 0.505393 0.615592
+vn -0.076091 0.970268 0.229763
+vn -0.182335 0.946402 0.266603
+vn -0.071017 0.960610 0.268671
+vn -0.306468 0.874299 0.376404
+vn -0.239843 0.876792 0.416786
+vn -0.627463 0.608572 0.485727
+vn -0.383075 0.749817 0.539470
+vn -0.379921 0.751732 0.539035
+vn -0.845970 0.333580 0.416005
+vn -0.705077 0.405400 0.581822
+vn -0.362848 0.504205 0.783657
+vn -0.791135 0.028158 0.610994
+vn -0.949841 0.037193 0.310514
+vn -0.363475 0.058217 0.929783
+vn -0.357532 -0.368025 0.858329
+vn -0.549575 -0.298530 0.780286
+vn -0.618931 -0.208696 0.757212
+vn 0.000000 0.779010 0.627012
+vn 0.000000 0.458657 0.888613
+vn 0.000000 -0.368442 0.929651
+vn 0.000000 -0.264791 0.964306
+vn 0.000000 0.003320 0.999994
+vn 0.000000 0.805495 0.592602
+vn 0.388762 -0.521430 0.759588
+vn 0.446897 -0.403873 0.798229
+vn 0.416810 -0.237535 0.877409
+vn 0.284738 -0.178350 0.941868
+vn 0.204944 -0.111535 0.972398
+vn 0.395284 -0.571382 0.719217
+vn 0.366107 -0.215021 0.905390
+vn 0.437143 -0.511455 0.739811
+vn 0.359436 -0.415477 0.835574
+vn 0.418036 -0.434226 0.797931
+vn 0.214668 0.277304 0.936494
+vn 0.084450 0.685446 0.723209
+vn -0.675556 0.456409 0.579065
+vn 0.119765 0.318101 0.940462
+vn 0.010528 0.728103 0.685387
+vn 0.248777 -0.405305 0.879681
+vn -0.642264 0.471118 0.604603
+vn -0.642264 0.471118 0.604603
+vn 0.030146 -0.380419 0.924323
+vn -0.035660 0.413990 0.909583
+vn -0.172925 0.734434 0.656280
+vn -0.288381 0.695238 0.658393
+vn 0.291708 -0.407249 0.865480
+vn 0.145756 -0.363019 0.920311
+vn 0.231402 -0.337701 0.912366
+vn 0.471500 -0.030438 0.881341
+vn -0.388762 -0.521430 0.759588
+vn -0.446897 -0.403873 0.798229
+vn -0.416810 -0.237535 0.877409
+vn -0.284738 -0.178350 0.941868
+vn -0.204944 -0.111535 0.972398
+vn -0.395284 -0.571382 0.719217
+vn -0.366107 -0.215021 0.905390
+vn -0.437143 -0.511455 0.739811
+vn -0.359436 -0.415477 0.835574
+vn -0.418036 -0.434226 0.797931
+vn -0.214668 0.277304 0.936494
+vn -0.084450 0.685446 0.723209
+vn 0.675556 0.456409 0.579065
+vn -0.119765 0.318101 0.940462
+vn -0.010528 0.728103 0.685387
+vn -0.248777 -0.405305 0.879681
+vn 0.642264 0.471118 0.604603
+vn 0.642264 0.471118 0.604603
+vn -0.030146 -0.380419 0.924323
+vn 0.035660 0.413990 0.909583
+vn 0.172925 0.734434 0.656280
+vn 0.288381 0.695238 0.658393
+vn -0.291708 -0.407249 0.865480
+vn -0.145756 -0.363019 0.920311
+vn -0.231402 -0.337701 0.912366
+vn -0.471500 -0.030438 0.881341
+vn 0.969154 -0.240242 -0.055004
+vn 0.911138 -0.400370 -0.097628
+vn 0.825038 -0.548157 -0.137243
+vn 0.969154 -0.240242 -0.055004
+vn 0.911138 -0.400370 -0.097628
+vn 0.825038 -0.548157 -0.137243
+vn -0.023767 0.866455 0.498689
+vn -0.027239 0.948390 0.315934
+vn -0.638973 0.627623 0.444750
+vn -0.636559 0.740095 0.216917
+vn -0.483754 0.870106 0.094333
+vn -0.614397 0.757118 0.222008
+vn -0.472323 0.731338 0.491992
+vn -0.349854 0.612746 0.708622
+vn -0.360546 0.536919 0.762709
+vn -0.396790 0.442371 0.804279
+vn -0.358205 -0.567435 0.741422
+vn -0.197797 -0.578110 0.791622
+vn -0.363416 0.194686 0.911058
+vn -0.263707 -0.344312 0.901059
+vn -0.261318 -0.547138 0.795206
+vn -0.293824 -0.526601 0.797721
+vn 0.368408 0.080269 0.926192
+vn 0.195869 0.015084 0.980514
+vn 0.166033 0.111246 0.979825
+vn 0.213584 0.064914 0.974766
+vn 0.242572 -0.029618 0.969681
+vn 0.320390 -0.036839 0.946569
+vn 0.205688 -0.011720 0.978547
+vn 0.000000 -0.035199 0.999380
+vn -0.190062 -0.165754 0.967679
+vn 0.177612 0.976131 0.124991
+vn -0.430818 0.727384 0.534142
+vn -0.556925 0.551683 0.620871
+vn -0.526932 0.534318 0.660944
+vn -0.419946 0.671434 0.610592
+vn -0.371050 0.646325 0.666773
+vn -0.255895 0.767915 0.587218
+vn -0.519843 0.568272 0.637832
+vn -0.144010 0.813415 0.563575
+vn -0.505012 0.721498 0.473713
+vn -0.427954 0.836305 0.342709
+vn -0.105979 0.780170 0.616525
+vn 0.033369 0.990968 0.129880
+vn 0.233019 0.952507 0.196042
+vn 0.471150 0.591186 0.654612
+vn 0.146160 0.975151 0.166485
+vn 0.132490 0.959339 0.249228
+vn -0.155389 0.972865 0.171427
+vn 0.067572 0.920519 0.384809
+vn 0.516572 0.456244 0.724566
+vn -0.245331 0.788843 0.563506
+vn -0.401876 0.850302 0.339825
+vn -0.501206 0.800443 0.328761
+vn -0.843596 0.026522 0.536323
+vn -0.976806 -0.070012 0.202355
+vn -0.805500 0.252573 0.536075
+vn -0.702154 0.638153 0.315816
+vn -0.674287 0.735569 0.065387
+vn -0.804907 0.593315 0.010131
+vn -0.981894 0.176411 0.069017
+vn -0.875986 0.479281 -0.054214
+vn -0.860671 0.508735 -0.020825
+vn -0.875115 0.476188 0.086136
+vn -0.867853 0.363621 0.338542
+vn -0.953809 0.272816 0.125780
+vn -0.756813 0.288662 0.586437
+vn -0.811763 0.400035 0.425456
+vn -0.342818 0.559665 0.754487
+vn -0.285293 0.457270 0.842325
+vn -0.673365 -0.161005 0.721566
+vn -0.339093 -0.086134 0.936801
+vn -0.625471 0.410850 0.663316
+vn -0.448421 0.788552 0.420838
+vn -0.317563 0.797252 0.513363
+vn -0.063079 0.871401 0.486498
+vn 0.385727 0.245004 0.889488
+vn -0.138071 0.584247 0.799745
+vn -0.096169 0.570825 0.815420
+vn 0.101101 0.401757 0.910148
+vn -0.196115 0.114369 0.973889
+vn -0.016503 -0.155347 0.987722
+vn 0.135047 0.074517 0.988033
+vn -0.103091 0.289389 0.951644
+vn -0.289091 0.582958 0.759332
+vn -0.289091 0.582958 0.759332
+vn -0.333257 -0.496529 0.801498
+vn 0.011668 0.032145 0.999415
+vn -0.176408 -0.229461 0.957198
+vn -0.070627 0.358458 0.930871
+vn -0.249537 0.345294 0.904712
+vn 0.573287 0.116872 0.810977
+vn 0.438954 0.239210 0.866082
+vn 0.522128 0.076930 0.849390
+vn 0.240283 0.091689 0.966363
+vn 0.483322 -0.034135 0.874777
+vn 0.381644 -0.146771 0.912582
+vn 0.044584 -0.066594 0.996783
+vn 0.260756 0.069444 0.962904
+vn 0.350908 0.060943 0.934425
+vn 0.334547 -0.038152 0.941607
+vn 0.326434 -0.040016 0.944373
+vn 0.330387 -0.021935 0.943591
+vn 0.370074 -0.063871 0.926804
+vn 0.270580 -0.012081 0.962622
+vn 0.336651 -0.056162 0.939953
+vn 0.000000 0.969679 0.244382
+vn 0.000000 0.941510 0.336985
+vn 0.000000 0.864439 0.502738
+vn 0.000000 0.773074 0.634315
+vn 0.000000 0.638360 0.769738
+vn 0.000000 0.612801 0.790237
+vn 0.000000 0.580435 0.814306
+vn 0.000000 0.341306 0.939952
+vn 0.000000 -0.223803 0.974634
+vn 0.000000 -0.301665 0.953414
+vn 0.000000 -0.130099 0.991501
+vn 0.000000 -0.056987 0.998375
+vn 0.000000 0.223160 0.974782
+vn 0.000000 0.213062 0.977039
+vn 0.000000 0.077238 0.997013
+vn 0.000000 0.011545 0.999933
+vn 0.341371 0.006645 0.939905
+vn 0.261988 0.002758 0.965067
+vn 0.023767 0.866455 0.498689
+vn 0.027239 0.948390 0.315935
+vn 0.638973 0.627623 0.444750
+vn 0.636559 0.740095 0.216917
+vn 0.483754 0.870106 0.094333
+vn 0.614398 0.757118 0.222008
+vn 0.472323 0.731338 0.491992
+vn 0.349854 0.612746 0.708622
+vn 0.360546 0.536919 0.762709
+vn 0.396790 0.442372 0.804279
+vn 0.358205 -0.567435 0.741422
+vn 0.197797 -0.578110 0.791622
+vn 0.363416 0.194686 0.911058
+vn 0.263707 -0.344312 0.901059
+vn 0.261318 -0.547138 0.795206
+vn 0.293824 -0.526601 0.797721
+vn -0.368408 0.080269 0.926192
+vn -0.195869 0.015084 0.980514
+vn -0.166033 0.111246 0.979825
+vn -0.213584 0.064914 0.974766
+vn -0.242572 -0.029618 0.969681
+vn -0.320390 -0.036839 0.946569
+vn -0.205688 -0.011720 0.978547
+vn 0.190062 -0.165754 0.967679
+vn -0.177612 0.976131 0.124991
+vn 0.430818 0.727384 0.534142
+vn 0.556925 0.551683 0.620871
+vn 0.526932 0.534318 0.660944
+vn 0.419946 0.671434 0.610592
+vn 0.371050 0.646325 0.666773
+vn 0.255895 0.767915 0.587218
+vn 0.519843 0.568272 0.637832
+vn 0.144010 0.813415 0.563575
+vn 0.505012 0.721498 0.473713
+vn 0.427954 0.836305 0.342709
+vn 0.105979 0.780170 0.616525
+vn -0.033369 0.990968 0.129881
+vn -0.233019 0.952507 0.196042
+vn -0.471151 0.591186 0.654611
+vn -0.146160 0.975151 0.166485
+vn -0.132490 0.959339 0.249228
+vn 0.155389 0.972865 0.171427
+vn -0.067572 0.920519 0.384809
+vn -0.516572 0.456244 0.724566
+vn 0.245331 0.788843 0.563506
+vn 0.401876 0.850303 0.339825
+vn 0.501206 0.800443 0.328761
+vn 0.843596 0.026522 0.536323
+vn 0.976806 -0.070012 0.202355
+vn 0.805500 0.252573 0.536075
+vn 0.702154 0.638153 0.315817
+vn 0.674287 0.735569 0.065387
+vn 0.804907 0.593315 0.010130
+vn 0.981894 0.176411 0.069017
+vn 0.875986 0.479281 -0.054214
+vn 0.860671 0.508735 -0.020824
+vn 0.875115 0.476188 0.086135
+vn 0.867853 0.363621 0.338542
+vn 0.953809 0.272816 0.125779
+vn 0.756813 0.288662 0.586437
+vn 0.811763 0.400035 0.425456
+vn 0.342818 0.559665 0.754487
+vn 0.285293 0.457270 0.842325
+vn 0.673365 -0.161005 0.721566
+vn 0.339093 -0.086134 0.936801
+vn 0.625471 0.410850 0.663316
+vn 0.448421 0.788552 0.420838
+vn 0.317563 0.797253 0.513363
+vn 0.063079 0.871401 0.486498
+vn -0.385727 0.245004 0.889488
+vn 0.138071 0.584247 0.799745
+vn 0.096169 0.570825 0.815420
+vn -0.101101 0.401757 0.910148
+vn 0.196115 0.114369 0.973889
+vn 0.016503 -0.155347 0.987722
+vn -0.135047 0.074517 0.988033
+vn 0.103091 0.289389 0.951644
+vn 0.289091 0.582958 0.759332
+vn 0.289091 0.582958 0.759332
+vn 0.333256 -0.496530 0.801498
+vn -0.011668 0.032145 0.999415
+vn 0.176408 -0.229461 0.957198
+vn 0.070627 0.358458 0.930871
+vn 0.249537 0.345295 0.904711
+vn -0.573287 0.116872 0.810977
+vn -0.438954 0.239210 0.866082
+vn -0.522128 0.076930 0.849390
+vn -0.240284 0.091689 0.966363
+vn -0.483322 -0.034135 0.874777
+vn -0.381644 -0.146771 0.912582
+vn -0.044584 -0.066594 0.996784
+vn -0.260756 0.069444 0.962904
+vn -0.350908 0.060943 0.934425
+vn -0.334546 -0.038152 0.941607
+vn -0.326434 -0.040016 0.944373
+vn -0.330386 -0.021935 0.943591
+vn -0.370073 -0.063871 0.926804
+vn -0.270580 -0.012081 0.962622
+vn -0.336651 -0.056162 0.939953
+vn -0.341371 0.006645 0.939905
+vn -0.261988 0.002758 0.965067
+vn 0.685358 -0.609169 0.398996
+vn 0.908196 -0.399594 0.124519
+vn 0.992916 0.114304 0.032444
+vn 0.725233 0.685652 -0.062598
+vn 0.553728 0.822869 -0.127560
+vn 0.510606 0.851370 -0.120210
+vn 0.454586 0.886914 -0.082067
+vn 0.358454 0.924533 -0.129417
+vn 0.317834 0.923624 -0.214245
+vn 0.508410 0.824929 -0.247006
+vn 0.458281 0.880058 -0.124404
+vn 0.739797 0.653721 -0.159215
+vn 0.631641 0.774740 -0.028426
+vn 0.479826 0.874937 -0.065214
+vn 0.618842 0.785232 0.021114
+vn 0.889425 0.401034 0.219306
+vn 0.788703 0.528438 0.314167
+vn 0.857543 0.476294 0.194329
+vn 0.940500 0.005865 0.339743
+vn 0.799637 -0.224017 0.557133
+vn 0.801226 0.237059 0.549400
+vn 0.609476 -0.484447 0.627575
+vn 0.532749 -0.668924 0.518381
+vn 0.660939 -0.473983 0.581808
+vn 0.660939 -0.473983 0.581808
+vn 0.382862 -0.298558 0.874231
+vn 0.534605 -0.313203 0.784921
+vn 0.534605 -0.313203 0.784921
+vn 0.990379 0.107971 0.086556
+vn 0.969323 0.245672 -0.007583
+vn 0.990379 0.107971 0.086556
+vn 0.983439 -0.032782 0.178248
+vn 0.983439 -0.032782 0.178248
+vn -0.404293 0.619664 0.672729
+vn -0.385349 0.568001 0.727242
+vn -0.364093 0.512930 0.777393
+vn -0.364093 0.512930 0.777393
+vn -0.385349 0.568001 0.727242
+vn -0.404293 0.619664 0.672729
+vn 0.985796 -0.167944 0.000465
+vn 0.778043 0.598595 0.190613
+vn 0.751640 0.587079 0.300627
+vn 0.766080 0.593798 0.246018
+vn 0.751640 0.587079 0.300627
+vn 0.958606 0.231252 0.166123
+vn 0.999784 0.006265 0.019802
+vn 0.908124 0.401679 0.118171
+vn 0.969394 0.213606 0.121025
+vn 0.863863 0.469643 0.182144
+vn 0.967841 -0.212061 0.135329
+vn 0.934771 -0.122424 0.333491
+vn 0.966841 -0.236496 0.096372
+vn 0.864995 -0.403512 0.298263
+vn 0.657194 -0.315436 0.684541
+vn 0.855626 -0.515742 -0.043749
+vn 0.401240 -0.822345 0.403429
+vn 0.016253 -0.672912 0.739543
+vn 0.458559 -0.878176 -0.136129
+vn 0.167694 -0.811742 0.559422
+vn 0.162091 -0.867926 0.469501
+vn -0.055812 -0.907537 0.416247
+vn 0.164743 -0.833134 0.527965
+vn 0.111008 -0.862968 0.492913
+vn -0.036157 -0.649108 0.759837
+vn 0.409036 -0.479597 0.776322
+vn 0.350569 -0.877673 0.326790
+vn 0.279102 -0.813752 0.509814
+vn 0.112154 -0.909906 0.399365
+vn -0.172801 -0.871154 0.459599
+vn -0.118625 -0.732635 0.670205
+vn 0.058564 -0.617013 0.784771
+vn 0.449750 -0.489164 0.747291
+vn -0.092894 -0.670789 0.735807
+vn -0.127578 -0.700459 0.702198
+vn -0.443133 -0.757984 0.478637
+vn -0.198678 -0.915048 0.351019
+vn 0.260088 -0.946106 -0.192970
+vn 0.212615 -0.963717 -0.161381
+vn 0.247816 -0.931013 0.267961
+vn 0.126413 -0.923683 0.361703
+vn -0.025451 -0.839151 0.543302
+vn -0.181486 -0.845760 0.501749
+vn -0.154818 -0.897565 0.412806
+vn 0.153939 -0.833134 0.531216
+vn 0.203244 -0.723511 0.659715
+vn -0.160166 -0.838148 0.521397
+vn 0.035516 -0.885796 0.462714
+vn 0.065788 -0.979954 0.188048
+vn 0.503608 -0.755247 0.419501
+vn 0.503608 -0.755247 0.419501
+vn 0.000000 -0.955218 0.295901
+vn 0.000000 -0.736423 0.676522
+vn 0.000000 -0.137693 0.990475
+vn 0.000000 0.239035 0.971011
+vn 0.000000 0.975581 0.219640
+vn 0.000000 0.899669 0.436572
+vn 0.000000 0.999965 -0.008373
+vn -0.539974 -0.543198 0.642933
+vn -0.432124 -0.614984 0.659594
+vn -0.254939 -0.712767 0.653429
+vn -0.001390 -0.657256 0.753666
+vn 0.245628 -0.813313 0.527436
+vn 0.049520 -0.953536 0.297181
+vn -0.002561 -0.892701 0.450643
+vn 0.279879 -0.817326 0.503633
+vn 0.382111 -0.858242 0.342655
+vn 0.455666 -0.556788 0.694518
+vn 0.288397 -0.469365 0.834580
+vn 0.035903 -0.728345 0.684269
+vn 0.225022 -0.783683 0.578970
+vn 0.096271 -0.785732 0.611029
+vn 0.290087 -0.783678 0.549271
+vn -0.260149 -0.549274 0.794116
+vn -0.075542 -0.622886 0.778657
+vn -0.294450 -0.552395 0.779846
+vn -0.079074 -0.661674 0.745610
+vn 0.482030 -0.164384 0.860596
+vn 0.570599 -0.213178 0.793078
+vn 0.529929 -0.166882 0.831460
+vn 0.381012 -0.065065 0.922278
+vn 0.024463 -0.574971 0.817808
+vn 0.047406 -0.577530 0.814992
+vn 0.758442 0.103349 0.643495
+vn 0.787061 0.113574 0.606329
+vn 0.719660 0.007386 0.694288
+vn 0.830339 -0.026441 0.556631
+vn 0.671017 -0.510972 0.537256
+vn 0.716687 0.288252 0.635037
+vn 0.412036 -0.297118 0.861363
+vn 0.099628 -0.254804 0.961847
+vn -0.039558 -0.085696 0.995536
+vn -0.042344 0.306808 0.950829
+vn -0.152822 0.694791 0.702788
+vn 0.106852 0.856341 0.505236
+vn 0.000000 0.797506 0.603311
+vn -0.066242 0.316201 0.946377
+vn 0.359801 0.203293 0.910612
+vn 0.829355 0.197342 0.522711
+vn 0.855060 0.358262 0.374860
+vn 0.631815 0.517528 0.577039
+vn 0.754181 0.555497 0.350192
+vn 0.763622 0.564979 0.312539
+vn 0.569973 0.380670 0.728163
+vn 0.038842 0.489106 0.871359
+vn -0.119312 0.857426 0.500585
+vn 0.123194 0.919729 0.372722
+vn 0.000000 0.911884 0.410447
+vn 0.057892 0.973945 0.219272
+vn 0.971910 -0.015045 -0.234872
+vn 0.982671 0.152745 -0.105006
+vn 0.989576 0.127298 0.067334
+vn 0.990808 0.125867 0.049575
+vn 0.955027 0.264680 -0.133674
+vn 0.979671 0.189177 0.066758
+vn 0.935664 0.181119 -0.302867
+vn 0.909578 0.219625 -0.352751
+vn 0.915207 -0.032120 -0.401703
+vn 0.810834 -0.259329 -0.524688
+vn 0.955964 0.096867 -0.277039
+vn 0.971512 0.236046 -0.021138
+vn 0.983481 0.179876 -0.020242
+vn 0.036735 0.999290 -0.008368
+vn 0.539975 -0.543198 0.642933
+vn 0.432124 -0.614984 0.659594
+vn 0.254939 -0.712767 0.653429
+vn 0.001390 -0.657256 0.753666
+vn -0.245628 -0.813313 0.527435
+vn -0.049520 -0.953536 0.297180
+vn 0.002561 -0.892701 0.450642
+vn -0.279879 -0.817326 0.503633
+vn -0.382111 -0.858242 0.342655
+vn -0.455666 -0.556788 0.694518
+vn -0.288397 -0.469365 0.834580
+vn -0.035903 -0.728346 0.684269
+vn -0.225022 -0.783684 0.578969
+vn -0.096271 -0.785732 0.611029
+vn -0.290087 -0.783678 0.549271
+vn 0.260149 -0.549274 0.794116
+vn 0.075542 -0.622886 0.778657
+vn 0.294450 -0.552395 0.779846
+vn 0.079074 -0.661674 0.745610
+vn -0.482030 -0.164384 0.860596
+vn -0.570599 -0.213178 0.793078
+vn -0.529930 -0.166882 0.831460
+vn -0.381012 -0.065065 0.922278
+vn -0.024463 -0.574970 0.817808
+vn -0.047406 -0.577530 0.814992
+vn -0.758442 0.103349 0.643495
+vn -0.787061 0.113574 0.606329
+vn -0.719659 0.007386 0.694288
+vn -0.830339 -0.026441 0.556631
+vn -0.671017 -0.510972 0.537256
+vn -0.716687 0.288252 0.635036
+vn -0.412036 -0.297118 0.861363
+vn -0.099628 -0.254804 0.961847
+vn 0.039558 -0.085696 0.995536
+vn 0.042345 0.306808 0.950829
+vn 0.152822 0.694791 0.702788
+vn -0.106852 0.856341 0.505236
+vn 0.066242 0.316201 0.946377
+vn -0.359801 0.203293 0.910612
+vn -0.829355 0.197342 0.522711
+vn -0.855060 0.358262 0.374860
+vn -0.631815 0.517528 0.577039
+vn -0.754181 0.555497 0.350192
+vn -0.763622 0.564979 0.312539
+vn -0.569973 0.380670 0.728163
+vn -0.200036 0.917607 0.343487
+vn -0.038841 0.489106 0.871359
+vn 0.084659 0.869444 0.486723
+vn -0.004489 0.913716 0.406328
+vn -0.021067 0.923668 0.382615
+vn -0.159047 0.959604 0.232085
+vn -0.481166 0.868794 0.116947
+vn -0.971910 -0.015046 -0.234872
+vn -0.982671 0.152745 -0.105006
+vn -0.548986 0.835456 0.025059
+vn -0.989576 0.127298 0.067333
+vn -0.990808 0.125866 0.049575
+vn -0.955027 0.264680 -0.133674
+vn -0.979671 0.189177 0.066758
+vn -0.935664 0.181119 -0.302867
+vn -0.909578 0.219625 -0.352751
+vn -0.915207 -0.032120 -0.401703
+vn -0.810834 -0.259329 -0.524688
+vn -0.955964 0.096867 -0.277039
+vn -0.971512 0.236046 -0.021138
+vn -0.983481 0.179876 -0.020242
+vn -0.304106 0.952599 0.008666
+vn 0.259239 -0.575670 0.775499
+vn 0.292772 -0.695763 0.655895
+vn 0.252514 -0.908571 0.332770
+vn -0.447387 -0.672022 0.590112
+vn -0.448201 -0.705563 0.548905
+vn -0.392922 -0.702557 0.593318
+vn -0.148267 -0.787303 0.598474
+vn -0.255357 -0.812125 0.524640
+vn -0.320398 -0.591142 0.740200
+vn 0.021606 -0.908113 0.418167
+vn -0.146126 -0.853059 0.500937
+vn 0.252514 -0.908571 0.332770
+vn 0.190580 -0.959569 0.207139
+vn 0.292772 -0.695763 0.655895
+vn 0.259239 -0.575670 0.775499
+vn 0.142019 -0.941333 0.306142
+vn 0.092983 -0.887876 0.450588
+vn 0.106331 -0.819249 0.563493
+vn 0.106331 -0.819249 0.563493
+vn -0.235626 -0.662632 0.710914
+vn -0.113314 -0.647249 0.753809
+vn 0.032747 -0.736102 0.676078
+vn 0.053735 -0.832683 0.551137
+vn 0.032747 -0.736102 0.676078
+vn -0.113314 -0.647249 0.753809
+vn -0.235626 -0.662632 0.710914
+vn 0.010927 -0.620839 0.783862
+vn 0.746341 -0.142436 0.650144
+vn 0.886057 -0.445410 0.128506
+vn 0.896656 -0.270523 -0.350465
+vn 0.901020 -0.431982 -0.039433
+vn 0.795247 -0.490274 0.356670
+vn 0.746341 -0.142436 0.650144
+vn 0.603493 0.170092 0.779016
+vn 0.000000 -0.969186 -0.246329
+vn 0.000000 -0.969186 -0.246329
+vn 0.000000 -0.969186 -0.246329
+vn 0.000000 -0.969186 -0.246329
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn -0.627073 -0.111635 0.770920
+vn -0.627073 -0.111635 0.770920
+vn -0.595190 -0.161019 0.787287
+vn -0.595190 -0.161019 0.787287
+vn -0.656620 -0.061834 0.751682
+vn -0.656620 -0.061834 0.751682
+vn 0.672056 0.082543 0.735886
+vn 0.355352 0.041895 0.933793
+vn -0.592319 -0.120476 0.796645
+vn -0.705290 -0.153974 0.691996
+vn -0.394027 -0.066319 0.916703
+vn -0.287416 -0.062043 0.955794
+vn -0.133377 -0.051606 0.989721
+vn -0.011289 -0.026583 0.999583
+vn -0.403045 -0.127509 0.906254
+vn -0.483554 -0.241174 0.841434
+vn -0.629042 -0.383082 0.676428
+vn 0.630799 0.239138 0.738178
+vn 0.909154 0.166336 0.381801
+vn 0.987974 0.139405 0.066883
+vn 0.881686 0.108986 0.459077
+vn 0.868909 0.106364 0.483408
+vn 0.315172 0.017264 0.948878
+vn -0.684810 -0.208489 0.698260
+vn 0.733563 0.124545 0.668112
+vn 0.847229 0.211509 0.487306
+vn 0.750106 0.219929 0.623676
+vn 0.514252 0.297546 0.804370
+vn -0.581267 -0.154698 0.798872
+vn -0.380464 -0.066297 0.922416
+vn -0.232530 -0.056993 0.970918
+vn -0.088012 -0.068017 0.993795
+vn -0.901540 0.361228 0.238203
+vn 0.121934 -0.295563 0.947510
+vn 0.333598 -0.692258 0.639915
+vn 0.271413 -0.953085 0.134027
+vn 0.122922 -0.991509 0.042422
+vn -0.161390 -0.971826 -0.171780
+vn -0.513082 -0.767078 -0.385147
+vn -0.747126 -0.528200 -0.403493
+vn -0.004689 -0.056535 0.998390
+vn -0.888120 -0.279886 -0.364562
+vn -0.756085 -0.312526 -0.575033
+vn -0.465217 -0.484912 -0.740563
+vn -0.600584 -0.336332 -0.725382
+vn -0.791895 0.079491 -0.605462
+vn -0.979295 0.062696 0.192483
+vn -0.987994 0.081768 0.131082
+vn -0.971694 -0.000245 0.236243
+vn -0.979376 -0.167220 0.113400
+vn -0.987994 0.081768 0.131082
+vn -0.979295 0.062696 0.192483
+vn -0.971694 -0.000245 0.236243
+vn -0.979376 -0.167220 0.113400
+vn -0.958163 -0.286182 0.004922
+vn -0.354531 0.428477 0.831093
+vn -0.361400 0.361723 0.859387
+vn -0.387630 0.423647 0.818698
+vn -0.364148 0.430407 0.825922
+vn -0.394940 0.445507 0.803458
+vn -0.464628 0.200825 0.862432
+vn -0.452971 -0.021158 0.891274
+vn -0.449302 -0.007126 0.893352
+vn -0.460345 0.002674 0.887736
+vn -0.447709 -0.051573 0.892691
+vn -0.425665 -0.096364 0.899735
+vn -0.410701 -0.075548 0.908635
+vn -0.506335 -0.026854 0.861918
+vn -0.541817 0.061001 0.838280
+vn -0.554974 0.173119 0.813655
+vn -0.606292 0.103492 0.788479
+vn -0.404823 -0.048977 0.913083
+vn -0.492288 -0.027548 0.869996
+vn -0.491358 -0.022101 0.870677
+vn -0.483934 -0.065044 0.872684
+vn -0.470505 -0.095908 0.877170
+vn -0.468701 -0.116106 0.875693
+vn -0.665242 0.214803 0.715061
+vn -0.016858 0.670372 0.741834
+vn -0.595587 0.279938 0.752935
+vn -0.548995 0.204861 0.810331
+vn 0.010535 0.551230 0.834287
+vn -0.062663 0.213471 0.974938
+vn 0.165119 0.545669 0.821572
+vn 0.076401 0.723326 0.686267
+vn -0.601978 0.304844 0.738033
+vn -0.608014 0.128125 0.783520
+vn -0.321675 -0.108302 0.940636
+vn 0.120314 0.103516 0.987324
+vn -0.197704 0.542177 0.816674
+vn -0.446013 0.326971 0.833164
+vn -0.156908 0.456294 0.875885
+vn -0.168942 0.292593 0.941195
+vn -0.335480 0.253231 0.907374
+vn -0.444862 0.305537 0.841870
+vn -0.333315 0.348085 0.876207
+vn -0.420653 0.125147 0.898548
+vn -0.571431 -0.012155 0.820560
+vn -0.780122 -0.083273 0.620061
+vn -0.361209 0.029292 0.932025
+vn -0.382594 -0.093835 0.919139
+vn -0.688656 -0.218615 0.691347
+vn -0.528448 -0.163162 0.833139
+vn -0.540343 -0.080730 0.837563
+vn -0.724000 -0.096170 0.683064
+vn -0.685200 -0.104080 0.720880
+vn -0.651068 -0.147306 0.744588
+vn -0.629368 -0.180769 0.755790
+vn -0.633565 -0.196288 0.748375
+vn -0.652072 -0.273789 0.706995
+vn -0.832384 -0.166262 0.528672
+vn -0.744343 -0.248130 0.619989
+vn -0.730670 -0.290503 0.617842
+vn -0.749316 -0.378547 0.543349
+vn -0.797013 0.326747 -0.507943
+vn -0.950752 0.307872 0.035844
+vn -0.930675 0.357309 0.078581
+vn -0.935591 0.327946 0.130844
+vn -0.922135 0.361439 0.137947
+vn -0.620249 0.480142 0.620286
+vn -0.660932 0.493747 0.565140
+vn -0.687403 0.458399 0.563337
+vn -0.901677 0.351337 0.252073
+vn -0.888387 0.389753 0.242614
+vn -0.808058 0.406371 0.426502
+vn -0.827315 0.348580 0.440501
+vn -0.633442 0.428809 0.644107
+vn -0.515068 0.462280 0.721805
+vn -0.684726 0.326895 0.651376
+vn -0.419711 0.361219 0.832685
+vn -0.561359 0.201082 0.802772
+vn -0.466082 0.103907 0.878619
+vn -0.218659 0.331612 0.917726
+vn -0.399955 0.093929 0.911709
+vn 0.317084 -0.316295 0.894100
+vn 0.217677 -0.394486 0.892747
+vn 0.446178 -0.404349 0.798390
+vn -0.286324 0.406956 0.867413
+vn -0.440008 0.442910 0.781168
+vn -0.604948 0.225627 0.763630
+vn -0.708900 0.263736 0.654144
+vn -0.620996 0.283541 0.730731
+vn -0.471391 0.706010 0.528526
+vn 0.494493 0.022290 0.868896
+vn -0.081645 0.758667 0.646342
+vn -0.314889 0.818008 0.481361
+vn -0.381940 0.891911 0.242109
+vn -0.295807 0.907113 0.299407
+vn -0.063403 0.878951 0.472678
+vn 0.518829 0.151814 0.841290
+vn -0.233190 0.871844 0.430709
+vn 0.408115 0.174426 0.896113
+vn 0.230970 0.115807 0.966044
+vn -0.157661 0.014923 0.987381
+vn -0.589572 -0.019729 0.807475
+vn -0.722804 0.008457 0.691002
+vn -0.791895 0.079491 -0.605462
+vn -0.600584 -0.336332 -0.725382
+vn -0.465217 -0.484912 -0.740563
+vn -0.756085 -0.312526 -0.575033
+vn -0.888120 -0.279886 -0.364562
+vn -0.747126 -0.528200 -0.403493
+vn -0.513082 -0.767078 -0.385147
+vn -0.161390 -0.971826 -0.171780
+vn -0.041647 -0.976245 0.212628
+vn 0.132164 -0.876472 0.462957
+vn 0.441067 -0.806915 0.392871
+vn -0.622336 0.583674 0.521558
+vn 0.557382 -0.752183 0.351491
+vn -0.901540 0.361228 0.238203
+vn -0.783321 0.541586 0.305112
+vn 0.615491 -0.738999 0.273955
+vn 0.595928 -0.794386 0.117564
+vn 0.687678 -0.709875 0.152238
+vn 0.773549 -0.633595 -0.013403
+vn 0.834875 -0.550285 0.013046
+vn 0.829717 -0.551329 -0.087217
+vn 0.775534 -0.629547 0.047101
+vn 0.762020 -0.642569 -0.080184
+vn 0.775954 -0.630645 0.013500
+vn 0.701713 -0.711998 -0.025626
+vn 0.480682 -0.872693 0.085740
+vn 0.760446 -0.646635 0.059881
+vn 0.572235 -0.800166 0.179673
+vn 0.182950 -0.908112 0.376645
+vn 0.229092 -0.172632 0.957974
+vn 0.064898 0.677294 0.732845
+vn -0.054346 0.850959 0.522413
+vn 0.025155 0.784707 0.619356
+vn 0.111660 0.597000 0.794433
+vn 0.130412 0.483778 0.865420
+vn 0.125941 0.441113 0.888571
+vn 0.136030 0.428580 0.893205
+vn 0.497048 0.292541 0.816923
+vn 0.581760 0.320225 0.747671
+vn 0.566320 0.529324 0.631742
+vn 0.399080 0.839800 0.368064
+vn 0.165219 0.962939 0.213192
+vn -0.180975 -0.892235 0.413720
+vn -0.130051 -0.852940 0.505550
+vn 0.062184 -0.688056 0.722988
+vn -0.068609 -0.816413 0.573378
+vn 0.061690 -0.769669 0.635455
+vn 0.175486 -0.771548 0.611488
+vn 0.892300 0.172524 0.417177
+vn 0.955963 0.171365 0.238261
+vn 0.873843 0.206208 0.440315
+vn 0.896771 0.216759 0.385768
+vn 0.874857 0.211666 0.435686
+vn 0.899490 0.211098 0.382565
+vn 0.875055 0.165775 0.454750
+vn 0.878962 0.165507 0.447251
+vn 0.426812 0.324483 0.844122
+vn 0.150214 0.365475 0.918621
+vn 0.080542 0.963814 0.254115
+vn 0.058293 0.238730 0.969335
+vn 0.058293 0.238730 0.969335
+vn 0.206539 -0.059777 0.976611
+vn -0.797013 0.326747 -0.507943
+vn 0.880669 0.068701 0.468725
+vn 0.890117 0.075529 0.449431
+vn 0.690705 0.079408 0.718763
+vn 0.394663 0.066423 0.916422
+vn -0.723350 -0.098931 0.683358
+vn -0.602617 -0.086043 0.793378
+vn -0.407468 -0.066327 0.910808
+vn -0.341247 -0.066881 0.937591
+vn -0.178897 -0.034900 0.983249
+vn -0.017878 0.003394 0.999834
+vn -0.402357 -0.193102 0.894886
+vn -0.490618 -0.333994 0.804824
+vn -0.561338 -0.462945 0.685990
+vn 0.542180 0.369117 0.754846
+vn 0.538713 0.356049 0.763556
+vn 0.452695 0.343682 0.822770
+vn 0.291626 0.335422 0.895793
+vn 0.226947 0.277663 0.933487
+vn 0.237941 0.227136 0.944348
+vn 0.237941 0.227136 0.944348
+vn 0.226947 0.277663 0.933487
+vn 0.291626 0.335422 0.895793
+vn 0.452695 0.343682 0.822770
+vn 0.538713 0.356049 0.763556
+vn 0.522250 0.508353 0.684714
+vn 0.518989 0.574123 0.633272
+vn 0.522428 0.591810 0.613865
+vn 0.516000 0.605509 0.605890
+vn 0.517128 0.565105 0.642833
+vn -0.918894 -0.353792 0.174546
+vn -0.918894 -0.353792 0.174546
+vn -0.873309 -0.487103 0.007921
+vn -0.853171 -0.521407 0.015309
+vn -0.880686 -0.471698 0.043516
+vn -0.882640 -0.465839 0.062778
+vn -0.888832 -0.450220 0.085324
+vn -0.893194 -0.429553 0.132995
+vn -0.840967 -0.539308 0.043839
+vn -0.840967 -0.539308 0.043839
+vn -0.853171 -0.521407 0.015309
+vn -0.873309 -0.487103 0.007921
+vn -0.880686 -0.471698 0.043516
+vn -0.882640 -0.465839 0.062778
+vn -0.888832 -0.450220 0.085324
+vn -0.893194 -0.429553 0.132995
+vn -0.939475 -0.288121 0.185400
+vn -0.939475 -0.288121 0.185400
+vn -0.573576 0.664666 0.478780
+vn -0.449451 0.630971 0.632352
+vn -0.349559 0.679393 0.645162
+vn -0.483576 0.704932 0.518869
+vn -0.223400 0.704019 0.674129
+vn -0.420007 0.686787 0.593227
+vn -0.223976 0.672852 0.705057
+vn -0.534282 0.599622 0.595816
+vn -0.170947 0.530884 0.830024
+vn -0.593948 0.416422 0.688345
+vn -0.088895 0.494920 0.864380
+vn -0.582938 0.296662 0.756422
+vn -0.300255 0.750204 0.589102
+vn -0.775652 0.350674 0.524778
+vn -0.506342 0.824002 0.254240
+vn -0.901844 0.276854 0.331707
+vn -0.530901 0.825210 0.192801
+vn -0.911424 0.209264 0.354280
+vn -0.674685 0.671689 0.305995
+vn -0.600817 0.706114 0.374730
+vn -0.598850 0.637791 0.484357
+vn -0.787274 0.455514 0.415581
+vn -0.890739 0.213891 0.401041
+vn -0.904150 0.012157 0.427042
+vn -0.948872 -0.157890 0.273336
+vn -0.877723 -0.406240 0.254108
+vn -0.790425 -0.521832 0.320811
+vn -0.686048 0.709282 0.162040
+vn -0.749420 0.614790 0.245770
+vn -0.719531 0.663693 0.204416
+vn -0.749420 0.614790 0.245770
+vn -0.719531 0.663693 0.204416
+vn -0.686048 0.709282 0.162040
+vn -0.624079 -0.343144 0.701981
+vn -0.523755 -0.440076 0.729393
+vn -0.412846 -0.528113 0.742061
+vn -0.412846 -0.528113 0.742061
+vn -0.523755 -0.440076 0.729393
+vn -0.624079 -0.343144 0.701981
+vn -0.808537 -0.027561 0.587799
+vn -0.946588 -0.259753 0.191047
+vn -0.976977 -0.117484 0.178080
+vn -0.968393 0.151657 0.198029
+vn -0.897670 0.126681 0.422067
+vn 0.161109 0.780577 0.603940
+vn 0.158318 0.581766 0.797799
+vn 0.049724 0.650732 0.757677
+vn 0.294269 0.500087 0.814444
+vn -0.221684 0.390190 0.893649
+vn 0.190112 0.648891 0.736748
+vn -0.706576 0.359084 0.609761
+vn 0.094556 0.527366 0.844360
+vn -0.352175 0.618989 0.702015
+vn -0.292781 0.685325 0.666790
+vn -0.102978 0.685603 0.720655
+vn 0.249493 0.570902 0.782192
+vn 0.330858 0.531987 0.779438
+vn 0.222929 0.657917 0.719338
+vn 0.362748 0.663553 0.654302
+vn 0.503150 0.560902 0.657442
+vn 0.517499 0.519483 0.679950
+vn 0.609163 0.521054 0.597849
+vn 0.674086 0.561273 0.480188
+vn 0.663502 0.590652 0.459232
+vn 0.138923 0.765759 0.627944
+vn 0.188934 0.760750 0.620938
+vn 0.607112 0.552177 0.571415
+vn 0.216672 0.742646 0.633664
+vn 0.573847 0.634858 0.517354
+vn 0.690702 0.510844 0.511829
+vn 0.608543 0.641438 0.467153
+vn 0.606077 0.680336 0.412085
+vn 0.336308 0.727851 0.597603
+vn 0.734526 0.329784 0.593056
+vn -0.538953 0.672200 0.507618
+vn -0.598071 0.707983 0.375594
+vn -0.799700 0.536873 0.268788
+vn -0.968393 0.151657 0.198029
+vn -0.976977 -0.117484 0.178080
+vn -0.969154 -0.240242 -0.055004
+vn -0.911138 -0.400370 -0.097628
+vn -0.825038 -0.548157 -0.137243
+vn -0.969154 -0.240242 -0.055004
+vn -0.911138 -0.400370 -0.097628
+vn -0.825038 -0.548157 -0.137243
+vn -0.685358 -0.609169 0.398996
+vn -0.908196 -0.399594 0.124519
+vn -0.992916 0.114305 0.032444
+vn -0.725233 0.685652 -0.062598
+vn -0.553728 0.822869 -0.127560
+vn -0.510606 0.851370 -0.120210
+vn -0.454586 0.886914 -0.082067
+vn -0.358454 0.924533 -0.129417
+vn -0.317834 0.923624 -0.214245
+vn -0.508410 0.824929 -0.247006
+vn -0.458281 0.880058 -0.124404
+vn -0.739797 0.653721 -0.159215
+vn -0.631641 0.774740 -0.028426
+vn -0.479826 0.874937 -0.065214
+vn -0.618842 0.785232 0.021114
+vn -0.889425 0.401034 0.219305
+vn -0.788703 0.528438 0.314167
+vn -0.857543 0.476294 0.194329
+vn -0.940500 0.005865 0.339743
+vn -0.799637 -0.224017 0.557133
+vn -0.801226 0.237059 0.549400
+vn -0.609476 -0.484447 0.627575
+vn -0.532749 -0.668924 0.518381
+vn -0.660939 -0.473982 0.581808
+vn -0.660939 -0.473982 0.581808
+vn -0.382862 -0.298558 0.874231
+vn -0.534605 -0.313203 0.784921
+vn -0.534605 -0.313203 0.784921
+vn -0.990379 0.107971 0.086556
+vn -0.969323 0.245672 -0.007583
+vn -0.990379 0.107971 0.086556
+vn -0.983439 -0.032782 0.178248
+vn -0.983439 -0.032782 0.178248
+vn 0.404293 0.619664 0.672729
+vn 0.385349 0.568001 0.727242
+vn 0.364093 0.512929 0.777393
+vn 0.364093 0.512929 0.777393
+vn 0.385349 0.568001 0.727242
+vn 0.404293 0.619664 0.672729
+vn -0.985796 -0.167945 0.000465
+vn -0.778043 0.598595 0.190612
+vn -0.751639 0.587080 0.300625
+vn -0.766080 0.593799 0.246017
+vn -0.751639 0.587080 0.300625
+vn -0.958606 0.231252 0.166122
+vn -0.999784 0.006265 0.019802
+vn -0.908125 0.401678 0.118170
+vn -0.969395 0.213606 0.121025
+vn -0.863863 0.469643 0.182144
+vn -0.967841 -0.212061 0.135329
+vn -0.934771 -0.122424 0.333491
+vn -0.966841 -0.236496 0.096372
+vn -0.864995 -0.403512 0.298263
+vn -0.657194 -0.315436 0.684541
+vn -0.855626 -0.515742 -0.043749
+vn -0.401241 -0.822345 0.403429
+vn -0.016253 -0.672912 0.739543
+vn -0.458559 -0.878176 -0.136129
+vn -0.167694 -0.811742 0.559423
+vn -0.162091 -0.867926 0.469501
+vn 0.055812 -0.907537 0.416247
+vn -0.164743 -0.833134 0.527965
+vn -0.111008 -0.862968 0.492913
+vn 0.036157 -0.649107 0.759837
+vn -0.409036 -0.479597 0.776322
+vn -0.350569 -0.877673 0.326791
+vn -0.279102 -0.813752 0.509814
+vn -0.112154 -0.909906 0.399365
+vn 0.172801 -0.871154 0.459599
+vn 0.118625 -0.732635 0.670205
+vn -0.058564 -0.617013 0.784771
+vn -0.449750 -0.489164 0.747291
+vn 0.092894 -0.670789 0.735807
+vn 0.127579 -0.700458 0.702198
+vn 0.443133 -0.757984 0.478637
+vn 0.198678 -0.915048 0.351019
+vn -0.260088 -0.946106 -0.192970
+vn -0.212615 -0.963717 -0.161381
+vn -0.247816 -0.931012 0.267961
+vn -0.126413 -0.923683 0.361703
+vn 0.025451 -0.839151 0.543302
+vn 0.181486 -0.845760 0.501749
+vn 0.154818 -0.897565 0.412806
+vn -0.153939 -0.833134 0.531216
+vn -0.203244 -0.723511 0.659715
+vn 0.160166 -0.838148 0.521397
+vn -0.035516 -0.885796 0.462713
+vn -0.065788 -0.979954 0.188048
+vn -0.503608 -0.755248 0.419500
+vn -0.503608 -0.755248 0.419500
+vn -0.259239 -0.575670 0.775499
+vn -0.292772 -0.695763 0.655895
+vn -0.252515 -0.908571 0.332770
+vn 0.447387 -0.672022 0.590112
+vn 0.448201 -0.705563 0.548905
+vn 0.392922 -0.702557 0.593318
+vn 0.148267 -0.787303 0.598474
+vn 0.255357 -0.812125 0.524640
+vn 0.320398 -0.591142 0.740200
+vn -0.021606 -0.908113 0.418167
+vn 0.146126 -0.853059 0.500937
+vn -0.252515 -0.908571 0.332770
+vn -0.190580 -0.959569 0.207139
+vn -0.292772 -0.695763 0.655895
+vn -0.259239 -0.575670 0.775499
+vn -0.142019 -0.941333 0.306142
+vn -0.092983 -0.887876 0.450588
+vn -0.106331 -0.819249 0.563493
+vn -0.106331 -0.819249 0.563493
+vn 0.235626 -0.662632 0.710915
+vn 0.113314 -0.647249 0.753810
+vn -0.032747 -0.736102 0.676078
+vn -0.053735 -0.832683 0.551137
+vn -0.032747 -0.736102 0.676078
+vn 0.113314 -0.647249 0.753810
+vn 0.235626 -0.662632 0.710915
+vn -0.010927 -0.620839 0.783862
+vn -0.746341 -0.142436 0.650144
+vn -0.886057 -0.445410 0.128507
+vn -0.896656 -0.270523 -0.350465
+vn -0.901020 -0.431982 -0.039433
+vn -0.795247 -0.490273 0.356670
+vn -0.746341 -0.142436 0.650144
+vn -0.603493 0.170092 0.779016
+vn -0.699043 -0.517867 0.493105
+vn 0.284599 -0.717583 0.635671
+vn 0.223723 -0.905973 0.359391
+vn 0.185453 -0.407658 0.894104
+vn 0.125021 -0.816910 0.563053
+vn 0.038506 -0.992125 0.119187
+vn 0.144397 0.082654 0.986062
+vn -0.084362 0.056888 0.994810
+vn -0.558607 -0.293997 0.775580
+vn -0.722188 -0.541797 0.430001
+vn -0.730028 -0.559390 0.392609
+vn -0.036857 -0.535234 0.843899
+vn -0.272377 -0.479566 0.834163
+vn -0.531875 -0.594230 0.603325
+vn -0.630713 -0.679417 0.374957
+vn -0.673974 -0.647421 0.355816
+vn -0.203718 -0.922848 0.326879
+vn -0.362993 -0.832391 0.418761
+vn -0.446477 -0.814356 0.370785
+vn -0.521437 -0.795245 0.309336
+vn -0.043830 -0.538842 0.841266
+vn -0.050004 -0.593631 0.803183
+vn 0.039861 -0.455655 0.889264
+vn -0.056481 -0.298694 0.952676
+vn -0.228791 -0.474494 0.850006
+vn -0.471892 -0.706179 0.527853
+vn -0.587768 -0.699320 0.406792
+vn -0.493489 -0.765703 0.412512
+vn -0.146023 -0.728648 0.669141
+vn -0.017987 -0.615525 0.787912
+vn -0.032276 -0.534983 0.844246
+vn 0.050543 -0.605265 0.794418
+vn -0.031212 -0.555987 0.830605
+vn -0.419214 -0.696423 0.582456
+vn -0.527791 -0.635917 0.563068
+vn -0.307593 -0.508399 0.804312
+vn -0.203572 -0.589057 0.782029
+vn 0.028540 -0.652699 0.757079
+vn 0.085700 -0.639657 0.763868
+vn 0.018446 -0.538217 0.842604
+vn 0.699043 -0.517867 0.493105
+vn -0.284598 -0.717584 0.635671
+vn -0.223723 -0.905973 0.359390
+vn -0.185452 -0.407659 0.894104
+vn -0.125021 -0.816910 0.563052
+vn -0.038506 -0.992125 0.119186
+vn -0.144397 0.082654 0.986062
+vn 0.084362 0.056888 0.994810
+vn 0.558607 -0.293997 0.775580
+vn 0.722188 -0.541797 0.430000
+vn 0.730029 -0.559389 0.392609
+vn 0.036857 -0.535235 0.843899
+vn 0.272377 -0.479566 0.834163
+vn 0.531875 -0.594230 0.603324
+vn 0.630714 -0.679417 0.374956
+vn 0.673974 -0.647421 0.355816
+vn 0.203719 -0.922849 0.326878
+vn 0.362993 -0.832391 0.418761
+vn 0.446477 -0.814356 0.370785
+vn 0.521437 -0.795245 0.309336
+vn 0.043830 -0.538842 0.841266
+vn 0.050003 -0.593631 0.803182
+vn -0.039862 -0.455655 0.889264
+vn 0.056481 -0.298694 0.952676
+vn 0.228791 -0.474494 0.850006
+vn 0.471892 -0.706180 0.527852
+vn 0.587768 -0.699321 0.406792
+vn 0.493488 -0.765704 0.412513
+vn 0.146022 -0.728648 0.669141
+vn 0.017987 -0.615525 0.787912
+vn 0.032276 -0.534983 0.844246
+vn -0.050543 -0.605265 0.794418
+vn 0.031212 -0.555987 0.830605
+vn 0.419213 -0.696423 0.582457
+vn 0.527791 -0.635917 0.563068
+vn 0.307593 -0.508399 0.804312
+vn 0.203572 -0.589057 0.782030
+vn -0.028541 -0.652699 0.757079
+vn -0.085700 -0.639657 0.763868
+vn -0.018446 -0.538217 0.842604
+vn -0.042467 -0.350109 0.935746
+vn 0.032358 0.013495 0.999385
+vn 0.000000 0.009058 0.999959
+vn 0.000000 -0.357516 0.933907
+vn -0.019243 -0.343167 0.939077
+vn -0.110977 -0.662777 0.740548
+vn 0.000000 -0.673370 0.739306
+vn -0.191956 -0.647972 0.737078
+vn -0.032358 0.013495 0.999385
+vn 0.042467 -0.350109 0.935746
+vn 0.019243 -0.343167 0.939077
+vn 0.110978 -0.662777 0.740548
+vn 0.191956 -0.647972 0.737078
+vn -0.270387 0.410353 0.870920
+vn -0.105769 0.425786 0.898621
+vn -0.270387 0.410353 0.870920
+vn -0.501858 0.419546 0.756386
+vn -0.501858 0.419546 0.756386
+vn -0.533126 0.638612 0.554933
+vn -0.533126 0.638612 0.554933
+vn -0.466699 0.791727 0.394157
+vn -0.466699 0.791727 0.394157
+vn -0.952014 -0.262935 -0.156637
+vn -0.980456 -0.146404 -0.131425
+vn -0.890722 -0.447672 -0.078768
+vn -0.909884 -0.414253 0.022464
+vn -0.750245 0.044436 0.659665
+vn -0.918125 -0.127931 0.375073
+vn -0.990390 -0.066207 -0.121423
+vn -0.966380 -0.119457 -0.227684
+vn -0.961455 -0.171437 -0.214973
+vn -0.940890 -0.281455 -0.188440
+vn -0.871784 -0.478259 -0.106120
+vn -0.855293 -0.512673 -0.075098
+vn -0.882476 -0.458987 0.102799
+vn -0.936246 -0.210295 -0.281460
+vn -0.960482 -0.154544 -0.231496
+vn -0.942102 -0.281316 -0.182497
+vn -0.935227 -0.344762 0.080557
+vn -0.935892 -0.310618 0.166201
+vn -0.808334 -0.574003 0.130833
+vn -0.647675 -0.751602 0.124946
+vn -0.587775 -0.801059 -0.113246
+vn -0.831664 -0.447963 0.328121
+vn -0.954065 -0.077913 -0.289292
+vn -0.995249 -0.016350 -0.095982
+vn -0.907408 -0.250137 -0.337700
+vn -0.857955 -0.507869 0.077344
+vn -0.976898 -0.202764 -0.067500
+vn -0.883889 -0.433015 0.176742
+vn -0.979638 -0.200574 -0.008969
+vn -0.941418 -0.245395 0.231328
+vn -0.981620 -0.144393 0.124793
+vn -0.978947 -0.109001 0.172574
+vn -0.935991 -0.189747 0.296507
+vn -0.899077 -0.182951 0.397729
+vn -0.745436 -0.536030 0.396229
+vn -0.797983 -0.320094 0.510650
+vn -0.906001 -0.195175 0.375592
+vn -0.953837 -0.208375 0.216275
+vn -0.913666 -0.272554 0.301545
+vn -0.922710 -0.264441 0.280495
+vn -0.882222 -0.261769 0.391358
+vn -0.866761 -0.309337 0.391199
+vn -0.818278 -0.315496 0.480503
+vn -0.830459 -0.351032 0.432567
+vn -0.808037 -0.215202 0.548419
+vn -0.969678 -0.148208 0.194316
+vn -0.922470 -0.252269 0.292249
+vn -0.867244 -0.318435 0.382738
+vn -0.836261 -0.340015 0.430184
+vn -0.984749 -0.050019 0.166636
+vn -0.923911 -0.145237 0.353971
+vn -0.981118 -0.099794 0.165675
+vn -0.944614 -0.194537 0.264309
+vn -0.880393 -0.291015 0.374457
+vn -0.824837 -0.315373 0.469238
+vn -0.867338 -0.331298 0.371439
+vn -0.821682 -0.474521 0.315705
+vn -0.622916 -0.484375 0.614294
+vn -0.987857 -0.135015 0.076870
+vn -0.979930 -0.195497 0.038967
+vn -0.979199 -0.164018 0.119446
+vn -0.949129 -0.225368 0.219914
+vn -0.886606 -0.298748 0.353099
+vn -0.708787 -0.249233 0.659927
+vn -0.678444 -0.409568 0.609892
+vn -0.642536 -0.219827 0.734046
+vn -0.442992 -0.162265 0.881719
+vn -0.858498 -0.229279 0.458708
+vn -0.925715 -0.225640 0.303543
+vn -0.972152 -0.187798 0.140186
+vn -0.909095 -0.174774 0.378154
+vn -0.930710 -0.126967 0.343014
+vn -0.963417 -0.107897 0.245326
+vn -0.918487 -0.113375 0.378849
+vn -0.987337 -0.051872 0.149917
+vn -0.954725 -0.056138 0.292145
+vn -0.793642 -0.245089 0.556834
+vn -0.864674 -0.261001 0.429205
+vn -0.841018 -0.069239 0.536558
+vn -0.668765 -0.107613 0.735645
+vn -0.383153 -0.167862 0.908304
+vn -0.690412 -0.337410 0.639911
+vn -0.470954 -0.330356 0.817965
+vn -0.716078 -0.513890 0.472386
+vn -0.635659 -0.745485 0.200472
+vn -0.672918 -0.288018 0.681342
+vn -0.502514 -0.864351 -0.019426
+vn -0.489068 -0.863343 -0.124305
+vn -0.504481 -0.846857 0.168320
+vn -0.402408 -0.915304 0.016936
+vn -0.380776 -0.923102 -0.053776
+vn -0.374887 -0.916704 -0.138250
+vn -0.756917 -0.386773 0.526766
+vn -0.763653 -0.273459 0.584854
+vn -0.456364 -0.805486 0.378054
+vn -0.288102 -0.949738 0.122456
+vn -0.204438 -0.976318 0.070776
+vn -0.224124 -0.973921 0.035305
+vn -0.245111 -0.968799 0.036716
+vn -0.262883 -0.962136 -0.072016
+vn -0.231176 -0.957851 -0.170524
+vn -0.217169 -0.775478 0.592850
+vn -0.147784 -0.957533 0.247569
+vn -0.004565 -0.799001 0.601312
+vn 0.017991 -0.918876 0.394137
+vn 0.000000 -0.795542 0.605899
+vn 0.000000 -0.918713 0.394925
+vn -0.035993 -0.953102 0.300502
+vn 0.000000 -0.953121 0.302591
+vn 0.000000 -0.998422 0.056155
+vn -0.063904 -0.996653 0.050974
+vn 0.000000 -0.998107 0.061495
+vn -0.075869 -0.995651 0.054062
+vn -0.089385 -0.994760 0.049628
+vn 0.000000 -0.998635 0.052236
+vn -0.120252 -0.988258 -0.094268
+vn 0.000000 -0.994159 -0.107922
+vn -0.130043 -0.973060 -0.190374
+vn 0.000000 -0.980614 -0.195948
+vn -0.122150 -0.975119 -0.184991
+vn 0.000000 -0.984463 -0.175591
+vn -0.164304 -0.967025 -0.194593
+vn -0.621329 -0.134111 0.771987
+vn -0.353151 -0.250206 0.901488
+vn -0.041579 -0.437559 0.898228
+vn 0.000000 -0.314285 0.949329
+vn -0.061287 -0.339315 0.938674
+vn -0.086949 -0.464824 0.881124
+vn -0.289941 -0.229837 0.929037
+vn 0.000000 -0.384634 0.923069
+vn 0.000000 -0.527299 0.849680
+vn -0.395235 0.108735 0.912122
+vn -0.436901 -0.057248 0.897686
+vn -0.605873 0.057070 0.793512
+vn -0.691440 0.073643 0.718670
+vn -0.638897 -0.096424 0.763225
+vn -0.628759 -0.252843 0.735345
+vn -0.544124 -0.216863 0.810494
+vn -0.578730 -0.180551 0.795282
+vn -0.645211 -0.013591 0.763883
+vn -0.475512 -0.100011 0.874006
+vn -0.390824 -0.085748 0.916463
+vn 0.000000 -0.053110 0.998589
+vn -0.567764 -0.282574 0.773173
+vn -0.575355 -0.369817 0.729522
+vn -0.513299 -0.424267 0.746004
+vn -0.557132 -0.448099 0.699150
+vn -0.548898 -0.373155 0.747975
+vn -0.478887 -0.475925 0.737674
+vn -0.617962 -0.430917 0.657597
+vn 0.000000 -0.066706 0.997773
+vn -0.329623 -0.110896 0.937577
+vn -0.445591 -0.208021 0.870733
+vn -0.381992 -0.483105 0.787840
+vn -0.386579 -0.594777 0.704838
+vn -0.216527 -0.538921 0.814052
+vn -0.169084 -0.732456 0.659484
+vn 0.000000 -0.555852 0.831281
+vn 0.000000 -0.766300 0.642482
+vn 0.000000 -0.545494 0.838115
+vn -0.270635 -0.548378 0.791226
+vn -0.396435 -0.543115 0.740179
+vn -0.570879 -0.446838 0.688792
+vn -0.624007 -0.336884 0.705071
+vn -0.578007 -0.266686 0.771224
+vn 0.000000 -0.339882 0.940468
+vn -0.319217 -0.378810 0.868679
+vn -0.238897 -0.559967 0.793326
+vn -0.491634 -0.552992 0.672678
+vn -0.649406 -0.462970 0.603267
+vn -0.692537 -0.019397 0.721122
+vn -0.650763 0.121746 0.749457
+vn -0.634170 0.041017 0.772105
+vn -0.395205 -0.075946 0.915448
+vn -0.359372 -0.099091 0.927918
+vn 0.000000 -0.088823 0.996047
+vn 0.000000 0.360038 0.932938
+vn -0.287402 0.308714 0.906695
+vn -0.354807 0.275116 0.893545
+vn -0.592048 0.140416 0.793576
+vn -0.637150 0.033288 0.770021
+vn -0.398905 -0.526217 0.750979
+vn -0.618180 -0.087493 0.781152
+vn -0.512457 0.322559 0.795829
+vn -0.318457 0.465784 0.825609
+vn -0.178960 0.417486 0.890886
+vn 0.000000 0.476430 0.879213
+vn -0.487906 -0.431401 0.758842
+vn -0.483722 0.089844 0.870598
+vn -0.379428 -0.027096 0.924825
+vn -0.252160 -0.225711 0.940994
+vn 0.000000 -0.253897 0.967231
+vn -0.273597 -0.802168 0.530728
+vn 0.000000 -0.847446 0.530882
+vn -0.231462 -0.812863 0.534490
+vn -0.236908 -0.805986 0.542459
+vn 0.000000 -0.821576 0.570098
+vn -0.250030 -0.797610 0.548912
+vn -0.238041 -0.783912 0.573427
+vn -0.239039 -0.776186 0.583434
+vn -0.443288 -0.725499 0.526447
+vn -0.598994 -0.456011 0.658225
+vn -0.429183 -0.300884 0.851628
+vn -0.387573 -0.321812 0.863843
+vn -0.294932 -0.391271 0.871735
+vn 0.000000 -0.430292 0.902690
+vn -0.456505 -0.571068 0.682265
+vn -0.225894 -0.560651 0.796645
+vn -0.125863 -0.619219 0.775065
+vn -0.512130 -0.408450 0.755574
+vn -0.481812 -0.448555 0.752765
+vn -0.418851 -0.443982 0.792114
+vn -0.529444 -0.377328 0.759811
+vn -0.552559 -0.238810 0.798529
+vn -0.352537 -0.066139 0.933458
+vn -0.477995 -0.108156 0.871678
+vn -0.365297 0.021114 0.930651
+vn -0.309476 0.077575 0.947738
+vn 0.000000 0.061022 0.998136
+vn -0.468673 -0.193955 0.861816
+vn -0.393465 -0.302198 0.868252
+vn -0.435525 -0.381572 0.815304
+vn -0.661919 -0.278359 0.695974
+vn -0.404049 -0.256486 0.878043
+vn -0.233462 -0.141439 0.962024
+vn -0.391302 0.171539 0.904133
+vn -0.501513 0.191642 0.843657
+vn -0.290551 0.210412 0.933438
+vn -0.361013 0.019272 0.932362
+vn 0.000000 -0.020423 0.999791
+vn -0.534184 -0.058804 0.843320
+vn -0.335099 0.030481 0.941690
+vn -0.200182 -0.015059 0.979643
+vn -0.676716 -0.151883 0.720408
+vn -0.441583 -0.179665 0.879048
+vn -0.666688 0.081829 0.740832
+vn -0.966686 -0.173590 0.188106
+vn -0.932960 -0.136234 0.333206
+vn -0.548535 -0.302365 0.779541
+vn -0.129200 -0.313000 0.940924
+vn -0.435133 -0.427967 0.792151
+vn 0.000000 -0.815243 0.579119
+vn -0.727933 -0.128099 0.673575
+vn -0.877700 0.026049 0.478501
+vn -0.868641 0.032692 0.494362
+vn -0.847829 -0.114537 0.517751
+vn -0.717016 -0.264832 0.644788
+vn -0.834325 -0.034975 0.550162
+vn -0.883811 0.024081 0.467224
+vn -0.957092 -0.185074 0.222985
+vn -0.569079 -0.679037 0.463744
+vn 0.140199 -0.928946 0.342641
+vn -0.743054 -0.586543 0.322239
+vn -0.879801 -0.130693 0.457023
+vn -0.452351 -0.144257 0.880096
+vn -0.359851 -0.032581 0.932441
+vn -0.411625 -0.071366 0.908555
+vn -0.642403 -0.101305 0.759641
+vn -0.481087 -0.243058 0.842305
+vn -0.452434 -0.306952 0.837308
+vn -0.446193 -0.231764 0.864406
+vn -0.866507 -0.042473 0.497355
+vn -0.870409 -0.387642 0.303516
+vn -0.834596 -0.026340 0.550232
+vn -0.903313 0.003019 0.428972
+vn -0.831958 -0.248661 0.495997
+vn -0.745913 0.016230 0.665846
+vn -0.689975 0.062932 0.721092
+vn -0.320354 0.044276 0.946263
+vn -0.465763 -0.064939 0.882524
+vn -0.563892 -0.276189 0.778296
+vn -0.511860 -0.627405 0.586824
+vn 0.000000 -0.793339 0.608781
+vn 0.000000 -0.430480 0.902600
+vn -0.372246 0.009748 0.928083
+vn 0.000000 -0.083393 0.996517
+vn -0.262328 -0.957610 -0.119029
+vn 0.000000 -0.999508 0.031377
+vn -0.259302 -0.910269 -0.322758
+vn -0.038100 -0.938179 -0.344048
+vn 0.147260 -0.986968 -0.064868
+vn -0.173697 -0.982288 -0.070287
+vn 0.000000 -0.997450 -0.071371
+vn 0.000000 0.068246 0.997669
+vn 0.000000 -0.023245 0.999730
+vn -0.476302 -0.002893 0.879277
+vn 0.000000 -0.031220 0.999513
+vn -0.689723 0.028653 0.723507
+vn -0.804070 0.054918 0.591993
+vn -0.668285 0.120039 0.734156
+vn -0.818452 0.111155 0.563721
+vn -0.507929 0.139820 0.849976
+vn 0.000000 0.155850 0.987781
+vn -0.760442 0.036534 0.648377
+vn -0.806583 0.121802 0.578435
+vn -0.489838 -0.094281 0.866701
+vn -0.348316 -0.039260 0.936555
+vn -0.547406 0.028820 0.836371
+vn 0.000000 0.032871 0.999460
+vn -0.645014 -0.010417 0.764100
+vn -0.786001 -0.145157 0.600942
+vn -0.830260 -0.257130 0.494523
+vn 0.000000 -0.560395 0.828225
+vn -0.517422 -0.499928 0.694512
+vn -0.551275 -0.507531 0.662200
+vn -0.550581 -0.587067 0.593476
+vn -0.653781 -0.618140 0.436432
+vn 0.000000 -0.589548 0.807733
+vn -0.365876 -0.653625 0.662502
+vn -0.370038 -0.728041 0.577086
+vn -0.325447 -0.764693 0.556173
+vn -0.273021 -0.509246 0.816167
+vn 0.000000 -0.419293 0.907851
+vn -0.163589 -0.611286 0.774318
+vn -0.173654 -0.441360 0.880367
+vn 0.000000 -0.321958 0.946754
+vn -0.063640 -0.439167 0.896149
+vn -0.021257 -0.200021 0.979561
+vn -0.161815 -0.363628 0.917383
+vn 0.000000 -0.113091 0.993585
+vn 0.015283 -0.080866 0.996608
+vn 0.000000 -0.093188 0.995649
+vn -0.041156 -0.179251 0.982942
+vn 0.000000 -0.184602 0.982813
+vn -0.074307 -0.123251 0.989590
+vn -0.009657 -0.101854 0.994753
+vn -0.026243 -0.130211 0.991139
+vn -0.896280 -0.072788 0.437475
+vn -0.891806 -0.074388 0.446261
+vn -0.845339 -0.069647 0.529671
+vn -0.891887 -0.175856 0.416668
+vn -0.838651 -0.217689 0.499276
+vn -0.858102 -0.238460 0.454751
+vn -0.802411 -0.169881 0.572080
+vn -0.798795 0.004094 0.601589
+vn -0.532479 -0.129885 0.836419
+vn -0.563183 -0.039333 0.825396
+vn -0.619724 -0.173675 0.765362
+vn -0.608674 -0.211802 0.764628
+vn -0.785540 -0.197828 0.586336
+vn -0.824542 -0.140038 0.548197
+vn -0.789343 -0.176661 0.587987
+vn -0.766768 -0.046604 0.640231
+vn -0.465704 0.084934 0.880855
+vn -0.525843 -0.111551 0.843235
+vn -0.122270 -0.205991 0.970885
+vn -0.097209 -0.329188 0.939247
+vn -0.196417 -0.133287 0.971419
+vn -0.162640 -0.087052 0.982838
+vn -0.101349 -0.037653 0.994138
+vn -0.166564 0.098801 0.981068
+vn -0.440641 0.450782 0.776293
+vn -0.301292 0.258709 0.917765
+vn -0.686632 0.254326 0.681069
+vn -0.042423 -0.336081 0.940877
+vn -0.111689 -0.378002 0.919043
+vn -0.088696 -0.037132 0.995366
+vn -0.140346 -0.131793 0.981292
+vn 0.000000 -0.167991 0.985789
+vn -0.146236 -0.072286 0.986605
+vn -0.168776 0.045311 0.984612
+vn -0.218437 0.020537 0.975635
+vn -0.412273 0.641608 0.646815
+vn -0.369036 0.298169 0.880289
+vn -0.259423 -0.168573 0.950938
+vn -0.191770 -0.102018 0.976123
+vn 0.000000 -0.087270 0.996185
+vn -0.122346 0.088083 0.988571
+vn 0.000000 0.127514 0.991837
+vn -0.061865 0.040147 0.997277
+vn 0.000000 0.156605 0.987661
+vn -0.053486 -0.197374 0.978868
+vn 0.000000 0.019847 0.999803
+vn -0.382948 -0.794495 0.471305
+vn -0.318060 -0.355405 0.878934
+vn -0.400096 -0.694517 0.597971
+vn -0.408987 -0.806254 0.427416
+vn -0.163969 -0.833752 0.527230
+vn 0.119771 -0.270481 0.955246
+vn -0.203004 -0.939816 0.274835
+vn -0.058188 -0.324712 0.944021
+vn -0.145094 -0.355209 0.923458
+vn -0.525079 -0.250624 0.813314
+vn -0.807446 -0.264194 0.527477
+vn -0.662089 -0.560701 0.497245
+vn -0.199675 -0.902911 0.380632
+vn -0.242636 -0.877019 0.414687
+vn -0.272474 -0.924026 -0.268205
+vn -0.364995 -0.819586 0.441652
+vn -0.108220 -0.976991 -0.183786
+vn -0.543950 -0.723506 0.425038
+vn -0.232064 -0.927209 -0.293991
+vn -0.413369 -0.750624 0.515451
+vn -0.307411 -0.278843 0.909805
+vn -0.450628 -0.282788 0.846738
+vn -0.676849 -0.382426 0.628989
+vn -0.826819 -0.388400 0.406836
+vn -0.791595 -0.443050 0.420812
+vn -0.142738 -0.934012 0.327488
+vn -0.191071 -0.840299 0.507336
+vn -0.291071 -0.741660 0.604333
+vn -0.440597 -0.755235 0.485278
+vn -0.467748 -0.791744 0.392880
+vn -0.470764 -0.653290 0.592953
+vn -0.093310 -0.181835 0.978892
+vn -0.226343 -0.915650 0.332197
+vn -0.385811 -0.315327 0.867017
+vn -0.568141 -0.318737 0.758698
+vn -0.522135 -0.412895 0.746253
+vn -0.471048 -0.376315 0.797810
+vn -0.383908 -0.324542 0.864458
+vn -0.314528 -0.194760 0.929053
+vn -0.349548 -0.658472 0.666506
+vn -0.272030 -0.869089 0.413139
+vn -0.197166 -0.941214 0.274301
+vn -0.080323 -0.938231 0.336558
+vn -0.047371 -0.955383 0.291547
+vn -0.119492 -0.965498 0.231376
+vn -0.211680 -0.868782 0.447671
+vn -0.107457 -0.905004 0.411608
+vn -0.047940 -0.883533 0.465909
+vn -0.109547 -0.883425 0.455586
+vn -0.305970 -0.887075 0.345659
+vn -0.491169 -0.587690 0.642941
+vn -0.509537 -0.347524 0.787146
+vn -0.341958 -0.348801 0.872584
+vn -0.350885 -0.156934 0.923175
+vn -0.671289 -0.682905 0.288116
+vn -0.671289 -0.682905 0.288116
+vn -0.827334 -0.503849 0.248302
+vn -0.827334 -0.503849 0.248302
+vn -0.885392 -0.389499 0.253714
+vn -0.885392 -0.389499 0.253714
+vn 0.063546 -0.506439 -0.859931
+vn 0.369329 -0.553100 -0.746777
+vn 0.242846 -0.806682 0.538785
+vn 0.485775 -0.829604 0.275281
+vn 0.658082 -0.551272 -0.512863
+vn 0.693522 -0.673621 -0.255463
+vn 0.980456 -0.146404 -0.131425
+vn 0.952014 -0.262935 -0.156637
+vn 0.890722 -0.447672 -0.078768
+vn 0.909884 -0.414254 0.022464
+vn 0.918125 -0.127931 0.375073
+vn 0.750245 0.044436 0.659665
+vn 0.966380 -0.119457 -0.227684
+vn 0.990390 -0.066207 -0.121423
+vn 0.961455 -0.171437 -0.214973
+vn 0.940890 -0.281455 -0.188440
+vn 0.871784 -0.478259 -0.106120
+vn 0.855293 -0.512673 -0.075098
+vn 0.882476 -0.458987 0.102799
+vn 0.960482 -0.154544 -0.231496
+vn 0.936246 -0.210295 -0.281460
+vn 0.942102 -0.281316 -0.182497
+vn 0.935227 -0.344762 0.080557
+vn 0.935892 -0.310618 0.166201
+vn 0.808334 -0.574003 0.130833
+vn 0.587775 -0.801059 -0.113246
+vn 0.647675 -0.751602 0.124946
+vn 0.831664 -0.447963 0.328121
+vn 0.995249 -0.016350 -0.095982
+vn 0.954065 -0.077913 -0.289292
+vn 0.907408 -0.250137 -0.337700
+vn 0.976898 -0.202764 -0.067500
+vn 0.857955 -0.507869 0.077344
+vn 0.883889 -0.433015 0.176742
+vn 0.979638 -0.200574 -0.008969
+vn 0.941418 -0.245395 0.231328
+vn 0.981620 -0.144394 0.124793
+vn 0.978947 -0.109001 0.172574
+vn 0.935991 -0.189747 0.296507
+vn 0.899078 -0.182951 0.397729
+vn 0.745436 -0.536030 0.396229
+vn 0.797983 -0.320094 0.510650
+vn 0.906001 -0.195175 0.375592
+vn 0.953837 -0.208375 0.216275
+vn 0.922710 -0.264441 0.280495
+vn 0.913666 -0.272554 0.301545
+vn 0.882223 -0.261768 0.391357
+vn 0.866761 -0.309336 0.391199
+vn 0.830459 -0.351032 0.432567
+vn 0.818278 -0.315495 0.480503
+vn 0.808038 -0.215201 0.548419
+vn 0.969678 -0.148208 0.194316
+vn 0.922470 -0.252269 0.292249
+vn 0.867244 -0.318434 0.382738
+vn 0.836260 -0.340015 0.430184
+vn 0.923910 -0.145238 0.353971
+vn 0.984749 -0.050019 0.166636
+vn 0.981118 -0.099794 0.165675
+vn 0.944614 -0.194537 0.264309
+vn 0.880393 -0.291015 0.374457
+vn 0.824837 -0.315373 0.469238
+vn 0.622916 -0.484375 0.614294
+vn 0.821682 -0.474521 0.315705
+vn 0.867338 -0.331298 0.371439
+vn 0.987857 -0.135016 0.076870
+vn 0.979930 -0.195497 0.038967
+vn 0.979199 -0.164018 0.119446
+vn 0.949129 -0.225368 0.219914
+vn 0.886606 -0.298748 0.353099
+vn 0.708787 -0.249233 0.659928
+vn 0.678444 -0.409568 0.609892
+vn 0.442992 -0.162265 0.881719
+vn 0.642535 -0.219827 0.734047
+vn 0.858498 -0.229279 0.458708
+vn 0.925715 -0.225640 0.303543
+vn 0.972152 -0.187798 0.140186
+vn 0.918487 -0.113375 0.378850
+vn 0.963417 -0.107897 0.245326
+vn 0.930710 -0.126967 0.343014
+vn 0.909095 -0.174774 0.378154
+vn 0.954725 -0.056138 0.292145
+vn 0.987337 -0.051872 0.149917
+vn 0.793642 -0.245089 0.556834
+vn 0.864674 -0.261001 0.429205
+vn 0.841018 -0.069240 0.536557
+vn 0.668765 -0.107613 0.735645
+vn 0.383153 -0.167862 0.908304
+vn 0.690412 -0.337410 0.639911
+vn 0.470954 -0.330356 0.817965
+vn 0.635659 -0.745485 0.200472
+vn 0.716078 -0.513890 0.472386
+vn 0.672918 -0.288018 0.681342
+vn 0.502514 -0.864351 -0.019426
+vn 0.489068 -0.863343 -0.124305
+vn 0.402408 -0.915304 0.016936
+vn 0.504481 -0.846857 0.168320
+vn 0.380776 -0.923102 -0.053776
+vn 0.374887 -0.916704 -0.138250
+vn 0.756917 -0.386773 0.526766
+vn 0.763653 -0.273459 0.584854
+vn 0.288102 -0.949738 0.122456
+vn 0.456364 -0.805486 0.378054
+vn 0.224124 -0.973921 0.035305
+vn 0.204438 -0.976318 0.070776
+vn 0.245111 -0.968799 0.036716
+vn 0.262883 -0.962136 -0.072016
+vn 0.231176 -0.957851 -0.170524
+vn 0.147784 -0.957533 0.247568
+vn 0.195452 -0.786355 0.586042
+vn -0.017991 -0.918876 0.394137
+vn 0.017865 -0.788411 0.614889
+vn 0.035993 -0.953102 0.300502
+vn 0.063904 -0.996653 0.050974
+vn 0.075869 -0.995651 0.054062
+vn 0.089385 -0.994760 0.049628
+vn 0.120252 -0.988258 -0.094268
+vn 0.130043 -0.973060 -0.190374
+vn 0.122150 -0.975119 -0.184991
+vn 0.164304 -0.967025 -0.194593
+vn 0.621329 -0.134111 0.771987
+vn 0.288891 -0.208178 0.934454
+vn 0.070077 -0.325368 0.942987
+vn 0.043692 -0.365912 0.929623
+vn 0.345260 0.092352 0.933952
+vn 0.128601 -0.445833 0.885830
+vn 0.330083 -0.244923 0.911624
+vn 0.436901 -0.057248 0.897686
+vn 0.605873 0.057070 0.793512
+vn 0.691440 0.073643 0.718670
+vn 0.638897 -0.096424 0.763225
+vn 0.628759 -0.252843 0.735345
+vn 0.544124 -0.216863 0.810494
+vn 0.578730 -0.180551 0.795282
+vn 0.645211 -0.013591 0.763883
+vn 0.475512 -0.100011 0.874006
+vn 0.390824 -0.085748 0.916463
+vn 0.567763 -0.282575 0.773173
+vn 0.557132 -0.448099 0.699150
+vn 0.513298 -0.424267 0.746004
+vn 0.575354 -0.369817 0.729522
+vn 0.548898 -0.373155 0.747975
+vn 0.478887 -0.475925 0.737674
+vn 0.617962 -0.430917 0.657597
+vn 0.329622 -0.110896 0.937577
+vn 0.445590 -0.208021 0.870733
+vn 0.386579 -0.594777 0.704838
+vn 0.381991 -0.483105 0.787840
+vn 0.169084 -0.732456 0.659484
+vn 0.216527 -0.538921 0.814052
+vn 0.270635 -0.548378 0.791226
+vn 0.396435 -0.543115 0.740179
+vn 0.570878 -0.446838 0.688792
+vn 0.624006 -0.336885 0.705071
+vn 0.578007 -0.266686 0.771224
+vn 0.319217 -0.378810 0.868679
+vn 0.491634 -0.552992 0.672678
+vn 0.238897 -0.559967 0.793325
+vn 0.649406 -0.462970 0.603267
+vn 0.650763 0.121746 0.749457
+vn 0.692537 -0.019397 0.721122
+vn 0.634170 0.041017 0.772105
+vn 0.395205 -0.075946 0.915448
+vn 0.359372 -0.099091 0.927918
+vn 0.287402 0.308714 0.906695
+vn 0.354807 0.275116 0.893545
+vn 0.592048 0.140416 0.793576
+vn 0.637150 0.033288 0.770021
+vn 0.398905 -0.526217 0.750979
+vn 0.618180 -0.087493 0.781152
+vn 0.512457 0.322559 0.795829
+vn 0.318457 0.465784 0.825609
+vn 0.178960 0.417486 0.890886
+vn 0.487906 -0.431401 0.758842
+vn 0.483722 0.089844 0.870598
+vn 0.379427 -0.027095 0.924825
+vn 0.252160 -0.225711 0.940994
+vn 0.273597 -0.802168 0.530728
+vn 0.231462 -0.812863 0.534490
+vn 0.236909 -0.805986 0.542459
+vn 0.250030 -0.797610 0.548912
+vn 0.238041 -0.783912 0.573427
+vn 0.239039 -0.776186 0.583434
+vn 0.443288 -0.725499 0.526447
+vn 0.598994 -0.456011 0.658225
+vn 0.429183 -0.300884 0.851628
+vn 0.387574 -0.321812 0.863842
+vn 0.294932 -0.391271 0.871735
+vn 0.456505 -0.571068 0.682265
+vn 0.171236 -0.619419 0.766158
+vn 0.120990 -0.641764 0.757298
+vn 0.499385 -0.441032 0.745724
+vn 0.471435 -0.463007 0.750582
+vn 0.419250 -0.424099 0.802726
+vn 0.529444 -0.377328 0.759811
+vn 0.552559 -0.238810 0.798529
+vn 0.477995 -0.108156 0.871678
+vn 0.352537 -0.066139 0.933457
+vn 0.365298 0.021114 0.930651
+vn 0.309476 0.077575 0.947738
+vn 0.468673 -0.193955 0.861816
+vn 0.393464 -0.302198 0.868252
+vn 0.435525 -0.381572 0.815304
+vn 0.661918 -0.278359 0.695975
+vn 0.404049 -0.256486 0.878043
+vn 0.233462 -0.141439 0.962024
+vn 0.391302 0.171539 0.904133
+vn 0.501513 0.191642 0.843658
+vn 0.290551 0.210412 0.933438
+vn 0.361013 0.019272 0.932362
+vn 0.534184 -0.058804 0.843320
+vn 0.335099 0.030481 0.941690
+vn 0.200182 -0.015059 0.979643
+vn 0.441583 -0.179665 0.879048
+vn 0.676716 -0.151883 0.720408
+vn 0.666687 0.081829 0.740832
+vn 0.932960 -0.136234 0.333206
+vn 0.966686 -0.173590 0.188106
+vn 0.548535 -0.302365 0.779542
+vn 0.129199 -0.313000 0.940924
+vn 0.435133 -0.427967 0.792151
+vn 0.877701 0.026049 0.478501
+vn 0.727933 -0.128099 0.673575
+vn 0.847830 -0.114537 0.517751
+vn 0.868641 0.032692 0.494362
+vn 0.717016 -0.264832 0.644788
+vn 0.834325 -0.034975 0.550162
+vn 0.883811 0.024081 0.467224
+vn 0.957092 -0.185074 0.222985
+vn 0.569079 -0.679037 0.463744
+vn -0.140199 -0.928947 0.342640
+vn 0.879801 -0.130693 0.457023
+vn 0.743054 -0.586543 0.322239
+vn 0.452351 -0.144257 0.880096
+vn 0.359851 -0.032581 0.932441
+vn 0.411625 -0.071366 0.908555
+vn 0.481087 -0.243058 0.842305
+vn 0.642403 -0.101305 0.759641
+vn 0.452434 -0.306952 0.837308
+vn 0.446193 -0.231764 0.864406
+vn 0.866507 -0.042473 0.497355
+vn 0.870409 -0.387642 0.303515
+vn 0.831958 -0.248661 0.495997
+vn 0.903313 0.003019 0.428972
+vn 0.834596 -0.026340 0.550232
+vn 0.745913 0.016230 0.665846
+vn 0.689975 0.062932 0.721092
+vn 0.465763 -0.064939 0.882523
+vn 0.320354 0.044276 0.946263
+vn 0.563892 -0.276189 0.778296
+vn 0.511860 -0.627405 0.586824
+vn 0.372246 0.009748 0.928083
+vn 0.262328 -0.957610 -0.119028
+vn 0.259302 -0.910269 -0.322758
+vn 0.038100 -0.938178 -0.344049
+vn -0.147260 -0.986968 -0.064869
+vn 0.173697 -0.982288 -0.070287
+vn 0.476302 -0.002893 0.879277
+vn 0.689723 0.028653 0.723507
+vn 0.804070 0.054918 0.591993
+vn 0.818452 0.111155 0.563721
+vn 0.668286 0.120039 0.734156
+vn 0.507929 0.139820 0.849975
+vn 0.760442 0.036534 0.648377
+vn 0.806583 0.121802 0.578435
+vn 0.489837 -0.094281 0.866701
+vn 0.348316 -0.039261 0.936555
+vn 0.547406 0.028820 0.836371
+vn 0.645014 -0.010417 0.764100
+vn 0.786001 -0.145157 0.600942
+vn 0.830260 -0.257130 0.494523
+vn 0.517422 -0.499927 0.694512
+vn 0.551275 -0.507531 0.662200
+vn 0.550581 -0.587067 0.593475
+vn 0.653781 -0.618140 0.436431
+vn 0.365876 -0.653625 0.662502
+vn 0.370038 -0.728041 0.577085
+vn 0.325446 -0.764694 0.556173
+vn 0.273021 -0.509246 0.816167
+vn 0.163589 -0.611286 0.774318
+vn 0.173654 -0.441360 0.880367
+vn 0.161815 -0.363628 0.917383
+vn 0.021257 -0.200021 0.979561
+vn 0.063639 -0.439167 0.896149
+vn -0.015283 -0.080866 0.996608
+vn 0.041156 -0.179251 0.982942
+vn 0.074307 -0.123251 0.989590
+vn 0.009657 -0.101854 0.994753
+vn 0.026243 -0.130211 0.991139
+vn 0.896280 -0.072788 0.437475
+vn 0.891806 -0.074388 0.446261
+vn 0.845339 -0.069647 0.529671
+vn 0.891887 -0.175856 0.416668
+vn 0.858102 -0.238460 0.454751
+vn 0.838651 -0.217689 0.499276
+vn 0.798795 0.004094 0.601589
+vn 0.802411 -0.169881 0.572080
+vn 0.563183 -0.039333 0.825396
+vn 0.532478 -0.129885 0.836419
+vn 0.619725 -0.173675 0.765362
+vn 0.608674 -0.211803 0.764628
+vn 0.785540 -0.197828 0.586336
+vn 0.789343 -0.176661 0.587987
+vn 0.824542 -0.140038 0.548197
+vn 0.766768 -0.046604 0.640231
+vn 0.525843 -0.111551 0.843235
+vn 0.465704 0.084934 0.880855
+vn 0.097209 -0.329188 0.939248
+vn 0.122270 -0.205991 0.970885
+vn 0.196417 -0.133287 0.971419
+vn 0.162640 -0.087052 0.982838
+vn 0.101349 -0.037653 0.994138
+vn 0.166565 0.098801 0.981068
+vn 0.301292 0.258709 0.917765
+vn 0.440641 0.450782 0.776293
+vn 0.686632 0.254326 0.681069
+vn 0.042423 -0.336081 0.940877
+vn 0.111689 -0.378002 0.919043
+vn 0.088696 -0.037132 0.995366
+vn 0.140346 -0.131793 0.981292
+vn 0.146236 -0.072286 0.986605
+vn 0.168776 0.045311 0.984612
+vn 0.218437 0.020537 0.975635
+vn 0.412273 0.641608 0.646816
+vn 0.369036 0.298169 0.880289
+vn 0.259424 -0.168573 0.950938
+vn 0.191770 -0.102018 0.976123
+vn 0.122346 0.088083 0.988571
+vn 0.061865 0.040147 0.997277
+vn 0.053486 -0.197374 0.978868
+vn 0.382948 -0.794495 0.471305
+vn 0.318060 -0.355405 0.878934
+vn 0.400096 -0.694517 0.597971
+vn 0.408987 -0.806254 0.427416
+vn 0.163969 -0.833753 0.527230
+vn -0.119771 -0.270481 0.955246
+vn 0.203005 -0.939817 0.274835
+vn 0.058188 -0.324712 0.944021
+vn 0.145093 -0.355209 0.923458
+vn 0.525079 -0.250624 0.813314
+vn 0.807446 -0.264194 0.527477
+vn 0.662089 -0.560700 0.497245
+vn 0.199676 -0.902912 0.380631
+vn 0.242636 -0.877019 0.414687
+vn 0.272474 -0.924026 -0.268205
+vn 0.543950 -0.723506 0.425038
+vn 0.108219 -0.976991 -0.183786
+vn 0.364996 -0.819587 0.441651
+vn 0.413369 -0.750624 0.515451
+vn 0.232064 -0.927209 -0.293991
+vn 0.307412 -0.278843 0.909805
+vn 0.450629 -0.282788 0.846738
+vn 0.676849 -0.382426 0.628988
+vn 0.791596 -0.443050 0.420812
+vn 0.826819 -0.388400 0.406836
+vn 0.191071 -0.840298 0.507337
+vn 0.142738 -0.934012 0.327487
+vn 0.291071 -0.741659 0.604334
+vn 0.440597 -0.755234 0.485278
+vn 0.467748 -0.791743 0.392879
+vn 0.470764 -0.653290 0.592953
+vn 0.093310 -0.181835 0.978892
+vn 0.226343 -0.915650 0.332196
+vn 0.385812 -0.315327 0.867017
+vn 0.522135 -0.412895 0.746253
+vn 0.568141 -0.318737 0.758698
+vn 0.471047 -0.376315 0.797810
+vn 0.383908 -0.324543 0.864458
+vn 0.314529 -0.194760 0.929053
+vn 0.349548 -0.658473 0.666506
+vn 0.272031 -0.869089 0.413139
+vn 0.197167 -0.941214 0.274301
+vn 0.080323 -0.938231 0.336558
+vn 0.047371 -0.955383 0.291548
+vn 0.119492 -0.965498 0.231376
+vn 0.211679 -0.868782 0.447671
+vn 0.107457 -0.905004 0.411608
+vn 0.047940 -0.883533 0.465909
+vn 0.109547 -0.883425 0.455586
+vn 0.305970 -0.887075 0.345659
+vn 0.491169 -0.587690 0.642941
+vn 0.509537 -0.347524 0.787146
+vn 0.341958 -0.348801 0.872584
+vn 0.350886 -0.156934 0.923175
+vn 0.671290 -0.682905 0.288117
+vn 0.671290 -0.682905 0.288117
+vn 0.827335 -0.503849 0.248302
+vn 0.827335 -0.503849 0.248302
+vn 0.885392 -0.389499 0.253714
+vn 0.885392 -0.389499 0.253714
+vn -0.309855 -0.926549 -0.213301
+vn -0.027599 -0.939403 -0.341703
+vn 0.289297 -0.935275 0.203884
+vn -0.106039 -0.968527 0.225190
+vn 0.358014 -0.933576 -0.016210
+vn 0.279072 -0.943923 -0.176433
+vn 0.068418 -0.766721 -0.638324
+vn -0.189367 -0.735327 -0.650718
+vn -0.770403 0.079155 0.632624
+vn -0.613113 0.136773 0.778065
+vn -0.350056 0.128364 0.927892
+vn -0.308009 -0.309870 0.899506
+vn -0.299958 -0.641647 0.705914
+vn -0.477109 -0.512294 0.714088
+vn -0.358922 -0.813462 0.457662
+vn -0.589548 -0.077420 0.804015
+vn -0.722296 -0.015140 0.691419
+vn -0.823171 -0.036425 0.566624
+vn -0.751484 -0.407666 0.518729
+vn -0.617021 -0.697287 0.364795
+vn -0.782243 -0.280041 0.556482
+vn -0.865466 -0.207653 0.455904
+vn -0.631894 -0.726752 0.269335
+vn -0.410792 -0.869446 0.274435
+vn -0.724049 -0.533066 0.437713
+vn -0.767245 -0.393008 0.506834
+vn -0.833295 -0.327544 0.445348
+vn -0.793490 -0.389985 0.467210
+vn -0.688750 -0.689348 -0.224552
+vn -0.085672 -0.888142 -0.451513
+vn -0.705934 -0.632979 -0.317796
+vn -0.526509 -0.758990 -0.383044
+vn -0.427685 -0.778753 -0.458943
+vn 0.136696 -0.132113 0.981764
+vn 0.198589 -0.222346 0.954529
+vn 0.002920 -0.043212 0.999062
+vn -0.067240 -0.046010 0.996675
+vn 0.068807 -0.103861 0.992209
+vn 0.574141 -0.226391 0.786835
+vn 0.327506 -0.251332 0.910809
+vn 0.327506 -0.251332 0.910809
+vn 0.055711 -0.256966 0.964813
+vn 0.055711 -0.256966 0.964813
+vn -0.410976 -0.824313 -0.389368
+vn -0.627806 -0.680618 -0.377649
+vn -0.089113 -0.912300 -0.399710
+vn -0.011357 -0.906478 -0.422101
+vn -0.448176 -0.661548 -0.601243
+vn -0.753058 -0.510162 -0.415498
+vn -0.961730 -0.196816 -0.190628
+vn -0.916186 -0.219439 -0.335335
+vn -0.652490 -0.584970 -0.481733
+vn -0.488627 -0.658355 -0.572549
+vn -0.895725 -0.191016 -0.401485
+vn -0.026124 -0.592131 -0.805418
+vn -0.121639 -0.485642 -0.865653
+vn -0.214224 -0.367454 -0.905034
+vn -0.121639 -0.485642 -0.865653
+vn 0.123989 -0.992278 -0.003201
+vn -0.126649 -0.988799 -0.078972
+vn -0.126649 -0.988799 -0.078972
+vn 0.123989 -0.992278 -0.003201
+vn -0.368603 -0.917514 -0.149328
+vn -0.368603 -0.917514 -0.149328
+vn -0.992952 -0.077863 -0.089346
+vn -0.932671 -0.119228 -0.340454
+vn -0.971151 -0.099399 -0.216762
+vn -0.932671 -0.119228 -0.340454
+vn -0.992952 -0.077863 -0.089346
+vn -0.971151 -0.099399 -0.216762
+vn 0.270387 0.410353 0.870920
+vn 0.105769 0.425786 0.898621
+vn 0.270387 0.410353 0.870920
+vn 0.501858 0.419546 0.756386
+vn 0.501858 0.419546 0.756386
+vn 0.533126 0.638612 0.554933
+vn 0.533126 0.638612 0.554933
+vn 0.466699 0.791727 0.394157
+vn 0.466699 0.791727 0.394157
+vn 0.770403 0.079155 0.632624
+vn 0.613113 0.136773 0.778065
+vn 0.350056 0.128364 0.927892
+vn 0.299958 -0.641647 0.705914
+vn 0.308009 -0.309870 0.899506
+vn 0.358922 -0.813462 0.457662
+vn 0.477109 -0.512294 0.714088
+vn 0.589548 -0.077419 0.804015
+vn 0.722296 -0.015140 0.691419
+vn 0.823171 -0.036425 0.566624
+vn 0.617022 -0.697287 0.364795
+vn 0.751484 -0.407665 0.518729
+vn 0.782243 -0.280041 0.556482
+vn 0.865466 -0.207653 0.455904
+vn 0.410792 -0.869446 0.274435
+vn 0.631895 -0.726752 0.269335
+vn 0.724050 -0.533066 0.437713
+vn 0.767245 -0.393008 0.506834
+vn 0.833295 -0.327544 0.445348
+vn 0.793490 -0.389985 0.467210
+vn 0.688750 -0.689348 -0.224552
+vn 0.085672 -0.888142 -0.451513
+vn 0.705934 -0.632979 -0.317796
+vn 0.526509 -0.758990 -0.383044
+vn 0.427685 -0.778753 -0.458943
+vn -0.198589 -0.222346 0.954529
+vn -0.136696 -0.132113 0.981764
+vn -0.002920 -0.043212 0.999062
+vn 0.067240 -0.046010 0.996675
+vn -0.068807 -0.103861 0.992209
+vn -0.574141 -0.226391 0.786835
+vn -0.327506 -0.251332 0.910809
+vn -0.327506 -0.251332 0.910809
+vn -0.055711 -0.256966 0.964813
+vn -0.055711 -0.256966 0.964813
+vn 0.627805 -0.680619 -0.377649
+vn 0.410976 -0.824313 -0.389368
+vn 0.089113 -0.912300 -0.399709
+vn 0.011357 -0.906478 -0.422100
+vn 0.448176 -0.661548 -0.601242
+vn 0.961730 -0.196816 -0.190628
+vn 0.753058 -0.510162 -0.415498
+vn 0.652490 -0.584970 -0.481733
+vn 0.916186 -0.219439 -0.335335
+vn 0.488627 -0.658355 -0.572549
+vn 0.895725 -0.191016 -0.401485
+vn 0.026124 -0.592131 -0.805418
+vn 0.121639 -0.485642 -0.865653
+vn 0.214224 -0.367454 -0.905034
+vn 0.121639 -0.485642 -0.865653
+vn 0.992952 -0.077863 -0.089346
+vn 0.932671 -0.119229 -0.340454
+vn 0.971151 -0.099399 -0.216762
+vn 0.992952 -0.077863 -0.089346
+vn 0.971151 -0.099399 -0.216762
+vn 0.932671 -0.119229 -0.340454
+# 2655 vertices
+
+# 0 vertex parms
+
+# 0 texture vertices
+
+# 3302 normals
+
+g coat
+s 1
+f 66//52 67//53 68//54 69//55
+f 69//55 68//54 70//56 71//57
+f 71//57 70//56 72//58 73//59
+f 73//59 72//58 74//60 75//61
+f 75//61 74//60 76//62 77//63
+f 77//63 76//62 78//64 79//65
+f 79//65 78//64 80//66 81//67
+s 3
+f 81//967 80//966 2//964 4//965
+s 1
+f 80//66 82//68 1//26 2//27
+f 78//64 83//69 82//68 80//66
+f 76//62 84//70 83//69 78//64
+s 18
+f 74//974 85//977 84//976 76//975
+f 72//973 86//978 85//977 74//974
+f 70//972 87//979 86//978 72//973
+f 68//971 88//980 87//979 70//972
+f 67//970 88//980 68//971
+s 1
+f 66//52 69//55 89//72 90//73
+f 90//73 89//72 91//74 92//75
+f 92//75 91//74 93//76 94//77
+f 94//77 93//76 95//78
+f 95//78 93//76 96//79 97//80
+f 93//76 91//74 98//81 99//82 96//79
+f 91//74 89//72 100//83 101//84 98//81
+f 89//72 69//55 71//57 100//83
+f 100//83 71//57 73//59 102//85 103//86
+f 97//80 96//79 104//87 105//88 106//89
+f 99//82 104//87 96//79
+f 99//82 107//90 108//91 104//87
+f 104//87 109//92 105//88
+f 108//91 110//93 109//92 104//87
+f 101//84 100//83 103//86
+f 103//86 102//85 111//94
+f 112//95 101//84 103//86 113//96
+f 113//96 103//86 111//94 114//97
+f 115//98 108//91 107//90
+f 115//98 110//93 108//91
+f 116//99 112//95 113//96
+f 116//99 113//96 114//97
+f 99//82 98//81 117//100 107//90
+f 98//81 101//84 112//95 117//100
+f 115//98 107//90 117//100 118//101
+f 118//101 117//100 112//95 116//99
+f 115//98 119//102 120//103 110//93
+f 119//102 116//99 114//97 120//103
+f 114//97 111//94 121//104 120//103
+f 120//103 121//104 109//92 110//93
+f 115//98 118//101 116//99 119//102
+f 106//89 105//88 122//105 123//106
+f 105//88 109//92 121//104 124//107 122//105
+f 121//104 111//94 102//85 125//108 124//107
+f 102//85 73//59 75//61 125//108
+f 125//108 75//61 77//63 126//109
+f 126//109 77//63 79//65 127//110
+f 127//110 79//65 81//67 128//111
+f 128//111 81//67 4//29 3//28
+f 3//28 5//30 129//112 128//111
+f 128//111 129//112 130//113 127//110
+f 127//110 130//113 131//114 126//109
+f 126//109 131//114 124//107 125//108
+f 124//107 131//114 132//115 122//105
+f 122//105 132//115 133//116 123//106
+f 133//116 132//115 134//117 135//118
+f 135//118 134//117 136//119 137//120
+f 137//120 136//119 6//31 7//32
+f 136//119 129//112 5//30 6//31
+f 134//117 130//113 129//112 136//119
+f 132//115 131//114 130//113 134//117
+f 138//121 67//53 66//52 139//122
+f 139//122 66//52 140//123
+f 140//123 141//124 139//122
+f 139//122 141//124 142//125 143//126 138//121
+s 31
+f 138//982 143//983 144//984
+f 144//984 145//985 138//982
+f 138//982 145//985 67//981
+s 1
+f 142//125 141//124 146//127 147//128
+g shirt
+f 150//131 147//128 151//132
+g coat
+f 151//132 147//128 146//127 152//133 153//134
+f 154//135 153//134 152//133 155//136
+f 155//136 156//137 157//138 154//135
+f 146//127 141//124 158//139
+f 158//139 159//140 152//133 146//127
+f 160//141 155//136 152//133 159//140
+f 161//142 156//137 155//136 160//141
+f 66//52 90//73 162//143 163//144
+f 163//144 164//145 140//123 66//52
+f 140//123 164//145 165//146 141//124
+f 162//143 90//73 92//75 166//147
+f 166//147 92//75 94//77 167//148
+f 97//80 106//89 168//149 169//150
+f 106//89 123//106 170//151 168//149
+f 123//106 133//116 171//152 170//151
+f 133//116 135//118 172//153 171//152
+f 135//118 137//120 173//154 172//153
+f 137//120 7//32 8//33 173//154
+f 167//148 94//77 95//78 174//155
+f 174//155 95//78 97//80 169//150
+f 175//156 157//138 156//137 176//157
+f 176//157 156//137 161//142 177//158
+f 178//159 175//156 176//157 179//160
+f 179//160 176//157 177//158 180//161
+f 180//161 181//162 182//163 179//160
+f 182//163 183//164 178//159 179//160
+f 184//165 185//166 182//163 181//162
+f 185//166 186//167 183//164 182//163
+f 185//166 187//168 188//169 186//167
+f 189//170 187//168 185//166 184//165
+f 189//170 184//165 190//171 191//172
+f 184//165 181//162 192//173 190//171
+f 181//162 180//161 193//174 192//173
+f 177//158 161//142 194//175 195//176
+f 161//142 160//141 196//177 194//175
+f 160//141 159//140 197//178 196//177
+f 193//174 180//161 177//158 195//176
+f 191//172 190//171 198//179 199//180
+f 190//171 192//173 200//181 198//179
+f 192//173 193//174 201//182 200//181
+f 193//174 195//176 202//183 201//182
+f 195//176 194//175 203//184 202//183
+f 198//179 200//181 204//185
+f 204//185 200//181 205//186 206//187
+f 205//186 200//181 201//182 207//188
+f 207//188 201//182 202//183 208//189
+f 208//189 202//183 203//184 209//190
+f 194//175 196//177 210//191 203//184
+f 196//177 197//178 211//192 210//191
+f 203//184 210//191 212//193 209//190
+f 210//191 211//192 213//194 212//193
+f 158//139 141//124 165//146 214//195
+f 158//139 214//195 197//178 159//140
+f 165//146 164//145 215//196 216//197
+s off
+f 164//1 163//1 217//1 215//1
+s 1
+f 217//198 163//144 162//143
+f 217//198 162//143 166//147 218//199
+f 218//199 166//147 167//148 219//200
+f 219//200 167//148 174//155 220//201
+s 5
+f 174//994 169//989 221//996 220//995
+f 169//989 168//988 222//997 221//996
+f 168//988 170//990 223//998 222//997
+f 170//990 171//991 224//999 223//998
+f 171//991 172//992 225//1000 224//999
+f 172//992 173//993 226//1001 225//1000
+f 173//993 8//986 9//987 226//1001
+s 1
+f 220//201 221//202 227//208 228//209
+f 228//209 229//210 230//211 231//212 220//201
+f 221//202 222//203 232//213 227//208
+f 222//203 223//204 233//214 232//213
+f 223//204 224//205 234//215 233//214
+f 224//205 225//206 235//216 234//215
+f 225//206 226//207 236//217 235//216
+f 236//217 226//207 9//34 10//35
+s off
+f 214//2 165//2 216//2 237//2
+s 1
+f 197//178 214//195 237//218 211//192
+f 211//192 237//218 238//219 239//220 240//221 213//194
+f 216//197 215//196 237//218
+f 237//218 215//196 241//222 238//219
+f 215//196 217//198 218//199
+f 215//196 218//199 219//200
+f 215//196 219//200 242//223 241//222
+f 231//212 242//223 219//200 220//201
+f 239//220 230//211 229//210 240//221
+g button
+f 238//219 241//222 243//224 244//225
+f 238//219 244//225 245//226 239//220
+f 239//220 245//226 246//227 230//211
+f 246//227 247//228 231//212 230//211
+f 247//228 248//229 242//223 231//212
+f 243//224 241//222 242//223 248//229
+f 249//230 250//231 245//226 244//225
+f 244//225 243//224 251//232 249//230
+f 251//232 243//224 248//229 252//233
+f 252//233 248//229 247//228 253//234
+f 253//234 247//228 246//227 254//235
+f 254//235 246//227 245//226 250//231
+f 255//236 250//231 249//230
+f 255//236 249//230 251//232
+f 255//236 251//232 252//233
+f 255//236 252//233 253//234
+f 255//236 253//234 254//235
+f 255//236 254//235 250//231
+g coat
+f 205//186 207//188 256//237
+f 207//188 208//189 258//239 256//237
+f 258//239 208//189 209//190 259//240
+f 259//240 209//190 212//193 260//241
+f 256//237 258//239 261//242 257//238
+f 258//239 259//240 261//242
+f 259//240 260//241 262//243 261//242
+f 212//193 213//194 263//244 260//241
+f 263//244 213//194 240//221 264//245
+f 264//245 240//221 229//210 265//246
+f 265//246 229//210 228//209 266//247
+f 260//241 263//244 267//248 262//243
+f 267//248 263//244 264//245 268//249
+f 268//249 264//245 265//246 269//250
+f 269//250 265//246 270//251
+f 265//246 266//247 270//251
+f 270//251 271//252 269//250
+f 269//250 271//252 272//253 268//249
+f 268//249 272//253 273//254 267//248
+f 267//248 273//254 274//255 262//243
+f 262//243 274//255 261//242
+f 266//247 228//209 227//208 275//256
+f 275//256 227//208 232//213 276//257
+f 276//257 232//213 233//214 277//258
+f 277//258 233//214 234//215 278//259
+f 278//259 234//215 235//216 279//260
+f 279//260 235//216 236//217 280//261
+f 280//261 236//217 10//35 11//36
+f 266//247 275//256 281//262 270//251
+f 275//256 276//257 281//262
+f 276//257 277//258 282//263 281//262
+f 277//258 278//259 282//263
+f 278//259 279//260 283//264 282//263
+f 279//260 280//261 284//265 283//264
+f 280//261 11//36 284//265
+g shirt
+s 46
+f 285//1004 286//1005 287//1006 288//1007
+s 1
+f 286//267 289//269 290//270 287//268
+f 291//271 292//272 290//270 289//269
+f 292//272 293//273 294//274 290//270
+f 290//270 294//274 295//275 287//268
+s 46
+f 287//1006 295//1008 296//1009 288//1007
+f 296//1009 295//1008 297//1010 298//1011
+s 1
+f 295//275 294//274 299//277 297//276
+f 294//274 293//273 300//278 299//277
+f 299//277 300//278 301//279 302//280
+f 302//280 301//279 303//281 304//282
+f 304//282 303//281 305//283
+f 305//283 303//281 306//284 307//285
+f 307//285 306//284 308//286 309//287
+f 307//285 309//287 310//288 311//289
+f 311//289 312//290 305//283 307//285
+f 305//283 312//290 313//291 304//282
+f 302//280 314//292 297//276 299//277
+f 302//280 304//282 313//291 314//292
+s 46
+f 297//1010 314//1012 315//1013 298//1011
+f 315//1013 314//1012 316//1014 317//1015
+s 1
+f 316//293 314//292 313//291
+f 313//291 312//290 318//294 316//293
+s 46
+f 316//1014 318//1016 319//1017 317//1015
+s 1
+f 311//289 310//288 320//295 321//296
+f 321//296 322//297 312//290 311//289
+f 312//290 322//297 318//294
+s 46
+f 318//1016 323//1018 324//1019 319//1017
+s 1
+f 318//294 322//297 325//299 323//298
+f 325//299 322//297 321//296 326//300
+f 326//300 321//296 320//295 327//301
+f 326//300 328//302 325//299
+f 325//299 328//302 323//298
+f 328//302 326//300 327//301 329//303
+f 329//303 330//304 328//302
+f 328//302 330//304 331//305
+f 331//305 332//306 328//302
+f 328//302 332//306 333//307
+s 46
+f 333//1021 324//1019 323//1018 328//1020
+s 1
+f 186//167 188//169 334//308 335//309
+s 46
+f 334//1022 285//1004 288//1007 335//1023
+f 288//1007 296//1009 336//1024 335//1023
+s 1
+f 335//309 336//310 183//164 186//167
+s 46
+f 296//1009 298//1011 337//1025 336//1024
+s 1
+f 336//310 337//311 178//159 183//164
+s 46
+f 298//1011 315//1013 338//1026 337//1025
+s 1
+f 337//311 338//312 175//156 178//159
+s 46
+f 317//1015 339//1027 338//1026 315//1013
+f 317//1015 319//1017 340//1028 339//1027
+s 1
+f 175//156 338//312 339//313 157//138
+f 339//313 340//314 154//135 157//138
+f 153//134 341//315 342//316 151//132
+f 151//132 342//316 343//317 150//131
+f 150//131 343//317 344//318 149//130
+f 147//128 150//131 149//130 345//319
+f 345//319 149//130 148//129
+f 345//319 142//125 147//128
+f 148//129 149//130 344//318 346//320
+f 344//318 329//303 327//301 346//320
+f 329//303 344//318 343//317 330//304
+f 330//304 343//317 331//305
+f 343//317 332//306 331//305
+f 343//317 342//316 333//307 332//306
+s 46
+f 342//1030 341//1029 324//1019 333//1021
+f 341//1029 340//1028 319//1017 324//1019
+s 33
+f 144//1032 347//1034 348//1035 145//1033
+s 32
+f 144//1039 143//1038 349//1041 347//1040
+s 33
+f 348//1035 350//1036 67//1031 145//1033
+s 32
+f 349//1041 143//1038 142//1037 351//1042
+s 30
+f 350//1052 352//1054 88//1047 67//1043
+f 353//1055 354//1056 352//1054 350//1052
+f 353//1055 355//1057 354//1056
+f 353//1055 350//1052 348//1050 356//1058
+f 356//1058 355//1057 353//1055
+f 347//1049 357//1059 356//1058 348//1050
+f 357//1059 347//1049 349//1051 358//1060
+f 358//1060 349//1051 351//1053 359//1061
+f 359//1061 360//1062 361//1063 358//1060
+f 358//1060 361//1063 362//1064 357//1059
+f 362//1064 361//1063 363//1065
+f 364//1066 363//1065 361//1063
+f 364//1066 361//1063 360//1062 365//1067
+s 1
+f 351//321 142//125 345//319 366//322
+f 345//319 148//129 366//322
+f 148//129 346//320 367//323 368//324
+f 327//301 320//295 367//323 346//320
+f 367//323 369//325 370//326 368//324
+f 367//323 320//295 310//288 369//325
+s 30
+f 359//1061 351//1053 366//1068 371//1071
+f 371//1071 360//1062 359//1061
+f 371//1071 372//1072 365//1067 360//1062
+f 148//1048 368//1069 371//1071 366//1068
+f 368//1069 370//1070 372//1072 371//1071
+f 370//1070 373//1073 372//1072
+f 372//1072 373//1073 374//1074 365//1067
+f 374//1074 375//1075 364//1066 365//1067
+g tie
+s 12
+f 376//1093 373//1092 377//1094
+f 376//1093 377//1094 378//1095
+s 30
+f 376//1076 375//1075 374//1074
+f 376//1076 374//1074 373//1073
+g shirt
+f 373//1073 370//1070 379//1077
+g tie
+s 12
+f 379//1096 380//1097 373//1092
+f 380//1097 381//1098 377//1094 373//1092
+f 381//1098 382//1099 378//1095 377//1094
+g shirt
+s 1
+f 379//327 370//326 383//328
+f 383//328 370//326 369//325 384//329
+f 384//329 369//325 310//288
+f 379//327 383//328 385//330 386//331
+g tie
+s 12
+f 386//1100 387//1101 380//1097 379//1096
+f 387//1101 388//1102 381//1098 380//1097
+f 388//1102 389//1103 382//1099 381//1098
+f 386//1100 390//1104 387//1101
+f 390//1104 391//1105 388//1102 387//1101
+f 390//1104 392//1106 391//1105
+f 391//1105 393//1107 389//1103 388//1102
+f 392//1106 394//1108 393//1107 391//1105
+f 393//1107 395//1109 396//1110 389//1103
+f 394//1108 397//1111 395//1109 393//1107
+f 389//1103 396//1110 398//1112 382//1099
+g shirt
+s 1
+f 385//330 399//332 386//331
+f 399//332 385//330 400//333
+s 8
+f 400//1183 401//1184 399//1182
+f 399//1182 401//1184 390//1178 386//1177
+s 1
+f 385//330 383//328 384//329 402//334
+f 400//333 385//330 402//334 403//335
+f 403//335 404//336 400//333
+f 403//335 402//334 309//287 308//286
+f 309//287 402//334 384//329 310//288
+f 404//336 403//335 308//286 405//337
+f 306//284 406//338 405//337 308//286
+f 407//339 406//338 306//284 303//281
+f 303//281 301//279 408//340 407//339
+f 408//340 301//279 300//278 409//341
+f 409//341 300//278 293//273 410//342
+f 410//342 293//273 292//272 411//343
+f 411//343 292//272 291//271 412//344
+f 411//343 413//345 414//346 410//342
+f 410//342 414//346 415//347 409//341
+f 409//341 415//347 416//348 408//340
+f 408//340 416//348 417//349 407//339
+s 8
+f 400//1183 418//1185 419//1186 401//1184
+f 401//1184 419//1186 392//1179 390//1178
+f 400//1183 420//1187 418//1185
+f 400//1183 421//1188 420//1187
+s 1
+f 400//333 404//336 422//351 421//350
+f 404//336 405//337 423//352 422//351
+s 8
+f 420//1187 421//1188 425//1191 424//1190
+f 424//1190 426//1192 418//1185 420//1187
+s 1
+f 422//351 425//353 421//350
+s 8
+f 423//1189 427//1193 428//1194
+s 1
+f 428//354 425//353 422//351 423//352
+s 8
+f 429//1195 426//1192 424//1190 430//1196
+f 430//1196 13//1172 15//1174 429//1195
+f 424//1190 425//1191 431//1197 430//1196
+s 1
+f 428//354 431//355 425//353
+s 8
+f 427//1193 432//1198 431//1197 428//1194
+f 431//1197 12//1171 13//1172 430//1196
+f 418//1185 426//1192 433//1199 419//1186
+f 419//1186 433//1199 394//1180 392//1179
+f 394//1180 433//1199 434//1200 397//1181
+f 433//1199 426//1192 429//1195 434//1200
+f 434//1200 429//1195 435//1201
+f 435//1201 429//1195 15//1174 14//1173
+f 14//1173 16//1175 436//1202 435//1201
+f 435//1201 436//1202 397//1181 434//1200
+f 432//1198 17//1176 12//1171 431//1197
+g tie
+s 12
+f 437//1114 397//1111 436//1113 438//1115
+s 10
+f 438//1233 436//1232 16//1229 18//1230
+f 18//1230 19//1231 439//1234 438//1233
+s 12
+f 438//1115 439//1116 440//1117 437//1114
+f 437//1114 440//1117 396//1110 395//1109
+f 396//1110 441//1118 398//1112
+f 396//1110 440//1117 442//1119 441//1118
+f 440//1117 439//1116 443//1120 442//1119
+f 439//1116 19//1083 20//1084 443//1120
+f 441//1118 444//1121 398//1112
+f 441//1118 442//1119 445//1122 444//1121
+f 442//1119 443//1120 446//1123 445//1122
+f 443//1120 20//1084 21//1085 446//1123
+s 15
+f 398//1261 444//1262 447//1263 448//1264
+s 55
+f 398//1462 448//1463 449//1464 382//1461
+f 448//1463 450//1465 451//1466 449//1464
+f 378//1460 382//1461 449//1464 452//1467
+f 375//1458 452//1467 453//1468 364//1457
+f 375//1458 376//1459 378//1460 452//1467
+f 452//1467 449//1464 451//1466 453//1468
+f 453//1468 454//1469 363//1456 364//1457
+f 451//1466 455//1470 454//1469 453//1468
+f 450//1465 456//1471 455//1470 451//1466
+s 15
+f 448//1264 447//1263 457//1267 450//1265
+s 55
+f 363//1456 454//1469 458//1472 362//1455
+f 455//1470 458//1472 454//1469
+f 458//1472 459//1473 357//1454 362//1455
+f 455//1470 460//1474 459//1473 458//1472
+f 455//1470 456//1471 460//1474
+s 15
+f 450//1265 457//1267 461//1269 456//1266
+f 456//1266 461//1269 462//1270 460//1268
+s 55
+f 460//1474 463//1475 459//1473
+f 357//1454 459//1473 463//1475 464//1476
+s 54
+f 357//1483 465//1484 356//1482
+f 465//1484 466//1485 467//1486 356//1482
+s 15
+f 357//1260 468//1275 465//1273
+f 357//1260 464//1272 468//1275
+f 468//1275 469//1276 466//1274 465//1273
+f 468//1275 464//1272 469//1276
+f 464//1272 470//1277 471//1278 469//1276
+f 469//1276 471//1278 472//1279 466//1274
+s 55
+f 464//1476 463//1475 473//1478 470//1477
+s 15
+f 460//1268 462//1270 474//1281 463//1271
+f 463//1271 474//1281 475//1282 473//1280
+s 12
+f 444//1121 445//1122 476//1124 477//1125
+f 445//1122 446//1123 478//1126 476//1124
+f 446//1123 21//1085 22//1086 478//1126
+f 478//1126 22//1086 23//1087 479//1127
+f 478//1126 479//1127 480//1128 476//1124
+f 476//1124 480//1128 481//1129 477//1125
+f 26//1090 479//1127 23//1087 24//1088
+f 26//1090 25//1089 480//1128 479//1127
+f 480//1128 25//1089 27//1091 481//1129
+s 15
+f 444//1262 477//1283 482//1285 447//1263
+f 447//1263 482//1285 483//1286 457//1267
+f 457//1267 483//1286 461//1269
+f 461//1269 483//1286 462//1270
+f 462//1270 483//1286 484//1287 474//1281
+f 474//1281 484//1287 485//1288 475//1282
+f 477//1283 481//1284 486//1289 482//1285
+f 482//1285 486//1289 487//1290 483//1286
+f 483//1286 487//1290 488//1291 484//1287
+f 481//1284 27//1237 28//1238 486//1289
+f 486//1289 28//1238 29//1239 487//1290
+f 487//1290 29//1239 30//1240 488//1291
+f 488//1291 30//1240 31//1241 489//1292
+f 484//1287 488//1291 489//1292 485//1288
+f 485//1288 489//1292 490//1293 491//1294
+f 489//1292 31//1241 32//1242 490//1293
+f 490//1293 32//1242 33//1243 492//1295
+f 492//1295 493//1296 491//1294
+f 491//1294 490//1293 492//1295
+f 493//1296 475//1282 485//1288 491//1294
+f 492//1295 33//1243 34//1244 494//1297
+f 492//1295 494//1297 495//1298
+f 495//1298 496//1299 493//1296 492//1295
+f 493//1296 496//1299 497//1300 498//1301
+f 493//1296 498//1301 499//1302
+f 499//1302 473//1280 475//1282 493//1296
+s 55
+f 473//1478 499//1480 500//1481 470//1477
+s 15
+f 470//1277 500//1303 501//1304 471//1278
+f 471//1278 501//1304 502//1305 472//1279
+f 502//1305 501//1304 503//1306
+s 30
+f 356//1058 467//1078 504//1079 355//1057
+f 355//1057 504//1079 505//1080 354//1056
+f 354//1056 505//1080 352//1054
+f 505//1080 506//1081 87//1046 88//1047 352//1054
+f 506//1081 507//1082 86//1045 87//1046
+f 507//1082 85//1044 86//1045
+s 15
+f 508//1310 36//1246 85//1259
+f 508//1310 85//1259 507//1309 509//1311
+f 509//1311 507//1309 510//1312
+f 510//1312 507//1309 506//1308
+f 505//1307 510//1312 506//1308
+f 505//1307 511//1313 512//1314 510//1312
+s 67
+f 504//1488 513//1491 511//1490 505//1489
+s 15
+f 508//1310 35//1245 36//1246
+f 508//1310 514//1315 35//1245
+f 508//1310 515//1316 516//1317 514//1315
+f 515//1316 517//1318 518//1319 516//1317
+s off
+f 466//3 519//3 467//3
+s 67
+f 467//1487 519//1492 513//1491 504//1488
+s 15
+f 466//1274 472//1279 520//1320
+f 520//1320 521//1321 466//1274
+f 520//1320 522//1322 523//1323 521//1321
+f 522//1322 524//1324 523//1323
+f 523//1323 524//1324 509//1311 510//1312
+s 69
+f 466//1493 521//1499 525//1501 519//1498
+f 521//1499 523//1500 526//1502 525//1501
+f 523//1500 510//1494 512//1496 526//1502
+f 519//1498 525//1501 526//1502 512//1496 511//1495 513//1497
+s 15
+f 472//1279 502//1305 520//1320
+f 520//1320 502//1305 522//1322
+f 522//1322 502//1305 527//1325 524//1324
+f 502//1305 497//1300 527//1325
+f 527//1325 528//1326 524//1324
+f 524//1324 528//1326 509//1311
+f 528//1326 517//1318 515//1316
+f 528//1326 515//1316 529//1327
+f 529//1327 509//1311 528//1326
+f 529//1327 515//1316 508//1310
+f 508//1310 509//1311 529//1327
+f 496//1299 495//1298 517//1318 528//1326
+f 528//1326 497//1300 496//1299
+f 497//1300 528//1326 527//1325
+f 495//1298 494//1297 518//1319 517//1318
+f 34//1244 37//1247 518//1319 494//1297
+f 518//1319 37//1247 38//1248 516//1317
+f 38//1248 39//1249 514//1315 516//1317
+f 35//1245 514//1315 39//1249 40//1250
+g coat
+s 1
+f 85//71 36//37 84//70
+f 40//38 41//39 531//357 530//356
+f 84//70 530//356 532//358
+f 530//356 531//357 533//359 532//358
+f 84//70 532//358 534//360 83//69
+f 532//358 533//359 535//361 534//360
+g shirt
+s 15
+f 41//1251 42//1252 531//1328
+f 531//1328 42//1252 536//1331 533//1329
+f 42//1252 43//1253 536//1331
+f 533//1329 536//1331 537//1332 535//1330
+f 536//1331 43//1253 44//1254 537//1332
+g coat
+s 1
+f 83//69 534//360 538//362 82//68
+f 82//68 538//362 45//40 1//26
+f 45//40 538//362 539//363 46//41
+f 534//360 535//361 539//363 538//362
+g shirt
+s 15
+f 535//1330 537//1332 540//1334 539//1333
+f 539//1333 540//1334 47//1256 46//1255
+f 537//1332 44//1254 48//1257 540//1334
+f 540//1334 48//1257 49//1258 47//1256
+g coat
+s 1
+f 271//252 270//251 541//364 542//365
+f 272//253 271//252 542//365 543//366
+f 273//254 272//253 543//366 544//367
+f 274//255 273//254 544//367 545//368
+f 261//242 274//255 545//368 546//369
+f 257//238 261//242 546//369
+f 545//368 544//367 547//370 548//371
+f 544//367 543//366 549//372 547//370
+f 543//366 542//365 550//373 549//372
+f 542//365 541//364 551//374 550//373
+f 270//251 281//262 552//375 541//364
+f 281//262 282//263 553//376 552//375
+f 282//263 283//264 554//377 553//376
+f 283//264 284//265 555//378 554//377
+f 284//265 11//36 50//42 555//378
+f 555//378 50//42 51//43 556//379
+f 555//378 556//379 557//380 554//377
+f 554//377 557//380 558//381 553//376
+f 553//376 558//381 559//382 552//375
+f 552//375 559//382 551//374 541//364
+g shirt
+f 412//344 560//383 413//345 411//343
+g hair
+s 71
+f 564//1503 566//1505 567//1506 565//1504
+f 565//1504 567//1506 568//1507
+f 567//1506 566//1505 569//1508
+f 568//1507 567//1506 570//1509 571//1510
+f 570//1509 567//1506 569//1508 572//1511
+f 570//1509 573//1512 571//1510
+f 571//1510 573//1512 574//1513 575//1514
+f 574//1513 576//1515 575//1514
+f 576//1515 574//1513 577//1516
+f 577//1516 578//1517 579//1518 576//1515
+f 574//1513 573//1512 580//1519 581//1520
+f 581//1520 577//1516 574//1513
+f 577//1516 581//1520 582//1521 583//1522
+f 583//1522 578//1517 577//1516
+f 583//1522 584//1523 585//1524 578//1517
+f 578//1517 585//1524 586//1525 579//1518
+f 584//1523 587//1526 588//1527 585//1524
+f 585//1524 588//1527 586//1525
+s 22
+f 52//1544 601//1559 602//1560 53//1545
+f 53//1545 602//1560 54//1546
+f 602//1560 601//1559 600//1558 603//1561
+f 603//1561 600//1558 599//1557 604//1562
+f 604//1562 599//1557 598//1556 605//1563
+f 605//1563 598//1556 597//1555 606//1564 607//1565
+f 606//1564 597//1555 596//1554
+f 596//1554 595//1553 608//1566 609//1567
+f 609//1567 607//1565 606//1564 596//1554
+f 594//1552 608//1566 595//1553
+f 594//1552 593//1551 610//1568 608//1566
+f 593//1551 611//1569 610//1568
+s off
+f 614//4 615//4 616//4
+s 71
+f 573//1512 570//1509 572//1511 580//1519
+f 580//1519 572//1511 617//1531 618//1532
+f 618//1532 617//1531 613//1530 619//1533
+f 619//1533 620//1534 582//1521 581//1520 618//1532
+f 581//1520 580//1519 618//1532
+f 620//1534 619//1533 621//1535
+s 47
+f 621//1689 619//1688 613//1687 622//1690
+f 622//1690 613//1687 612//1686
+f 623//1691 624//1692 625//1693 612//1686
+f 622//1690 612//1686 625//1693
+s 49
+f 623//1707 291//1703 289//1702 624//1708
+s 47
+f 289//1685 626//1694 627//1695 624//1692
+f 289//1685 286//1684 628//1696 626//1694
+f 628//1696 286//1684 285//1683 629//1697
+f 625//1693 624//1692 627//1695 630//1698
+f 625//1693 630//1698 631//1699 622//1690
+f 622//1690 631//1699 632//1700 633//1701 621//1689
+s 71
+f 621//1535 633//1536 634//1537 582//1521 620//1534
+f 584//1523 583//1522 582//1521 634//1537
+f 634//1537 636//1538 587//1526 584//1523
+f 588//1527 587//1526 637//1539
+f 637//1539 611//1529 593//1528 588//1527
+f 587//1526 636//1538 638//1540 637//1539
+f 637//1539 638//1540 639//1541 611//1529
+s 22
+f 611//1569 639//1570 640//1571
+f 640//1571 641//1572 610//1568 611//1569
+f 610//1568 641//1572 642//1573 608//1566
+f 608//1566 643//1574 644//1575 609//1567
+s off
+f 642//5 645//5 643//5
+s 22
+f 641//1572 640//1571 646//1577
+f 645//1576 642//1573 641//1572 646//1577
+f 646//1577 640//1571 639//1570 647//1578
+f 609//1567 644//1575 648//1579 607//1565
+f 607//1565 648//1579 649//1580
+f 649//1580 605//1563 607//1565
+f 648//1579 650//1581 651//1582 649//1580
+f 649//1580 651//1582 605//1563
+f 605//1563 651//1582 652//1583 604//1562
+f 604//1562 652//1583 653//1584 603//1561
+f 603//1561 55//1547 54//1546 602//1560
+f 603//1561 653//1584 654//1585 55//1547
+f 55//1547 654//1585 655//1586 656//1587 657//1588
+f 655//1586 654//1585 653//1584 658//1589
+f 659//1590 658//1589 653//1584 652//1583
+f 659//1590 652//1583 651//1582 650//1581
+f 646//1577 647//1578 660//1591 645//1576
+s 1
+f 645//400 661//402 662//403 643//398
+s 22
+f 645//1576 660//1591 661//1592
+s 1
+f 643//398 662//403 663//404 664//405 644//399
+s 22
+f 664//1593 665//1594 648//1579
+s 1
+f 664//405 663//404 666//407 665//406
+f 665//406 666//407 667//408
+f 667//408 668//409 669//410 665//406
+s 22
+f 669//1595 670//1596 659//1590 650//1581
+s 1
+f 669//410 668//409 671//412 670//411
+f 671//412 672//413 670//411
+f 644//399 664//405 648//401
+s 22
+f 655//1586 658//1589 672//1597 673//1598
+f 670//1596 672//1597 658//1589 659//1590
+f 655//1586 673//1598 674//1599 656//1587
+s 1
+f 674//415 676//416 677//417
+s 22
+f 674//1599 677//1601 56//1548 57//1549 675//1600
+s 1
+f 674//415 673//414 671//412 676//416
+f 671//412 673//414 672//413
+f 677//417 676//416 671//412 678//418
+f 678//418 671//412 667//408 679//419
+f 679//419 666//407 663//404
+f 667//408 671//412 668//409
+f 679//419 667//408 666//407
+f 662//403 680//420 663//404
+f 663//404 680//420 681//421
+f 663//404 681//421 682//422 683//423
+f 683//423 682//422 684//424
+f 683//423 684//424 685//425 686//426
+f 683//423 686//426 678//418 679//419 663//404
+f 680//420 662//403 661//402
+f 680//420 661//402 687//427 681//421
+s 22
+f 681//1602 687//1604 688//1605 682//1603
+f 682//1603 688//1605 689//1606
+s 1
+f 689//428 690//429 684//424 682//422
+s 22
+f 661//1592 660//1591 691//1607 687//1604
+f 688//1605 691//1607 692//1608 689//1606
+f 689//1606 692//1608 693//1609
+s 1
+f 693//430 694//431 690//429 689//428
+s 77
+f 660//1714 647//1713 638//1711
+f 660//1714 638//1711 636//1710 691//1715
+f 695//1716 691//1715 636//1710
+s 71
+f 636//1538 634//1537 696//1543 695//1542
+s 22
+f 697//1612 693//1609 692//1608
+f 692//1608 691//1607 695//1610 697//1612
+f 697//1612 698//1613 693//1609
+s 1
+f 693//430 698//434 699//435 694//431
+s 22
+f 688//1605 687//1604 691//1607
+s 1
+f 699//435 698//434 700//436 701//437
+f 701//437 700//436 702//438 703//439
+f 702//438 704//440 630//393 627//390
+f 703//439 702//438 628//391 629//392
+f 702//438 626//389 628//391
+f 702//438 627//390 626//389
+f 630//393 704//440 632//395 631//394
+f 632//395 704//440 697//433 696//432
+s 22
+f 697//1612 695//1610 696//1611
+f 697//1612 704//1614 698//1613
+s 1
+f 698//434 704//440 700//436
+f 696//432 634//397 633//396 632//395
+f 704//440 702//438 700//436
+s 77
+f 647//1713 639//1712 638//1711
+s 1
+f 629//392 285//266 705//441 706//442
+g shirt
+f 705//441 285//266 334//308 188//169
+g coat
+f 188//169 187//168 707//443 705//441
+f 707//443 187//168 189//170 708//444
+f 708//444 189//170 191//172 709//445
+f 710//446 709//445 191//172 199//180
+f 711//447 705//441 707//443
+f 707//443 708//444 712//448 711//447
+f 711//447 712//448 713//449 714//450
+f 714//450 713//449 715//451 716//452
+f 715//451 713//449 717//453 718//454
+f 713//449 712//448 719//455 717//453
+f 712//448 708//444 709//445 719//455
+g hair
+f 711//447 714//450 720//456 721//457
+f 714//450 716//452 59//45 720//456
+g coat
+f 718//454 717//453 722//458 723//459
+f 722//458 717//453 719//455 724//460
+f 724//460 719//455 709//445 710//446
+f 198//179 204//185 725//461 199//180
+f 199//180 725//461 726//462 710//446
+f 710//446 726//462 727//463 724//460
+f 724//460 727//463 728//464 722//458
+f 722//458 728//464 729//465 723//459
+g hair
+f 59//45 58//44 730//466 720//456
+f 720//456 730//466 731//467 721//457
+f 701//437 731//467 732//468 733//469
+f 733//469 699//435 701//437
+f 58//44 60//46 734//470 730//466
+f 730//466 734//470 732//468 731//467
+f 732//468 735//471 736//472 733//469
+f 733//469 736//472 694//431 699//435
+f 735//471 732//468 734//470 737//473
+f 60//46 61//47 737//473 734//470
+f 690//429 694//431 736//472
+f 736//472 735//471 738//474 690//429
+f 738//474 735//471 737//473 739//475
+f 62//48 739//475 737//473 61//47
+f 62//48 63//49 740//476 739//475
+f 739//475 740//476 685//425 738//474
+f 738//474 685//425 684//424 690//429
+f 685//425 740//476 741//477 686//426
+f 741//477 740//476 63//49 64//50
+s 22
+f 64//1550 56//1548 677//1601 741//1615
+s 1
+f 741//477 677//417 678//418 686//426
+f 711//447 721//457 742//478 706//442 705//441
+f 742//478 703//439 629//392 706//442
+f 731//467 701//437 703//439 742//478 721//457
+g coat
+f 204//185 206//187 725//461
+f 725//461 206//187 743//479 744//480
+f 744//480 743//479 257//238 745//481
+f 206//187 205//186 256//237 743//479
+f 725//461 744//480 746//482 747//483
+f 744//480 745//481 746//482
+f 725//461 747//483 748//484 726//462
+f 726//462 748//484 749//485 727//463
+f 727//463 749//485 750//486 728//464
+f 728//464 750//486 751//487 729//465
+f 751//487 750//486 752//488 753//489
+f 750//486 749//485 754//490 752//488
+f 749//485 748//484 755//491 754//490
+f 748//484 747//483 756//492 755//491
+f 747//483 746//482 756//492
+f 257//238 546//369 757//493 745//481
+f 546//369 545//368 548//371 757//493
+f 757//493 746//482 745//481
+f 757//493 548//371 758//494 746//482
+f 548//371 547//370 759//495 758//494
+f 549//372 760//496 759//495 547//370
+f 549//372 550//373 761//497 760//496
+f 550//373 551//374 762//498 761//497
+f 551//374 559//382 763//499 762//498
+f 559//382 558//381 764//500 763//499
+f 558//381 557//380 765//501 764//500
+f 556//379 766//502 765//501 557//380
+f 556//379 51//43 65//51 766//502
+f 753//489 752//488 767//503 768//504
+f 752//488 754//490 769//505 767//503
+f 754//490 755//491 770//506 769//505
+f 755//491 756//492 771//507 770//506
+f 756//492 746//482 758//494 771//507
+f 768//504 767//503 772//508 773//509
+f 767//503 769//505 774//510 772//508
+f 769//505 770//506 775//511 774//510
+f 770//506 776//512 775//511
+f 770//506 771//507 777//513 776//512
+f 771//507 758//494 759//495 777//513
+f 773//509 772//508 778//514 779//515
+f 772//508 774//510 780//516 778//514
+f 774//510 775//511 781//517 780//516
+f 775//511 776//512 782//518 781//517
+f 776//512 777//513 783//519 782//518
+f 779//515 778//514 784//520 785//521
+f 778//514 780//516 786//522 784//520
+f 780//516 781//517 787//523 786//522
+f 781//517 782//518 788//524 787//523
+f 782//518 789//525 788//524
+f 782//518 783//519 790//526 789//525
+f 785//521 784//520 791//527 792//528
+f 784//520 786//522 793//529 791//527
+f 786//522 787//523 794//530 793//529
+f 787//523 788//524 795//531 794//530
+f 788//524 789//525 796//532 795//531
+f 789//525 790//526 797//533 796//532
+f 792//528 791//527 798//534 799//535
+f 791//527 793//529 800//536 798//534
+f 793//529 794//530 801//537 800//536
+f 794//530 795//531 802//538 801//537
+f 795//531 796//532 803//539 802//538
+f 796//532 797//533 804//540 803//539
+f 799//535 798//534 805//541 806//542
+f 798//534 800//536 807//543 805//541
+f 800//536 801//537 808//544 807//543
+f 801//537 802//538 809//545 808//544
+f 802//538 803//539 810//546 809//545
+f 803//539 804//540 811//547 810//546
+f 806//542 805//541 812//548 813//549
+f 813//549 812//548 814//550 815//551
+f 815//551 814//550 816//552 817//553
+f 805//541 807//543 818//554 812//548
+f 812//548 818//554 819//555 814//550
+f 814//550 819//555 820//556 816//552
+f 807//543 808//544 821//557 818//554
+f 818//554 821//557 822//558 819//555
+f 819//555 822//558 823//559 820//556
+f 808//544 809//545 824//560 821//557
+f 821//557 824//560 825//561 822//558
+f 822//558 825//561 826//562 823//559
+f 809//545 810//546 827//563 824//560
+f 824//560 827//563 828//564 825//561
+f 825//561 828//564 829//565 826//562
+f 810//546 811//547 830//566 827//563
+f 827//563 830//566 831//567 828//564
+f 828//564 831//567 832//568 829//565
+f 777//513 759//495 760//496 783//519
+f 783//519 760//496 761//497 790//526
+f 790//526 761//497 762//498 797//533
+f 797//533 762//498 763//499 804//540
+f 804//540 763//499 764//500 811//547
+f 811//547 764//500 765//501 830//566
+f 830//566 765//501 766//502 831//567
+f 831//567 766//502 65//51 832//568
+g hair
+s 22
+f 674//1599 675//1600 657//1588 656//1587
+f 669//1595 650//1581 648//1579 665//1594
+s off
+f 608//6 642//6 643//6
+s 49
+f 563//1706 560//1705 412//1704
+s off
+f 614//7 616//7 615//7
+g shirt
+s 1
+f 340//314 341//315 153//134 154//135
+s off
+f 592//8 427//8 423//8 591//8
+s 1
+f 406//338 407//339 417//349 562//385
+s off
+f 406//9 562//9 561//9
+s 1
+f 423//352 405//337 591//388
+f 561//384 589//386 590//387 591//388 405//337
+f 405//337 406//338 561//384
+g hair
+s 49
+f 635//1709 563//1706 412//1704 291//1703 623//1707
+g coat
+s 1
+f 743//479 256//237 257//238
+g tie
+s 15
+f 497//1300 503//1306 500//1303 498//1301
+f 503//1306 501//1304 500//1303
+f 497//1300 502//1305 503//1306
+s 55
+f 500//1481 499//1480 498//1479
+s 12
+f 437//1114 395//1109 397//1111
+s 15
+f 36//1246 35//1245 40//1250
+g coat
+s 1
+f 36//37 40//38 530//356 84//70
+g shirt
+s 15
+f 28//1238 27//1237 25//1235
+f 29//1239 28//1238 25//1235 26//1236
+s off
+f 42//10 41//10 40//10
+s 15
+f 26//1236 833//1335 834//1336 29//1239
+f 29//1239 834//1336 835//1337 30//1240
+f 30//1240 835//1337 836//1338 31//1241
+f 31//1241 836//1338 837//1339 32//1242
+f 32//1242 837//1339 838//1340 33//1243
+f 33//1243 838//1340 839//1341 34//1244
+f 34//1244 839//1341 840//1342 37//1247
+f 37//1247 840//1342 841//1343 38//1248
+f 38//1248 841//1343 842//1344 39//1249
+f 39//1249 842//1344 843//1345 40//1250
+f 40//1250 843//1345 844//1346 42//1252
+f 42//1252 844//1346 845//1347 43//1253
+f 43//1253 845//1347 846//1348 44//1254
+f 44//1254 846//1348 847//1349 48//1257
+g tie
+s 13
+f 24//1717 833//1719 26//1718
+g coat
+s 83
+f 872//1745 871//1744 870//1743 869//1742 868//1741 867//1740 850//1723 849//1722 848//1721
+g shirt
+s 15
+f 49//1258 848//1350 849//1351 47//1256
+f 47//1256 849//1351 850//1352 46//1255
+g coat
+s 1
+f 46//41 850//569 851//570 45//40
+f 45//40 851//570 852//571 1//26
+f 1//26 852//571 853//572 2//27
+s 3
+f 2//964 853//968 854//969 4//965
+s 1
+f 4//29 854//573 855//574 3//28
+f 3//28 855//574 856//575 5//30
+f 5//30 856//575 857//576 6//31
+f 6//31 857//576 858//577 7//32
+f 7//32 858//577 859//578 8//33
+s 5
+f 8//986 859//1002 860//1003 9//987
+s 1
+f 9//34 860//579 861//580 10//35
+f 10//35 861//580 862//581 11//36
+f 11//36 862//581 863//582 50//42
+f 50//42 863//582 864//583 51//43
+f 51//43 864//583 865//584 65//51
+f 65//51 865//584 866//585 832//568
+f 832//568 866//585 867//586 829//565
+f 829//565 867//586 868//587 826//562
+f 826//562 868//587 869//588 823//559
+f 823//559 869//588 870//589 820//556
+f 820//556 870//589 871//590 816//552
+f 816//552 871//590 872//591 817//553
+g shirt
+s 15
+f 49//1258 48//1257 847//1349
+g coat
+s 83
+f 866//1739 865//1738 864//1737 863//1736 862//1735 861//1734 860//1733
+f 867//1740 866//1739 860//1733 859//1732 858//1731 857//1730 856//1729 855//1728 854//1727 853//1726 852//1725 851//1724 850//1723
+s 1
+f 914//599 913//598 912//597 911//596
+f 916//601 915//600 913//598 914//599
+f 918//603 917//602 915//600 916//601
+f 920//605 919//604 917//602 918//603
+f 922//607 921//606 919//604 920//605
+f 924//609 923//608 921//606 922//607
+f 926//611 925//610 923//608 924//609
+s 86
+f 876//1770 874//1769 925//1771 926//1772
+s 84
+f 874//1776 873//1775 927//1793 925//1791
+s 1
+f 925//610 927//612 928//613 923//608
+f 923//608 928//613 929//614 921//606
+s 96
+f 921//2006 929//2007 930//2008 919//2005
+f 919//2005 930//2008 931//2009 917//2004
+f 917//2004 931//2009 932//2010 915//2003
+f 915//2003 932//2010 933//2011 913//2002
+f 913//2002 933//2011 912//2001
+s 1
+f 935//616 934//615 914//599 911//596
+f 937//618 936//617 934//615 935//616
+f 939//620 938//619 936//617 937//618
+f 940//621 938//619 939//620
+f 942//623 941//622 938//619 940//621
+f 941//622 944//625 943//624 936//617 938//619
+f 943//624 946//627 945//626 934//615 936//617
+f 945//626 916//601 914//599 934//615
+f 948//629 947//628 918//603 916//601 945//626
+f 951//632 950//631 949//630 941//622 942//623
+f 941//622 949//630 944//625
+f 949//630 953//634 952//633 944//625
+f 950//631 954//635 949//630
+f 949//630 954//635 955//636 953//634
+f 948//629 945//626 946//627
+f 956//637 947//628 948//629
+f 958//639 948//629 946//627 957//638
+f 959//640 956//637 948//629 958//639
+f 952//633 953//634 960//641
+f 953//634 955//636 960//641
+f 958//639 957//638 961//642
+f 959//640 958//639 961//642
+f 952//633 962//643 943//624 944//625
+f 962//643 957//638 946//627 943//624
+f 963//644 962//643 952//633 960//641
+f 961//642 957//638 962//643 963//644
+f 955//636 965//646 964//645 960//641
+f 965//646 959//640 961//642 964//645
+f 965//646 966//647 956//637 959//640
+f 955//636 954//635 966//647 965//646
+f 964//645 961//642 963//644 960//641
+f 968//649 967//648 950//631 951//632
+f 967//648 969//650 966//647 954//635 950//631
+f 969//650 970//651 947//628 956//637 966//647
+f 970//651 920//605 918//603 947//628
+f 971//652 922//607 920//605 970//651
+f 972//653 924//609 922//607 971//652
+f 973//654 926//611 924//609 972//653
+s 84
+f 875//1777 876//1778 926//1792 973//1797
+f 973//1797 974//1798 877//1779 875//1777
+s 1
+f 972//653 975//656 974//655 973//654
+f 971//652 976//657 975//656 972//653
+f 970//651 969//650 976//657 971//652
+f 967//648 977//658 976//657 969//650
+f 968//649 978//659 977//658 967//648
+f 980//661 979//660 977//658 978//659
+f 982//663 981//662 979//660 980//661
+s 84
+f 879//1781 878//1780 981//1799 982//1800
+f 878//1780 877//1779 974//1798 981//1799
+s 1
+f 981//662 974//655 975//656 979//660
+f 979//660 975//656 976//657 977//658
+f 984//665 911//596 912//597 983//664
+f 985//666 911//596 984//665
+f 984//665 986//667 985//666
+f 983//664 988//669 987//668 986//667 984//665
+s 102
+f 989//2015 988//2014 983//2013
+f 983//2013 990//2016 989//2015
+f 912//2012 990//2016 983//2013
+s 1
+f 992//671 991//670 986//667 987//668
+g shirt
+f 996//674 992//671 995//673
+g coat
+f 998//676 997//675 991//670 992//671 996//674
+f 1000//678 997//675 998//676 999//677
+f 999//677 1002//680 1001//679 1000//678
+f 1003//681 986//667 991//670
+f 991//670 997//675 1004//682 1003//681
+f 1004//682 997//675 1000//678 1005//683
+f 1005//683 1000//678 1001//679 1006//684
+f 1008//686 1007//685 935//616 911//596
+f 911//596 985//666 1009//687 1008//686
+f 986//667 1010//688 1009//687 985//666
+f 1011//689 937//618 935//616 1007//685
+f 1012//690 939//620 937//618 1011//689
+f 1014//692 1013//691 951//632 942//623
+f 1013//691 1015//693 968//649 951//632
+f 1015//693 1016//694 978//659 968//649
+f 1016//694 1017//695 980//661 978//659
+f 1017//695 1018//696 982//663 980//661
+s 84
+f 1018//1809 880//1782 879//1781 982//1800
+s 1
+f 1019//697 940//621 939//620 1012//690
+f 1014//692 942//623 940//621 1019//697
+f 1021//699 1001//679 1002//680 1020//698
+f 1022//700 1006//684 1001//679 1021//699
+f 1024//702 1021//699 1020//698 1023//701
+f 1025//703 1022//700 1021//699 1024//702
+f 1024//702 1027//705 1026//704 1025//703
+f 1024//702 1023//701 1028//706 1027//705
+f 1026//704 1027//705 1030//708 1029//707
+f 1027//705 1028//706 1031//709 1030//708
+f 1031//709 1033//711 1032//710 1030//708
+f 1029//707 1030//708 1032//710 1034//712
+f 1036//714 1035//713 1029//707 1034//712
+f 1035//713 1037//715 1026//704 1029//707
+f 1037//715 1038//716 1025//703 1026//704
+f 1040//718 1039//717 1006//684 1022//700
+f 1039//717 1041//719 1005//683 1006//684
+f 1041//719 1042//720 1004//682 1005//683
+f 1040//718 1022//700 1025//703 1038//716
+f 1044//722 1043//721 1035//713 1036//714
+f 1043//721 1045//723 1037//715 1035//713
+f 1045//723 1046//724 1038//716 1037//715
+f 1046//724 1047//725 1040//718 1038//716
+s 84
+f 1047//1819 1048//1820 1039//1815 1040//1816
+s 1
+f 1049//727 1045//723 1043//721
+f 1051//729 1050//728 1045//723 1049//727
+f 1052//730 1046//724 1045//723 1050//728
+f 1053//731 1047//725 1046//724 1052//730
+f 1054//732 1048//726 1047//725 1053//731
+s 84
+f 1048//1820 1055//1821 1041//1817 1039//1815
+f 1055//1821 1056//1822 1042//1818 1041//1817
+s 1
+f 1054//732 1057//735 1055//733 1048//726
+f 1057//735 1058//736 1056//734 1055//733
+f 1059//737 1010//688 986//667 1003//681
+f 1004//682 1042//720 1059//737 1003//681
+f 1061//739 1060//738 1009//687 1010//688
+s off
+f 1060//11 1062//11 1008//11 1009//11
+s 1
+f 1007//685 1008//686 1062//740
+f 1063//741 1011//689 1007//685 1062//740
+f 1064//742 1012//690 1011//689 1063//741
+f 1065//743 1019//697 1012//690 1064//742
+s 89
+f 1065//2026 1066//2027 1014//2020 1019//2025
+f 1066//2027 1067//2028 1013//2019 1014//2020
+f 1067//2028 1068//2029 1015//2021 1013//2019
+f 1068//2029 1069//2030 1016//2022 1015//2021
+f 1069//2030 1070//2031 1017//2023 1016//2022
+f 1070//2031 1071//2032 1018//2024 1017//2023
+f 1071//2032 881//2018 880//2017 1018//2024
+s 84
+f 1073//1837 1072//1836 1066//1830 1065//1829
+f 1065//1829 1076//1840 1075//1839 1074//1838 1073//1837
+f 1072//1836 1077//1841 1067//1831 1066//1830
+f 1077//1841 1078//1842 1068//1832 1067//1831
+f 1078//1842 1079//1843 1069//1833 1068//1832
+f 1079//1843 1080//1844 1070//1834 1069//1833
+f 1080//1844 1081//1845 1071//1835 1070//1834
+f 882//1784 881//1783 1071//1835 1081//1845
+s off
+f 1082//12 1061//12 1010//12 1059//12
+s 84
+f 1056//1822 1082//1846 1059//1823 1042//1818
+s 1
+f 1058//736 1085//747 1084//746 1083//745 1082//744 1056//734
+s 84
+f 1082//1846 1060//1824 1061//1825
+f 1083//1847 1086//1850 1060//1824 1082//1846
+f 1063//1827 1062//1826 1060//1824
+f 1064//1828 1063//1827 1060//1824
+f 1086//1850 1087//1851 1064//1828 1060//1824
+f 1065//1829 1064//1828 1087//1851 1076//1840
+f 1085//1849 1074//1838 1075//1839 1084//1848
+g button
+f 1089//1853 1088//1852 1086//1850 1083//1847
+s 1
+f 1084//746 1090//749 1089//748 1083//745
+s 84
+f 1075//1839 1091//1855 1090//1854 1084//1848
+f 1075//1839 1076//1840 1092//1856 1091//1855
+f 1076//1840 1087//1851 1093//1857 1092//1856
+f 1093//1857 1087//1851 1086//1850 1088//1852
+s 1
+f 1089//748 1090//749 1095//751 1094//750
+s 84
+f 1094//1858 1096//1860 1088//1852 1089//1853
+f 1097//1861 1093//1857 1088//1852 1096//1860
+f 1098//1862 1092//1856 1093//1857 1097//1861
+f 1099//1863 1091//1855 1092//1856 1098//1862
+f 1095//1859 1090//1854 1091//1855 1099//1863
+s 1
+f 1094//750 1095//751 1100//752
+s 84
+f 1096//1860 1094//1858 1100//1864
+f 1097//1861 1096//1860 1100//1864
+f 1098//1862 1097//1861 1100//1864
+f 1099//1863 1098//1862 1100//1864
+f 1095//1859 1099//1863 1100//1864
+g coat
+s 1
+f 1101//753 1052//730 1050//728
+f 1101//753 1103//755 1053//731 1052//730
+f 1104//756 1054//732 1053//731 1103//755
+f 1105//757 1057//735 1054//732 1104//756
+f 1102//754 1106//758 1103//755 1101//753
+f 1106//758 1104//756 1103//755
+f 1106//758 1107//759 1105//757 1104//756
+f 1105//757 1108//760 1058//736 1057//735
+f 1109//761 1085//747 1058//736 1108//760
+s 84
+f 1110//1866 1074//1838 1085//1849 1109//1865
+f 1111//1867 1073//1837 1074//1838 1110//1866
+s 1
+f 1107//759 1112//762 1108//760 1105//757
+f 1113//763 1109//761 1108//760 1112//762
+s 84
+f 1114//1869 1110//1866 1109//1865 1113//1868
+f 1115//1870 1110//1866 1114//1869
+f 1115//1870 1111//1867 1110//1866
+f 1114//1869 1116//1871 1115//1870
+f 1113//1868 1117//1872 1116//1871 1114//1869
+s 1
+f 1112//762 1118//767 1117//766 1113//763
+f 1107//759 1119//768 1118//767 1112//762
+f 1106//758 1119//768 1107//759
+s 84
+f 1120//1873 1072//1836 1073//1837 1111//1867
+f 1121//1874 1077//1841 1072//1836 1120//1873
+f 1122//1875 1078//1842 1077//1841 1121//1874
+f 1123//1876 1079//1843 1078//1842 1122//1875
+f 1124//1877 1080//1844 1079//1843 1123//1876
+f 1125//1878 1081//1845 1080//1844 1124//1877
+f 883//1785 882//1784 1081//1845 1125//1878
+f 1115//1870 1126//1879 1120//1873 1111//1867
+f 1126//1879 1121//1874 1120//1873
+f 1126//1879 1127//1880 1122//1875 1121//1874
+f 1127//1880 1123//1876 1122//1875
+f 1127//1880 1128//1881 1124//1877 1123//1876
+f 1128//1881 1129//1882 1125//1878 1124//1877
+f 1129//1882 883//1785 1125//1878
+g shirt
+s 116
+f 1133//2038 1132//2037 1131//2036 1130//2035
+s 84
+f 1132//1885 1135//1887 1134//1886 1131//1884
+f 1134//1886 1135//1887 1137//1889 1136//1888
+f 1135//1887 1139//1891 1138//1890 1137//1889
+f 1132//1885 1140//1892 1139//1891 1135//1887
+s 116
+f 1133//2038 1141//2040 1140//2039 1132//2037
+f 1143//2042 1142//2041 1140//2039 1141//2040
+s 84
+f 1142//1893 1144//1894 1139//1891 1140//1892
+f 1144//1894 1145//1895 1138//1890 1139//1891
+f 1147//1897 1146//1896 1145//1895 1144//1894
+f 1149//1899 1148//1898 1146//1896 1147//1897
+f 1150//1900 1148//1898 1149//1899
+f 1152//1902 1151//1901 1148//1898 1150//1900
+f 1154//1904 1153//1903 1151//1901 1152//1902
+f 1156//1906 1155//1905 1154//1904 1152//1902
+f 1152//1902 1150//1900 1157//1907 1156//1906
+f 1149//1899 1158//1908 1157//1907 1150//1900
+f 1144//1894 1142//1893 1159//1909 1147//1897
+f 1159//1909 1158//1908 1149//1899 1147//1897
+s 116
+f 1143//2042 1160//2044 1159//2043 1142//2041
+f 1162//2046 1161//2045 1159//2043 1160//2044
+s 84
+f 1158//1908 1159//1909 1161//1910
+f 1161//1910 1163//1911 1157//1907 1158//1908
+s 116
+f 1162//2046 1164//2048 1163//2047 1161//2045
+s 84
+f 1166//1913 1165//1912 1155//1905 1156//1906
+f 1156//1906 1157//1907 1167//1914 1166//1913
+f 1163//1911 1167//1914 1157//1907
+s 116
+f 1164//2048 1169//2050 1168//2049 1163//2047
+s 84
+f 1168//1915 1170//1916 1167//1914 1163//1911
+f 1171//1917 1166//1913 1167//1914 1170//1916
+f 1172//1918 1165//1912 1166//1913 1171//1917
+f 1170//1916 1173//1919 1171//1917
+f 1168//1915 1173//1919 1170//1916
+f 1174//1920 1172//1918 1171//1917 1173//1919
+f 1173//1919 1175//1921 1174//1920
+f 1176//1922 1175//1921 1173//1919
+f 1173//1919 1177//1923 1176//1922
+f 1178//1924 1177//1923 1173//1919
+s 116
+f 1173//2051 1168//2049 1169//2050 1178//2052
+s 84
+f 1180//1926 1179//1925 1033//1814 1031//1813
+s 116
+f 1180//2054 1133//2038 1130//2035 1179//2053
+f 1180//2054 1181//2055 1141//2040 1133//2038
+s 84
+f 1031//1813 1028//1812 1181//1927 1180//1926
+s 116
+f 1181//2055 1182//2056 1143//2042 1141//2040
+s 84
+f 1028//1812 1023//1811 1182//1928 1181//1927
+s 116
+f 1182//2056 1183//2057 1160//2044 1143//2042
+s 84
+f 1023//1811 1020//1810 1183//1929 1182//1928
+s 116
+f 1160//2044 1183//2057 1184//2058 1162//2046
+f 1184//2058 1185//2059 1164//2048 1162//2046
+s 84
+f 1002//1808 1184//1930 1183//1929 1020//1810
+f 1002//1808 999//1807 1185//1931 1184//1930
+f 996//1805 1187//1933 1186//1932 998//1806
+f 995//1804 1188//1934 1187//1933 996//1805
+f 994//1803 1189//1935 1188//1934 995//1804
+s 1
+f 1190//774 994//672 995//673 992//671
+s 84
+f 993//1802 994//1803 1190//1936
+s 1
+f 992//671 987//668 1190//774
+s 84
+f 1191//1937 1189//1935 994//1803 993//1802
+f 1191//1937 1172//1918 1174//1920 1189//1935
+f 1175//1921 1188//1934 1189//1935 1174//1920
+f 1176//1922 1188//1934 1175//1921
+f 1176//1922 1177//1923 1188//1934
+f 1177//1923 1178//1924 1187//1933 1188//1934
+s 116
+f 1178//2052 1169//2050 1186//2060 1187//2061
+f 1169//2050 1164//2048 1185//2059 1186//2060
+s 104
+f 990//2064 1193//2066 1192//2065 989//2063
+s 103
+f 1192//2071 1194//2072 988//2069 989//2070
+s 104
+f 990//2064 912//2062 1195//2067 1193//2066
+s 103
+f 1196//2073 987//2068 988//2069 1194//2072
+s 101
+f 912//2074 933//2078 1197//2085 1195//2083
+f 1195//2083 1197//2085 1199//2087 1198//2086
+f 1199//2087 1200//2088 1198//2086
+f 1201//2089 1193//2081 1195//2083 1198//2086
+f 1198//2086 1200//2088 1201//2089
+f 1193//2081 1201//2089 1202//2090 1192//2080
+f 1203//2091 1194//2082 1192//2080 1202//2090
+f 1204//2092 1196//2084 1194//2082 1203//2091
+f 1203//2091 1206//2094 1205//2093 1204//2092
+f 1202//2090 1207//2095 1206//2094 1203//2091
+f 1208//2096 1206//2094 1207//2095
+f 1206//2094 1208//2096 1209//2097
+f 1210//2098 1205//2093 1206//2094 1209//2097
+s 84
+f 1211//1939 1190//1936 987//1801 1196//1938
+f 1211//1939 993//1802 1190//1936
+f 1213//1941 1212//1940 1191//1937 993//1802
+f 1191//1937 1212//1940 1165//1912 1172//1918
+f 1213//1941 1215//1943 1214//1942 1212//1940
+f 1214//1942 1155//1905 1165//1912 1212//1940
+s 101
+f 1216//2102 1211//2099 1196//2084 1204//2092
+f 1204//2092 1205//2093 1216//2102
+f 1205//2093 1210//2098 1217//2103 1216//2102
+f 1211//2099 1216//2102 1213//2100 993//2079
+f 1216//2102 1217//2103 1215//2101 1213//2100
+f 1217//2103 1218//2104 1215//2101
+f 1210//2098 1219//2105 1218//2104 1217//2103
+f 1210//2098 1209//2097 1220//2106 1219//2105
+g tie
+s 12
+f 1222//1135 1218//1133 1221//1134
+f 1223//1136 1222//1135 1221//1134
+s 101
+f 1219//2105 1220//2106 1221//2107
+f 1218//2104 1219//2105 1221//2107
+g shirt
+f 1224//2108 1215//2101 1218//2104
+g tie
+s 12
+f 1218//1133 1225//1138 1224//1137
+f 1218//1133 1222//1135 1226//1139 1225//1138
+f 1222//1135 1223//1136 1227//1140 1226//1139
+g shirt
+s 84
+f 1228//1945 1215//1943 1224//1944
+f 1229//1946 1214//1942 1215//1943 1228//1945
+f 1155//1905 1214//1942 1229//1946
+f 1231//1948 1230//1947 1228//1945 1224//1944
+g tie
+s 12
+f 1224//1137 1225//1138 1232//1142 1231//1141
+f 1225//1138 1226//1139 1233//1143 1232//1142
+f 1226//1139 1227//1140 1234//1144 1233//1143
+f 1232//1142 1235//1145 1231//1141
+f 1232//1142 1233//1143 1236//1146 1235//1145
+f 1236//1146 1237//1147 1235//1145
+f 1233//1143 1234//1144 1238//1148 1236//1146
+f 1236//1146 1238//1148 1239//1149 1237//1147
+f 1234//1144 1241//1151 1240//1150 1238//1148
+f 1238//1148 1240//1150 1242//1152 1239//1149
+f 1227//1140 1243//1153 1241//1151 1234//1144
+g shirt
+s 84
+f 1231//1948 1244//1949 1230//1947
+f 1245//1950 1230//1947 1244//1949
+s 8
+f 1244//1208 1246//1210 1245//1209
+f 1231//1203 1235//1204 1246//1210 1244//1208
+s 84
+f 1247//1951 1229//1946 1228//1945 1230//1947
+f 1248//1952 1247//1951 1230//1947 1245//1950
+f 1245//1950 1249//1953 1248//1952
+f 1153//1903 1154//1904 1247//1951 1248//1952
+f 1155//1905 1229//1946 1247//1951 1154//1904
+f 1250//1954 1153//1903 1248//1952 1249//1953
+f 1153//1903 1250//1954 1251//1955 1151//1901
+f 1148//1898 1151//1901 1251//1955 1252//1956
+f 1252//1956 1253//1957 1146//1896 1148//1898
+f 1254//1958 1145//1895 1146//1896 1253//1957
+f 1255//1959 1138//1890 1145//1895 1254//1958
+f 1256//1960 1137//1889 1138//1890 1255//1959
+f 1257//1961 1136//1888 1137//1889 1256//1960
+f 1255//1959 1259//1963 1258//1962 1256//1960
+f 1254//1958 1260//1964 1259//1963 1255//1959
+f 1253//1957 1261//1965 1260//1964 1254//1958
+f 1252//1956 1262//1966 1261//1965 1253//1957
+s 8
+f 1246//1210 1264//1212 1263//1211 1245//1209
+f 1235//1204 1237//1205 1264//1212 1246//1210
+f 1263//1211 1265//1213 1245//1209
+f 1265//1213 1266//1214 1245//1209
+s 84
+f 1266//1967 1267//1968 1249//1953 1245//1950
+f 1267//1968 1268//1969 1250//1954 1249//1953
+s 8
+f 1269//1216 1270//1217 1266//1214 1265//1213
+f 1265//1213 1263//1211 1271//1218 1269//1216
+s 84
+f 1266//1967 1270//1970 1267//1968
+s 8
+f 1273//1220 1272//1219 1268//1215
+s 84
+f 1268//1969 1267//1968 1270//1970 1273//1971
+s 8
+f 1275//1222 1269//1216 1271//1218 1274//1221
+f 1274//1221 15//1174 13//1172 1275//1222
+f 1275//1222 1276//1223 1270//1217 1269//1216
+s 84
+f 1270//1970 1276//1972 1273//1971
+s 8
+f 1273//1220 1276//1223 1277//1224 1272//1219
+f 1275//1222 13//1172 12//1171 1276//1223
+f 1264//1212 1278//1225 1271//1218 1263//1211
+f 1237//1205 1239//1206 1278//1225 1264//1212
+f 1242//1207 1279//1226 1278//1225 1239//1206
+f 1279//1226 1274//1221 1271//1218 1278//1225
+f 1280//1227 1274//1221 1279//1226
+f 14//1173 15//1174 1274//1221 1280//1227
+f 1280//1227 1281//1228 16//1175 14//1173
+f 1279//1226 1242//1207 1281//1228 1280//1227
+f 1276//1223 12//1171 17//1176 1277//1224
+g tie
+s 12
+f 1283//1156 1281//1154 1242//1152 1282//1155
+s 11
+f 18//2115 16//2114 1281//2117 1283//2118
+f 1283//2118 1284//2119 19//2116 18//2115
+s 12
+f 1282//1155 1285//1158 1284//1157 1283//1156
+f 1240//1150 1241//1151 1285//1158 1282//1155
+f 1243//1153 1286//1159 1241//1151
+f 1286//1159 1287//1160 1285//1158 1241//1151
+f 1287//1160 1288//1161 1284//1157 1285//1158
+f 1288//1161 20//1084 19//1083 1284//1157
+f 1243//1153 1289//1162 1286//1159
+f 1289//1162 1290//1163 1287//1160 1286//1159
+f 1290//1163 1291//1164 1288//1161 1287//1160
+f 1291//1164 21//1085 20//1084 1288//1161
+s 15
+f 1293//1381 1292//1380 1289//1379 1243//1378
+s 125
+f 1227//2127 1294//2130 1293//2129 1243//2128
+f 1294//2130 1296//2132 1295//2131 1293//2129
+f 1297//2133 1294//2130 1227//2127 1223//2126
+f 1209//2123 1298//2134 1297//2133 1220//2124
+f 1297//2133 1223//2126 1221//2125 1220//2124
+f 1298//2134 1296//2132 1294//2130 1297//2133
+f 1209//2123 1208//2122 1299//2135 1298//2134
+f 1298//2134 1299//2135 1300//2136 1296//2132
+f 1296//2132 1300//2136 1301//2137 1295//2131
+s 15
+f 1295//1382 1302//1384 1292//1380 1293//1381
+s 125
+f 1207//2121 1303//2138 1299//2135 1208//2122
+f 1299//2135 1303//2138 1300//2136
+f 1207//2121 1202//2120 1304//2139 1303//2138
+f 1303//2138 1304//2139 1305//2140 1300//2136
+f 1305//2140 1301//2137 1300//2136
+s 15
+f 1301//1383 1306//1386 1302//1384 1295//1382
+f 1305//1385 1307//1387 1306//1386 1301//1383
+s 125
+f 1304//2139 1308//2141 1305//2140
+f 1309//2142 1308//2141 1304//2139 1202//2120
+s 124
+f 1201//2148 1310//2150 1202//2149
+f 1201//2148 1312//2152 1311//2151 1310//2150
+s 15
+f 1310//1390 1313//1392 1202//1377
+f 1313//1392 1309//1389 1202//1377
+f 1310//1390 1311//1391 1314//1393 1313//1392
+f 1314//1393 1309//1389 1313//1392
+f 1314//1393 1316//1395 1315//1394 1309//1389
+f 1311//1391 1317//1396 1316//1395 1314//1393
+s 125
+f 1315//2143 1318//2144 1308//2141 1309//2142
+s 15
+f 1308//1388 1319//1398 1307//1387 1305//1385
+f 1318//1397 1320//1399 1319//1398 1308//1388
+s 12
+f 1322//1166 1321//1165 1290//1163 1289//1162
+f 1321//1165 1323//1167 1291//1164 1290//1163
+f 1323//1167 22//1086 21//1085 1291//1164
+f 1324//1168 23//1087 22//1086 1323//1167
+f 1321//1165 1325//1169 1324//1168 1323//1167
+f 1322//1166 1326//1170 1325//1169 1321//1165
+f 24//1088 23//1087 1324//1168 885//1131
+f 1324//1168 1325//1169 884//1130 885//1131
+f 1326//1170 886//1132 884//1130 1325//1169
+s 15
+f 1292//1380 1327//1402 1322//1400 1289//1379
+f 1302//1384 1328//1403 1327//1402 1292//1380
+f 1306//1386 1328//1403 1302//1384
+f 1307//1387 1328//1403 1306//1386
+f 1319//1398 1329//1404 1328//1403 1307//1387
+f 1320//1399 1330//1405 1329//1404 1319//1398
+f 1327//1402 1331//1406 1326//1401 1322//1400
+f 1328//1403 1332//1407 1331//1406 1327//1402
+f 1329//1404 1333//1408 1332//1407 1328//1403
+f 1331//1406 887//1356 886//1355 1326//1401
+f 1332//1407 888//1357 887//1356 1331//1406
+f 1333//1408 889//1358 888//1357 1332//1407
+f 1334//1409 890//1359 889//1358 1333//1408
+f 1330//1405 1334//1409 1333//1408 1329//1404
+f 1336//1411 1335//1410 1334//1409 1330//1405
+f 1335//1410 891//1360 890//1359 1334//1409
+f 1337//1412 892//1361 891//1360 1335//1410
+f 1336//1411 1338//1413 1337//1412
+f 1337//1412 1335//1410 1336//1411
+f 1336//1411 1330//1405 1320//1399 1338//1413
+f 1339//1414 893//1362 892//1361 1337//1412
+f 1340//1415 1339//1414 1337//1412
+f 1337//1412 1338//1413 1341//1416 1340//1415
+f 1343//1418 1342//1417 1341//1416 1338//1413
+f 1344//1419 1343//1418 1338//1413
+f 1338//1413 1320//1399 1318//1397 1344//1419
+s 125
+f 1315//2143 1345//2147 1344//2146 1318//2144
+s 15
+f 1316//1395 1346//1421 1345//1420 1315//1394
+f 1317//1396 1347//1422 1346//1421 1316//1395
+f 1348//1423 1346//1421 1347//1422
+s 101
+f 1200//2088 1349//2110 1312//2109 1201//2089
+f 1199//2087 1350//2111 1349//2110 1200//2088
+f 1197//2085 1350//2111 1199//2087
+f 1197//2085 933//2078 932//2077 1351//2112 1350//2111
+f 932//2077 931//2076 1352//2113 1351//2112
+f 931//2076 930//2075 1352//2113
+s 15
+f 930//1376 895//1364 1353//1427
+f 1354//1428 1352//1426 930//1376 1353//1427
+f 1355//1429 1352//1426 1354//1428
+f 1351//1425 1352//1426 1355//1429
+f 1351//1425 1355//1429 1350//1424
+f 1355//1429 1357//1431 1356//1430 1350//1424
+s 137
+f 1350//2155 1356//2156 1358//2157 1349//2154
+s 15
+f 895//1364 894//1363 1353//1427
+f 894//1363 1359//1432 1353//1427
+f 1359//1432 1361//1434 1360//1433 1353//1427
+f 1361//1434 1363//1436 1362//1435 1360//1433
+s off
+f 1312//13 1364//13 1311//13
+s 137
+f 1349//2154 1358//2157 1364//2158 1312//2153
+s 15
+f 1365//1437 1317//1396 1311//1391
+f 1311//1391 1366//1438 1365//1437
+f 1366//1438 1368//1440 1367//1439 1365//1437
+f 1368//1440 1369//1441 1367//1439
+f 1355//1429 1354//1428 1369//1441 1368//1440
+s 139
+f 1364//2164 1370//2167 1366//2165 1311//2159
+f 1370//2167 1371//2168 1368//2166 1366//2165
+f 1371//2168 1357//2162 1355//2160 1368//2166
+f 1358//2163 1356//2161 1357//2162 1371//2168 1370//2167 1364//2164
+s 15
+f 1365//1437 1347//1422 1317//1396
+f 1367//1439 1347//1422 1365//1437
+f 1369//1441 1372//1442 1347//1422 1367//1439
+f 1372//1442 1342//1417 1347//1422
+f 1369//1441 1373//1443 1372//1442
+f 1354//1428 1373//1443 1369//1441
+f 1360//1433 1362//1435 1373//1443
+f 1374//1444 1360//1433 1373//1443
+f 1373//1443 1354//1428 1374//1444
+f 1353//1427 1360//1433 1374//1444
+f 1374//1444 1354//1428 1353//1427
+f 1373//1443 1362//1435 1340//1415 1341//1416
+f 1341//1416 1342//1417 1373//1443
+f 1372//1442 1373//1443 1342//1417
+f 1362//1435 1363//1436 1339//1414 1340//1415
+f 1339//1414 1363//1436 896//1365 893//1362
+f 1361//1434 897//1366 896//1365 1363//1436
+f 1361//1434 1359//1432 898//1367 897//1366
+f 899//1368 898//1367 1359//1432 894//1363
+g coat
+s 84
+f 929//1795 895//1786 930//1796
+f 1375//1973 1376//1974 900//1788 899//1787
+f 1377//1975 1375//1973 929//1795
+f 1377//1975 1378//1976 1376//1974 1375//1973
+f 928//1794 1379//1977 1377//1975 929//1795
+f 1379//1977 1380//1978 1378//1976 1377//1975
+g shirt
+s 15
+f 1376//1445 901//1370 900//1369
+f 1378//1446 1381//1448 901//1370 1376//1445
+f 1381//1448 902//1371 901//1370
+f 1380//1447 1382//1449 1381//1448 1378//1446
+f 1382//1449 903//1372 902//1371 1381//1448
+g coat
+s 84
+f 927//1793 1383//1979 1379//1977 928//1794
+f 873//1775 904//1789 1383//1979 927//1793
+f 905//1790 1384//1980 1383//1979 904//1789
+f 1383//1979 1384//1980 1380//1978 1379//1977
+g shirt
+s 15
+f 1384//1450 1385//1451 1382//1449 1380//1447
+f 905//1373 906//1374 1385//1451 1384//1450
+f 1385//1451 907//1375 903//1372 1382//1449
+f 906//1374 49//1258 907//1375 1385//1451
+g coat
+s 1
+f 1387//776 1386//775 1115//764 1116//765
+f 1388//777 1387//776 1116//765 1117//766
+f 1389//778 1388//777 1117//766 1118//767
+f 1390//779 1389//778 1118//767 1119//768
+f 1391//780 1390//779 1119//768 1106//758
+f 1391//780 1106//758 1102//754
+f 1393//782 1392//781 1389//778 1390//779
+f 1392//781 1394//783 1388//777 1389//778
+f 1394//783 1395//784 1387//776 1388//777
+f 1395//784 1396//785 1386//775 1387//776
+f 1386//775 1397//786 1126//769 1115//764
+f 1397//786 1398//787 1127//770 1126//769
+f 1398//787 1399//788 1128//771 1127//770
+f 1399//788 1400//789 1129//772 1128//771
+f 1400//789 908//593 883//592 1129//772
+f 1401//790 909//594 908//593 1400//789
+f 1399//788 1402//791 1401//790 1400//789
+f 1398//787 1403//792 1402//791 1399//788
+f 1397//786 1404//793 1403//792 1398//787
+f 1386//775 1396//785 1404//793 1397//786
+g shirt
+s 84
+f 1256//1960 1258//1962 1405//1981 1257//1961
+g hair
+s 141
+f 1410//2170 1412//2172 1411//2171 1409//2169
+f 1413//2173 1412//2172 1410//2170
+f 1414//2174 1411//2171 1412//2172
+f 1416//2176 1415//2175 1412//2172 1413//2173
+f 1417//2177 1414//2174 1412//2172 1415//2175
+f 1416//2176 1418//2178 1415//2175
+f 1420//2180 1419//2179 1418//2178 1416//2176
+f 1420//2180 1421//2181 1419//2179
+f 1422//2182 1419//2179 1421//2181
+f 1421//2181 1424//2184 1423//2183 1422//2182
+f 1426//2186 1425//2185 1418//2178 1419//2179
+f 1419//2179 1422//2182 1426//2186
+f 1428//2188 1427//2187 1426//2186 1422//2182
+f 1422//2182 1423//2183 1428//2188
+f 1423//2183 1430//2190 1429//2189 1428//2188
+f 1424//2184 1431//2191 1430//2190 1423//2183
+f 1430//2190 1433//2193 1432//2192 1429//2189
+f 1431//2191 1433//2193 1430//2190
+s 22
+f 53//1545 1447//1625 1446//1624 52//1544
+f 54//1546 1447//1625 53//1545
+f 1448//1626 1445//1623 1446//1624 1447//1625
+f 1449//1627 1444//1622 1445//1623 1448//1626
+f 1450//1628 1443//1621 1444//1622 1449//1627
+f 1452//1630 1451//1629 1442//1620 1443//1621 1450//1628
+f 1441//1619 1442//1620 1451//1629
+f 1454//1632 1453//1631 1440//1618 1441//1619
+f 1441//1619 1451//1629 1452//1630 1454//1632
+f 1440//1618 1453//1631 1439//1617
+f 1453//1631 1455//1633 1438//1616 1439//1617
+f 1455//1633 1456//1634 1438//1616
+s off
+f 1461//14 1460//14 1459//14
+s 141
+f 1425//2185 1417//2177 1415//2175 1418//2178
+f 1463//2198 1462//2197 1417//2177 1425//2185
+f 1464//2199 1458//2196 1462//2197 1463//2198
+f 1463//2198 1426//2186 1427//2187 1465//2200 1464//2199
+f 1463//2198 1425//2185 1426//2186
+f 1466//2201 1464//2199 1465//2200
+s 117
+f 1467//2217 1458//2214 1464//2215 1466//2216
+f 1457//2213 1458//2214 1467//2217
+f 1457//2213 1470//2220 1469//2219 1468//2218
+f 1470//2220 1457//2213 1467//2217
+s 119
+f 1469//2235 1134//2229 1136//2230 1468//2234
+s 117
+f 1469//2219 1472//2222 1471//2221 1134//2212
+f 1471//2221 1473//2223 1131//2211 1134//2212
+f 1474//2224 1130//2210 1131//2211 1473//2223
+f 1475//2225 1472//2222 1469//2219 1470//2220
+f 1467//2217 1476//2226 1475//2225 1470//2220
+f 1466//2216 1478//2228 1477//2227 1476//2226 1467//2217
+s 141
+f 1465//2200 1427//2187 1479//2203 1478//2202 1466//2201
+f 1479//2203 1427//2187 1428//2188 1429//2189
+f 1429//2189 1432//2192 1481//2204 1479//2203
+f 1482//2205 1432//2192 1433//2193
+f 1433//2193 1438//2194 1456//2195 1482//2205
+f 1482//2205 1483//2206 1481//2204 1432//2192
+f 1456//2195 1484//2207 1483//2206 1482//2205
+s 22
+f 1485//1636 1484//1635 1456//1634
+f 1456//1634 1455//1633 1486//1637 1485//1636
+f 1453//1631 1487//1638 1486//1637 1455//1633
+f 1454//1632 1489//1640 1488//1639 1453//1631
+s off
+f 1488//15 1490//15 1487//15
+s 22
+f 1491//1642 1485//1636 1486//1637
+f 1491//1642 1486//1637 1487//1638 1490//1641
+f 1492//1643 1484//1635 1485//1636 1491//1642
+f 1452//1630 1493//1644 1489//1640 1454//1632
+f 1494//1645 1493//1644 1452//1630
+f 1452//1630 1450//1628 1494//1645
+f 1494//1645 1496//1647 1495//1646 1493//1644
+f 1450//1628 1496//1647 1494//1645
+f 1449//1627 1497//1648 1496//1647 1450//1628
+f 1448//1626 1498//1649 1497//1648 1449//1627
+f 1447//1625 54//1546 55//1547 1448//1626
+f 55//1547 1499//1650 1498//1649 1448//1626
+f 657//1588 1501//1652 1500//1651 1499//1650 55//1547
+f 1502//1653 1498//1649 1499//1650 1500//1651
+f 1497//1648 1498//1649 1502//1653 1503//1654
+f 1495//1646 1496//1647 1497//1648 1503//1654
+f 1490//1641 1504//1655 1492//1643 1491//1642
+s 1
+f 1488//803 1506//808 1505//807 1490//805
+s 22
+f 1505//1656 1504//1655 1490//1641
+s 1
+f 1489//804 1508//810 1507//809 1506//808 1488//803
+s 22
+f 1493//1644 1509//1658 1508//1657
+s 1
+f 1509//811 1510//812 1507//809 1508//810
+f 1511//813 1510//812 1509//811
+f 1509//811 1513//815 1512//814 1511//813
+s 22
+f 1495//1646 1503//1654 1514//1660 1513//1659
+s 1
+f 1514//816 1515//817 1512//814 1513//815
+f 1514//816 1516//818 1515//817
+f 1493//806 1508//810 1489//804
+s 22
+f 1517//1663 1516//1662 1502//1653 1500//1651
+f 1503//1654 1502//1653 1516//1662 1514//1660
+f 1501//1652 1518//1664 1517//1663 1500//1651
+f 1520//1666 1519//1665 1518//1664
+f 675//1600 57//1549 56//1548 1520//1666 1518//1664
+f 1519//1665 1515//1661 1517//1663 1518//1664
+s 1
+f 1516//818 1517//819 1515//817
+s 22
+f 1521//1667 1515//1661 1519//1665 1520//1666
+s 1
+f 1522//821 1511//813 1515//817 1521//820
+f 1507//809 1510//812 1522//821
+f 1512//814 1515//817 1511//813
+f 1510//812 1511//813 1522//821
+f 1507//809 1523//822 1506//808
+f 1524//823 1523//822 1507//809
+f 1526//825 1525//824 1524//823 1507//809
+f 1527//826 1525//824 1526//825
+f 1529//828 1528//827 1527//826 1526//825
+f 1507//809 1522//821 1521//820 1529//828 1526//825
+f 1505//807 1506//808 1523//822
+f 1524//823 1530//829 1505//807 1523//822
+s 22
+f 1525//1669 1531//1672 1530//1671 1524//1668
+f 1532//1673 1531//1672 1525//1669
+s 1
+f 1525//824 1527//826 1533//831 1532//830
+s 22
+f 1530//1671 1534//1674 1504//1655 1505//1656
+f 1532//1673 1535//1675 1534//1674 1531//1672
+f 1536//1676 1535//1675 1532//1673
+s 1
+f 1532//830 1533//831 1537//833 1536//832
+s 147
+f 1483//2238 1492//2240 1504//2241
+f 1534//2242 1481//2237 1483//2238 1504//2241
+f 1481//2237 1534//2242 1538//2243
+s 141
+f 1538//2208 1539//2209 1479//2203 1481//2204
+s 22
+f 1535//1675 1536//1676 1540//1679
+f 1540//1679 1538//1677 1534//1674 1535//1675
+f 1536//1676 1541//1680 1540//1679
+s 1
+f 1537//833 1542//837 1541//836 1536//832
+s 22
+f 1534//1674 1530//1671 1531//1672
+s 1
+f 1544//839 1543//838 1541//836 1542//837
+f 1546//841 1545//840 1543//838 1544//839
+f 1472//795 1475//798 1547//842 1545//840
+f 1474//797 1473//796 1545//840 1546//841
+f 1473//796 1471//794 1545//840
+f 1471//794 1472//795 1545//840
+f 1476//799 1477//800 1547//842 1475//798
+f 1539//834 1540//835 1547//842 1477//800
+s 22
+f 1539//1678 1538//1677 1540//1679
+f 1541//1680 1547//1681 1540//1679
+s 1
+f 1543//838 1547//842 1541//836
+f 1477//800 1478//801 1479//802 1539//834
+f 1543//838 1545//840 1547//842
+s 147
+f 1483//2238 1484//2239 1492//2240
+s 1
+f 1549//844 1548//843 1130//773 1474//797
+g shirt
+s 84
+f 1033//1814 1179//1925 1130//1883 1548//1987
+g coat
+s 1
+f 1548//843 1550//845 1032//710 1033//711
+f 1551//846 1034//712 1032//710 1550//845
+f 1552//847 1036//714 1034//712 1551//846
+f 1044//722 1036//714 1552//847 1553//848
+f 1550//845 1548//843 1554//849
+f 1554//849 1555//850 1551//846 1550//845
+f 1557//852 1556//851 1555//850 1554//849
+f 716//452 715//451 1556//851 1557//852
+f 718//454 1558//853 1556//851 715//451
+f 1558//853 1559//854 1555//850 1556//851
+f 1559//854 1552//847 1551//846 1555//850
+g hair
+f 1561//856 1560//855 1557//852 1554//849
+f 1560//855 59//45 716//452 1557//852
+g coat
+f 723//459 1562//857 1558//853 718//454
+f 1563//858 1559//854 1558//853 1562//857
+f 1553//848 1552//847 1559//854 1563//858
+f 1044//722 1564//859 1049//727 1043//721
+f 1553//848 1565//860 1564//859 1044//722
+f 1563//858 1566//861 1565//860 1553//848
+f 1562//857 1567//862 1566//861 1563//858
+f 723//459 729//465 1567//862 1562//857
+g hair
+f 1560//855 1568//863 58//44 59//45
+f 1561//856 1569//864 1568//863 1560//855
+f 1571//866 1570//865 1569//864 1544//839
+f 1544//839 1542//837 1571//866
+f 1568//863 1572//867 60//46 58//44
+f 1569//864 1570//865 1572//867 1568//863
+f 1571//866 1574//869 1573//868 1570//865
+f 1542//837 1537//833 1574//869 1571//866
+f 1575//870 1572//867 1570//865 1573//868
+f 1572//867 1575//870 61//47 60//46
+f 1574//869 1537//833 1533//831
+f 1533//831 1576//871 1573//868 1574//869
+f 1577//872 1575//870 1573//868 1576//871
+f 61//47 1575//870 1577//872 62//48
+f 1577//872 1578//873 63//49 62//48
+f 1576//871 1528//827 1578//873 1577//872
+f 1533//831 1527//826 1528//827 1576//871
+f 1529//828 1579//874 1578//873 1528//827
+f 64//50 63//49 1578//873 1579//874
+s 22
+f 1579//1682 1520//1666 56//1548 64//1550
+f 1529//1670 1521//1667 1520//1666 1579//1682
+s 1
+f 1548//843 1549//844 1580//875 1561//856 1554//849
+f 1549//844 1474//797 1546//841 1580//875
+f 1561//856 1580//875 1546//841 1544//839 1569//864
+g coat
+f 1564//859 1051//729 1049//727
+f 1582//877 1581//876 1051//729 1564//859
+f 1583//878 1102//754 1581//876 1582//877
+f 1581//876 1101//753 1050//728 1051//729
+f 1585//880 1584//879 1582//877 1564//859
+f 1584//879 1583//878 1582//877
+f 1565//860 1586//881 1585//880 1564//859
+f 1566//861 1587//882 1586//881 1565//860
+f 1567//862 1588//883 1587//882 1566//861
+f 729//465 751//487 1588//883 1567//862
+f 753//489 1589//884 1588//883 751//487
+f 1589//884 1590//885 1587//882 1588//883
+f 1590//885 1591//886 1586//881 1587//882
+f 1591//886 1592//887 1585//880 1586//881
+f 1592//887 1584//879 1585//880
+f 1583//878 1593//888 1391//780 1102//754
+f 1593//888 1393//782 1390//779 1391//780
+f 1583//878 1584//879 1593//888
+f 1584//879 1594//889 1393//782 1593//888
+f 1594//889 1595//890 1392//781 1393//782
+f 1392//781 1595//890 1596//891 1394//783
+f 1596//891 1597//892 1395//784 1394//783
+f 1597//892 1598//893 1396//785 1395//784
+f 1598//893 1599//894 1404//793 1396//785
+f 1599//894 1600//895 1403//792 1404//793
+f 1600//895 1601//896 1402//791 1403//792
+f 1402//791 1601//896 1602//897 1401//790
+f 1602//897 910//595 909//594 1401//790
+f 768//504 1603//898 1589//884 753//489
+f 1603//898 1604//899 1590//885 1589//884
+f 1604//899 1605//900 1591//886 1590//885
+f 1605//900 1606//901 1592//887 1591//886
+f 1606//901 1594//889 1584//879 1592//887
+f 773//509 1607//902 1603//898 768//504
+f 1607//902 1608//903 1604//899 1603//898
+f 1608//903 1609//904 1605//900 1604//899
+f 1609//904 1610//905 1605//900
+f 1610//905 1611//906 1606//901 1605//900
+f 1611//906 1595//890 1594//889 1606//901
+f 779//515 1612//907 1607//902 773//509
+f 1612//907 1613//908 1608//903 1607//902
+f 1613//908 1614//909 1609//904 1608//903
+f 1614//909 1615//910 1610//905 1609//904
+f 1615//910 1616//911 1611//906 1610//905
+f 785//521 1617//912 1612//907 779//515
+f 1617//912 1618//913 1613//908 1612//907
+f 1618//913 1619//914 1614//909 1613//908
+f 1619//914 1620//915 1615//910 1614//909
+f 1620//915 1621//916 1615//910
+f 1621//916 1622//917 1616//911 1615//910
+f 792//528 1623//918 1617//912 785//521
+f 1623//918 1624//919 1618//913 1617//912
+f 1624//919 1625//920 1619//914 1618//913
+f 1625//920 1626//921 1620//915 1619//914
+f 1626//921 1627//922 1621//916 1620//915
+f 1627//922 1628//923 1622//917 1621//916
+f 799//535 1629//924 1623//918 792//528
+f 1629//924 1630//925 1624//919 1623//918
+f 1630//925 1631//926 1625//920 1624//919
+f 1631//926 1632//927 1626//921 1625//920
+f 1632//927 1633//928 1627//922 1626//921
+f 1633//928 1634//929 1628//923 1627//922
+f 806//542 1635//930 1629//924 799//535
+f 1635//930 1636//931 1630//925 1629//924
+f 1636//931 1637//932 1631//926 1630//925
+f 1637//932 1638//933 1632//927 1631//926
+f 1638//933 1639//934 1633//928 1632//927
+f 1639//934 1640//935 1634//929 1633//928
+f 813//549 1641//936 1635//930 806//542
+f 815//551 1642//937 1641//936 813//549
+f 817//553 1643//938 1642//937 815//551
+f 1641//936 1644//939 1636//931 1635//930
+f 1642//937 1645//940 1644//939 1641//936
+f 1643//938 1646//941 1645//940 1642//937
+f 1644//939 1647//942 1637//932 1636//931
+f 1645//940 1648//943 1647//942 1644//939
+f 1646//941 1649//944 1648//943 1645//940
+f 1647//942 1650//945 1638//933 1637//932
+f 1648//943 1651//946 1650//945 1647//942
+f 1649//944 1652//947 1651//946 1648//943
+f 1650//945 1653//948 1639//934 1638//933
+f 1651//946 1654//949 1653//948 1650//945
+f 1652//947 1655//950 1654//949 1651//946
+f 1653//948 1656//951 1640//935 1639//934
+f 1654//949 1657//952 1656//951 1653//948
+f 1655//950 1658//953 1657//952 1654//949
+f 1616//911 1596//891 1595//890 1611//906
+f 1622//917 1597//892 1596//891 1616//911
+f 1628//923 1598//893 1597//892 1622//917
+f 1634//929 1599//894 1598//893 1628//923
+f 1640//935 1600//895 1599//894 1634//929
+f 1656//951 1601//896 1600//895 1640//935
+f 1657//952 1602//897 1601//896 1656//951
+f 1658//953 910//595 1602//897 1657//952
+g hair
+s 22
+f 1501//1652 657//1588 675//1600 1518//1664
+f 1509//1658 1493//1644 1495//1646 1513//1659
+s off
+f 1488//16 1487//16 1453//16
+s 119
+f 1257//2231 1405//2232 1408//2233
+s off
+f 1460//17 1461//17 1459//17
+g shirt
+s 84
+f 999//1807 998//1806 1186//1932 1185//1931
+s off
+f 1436//18 1268//18 1272//18 1437//18
+s 84
+f 1407//1983 1262//1966 1252//1956 1251//1955
+s off
+f 1406//19 1407//19 1251//19
+s 84
+f 1436//1986 1250//1954 1268//1969
+f 1250//1954 1436//1986 1435//1985 1434//1984 1406//1982
+f 1406//1982 1251//1955 1250//1954
+g hair
+s 119
+f 1468//2234 1136//2230 1257//2231 1408//2233 1480//2236
+g coat
+s 1
+f 1102//754 1101//753 1581//876
+g tie
+s 15
+f 1343//1418 1345//1420 1348//1423 1342//1417
+f 1345//1420 1346//1421 1348//1423
+f 1348//1423 1347//1422 1342//1417
+s 125
+f 1343//2145 1344//2146 1345//2147
+s 12
+f 1242//1152 1240//1150 1282//1155
+s 15
+f 899//1368 894//1363 895//1364
+g coat
+s 84
+f 929//1795 1375//1973 899//1787 895//1786
+g shirt
+s 15
+f 884//1353 886//1355 887//1356
+f 885//1354 884//1353 887//1356 888//1357
+s off
+f 899//20 900//20 901//20
+s 15
+f 888//1357 834//1336 833//1335 885//1354
+f 889//1358 835//1337 834//1336 888//1357
+f 890//1359 836//1338 835//1337 889//1358
+f 891//1360 837//1339 836//1338 890//1359
+f 892//1361 838//1340 837//1339 891//1360
+f 893//1362 839//1341 838//1340 892//1361
+f 896//1365 840//1342 839//1341 893//1362
+f 897//1366 841//1343 840//1342 896//1365
+f 898//1367 842//1344 841//1343 897//1366
+f 899//1368 843//1345 842//1344 898//1367
+f 901//1370 844//1346 843//1345 899//1368
+f 902//1371 845//1347 844//1346 901//1370
+f 903//1372 846//1348 845//1347 902//1371
+f 907//1375 847//1349 846//1348 903//1372
+g tie
+s 13
+f 885//1720 833//1719 24//1717
+g coat
+s 83
+f 848//1721 1659//1746 1660//1747 1677//1764 1678//1765 1679//1766 1680//1767 1681//1768 872//1745
+g shirt
+s 15
+f 906//1374 1659//1452 848//1350 49//1258
+f 905//1373 1660//1453 1659//1452 906//1374
+g coat
+s 84
+f 904//1789 1661//1989 1660//1988 905//1790
+f 873//1775 1662//1990 1661//1989 904//1789
+f 874//1776 1663//1991 1662//1990 873//1775
+s 86
+f 876//1770 1664//1774 1663//1773 874//1769
+s 84
+f 875//1777 1665//1993 1664//1992 876//1778
+f 877//1779 1666//1994 1665//1993 875//1777
+f 878//1780 1667//1995 1666//1994 877//1779
+f 879//1781 1668//1996 1667//1995 878//1780
+f 880//1782 1669//1997 1668//1996 879//1781
+s 89
+f 881//2018 1670//2034 1669//2033 880//2017
+s 84
+f 882//1784 1671//1999 1670//1998 881//1783
+f 883//1785 1672//2000 1671//1999 882//1784
+s 1
+f 908//593 1673//955 1672//954 883//592
+f 909//594 1674//956 1673//955 908//593
+f 910//595 1675//957 1674//956 909//594
+f 1658//953 1676//958 1675//957 910//595
+f 1655//950 1677//959 1676//958 1658//953
+f 1652//947 1678//960 1677//959 1655//950
+f 1649//944 1679//961 1678//960 1652//947
+f 1646//941 1680//962 1679//961 1649//944
+f 1643//938 1681//963 1680//962 1646//941
+f 817//553 872//591 1681//963 1643//938
+g shirt
+s 15
+f 847//1349 907//1375 49//1258
+g coat
+s 83
+f 1670//1757 1671//1758 1672//1759 1673//1760 1674//1761 1675//1762 1676//1763
+f 1660//1747 1661//1748 1662//1749 1663//1750 1664//1751 1665//1752 1666//1753 1667//1754 1668//1755 1669//1756 1670//1757 1676//1763 1677//1764
+g brow
+s 154
+f 1683//2245 1685//2247 1686//2248 1684//2246
+f 1684//2246 1686//2248 1687//2249
+f 1686//2248 1685//2247 1688//2250 1693//2255
+f 1693//2255 1688//2250 1689//2251 1694//2256
+f 1694//2256 1689//2251 1690//2252 1695//2257
+f 1696//2258 1691//2253 1692//2254 1697//2259
+f 1695//2257 1690//2252 1691//2253 1696//2258
+f 1697//2259 1692//2254 1682//2244
+f 1698//2260 1687//2249 1686//2248 1693//2255
+f 1698//2260 1693//2255 1694//2256 1699//2261
+f 1699//2261 1694//2256 1695//2257 1700//2262
+f 1700//2262 1695//2257 1696//2258 1701//2263
+f 1701//2263 1696//2258 1697//2259
+g eyewhite
+s 156
+f 1712//2274 1702//2264 1703//2265
+g iris
+f 1712//2274 1703//2265 1704//2266 1713//2275
+g eyewhite
+f 1702//2264 1712//2274 1714//2276 1711//2273
+f 1711//2273 1714//2276 1710//2272
+f 1709//2271 1710//2272 1715//2277
+f 1709//2271 1715//2277 1716//2278 1708//2270
+f 1716//2278 1707//2269 1708//2270
+g iris
+f 1706//2268 1707//2269 1716//2278 1717//2279
+f 1718//2280 1717//2279 1716//2278 1715//2277
+f 1719//2281 1718//2280 1715//2277 1710//2272
+f 1720//2282 1719//2281 1710//2272 1714//2276
+f 1713//2275 1720//2282 1714//2276 1712//2274
+g pupil
+f 1706//2268 1721//2283 1705//2267
+f 1705//2267 1721//2283 1704//2266
+f 1704//2266 1721//2283 1713//2275
+f 1713//2275 1721//2283 1720//2282
+f 1720//2282 1721//2283 1719//2281
+f 1719//2281 1721//2283 1718//2280
+f 1718//2280 1721//2283 1717//2279
+f 1717//2279 1721//2283 1706//2268
+g brow
+s 159
+f 1724//2286 1726//2288 1725//2287 1723//2285
+f 1727//2289 1726//2288 1724//2286
+f 1733//2295 1728//2290 1725//2287 1726//2288
+f 1734//2296 1729//2291 1728//2290 1733//2295
+f 1735//2297 1730//2292 1729//2291 1734//2296
+f 1737//2299 1732//2294 1731//2293 1736//2298
+f 1736//2298 1731//2293 1730//2292 1735//2297
+f 1722//2284 1732//2294 1737//2299
+f 1733//2295 1726//2288 1727//2289 1738//2300
+f 1739//2301 1734//2296 1733//2295 1738//2300
+f 1740//2302 1735//2297 1734//2296 1739//2301
+f 1741//2303 1736//2298 1735//2297 1740//2302
+f 1737//2299 1736//2298 1741//2303
+g eyewhite
+s 161
+f 1743//2305 1742//2304 1752//2314
+g iris
+f 1753//2315 1744//2306 1743//2305 1752//2314
+g eyewhite
+f 1751//2313 1754//2316 1752//2314 1742//2304
+f 1750//2312 1754//2316 1751//2313
+f 1755//2317 1750//2312 1749//2311
+f 1748//2310 1756//2318 1755//2317 1749//2311
+f 1748//2310 1747//2309 1756//2318
+g iris
+f 1757//2319 1756//2318 1747//2309 1746//2308
+f 1755//2317 1756//2318 1757//2319 1758//2320
+f 1750//2312 1755//2317 1758//2320 1759//2321
+f 1754//2316 1750//2312 1759//2321 1760//2322
+f 1752//2314 1754//2316 1760//2322 1753//2315
+g pupil
+f 1745//2307 1761//2323 1746//2308
+f 1744//2306 1761//2323 1745//2307
+f 1753//2315 1761//2323 1744//2306
+f 1760//2322 1761//2323 1753//2315
+f 1759//2321 1761//2323 1760//2322
+f 1758//2320 1761//2323 1759//2321
+f 1757//2319 1761//2323 1758//2320
+f 1746//2308 1761//2323 1757//2319
+g face
+s 164
+f 1762//2324 1763//2325 1764//2326 1765//2327
+f 1762//2324 1766//2328 1763//2325
+s 165
+f 1767//2337 1768//2338 1769//2339
+f 1767//2337 1769//2339 1770//2340 1771//2341
+f 1771//2341 1770//2340 1772//2342 1773//2343
+f 1773//2343 1772//2342 1774//2344 1775//2345
+s 166
+f 1776//2352 1768//2347 1777//2353
+f 1778//2354 1777//2353 1768//2347
+f 1778//2354 1768//2347 1767//2346 1779//2355
+f 1779//2355 1767//2346 1771//2348 1780//2356
+f 1781//2357 1780//2356 1771//2348 1773//2349
+f 1781//2357 1773//2349 1775//2351 1782//2358
+f 1783//2359 1777//2353 1778//2354 1784//2360
+f 1784//2360 1778//2354 1779//2355 1785//2361
+f 1785//2361 1779//2355 1780//2356 1786//2362
+f 1786//2362 1780//2356 1781//2357 1787//2363
+f 1787//2363 1781//2357 1782//2358 1788//2364
+f 1789//2365 1788//2364 1790//2366
+f 1791//2367 1790//2366 1788//2364 1782//2358
+f 1792//2368 1793//2369 1776//2352 1777//2353
+f 1794//2370 1792//2368 1777//2353 1783//2359
+f 1795//2371 1794//2370 1783//2359 1796//2372
+f 1784//2360 1796//2372 1783//2359
+f 1797//2373 1795//2371 1796//2372
+f 1798//2374 1796//2372 1784//2360
+f 1798//2374 1784//2360 1785//2361
+f 1798//2374 1785//2361 1786//2362
+f 1798//2374 1786//2362 1799//2375
+f 1800//2376 1796//2372 1798//2374
+f 1796//2372 1800//2376 1801//2377 1797//2373
+f 1802//2378 1786//2362 1787//2363
+f 1803//2379 1787//2363 1788//2364
+f 1804//2380 1788//2364 1789//2365
+f 1788//2364 1804//2380 1805//2381 1803//2379
+f 1787//2363 1803//2379 1806//2382 1802//2378
+f 1798//2374 1799//2375 1807//2383 1800//2376
+f 1808//2384 1807//2383 1799//2375 1809//2385
+f 1786//2362 1802//2378 1809//2385 1799//2375
+f 1810//2386 1809//2385 1802//2378 1806//2382
+f 1808//2384 1809//2385 1810//2386 1811//2387
+f 1811//2387 1810//2386 1812//2388 1813//2389
+f 1814//2390 1812//2388 1810//2386 1806//2382
+f 1803//2379 1805//2381 1814//2390 1806//2382
+f 1815//2391 1801//2377 1800//2376 1807//2383
+f 1816//2392 1815//2391 1807//2383 1808//2384
+f 1817//2393 1816//2392 1808//2384 1811//2387
+f 1818//2394 1817//2393 1811//2387 1813//2389
+f 1819//2395 1820//2396 1801//2377
+f 1821//2397 1819//2395 1801//2377 1815//2391
+f 1822//2398 1821//2397 1815//2391 1816//2392
+f 1823//2399 1822//2398 1816//2392 1817//2393
+f 1824//2400 1823//2399 1817//2393 1818//2394
+f 1825//2401 1826//2402 1827//2403
+f 1825//2401 1827//2403 1820//2396
+f 1825//2401 1820//2396 1819//2395 1828//2404
+f 1826//2402 1825//2401 1828//2404 1829//2405
+f 1830//2406 1828//2404 1819//2395 1821//2397
+f 1831//2407 1830//2406 1821//2397 1822//2398
+f 1832//2408 1831//2407 1822//2398 1823//2399
+f 1824//2400 1833//2409 1832//2408 1823//2399
+f 1834//2410 1824//2400 1818//2394
+f 1835//2411 1833//2409 1836//2412
+f 1833//2409 1835//2411 1837//2413 1832//2408
+f 1832//2408 1837//2413 1838//2414 1831//2407
+f 1831//2407 1838//2414 1839//2415 1830//2406
+f 1830//2406 1839//2415 1829//2405 1828//2404
+f 1840//2416 1841//2417 1842//2418 1843//2419
+f 1843//2419 1842//2418 1844//2420 1845//2421
+f 1845//2421 1844//2420 1829//2405 1839//2415
+f 1846//2422 1840//2416 1843//2419
+f 1847//2423 1840//2416 1846//2422
+f 1848//2424 1846//2422 1843//2419 1845//2421
+f 1838//2414 1848//2424 1845//2421 1839//2415
+f 1849//2425 1846//2422 1848//2424
+f 1849//2425 1848//2424 1838//2414 1837//2413
+f 1835//2411 1849//2425 1837//2413
+f 1850//2426 1849//2425 1835//2411 1836//2412
+f 1846//2422 1849//2425 1851//2427
+f 1852//2428 1851//2427 1849//2425 1850//2426
+f 1853//2429 1804//2380 1789//2365 1854//2430
+f 1805//2381 1804//2380 1853//2429 1855//2431
+f 1854//2430 1789//2365 1856//2432
+f 1857//2433 1856//2432 1789//2365 1790//2366
+f 1858//2434 1854//2430 1859//2435
+f 1860//2436 1859//2435 1854//2430 1856//2432
+f 1861//2437 1860//2436 1856//2432 1857//2433
+f 1853//2429 1854//2430 1862//2438
+f 1863//2439 1862//2438 1854//2430 1858//2434
+f 1864//2440 1858//2434 1865//2441
+f 1866//2442 1865//2441 1858//2434 1867//2443
+f 1867//2443 1858//2434 1859//2435 1868//2444
+f 1869//2445 1868//2444 1859//2435 1860//2436
+f 1869//2445 1860//2436 1861//2437 1870//2446
+f 1871//2447 1864//2440 1865//2441 1872//2448
+f 1873//2449 1871//2447 1872//2448 1874//2450
+f 1875//2451 1873//2449 1874//2450 1876//2452
+f 1876//2452 1874//2450 1877//2453 1878//2454
+f 1872//2448 1877//2453 1874//2450
+f 1866//2442 1872//2448 1865//2441
+f 1879//2455 1878//2454 1877//2453 1880//2456
+f 1880//2456 1877//2453 1872//2448 1866//2442
+f 1881//2457 1879//2455 1880//2456 1882//2458
+f 1882//2458 1880//2456 1866//2442 1867//2443
+f 1882//2458 1867//2443 1868//2444 1883//2459
+f 1881//2457 1882//2458 1883//2459 1884//2460
+f 1883//2459 1885//2461 1886//2462 1884//2460
+f 1885//2461 1883//2459 1868//2444 1869//2445
+f 1869//2445 1870//2446 1887//2463 1885//2461
+f 1885//2461 1887//2463 1888//2464 1886//2462
+f 1888//2464 1887//2463 1889//2465 1890//2466
+f 1889//2465 1887//2463 1870//2446 1891//2467
+s 164
+f 1889//2329 1891//2331 1766//2328 1762//2324
+f 1890//2330 1889//2329 1762//2324 1765//2327
+s 166
+f 1892//2468 1863//2439 1858//2434 1864//2440
+f 1893//2469 1892//2468 1864//2440 1871//2447
+f 1871//2447 1873//2449 1894//2470
+f 1895//2471 1894//2470 1873//2449 1875//2451
+f 1896//2472 1897//2473 1898//2474
+f 1899//2475 1898//2474 1897//2473 1900//2476
+f 1901//2477 1898//2474 1902//2478
+f 1901//2477 1902//2478 1903//2479 1892//2468
+f 1893//2469 1901//2477 1892//2468
+f 1892//2468 1903//2479 1904//2480 1863//2439
+f 1863//2439 1904//2480 1905//2481 1862//2438
+f 1862//2438 1905//2481 1855//2431 1853//2429
+f 1814//2390 1805//2381 1855//2431 1906//2482
+f 1906//2482 1855//2431 1905//2481 1907//2483
+f 1907//2483 1905//2481 1908//2484
+f 1905//2481 1904//2480 1908//2484
+f 1908//2484 1904//2480 1903//2479 1909//2485
+f 1909//2485 1903//2479 1902//2478 1910//2486
+f 1910//2486 1902//2478 1898//2474 1911//2487
+f 1911//2487 1898//2474 1899//2475 1912//2488
+f 1909//2485 1913//2489 1908//2484
+f 1914//2490 1915//2491 1916//2492
+f 1917//2493 1908//2484 1914//2490
+f 1908//2484 1917//2493 1918//2494 1907//2483
+f 1907//2483 1918//2494 1919//2495 1906//2482
+f 1906//2482 1919//2495 1812//2388 1814//2390
+f 1911//2487 1912//2488 1920//2496 1921//2497
+f 1911//2487 1921//2497 1922//2498 1910//2486
+f 1910//2486 1922//2498 1913//2489 1909//2485
+f 1916//2492 1915//2491 1923//2499 1924//2500
+f 1924//2500 1923//2499 1925//2501 1926//2502
+f 1926//2502 1925//2501 1927//2503 1928//2504
+f 1928//2504 1929//2505 1930//2506 1926//2502
+f 1926//2502 1930//2506 1931//2507 1924//2500
+f 1924//2500 1931//2507 1932//2508 1916//2492
+f 1916//2492 1932//2508 1933//2509 1914//2490
+f 1914//2490 1933//2509 1934//2510 1917//2493
+f 1897//2473 1896//2472 1935//2511 1900//2476
+f 1895//2471 1935//2511 1896//2472 1894//2470
+f 1917//2493 1934//2510 1936//2512 1918//2494
+f 1918//2494 1936//2512 1937//2513 1938//2514
+f 1918//2494 1938//2514 1939//2515 1919//2495
+f 1919//2495 1939//2515 1813//2389 1812//2388
+f 1939//2515 1834//2410 1818//2394 1813//2389
+f 1940//2516 1934//2510 1933//2509 1941//2517
+f 1941//2517 1933//2509 1932//2508 1942//2518
+f 1942//2518 1932//2508 1931//2507 1943//2519
+f 1943//2519 1931//2507 1930//2506 1944//2520
+f 1944//2520 1930//2506 1929//2505 1945//2521
+f 1945//2521 1946//2522 1947//2523 1944//2520
+f 1944//2520 1947//2523 1948//2524 1943//2519
+f 1943//2519 1948//2524 1949//2525 1942//2518
+f 1942//2518 1949//2525 1950//2526 1941//2517
+f 1950//2526 1940//2516 1941//2517
+f 1940//2516 1951//2527 1934//2510
+f 1952//2528 1951//2527 1940//2516 1950//2526
+f 1953//2529 1952//2528 1950//2526 1949//2525
+f 1954//2530 1953//2529 1949//2525 1948//2524
+f 1955//2531 1954//2530 1948//2524 1947//2523
+f 1956//2532 1955//2531 1947//2523 1946//2522
+f 1957//2533 1951//2527 1952//2528
+f 1958//2534 1957//2533 1952//2528 1953//2529
+f 1959//2535 1958//2534 1953//2529 1954//2530
+f 1960//2536 1959//2535 1954//2530 1955//2531
+f 1961//2537 1960//2536 1955//2531 1956//2532
+f 1962//2538 1960//2536 1961//2537 1963//2539
+f 1960//2536 1962//2538 1964//2540 1959//2535
+f 1958//2534 1959//2535 1964//2540 1965//2541
+f 1965//2541 1957//2533 1958//2534
+f 1962//2538 1963//2539 1966//2542 1967//2543
+f 1962//2538 1967//2543 1968//2544 1964//2540
+f 1964//2540 1968//2544 1969//2545 1965//2541
+f 1965//2541 1969//2545 1970//2546 1957//2533
+f 1957//2533 1970//2546 1951//2527
+f 1971//2547 1951//2527 1970//2546
+f 1971//2547 1970//2546 1969//2545 1972//2548
+f 1972//2548 1969//2545 1968//2544 1973//2549
+f 1973//2549 1968//2544 1967//2543 1974//2550
+f 1974//2550 1967//2543 1966//2542 1975//2551
+f 1976//2552 1951//2527 1971//2547
+f 1977//2553 1951//2527 1976//2552
+f 1978//2554 1951//2527 1977//2553
+f 1937//2513 1951//2527 1978//2554
+f 1936//2512 1951//2527 1937//2513
+f 1934//2510 1951//2527 1936//2512
+f 1939//2515 1938//2514 1979//2555 1834//2410
+f 1978//2554 1979//2555 1938//2514 1937//2513
+f 1980//2556 1834//2410 1979//2555
+f 1979//2555 1978//2554 1977//2553
+f 1981//2557 1977//2553 1976//2552 1982//2558
+f 1982//2558 1976//2552 1971//2547 1983//2559
+f 1972//2548 1983//2559 1971//2547
+f 1983//2559 1972//2548 1984//2560 1985//2561
+f 1986//2562 1984//2560 1972//2548 1973//2549
+f 1987//2563 1986//2562 1973//2549 1974//2550
+f 1988//2564 1987//2563 1974//2550 1975//2551
+f 1983//2559 1985//2561 1989//2565 1982//2558
+f 1982//2558 1989//2565 1990//2566 1981//2557
+f 1981//2557 1990//2566 1991//2567 1980//2556
+f 1980//2556 1991//2567 1834//2410
+f 1824//2400 1834//2410 1992//2568
+f 1993//2569 1992//2568 1834//2410 1991//2567
+f 1993//2569 1991//2567 1994//2570
+f 1990//2566 1994//2570 1991//2567
+f 1995//2571 1994//2570 1990//2566 1989//2565
+f 1996//2572 1995//2571 1989//2565 1985//2561
+f 1997//2573 1996//2572 1985//2561 1984//2560
+f 1998//2574 1997//2573 1984//2560 1986//2562
+f 1999//2575 1998//2574 1986//2562 1987//2563
+f 1988//2564 1999//2575 1987//2563
+f 1824//2400 1992//2568 2000//2576 1833//2409
+f 2001//2577 2000//2576 1992//2568 1993//2569
+f 2002//2578 2001//2577 1993//2569 1994//2570
+f 2003//2579 2002//2578 1994//2570 2004//2580
+f 2004//2580 1994//2570 1995//2571 2005//2581
+f 1996//2572 2005//2581 1995//2571
+f 2006//2582 2004//2580 2005//2581 2007//2583
+f 2008//2584 2007//2583 2005//2581 1996//2572
+f 2006//2582 2003//2579 2004//2580
+f 2008//2584 1996//2572 1997//2573 2009//2585
+f 2009//2585 1997//2573 1998//2574 2010//2586
+f 2010//2586 1998//2574 1999//2575 2011//2587
+f 2012//2588 2003//2579 2013//2589
+f 2012//2588 2013//2589 2014//2590 2015//2591
+f 2016//2592 2012//2588 2015//2591
+f 2017//2593 2016//2592 2015//2591
+f 2017//2593 2015//2591 2018//2594
+f 2019//2595 2003//2579 2006//2582
+f 2018//2594 2015//2591 2014//2590
+f 2007//2583 2019//2595 2006//2582
+f 2020//2596 2019//2595 2007//2583 2008//2584
+f 2021//2597 2020//2596 2008//2584 2009//2585
+f 2019//2595 2020//2596 2022//2598 2023//2599
+f 2013//2589 2003//2579 2019//2595 2023//2599
+f 2024//2600 2012//2588 2016//2592
+f 2002//2578 2024//2600 2025//2601 2001//2577
+f 2001//2577 2025//2601 2026//2602 2000//2576
+f 2000//2576 2026//2602 1836//2412 1833//2409
+f 2024//2600 2016//2592 2027//2603 2028//2604
+f 2024//2600 2028//2604 2029//2605 2025//2601
+f 2025//2601 2029//2605 2030//2606 2026//2602
+f 2026//2602 2030//2606 1850//2426 1836//2412
+f 2031//2607 2014//2590 2013//2589 2023//2599
+f 2031//2607 2023//2599 2022//2598 2032//2608
+f 2033//2609 2034//2610 2035//2611
+f 2031//2607 2034//2610 2018//2594 2014//2590
+f 2034//2610 2033//2609 2036//2612 2018//2594
+f 2017//2593 2018//2594 2036//2612 2037//2613
+f 2038//2614 2036//2612 2033//2609 2039//2615
+f 2039//2615 2033//2609 2035//2611 2040//2616
+f 2040//2616 2035//2611 2041//2617
+f 2040//2616 2041//2617 2042//2618 2043//2619
+f 2044//2620 2037//2613 2036//2612 2038//2614
+f 2031//2607 2032//2608 2035//2611 2034//2610
+f 2039//2615 2040//2616 2043//2619 2045//2621
+f 2042//2618 2041//2617 2046//2622 2047//2623
+f 2041//2617 2035//2611 2048//2624 2046//2622
+f 2048//2624 2035//2611 2032//2608 2049//2625
+f 2049//2625 2032//2608 2022//2598 2050//2626
+f 2022//2598 2020//2596 2021//2597 2050//2626
+f 2047//2623 2046//2622 2051//2627 2052//2628
+f 2038//2614 2039//2615 2045//2621 2053//2629
+f 2044//2620 2038//2614 2053//2629 2054//2630
+f 2055//2631 2044//2620 2054//2630 2056//2632
+f 2044//2620 2055//2631 2057//2633 2037//2613
+f 2017//2593 2037//2613 2057//2633 2058//2634
+f 2058//2634 2057//2633 2059//2635 2060//2636
+f 2061//2637 2059//2635 2057//2633 2055//2631
+f 2062//2638 2061//2637 2055//2631 2056//2632
+f 2063//2639 2016//2592 2017//2593 2058//2634
+f 2027//2603 2016//2592 2063//2639
+f 2064//2640 2063//2639 2058//2634 2060//2636
+f 2065//2641 2027//2603 2063//2639
+f 2065//2641 2063//2639 2064//2640 2066//2642
+f 2027//2603 2065//2641 2028//2604
+f 2067//2643 2061//2637 2062//2638 2068//2644
+f 2061//2637 2067//2643 2069//2645 2059//2635
+f 2059//2635 2069//2645 2070//2646 2060//2636
+f 2060//2636 2070//2646 2071//2647 2064//2640
+f 2068//2644 2072//2648 2073//2649 2067//2643
+f 2067//2643 2073//2649 2074//2650 2069//2645
+f 2069//2645 2074//2650 2075//2651 2070//2646
+f 2070//2646 2075//2651 2076//2652 2071//2647
+f 2072//2648 2077//2653 2078//2654 2073//2649
+f 2073//2649 2078//2654 2079//2655 2074//2650
+f 2074//2650 2079//2655 2080//2656 2075//2651
+f 2081//2657 2078//2654 2077//2653 2082//2658
+f 2081//2657 2083//2659 2079//2655 2078//2654
+f 2084//2660 2083//2659 2081//2657
+f 2084//2660 2081//2657 2082//2658 2085//2661
+f 2086//2662 2084//2660 2087//2663 2088//2664
+f 2083//2659 2084//2660 2086//2662
+f 2087//2663 2084//2660 2085//2661 2089//2665
+f 2090//2666 2087//2663 2089//2665 2091//2667
+f 2092//2668 2090//2666 2091//2667 2093//2669
+f 2090//2666 2094//2670 2088//2664 2087//2663
+f 2090//2666 2095//2671 2094//2670
+f 2096//2672 2095//2671 2090//2666 2092//2668
+f 1841//2417 1840//2416 2097//2673
+f 1847//2423 2097//2673 1840//2416
+f 2098//2674 2097//2673 1847//2423
+f 2099//2675 2098//2674 1847//2423
+f 2100//2676 2097//2673 2098//2674
+f 2100//2676 2098//2674 2101//2677 2102//2678
+f 2103//2679 2101//2677 2098//2674 2104//2680
+f 2104//2680 2098//2674 2099//2675
+f 2104//2680 2099//2675 2105//2681 2106//2682
+f 2103//2679 2104//2680 2106//2682 2107//2683
+f 2108//2684 2103//2679 2107//2683
+f 2109//2685 2101//2677 2103//2679
+f 2102//2678 2101//2677 2110//2686 2111//2687
+f 2112//2688 2110//2686 2101//2677 2109//2685
+f 2113//2689 2112//2688 2109//2685 2114//2690
+f 2114//2690 2109//2685 2103//2679 2108//2684
+f 2115//2691 2106//2682 2105//2681 2116//2692
+f 2107//2683 2106//2682 2115//2691 2117//2693
+f 2108//2684 2107//2683 2117//2693 2118//2694
+f 2114//2690 2108//2684 2118//2694 2119//2695
+f 2113//2689 2114//2690 2119//2695 2120//2696
+f 2121//2697 2113//2689 2120//2696 2122//2698
+f 2113//2689 2121//2697 2123//2699 2112//2688
+f 2112//2688 2123//2699 2110//2686
+f 2110//2686 2123//2699 2111//2687
+f 2095//2671 2115//2691 2124//2700 2094//2670
+f 2116//2692 2124//2700 2115//2691
+f 2124//2700 2116//2692 2125//2701
+f 2124//2700 2125//2701 2088//2664 2094//2670
+f 2086//2662 2088//2664 2125//2701
+f 2117//2693 2115//2691 2095//2671 2096//2672
+f 2118//2694 2117//2693 2096//2672 2126//2702
+f 2126//2702 2096//2672 2092//2668 2127//2703
+f 2127//2703 2092//2668 2093//2669 2128//2704
+f 2119//2695 2118//2694 2126//2702 2129//2705
+f 2120//2696 2119//2695 2129//2705 2130//2706
+f 2122//2698 2120//2696 2130//2706 2131//2707
+f 2132//2708 2123//2699 2121//2697
+f 2133//2709 2132//2708 2121//2697 2122//2698
+f 2134//2710 2133//2709 2122//2698 2131//2707
+f 2135//2711 2129//2705 2126//2702 2127//2703
+f 2136//2712 2135//2711 2127//2703 2128//2704
+f 2137//2713 2130//2706 2129//2705 2135//2711
+f 2138//2714 2137//2713 2135//2711 2136//2712
+f 2139//2715 2131//2707 2130//2706 2137//2713
+f 2140//2716 2139//2715 2137//2713 2138//2714
+f 2141//2717 2134//2710 2131//2707 2139//2715
+f 2142//2718 2141//2717 2139//2715 2140//2716
+f 2143//2719 2075//2651 2080//2656
+f 2066//2642 2064//2640 2071//2647 2144//2720
+f 2076//2652 2145//2721 2144//2720 2071//2647
+f 2075//2651 2143//2719 2146//2722 2076//2652
+f 2076//2652 2146//2722 2145//2721
+f 2080//2656 2079//2655 2083//2659 2147//2723
+f 2148//2724 2083//2659 2086//2662
+f 2080//2656 2147//2723 2149//2725 2143//2719
+f 2143//2719 2149//2725 2146//2722
+f 2148//2724 2086//2662 2125//2701 2150//2726
+f 2150//2726 2125//2701 2116//2692 2151//2727
+f 2151//2727 2116//2692 2105//2681 2152//2728
+f 2152//2728 2105//2681 2099//2675 2153//2729
+f 2153//2729 2099//2675 1847//2423 2154//2730
+f 2154//2730 1847//2423 1846//2422
+f 2155//2731 2145//2721 2146//2722 2149//2725
+f 2156//2732 2155//2731 2149//2725
+f 2156//2732 2149//2725 2157//2733
+f 2158//2734 2159//2735 2160//2736
+f 2156//2732 2157//2733 2161//2737 2162//2738
+f 2162//2738 2161//2737 2159//2735 2158//2734
+f 2163//2739 2156//2732 2162//2738
+f 2163//2739 2162//2738 2158//2734 2164//2740
+f 2164//2740 2158//2734 2160//2736 2165//2741
+f 2165//2741 2160//2736 2166//2742 2167//2743
+f 2168//2744 2156//2732 2163//2739 2169//2745
+f 2169//2745 2163//2739 2164//2740 2170//2746
+f 2170//2746 2164//2740 2165//2741 2171//2747
+f 2171//2747 2165//2741 2167//2743 2172//2748
+f 2173//2749 2172//2748 2167//2743 1851//2427
+f 2167//2743 2166//2742 1846//2422 1851//2427
+f 2173//2749 1851//2427 1852//2428
+f 2144//2720 2145//2721 2174//2750
+f 2175//2751 2145//2721 2155//2731
+f 2175//2751 2155//2731 2156//2732 2168//2744
+f 2176//2752 2174//2750 2145//2721
+f 2144//2720 2174//2750 2066//2642
+f 2030//2606 1852//2428 1850//2426
+f 1852//2428 2030//2606 2177//2753 2178//2754
+f 2179//2755 2177//2753 2030//2606 2029//2605
+f 2180//2756 2179//2755 2029//2605 2028//2604
+f 2181//2757 2180//2756 2028//2604 2065//2641
+f 2174//2750 2181//2757 2065//2641 2066//2642
+f 2182//2758 2173//2749 1852//2428 2178//2754
+f 2183//2759 2172//2748 2173//2749 2182//2758
+f 2172//2748 2183//2759 2184//2760 2171//2747
+f 2171//2747 2184//2760 2185//2761 2170//2746
+f 2170//2746 2185//2761 2186//2762 2169//2745
+f 2169//2745 2186//2762 2187//2763 2168//2744
+f 2175//2751 2168//2744 2187//2763
+f 2145//2721 2175//2751 2188//2764 2176//2752
+f 2188//2764 2175//2751 2187//2763 2189//2765
+f 2189//2765 2187//2763 2186//2762 2190//2766
+f 2191//2767 2190//2766 2186//2762 2185//2761
+f 2191//2767 2185//2761 2184//2760 2192//2768
+f 2192//2768 2184//2760 2183//2759 2193//2769
+f 2194//2770 2193//2769 2178//2754 2177//2753
+f 2179//2755 2194//2770 2177//2753
+f 2195//2771 2194//2770 2179//2755 2180//2756
+f 2196//2772 2195//2771 2180//2756 2181//2757
+f 2174//2750 2176//2752 2196//2772 2181//2757
+f 2193//2769 2183//2759 2182//2758
+f 2193//2769 2182//2758 2178//2754
+f 2197//2773 1795//2371 1797//2373 2198//2774
+f 2197//2773 2198//2774 2199//2775 2200//2776
+f 2200//2776 2199//2775 2201//2777 2202//2778
+s 185
+f 2202//3180 2201//3179 2203//3181 2204//3182
+f 2203//3181 2201//3179 2199//3178 2205//3183
+f 2206//3184 2205//3183 2199//3178 2198//3177
+f 2207//3185 2206//3184 2198//3177 1797//3176
+f 2208//3186 2209//3187 2203//3181 2205//3183
+f 2210//3188 2208//3186 2205//3183 2206//3184
+f 2211//3189 2210//3188 2206//3184 2207//3185
+f 2209//3187 2204//3182 2203//3181
+f 2212//3190 2213//3191 2204//3182 2209//3187
+f 2214//3192 2212//3190 2209//3187 2208//3186
+f 2215//3193 2214//3192 2208//3186 2210//3188
+f 2216//3194 2215//3193 2210//3188 2211//3189
+s 188
+f 2217//3199 2216//3198 2211//3196
+f 2213//3197 2218//3200 2217//3199
+f 2217//3199 2218//3200 2216//3198
+s 185
+f 2216//3194 2218//3195 2215//3193
+s 187
+f 2215//3204 2218//3205 2214//3203
+f 2214//3203 2218//3205 2212//3201
+f 2212//3201 2218//3205 2213//3202
+s 189
+f 2219//3207 2202//3206 2220//3208
+f 2219//3207 2220//3208 2221//3209 2222//3210
+s 169
+f 2223//3218 2222//3217 2221//3216 2224//3219
+f 2224//3219 2221//3216 1793//3212 1792//3211
+f 1794//3213 1795//3214 2197//3215 2225//3220
+f 2225//3220 2224//3219 1792//3211 1794//3213
+s 186
+f 2202//3224 2226//3225 2200//3223
+f 2197//3222 2200//3223 2226//3225
+s 169
+f 2223//3218 2226//3221 2222//3217
+f 2197//3215 2226//3221 2225//3220
+f 2225//3220 2226//3221 2223//3218 2224//3219
+s off
+f 2226//21 2202//21 2219//21 2222//21
+s 190
+f 2227//3226 2228//3227 2229//3228 2230//3229
+s 166
+f 1775//2351 1774//2350 1791//2367 1782//2358
+f 2051//2627 2010//2586 2011//2587 2052//2628
+f 2021//2597 2009//2585 2231//2781 2232//2782
+s off
+f 2009//22 2010//22 2229//22 2231//22
+s 181
+f 2010//3232 2051//3234 2230//3237 2229//3236
+f 2051//3234 2046//3233 2227//3235 2230//3237
+s 166
+f 2046//2622 2048//2624 2228//2780 2227//2779
+f 2048//2624 2049//2625 2233//2783 2228//2780
+f 2049//2625 2050//2626 2234//2784 2233//2783
+f 2050//2626 2021//2597 2232//2782 2234//2784
+f 1921//2497 1920//2496 1927//2503 1925//2501
+f 1922//2498 1921//2497 1925//2501 1923//2499
+f 1913//2489 1922//2498 1923//2499 1915//2491
+f 1915//2491 1908//2484 1913//2489
+f 2024//2600 2002//2578 2003//2579 2012//2588
+f 1915//2491 1914//2490 1908//2484
+s 164
+f 1765//2327 1764//2326 2235//2332 2236//2333
+f 2235//2332 2237//2334 2236//2333
+s 191
+f 2238//3238 2239//3239 2240//3240
+f 2241//3241 2242//3242 2238//3238 2240//3240
+f 2243//3243 2244//3244 2242//3242 2241//3241
+f 2245//3245 2246//3246 2244//3244 2243//3243
+s 166
+f 2247//2791 2239//2785 2248//2792
+f 2239//2785 2247//2791 2249//2793
+f 2250//2794 2240//2786 2239//2785 2249//2793
+f 2251//2795 2241//2787 2240//2786 2250//2794
+f 2243//2788 2241//2787 2251//2795 2252//2796
+f 2253//2797 2245//2789 2243//2788 2252//2796
+f 2254//2798 2249//2793 2247//2791 2255//2799
+f 2256//2800 2250//2794 2249//2793 2254//2798
+f 2257//2801 2251//2795 2250//2794 2256//2800
+f 2258//2802 2252//2796 2251//2795 2257//2801
+f 2259//2803 2253//2797 2252//2796 2258//2802
+f 2260//2804 2259//2803 2261//2805
+f 2253//2797 2259//2803 2260//2804 2262//2806
+f 2247//2791 2248//2792 2263//2807 2264//2808
+f 2255//2799 2247//2791 2264//2808 2265//2809
+f 2266//2810 2255//2799 2265//2809 2267//2811
+f 2255//2799 2266//2810 2254//2798
+f 2266//2810 2267//2811 2268//2812
+f 2254//2798 2266//2810 2269//2813
+f 2256//2800 2254//2798 2269//2813
+f 2257//2801 2256//2800 2269//2813
+f 2270//2814 2257//2801 2269//2813
+f 2269//2813 2266//2810 2271//2815
+f 2268//2812 2272//2816 2271//2815 2266//2810
+f 2258//2802 2257//2801 2273//2817
+f 2259//2803 2258//2802 2274//2818
+f 2261//2805 2259//2803 2275//2819
+f 2274//2818 2276//2820 2275//2819 2259//2803
+f 2273//2817 2277//2821 2274//2818 2258//2802
+f 2271//2815 2278//2822 2270//2814 2269//2813
+f 2279//2823 2270//2814 2278//2822 2280//2824
+f 2270//2814 2279//2823 2273//2817 2257//2801
+f 2277//2821 2273//2817 2279//2823 2281//2825
+f 2282//2826 2281//2825 2279//2823 2280//2824
+f 2283//2827 2284//2828 2281//2825 2282//2826
+f 2277//2821 2281//2825 2284//2828 2285//2829
+f 2277//2821 2285//2829 2276//2820 2274//2818
+f 2278//2822 2271//2815 2272//2816 2286//2830
+f 2280//2824 2278//2822 2286//2830 2287//2831
+f 2282//2826 2280//2824 2287//2831 2288//2832
+f 2283//2827 2282//2826 2288//2832 2289//2833
+f 2272//2816 2290//2834 2291//2835
+f 2286//2830 2272//2816 2291//2835 2292//2836
+f 2287//2831 2286//2830 2292//2836 2293//2837
+f 2288//2832 2287//2831 2293//2837 2294//2838
+f 2289//2833 2288//2832 2294//2838 2295//2839
+f 2296//2840 2297//2841 2298//2842
+f 2290//2834 2296//2840 2298//2842
+f 2299//2843 2291//2835 2290//2834 2298//2842
+f 2300//2844 2299//2843 2298//2842 2297//2841
+f 2292//2836 2291//2835 2299//2843 2301//2845
+f 2293//2837 2292//2836 2301//2845 2302//2846
+f 2294//2838 2293//2837 2302//2846 2303//2847
+f 2294//2838 2303//2847 2304//2848 2295//2839
+f 2289//2833 2295//2839 2305//2849
+f 2306//2850 2304//2848 2307//2851
+f 2303//2847 2308//2852 2307//2851 2304//2848
+f 2302//2846 2309//2853 2308//2852 2303//2847
+f 2301//2845 2310//2854 2309//2853 2302//2846
+f 2299//2843 2300//2844 2310//2854 2301//2845
+f 2311//2855 2312//2856 2313//2857 2314//2858
+f 2315//2859 2316//2860 2312//2856 2311//2855
+f 2310//2854 2300//2844 2316//2860 2315//2859
+f 2311//2855 2314//2858 2317//2861
+f 2317//2861 2314//2858 2318//2862
+f 2315//2859 2311//2855 2317//2861 2319//2863
+f 2310//2854 2315//2859 2319//2863 2309//2853
+f 2319//2863 2317//2861 2320//2864
+f 2308//2852 2309//2853 2319//2863 2320//2864
+f 2308//2852 2320//2864 2307//2851
+f 2306//2850 2307//2851 2320//2864 2321//2865
+f 2322//2866 2320//2864 2317//2861
+f 2321//2865 2320//2864 2322//2866 2323//2867
+f 2324//2868 2261//2805 2275//2819 2325//2869
+f 2326//2870 2325//2869 2275//2819 2276//2820
+f 2327//2871 2261//2805 2324//2868
+f 2260//2804 2261//2805 2327//2871 2328//2872
+f 2329//2873 2324//2868 2330//2874
+f 2327//2871 2324//2868 2329//2873 2331//2875
+f 2328//2872 2327//2871 2331//2875 2332//2876
+f 2333//2877 2324//2868 2325//2869
+f 2330//2874 2324//2868 2333//2877 2334//2878
+f 2335//2879 2330//2874 2336//2880
+f 2337//2881 2330//2874 2335//2879 2338//2882
+f 2339//2883 2329//2873 2330//2874 2337//2881
+f 2331//2875 2329//2873 2339//2883 2340//2884
+f 2341//2885 2332//2876 2331//2875 2340//2884
+f 2342//2886 2335//2879 2336//2880 2343//2887
+f 2344//2888 2342//2886 2343//2887 2345//2889
+f 1876//2452 2344//2888 2345//2889 1875//2451
+f 1878//2454 2346//2890 2344//2888 1876//2452
+f 2344//2888 2346//2890 2342//2886
+f 2335//2879 2342//2886 2338//2882
+f 2347//2891 2346//2890 1878//2454 1879//2455
+f 2338//2882 2342//2886 2346//2890 2347//2891
+f 2348//2892 2347//2891 1879//2455 1881//2457
+f 2337//2881 2338//2882 2347//2891 2348//2892
+f 2349//2893 2339//2883 2337//2881 2348//2892
+f 1884//2460 2349//2893 2348//2892 1881//2457
+f 1884//2460 1886//2462 2350//2894 2349//2893
+f 2340//2884 2339//2883 2349//2893 2350//2894
+f 2350//2894 2351//2895 2341//2885 2340//2884
+f 1886//2462 1888//2464 2351//2895 2350//2894
+f 1890//2466 2352//2896 2351//2895 1888//2464
+f 2353//2897 2341//2885 2351//2895 2352//2896
+s 164
+f 2236//2333 2237//2334 2353//2336 2352//2335
+f 1765//2327 2236//2333 2352//2335 1890//2330
+s 166
+f 2336//2880 2330//2874 2334//2878 2354//2898
+f 2343//2887 2336//2880 2354//2898 2355//2899
+f 2343//2887 2355//2899 2356//2900
+f 1875//2451 2345//2889 2357//2901 1895//2471
+f 2356//2900 2355//2899 2358//2902
+f 1900//2476 2359//2903 2360//2904 1899//2475
+f 2361//2905 2360//2904 2358//2902
+f 2354//2898 2362//2906 2361//2905 2358//2902
+f 2354//2898 2358//2902 2355//2899
+f 2334//2878 2363//2907 2362//2906 2354//2898
+f 2333//2877 2364//2908 2363//2907 2334//2878
+f 2325//2869 2326//2870 2364//2908 2333//2877
+f 2365//2909 2326//2870 2276//2820 2285//2829
+f 2366//2910 2364//2908 2326//2870 2365//2909
+f 2367//2911 2364//2908 2366//2910
+f 2367//2911 2363//2907 2364//2908
+f 2368//2912 2362//2906 2363//2907 2367//2911
+f 2369//2913 2361//2905 2362//2906 2368//2912
+f 2370//2914 2360//2904 2361//2905 2369//2913
+f 1912//2488 1899//2475 2360//2904 2370//2914
+f 2367//2911 2371//2915 2368//2912
+f 2372//2916 2373//2917 2374//2918
+f 2374//2918 2367//2911 2375//2919
+f 2366//2910 2376//2920 2375//2919 2367//2911
+f 2365//2909 2377//2921 2376//2920 2366//2910
+f 2285//2829 2284//2828 2377//2921 2365//2909
+f 2378//2922 1920//2496 1912//2488 2370//2914
+f 2369//2913 2379//2923 2378//2922 2370//2914
+f 2368//2912 2371//2915 2379//2923 2369//2913
+f 2380//2924 2381//2925 2373//2917 2372//2916
+f 2382//2926 2383//2927 2381//2925 2380//2924
+f 1928//2504 1927//2503 2383//2927 2382//2926
+f 2382//2926 2384//2928 1929//2505 1928//2504
+f 2380//2924 2385//2929 2384//2928 2382//2926
+f 2372//2916 2386//2930 2385//2929 2380//2924
+f 2374//2918 2387//2931 2386//2930 2372//2916
+f 2375//2919 2388//2932 2387//2931 2374//2918
+f 1900//2476 1935//2511 2356//2900 2359//2903
+f 2357//2901 2356//2900 1935//2511 1895//2471
+f 2376//2920 2389//2933 2388//2932 2375//2919
+f 2390//2934 2391//2935 2389//2933 2376//2920
+f 2377//2921 2392//2936 2390//2934 2376//2920
+f 2284//2828 2283//2827 2392//2936 2377//2921
+f 2283//2827 2289//2833 2305//2849 2392//2936
+f 2393//2937 2387//2931 2388//2932 2394//2938
+f 2395//2939 2386//2930 2387//2931 2393//2937
+f 2396//2940 2385//2929 2386//2930 2395//2939
+f 2397//2941 2384//2928 2385//2929 2396//2940
+f 1945//2521 1929//2505 2384//2928 2397//2941
+f 2397//2941 2398//2942 1946//2522 1945//2521
+f 2396//2940 2399//2943 2398//2942 2397//2941
+f 2395//2939 2400//2944 2399//2943 2396//2940
+f 2393//2937 2401//2945 2400//2944 2395//2939
+f 2393//2937 2394//2938 2401//2945
+f 2388//2932 2402//2946 2394//2938
+f 2401//2945 2394//2938 2402//2946 2403//2947
+f 2400//2944 2401//2945 2403//2947 2404//2948
+f 2399//2943 2400//2944 2404//2948 2405//2949
+f 2398//2942 2399//2943 2405//2949 2406//2950
+f 1946//2522 2398//2942 2406//2950 1956//2532
+f 2403//2947 2402//2946 2407//2951
+f 2404//2948 2403//2947 2407//2951 2408//2952
+f 2405//2949 2404//2948 2408//2952 2409//2953
+f 2406//2950 2405//2949 2409//2953 2410//2954
+f 1956//2532 2406//2950 2410//2954 1961//2537
+f 1963//2539 1961//2537 2410//2954 2411//2955
+f 2409//2953 2412//2956 2411//2955 2410//2954
+f 2413//2957 2412//2956 2409//2953 2408//2952
+f 2408//2952 2407//2951 2413//2957
+f 2414//2958 1966//2542 1963//2539 2411//2955
+f 2412//2956 2415//2959 2414//2958 2411//2955
+f 2413//2957 2416//2960 2415//2959 2412//2956
+f 2407//2951 2417//2961 2416//2960 2413//2957
+f 2402//2946 2417//2961 2407//2951
+f 2417//2961 2402//2946 2418//2962
+f 2419//2963 2416//2960 2417//2961 2418//2962
+f 2420//2964 2415//2959 2416//2960 2419//2963
+f 2421//2965 2414//2958 2415//2959 2420//2964
+f 1975//2551 1966//2542 2414//2958 2421//2965
+f 2418//2962 2402//2946 2422//2966
+f 2422//2966 2402//2946 2423//2967
+f 2423//2967 2402//2946 2424//2968
+f 2424//2968 2402//2946 2391//2935
+f 2391//2935 2402//2946 2389//2933
+f 2389//2933 2402//2946 2388//2932
+f 2305//2849 2425//2969 2390//2934 2392//2936
+f 2391//2935 2390//2934 2425//2969 2424//2968
+f 2425//2969 2305//2849 2426//2970
+f 2425//2969 2426//2970 2427//2971
+f 2428//2972 2422//2966 2423//2967 2427//2971
+f 2429//2973 2418//2962 2422//2966 2428//2972
+f 2418//2962 2429//2973 2419//2963
+f 2430//2974 2431//2975 2419//2963 2429//2973
+f 2420//2964 2419//2963 2431//2975 2432//2976
+f 2421//2965 2420//2964 2432//2976 2433//2977
+f 1975//2551 2421//2965 2433//2977 1988//2564
+f 2428//2972 2434//2978 2430//2974 2429//2973
+f 2427//2971 2435//2979 2434//2978 2428//2972
+f 2426//2970 2436//2980 2435//2979 2427//2971
+f 2305//2849 2436//2980 2426//2970
+f 2437//2981 2305//2849 2295//2839
+f 2436//2980 2305//2849 2437//2981 2438//2982
+f 2439//2983 2436//2980 2438//2982
+f 2436//2980 2439//2983 2435//2979
+f 2434//2978 2435//2979 2439//2983 2440//2984
+f 2430//2974 2434//2978 2440//2984 2441//2985
+f 2431//2975 2430//2974 2441//2985 2442//2986
+f 2432//2976 2431//2975 2442//2986 2443//2987
+f 2433//2977 2432//2976 2443//2987 1999//2575
+f 2433//2977 1999//2575 1988//2564
+f 2304//2848 2444//2988 2437//2981 2295//2839
+f 2438//2982 2437//2981 2444//2988 2445//2989
+f 2439//2983 2438//2982 2445//2989 2446//2990
+f 2447//2991 2439//2983 2446//2990 2448//2992
+f 2449//2993 2440//2984 2439//2983 2447//2991
+f 2440//2984 2449//2993 2441//2985
+f 2450//2994 2449//2993 2447//2991 2451//2995
+f 2441//2985 2449//2993 2450//2994 2452//2996
+f 2447//2991 2448//2992 2451//2995
+f 2453//2997 2442//2986 2441//2985 2452//2996
+f 2454//2998 2443//2987 2442//2986 2453//2997
+f 2011//2587 1999//2575 2443//2987 2454//2998
+f 2455//2999 2448//2992 2456//3000
+f 2457//3001 2458//3002 2455//2999 2456//3000
+f 2457//3001 2456//3000 2459//3003
+f 2457//3001 2459//3003 2460//3004
+f 2461//3005 2457//3001 2460//3004
+f 2451//2995 2448//2992 2462//3006
+f 2458//3002 2457//3001 2461//3005
+f 2451//2995 2462//3006 2450//2994
+f 2452//2996 2450//2994 2462//3006 2463//3007
+f 2453//2997 2452//2996 2463//3007 2464//3008
+f 2465//3009 2466//3010 2463//3007 2462//3006
+f 2465//3009 2462//3006 2448//2992 2455//2999
+f 2459//3003 2456//3000 2467//3011
+f 2445//2989 2468//3012 2467//3011 2446//2990
+f 2444//2988 2469//3013 2468//3012 2445//2989
+f 2304//2848 2306//2850 2469//3013 2444//2988
+f 2470//3014 2471//3015 2459//3003 2467//3011
+f 2468//3012 2472//3016 2470//3014 2467//3011
+f 2469//3013 2473//3017 2472//3016 2468//3012
+f 2306//2850 2321//2865 2473//3017 2469//3013
+f 2465//3009 2455//2999 2458//3002 2474//3018
+f 2475//3019 2466//3010 2465//3009 2474//3018
+f 2476//3020 2477//3021 2478//3022
+f 2458//3002 2461//3005 2477//3021 2474//3018
+f 2461//3005 2479//3023 2478//3022 2477//3021
+f 2480//3024 2479//3023 2461//3005 2460//3004
+f 2481//3025 2478//3022 2479//3023 2482//3026
+f 2483//3027 2476//3020 2478//3022 2481//3025
+f 2484//3028 2476//3020 2483//3027
+f 2043//2619 2042//2618 2484//3028 2483//3027
+f 2482//3026 2479//3023 2480//3024 2485//3029
+f 2477//3021 2476//3020 2475//3019 2474//3018
+f 2045//2621 2043//2619 2483//3027 2481//3025
+f 2047//2623 2486//3030 2484//3028 2042//2618
+f 2486//3030 2487//3031 2476//3020 2484//3028
+f 2488//3032 2475//3019 2476//3020 2487//3031
+f 2489//3033 2466//3010 2475//3019 2488//3032
+f 2489//3033 2464//3008 2463//3007 2466//3010
+f 2052//2628 2490//3034 2486//3030 2047//2623
+f 2053//2629 2045//2621 2481//3025 2482//3026
+f 2054//2630 2053//2629 2482//3026 2485//3029
+f 2056//2632 2054//2630 2485//3029 2491//3035
+f 2480//3024 2492//3036 2491//3035 2485//3029
+f 2493//3037 2492//3036 2480//3024 2460//3004
+f 2494//3038 2495//3039 2492//3036 2493//3037
+f 2491//3035 2492//3036 2495//3039 2496//3040
+f 2056//2632 2491//3035 2496//3040 2062//2638
+f 2493//3037 2460//3004 2459//3003 2497//3041
+f 2497//3041 2459//3003 2471//3015
+f 2494//3038 2493//3037 2497//3041 2498//3042
+f 2497//3041 2471//3015 2499//3043
+f 2500//3044 2498//3042 2497//3041 2499//3043
+f 2470//3014 2499//3043 2471//3015
+f 2068//2644 2062//2638 2496//3040 2501//3045
+f 2495//3039 2502//3046 2501//3045 2496//3040
+f 2494//3038 2503//3047 2502//3046 2495//3039
+f 2498//3042 2504//3048 2503//3047 2494//3038
+f 2501//3045 2505//3049 2072//2648 2068//2644
+f 2502//3046 2506//3050 2505//3049 2501//3045
+f 2503//3047 2507//3051 2506//3050 2502//3046
+f 2504//3048 2508//3052 2507//3051 2503//3047
+f 2505//3049 2509//3053 2077//2653 2072//2648
+f 2506//3050 2510//3054 2509//3053 2505//3049
+f 2507//3051 2511//3055 2510//3054 2506//3050
+f 2082//2658 2077//2653 2509//3053 2512//3056
+f 2509//3053 2510//3054 2513//3057 2512//3056
+f 2512//3056 2513//3057 2514//3058
+f 2085//2661 2082//2658 2512//3056 2514//3058
+f 2515//3059 2516//3060 2514//3058 2517//3061
+f 2517//3061 2514//3058 2513//3057
+f 2089//2665 2085//2661 2514//3058 2516//3060
+f 2091//2667 2089//2665 2516//3060 2518//3062
+f 2093//2669 2091//2667 2518//3062 2519//3063
+f 2516//3060 2515//3059 2520//3064 2518//3062
+f 2520//3064 2521//3065 2518//3062
+f 2519//3063 2518//3062 2521//3065 2522//3066
+f 2523//3067 2314//2858 2313//2857
+f 2314//2858 2523//3067 2318//2862
+f 2318//2862 2523//3067 2524//3068
+f 2318//2862 2524//3068 2525//3069
+f 2524//3068 2523//3067 2526//3070
+f 2527//3071 2528//3072 2524//3068 2526//3070
+f 2529//3073 2524//3068 2528//3072 2530//3074
+f 2525//3069 2524//3068 2529//3073
+f 2531//3075 2532//3076 2525//3069 2529//3073
+f 2533//3077 2531//3075 2529//3073 2530//3074
+f 2533//3077 2530//3074 2534//3078
+f 2530//3074 2528//3072 2535//3079
+f 2536//3080 2537//3081 2528//3072 2527//3071
+f 2535//3079 2528//3072 2537//3081 2538//3082
+f 2539//3083 2535//3079 2538//3082 2540//3084
+f 2534//3078 2530//3074 2535//3079 2539//3083
+f 2541//3085 2532//3076 2531//3075 2542//3086
+f 2543//3087 2542//3086 2531//3075 2533//3077
+f 2544//3088 2543//3087 2533//3077 2534//3078
+f 2545//3089 2544//3088 2534//3078 2539//3083
+f 2546//3090 2545//3089 2539//3083 2540//3084
+f 2547//3091 2546//3090 2540//3084 2548//3092
+f 2538//3082 2549//3093 2548//3092 2540//3084
+f 2537//3081 2549//3093 2538//3082
+f 2536//3080 2549//3093 2537//3081
+f 2520//3064 2550//3094 2542//3086 2521//3065
+f 2542//3086 2550//3094 2541//3085
+f 2551//3095 2541//3085 2550//3094
+f 2520//3064 2515//3059 2551//3095 2550//3094
+f 2551//3095 2515//3059 2517//3061
+f 2522//3066 2521//3065 2542//3086 2543//3087
+f 2552//3096 2522//3066 2543//3087 2544//3088
+f 2553//3097 2519//3063 2522//3066 2552//3096
+f 2128//2704 2093//2669 2519//3063 2553//3097
+f 2554//3098 2552//3096 2544//3088 2545//3089
+f 2555//3099 2554//3098 2545//3089 2546//3090
+f 2556//3100 2555//3099 2546//3090 2547//3091
+f 2548//3092 2549//3093 2557//3101
+f 2547//3091 2548//3092 2557//3101 2558//3102
+f 2556//3100 2547//3091 2558//3102 2559//3103
+f 2553//3097 2552//3096 2554//3098 2560//3104
+f 2128//2704 2553//3097 2560//3104 2136//2712
+f 2560//3104 2554//3098 2555//3099 2561//3105
+f 2136//2712 2560//3104 2561//3105 2138//2714
+f 2561//3105 2555//3099 2556//3100 2562//3106
+f 2138//2714 2561//3105 2562//3106 2140//2716
+f 2562//3106 2556//3100 2559//3103 2563//3107
+f 2140//2716 2562//3106 2563//3107 2142//2718
+f 2511//3055 2507//3051 2564//3108
+f 2565//3109 2504//3048 2498//3042 2500//3044
+f 2504//3048 2565//3109 2566//3110 2508//3052
+f 2508//3052 2567//3111 2564//3108 2507//3051
+f 2566//3110 2567//3111 2508//3052
+f 2568//3112 2513//3057 2510//3054 2511//3055
+f 2517//3061 2513//3057 2569//3113
+f 2564//3108 2570//3114 2568//3112 2511//3055
+f 2567//3111 2570//3114 2564//3108
+f 2571//3115 2551//3095 2517//3061 2569//3113
+f 2572//3116 2541//3085 2551//3095 2571//3115
+f 2573//3117 2532//3076 2541//3085 2572//3116
+f 2574//3118 2525//3069 2532//3076 2573//3117
+f 2575//3119 2318//2862 2525//3069 2574//3118
+f 2317//2861 2318//2862 2575//3119
+f 2570//3114 2567//3111 2566//3110 2576//3120
+f 2570//3114 2576//3120 2577//3121
+f 2578//3122 2570//3114 2577//3121
+f 2579//3123 2580//3124 2581//3125
+f 2582//3126 2583//3127 2578//3122 2577//3121
+f 2581//3125 2580//3124 2583//3127 2582//3126
+f 2582//3126 2577//3121 2584//3128
+f 2585//3129 2581//3125 2582//3126 2584//3128
+f 2586//3130 2579//3123 2581//3125 2585//3129
+f 2587//3131 2588//3132 2579//3123 2586//3130
+f 2589//3133 2584//3128 2577//3121 2590//3134
+f 2591//3135 2585//3129 2584//3128 2589//3133
+f 2592//3136 2586//3130 2585//3129 2591//3135
+f 2593//3137 2587//3131 2586//3130 2592//3136
+f 2322//2866 2587//3131 2593//3137 2594//3138
+f 2322//2866 2317//2861 2588//3132 2587//3131
+f 2323//2867 2322//2866 2594//3138
+f 2595//3139 2566//3110 2565//3109
+f 2576//3120 2566//3110 2596//3140
+f 2590//3134 2577//3121 2576//3120 2596//3140
+f 2566//3110 2595//3139 2597//3141
+f 2500//3044 2595//3139 2565//3109
+f 2321//2865 2323//2867 2473//3017
+f 2598//3142 2599//3143 2473//3017 2323//2867
+f 2472//3016 2473//3017 2599//3143 2600//3144
+f 2470//3014 2472//3016 2600//3144 2601//3145
+f 2499//3043 2470//3014 2601//3145 2602//3146
+f 2500//3044 2499//3043 2602//3146 2595//3139
+f 2598//3142 2323//2867 2594//3138 2603//3147
+f 2603//3147 2594//3138 2593//3137 2604//3148
+f 2592//3136 2605//3149 2604//3148 2593//3137
+f 2591//3135 2606//3150 2605//3149 2592//3136
+f 2589//3133 2607//3151 2606//3150 2591//3135
+f 2590//3134 2608//3152 2607//3151 2589//3133
+f 2608//3152 2590//3134 2596//3140
+f 2597//3141 2609//3153 2596//3140 2566//3110
+f 2610//3154 2608//3152 2596//3140 2609//3153
+f 2611//3155 2607//3151 2608//3152 2610//3154
+f 2606//3150 2607//3151 2611//3155 2612//3156
+f 2613//3157 2605//3149 2606//3150 2612//3156
+f 2614//3158 2604//3148 2605//3149 2613//3157
+f 2599//3143 2598//3142 2614//3158 2615//3159
+f 2599//3143 2615//3159 2600//3144
+f 2601//3145 2600//3144 2615//3159 2616//3160
+f 2602//3146 2601//3145 2616//3160 2617//3161
+f 2602//3146 2617//3161 2597//3141 2595//3139
+f 2603//3147 2604//3148 2614//3158
+f 2598//3142 2603//3147 2614//3158
+f 2618//3162 2268//2812 2267//2811 2619//3163
+f 2620//3164 2621//3165 2618//3162 2619//3163
+f 2622//3166 2623//3167 2621//3165 2620//3164
+s 208
+f 2624//3252 2625//3253 2623//3251 2622//3250
+f 2626//3254 2621//3249 2623//3251 2625//3253
+f 2618//3248 2621//3249 2626//3254 2627//3255
+f 2268//3247 2618//3248 2627//3255 2628//3256
+f 2626//3254 2625//3253 2629//3257 2630//3258
+f 2627//3255 2626//3254 2630//3258 2631//3259
+f 2628//3256 2627//3255 2631//3259 2632//3260
+f 2625//3253 2624//3252 2629//3257
+f 2629//3257 2624//3252 2633//3261 2634//3262
+f 2630//3258 2629//3257 2634//3262 2635//3263
+f 2631//3259 2630//3258 2635//3263 2636//3264
+f 2632//3260 2631//3259 2636//3264 2637//3265
+s 211
+f 2632//3267 2637//3269 2638//3270
+f 2638//3270 2639//3271 2633//3268
+f 2637//3269 2639//3271 2638//3270
+s 208
+f 2636//3264 2639//3266 2637//3265
+s 210
+f 2635//3274 2639//3276 2636//3275
+f 2634//3273 2639//3276 2635//3274
+f 2633//3272 2639//3276 2634//3273
+s 212
+f 2640//3278 2622//3277 2641//3279
+f 2642//3280 2643//3281 2640//3278 2641//3279
+s 193
+f 2644//3289 2643//3288 2642//3287 2645//3290
+f 2264//3283 2263//3282 2643//3288 2644//3289
+f 2646//3291 2619//3286 2267//3285 2265//3284
+f 2265//3284 2264//3283 2644//3289 2646//3291
+s 209
+f 2620//3294 2647//3296 2622//3295
+f 2647//3296 2620//3294 2619//3293
+s 193
+f 2642//3287 2647//3292 2645//3290
+f 2646//3291 2647//3292 2619//3286
+f 2644//3289 2645//3290 2647//3292 2646//3291
+s off
+f 2642//23 2641//23 2622//23 2647//23
+s 166
+f 2648//3168 2649//3169 2650//3170 2651//3171
+f 2253//2797 2262//2806 2246//2790 2245//2789
+f 2052//2628 2011//2587 2454//2998 2490//3034
+f 2651//3171 2650//3170 2453//2997 2464//3008
+s off
+f 2650//24 2652//24 2454//24 2453//24
+s 203
+f 2652//3300 2653//3301 2490//3299 2454//3297
+f 2653//3301 2654//3302 2486//3298 2490//3299
+s 166
+f 2654//3174 2655//3175 2487//3031 2486//3030
+f 2655//3175 2649//3169 2488//3032 2487//3031
+f 2649//3169 2648//3168 2489//3033 2488//3032
+f 2648//3168 2651//3171 2464//3008 2489//3033
+f 2383//2927 1927//2503 1920//2496 2378//2922
+f 2381//2925 2383//2927 2378//2922 2379//2923
+f 2373//2917 2381//2925 2379//2923 2371//2915
+f 2371//2915 2367//2911 2373//2917
+f 2456//3000 2448//2992 2446//2990 2467//3011
+f 2367//2911 2374//2918 2373//2917
+f 1893//2469 1871//2447 1894//2470 1896//2472
+f 1893//2469 1896//2472 1898//2474 1901//2477
+f 1980//2556 1979//2555 1977//2553 1981//2557
+s off
+f 2234//25 2232//25 2228//25 2233//25
+s 190
+f 2231//3230 2229//3228 2228//3227 2232//3231
+s 166
+f 2345//2889 2343//2887 2356//2900 2357//2901
+f 2359//2903 2356//2900 2358//2902 2360//2904
+f 2424//2968 2425//2969 2427//2971 2423//2967
+f 2654//3174 2653//3173 2649//3169 2655//3175
+f 2652//3172 2650//3170 2649//3169 2653//3173
+# 2812 elements
diff --git a/src/main/resources/geometry/brick2.int b/src/main/resources/geometry/brick2.int
new file mode 100644
index 0000000..8df4211
--- /dev/null
+++ b/src/main/resources/geometry/brick2.int
Binary files differ
diff --git a/src/main/resources/geometry/concrete.int b/src/main/resources/geometry/concrete.int
new file mode 100644
index 0000000..bffe4f6
--- /dev/null
+++ b/src/main/resources/geometry/concrete.int
Binary files differ
diff --git a/src/main/resources/geometry/galleon.cg b/src/main/resources/geometry/galleon.cg
new file mode 100644
index 0000000..4964118
--- /dev/null
+++ b/src/main/resources/geometry/galleon.cg
Binary files differ
diff --git a/src/main/resources/geometry/galleon.obj b/src/main/resources/geometry/galleon.obj
new file mode 100644
index 0000000..0ed58af
--- /dev/null
+++ b/src/main/resources/geometry/galleon.obj
@@ -0,0 +1,8901 @@
+# Tue Oct 27 19:26:52 1992
+#
+# Spanish Galleon
+#
+# Courtesy of:
+#
+# Viewpoint Animation Engineering
+# 870 West Center
+# Orem, Utah 84057
+# (801)224-2222
+# 1-800-DATASET
+#
+# (c) Copyright 1992 Viewpoint Animation Engineering Inc.
+# Sun Microsystems has been authorized to freely distribute
+# these Datasets. They are provided for unlimited use in
+# existing or modified form. The actual Dataset (ie, geometry)
+# may not, however, be resold in existing or modified form.
+#
+
+g
+v -0.471519 0.607158 0.742476
+v -0.471519 2.835144 0.742476
+v 0.235709 2.835144 1.035419
+v 0.235709 3.340722 1.035419
+v -1.250291 3.340722 0.419898
+v -1.435455 28.440485 0.343200
+v -0.525114 29.392422 0.720276
+v -0.339949 31.134907 0.796974
+v -0.009594 31.301920 0.933812
+v -0.009594 31.705118 0.933812
+v -0.813112 31.538105 0.600984
+v -0.998277 30.035196 0.524286
+v -1.638847 30.068596 0.258952
+v -1.981079 54.333931 0.117197
+v -0.471518 0.607158 -0.742476
+v -0.471518 2.835144 -0.742476
+v 0.235709 2.835144 -1.035419
+v 0.235709 3.340722 -1.035419
+v -1.250291 3.340722 -0.419898
+v -1.435455 28.440485 -0.343200
+v -0.525114 29.392422 -0.720276
+v -0.339949 31.134907 -0.796974
+v -0.009594 31.301920 -0.933812
+v -0.009594 31.705118 -0.933812
+v -0.813112 31.538105 -0.600984
+v -0.998277 30.035196 -0.524286
+v -1.638847 30.068596 -0.258952
+v -1.981079 54.333931 -0.117197
+v -1.521538 0.607158 -1.792495
+v -2.146818 54.333931 -0.282936
+v -3.006491 0.607158 -1.792497
+v -2.381211 54.333931 -0.282936
+v -4.056510 0.607158 -0.742476
+v -4.056510 2.835144 -0.742476
+v -4.763738 2.835144 -1.035419
+v -4.763738 3.340722 -1.035419
+v -3.277740 3.340722 -0.419898
+v -3.092574 28.440485 -0.343200
+v -4.002915 29.392422 -0.720276
+v -4.188079 31.134907 -0.796974
+v -4.518436 31.301920 -0.933812
+v -4.518436 31.705118 -0.933812
+v -3.714916 31.538105 -0.600984
+v -3.529752 30.035196 -0.524286
+v -2.889182 30.068596 -0.258952
+v -2.546952 54.333931 -0.117197
+v -4.056511 0.607158 0.742476
+v -4.056511 2.835144 0.742476
+v -4.763738 2.835144 1.035419
+v -4.763738 3.340722 1.035419
+v -3.277740 3.340722 0.419898
+v -3.092574 28.440485 0.343200
+v -4.002915 29.392422 0.720276
+v -4.188079 31.134907 0.796974
+v -4.518435 31.301920 0.933812
+v -4.518435 31.705118 0.933812
+v -3.714916 31.538105 0.600984
+v -3.529752 30.035196 0.524286
+v -2.889182 30.068596 0.258952
+v -2.546952 54.333931 0.117197
+v -3.006491 0.607158 1.792495
+v -3.006491 2.835144 1.792495
+v -3.299435 2.835144 2.499723
+v -3.299435 3.340722 2.499723
+v -2.683913 3.340722 1.013724
+v -2.607214 28.440485 0.828560
+v -2.984291 29.392422 1.738900
+v -3.060988 31.134907 1.924065
+v -3.197826 31.301920 2.254421
+v -3.197826 31.705118 2.254421
+v -2.864999 31.538105 1.450902
+v -2.788301 30.035196 1.265738
+v -2.522967 30.068596 0.625167
+v -2.381211 54.333931 0.282936
+v -1.521538 0.607158 1.792497
+v -1.521538 2.835144 1.792497
+v -1.228595 2.835144 2.499723
+v -1.228595 3.340722 2.499723
+v -1.844116 3.340722 1.013724
+v -1.920815 28.440485 0.828560
+v -1.543738 29.392422 1.738900
+v -1.467041 31.134907 1.924065
+v -1.330203 31.301920 2.254421
+v -1.330203 31.705118 2.254421
+v -1.663031 31.538105 1.450902
+v -1.739728 30.035196 1.265738
+v -2.005062 30.068596 0.625167
+v -2.146818 54.333931 0.282936
+v -1.732276 28.916454 1.283730
+v -2.795753 28.916454 1.283730
+v -2.378415 28.440485 0.828560
+v -2.149614 28.440485 0.828560
+v -2.086768 28.916454 1.283730
+v -2.441260 28.916454 1.283730
+v -10.859753 1.409189 15.317495
+v -10.505260 1.409189 15.317495
+v -10.442413 0.933218 14.862325
+v -10.671214 0.933218 14.862325
+v -3.396813 0.933175 14.862257
+v -3.625614 0.933175 14.862261
+v -3.562768 1.409142 15.317429
+v -3.208276 1.409142 15.317429
+v -7.081613 0.933123 14.862221
+v -7.310413 0.933123 14.862221
+v -7.373259 1.409093 15.317392
+v -7.018765 1.409093 15.317392
+v -32.243050 -19.185102 0.000000
+v -38.131035 -19.181059 0.000000
+v -38.073593 -19.202291 1.238075
+v -32.189545 -19.209759 1.238075
+v -24.875282 -19.207870 1.238075
+v -24.875282 -19.187256 0.000000
+v -21.158424 -19.201153 1.238075
+v -21.158424 -19.188753 0.000000
+v -17.426210 -19.199236 1.238075
+v -17.426210 -19.186226 0.000000
+v -10.703051 -19.188595 1.238075
+v -10.703051 -19.187540 0.000000
+v -6.862593 -19.192287 1.238075
+v -6.862593 -19.191231 0.000000
+v -2.943282 -19.197210 1.238075
+v -2.943282 -19.188084 0.000000
+v 2.420745 -19.188913 1.238075
+v 2.420745 -19.183977 0.000000
+v 7.603565 -19.183283 0.000000
+v 7.603565 -19.195683 1.238075
+v 12.967180 -18.306032 1.259959
+v 12.980299 -18.290831 0.000000
+v 16.730053 -16.014843 1.259959
+v 16.797665 -16.055038 0.000000
+v 19.381454 -13.269838 1.259959
+v 19.872108 -13.242973 0.000000
+v 22.486511 -8.349066 1.259959
+v 22.851847 -8.316385 0.000000
+v 24.247856 -5.150546 1.259967
+v 24.431244 -5.094540 0.000000
+v 26.552673 -2.858097 1.259976
+v 26.431309 -2.898813 0.000000
+v 29.468712 -0.579000 1.259978
+v 29.475975 -0.580864 0.000000
+v 30.889355 1.488847 1.259971
+v 30.886574 1.483778 0.000000
+v 30.887581 4.224448 1.259971
+v 30.886909 4.257463 0.000000
+v 29.521240 5.140058 1.259971
+v 29.460693 5.099638 0.000000
+v 27.605324 4.464114 1.605842
+v 27.489288 4.497021 0.000000
+v 27.217043 2.526036 1.605860
+v 27.104233 2.554623 0.000000
+v -32.122738 -17.475546 1.238075
+v -24.875282 -17.469940 1.238075
+v -21.158424 -17.471130 1.238075
+v -17.426210 -17.464722 1.238075
+v -10.703051 -17.446625 1.238075
+v -6.862593 -17.454201 1.238075
+v -2.943282 -17.458817 1.238075
+v 2.420745 -17.454708 1.238075
+v 7.603565 -17.449827 1.238075
+v 12.879044 -16.473442 1.238075
+v 16.405544 -14.094017 1.238075
+v 18.244587 -11.779632 1.238075
+v 20.710901 -7.529170 1.281522
+v 22.502172 -2.387520 1.780734
+v 26.162926 -1.127839 1.911312
+v 28.999243 0.125412 1.881888
+v -32.122726 -16.693306 4.355949
+v -24.875282 -16.438957 5.023836
+v -21.158424 -16.432545 5.456006
+v -17.426210 -16.414181 5.591547
+v -10.703051 -16.404001 5.960669
+v -6.862593 -16.404274 6.041844
+v -2.943282 -16.405006 6.357064
+v 2.420745 -16.404470 6.357064
+v 7.603565 -16.380497 6.357064
+v 12.832268 -15.500710 6.259944
+v 16.321648 -13.597433 5.927067
+v 18.157881 -11.652975 5.318019
+v 20.729614 -7.361181 4.084560
+v -32.122711 -15.201252 8.479453
+v -24.875282 -15.191301 8.889921
+v -21.158424 -15.188612 9.238050
+v -17.426210 -15.185617 9.648746
+v -10.703051 -15.151535 9.959948
+v -6.862593 -15.148084 10.122597
+v -2.943282 -15.161076 10.404315
+v 2.420745 -15.136637 10.490346
+v 7.603565 -15.139988 10.384273
+v 12.742552 -13.635256 10.271313
+v 16.052504 -12.004322 9.672956
+v 17.738865 -10.274949 8.849628
+v 20.423779 -6.674508 7.563237
+v 22.927841 -2.079975 5.293032
+v -32.122692 -13.101498 12.252906
+v -24.875282 -13.559512 12.869038
+v -21.158424 -13.563975 12.793823
+v -17.426210 -13.564394 13.015837
+v -10.703051 -13.542574 13.359402
+v -6.862593 -13.538811 13.468325
+v -2.943282 -13.548689 13.506525
+v 2.420745 -13.559494 13.319569
+v 7.603565 -13.121067 12.955379
+v 12.651917 -11.750661 12.163342
+v 15.776398 -10.370003 11.428668
+v 17.823387 -8.626553 10.201316
+v 20.243277 -5.812185 8.599287
+v 22.642578 -2.021900 6.338686
+v -32.122688 -10.525450 13.978191
+v -24.875282 -10.610699 14.971485
+v -21.158424 -10.603826 15.170494
+v -17.426210 -10.616206 15.433119
+v -10.703051 -10.590498 15.556311
+v -6.862593 -10.586885 15.660851
+v -2.943282 -10.611682 15.249158
+v 2.420745 -10.615954 14.819395
+v 7.603565 -10.423251 14.270162
+v 12.555428 -9.744363 13.830376
+v 15.481684 -8.625530 13.248377
+v 17.762831 -6.967863 11.940372
+v 19.731392 -4.773400 10.782165
+v 22.192654 -1.778881 8.919837
+v -38.881935 -16.109306 1.238075
+v -38.942127 -13.100367 1.238075
+v -32.122734 -13.101784 1.238075
+v -38.612694 -10.520290 1.238075
+v -32.122734 -10.529110 1.238075
+v -35.691887 -7.364658 1.238075
+v -32.122734 -7.294571 1.238075
+v -34.094254 -2.453040 1.238075
+v -32.122734 -2.380687 1.238075
+v -32.122818 3.000987 1.238075
+v -32.122829 0.590391 1.238075
+v -32.122726 -13.101580 3.815750
+v -32.122711 -13.101223 8.479156
+v -32.122711 -10.525373 8.478323
+v -32.122726 -10.527499 3.815633
+v -32.122726 -7.294347 3.815463
+v -32.122707 -7.294013 8.480250
+v -32.122684 -7.293530 14.206009
+v -32.122730 -2.380611 2.860078
+v -32.122726 -2.380491 4.517693
+v -32.122711 -3.604395 7.527471
+v -32.122704 -3.604366 9.285585
+v -32.122688 -3.604459 12.926102
+v -34.151215 -2.453028 0.000000
+v -35.631935 -7.364541 0.000000
+v -38.571144 -10.520123 0.000000
+v -38.914642 -13.100622 0.000000
+v -38.943748 -16.087477 0.000000
+v 26.141859 -0.943860 5.148655
+v 29.132690 0.554667 5.435258
+v 26.222294 -0.414192 7.186513
+v 23.797483 -0.793227 9.466203
+v 21.442825 -1.464471 9.712464
+v 22.778015 -0.755679 10.499197
+v 29.379856 3.334527 1.774282
+v 28.136330 2.362632 4.761501
+v 26.016197 1.315401 7.589925
+v 24.328785 1.265883 9.340617
+v 20.806227 -0.763545 10.438858
+v 21.705126 -0.275237 11.014637
+v 20.500061 0.752725 10.784106
+v 21.436293 0.883347 11.366537
+v 21.135654 1.550061 10.690931
+v 22.121262 1.561577 11.206270
+v 21.007219 3.249419 9.869397
+v 23.650299 1.840257 8.010921
+v 25.636337 1.698787 6.579282
+v 27.706768 2.015127 4.583124
+v 17.983040 6.662837 11.152293
+v 17.005033 6.662837 9.681633
+v 20.477345 3.637633 7.988389
+v 22.595039 2.320421 6.663224
+v 24.421982 1.686574 5.242180
+v 26.100426 1.864140 3.405339
+v 28.646168 2.885117 3.198632
+v 27.660387 1.772689 0.000000
+v 27.427397 1.142091 0.000000
+v 26.333582 1.027800 1.582581
+v 25.659239 1.174690 0.000000
+v 23.720354 0.966969 4.569222
+v 23.102367 0.608405 0.000000
+v 21.179319 1.176081 0.000000
+v 21.278627 1.400611 1.803334
+v 16.906103 5.316076 1.586848
+v 16.906103 5.316102 0.000000
+v 18.888571 1.302237 1.623599
+v 21.060875 1.981712 6.729387
+v 19.376360 2.471233 7.869488
+v 16.906103 5.316122 8.994491
+v 6.683901 5.316105 9.844049
+v 6.683901 5.315889 1.586848
+v 6.675109 5.316054 0.000000
+v 19.400375 -3.691560 11.374310
+v 18.681934 -1.983630 11.338428
+v 17.373505 -5.228647 12.646860
+v 16.633705 -3.074314 12.192126
+v 15.075657 -6.222204 13.865580
+v 14.621896 -3.523885 13.566364
+v 12.255808 -3.514410 13.771845
+v 12.411800 -6.757924 14.212804
+v 7.603565 -7.188782 14.846800
+v 7.603565 -3.490891 14.606509
+v 2.420745 -7.173941 15.276383
+v 2.420745 -3.480093 14.919241
+v -2.943282 -7.166555 15.589163
+v -2.961988 -3.473636 15.106121
+v -4.439586 -3.475051 15.065130
+v -6.862593 -7.149532 15.766785
+v -6.464514 -3.472743 15.131924
+v -8.018665 -3.474161 15.090826
+v -10.703051 -7.164166 15.766442
+v -9.989845 -3.475893 15.040714
+v -11.494260 -3.481347 14.882881
+v -17.426210 -7.163010 15.619746
+v -17.426210 -3.476307 15.028784
+v -21.158424 -7.158087 15.411015
+v -21.158424 -3.491715 14.582708
+v -24.875282 -7.172729 15.149325
+v -24.875282 -3.502623 14.266861
+v 18.104813 -0.132791 11.438385
+v 17.807384 1.818409 11.514686
+v 16.016308 -0.209789 12.214762
+v 15.502045 1.959264 11.977353
+v 15.252133 4.364689 12.089524
+v 17.344368 4.240352 11.840204
+v 13.062292 4.818222 12.265154
+v 13.673447 2.077692 12.471821
+v 14.041731 -0.091286 13.220635
+v 11.917332 -0.092658 13.622351
+v 11.917332 3.738120 12.682102
+v 13.062292 3.738120 12.646502
+v 13.062292 3.738120 13.693560
+v 13.062292 4.882016 13.297487
+v 6.935244 4.838787 12.860477
+v 6.935244 4.877757 13.657490
+v 11.917332 3.738120 13.693560
+v 10.851164 3.738120 13.693560
+v 9.059711 3.738120 13.693560
+v 7.942212 3.738120 13.693560
+v 6.935244 3.738120 13.693585
+v 10.851164 -0.092025 13.680202
+v 10.851164 3.738120 13.099374
+v 9.059711 -0.082416 13.958302
+v 9.059711 3.738120 13.247311
+v 7.942212 -0.088027 13.795906
+v 7.942212 3.738120 12.994835
+v 6.935244 3.738120 12.932455
+v 2.420745 -0.081102 13.996309
+v 2.420745 1.569107 13.480452
+v 2.420745 3.221424 12.616695
+v -1.886394 3.221424 12.694532
+v -1.898796 1.579293 13.775311
+v -1.898796 -0.093726 14.123177
+v -2.961988 -0.093726 14.123177
+v -2.961988 -0.093726 15.846119
+v -4.439586 -0.093726 15.846119
+v -6.464514 -0.093726 15.846119
+v -8.018665 -0.093726 15.846119
+v -9.989845 -0.093726 15.846119
+v -11.494260 -0.093726 15.846119
+v -6.464514 -0.093726 14.123177
+v -4.439586 -0.093726 14.123177
+v -9.989845 -0.093726 14.123177
+v -8.018665 -0.093726 14.123177
+v -12.515305 -0.093726 14.123177
+v -11.494260 -0.093726 14.123177
+v -12.515305 1.643136 15.278696
+v -1.898796 1.623528 15.278696
+v -1.898796 -0.093726 15.846119
+v -12.515305 -0.093726 15.846119
+v -12.515305 1.580878 13.821227
+v -8.522958 3.221424 12.703880
+v -10.136595 4.386232 12.483255
+v -12.771408 4.612774 12.141369
+v -13.215079 9.087099 12.333536
+v -17.426210 -0.085238 13.876673
+v -17.327192 1.568238 13.455286
+v -18.602346 1.558287 13.167220
+v -21.158424 -0.093337 13.642082
+v -20.301380 1.560132 13.220694
+v -21.564625 1.545988 12.811226
+v -24.875282 -0.115279 13.006975
+v -24.875282 1.535080 12.495492
+v -18.602346 5.420457 13.195373
+v -17.327192 5.420457 13.195373
+v -20.301380 5.420457 13.195373
+v -21.564625 5.420457 13.195373
+v -22.943232 5.420457 13.195373
+v -22.943232 6.953562 13.019781
+v -16.144386 6.964816 13.345592
+v -16.144386 5.420457 13.195373
+v -17.327192 5.420457 11.781666
+v -16.144386 5.420457 11.781666
+v -16.144386 6.916856 11.957180
+v -20.301380 5.420457 11.781666
+v -18.602346 5.420457 11.781666
+v -22.943232 6.914290 11.882894
+v -19.419006 9.058252 11.675020
+v -20.785156 10.432585 11.266025
+v -22.943232 5.420457 11.781666
+v -21.564625 5.420457 11.781666
+v -24.875282 11.097299 11.310978
+v -22.073826 12.809116 11.031629
+v -30.663502 11.097299 10.697601
+v -30.324631 13.255548 10.468728
+v -30.036606 14.678006 10.958575
+v -22.617615 13.859209 11.521384
+v -32.024277 15.183992 8.240927
+v -22.549631 13.892679 9.395622
+v -33.987694 15.764829 10.182573
+v -33.718784 15.003299 10.658934
+v -33.772961 13.609431 10.011785
+v -33.887344 11.097299 10.130578
+v -34.301479 16.149021 7.782318
+v -32.866196 16.196304 7.754097
+v -35.090012 19.437290 4.864941
+v -33.522549 19.528704 4.747104
+v -35.784195 21.577259 2.965577
+v -34.027481 21.557823 2.963631
+v -36.012775 22.438992 1.238075
+v -34.225647 22.404272 1.238075
+v -36.034115 22.694397 0.000000
+v -34.290081 22.667803 0.000000
+v -35.982044 20.292164 0.000000
+v -35.525314 19.202272 2.929065
+v -35.834301 18.574884 0.000000
+v -34.960712 15.855540 2.964757
+v -35.472115 15.759262 0.000000
+v -35.266460 13.591896 0.000000
+v -34.620663 13.597372 2.965675
+v -34.500881 12.321301 2.967943
+v -35.115417 12.681304 0.000000
+v -33.745373 13.603200 7.767865
+v -33.643600 11.097299 7.760621
+v -29.725348 1.534853 12.693987
+v -29.951672 -0.553082 12.838999
+v -29.089066 -2.256183 13.223326
+v -29.440445 -3.531864 13.420376
+v -26.469778 9.078413 12.638399
+v -30.376698 9.078413 12.195282
+v -34.513470 9.078413 11.671916
+v -35.326443 9.078413 8.519265
+v -36.337158 10.302411 4.204359
+v -32.288364 14.311578 0.000000
+v -38.840782 8.738811 0.000000
+v -36.824764 10.662413 0.000000
+v -38.226944 8.378810 4.931240
+v -37.265987 7.154811 10.030826
+v -36.054546 7.154811 15.249533
+v -31.044762 7.154811 15.397676
+v -28.175797 7.154811 15.624508
+v -26.515152 1.792719 14.466270
+v -28.182747 3.357670 15.498522
+v -30.193434 1.779966 14.420488
+v -31.038305 3.357670 15.387860
+v -35.530365 3.357670 15.019470
+v -36.705807 3.357670 10.029904
+v -37.666824 4.581672 4.931256
+v -38.222157 4.941670 0.000000
+v -36.700283 3.003968 2.860110
+v -37.202202 3.363967 0.000000
+v -36.408623 3.003968 4.518372
+v -35.959934 1.779966 7.527570
+v -35.191723 1.779966 9.285604
+v -34.204334 1.779966 14.226349
+v -30.329147 -0.633617 13.908249
+v -32.748100 -0.633628 13.436047
+v -29.538437 -2.280977 14.046997
+v -29.785950 -3.192493 13.980194
+v -30.527657 -3.185613 13.899263
+v -32.122818 1.776985 9.285594
+v -32.122818 1.776985 11.058003
+v -32.122688 -0.633649 11.458102
+v -32.122746 -0.633664 9.285579
+v -34.194592 -0.633673 9.285544
+v -34.248096 -0.633676 7.527580
+v -32.122818 3.000987 4.518517
+v -32.122818 1.776985 7.526671
+v -32.122761 -0.633678 7.527228
+v -32.122795 0.590334 4.518468
+v -33.900768 0.590325 4.518118
+v -34.417446 0.590306 2.860096
+v -34.639442 1.779966 11.836490
+v -33.089638 -0.885639 12.303194
+v -33.722881 3.003968 0.000000
+v -32.122818 3.000965 2.859260
+v -32.122826 0.590387 2.859397
+v -33.910358 21.114786 0.000000
+v -33.503494 19.450775 0.000000
+v -32.879219 16.897564 0.000000
+v -32.471931 15.231831 0.000000
+v -31.481258 12.189013 0.000000
+v -31.478973 12.189011 7.300096
+v -23.230810 12.189157 8.507561
+v -23.230810 12.188995 0.000000
+v -23.230810 12.189054 5.906754
+v -19.385841 7.391382 6.580861
+v -19.385841 7.391684 8.968118
+v -21.167429 7.390899 6.153070
+v -21.167429 7.390496 0.000000
+v -13.892597 7.391925 9.847868
+v -14.133162 7.391512 7.171891
+v -14.133162 7.391360 0.000000
+v -21.997017 12.885773 9.282518
+v -20.622669 10.264604 9.549243
+v -19.292164 9.097214 9.702837
+v -13.192261 9.087229 10.726978
+v -10.064362 4.446222 10.991236
+v -8.351521 3.221424 11.058840
+v -1.598226 3.221424 11.134462
+v 2.452951 3.221424 10.998412
+v 4.365315 4.001073 10.953445
+v 4.422665 4.063653 12.498808
+v 5.530656 6.149844 10.682220
+v 5.533552 6.171984 12.384296
+v 7.360672 6.662837 12.189878
+v 7.977384 6.662837 10.348160
+v 15.594139 6.662837 11.461397
+v 12.972380 6.662837 11.684002
+v -9.777788 1.447089 10.415768
+v -9.777788 1.447089 7.505733
+v -12.005382 1.447089 7.353243
+v -12.005382 1.447089 0.000000
+v -9.777788 1.447089 0.000000
+v -1.954006 1.447089 0.000000
+v -1.881737 1.447089 10.419345
+v 3.275857 1.447089 0.000000
+v 3.275857 1.447089 1.586848
+v 3.275857 1.447089 10.142793
+v 5.568399 1.447089 1.586848
+v 5.568399 1.447089 10.053401
+v 21.363655 1.139118 5.173973
+v -33.722420 3.002194 1.266791
+v -30.977203 -3.573457 13.137188
+v 21.934351 1.656698 10.462739
+v 24.074268 1.416270 8.771894
+v 25.925503 1.399094 7.091439
+v -8.976471 1.636600 15.278696
+v -5.437628 1.630064 15.278696
+v 15.260481 3.703158 0.742476
+v 15.260481 5.931142 0.742476
+v 15.967709 5.931142 1.035419
+v 15.967709 6.436721 1.035419
+v 14.481710 6.436721 0.419898
+v 14.296546 24.624481 0.343200
+v 15.206884 25.576418 0.720276
+v 15.392049 27.318907 0.796974
+v 15.722405 27.485916 0.933812
+v 15.722405 27.889114 0.933812
+v 14.918887 27.722105 0.600984
+v 14.733723 26.219193 0.524286
+v 14.093153 26.252592 0.258952
+v 13.750921 46.881989 0.117197
+v 15.260481 3.703158 -0.742476
+v 15.260481 5.931142 -0.742476
+v 15.967709 5.931142 -1.035419
+v 15.967709 6.436721 -1.035419
+v 14.481710 6.436721 -0.419898
+v 14.296546 24.624481 -0.343200
+v 15.206884 25.576418 -0.720276
+v 15.392050 27.318907 -0.796974
+v 15.722405 27.485916 -0.933812
+v 15.722405 27.889114 -0.933812
+v 14.918887 27.722105 -0.600984
+v 14.733723 26.219193 -0.524286
+v 14.093153 26.252592 -0.258952
+v 13.750921 46.881989 -0.117197
+v 14.210463 3.703158 -1.792495
+v 13.585180 46.881989 -0.282936
+v 12.725510 3.703158 -1.792497
+v 13.350788 46.881989 -0.282936
+v 11.675488 3.703158 -0.742476
+v 11.675488 5.931142 -0.742476
+v 10.968261 5.931142 -1.035419
+v 10.968261 6.436721 -1.035419
+v 12.454259 6.436721 -0.419898
+v 12.639424 24.624481 -0.343200
+v 11.729083 25.576418 -0.720276
+v 11.543920 27.318907 -0.796974
+v 11.213565 27.485916 -0.933812
+v 11.213565 27.889114 -0.933812
+v 12.017083 27.722105 -0.600984
+v 12.202246 26.219193 -0.524286
+v 12.842817 26.252592 -0.258952
+v 13.185047 46.881989 -0.117197
+v 11.675488 3.703158 0.742476
+v 11.675488 5.931142 0.742476
+v 10.968261 5.931142 1.035419
+v 10.968261 6.436721 1.035419
+v 12.454259 6.436721 0.419898
+v 12.639424 24.624481 0.343200
+v 11.729083 25.576418 0.720276
+v 11.543920 27.318907 0.796974
+v 11.213565 27.485916 0.933812
+v 11.213565 27.889114 0.933812
+v 12.017083 27.722105 0.600984
+v 12.202246 26.219193 0.524286
+v 12.842817 26.252592 0.258952
+v 13.185047 46.881989 0.117197
+v 12.725510 3.703158 1.792495
+v 12.725510 5.931142 1.792495
+v 12.432567 5.931142 2.499723
+v 12.432567 6.436721 2.499723
+v 13.048086 6.436721 1.013724
+v 13.124784 24.624481 0.828560
+v 12.747708 25.576418 1.738900
+v 12.671010 27.318907 1.924065
+v 12.534173 27.485916 2.254421
+v 12.534173 27.889114 2.254421
+v 12.867002 27.722105 1.450902
+v 12.943699 26.219193 1.265738
+v 13.209031 26.252592 0.625167
+v 13.350788 46.881989 0.282936
+v 14.210463 3.703158 1.792497
+v 14.210463 5.931142 1.792497
+v 14.503405 5.931142 2.499723
+v 14.503405 6.436721 2.499723
+v 13.887884 6.436721 1.013724
+v 13.811186 24.624481 0.828560
+v 14.188262 25.576418 1.738900
+v 14.264960 27.318907 1.924065
+v 14.401797 27.485916 2.254421
+v 14.401797 27.889114 2.254421
+v 14.068970 27.722105 1.450902
+v 13.992271 26.219193 1.265738
+v 13.726938 26.252592 0.625167
+v 13.585180 46.881989 0.282936
+v 13.999723 25.100452 1.283730
+v 12.936247 25.100452 1.283730
+v 13.467985 25.100452 1.283730
+v 13.467985 24.624481 0.828560
+v 11.795187 4.078778 12.650445
+v 11.451985 4.078778 12.650445
+v 11.451985 4.554746 13.105617
+v 11.983724 4.554746 13.105617
+v 8.480783 4.078758 12.650431
+v 8.292243 4.554726 13.105604
+v 8.823982 4.554726 13.105604
+v 8.823982 4.078758 12.650431
+v -16.707516 6.115158 0.742476
+v -16.707516 8.343143 0.742476
+v -16.000288 8.343143 1.035419
+v -16.000288 8.848721 1.035419
+v -17.486286 8.848721 0.419898
+v -17.671450 27.036480 0.343200
+v -16.761112 27.988419 0.720276
+v -16.575949 29.730904 0.796974
+v -16.245590 29.897915 0.933812
+v -16.245590 30.301113 0.933812
+v -17.049109 30.134102 0.600984
+v -17.234274 28.631191 0.524286
+v -17.874844 28.664593 0.258952
+v -18.217075 49.293991 0.117197
+v -16.707516 6.115158 -0.742476
+v -16.707516 8.343143 -0.742476
+v -16.000288 8.343143 -1.035419
+v -16.000288 8.848721 -1.035419
+v -17.486286 8.848721 -0.419898
+v -17.671450 27.036480 -0.343200
+v -16.761112 27.988419 -0.720276
+v -16.575947 29.730904 -0.796974
+v -16.245590 29.897915 -0.933812
+v -16.245590 30.301113 -0.933812
+v -17.049109 30.134102 -0.600984
+v -17.234274 28.631191 -0.524286
+v -17.874844 28.664593 -0.258952
+v -18.217075 49.293991 -0.117197
+v -17.757534 6.115158 -1.792495
+v -18.382814 49.293991 -0.282936
+v -19.242489 6.115158 -1.792497
+v -18.617208 49.293991 -0.282936
+v -20.292507 6.115158 -0.742476
+v -20.292507 8.343143 -0.742476
+v -20.999735 8.343143 -1.035419
+v -20.999735 8.848721 -1.035419
+v -19.513737 8.848721 -0.419898
+v -19.328571 27.036480 -0.343200
+v -20.238913 27.988419 -0.720276
+v -20.424078 29.730904 -0.796974
+v -20.754433 29.897915 -0.933812
+v -20.754433 30.301113 -0.933812
+v -19.950914 30.134102 -0.600984
+v -19.765751 28.631191 -0.524286
+v -19.125179 28.664593 -0.258952
+v -18.782949 49.293991 -0.117197
+v -20.292509 6.115158 0.742476
+v -20.292509 8.343143 0.742476
+v -20.999735 8.343143 1.035419
+v -20.999735 8.848721 1.035419
+v -19.513737 8.848721 0.419898
+v -19.328571 27.036480 0.343200
+v -20.238913 27.988419 0.720276
+v -20.424078 29.730904 0.796974
+v -20.754433 29.897915 0.933812
+v -20.754433 30.301113 0.933812
+v -19.950914 30.134102 0.600984
+v -19.765751 28.631191 0.524286
+v -19.125179 28.664593 0.258952
+v -18.782949 49.293991 0.117197
+v -19.242489 6.115158 1.792495
+v -19.242489 8.343143 1.792495
+v -19.535431 8.343143 2.499723
+v -19.535431 8.848721 2.499723
+v -18.919910 8.848721 1.013724
+v -18.843212 27.036480 0.828560
+v -19.220287 27.988419 1.738900
+v -19.296986 29.730904 1.924065
+v -19.433825 29.897915 2.254421
+v -19.433825 30.301113 2.254421
+v -19.100996 30.134102 1.450902
+v -19.024298 28.631191 1.265738
+v -18.758965 28.664593 0.625167
+v -18.617208 49.293991 0.282936
+v -17.757534 6.115158 1.792497
+v -17.757534 8.343143 1.792497
+v -17.464592 8.343143 2.499723
+v -17.464592 8.848721 2.499723
+v -18.080112 8.848721 1.013724
+v -18.156811 27.036480 0.828560
+v -17.779734 27.988419 1.738900
+v -17.703035 29.730904 1.924065
+v -17.566198 29.897915 2.254421
+v -17.566198 30.301113 2.254421
+v -17.899027 30.134102 1.450902
+v -17.975723 28.631191 1.265738
+v -18.241058 28.664593 0.625167
+v -18.382814 49.293991 0.282936
+v -17.968273 27.512449 1.283730
+v -19.031750 27.512449 1.283730
+v -18.500011 27.512449 1.283730
+v -18.500011 27.036480 0.828560
+v -17.796808 6.058776 12.650445
+v -18.140011 6.058776 12.650445
+v -18.140011 6.534745 13.105617
+v -17.608273 6.534745 13.105617
+v -21.111214 6.058758 12.650431
+v -21.299751 6.534726 13.105604
+v -20.768013 6.534726 13.105604
+v -20.768013 6.058758 12.650431
+v -35.773300 31.489208 0.000000
+v -34.736378 21.021118 0.000000
+v -34.903202 23.332542 0.000000
+v -34.561050 23.357229 0.000000
+v -34.583500 23.668274 0.000000
+v -34.171692 24.893951 0.000000
+v -33.985054 24.907419 0.000000
+v -34.005249 25.187370 0.000000
+v -35.056408 25.455433 0.000000
+v -34.738964 25.822281 0.000000
+v -35.099068 26.046429 0.000000
+v -34.818378 21.015203 -0.198465
+v -34.985210 23.326622 -0.198465
+v -34.743275 23.344069 -0.441034
+v -34.765717 23.655121 -0.441034
+v -34.499660 24.870266 -0.793862
+v -34.367695 24.879795 -0.926172
+v -34.387901 25.159744 -0.926172
+v -35.138412 25.449520 -0.198465
+v -34.921173 25.809122 -0.441034
+v -35.181068 26.040510 -0.198465
+v -35.016331 21.000908 -0.280672
+v -35.183147 23.312332 -0.280672
+v -35.183147 23.312332 -0.623716
+v -35.205605 23.623371 -0.623716
+v -35.291466 24.813129 -1.122690
+v -35.291466 24.813129 -1.309804
+v -35.311668 25.093071 -1.309804
+v -35.336365 25.435234 -0.280672
+v -35.361061 25.777367 -0.623716
+v -35.379028 26.026230 -0.280672
+v -35.214291 20.986626 -0.198465
+v -35.381107 23.298044 -0.198465
+v -35.623047 23.280582 -0.441034
+v -35.645496 23.591629 -0.441034
+v -36.083260 24.755985 -0.793862
+v -36.215240 24.746449 -0.926172
+v -36.235443 25.026409 -0.926172
+v -35.534321 25.420948 -0.198465
+v -35.800957 25.745636 -0.441034
+v -35.576973 26.011936 -0.198465
+v -35.296280 20.980709 0.000000
+v -35.463108 23.292116 0.000000
+v -35.805252 23.267427 0.000000
+v -35.827702 23.578472 0.000000
+v -36.411251 24.732311 0.000000
+v -36.597878 24.718842 0.000000
+v -36.618084 24.998800 0.000000
+v -35.616310 25.415024 0.000000
+v -35.983170 25.732475 0.000000
+v -35.658962 26.006020 0.000000
+v -35.214291 20.986626 0.198465
+v -35.381107 23.298044 0.198465
+v -35.623047 23.280582 0.441034
+v -35.645496 23.591629 0.441034
+v -36.083260 24.755985 0.793862
+v -36.215240 24.746449 0.926172
+v -36.235443 25.026409 0.926172
+v -35.534321 25.420948 0.198465
+v -35.800957 25.745636 0.441034
+v -35.576973 26.011936 0.198465
+v -35.016331 21.000908 0.280672
+v -35.183147 23.312332 0.280672
+v -35.183147 23.312332 0.623716
+v -35.205605 23.623371 0.623716
+v -35.291466 24.813129 1.122690
+v -35.291466 24.813129 1.309804
+v -35.311668 25.093071 1.309804
+v -35.336365 25.435234 0.280672
+v -35.361061 25.777367 0.623716
+v -35.379028 26.026230 0.280672
+v -34.818378 21.015203 0.198465
+v -34.985210 23.326622 0.198465
+v -34.743275 23.344069 0.441034
+v -34.765717 23.655121 0.441034
+v -34.499660 24.870266 0.793862
+v -34.367695 24.879795 0.926172
+v -34.387901 25.159744 0.926172
+v -35.138412 25.449520 0.198465
+v -34.921173 25.809122 0.441034
+v -35.181068 26.040510 0.198465
+v 41.515854 14.389792 0.409083
+v 19.986862 -0.162336 0.821899
+v 41.677841 14.150139 0.289265
+v 20.312319 -0.643831 0.581170
+v 41.744942 14.050873 0.000000
+v 20.447128 -0.843273 0.000000
+v 41.677841 14.150139 -0.289265
+v 20.312319 -0.643831 -0.581170
+v 41.515854 14.389792 -0.409081
+v 19.986862 -0.162336 -0.821899
+v 41.353859 14.629446 -0.289265
+v 19.661402 0.319160 -0.581170
+v 41.286762 14.728712 0.000000
+v 19.526598 0.518598 0.000000
+v 41.353859 14.629446 0.289265
+v 19.661402 0.319160 0.581170
+v -32.189545 -19.209759 -1.238075
+v -38.073593 -19.202291 -1.238075
+v -24.875282 -19.207870 -1.238075
+v -21.158424 -19.201153 -1.238075
+v -17.426210 -19.199236 -1.238075
+v -10.703051 -19.188595 -1.238075
+v -6.862593 -19.192287 -1.238075
+v -2.943282 -19.197210 -1.238075
+v 2.420745 -19.188913 -1.238075
+v 12.967180 -18.306032 -1.259959
+v 7.603565 -19.195683 -1.238075
+v 16.730053 -16.014843 -1.259959
+v 19.381454 -13.269838 -1.259959
+v 22.486511 -8.349066 -1.259959
+v 24.247856 -5.150546 -1.259967
+v 26.552673 -2.858097 -1.259976
+v 29.468712 -0.579000 -1.259978
+v 30.889355 1.488847 -1.259971
+v 30.887581 4.224448 -1.259971
+v 29.521240 5.140058 -1.259971
+v 27.605324 4.464114 -1.605842
+v 27.217043 2.526036 -1.605860
+v -32.122738 -17.475546 -1.238075
+v -24.875282 -17.469940 -1.238075
+v -21.158424 -17.471130 -1.238075
+v -17.426210 -17.464722 -1.238075
+v -10.703051 -17.446625 -1.238075
+v -6.862593 -17.454201 -1.238075
+v -2.943282 -17.458817 -1.238075
+v 2.420745 -17.454708 -1.238075
+v 7.603565 -17.449827 -1.238075
+v 12.879044 -16.473442 -1.238075
+v 16.405544 -14.094017 -1.238075
+v 18.244587 -11.779632 -1.238075
+v 20.710901 -7.529170 -1.281522
+v 22.502172 -2.387520 -1.780734
+v 26.162926 -1.127839 -1.911312
+v 28.999243 0.125412 -1.881888
+v -38.881935 -16.109306 -1.238075
+v -32.122734 -13.101784 -1.238075
+v -38.942127 -13.100367 -1.238075
+v -32.122734 -10.529110 -1.238075
+v -38.612694 -10.520290 -1.238075
+v -32.122734 -7.294571 -1.238075
+v -35.691887 -7.364658 -1.238075
+v -32.122734 -2.380687 -1.238075
+v -34.094254 -2.453040 -1.238075
+v -33.722420 3.002194 -1.266791
+v -32.122829 0.590391 -1.238075
+v -32.122818 3.000987 -1.238075
+v -32.122726 -16.693306 -4.355949
+v -32.122726 -13.101580 -3.815750
+v -32.122711 -15.201252 -8.479453
+v -32.122711 -13.101223 -8.479156
+v -32.122692 -13.101498 -12.252906
+v -32.122688 -10.525450 -13.978191
+v -32.122711 -10.525373 -8.478323
+v -32.122726 -10.527499 -3.815633
+v -32.122726 -7.294347 -3.815463
+v -32.122707 -7.294013 -8.480250
+v -32.122684 -7.293530 -14.206009
+v -32.122730 -2.380611 -2.860078
+v -32.122726 -2.380491 -4.517693
+v -32.122711 -3.604395 -7.527471
+v -32.122704 -3.604366 -9.285585
+v -32.122688 -3.604459 -12.926102
+v 22.927841 -2.079975 -5.293032
+v 26.141859 -0.943860 -5.148655
+v 29.132690 0.554667 -5.435258
+v 26.222294 -0.414192 -7.186513
+v 22.642578 -2.021900 -6.338686
+v 22.192654 -1.778881 -8.919837
+v 23.797483 -0.793227 -9.466203
+v 22.778015 -0.755679 -10.499197
+v 21.442825 -1.464471 -9.712464
+v 29.379856 3.334527 -1.774282
+v 28.136330 2.362632 -4.761501
+v 26.016197 1.315401 -7.589925
+v 24.328785 1.265883 -9.340617
+v 21.705126 -0.275237 -11.014637
+v 20.806227 -0.763545 -10.438858
+v 21.436293 0.883347 -11.366537
+v 20.500061 0.752725 -10.784106
+v 22.121262 1.561577 -11.206270
+v 21.135654 1.550061 -10.690931
+v 21.934351 1.656698 -10.462739
+v 24.074268 1.416270 -8.771894
+v 25.925503 1.399094 -7.091439
+v 17.005033 6.662837 -9.681633
+v 17.983040 6.662837 -11.152293
+v 21.007219 3.249419 -9.869397
+v 20.477345 3.637633 -7.988389
+v 23.650299 1.840257 -8.010921
+v 22.595039 2.320421 -6.663224
+v 25.636337 1.698787 -6.579282
+v 24.421982 1.686574 -5.242180
+v 27.706768 2.015127 -4.583124
+v 26.100426 1.864140 -3.405339
+v 28.646168 2.885117 -3.198632
+v 26.333582 1.027800 -1.582581
+v 23.720354 0.966969 -4.569222
+v 21.278627 1.400611 -1.803334
+v 16.906103 5.316076 -1.586848
+v 18.888571 1.302237 -1.623599
+v 19.376360 2.471233 -7.869488
+v 21.060875 1.981712 -6.729387
+v 16.906103 5.316122 -8.994491
+v 6.683901 5.316105 -9.844049
+v 6.683901 5.315889 -1.586848
+v 18.681934 -1.983630 -11.338428
+v 19.400375 -3.691560 -11.374310
+v 16.633705 -3.074314 -12.192126
+v 17.373505 -5.228647 -12.646860
+v 14.621896 -3.523885 -13.566364
+v 15.075657 -6.222204 -13.865580
+v 12.411800 -6.757924 -14.212804
+v 12.255808 -3.514410 -13.771845
+v 7.603565 -3.490891 -14.606509
+v 7.603565 -7.188782 -14.846800
+v 2.420745 -3.480093 -14.919241
+v 2.420745 -7.173941 -15.276383
+v -2.961988 -3.473636 -15.106121
+v -2.943282 -7.166555 -15.589163
+v -4.439586 -3.475051 -15.065130
+v -6.464514 -3.472743 -15.131924
+v -6.862593 -7.149532 -15.766785
+v -8.018665 -3.474161 -15.090826
+v -9.989845 -3.475893 -15.040714
+v -10.703051 -7.164166 -15.766442
+v -11.494260 -3.481347 -14.882881
+v -17.426210 -3.476307 -15.028784
+v -17.426210 -7.163010 -15.619746
+v -21.158424 -3.491715 -14.582708
+v -21.158424 -7.158087 -15.411015
+v -24.875282 -3.502623 -14.266861
+v -24.875282 -7.172729 -15.149325
+v 18.104813 -0.132791 -11.438385
+v 17.807384 1.818409 -11.514686
+v 16.016308 -0.209789 -12.214762
+v 15.502045 1.959264 -11.977353
+v 17.344368 4.240352 -11.840204
+v 15.252133 4.364689 -12.089524
+v 13.673447 2.077692 -12.471821
+v 14.041731 -0.091286 -13.220635
+v 11.917332 -0.092658 -13.622351
+v 11.917332 3.738120 -12.682102
+v 13.062292 3.738120 -12.646502
+v 13.062292 4.818222 -12.265154
+v 13.062292 4.882016 -13.297487
+v 13.062292 3.738120 -13.693560
+v 6.935244 4.838787 -12.860477
+v 6.935244 4.877757 -13.657490
+v 11.917332 3.738120 -13.693560
+v 10.851164 3.738120 -13.693560
+v 10.851164 -0.092025 -13.680202
+v 10.851164 3.738120 -13.099374
+v 9.059711 3.738120 -13.247311
+v 9.059711 -0.082416 -13.958302
+v 9.059711 3.738120 -13.693560
+v 7.942212 -0.088027 -13.795906
+v 7.942212 3.738120 -13.693560
+v 7.942212 3.738120 -12.994835
+v 6.935244 3.738120 -12.932455
+v 6.935244 3.738120 -13.693585
+v 2.420745 1.569107 -13.480452
+v 2.420745 -0.081102 -13.996309
+v 2.420745 3.221424 -12.616695
+v -1.886394 3.221424 -12.694532
+v -1.898796 1.579293 -13.775311
+v -1.898796 -0.093726 -14.123177
+v -2.961988 -0.093726 -14.123177
+v -2.961988 -0.093726 -15.846119
+v -4.439586 -0.093726 -15.846119
+v -6.464514 -0.093726 -15.846119
+v -8.018665 -0.093726 -15.846119
+v -9.989845 -0.093726 -15.846119
+v -11.494260 -0.093726 -15.846119
+v -6.464514 -0.093726 -14.123177
+v -4.439586 -0.093726 -14.123177
+v -8.018665 -0.093726 -14.123177
+v -9.989845 -0.093726 -14.123177
+v -11.494260 -0.093726 -14.123177
+v -12.515305 -0.093726 -14.123177
+v -12.515305 1.643136 -15.278696
+v -12.515305 -0.093726 -15.846119
+v -8.522958 3.221424 -12.703880
+v -12.515305 1.580878 -13.821227
+v -10.136595 4.386232 -12.483255
+v -12.771408 4.612774 -12.141369
+v -13.215079 9.087099 -12.333536
+v -1.898796 1.623528 -15.278696
+v -1.898796 -0.093726 -15.846119
+v -8.976471 1.636600 -15.278696
+v -5.437628 1.630064 -15.278696
+v -17.426210 -0.085238 -13.876673
+v -17.327192 1.568238 -13.455286
+v -18.602346 1.558287 -13.167220
+v -20.301380 1.560132 -13.220694
+v -21.158424 -0.093337 -13.642082
+v -21.564625 1.545988 -12.811226
+v -24.875282 1.535080 -12.495492
+v -24.875282 -0.115279 -13.006975
+v -17.327192 5.420457 -13.195373
+v -18.602346 5.420457 -13.195373
+v -16.144386 5.420457 -13.195373
+v -16.144386 6.964816 -13.345592
+v -20.301380 5.420457 -13.195373
+v -21.564625 5.420457 -13.195373
+v -16.144386 5.420457 -11.781666
+v -17.327192 5.420457 -11.781666
+v -16.144386 6.916856 -11.957180
+v -18.602346 5.420457 -11.781666
+v -20.301380 5.420457 -11.781666
+v -19.419006 9.058252 -11.675020
+v -22.943232 6.914290 -11.882894
+v -20.785156 10.432585 -11.266025
+v -22.943232 6.953562 -13.019781
+v -22.943232 5.420457 -11.781666
+v -22.943232 5.420457 -13.195373
+v -21.564625 5.420457 -11.781666
+v -24.875282 11.097299 -11.310978
+v -22.073826 12.809116 -11.031629
+v -30.324631 13.255548 -10.468728
+v -30.663502 11.097299 -10.697601
+v -22.617615 13.859209 -11.521384
+v -30.036606 14.678006 -10.958575
+v -22.549631 13.892679 -9.395622
+v -32.024277 15.183992 -8.240927
+v -33.987694 15.764829 -10.182573
+v -33.718784 15.003299 -10.658934
+v -33.772961 13.609431 -10.011785
+v -33.887344 11.097299 -10.130578
+v -32.866196 16.196304 -7.754097
+v -34.301479 16.149021 -7.782318
+v -33.522549 19.528704 -4.747104
+v -35.090012 19.437290 -4.864941
+v -34.027481 21.557823 -2.963631
+v -35.784195 21.577259 -2.965577
+v -34.225647 22.404272 -1.238075
+v -36.012775 22.438992 -1.238075
+v -35.525314 19.202272 -2.929065
+v -34.960712 15.855540 -2.964757
+v -34.620663 13.597372 -2.965675
+v -34.500881 12.321301 -2.967943
+v -33.643600 11.097299 -7.760621
+v -33.745373 13.603200 -7.767865
+v -29.725348 1.534853 -12.693987
+v -29.951672 -0.553082 -12.838999
+v -29.089066 -2.256183 -13.223326
+v -29.440445 -3.531864 -13.420376
+v -30.977203 -3.573457 -13.137188
+v -26.469778 9.078413 -12.638399
+v -30.376698 9.078413 -12.195282
+v -34.513470 9.078413 -11.671916
+v -35.326443 9.078413 -8.519265
+v -36.337158 10.302411 -4.204359
+v -38.226944 8.378810 -4.931240
+v -37.265987 7.154811 -10.030826
+v -36.054546 7.154811 -15.249533
+v -31.044762 7.154811 -15.397676
+v -28.175797 7.154811 -15.624508
+v -28.182747 3.357670 -15.498522
+v -26.515152 1.792719 -14.466270
+v -30.193434 1.779966 -14.420488
+v -31.038305 3.357670 -15.387860
+v -35.530365 3.357670 -15.019470
+v -36.705807 3.357670 -10.029904
+v -37.666824 4.581672 -4.931256
+v -36.700283 3.003968 -2.860110
+v -36.408623 3.003968 -4.518372
+v -35.959934 1.779966 -7.527570
+v -35.191723 1.779966 -9.285604
+v -34.204334 1.779966 -14.226349
+v -30.329147 -0.633617 -13.908249
+v -32.748100 -0.633628 -13.436047
+v -29.538437 -2.280977 -14.046997
+v -30.527657 -3.185613 -13.899263
+v -29.785950 -3.192493 -13.980194
+v -33.089638 -0.885639 -12.303194
+v -32.122818 1.776985 -11.058003
+v -32.122818 1.776985 -9.285594
+v -32.122746 -0.633664 -9.285579
+v -32.122688 -0.633649 -11.458102
+v -34.248096 -0.633676 -7.527580
+v -34.194592 -0.633673 -9.285544
+v -32.122818 1.776985 -7.526671
+v -32.122818 3.000987 -4.518517
+v -32.122795 0.590334 -4.518468
+v -32.122761 -0.633678 -7.527228
+v -34.417446 0.590306 -2.860096
+v -33.900768 0.590325 -4.518118
+v -34.639442 1.779966 -11.836490
+v -32.122818 3.000965 -2.859260
+v -32.122826 0.590387 -2.859397
+v -31.478973 12.189011 -7.300096
+v -23.230810 12.189157 -8.507561
+v -23.230810 12.189054 -5.906754
+v -19.385841 7.391684 -8.968118
+v -19.385841 7.391382 -6.580861
+v -21.167429 7.390899 -6.153070
+v -13.892597 7.391925 -9.847868
+v -14.133162 7.391512 -7.171891
+v -21.997017 12.885773 -9.282518
+v -20.622669 10.264604 -9.549243
+v -19.292164 9.097214 -9.702837
+v -13.192261 9.087229 -10.726978
+v -10.064362 4.446222 -10.991236
+v -8.351521 3.221424 -11.058840
+v -1.598226 3.221424 -11.134462
+v 2.452951 3.221424 -10.998412
+v 4.422665 4.063653 -12.498808
+v 4.365315 4.001073 -10.953445
+v 5.533552 6.171984 -12.384296
+v 5.530656 6.149844 -10.682220
+v 7.977384 6.662837 -10.348160
+v 7.360672 6.662837 -12.189878
+v 12.972380 6.662837 -11.684002
+v 15.594139 6.662837 -11.461397
+v -9.777788 1.447089 -10.415768
+v -9.777788 1.447089 -7.505733
+v -12.005382 1.447089 -7.353243
+v -1.881737 1.447089 -10.419345
+v 3.275857 1.447089 -10.142793
+v 3.275857 1.447089 -1.586848
+v 5.568399 1.447089 -10.053401
+v 5.568399 1.447089 -1.586848
+v 21.363655 1.139118 -5.173973
+v -24.875282 -16.438957 -5.023836
+v -21.158424 -16.432545 -5.456006
+v -17.426210 -16.414181 -5.591547
+v -10.703051 -16.404001 -5.960669
+v -6.862593 -16.404274 -6.041844
+v -2.943282 -16.405006 -6.357064
+v 2.420745 -16.404470 -6.357064
+v 7.603565 -16.380497 -6.357064
+v 12.832268 -15.500710 -6.259944
+v 16.321648 -13.597433 -5.927067
+v 18.157881 -11.652975 -5.318019
+v 20.729614 -7.361181 -4.084560
+v -24.875282 -15.191301 -8.889921
+v -21.158424 -15.188612 -9.238050
+v -17.426210 -15.185617 -9.648746
+v -10.703051 -15.151535 -9.959948
+v -6.862593 -15.148084 -10.122597
+v -2.943282 -15.161076 -10.404315
+v 2.420745 -15.136637 -10.490346
+v 7.603565 -15.139988 -10.384273
+v 12.742552 -13.635256 -10.271313
+v 16.052504 -12.004322 -9.672956
+v 17.738865 -10.274949 -8.849628
+v 20.423779 -6.674508 -7.563237
+v -24.875282 -13.559512 -12.869038
+v -21.158424 -13.563975 -12.793823
+v -17.426210 -13.564394 -13.015837
+v -10.703051 -13.542574 -13.359402
+v -6.862593 -13.538811 -13.468325
+v -2.943282 -13.548689 -13.506525
+v 2.420745 -13.559494 -13.319569
+v 7.603565 -13.121067 -12.955379
+v 12.651917 -11.750661 -12.163342
+v 15.776398 -10.370003 -11.428668
+v 17.823387 -8.626553 -10.201316
+v 20.243277 -5.812185 -8.599287
+v -24.875282 -10.610699 -14.971485
+v -21.158424 -10.603826 -15.170494
+v -17.426210 -10.616206 -15.433119
+v -10.703051 -10.590498 -15.556311
+v -6.862593 -10.586885 -15.660851
+v -2.943282 -10.611682 -15.249158
+v 2.420745 -10.615954 -14.819395
+v 7.603565 -10.423251 -14.270162
+v 12.555428 -9.744363 -13.830376
+v 15.481684 -8.625530 -13.248377
+v 17.762831 -6.967863 -11.940372
+v 19.731392 -4.773400 -10.782165
+v -0.566015 27.749599 22.499998
+v -0.341015 27.749599 18.749996
+v 0.033985 27.749599 0.000000
+v -0.609948 27.840916 22.499998
+v -0.450849 27.977892 18.749996
+v -0.185685 28.206188 0.000000
+v -0.716015 27.878740 22.499998
+v -0.716015 28.072454 18.749996
+v -0.716015 28.395309 0.000000
+v -0.822080 27.840916 22.499998
+v -0.981179 27.977892 18.749996
+v -1.246344 28.206188 0.000000
+v -0.866014 27.749599 22.499998
+v -1.091015 27.749599 18.749996
+v -1.466015 27.749599 0.000000
+v -0.822080 27.658281 22.499998
+v -0.981179 27.521307 18.749996
+v -1.246344 27.293011 0.000000
+v -0.716015 27.620457 22.499998
+v -0.716015 27.426743 18.749996
+v -0.629040 27.103886 0.000000
+v -0.609948 27.658281 22.499998
+v -0.450849 27.521307 18.749996
+v -0.185685 27.293011 0.000000
+v -0.028515 27.749599 3.124998
+v -0.091014 27.749599 6.249998
+v -0.153515 27.749599 9.374997
+v -0.216015 27.749599 12.499996
+v -0.278514 27.749599 15.624996
+v -0.229878 27.331060 3.124998
+v -0.274072 27.369110 6.249998
+v -0.318267 27.407154 9.374997
+v -0.362462 27.445206 12.499996
+v -0.406654 27.483257 15.624996
+v 0.774985 25.158726 18.494785
+v 2.349486 25.376209 15.522077
+v 2.411985 25.523190 12.499996
+v 2.474485 25.523190 9.374997
+v 2.536986 25.523190 6.249998
+v 2.599485 25.523190 3.124998
+v 2.661985 25.523190 0.000000
+v 4.919668 22.289122 12.150613
+v 4.982167 22.515976 9.184464
+v 5.044668 22.800421 6.258644
+v 5.107168 22.800417 3.133644
+v 5.169741 22.800392 0.000000
+v 6.853204 19.809378 6.116760
+v 7.224073 20.021494 3.140291
+v 7.286703 20.021448 0.000000
+v 1.446666 21.829916 18.079060
+v 3.021168 22.067556 15.120463
+v 1.779205 18.367237 17.606915
+v 4.073708 18.633253 14.668193
+v 5.324208 18.882090 11.717439
+v 6.173600 19.237459 8.841279
+v 1.779205 14.151859 16.952080
+v 4.073708 14.472324 14.051481
+v 6.008208 14.914806 11.236322
+v 7.006708 15.599648 8.590876
+v 7.753209 16.206085 5.890527
+v 8.093493 16.741280 3.140291
+v 7.878340 16.741234 0.000000
+v 0.519207 9.711632 16.052975
+v 2.813706 9.944913 13.395174
+v 4.532208 11.295698 10.912201
+v 5.638709 12.572056 8.312004
+v 5.953207 13.221888 5.642037
+v 6.293493 13.555683 2.924403
+v 6.510341 13.584993 0.000000
+v -1.712795 4.539915 14.229296
+v 0.005706 6.721300 12.935635
+v 1.796206 8.238514 10.569201
+v 3.514707 9.596653 8.026267
+v 4.153206 10.297425 5.391975
+v 4.215707 10.666860 2.699292
+v 4.278336 10.920532 -0.034037
+v 4.317936 22.048738 12.150613
+v 4.380435 22.275593 9.184464
+v 1.810253 25.282806 12.499996
+v 4.442935 22.560038 6.258644
+v 1.935254 25.282806 6.249998
+v 1.872753 25.282806 9.374997
+v 4.505436 22.560034 3.133644
+v 1.997753 25.282806 3.124998
+v 4.568008 22.560009 0.000000
+v 2.060253 25.282806 0.000000
+v 6.251471 19.568995 6.116760
+v 6.622341 19.781109 3.140291
+v 6.684969 19.781065 0.000000
+v 1.747754 25.135826 15.522077
+v 2.419436 21.827173 15.120463
+v 3.471975 18.392870 14.668193
+v 4.722476 18.641706 11.717439
+v 5.571867 18.997076 8.841279
+v 3.471975 14.231941 14.051481
+v 5.406476 14.674421 11.236322
+v 6.404974 15.359264 8.590876
+v 7.151477 15.965701 5.890527
+v 7.491759 16.500896 3.140291
+v 7.276607 16.500849 0.000000
+v 2.211973 9.704529 13.395174
+v 3.930475 11.055314 10.912201
+v 5.036976 12.331673 8.312004
+v 5.351475 12.981504 5.642037
+v 5.691761 13.315300 2.924403
+v 5.908608 13.344610 0.000000
+v -0.450849 27.977892 -18.749996
+v -0.609948 27.840916 -22.499998
+v -0.566015 27.749599 -22.499998
+v -0.341015 27.749599 -18.749996
+v -0.216015 27.749599 -12.499996
+v -0.153515 27.749599 -9.374997
+v -0.091014 27.749599 -6.249998
+v -0.028515 27.749599 -3.124998
+v -0.278514 27.749599 -15.624996
+v -0.716015 28.072454 -18.749996
+v -0.716015 27.878740 -22.499998
+v -0.981179 27.977892 -18.749996
+v -0.822080 27.840916 -22.499998
+v -1.091015 27.749599 -18.749996
+v -0.866014 27.749599 -22.499998
+v -0.981179 27.521307 -18.749996
+v -0.822080 27.658281 -22.499998
+v -0.716015 27.426743 -18.749996
+v -0.716015 27.620457 -22.499998
+v -0.450849 27.521307 -18.749996
+v -0.609948 27.658281 -22.499998
+v -0.229878 27.331060 -3.124998
+v -0.274072 27.369110 -6.249998
+v -0.318267 27.407154 -9.374997
+v -0.362462 27.445206 -12.499996
+v -0.406654 27.483257 -15.624996
+v 2.349486 25.376209 -15.522077
+v 2.411985 25.523190 -12.499996
+v 2.474485 25.523190 -9.374997
+v 2.536986 25.523190 -6.249998
+v 2.599485 25.523190 -3.124998
+v 4.919668 22.289122 -12.150613
+v 4.982167 22.515976 -9.184464
+v 5.044668 22.800421 -6.258644
+v 5.107168 22.800417 -3.133644
+v 6.853204 19.809378 -6.116760
+v 7.224073 20.021494 -3.140291
+v 0.774985 25.158726 -18.494785
+v 1.446666 21.829916 -18.079060
+v 3.021168 22.067556 -15.120463
+v 1.779205 18.367237 -17.606915
+v 4.073708 18.633253 -14.668193
+v 5.324208 18.882090 -11.717439
+v 6.173600 19.237459 -8.841279
+v 1.779205 14.151859 -16.952080
+v 4.073708 14.472324 -14.051481
+v 6.008208 14.914806 -11.236322
+v 7.006708 15.599648 -8.590876
+v 7.753209 16.206085 -5.890527
+v 8.093493 16.741280 -3.140291
+v 0.519207 9.711632 -16.052975
+v 2.813706 9.944913 -13.395174
+v 4.532208 11.295698 -10.912201
+v 5.638709 12.572056 -8.312004
+v 5.953207 13.221888 -5.642037
+v 6.293493 13.555683 -2.924403
+v -1.712795 4.539915 -14.229296
+v 0.005706 6.721300 -12.935635
+v 1.796206 8.238514 -10.569201
+v 3.514707 9.596653 -8.026267
+v 4.153206 10.297425 -5.391975
+v 4.215707 10.666860 -2.699292
+v 1.810253 25.282806 -12.499996
+v 4.380435 22.275593 -9.184464
+v 4.317936 22.048738 -12.150613
+v 1.872753 25.282806 -9.374997
+v 1.935254 25.282806 -6.249998
+v 4.442935 22.560038 -6.258644
+v 1.997753 25.282806 -3.124998
+v 4.505436 22.560034 -3.133644
+v 6.622341 19.781109 -3.140291
+v 6.251471 19.568995 -6.116760
+v 1.747754 25.135826 -15.522077
+v 2.419436 21.827173 -15.120463
+v 3.471975 18.392870 -14.668193
+v 4.722476 18.641706 -11.717439
+v 5.571867 18.997076 -8.841279
+v 3.471975 14.231941 -14.051481
+v 5.406476 14.674421 -11.236322
+v 6.404974 15.359264 -8.590876
+v 7.151477 15.965701 -5.890527
+v 7.491759 16.500896 -3.140291
+v 2.211973 9.704529 -13.395174
+v 3.930475 11.055314 -10.912201
+v 5.036976 12.331673 -8.312004
+v 5.351475 12.981504 -5.642037
+v 5.691761 13.315300 -2.924403
+v -0.441215 47.520119 0.000000
+v -0.816215 47.520119 -14.015965
+v -1.041214 47.520119 -16.818804
+v -0.660885 47.900337 0.000000
+v -0.926051 47.710224 -14.015965
+v -1.085148 47.596161 -16.818804
+v -1.191215 48.057846 0.000000
+v -1.191215 47.788982 -14.015965
+v -1.191215 47.627666 -16.818804
+v -1.721544 47.900337 0.000000
+v -1.456378 47.710224 -14.015965
+v -1.297281 47.596161 -16.818804
+v -1.941214 47.520119 0.000000
+v -1.566214 47.520119 -14.015965
+v -1.341214 47.520119 -16.818804
+v -1.721544 47.139870 0.000000
+v -1.456378 47.330002 -14.015965
+v -1.297281 47.444061 -16.818804
+v -1.147212 46.982380 0.000000
+v -1.147212 47.251244 -14.015965
+v -1.191215 47.412563 -16.818804
+v -0.660885 47.139870 0.000000
+v -0.926051 47.330002 -14.015965
+v -1.085148 47.444061 -16.818804
+v -0.881855 47.298306 -11.680260
+v -0.837662 47.266632 -9.344559
+v -0.793467 47.234909 -7.008858
+v -0.749272 47.203262 -4.673156
+v -0.705079 47.171555 -2.337453
+v -0.753716 47.520119 -11.680260
+v -0.691215 47.520119 -9.344559
+v -0.628715 47.520119 -7.008858
+v -0.566216 47.520119 -4.673156
+v -0.503715 47.520119 -2.337453
+v 2.186784 45.666019 0.000000
+v 2.124283 45.666019 -2.337453
+v 2.061785 45.666019 -4.673156
+v 1.999284 45.666019 -7.008858
+v 1.936783 45.666019 -9.344559
+v 1.874285 45.580280 -11.580549
+v 0.299784 45.386532 -13.903419
+v 4.694541 43.398529 0.000000
+v 4.631968 43.398544 -2.343915
+v 4.569468 43.403488 -4.796154
+v 4.506968 43.190250 -7.144563
+v 3.544468 42.994743 -9.666407
+v 2.545968 42.799408 -11.660814
+v 0.971465 42.588673 -13.968838
+v 6.503135 41.087234 0.000000
+v 6.440504 41.095375 -2.609166
+v 6.378005 40.956799 -5.189175
+v 5.650746 40.443047 -7.502493
+v 4.926439 40.128944 -9.945014
+v 3.598507 39.908993 -11.913838
+v 1.304004 39.676033 -14.292400
+v 7.403139 38.374527 0.000000
+v 7.340509 38.387520 -3.171366
+v 7.278009 37.949181 -5.513334
+v 6.531507 37.409622 -7.948401
+v 5.533008 36.794739 -10.264465
+v 3.598507 36.403469 -12.462982
+v 1.304004 36.126175 -14.981808
+v 6.035139 35.763321 0.000000
+v 5.972509 35.771698 -3.283163
+v 5.910010 35.459286 -5.936440
+v 5.847510 34.875942 -8.256088
+v 4.057008 33.780102 -10.944506
+v 2.338505 32.605881 -13.808851
+v 0.044005 32.376560 -16.380838
+v 3.803136 33.562889 0.000000
+v 3.740506 33.359436 -3.333341
+v 3.678006 33.020260 -6.361779
+v 3.039505 32.401882 -8.960025
+v 1.321005 31.238838 -11.792484
+v -0.181494 29.931759 -14.732271
+v -2.187994 28.006685 -18.449085
+v 4.086603 43.218376 0.000000
+v 4.024032 43.218391 -2.343915
+v 1.516346 45.485867 -2.337453
+v 1.578847 45.485867 0.000000
+v 3.961532 43.223335 -4.796154
+v 1.453848 45.485867 -4.673156
+v 3.899031 43.010098 -7.144563
+v 1.391347 45.485867 -7.008858
+v 1.328846 45.485867 -9.344559
+v 2.936531 42.814590 -9.666407
+v 1.266348 45.400127 -11.580549
+v 1.938032 42.619255 -11.660814
+v 5.895196 40.907082 0.000000
+v 5.832567 40.915222 -2.609166
+v 5.770068 40.776646 -5.189175
+v 5.042808 40.262894 -7.502493
+v 4.318501 39.948792 -9.945014
+v 2.990570 39.728840 -11.913838
+v 6.795203 38.194374 0.000000
+v 6.732572 38.207367 -3.171366
+v 6.670071 37.769028 -5.513334
+v 5.923571 37.229469 -7.948401
+v 4.925072 36.614586 -10.264465
+v 2.990570 36.223316 -12.462982
+v 5.427201 35.583168 0.000000
+v 5.364572 35.591545 -3.283163
+v 5.302073 35.279133 -5.936440
+v 5.239572 34.695789 -8.256088
+v 3.449071 33.599949 -10.944506
+v 1.730568 32.425728 -13.808851
+v -0.566216 47.520119 4.673156
+v -0.628715 47.520119 7.008858
+v -0.691215 47.520119 9.344559
+v -0.753716 47.520119 11.680260
+v -0.816215 47.520119 14.015965
+v -0.926051 47.710224 14.015965
+v -0.503715 47.520119 2.337453
+v -1.085148 47.596161 16.818804
+v -1.041214 47.520119 16.818804
+v -1.191215 47.788982 14.015965
+v -1.191215 47.627666 16.818804
+v -1.456378 47.710224 14.015965
+v -1.297281 47.596161 16.818804
+v -1.566214 47.520119 14.015965
+v -1.341214 47.520119 16.818804
+v -1.456378 47.330002 14.015965
+v -1.297281 47.444061 16.818804
+v -1.147212 47.251244 14.015965
+v -1.191215 47.412563 16.818804
+v -0.926051 47.330002 14.015965
+v -0.881855 47.298306 11.680260
+v -0.837662 47.266632 9.344559
+v -0.793467 47.234909 7.008858
+v -0.749272 47.203262 4.673156
+v -0.705079 47.171555 2.337453
+v -1.085148 47.444061 16.818804
+v 2.124283 45.666019 2.337453
+v 2.061785 45.666019 4.673156
+v 1.999284 45.666019 7.008858
+v 1.936783 45.666019 9.344559
+v 1.874285 45.580280 11.580549
+v 0.299784 45.386532 13.903419
+v 4.631968 43.398544 2.343915
+v 4.569468 43.403488 4.796154
+v 4.506968 43.190250 7.144563
+v 3.544468 42.994743 9.666407
+v 2.545968 42.799408 11.660814
+v 0.971465 42.588673 13.968838
+v 6.440504 41.095375 2.609166
+v 6.378005 40.956799 5.189175
+v 5.650746 40.443047 7.502493
+v 4.926439 40.128944 9.945014
+v 3.598507 39.908993 11.913838
+v 1.304004 39.676033 14.292400
+v 7.340509 38.387520 3.171366
+v 7.278009 37.949181 5.513334
+v 6.531507 37.409622 7.948401
+v 5.533008 36.794739 10.264465
+v 3.598507 36.403469 12.462982
+v 1.304004 36.126175 14.981808
+v 5.972509 35.771698 3.283163
+v 5.910010 35.459286 5.936440
+v 5.847510 34.875942 8.256088
+v 4.057008 33.780102 10.944506
+v 2.338505 32.605881 13.808851
+v 0.044005 32.376560 16.380838
+v 3.740506 33.359436 3.333341
+v 3.678006 33.020260 6.361779
+v 3.039505 32.401882 8.960025
+v 1.321005 31.238838 11.792484
+v -0.181494 29.931759 14.732271
+v -2.187994 28.006685 18.449085
+v 1.516346 45.485867 2.337453
+v 4.024032 43.218391 2.343915
+v 1.453848 45.485867 4.673156
+v 3.961532 43.223335 4.796154
+v 1.391347 45.485867 7.008858
+v 3.899031 43.010098 7.144563
+v 1.328846 45.485867 9.344559
+v 1.266348 45.400127 11.580549
+v 2.936531 42.814590 9.666407
+v 1.938032 42.619255 11.660814
+v 5.832567 40.915222 2.609166
+v 5.770068 40.776646 5.189175
+v 5.042808 40.262894 7.502493
+v 2.990570 39.728840 11.913838
+v 4.318501 39.948792 9.945014
+v 6.732572 38.207367 3.171366
+v 6.670071 37.769028 5.513334
+v 5.923571 37.229469 7.948401
+v 4.925072 36.614586 10.264465
+v 2.990570 36.223316 12.462982
+v 5.364572 35.591545 3.283163
+v 5.302073 35.279133 5.936440
+v 5.239572 34.695789 8.256088
+v 3.449071 33.599949 10.944506
+v 1.730568 32.425728 13.808851
+v 15.199894 24.244293 20.208620
+v 15.396472 24.244293 16.840515
+v 15.724104 24.244293 0.000000
+v 15.161510 24.324074 20.208620
+v 15.300512 24.443750 16.840515
+v 15.532181 24.643208 0.000000
+v 15.068842 24.357121 20.208620
+v 15.068842 24.526367 16.840515
+v 15.068842 24.808439 0.000000
+v 14.976175 24.324074 20.208620
+v 14.837173 24.443750 16.840515
+v 14.605503 24.643208 0.000000
+v 14.937790 24.244293 20.208620
+v 14.741212 24.244293 16.840515
+v 14.413582 24.244293 0.000000
+v 14.976175 24.164513 20.208620
+v 14.837173 24.044842 16.840515
+v 14.605503 23.845383 0.000000
+v 15.068842 24.131464 20.208620
+v 15.068842 23.962219 16.840515
+v 15.144831 23.680147 0.000000
+v 15.161510 24.164513 20.208620
+v 15.300512 24.044842 16.840515
+v 15.532181 23.845383 0.000000
+v 15.669498 24.244293 2.806750
+v 15.614893 24.244293 5.613504
+v 15.560287 24.244293 8.420256
+v 15.505682 24.244293 11.227010
+v 15.451077 24.244293 14.033761
+v 15.493570 23.878626 2.806750
+v 15.454958 23.911867 5.613504
+v 15.416346 23.945107 8.420256
+v 15.377735 23.978352 11.227010
+v 15.339125 24.011599 14.033761
+v 16.371500 21.980698 16.611292
+v 17.747112 22.170710 13.941322
+v 17.801716 22.299122 11.227010
+v 17.856321 22.299122 8.420256
+v 17.910927 22.299122 5.613504
+v 17.965530 22.299122 2.806750
+v 18.020136 22.299122 0.000000
+v 19.992630 19.473579 10.913207
+v 20.047235 19.671778 8.249126
+v 20.101841 19.920292 5.621270
+v 20.156446 19.920288 2.814516
+v 20.211115 19.920267 0.000000
+v 21.681923 17.307076 5.493834
+v 22.005945 17.492397 2.820486
+v 22.060665 17.492359 0.000000
+v 16.958334 19.072380 16.237904
+v 18.333946 19.280003 13.580609
+v 17.248869 16.047104 15.813843
+v 19.253532 16.279516 13.174398
+v 20.346069 16.496920 10.524145
+v 21.088167 16.807402 7.940892
+v 17.248869 12.364210 15.225695
+v 19.253532 12.644194 12.620491
+v 20.943666 13.030781 10.092027
+v 21.816038 13.629114 7.715988
+v 22.468241 14.158947 5.290641
+v 22.765541 14.626535 2.820486
+v 22.577564 14.626495 0.000000
+v 16.148031 8.484867 14.418156
+v 18.152691 8.688681 12.031022
+v 19.654114 9.868836 9.800913
+v 20.620842 10.983964 7.465518
+v 20.895615 11.551710 5.067457
+v 21.192915 11.843342 2.626584
+v 21.382370 11.868950 0.000000
+v 14.197975 3.966436 12.780198
+v 15.699396 5.872272 11.618281
+v 17.263721 7.197832 9.492843
+v 18.765144 8.384414 7.208880
+v 19.322987 8.996664 4.842861
+v 19.377592 9.319432 2.424399
+v 19.432312 9.541060 -0.030570
+v 19.466908 19.263561 10.913207
+v 19.521511 19.461760 8.249126
+v 17.275993 22.089104 11.227010
+v 19.576118 19.710272 5.621270
+v 17.385204 22.089104 5.613504
+v 17.330599 22.089104 8.420256
+v 19.630722 19.710270 2.814516
+v 17.439808 22.089104 2.806750
+v 19.685390 19.710247 0.000000
+v 17.494415 22.089104 0.000000
+v 21.156200 17.097057 5.493834
+v 21.480223 17.282379 2.820486
+v 21.534941 17.282339 0.000000
+v 17.221392 21.960691 13.941322
+v 17.808226 19.069984 13.580609
+v 18.727808 16.069500 13.174398
+v 19.820347 16.286903 10.524145
+v 20.562443 16.597382 7.940892
+v 18.727808 12.434175 12.620491
+v 20.417946 12.820762 10.092027
+v 21.290312 13.419096 7.715988
+v 21.942516 13.948927 5.290641
+v 22.239817 14.416519 2.820486
+v 22.051842 14.416475 0.000000
+v 17.626970 8.478662 12.031022
+v 19.128391 9.658816 9.800913
+v 20.095119 10.773947 7.465518
+v 20.369892 11.341692 5.067457
+v 20.667192 11.633322 2.626584
+v 20.856647 11.658932 0.000000
+v 15.300512 24.443750 -16.840515
+v 15.161510 24.324074 -20.208620
+v 15.199894 24.244293 -20.208620
+v 15.396472 24.244293 -16.840515
+v 15.505682 24.244293 -11.227010
+v 15.560287 24.244293 -8.420256
+v 15.614893 24.244293 -5.613504
+v 15.669498 24.244293 -2.806750
+v 15.451077 24.244293 -14.033761
+v 15.068842 24.526367 -16.840515
+v 15.068842 24.357121 -20.208620
+v 14.837173 24.443750 -16.840515
+v 14.976175 24.324074 -20.208620
+v 14.741212 24.244293 -16.840515
+v 14.937790 24.244293 -20.208620
+v 14.837173 24.044842 -16.840515
+v 14.976175 24.164513 -20.208620
+v 15.068842 23.962219 -16.840515
+v 15.068842 24.131464 -20.208620
+v 15.300512 24.044842 -16.840515
+v 15.161510 24.164513 -20.208620
+v 15.493570 23.878626 -2.806750
+v 15.454958 23.911867 -5.613504
+v 15.416346 23.945107 -8.420256
+v 15.377735 23.978352 -11.227010
+v 15.339125 24.011599 -14.033761
+v 17.747112 22.170710 -13.941322
+v 17.801716 22.299122 -11.227010
+v 17.856321 22.299122 -8.420256
+v 17.910927 22.299122 -5.613504
+v 17.965530 22.299122 -2.806750
+v 19.992630 19.473579 -10.913207
+v 20.047235 19.671778 -8.249126
+v 20.101841 19.920292 -5.621270
+v 20.156446 19.920288 -2.814516
+v 21.681923 17.307076 -5.493834
+v 22.005945 17.492397 -2.820486
+v 16.371500 21.980698 -16.611292
+v 16.958334 19.072380 -16.237904
+v 18.333946 19.280003 -13.580609
+v 17.248869 16.047104 -15.813843
+v 19.253532 16.279516 -13.174398
+v 20.346069 16.496920 -10.524145
+v 21.088167 16.807402 -7.940892
+v 17.248869 12.364210 -15.225695
+v 19.253532 12.644194 -12.620491
+v 20.943666 13.030781 -10.092027
+v 21.816038 13.629114 -7.715988
+v 22.468241 14.158947 -5.290641
+v 22.765541 14.626535 -2.820486
+v 16.148031 8.484867 -14.418156
+v 18.152691 8.688681 -12.031022
+v 19.654114 9.868836 -9.800913
+v 20.620842 10.983964 -7.465518
+v 20.895615 11.551710 -5.067457
+v 21.192915 11.843342 -2.626584
+v 14.197975 3.966436 -12.780198
+v 15.699396 5.872272 -11.618281
+v 17.263721 7.197832 -9.492843
+v 18.765144 8.384414 -7.208880
+v 19.322987 8.996664 -4.842861
+v 19.377592 9.319432 -2.424399
+v 17.275993 22.089104 -11.227010
+v 19.521511 19.461760 -8.249126
+v 19.466908 19.263561 -10.913207
+v 17.330599 22.089104 -8.420256
+v 17.385204 22.089104 -5.613504
+v 19.576118 19.710272 -5.621270
+v 17.439808 22.089104 -2.806750
+v 19.630722 19.710270 -2.814516
+v 21.480223 17.282379 -2.820486
+v 21.156200 17.097057 -5.493834
+v 17.221392 21.960691 -13.941322
+v 17.808226 19.069984 -13.580609
+v 18.727808 16.069500 -13.174398
+v 19.820347 16.286903 -10.524145
+v 20.562443 16.597382 -7.940892
+v 18.727808 12.434175 -12.620491
+v 20.417946 12.820762 -10.092027
+v 21.290312 13.419096 -7.715988
+v 21.942516 13.948927 -5.290641
+v 22.239817 14.416519 -2.820486
+v 17.626970 8.478662 -12.031022
+v 19.128391 9.658816 -9.800913
+v 20.095119 10.773947 -7.465518
+v 20.369892 11.341692 -5.067457
+v 20.667192 11.633322 -2.626584
+v 15.308929 41.517422 0.000000
+v 14.981298 41.517422 -12.588591
+v 14.784721 41.517422 -15.105992
+v 15.117007 41.849609 0.000000
+v 14.885338 41.683510 -12.588591
+v 14.746338 41.583855 -15.105992
+v 14.653669 41.987221 0.000000
+v 14.653669 41.752319 -12.588591
+v 14.653669 41.611382 -15.105992
+v 14.190331 41.849609 0.000000
+v 14.422001 41.683510 -12.588591
+v 14.561001 41.583855 -15.105992
+v 13.998409 41.517422 0.000000
+v 14.326038 41.517422 -12.588591
+v 14.522617 41.517422 -15.105992
+v 14.190331 41.185200 0.000000
+v 14.422001 41.351318 -12.588591
+v 14.561001 41.450974 -15.105992
+v 14.692114 41.047607 0.000000
+v 14.692114 41.282509 -12.588591
+v 14.653669 41.423450 -15.105992
+v 15.117007 41.185200 0.000000
+v 14.885338 41.351318 -12.588591
+v 14.746338 41.450974 -15.105992
+v 14.923951 41.323624 -10.490752
+v 14.962563 41.295952 -8.392917
+v 15.001173 41.268238 -6.295083
+v 15.039785 41.240585 -4.197246
+v 15.078396 41.212887 -2.099409
+v 15.035903 41.517422 -10.490752
+v 15.090508 41.517422 -8.392917
+v 15.145114 41.517422 -6.295083
+v 15.199718 41.517422 -4.197246
+v 15.254324 41.517422 -2.099409
+v 17.604961 39.897530 0.000000
+v 17.550356 39.897530 -2.099409
+v 17.495752 39.897530 -4.197246
+v 17.441147 39.897530 -6.295083
+v 17.386541 39.897530 -8.392917
+v 17.331936 39.822620 -10.401196
+v 15.956326 39.653347 -12.487507
+v 19.795940 37.916466 0.000000
+v 19.741272 37.916477 -2.105213
+v 19.686668 37.920795 -4.307718
+v 19.632061 37.734497 -6.416967
+v 18.791145 37.563686 -8.681988
+v 17.918774 37.393028 -10.473288
+v 16.543159 37.208908 -12.546264
+v 21.376074 35.897133 0.000000
+v 21.321356 35.904243 -2.343451
+v 21.266750 35.783173 -4.660714
+v 20.631359 35.334316 -6.738446
+v 19.998547 35.059895 -8.932222
+v 18.838356 34.867725 -10.700544
+v 16.833694 34.664192 -12.836876
+v 22.162392 33.527092 0.000000
+v 22.107674 33.538445 -2.848397
+v 22.053068 33.155472 -4.951861
+v 21.400864 32.684071 -7.138943
+v 20.528494 32.146858 -9.219141
+v 18.838356 31.805016 -11.193764
+v 16.833694 31.562752 -13.456076
+v 20.967196 31.245729 0.000000
+v 20.912479 31.253052 -2.948808
+v 20.857872 30.980101 -5.331879
+v 20.803268 30.470444 -7.415297
+v 19.238941 29.513027 -9.829927
+v 17.737516 28.487133 -12.402572
+v 15.732857 28.286781 -14.712629
+v 19.017138 29.323254 0.000000
+v 18.962420 29.145500 -2.993877
+v 18.907814 28.849167 -5.713902
+v 18.349968 28.308907 -8.047544
+v 16.848547 27.292774 -10.591549
+v 15.535843 26.150806 -13.231953
+v 13.782801 24.468904 -16.570248
+v 19.264797 37.759071 0.000000
+v 19.210129 37.759079 -2.105213
+v 17.019213 39.740131 -2.099409
+v 17.073820 39.740131 0.000000
+v 19.155525 37.763401 -4.307718
+v 16.964611 39.740131 -4.197246
+v 19.100918 37.577103 -6.416967
+v 16.910004 39.740131 -6.295083
+v 16.855398 39.740131 -8.392917
+v 18.260002 37.406288 -8.681988
+v 16.800793 39.665226 -10.401196
+v 17.387630 37.235630 -10.473288
+v 20.844931 35.739735 0.000000
+v 20.790213 35.746845 -2.343451
+v 20.735609 35.625778 -4.660714
+v 20.100216 35.176926 -6.738446
+v 19.467403 34.902496 -8.932222
+v 18.307213 34.710327 -10.700544
+v 21.631248 33.369698 0.000000
+v 21.576529 33.381050 -2.848397
+v 21.521923 32.998077 -4.951861
+v 20.869720 32.526680 -7.138943
+v 19.997353 31.989464 -9.219141
+v 18.307213 31.647621 -11.193764
+v 20.436052 31.088337 0.000000
+v 20.381334 31.095654 -2.948808
+v 20.326729 30.822704 -5.331879
+v 20.272125 30.313047 -7.415297
+v 18.707798 29.355633 -9.829927
+v 17.206375 28.329739 -12.402572
+v 15.199718 41.517422 4.197246
+v 15.145114 41.517422 6.295083
+v 15.090508 41.517422 8.392917
+v 15.035903 41.517422 10.490752
+v 14.981298 41.517422 12.588591
+v 14.885338 41.683510 12.588591
+v 15.254324 41.517422 2.099409
+v 14.746338 41.583855 15.105992
+v 14.784721 41.517422 15.105992
+v 14.653669 41.752319 12.588591
+v 14.653669 41.611382 15.105992
+v 14.422001 41.683510 12.588591
+v 14.561001 41.583855 15.105992
+v 14.326038 41.517422 12.588591
+v 14.522617 41.517422 15.105992
+v 14.422001 41.351318 12.588591
+v 14.561001 41.450974 15.105992
+v 14.692114 41.282509 12.588591
+v 14.653669 41.423450 15.105992
+v 14.885338 41.351318 12.588591
+v 14.923951 41.323624 10.490752
+v 14.962563 41.295952 8.392917
+v 15.001173 41.268238 6.295083
+v 15.039785 41.240585 4.197246
+v 15.078396 41.212887 2.099409
+v 14.746338 41.450974 15.105992
+v 17.550356 39.897530 2.099409
+v 17.495752 39.897530 4.197246
+v 17.441147 39.897530 6.295083
+v 17.386541 39.897530 8.392917
+v 17.331936 39.822620 10.401196
+v 15.956326 39.653347 12.487507
+v 19.741272 37.916477 2.105213
+v 19.686668 37.920795 4.307718
+v 19.632061 37.734497 6.416967
+v 18.791145 37.563686 8.681988
+v 17.918774 37.393028 10.473288
+v 16.543159 37.208908 12.546264
+v 21.321356 35.904243 2.343451
+v 21.266750 35.783173 4.660714
+v 20.631359 35.334316 6.738446
+v 19.998547 35.059895 8.932222
+v 18.838356 34.867725 10.700544
+v 16.833694 34.664192 12.836876
+v 22.107674 33.538445 2.848397
+v 22.053068 33.155472 4.951861
+v 21.400864 32.684071 7.138943
+v 20.528494 32.146858 9.219141
+v 18.838356 31.805016 11.193764
+v 16.833694 31.562752 13.456076
+v 20.912479 31.253052 2.948808
+v 20.857872 30.980101 5.331879
+v 20.803268 30.470444 7.415297
+v 19.238941 29.513027 9.829927
+v 17.737516 28.487133 12.402572
+v 15.732857 28.286781 14.712629
+v 18.962420 29.145500 2.993877
+v 18.907814 28.849167 5.713902
+v 18.349968 28.308907 8.047544
+v 16.848547 27.292774 10.591549
+v 15.535843 26.150806 13.231953
+v 13.782801 24.468904 16.570248
+v 17.019213 39.740131 2.099409
+v 19.210129 37.759079 2.105213
+v 16.964611 39.740131 4.197246
+v 19.155525 37.763401 4.307718
+v 16.910004 39.740131 6.295083
+v 19.100918 37.577103 6.416967
+v 16.855398 39.740131 8.392917
+v 16.800793 39.665226 10.401196
+v 18.260002 37.406288 8.681988
+v 17.387630 37.235630 10.473288
+v 20.790213 35.746845 2.343451
+v 20.735609 35.625778 4.660714
+v 20.100216 35.176926 6.738446
+v 18.307213 34.710327 10.700544
+v 19.467403 34.902496 8.932222
+v 21.576529 33.381050 2.848397
+v 21.521923 32.998077 4.951861
+v 20.869720 32.526680 7.138943
+v 19.997353 31.989464 9.219141
+v 18.307213 31.647621 11.193764
+v 20.381334 31.095654 2.948808
+v 20.326729 30.822704 5.331879
+v 20.272125 30.313047 7.415297
+v 18.707798 29.355633 9.829927
+v 17.206375 28.329739 12.402572
+v 37.183197 9.436539 12.125172
+v 36.948586 9.445372 14.550205
+v 36.915100 9.337111 14.550205
+v 37.099464 9.165879 12.125172
+v 37.201889 9.070754 8.083447
+v 37.253113 9.023188 6.062584
+v 37.304321 8.975623 4.041723
+v 37.355537 8.928061 2.020860
+v 37.406761 8.880497 0.000000
+v 37.574219 9.421815 0.000000
+v 37.150681 9.118316 10.104307
+v 37.037880 9.715820 12.125172
+v 36.890457 9.557086 14.550205
+v 37.283577 9.980377 0.000000
+v 36.748634 9.840131 12.125172
+v 36.774757 9.606809 14.550205
+v 36.705086 10.229001 0.000000
+v 36.484894 9.736646 12.125172
+v 36.669266 9.565416 14.550205
+v 36.177612 10.022031 0.000000
+v 36.401161 9.465988 12.125172
+v 36.635773 9.457152 14.550205
+v 36.010139 9.480717 0.000000
+v 36.546486 9.186706 12.125172
+v 36.693893 9.345439 14.550205
+v 36.372047 8.855958 0.000000
+v 36.835732 9.062397 12.125172
+v 36.809601 9.295714 14.550205
+v 36.879280 8.673531 0.000000
+v 36.872025 8.738340 2.020860
+v 36.864754 8.803152 4.041723
+v 36.857498 8.867962 6.062584
+v 36.850243 8.932775 8.083447
+v 36.842987 8.997587 10.104307
+v 37.233280 7.108510 10.037751
+v 37.335197 7.154058 8.083447
+v 37.367207 7.124331 6.062584
+v 37.399216 7.094601 4.041723
+v 37.431225 7.064876 2.020860
+v 37.463234 7.035147 0.000000
+v 37.081245 4.304998 7.857507
+v 37.221157 4.391452 5.939371
+v 37.388454 4.507402 4.047314
+v 37.420464 4.477671 2.026452
+v 37.452499 4.447899 0.000000
+v 36.892029 2.115348 3.955562
+v 37.182858 2.047582 2.030749
+v 37.214912 2.017770 0.000000
+v 36.323467 7.746022 11.960131
+v 35.084148 5.721714 11.691292
+v 36.003555 5.094525 9.778038
+v 33.607471 3.790157 11.385965
+v 34.909115 2.835039 9.485566
+v 35.667908 2.367693 7.577384
+v 36.271950 2.145690 5.717442
+v 31.602478 1.631277 10.962500
+v 32.930016 0.704046 9.086754
+v 34.131218 0.010538 7.266258
+v 34.968334 -0.113652 5.555511
+v 35.639095 -0.158133 3.809260
+v 36.067928 -0.045890 2.030749
+v 35.957718 0.056421 0.000000
+v 28.845230 -0.043453 10.381071
+v 30.131302 -1.015334 8.662334
+v 31.653908 -1.140924 7.056657
+v 32.827682 -1.013539 5.375172
+v 33.297836 -0.830322 3.648569
+v 33.630875 -0.821223 1.891142
+v 33.755875 -0.909353 0.000000
+v 25.242256 -1.630489 9.201742
+v 27.159927 -1.330692 8.365163
+v 28.798569 -1.405293 6.834847
+v 30.324669 -1.527117 5.190393
+v 30.984987 -1.471915 3.486860
+v 31.192715 -1.312438 1.745566
+v 31.345444 -1.212310 -0.022011
+v 36.912689 7.317153 8.083447
+v 36.798645 4.554550 5.939371
+v 36.658737 4.468093 7.857507
+v 36.944698 7.287426 6.062584
+v 36.976711 7.257699 4.041723
+v 36.965946 4.670499 4.047314
+v 37.008717 7.227970 2.020860
+v 36.997955 4.640769 2.026452
+v 37.040730 7.198245 0.000000
+v 37.029991 4.610995 0.000000
+v 36.760353 2.210679 2.030749
+v 36.469521 2.278445 3.955562
+v 36.792404 2.180868 0.000000
+v 36.810776 7.271606 10.037751
+v 35.581047 5.257621 9.778038
+v 34.486607 2.998137 9.485566
+v 35.245403 2.530790 7.577384
+v 35.849438 2.308786 5.717442
+v 32.507507 0.867143 9.086754
+v 33.708714 0.173633 7.266258
+v 34.545826 0.049446 5.555511
+v 35.216587 0.004963 3.809260
+v 35.645420 0.117208 2.030749
+v 35.535206 0.219519 0.000000
+v 29.708790 -0.852237 8.662334
+v 31.231400 -0.977827 7.056657
+v 32.405174 -0.850443 5.375172
+v 32.875324 -0.667224 3.648569
+v 33.208366 -0.658127 1.891142
+v 33.333366 -0.746256 0.000000
+v 37.099464 9.165879 -12.125172
+v 36.915100 9.337111 -14.550205
+v 36.948586 9.445372 -14.550205
+v 37.183197 9.436539 -12.125172
+v 37.150681 9.118316 -10.104307
+v 37.355537 8.928061 -2.020860
+v 37.304321 8.975623 -4.041723
+v 37.253113 9.023188 -6.062584
+v 37.201889 9.070754 -8.083447
+v 36.890457 9.557086 -14.550205
+v 37.037880 9.715820 -12.125172
+v 36.774757 9.606809 -14.550205
+v 36.748634 9.840131 -12.125172
+v 36.669266 9.565416 -14.550205
+v 36.484894 9.736646 -12.125172
+v 36.635773 9.457152 -14.550205
+v 36.401161 9.465988 -12.125172
+v 36.693893 9.345439 -14.550205
+v 36.546486 9.186706 -12.125172
+v 36.809601 9.295714 -14.550205
+v 36.835732 9.062397 -12.125172
+v 36.842987 8.997587 -10.104307
+v 36.850243 8.932775 -8.083447
+v 36.857498 8.867962 -6.062584
+v 36.864754 8.803152 -4.041723
+v 36.872025 8.738340 -2.020860
+v 37.233280 7.108510 -10.037751
+v 37.335197 7.154058 -8.083447
+v 37.367207 7.124331 -6.062584
+v 37.399216 7.094601 -4.041723
+v 37.431225 7.064876 -2.020860
+v 37.221157 4.391452 -5.939371
+v 37.081245 4.304998 -7.857507
+v 37.388454 4.507402 -4.047314
+v 37.420464 4.477671 -2.026452
+v 37.182858 2.047582 -2.030749
+v 36.892029 2.115348 -3.955562
+v 36.323467 7.746022 -11.960131
+v 36.003555 5.094525 -9.778038
+v 35.084148 5.721714 -11.691292
+v 34.909115 2.835039 -9.485566
+v 33.607471 3.790157 -11.385965
+v 35.667908 2.367693 -7.577384
+v 36.271950 2.145690 -5.717442
+v 32.930016 0.704046 -9.086754
+v 31.602478 1.631277 -10.962500
+v 34.131218 0.010538 -7.266258
+v 34.968334 -0.113652 -5.555511
+v 35.639095 -0.158133 -3.809260
+v 36.067928 -0.045890 -2.030749
+v 30.131302 -1.015334 -8.662334
+v 28.845230 -0.043453 -10.381071
+v 31.653908 -1.140924 -7.056657
+v 32.827682 -1.013539 -5.375172
+v 33.297836 -0.830322 -3.648569
+v 33.630875 -0.821223 -1.891142
+v 27.159927 -1.330692 -8.365163
+v 25.242256 -1.630489 -9.201742
+v 28.798569 -1.405293 -6.834847
+v 30.324669 -1.527117 -5.190393
+v 30.984987 -1.471915 -3.486860
+v 31.192715 -1.312438 -1.745566
+v 36.658737 4.468093 -7.857507
+v 36.798645 4.554550 -5.939371
+v 36.912689 7.317153 -8.083447
+v 36.965946 4.670499 -4.047314
+v 36.976711 7.257699 -4.041723
+v 36.944698 7.287426 -6.062584
+v 36.997955 4.640769 -2.026452
+v 37.008717 7.227970 -2.020860
+v 36.469521 2.278445 -3.955562
+v 36.760353 2.210679 -2.030749
+v 36.810776 7.271606 -10.037751
+v 35.581047 5.257621 -9.778038
+v 34.486607 2.998137 -9.485566
+v 35.245403 2.530790 -7.577384
+v 35.849438 2.308786 -5.717442
+v 32.507507 0.867143 -9.086754
+v 33.708714 0.173633 -7.266258
+v 34.545826 0.049446 -5.555511
+v 35.216587 0.004963 -3.809260
+v 35.645420 0.117208 -2.030749
+v 29.708790 -0.852237 -8.662334
+v 31.231400 -0.977827 -7.056657
+v 32.405174 -0.850443 -5.375172
+v 32.875324 -0.667224 -3.648569
+v 33.208366 -0.658127 -1.891142
+v -25.342682 39.050133 12.631252
+v -26.800455 41.402733 15.170297
+v -26.837248 41.324783 15.223574
+v -25.434660 38.855247 12.764452
+v -17.744377 26.753054 0.677289
+v -17.560419 27.142822 0.410891
+v -9.376750 14.896337 -11.201438
+v -9.284773 15.091215 -11.334633
+v -7.530965 12.652036 -13.588774
+v -7.567755 12.574083 -13.535497
+v -25.106192 39.202751 12.637131
+v -26.705860 41.463783 15.172644
+v -17.087444 27.448063 0.422648
+v -9.048284 15.243841 -11.328759
+v -7.436370 12.713083 -13.586423
+v -24.863726 39.223705 12.778642
+v -26.608875 41.472164 15.229251
+v -16.602512 27.489975 0.705667
+v -8.805818 15.264791 -11.187246
+v -7.339383 12.721467 -13.529819
+v -24.757313 39.100723 12.972888
+v -26.566311 41.422974 15.306951
+v -16.389688 27.244003 1.094167
+v -8.699405 15.141807 -10.992999
+v -7.296819 12.672277 -13.452118
+v -24.849295 38.905838 13.106089
+v -26.603102 41.345016 15.360229
+v -16.573647 26.854233 1.360564
+v -8.791386 14.946925 -10.859798
+v -7.333611 12.594320 -13.398837
+v -25.085781 38.753212 13.100214
+v -26.697697 41.283970 15.357880
+v -17.125172 26.520523 1.324638
+v -9.106422 14.765837 -10.889849
+v -7.428205 12.533272 -13.401189
+v -25.328247 38.732258 12.958700
+v -26.794685 41.275585 15.301274
+v -17.531553 26.507080 1.065789
+v -9.270339 14.773350 -11.007191
+v -7.525191 12.524889 -13.457792
+v -14.838583 7.725491 16.392136
+v -13.115796 20.643181 -4.782604
+v -11.111109 17.704510 -7.836226
+v -15.120483 23.581854 -1.728984
+v -21.105474 32.636868 7.212426
+v -19.115322 29.578697 4.268532
+v -23.095627 35.695042 10.156319
+v -17.850927 23.415936 11.145543
+v -15.971910 15.023872 13.064692
+v -20.878242 31.325497 10.889566
+v -22.710337 35.141632 11.368248
+v -19.020594 27.498768 10.741400
+v -16.675705 19.308691 11.771263
+v -15.242205 10.728598 14.661383
+v -11.429826 11.979118 4.484833
+v -12.855085 9.611444 10.086077
+v -10.146607 13.783422 -3.108587
+v -11.113446 17.269522 -0.589503
+v -12.173586 19.546953 1.645432
+v -14.496117 22.736921 3.615596
+v -16.618717 25.814238 5.499027
+v -18.831337 28.858936 7.356281
+v -20.830013 31.984983 9.160530
+v -13.958706 13.246996 10.484770
+v -15.075603 15.880554 10.990260
+v -12.059523 15.670089 5.786165
+v -13.219246 18.188381 6.546744
+v -14.729614 21.266827 7.743087
+v -16.833500 24.401178 9.291769
+v -12.997808 13.246996 10.484770
+v -14.114704 15.880554 10.990260
+v -13.768716 21.266827 7.743087
+v -15.872602 24.401178 9.291769
+v -12.258348 18.188381 6.546744
+v -11.098623 15.670089 5.786165
+v -10.152548 17.269522 -0.589503
+v -11.212686 19.546953 1.645432
+v -13.535219 22.736921 3.615596
+v -15.657820 25.814238 5.499027
+v -19.869114 31.984983 9.160530
+v -17.870438 28.858936 7.356281
+v -3.006491 2.835144 -1.792495
+v -3.299435 2.835144 -2.499723
+v -3.299435 3.340722 -2.499723
+v -2.683913 3.340722 -1.013724
+v -2.607214 28.440485 -0.828560
+v -2.795753 28.916454 -1.283730
+v -2.984291 29.392422 -1.738900
+v -3.060988 31.134907 -1.924065
+v -3.197826 31.301920 -2.254421
+v -3.197826 31.705118 -2.254421
+v -2.864999 31.538105 -1.450902
+v -2.788301 30.035196 -1.265738
+v -2.522967 30.068596 -0.625167
+v -1.521538 2.835144 -1.792497
+v -1.228595 2.835144 -2.499723
+v -1.228595 3.340722 -2.499723
+v -1.844116 3.340722 -1.013724
+v -1.920815 28.440485 -0.828560
+v -2.149614 28.440485 -0.828560
+v -2.378415 28.440485 -0.828560
+v -3.625614 0.933175 -14.862261
+v -3.396813 0.933175 -14.862257
+v -3.208276 1.409142 -15.317429
+v -3.562768 1.409142 -15.317429
+v -1.543738 29.392422 -1.738900
+v -1.467041 31.134907 -1.924065
+v -1.330203 31.301920 -2.254421
+v -1.330203 31.705118 -2.254421
+v -1.663031 31.538105 -1.450902
+v -1.739728 30.035196 -1.265738
+v -2.005062 30.068596 -0.625167
+v -1.732276 28.916454 -1.283730
+v -2.441260 28.916454 -1.283730
+v -2.086768 28.916454 -1.283730
+v -10.505260 1.409189 -15.317495
+v -10.859753 1.409189 -15.317495
+v -10.671214 0.933218 -14.862325
+v -10.442413 0.933218 -14.862325
+v -7.310413 0.933123 -14.862221
+v -7.081613 0.933123 -14.862221
+v -7.018765 1.409093 -15.317392
+v -7.373259 1.409093 -15.317392
+v 12.725510 5.931142 -1.792495
+v 12.432567 5.931142 -2.499723
+v 12.432567 6.436721 -2.499723
+v 13.048086 6.436721 -1.013724
+v 13.124784 24.624481 -0.828560
+v 12.936247 25.100452 -1.283730
+v 12.747708 25.576418 -1.738900
+v 12.671010 27.318907 -1.924065
+v 12.534173 27.485916 -2.254421
+v 12.534173 27.889114 -2.254421
+v 12.867002 27.722105 -1.450902
+v 12.943699 26.219193 -1.265738
+v 13.209031 26.252592 -0.625167
+v 14.210463 5.931142 -1.792497
+v 14.503405 5.931142 -2.499723
+v 14.503405 6.436721 -2.499723
+v 13.887884 6.436721 -1.013724
+v 13.811186 24.624481 -0.828560
+v 13.467985 24.624481 -0.828560
+v 13.999723 25.100452 -1.283730
+v 14.188262 25.576418 -1.738900
+v 13.467985 25.100452 -1.283730
+v 14.264960 27.318907 -1.924065
+v 14.401797 27.485916 -2.254421
+v 14.401797 27.889114 -2.254421
+v 14.068970 27.722105 -1.450902
+v 13.992271 26.219193 -1.265738
+v 13.726938 26.252592 -0.625167
+v 8.292243 4.554726 -13.105604
+v 8.480783 4.078758 -12.650431
+v 8.823982 4.078758 -12.650431
+v 8.823982 4.554726 -13.105604
+v 11.451985 4.078778 -12.650445
+v 11.795187 4.078778 -12.650445
+v 11.983724 4.554746 -13.105617
+v 11.451985 4.554746 -13.105617
+v -19.242489 8.343143 -1.792495
+v -19.535431 8.343143 -2.499723
+v -19.535431 8.848721 -2.499723
+v -18.919910 8.848721 -1.013724
+v -18.843212 27.036480 -0.828560
+v -19.031750 27.512449 -1.283730
+v -19.220287 27.988419 -1.738900
+v -19.296986 29.730904 -1.924065
+v -19.433825 29.897915 -2.254421
+v -19.433825 30.301113 -2.254421
+v -19.100996 30.134102 -1.450902
+v -19.024298 28.631191 -1.265738
+v -18.758965 28.664593 -0.625167
+v -17.757534 8.343143 -1.792497
+v -17.464592 8.343143 -2.499723
+v -17.464592 8.848721 -2.499723
+v -18.080112 8.848721 -1.013724
+v -18.156811 27.036480 -0.828560
+v -18.500011 27.036480 -0.828560
+v -17.968273 27.512449 -1.283730
+v -17.779734 27.988419 -1.738900
+v -18.500011 27.512449 -1.283730
+v -17.703035 29.730904 -1.924065
+v -17.566198 29.897915 -2.254421
+v -17.566198 30.301113 -2.254421
+v -17.899027 30.134102 -1.450902
+v -17.975723 28.631191 -1.265738
+v -18.241058 28.664593 -0.625167
+v -21.299751 6.534726 -13.105604
+v -21.111214 6.058758 -12.650431
+v -20.768013 6.058758 -12.650431
+v -20.768013 6.534726 -13.105604
+v -18.140011 6.058776 -12.650445
+v -17.796808 6.058776 -12.650445
+v -17.608273 6.534745 -13.105617
+v -18.140011 6.534745 -13.105617
+vn 0.000000 -0.691141 0.722719
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 -0.691139 0.722722
+vn 0.000000 -0.691141 0.722721
+vn 0.000000 0.454456 0.890769
+vn 0.951234 -0.138151 0.275803
+vn 0.000000 -0.454457 -0.890769
+vn -0.903964 0.048238 -0.424879
+vn 0.000000 -0.454453 -0.890771
+vn -0.995330 0.080548 0.053198
+vn 0.000000 0.454454 0.890770
+vn 0.960300 -0.165937 -0.224251
+vn 0.000000 -0.454452 -0.890771
+vn -0.975849 0.069272 -0.207173
+vn 0.000000 0.454452 0.890771
+vn 0.986498 -0.160658 0.031790
+vn 0.796052 -0.294117 0.528958
+vn -0.073842 -0.027344 0.996895
+vn 1.000000 0.000000 0.000000
+vn -0.003044 0.998421 -0.056087
+vn -1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000920 0.999353 -0.035944
+vn -1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.999404 -0.034523
+vn -1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -0.000715 -0.926299 -0.376788
+vn 0.780323 0.625377 -0.000051
+vn 0.233171 0.050419 -0.971128
+vn 0.815205 0.578105 -0.035150
+vn 0.068294 -0.005991 -0.997647
+vn 0.000000 0.000000 1.000000
+vn -0.960859 0.277039 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 -0.691143 0.722718
+vn 0.000000 -0.691141 0.722720
+vn 0.000000 -0.498728 -0.866759
+vn -0.996095 0.061022 -0.063811
+vn 0.000000 0.498728 0.866759
+vn 0.961371 -0.201950 -0.187033
+vn -0.926465 -0.007117 -0.376314
+vn 0.000000 0.498727 0.866759
+vn 0.979784 -0.138269 0.144587
+vn 0.000000 -0.498727 -0.866759
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 -0.691144 0.722717
+vn 0.000000 -0.691141 0.722720
+vn 0.000000 -0.490952 -0.871187
+vn -0.999878 -0.010796 0.011290
+vn 0.000000 0.490953 0.871186
+vn 0.956749 -0.130192 -0.260156
+vn -0.946483 -0.074628 -0.314007
+vn 0.000000 0.490953 0.871186
+vn 0.995191 -0.067699 0.070793
+vn 0.000000 -0.490953 -0.871186
+vn 0.071989 -0.997405 0.000000
+vn 0.828488 0.560007 0.000000
+vn -0.828491 -0.560002 0.000000
+vn 0.796052 -0.294117 -0.528958
+vn -0.073842 -0.027344 -0.996895
+vn 1.000000 0.000000 0.000000
+vn -0.003044 0.998421 0.056087
+vn -1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000920 0.999353 0.035944
+vn -1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.999404 0.034523
+vn -1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -0.000715 -0.926299 0.376788
+vn 0.780323 0.625377 0.000051
+vn 0.233171 0.050419 0.971128
+vn 0.815205 0.578105 0.035150
+vn 0.068294 -0.005991 0.997647
+vn 0.000000 0.000000 -1.000000
+vn -0.960859 0.277039 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.107249 -0.051603 0.992892
+vn 0.000000 0.000000 -1.000000
+vn 0.107249 -0.051603 -0.992892
+vn 0.000000 0.000000 -1.000000
+vn 0.047847 -0.027643 -0.998472
+vn 0.000000 0.000000 1.000000
+vn 0.047847 -0.027643 0.998472
+vn 0.000000 0.000000 1.000000
+vn 0.110211 -0.053028 0.992493
+vn 0.000000 0.000000 -1.000000
+vn 0.110211 -0.053028 -0.992493
+vn 0.000000 0.000000 -1.000000
+vn 0.049190 -0.028414 -0.998385
+vn 0.000000 0.000000 1.000000
+vn 0.049190 -0.028414 0.998385
+vn 0.000000 0.000000 1.000000
+vn 0.057338 -0.146135 0.987602
+vn 0.000000 0.000000 -1.000000
+vn 0.057338 -0.146135 -0.987602
+vn -0.428213 0.638920 0.639073
+vn 0.428218 -0.638908 -0.639082
+vn 0.000000 -0.691141 -0.722720
+vn 0.000000 -0.691139 -0.722722
+vn 0.000000 -0.691141 -0.722720
+vn 0.000000 0.454456 -0.890769
+vn 0.951234 -0.138151 -0.275803
+vn 0.000000 -0.454457 0.890769
+vn -0.903964 0.048238 0.424879
+vn 0.000000 -0.454453 0.890770
+vn -0.995330 0.080548 -0.053198
+vn 0.000000 0.454454 -0.890770
+vn 0.960300 -0.165937 0.224251
+vn 0.000000 -0.454452 0.890771
+vn -0.975849 0.069272 0.207173
+vn 0.000000 0.454452 -0.890771
+vn 0.986498 -0.160658 -0.031790
+vn 0.000000 -0.691143 -0.722718
+vn 0.000000 -0.691141 -0.722720
+vn 0.000000 -0.498728 0.866759
+vn -0.996095 0.061022 0.063811
+vn 0.000000 0.498728 -0.866759
+vn 0.961371 -0.201950 0.187033
+vn -0.926465 -0.007117 0.376314
+vn 0.000000 0.498727 -0.866759
+vn 0.979784 -0.138270 -0.144587
+vn 0.000000 -0.498727 0.866759
+vn 0.000000 -0.691144 -0.722717
+vn 0.000000 -0.691141 -0.722720
+vn 0.000000 -0.490952 0.871187
+vn -0.999878 -0.010796 -0.011290
+vn 0.000000 0.490953 -0.871186
+vn 0.956749 -0.130192 0.260156
+vn -0.946483 -0.074629 0.314007
+vn 0.000000 0.490952 -0.871186
+vn 0.995191 -0.067699 -0.070793
+vn 0.000000 -0.490953 0.871186
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 -0.382683
+vn 0.923880 0.000000 -0.382683
+vn 0.382683 0.000000 -0.923880
+vn -0.382684 0.000000 -0.923879
+vn -0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 -0.382683
+vn -0.923879 0.000000 0.382684
+vn -0.923879 0.000000 0.382684
+vn -0.382683 0.000000 0.923880
+vn -0.382683 0.000000 0.923880
+vn 0.382684 0.000000 0.923879
+vn 0.382684 0.000000 0.923879
+vn -0.382684 0.000000 -0.923879
+vn 0.382683 0.000000 -0.923880
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.923879 0.000000 0.382684
+vn 0.923879 0.000000 0.382684
+vn 0.923879 0.000000 -0.382684
+vn 0.923879 0.000000 -0.382684
+vn -0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 0.382683
+vn -0.923880 0.000000 0.382683
+vn -0.382684 0.000000 0.923880
+vn -0.382684 0.000000 0.923880
+vn 0.382683 0.000000 0.923880
+vn 0.382683 0.000000 0.923880
+vn -0.382684 0.000000 -0.923880
+vn -0.382684 0.000000 -0.923880
+vn 0.382683 0.000000 -0.923880
+vn 0.382683 0.000000 -0.923880
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.923850 0.007985 0.382671
+vn 0.848857 -0.394732 0.351608
+vn 0.825591 -0.448837 0.341971
+vn 0.917828 -0.114267 0.380177
+vn 0.923850 0.007985 -0.382671
+vn 0.848857 -0.394732 -0.351608
+vn 0.825591 -0.448837 -0.341971
+vn 0.917828 -0.114267 -0.380177
+vn -0.923850 0.007985 -0.382671
+vn -0.848857 -0.394732 -0.351608
+vn -0.825592 -0.448837 -0.341971
+vn -0.917828 -0.114266 -0.380177
+vn -0.923850 0.007985 0.382671
+vn -0.848857 -0.394732 0.351608
+vn -0.825592 -0.448837 0.341971
+vn -0.917828 -0.114266 0.380177
+vn -0.382671 0.007985 0.923850
+vn -0.465039 -0.258222 0.846794
+vn -0.341971 -0.448837 0.825591
+vn -0.380177 -0.114267 0.917828
+vn 0.382671 0.007985 0.923850
+vn 0.465039 -0.258221 0.846794
+vn 0.341971 -0.448837 0.825591
+vn 0.380177 -0.114267 0.917828
+vn 0.265892 -0.719195 0.641920
+vn -0.265892 -0.719195 0.641919
+vn 0.000000 0.007377 0.999973
+vn 0.000000 0.007377 0.999973
+vn 0.000000 -0.691141 0.722720
+vn 0.000000 -0.691141 0.722720
+vn -0.382671 0.007985 -0.923850
+vn -0.465039 -0.258221 -0.846794
+vn -0.265892 -0.719195 -0.641920
+vn -0.341971 -0.448837 -0.825591
+vn -0.380177 -0.114267 -0.917828
+vn 0.382671 0.007985 -0.923850
+vn 0.465039 -0.258221 -0.846794
+vn 0.000000 0.007377 -0.999973
+vn 0.000000 0.007377 -0.999973
+vn 0.341971 -0.448837 -0.825592
+vn 0.380177 -0.114267 -0.917828
+vn 0.265892 -0.719194 -0.641920
+vn 0.000000 -0.691141 -0.722720
+vn 0.000000 -0.691141 -0.722720
+vn 0.390974 -0.906042 0.161947
+vn 0.390974 -0.906042 0.161947
+vn 0.390974 -0.906042 -0.161950
+vn 0.390974 -0.906042 -0.161950
+vn -0.390973 -0.906042 -0.161949
+vn -0.390973 -0.906042 -0.161949
+vn -0.390973 -0.906042 0.161949
+vn -0.390973 -0.906042 0.161949
+vn -0.161946 -0.906042 0.390975
+vn -0.161946 -0.906042 0.390975
+vn 0.161947 -0.906043 0.390973
+vn 0.161947 -0.906043 0.390973
+vn -0.161946 -0.906042 -0.390975
+vn -0.161946 -0.906042 -0.390975
+vn 0.161946 -0.906042 -0.390976
+vn 0.161946 -0.906042 -0.390976
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 -0.382683
+vn 0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 0.382683
+vn -0.923880 0.000000 0.382683
+vn -0.382684 0.000000 0.923879
+vn -0.382684 0.000000 0.923879
+vn 0.382684 0.000000 0.923879
+vn 0.382684 0.000000 0.923879
+vn -0.382684 0.000000 -0.923879
+vn -0.382684 0.000000 -0.923879
+vn 0.382684 0.000000 -0.923879
+vn 0.382684 0.000000 -0.923879
+vn -0.174230 0.982057 -0.072168
+vn -0.174230 0.982057 -0.072168
+vn -0.174230 0.982057 0.072169
+vn -0.174230 0.982057 0.072169
+vn 0.174230 0.982057 0.072169
+vn 0.174230 0.982057 0.072169
+vn 0.174230 0.982057 -0.072169
+vn 0.174230 0.982057 -0.072169
+vn 0.072168 0.982057 -0.174231
+vn 0.072168 0.982057 -0.174231
+vn -0.072168 0.982057 -0.174229
+vn -0.072168 0.982057 -0.174229
+vn 0.072168 0.982057 0.174231
+vn 0.072168 0.982057 0.174231
+vn -0.072168 0.982057 0.174231
+vn -0.072168 0.982057 0.174231
+vn -0.915772 0.132185 -0.379326
+vn -0.915772 0.132185 -0.379326
+vn -0.915772 0.132185 0.379326
+vn -0.915772 0.132185 0.379326
+vn 0.915773 0.132185 0.379325
+vn 0.915773 0.132185 0.379325
+vn 0.915773 0.132185 -0.379325
+vn 0.915773 0.132185 -0.379325
+vn 0.379326 0.132185 -0.915772
+vn 0.379326 0.132185 -0.915772
+vn -0.379325 0.132185 -0.915773
+vn -0.379325 0.132185 -0.915773
+vn 0.379326 0.132185 0.915772
+vn 0.379326 0.132185 0.915772
+vn -0.379325 0.132185 0.915773
+vn -0.379325 0.132185 0.915773
+vn 0.044453 0.998842 0.018413
+vn 0.044453 0.998842 0.018413
+vn 0.044453 0.998842 -0.018413
+vn 0.044453 0.998842 -0.018413
+vn -0.044453 0.998842 -0.018413
+vn -0.044453 0.998842 -0.018413
+vn -0.044453 0.998842 0.018413
+vn -0.044453 0.998842 0.018413
+vn -0.018413 0.998842 0.044452
+vn -0.018413 0.998842 0.044452
+vn 0.018413 0.998842 0.044452
+vn 0.018413 0.998842 0.044452
+vn -0.018413 0.998842 -0.044452
+vn -0.018413 0.998842 -0.044452
+vn 0.018413 0.998842 -0.044452
+vn 0.018413 0.998842 -0.044452
+vn 0.923772 0.015264 0.382639
+vn 0.923772 0.015264 0.382639
+vn 0.923772 0.015264 -0.382639
+vn 0.923772 0.015264 -0.382639
+vn 0.382639 0.015264 -0.923772
+vn -0.382638 0.015264 -0.923772
+vn -0.923772 0.015264 -0.382640
+vn -0.923772 0.015264 -0.382640
+vn -0.923772 0.015264 0.382640
+vn -0.923772 0.015264 0.382640
+vn -0.382638 0.015264 0.923772
+vn -0.382638 0.015264 0.923772
+vn 0.382639 0.015264 0.923772
+vn 0.382639 0.015264 0.923772
+vn -0.382638 0.015264 -0.923772
+vn 0.382639 0.015264 -0.923772
+vn -0.000498 -1.000000 0.000000
+vn -0.000978 -1.000000 0.000000
+vn -0.000978 -0.999829 -0.018484
+vn -0.000498 -0.999831 -0.018381
+vn 0.000342 -0.999875 -0.015805
+vn 0.000342 -1.000000 0.000000
+vn 0.000649 -0.999930 -0.011797
+vn 0.000649 -1.000000 0.000000
+vn 0.000644 -0.999968 -0.007972
+vn 0.000645 -1.000000 0.000000
+vn -0.000134 -0.999995 -0.003267
+vn -0.000134 -1.000000 0.000000
+vn -0.000594 -0.999997 -0.002483
+vn -0.000594 -1.000000 0.000000
+vn 0.000465 -0.999988 -0.004895
+vn 0.000465 -1.000000 0.000000
+vn 0.000285 -0.999980 -0.006340
+vn 0.000285 -1.000000 0.000000
+vn 0.081838 -0.996646 0.000000
+vn 0.081835 -0.996609 -0.008551
+vn 0.344185 -0.938871 0.007579
+vn 0.344195 -0.938898 0.000000
+vn 0.605586 -0.790519 0.091348
+vn 0.608129 -0.793838 0.000000
+vn 0.760646 -0.613146 0.213235
+vn 0.778552 -0.627580 0.000000
+vn 0.848223 -0.481433 0.220772
+vn 0.869682 -0.493613 0.000000
+vn 0.808292 -0.581043 0.095151
+vn 0.811976 -0.583691 0.000000
+vn 0.668057 -0.744110 -0.000355
+vn 0.668057 -0.744110 0.000000
+vn 0.726716 -0.686915 -0.005694
+vn 0.726727 -0.686926 0.000000
+vn 0.955276 -0.295714 0.000866
+vn 0.955276 -0.295714 0.000000
+vn 0.999999 0.000260 -0.001367
+vn 1.000000 0.000260 0.000000
+vn -0.000498 -0.999831 0.018381
+vn -0.000978 -0.999829 0.018484
+vn 0.000342 -0.999875 0.015805
+vn 0.000649 -0.999930 0.011797
+vn 0.000644 -0.999968 0.007972
+vn -0.000134 -0.999995 0.003267
+vn -0.000594 -0.999997 0.002483
+vn 0.000465 -0.999988 0.004895
+vn 0.000285 -0.999980 0.006340
+vn 0.344185 -0.938871 -0.007579
+vn 0.081835 -0.996609 0.008551
+vn 0.605586 -0.790519 -0.091348
+vn 0.760646 -0.613146 -0.213235
+vn 0.848223 -0.481433 -0.220772
+vn 0.808292 -0.581043 -0.095151
+vn 0.668057 -0.744110 0.000355
+vn 0.726716 -0.686915 0.005694
+vn 0.955276 -0.295714 -0.000866
+vn 0.999999 0.000260 0.001367
+vn 0.532643 0.846199 -0.015426
+vn 0.532707 0.846300 0.000000
+vn 0.532643 0.846199 -0.015426
+vn 0.532707 0.846300 0.000000
+vn 0.532643 0.846199 0.015426
+vn 0.532643 0.846199 0.015426
+vn -0.311057 0.950245 0.016675
+vn -0.311100 0.950377 0.000000
+vn -0.311057 0.950245 0.016675
+vn -0.311100 0.950377 0.000000
+vn -0.311057 0.950245 -0.016675
+vn -0.311057 0.950245 -0.016675
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -0.001558 0.003019 0.999994
+vn -0.005048 0.008466 0.999951
+vn -0.008364 0.009773 0.999917
+vn -0.006180 0.002751 0.999977
+vn 0.031027 -0.045147 0.998498
+vn 0.083067 -0.146694 0.985688
+vn 0.171496 -0.296152 0.939618
+vn 0.379549 -0.370895 0.847573
+vn 0.612488 -0.633300 0.473064
+vn -0.908937 0.181562 0.375326
+vn -0.980714 0.195447 0.000000
+vn -0.926840 0.365132 0.087447
+vn -0.999916 -0.012961 0.000000
+vn 0.001662 -0.284907 0.958554
+vn -0.002601 -0.611459 0.791272
+vn -0.004739 -0.614960 0.788544
+vn -0.001656 -0.620166 0.784469
+vn -0.002364 -0.624637 0.780912
+vn -0.003943 -0.628088 0.778132
+vn -0.002765 -0.630722 0.776004
+vn 0.001016 -0.631656 0.775248
+vn 0.055700 -0.627733 0.776433
+vn 0.226451 -0.593755 0.772124
+vn 0.431596 -0.502047 0.749449
+vn 0.559688 -0.398391 0.726660
+vn 0.640943 -0.317266 0.698952
+vn 0.637526 -0.529415 0.559715
+vn 0.328249 -0.731406 0.597743
+vn 0.503599 -0.691202 0.518294
+vn -0.000622 -0.957209 0.289396
+vn -0.011620 -0.958525 0.284770
+vn -0.016400 -0.961439 0.274527
+vn -0.009060 -0.964396 0.264307
+vn -0.007042 -0.966195 0.257717
+vn -0.011348 -0.967312 0.253337
+vn -0.008201 -0.968389 0.249311
+vn 0.001985 -0.968728 0.248118
+vn 0.099841 -0.959526 0.263329
+vn 0.350932 -0.896456 0.270578
+vn 0.637211 -0.736703 0.226343
+vn 0.810509 -0.563456 0.159977
+vn 0.898578 -0.431621 0.079123
+vn -0.032745 -0.924632 0.379451
+vn -0.027915 -0.929989 0.366525
+vn -0.025304 -0.933217 0.358421
+vn -0.021026 -0.931393 0.363408
+vn -0.013125 -0.931310 0.363990
+vn -0.017126 -0.929639 0.368073
+vn -0.009906 -0.925524 0.378560
+vn 0.017727 -0.913313 0.406872
+vn 0.138306 -0.872253 0.469091
+vn 0.350660 -0.781718 0.515709
+vn 0.604752 -0.636012 0.479337
+vn 0.779066 -0.492478 0.387970
+vn 0.869206 -0.411663 0.273889
+vn 0.682096 -0.710441 0.173255
+vn -0.088118 -0.757908 0.646383
+vn -0.051298 -0.773044 0.632274
+vn -0.029597 -0.786952 0.616304
+vn -0.033228 -0.783410 0.620617
+vn -0.020186 -0.775990 0.630422
+vn -0.005117 -0.761370 0.648297
+vn 0.018569 -0.730812 0.682326
+vn 0.057344 -0.685707 0.725615
+vn 0.162821 -0.645857 0.745894
+vn 0.327546 -0.624718 0.708831
+vn 0.568254 -0.552002 0.610230
+vn 0.745434 -0.452974 0.489023
+vn 0.828394 -0.409274 0.382436
+vn 0.665243 -0.692669 0.278679
+vn -0.126585 -0.324874 0.937248
+vn -0.083031 -0.336373 0.938061
+vn -0.049527 -0.354987 0.933559
+vn -0.041844 -0.357783 0.932867
+vn -0.021024 -0.344348 0.938607
+vn 0.019876 -0.328586 0.944265
+vn 0.058985 -0.312457 0.948099
+vn 0.081012 -0.303002 0.949540
+vn 0.135971 -0.321898 0.936960
+vn 0.243140 -0.369569 0.896829
+vn 0.485396 -0.368969 0.792624
+vn 0.682836 -0.329533 0.652030
+vn 0.768168 -0.313531 0.558226
+vn 0.619534 -0.642008 0.451667
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.004050 -0.001464 0.999991
+vn 0.004050 -0.001464 0.999991
+vn 0.008099 -0.002928 0.999963
+vn 0.008099 -0.002928 0.999963
+vn -0.155548 0.179096 0.971457
+vn -0.182194 0.240699 0.953346
+vn 0.382114 -0.914355 0.133959
+vn 0.484499 -0.866370 0.121091
+vn 0.387995 -0.898366 0.205909
+vn 0.343405 -0.880083 0.327913
+vn 0.423232 -0.483997 0.765912
+vn 0.138085 -0.809093 0.571228
+vn -0.443965 0.883319 0.150473
+vn -0.278326 0.947710 0.156141
+vn -0.028994 0.982343 0.184829
+vn 0.180907 0.973766 0.138031
+vn 0.112474 -0.299001 0.947601
+vn -0.234810 -0.551473 0.800463
+vn 0.058509 -0.134104 0.989239
+vn -0.429138 -0.313067 0.847248
+vn 0.285194 0.197417 0.937918
+vn 0.210505 0.971282 0.110905
+vn 0.554932 0.600983 0.575212
+vn 0.408425 0.890099 0.202271
+vn 0.061938 0.990093 0.126015
+vn -0.268469 0.954312 0.131197
+vn 0.429959 0.714252 0.552250
+vn 0.143742 0.770267 -0.621311
+vn 0.232969 0.763400 -0.602449
+vn 0.061981 0.909120 -0.411898
+vn -0.156425 0.952959 -0.259617
+vn -0.471350 0.868971 -0.150731
+vn -0.576295 0.726086 0.375077
+vn -0.865920 0.500183 0.000000
+vn -0.989994 0.141112 0.000000
+vn -0.460187 0.872346 -0.165047
+vn -0.205437 0.978670 0.000000
+vn -0.138800 0.934428 -0.327991
+vn 0.048613 0.998818 0.000000
+vn 0.467845 0.883810 0.000000
+vn 0.384094 0.920149 -0.076134
+vn 0.551719 0.832347 -0.052967
+vn 0.366455 0.930436 0.000000
+vn 0.428842 0.893311 -0.134496
+vn -0.037439 0.880778 -0.472048
+vn 0.189683 0.750419 -0.633160
+vn 0.214020 0.756073 -0.618506
+vn -0.226937 0.607334 -0.761344
+vn -0.411998 0.911184 0.001160
+vn -0.411998 0.911185 0.000000
+vn 0.556969 -0.013670 0.830421
+vn 0.382048 0.076277 0.920989
+vn 0.500121 0.035416 0.865231
+vn 0.405430 0.172047 0.897790
+vn 0.333241 0.015263 0.942718
+vn 0.297561 0.153827 0.942229
+vn 0.123103 0.109724 0.986309
+vn 0.145216 -0.018635 0.989224
+vn 0.110890 -0.030335 0.993370
+vn 0.095854 0.135837 0.986083
+vn 0.070909 -0.018533 0.997311
+vn 0.049046 0.176580 0.983064
+vn 0.040821 0.045228 0.998142
+vn 0.007370 0.115608 0.993268
+vn 0.004079 0.088693 0.996051
+vn 0.013448 0.082595 0.996492
+vn 0.004596 0.101518 0.994823
+vn -0.015378 0.105704 0.994279
+vn -0.029288 0.098868 0.994669
+vn -0.044604 0.105798 0.993387
+vn -0.032949 0.131347 0.990789
+vn -0.042621 0.067021 0.996841
+vn -0.045682 0.237634 0.970280
+vn -0.072399 0.073942 0.994631
+vn -0.093170 0.254066 0.962689
+vn -0.105730 0.094396 0.989904
+vn -0.125141 0.258127 0.957972
+vn 0.304162 0.023810 0.952323
+vn 0.270011 0.041486 0.961963
+vn 0.374880 0.143776 0.915857
+vn 0.265584 0.072621 0.961349
+vn 0.159298 0.154959 0.974993
+vn 0.298003 0.116049 0.947484
+vn 0.112454 0.305711 0.945460
+vn 0.234602 0.113939 0.965391
+vn 0.320457 0.197980 0.926343
+vn 0.136348 0.119007 0.983487
+vn 0.151168 0.093855 0.984042
+vn 0.146094 0.075611 0.986377
+vn 0.000000 0.327190 0.944959
+vn 0.017516 0.256234 0.966456
+vn -0.027045 0.261613 0.964794
+vn 0.017531 0.108058 0.993990
+vn 0.020891 0.168337 0.985508
+vn 0.031172 0.086795 0.995738
+vn -0.018860 0.116248 0.993041
+vn -0.012559 0.088054 0.996037
+vn 0.000025 0.031657 0.999499
+vn 0.086871 0.090782 0.992075
+vn 0.116889 0.165352 0.979283
+vn 0.053620 0.110638 0.992413
+vn 0.116889 0.165352 0.979283
+vn 0.009729 0.173236 0.984832
+vn -0.060523 0.204549 0.976984
+vn -0.083714 0.255371 0.963212
+vn 0.035971 0.252341 0.966969
+vn -0.002250 0.365469 0.930821
+vn -0.135289 0.847974 0.512481
+vn 0.011574 0.875069 0.483860
+vn 0.029526 0.442508 0.896279
+vn 0.026044 0.265581 0.963737
+vn 0.000000 0.279250 0.960218
+vn -0.006966 0.048920 0.998778
+vn -0.004497 0.140224 0.990110
+vn -0.004148 0.141952 0.989865
+vn -0.004147 0.141439 0.989938
+vn -0.017246 0.127797 0.991650
+vn -0.026184 0.030281 0.999198
+vn 0.016002 0.277204 0.960678
+vn 0.016002 0.277204 0.960678
+vn -0.012361 0.268507 0.963198
+vn -0.012361 0.268507 0.963198
+vn -0.023383 0.234430 0.971852
+vn 0.000000 0.218824 0.975764
+vn 0.000185 0.310974 0.950418
+vn 0.000184 0.313300 0.949654
+vn 0.000000 0.313741 0.949509
+vn 0.000000 0.310542 0.950560
+vn -0.009659 0.410519 0.911801
+vn 0.209958 0.810995 0.546081
+vn 0.345868 0.556792 0.755221
+vn -0.089097 0.206623 0.974355
+vn 0.174510 0.153230 0.972660
+vn -0.081234 0.271336 0.959051
+vn -0.086316 0.271239 0.958634
+vn -0.087111 0.239852 0.966893
+vn -0.132231 0.332916 0.933639
+vn -0.119249 0.254206 0.959770
+vn -0.163495 0.235513 0.958020
+vn -0.088396 0.283924 0.954763
+vn 0.109747 0.210021 0.971518
+vn -0.070976 0.018118 0.997313
+vn -0.047399 -0.020257 0.998671
+vn -0.094775 -0.019741 0.995303
+vn -0.063320 0.024917 0.997682
+vn 0.000000 0.113789 0.993505
+vn -0.014780 0.060170 0.998079
+vn -0.014779 -0.045290 0.998865
+vn 0.000000 -0.096813 0.995303
+vn 0.000000 0.398474 0.917180
+vn -0.047249 0.264787 0.963149
+vn -0.078847 -0.011689 0.996818
+vn 0.014963 0.343466 0.939046
+vn 0.014963 0.343466 0.939046
+vn -0.013305 0.124636 0.992113
+vn -0.065431 0.131200 0.989194
+vn -0.020415 0.177472 0.983914
+vn -0.010960 0.166519 0.985977
+vn -0.065852 0.234307 0.969930
+vn 0.125538 0.244740 0.961428
+vn -0.048087 -0.016246 0.998711
+vn -0.110254 0.380000 0.918392
+vn -0.116765 -0.117675 0.986163
+vn -0.114352 -0.366303 0.923442
+vn -0.096526 -0.375230 0.921892
+vn 0.148874 0.354954 -0.922954
+vn 0.264827 0.332418 -0.905188
+vn -0.984186 -0.159692 0.076660
+vn -0.703782 -0.325892 0.631257
+vn -0.753180 -0.142612 0.642169
+vn -0.694786 0.403993 0.595031
+vn -0.978547 -0.155407 0.135256
+vn -0.972902 -0.116808 0.199544
+vn -0.986642 -0.086804 0.137848
+vn -0.996582 -0.051510 0.064582
+vn -0.998667 -0.051618 0.000000
+vn -0.997128 -0.075732 0.000000
+vn -0.978534 -0.119823 0.167670
+vn -0.992300 -0.123854 0.000000
+vn -0.975218 -0.143091 0.168747
+vn -0.990826 -0.135146 0.000000
+vn -0.992466 -0.122522 0.000000
+vn -0.976178 -0.120030 0.180747
+vn -0.911609 0.334059 0.239530
+vn -0.949057 0.315103 0.000000
+vn -0.991092 -0.100151 0.087782
+vn -0.936786 0.320495 0.140413
+vn -0.004617 0.173236 0.984869
+vn -0.051868 0.232639 0.971179
+vn -0.139632 0.244987 0.959419
+vn -0.169449 0.263015 0.949795
+vn 0.378050 0.488514 0.786404
+vn -0.074203 0.746661 0.661053
+vn -0.456333 0.781419 0.425611
+vn -0.678291 0.700497 0.221868
+vn -0.652774 0.718758 0.239318
+vn -0.688381 0.725349 0.000000
+vn -0.706036 0.708176 0.000000
+vn -0.631292 0.740974 0.228972
+vn -0.601784 0.763373 0.234772
+vn -0.351728 0.872825 0.338325
+vn -0.043159 0.865597 0.498878
+vn 0.426695 0.574370 0.698592
+vn 0.716915 0.112171 0.688078
+vn 0.758164 0.095473 0.645037
+vn -0.183085 0.157225 0.970443
+vn 0.148874 0.354954 -0.922954
+vn 0.359364 0.324809 -0.874846
+vn 0.367321 0.351698 -0.861037
+vn 0.297364 0.317491 -0.900430
+vn 0.458623 0.303871 -0.835061
+vn 0.469618 0.323039 -0.821647
+vn 0.276933 0.372860 -0.885598
+vn 0.559261 0.465460 -0.685984
+vn 0.630410 0.558969 -0.538644
+vn 0.247626 0.765912 -0.593347
+vn -0.010843 0.830001 -0.557657
+vn -0.157013 0.808137 -0.567680
+vn -0.578608 0.580866 -0.572545
+vn -0.499662 0.628040 0.596577
+vn -0.557389 0.636957 -0.532544
+vn -0.433436 0.642411 0.632014
+vn -0.042672 0.818865 0.572398
+vn -0.152161 0.845866 -0.511232
+vn 0.094274 0.616930 0.781351
+vn 0.078118 0.638832 0.765370
+vn 0.186343 0.533377 -0.825097
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn -0.010843 0.830001 -0.557657
+vn -0.411993 0.911187 0.000000
+vn -0.271595 0.962411 0.000765
+vn -0.040347 0.827309 -0.560297
+vn 0.000000 1.000000 0.000000
+vn -0.239914 0.607394 -0.757307
+vn 0.128620 0.967244 -0.218851
+vn 0.008099 -0.002928 0.999963
+vn -0.182194 0.240699 0.953346
+vn 0.357690 0.769708 0.528778
+vn 0.319524 0.907313 0.273288
+vn 0.019270 0.977705 0.209097
+vn 0.000385 0.311767 0.950159
+vn 0.000384 0.312493 0.949920
+vn -0.908937 0.181562 -0.375326
+vn -0.926840 0.365132 -0.087447
+vn 0.343550 0.932835 0.108595
+vn 0.343550 0.932835 0.108595
+vn 0.572438 0.813026 0.106320
+vn 0.572438 0.813026 0.106320
+vn 0.350916 0.936401 0.003314
+vn 0.180208 0.957843 0.223747
+vn 0.054837 0.998292 -0.020148
+vn -0.156425 0.952959 0.259617
+vn -0.223117 0.966373 -0.127839
+vn -0.471350 0.868970 0.150731
+vn -0.627989 0.606445 -0.487703
+vn -0.460187 0.872346 0.165048
+vn -0.138800 0.934428 0.327991
+vn 0.384095 0.920149 0.076134
+vn 0.551719 0.832347 0.052967
+vn 0.428842 0.893311 0.134496
+vn 0.536322 0.831008 0.147594
+vn 0.027253 0.932118 0.361127
+vn 0.471549 0.880758 0.043652
+vn -0.000011 1.000000 0.000000
+vn -0.411998 0.911184 -0.001160
+vn -0.020820 0.226240 -0.973849
+vn -0.060523 0.204549 -0.976984
+vn -0.051837 0.299894 -0.952563
+vn -0.002250 0.365469 -0.930821
+vn 0.033028 0.249392 -0.967839
+vn -0.135289 0.847974 -0.512481
+vn 0.011574 0.875069 -0.483860
+vn 0.029526 0.442508 -0.896279
+vn 0.047123 0.251268 -0.966770
+vn 0.209958 0.810995 -0.546081
+vn 0.003451 0.457095 -0.889411
+vn 0.345868 0.556792 -0.755221
+vn -0.089097 0.206623 -0.974355
+vn 0.174510 0.153230 -0.972660
+vn -0.018298 0.420237 -0.907230
+vn -0.047249 0.264787 -0.963149
+vn 0.000000 0.398474 -0.917180
+vn -0.078847 -0.011689 -0.996818
+vn -0.065431 0.131200 -0.989194
+vn -0.032469 0.133629 -0.990499
+vn -0.020415 0.177472 -0.983914
+vn -0.044526 0.314179 -0.948319
+vn -0.048086 -0.016246 -0.998711
+vn -0.116765 -0.117675 -0.986163
+vn -0.110254 0.380000 -0.918392
+vn -0.096526 -0.375230 -0.921892
+vn -0.114352 -0.366303 -0.923442
+vn -0.984186 -0.159691 -0.076660
+vn -0.703782 -0.325892 -0.631257
+vn -0.753180 -0.142612 -0.642169
+vn -0.694786 0.403993 -0.595031
+vn -0.978547 -0.155406 -0.135256
+vn -0.972902 -0.116808 -0.199544
+vn -0.986642 -0.086804 -0.137848
+vn -0.996582 -0.051510 -0.064582
+vn -0.978534 -0.119823 -0.167670
+vn -0.975218 -0.143091 -0.168747
+vn -0.976178 -0.120030 -0.180747
+vn -0.911609 0.334059 -0.239530
+vn -0.936786 0.320494 -0.140413
+vn -0.991092 -0.100151 -0.087782
+vn -0.070496 0.737933 -0.671182
+vn -0.074203 0.746661 -0.661053
+vn -0.456333 0.781418 -0.425611
+vn -0.678291 0.700497 -0.221868
+vn -0.652774 0.718758 -0.239318
+vn -0.631292 0.740974 -0.228972
+vn -0.601784 0.763373 -0.234772
+vn -0.351728 0.872825 -0.338325
+vn -0.043159 0.865597 -0.498878
+vn -0.050739 0.856785 -0.513172
+vn 0.831646 0.554121 -0.036263
+vn 0.717163 0.695166 -0.049205
+vn 0.303995 0.952143 -0.031778
+vn 0.000000 1.000000 0.000000
+vn -0.195416 0.980690 0.007761
+vn -0.560456 0.746959 -0.357690
+vn -0.671650 0.740845 0.005932
+vn -0.611471 0.790924 0.023310
+vn -0.611471 0.790924 0.023310
+vn -0.117785 0.992762 0.023457
+vn -0.117785 0.992762 0.023457
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn -0.271595 0.962411 -0.000765
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.128620 0.967244 0.218851
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 -0.000015 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 -0.000015 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -0.988845 -0.145242 0.033023
+vn -0.988845 -0.145239 0.033023
+vn -0.988761 -0.149470 0.003221
+vn -0.988762 -0.149465 0.003225
+vn -1.000000 0.000000 0.000006
+vn -0.064201 -0.872217 0.484887
+vn -0.988168 -0.153378 0.000000
+vn -0.980657 -0.148457 0.127562
+vn -0.971555 -0.144479 0.187635
+vn -0.963527 -0.144431 0.225290
+vn -0.825920 -0.534641 0.178926
+vn -0.863285 -0.476281 0.167021
+vn -0.904585 -0.416699 0.089932
+vn -0.930451 -0.366417 0.000000
+vn -0.764102 -0.633483 0.121850
+vn -0.827879 -0.560907 0.000000
+vn -0.774383 -0.625081 0.098007
+vn -0.791643 -0.590519 0.156806
+vn -0.586142 -0.792046 0.170589
+vn -0.783917 -0.595080 0.177072
+vn -0.790636 -0.503094 0.348985
+vn -0.064201 -0.872217 0.484887
+vn -0.432186 -0.737990 0.518253
+vn -0.707464 -0.706750 0.000105
+vn -0.707464 -0.706750 0.000105
+vn -1.000000 -0.000020 0.000013
+vn -1.000000 -0.000020 0.000013
+vn -0.840440 -0.531300 0.106684
+vn -0.840440 -0.531300 0.106684
+vn -1.000000 -0.000016 0.000000
+vn -1.000000 -0.000016 0.000000
+vn -1.000000 -0.000018 0.000000
+vn -1.000000 -0.000018 0.000000
+vn -0.761963 -0.630098 0.149627
+vn -0.761963 -0.630098 0.149627
+vn -0.606091 -0.783425 0.137475
+vn -0.790636 -0.503094 0.348985
+vn -1.000000 0.000000 0.000000
+vn -1.000000 -0.000015 0.000000
+vn -0.432186 -0.737990 0.518253
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 -0.000015 0.000000
+vn -1.000000 -0.000015 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -0.988845 -0.145242 -0.033023
+vn -0.988845 -0.145239 -0.033023
+vn -0.988761 -0.149470 -0.003221
+vn -0.988762 -0.149465 -0.003225
+vn -1.000000 0.000000 -0.000006
+vn -0.064201 -0.872217 -0.484887
+vn -0.432186 -0.737989 -0.518254
+vn -0.980657 -0.148457 -0.127562
+vn -0.971555 -0.144479 -0.187635
+vn -0.963527 -0.144431 -0.225290
+vn -0.825920 -0.534641 -0.178926
+vn -0.863285 -0.476281 -0.167021
+vn -0.904585 -0.416699 -0.089932
+vn -0.764102 -0.633483 -0.121850
+vn -0.774383 -0.625081 -0.098007
+vn -0.791643 -0.590519 -0.156806
+vn -0.586142 -0.792046 -0.170589
+vn -0.783917 -0.595079 -0.177072
+vn -0.790636 -0.503094 -0.348985
+vn -0.432186 -0.737989 -0.518254
+vn -0.064201 -0.872217 -0.484887
+vn -0.790636 -0.503094 -0.348985
+vn -0.707464 -0.706750 -0.000105
+vn -0.707464 -0.706750 -0.000105
+vn -1.000000 -0.000020 -0.000013
+vn -1.000000 -0.000020 -0.000013
+vn -0.840440 -0.531300 -0.106684
+vn -0.840440 -0.531300 -0.106684
+vn -1.000000 -0.000016 0.000000
+vn -1.000000 -0.000016 0.000000
+vn -1.000000 -0.000018 0.000000
+vn -1.000000 -0.000018 0.000000
+vn -0.761963 -0.630098 -0.149627
+vn -0.761963 -0.630098 -0.149627
+vn -0.606091 -0.783425 -0.137475
+vn -1.000000 0.000000 0.000000
+vn -1.000000 -0.000015 0.000000
+vn -0.967343 -0.253471 0.000000
+vn -0.966484 -0.253246 0.042143
+vn -0.991080 -0.130252 0.028205
+vn -0.998040 0.062190 -0.006929
+vn -0.904766 0.424835 -0.030227
+vn -0.864731 0.501983 -0.015936
+vn -0.982241 0.187302 0.010960
+vn -0.982300 0.187313 0.000000
+vn -0.864841 0.502047 0.000000
+vn -0.905179 0.425030 0.000000
+vn -0.998064 0.062191 0.000000
+vn -0.991474 -0.130304 0.000000
+vn -0.997327 0.073072 0.000000
+vn -0.997065 0.073052 0.022909
+vn -0.966484 -0.253246 -0.042143
+vn -0.991080 -0.130252 -0.028205
+vn -0.998040 0.062190 0.006929
+vn -0.904766 0.424835 0.030227
+vn -0.864731 0.501983 0.015936
+vn -0.982241 0.187302 -0.010960
+vn -0.997065 0.073052 -0.022909
+vn 0.578350 0.285793 0.764090
+vn 0.250386 0.130226 0.959348
+vn 0.231372 0.415637 0.879609
+vn 0.282524 0.559971 0.778853
+vn 0.676715 0.399167 0.618646
+vn 0.659150 0.075212 0.748241
+vn 0.647834 -0.110155 0.753775
+vn 0.590692 -0.107892 0.799651
+vn 0.405847 0.360061 0.840026
+vn 0.676715 0.399167 0.618646
+vn 0.659150 0.075212 0.748241
+vn 0.647834 -0.110155 0.753775
+vn 0.590692 -0.107892 0.799651
+vn 0.590692 -0.107892 0.799651
+vn 0.590692 -0.107892 0.799651
+vn 0.282524 0.559971 0.778853
+vn -0.450579 0.527013 0.720580
+vn -0.450579 0.527013 0.720580
+vn -0.295642 0.828243 0.476035
+vn -0.295642 0.828243 0.476035
+vn -0.089100 0.984906 0.148399
+vn 0.097191 0.990632 0.095925
+vn 0.117291 0.991040 0.063893
+vn 0.580264 0.794796 0.177748
+vn 0.117291 0.991040 0.063893
+vn 0.509041 0.750619 0.421246
+vn 0.406328 0.844909 0.347889
+vn 0.169327 0.818091 0.549595
+vn 0.663610 0.680521 0.310666
+vn 0.008975 0.665756 0.746116
+vn 0.642753 0.585407 0.494133
+vn 0.013507 0.795289 0.606080
+vn 0.640657 0.662571 0.388018
+vn 0.015595 0.945301 0.325826
+vn 0.629337 0.749031 0.207091
+vn 0.017361 0.999849 0.000000
+vn 0.630667 0.776053 0.000000
+vn 0.932045 0.362343 0.000000
+vn 0.971533 0.236903 0.000000
+vn 0.971320 0.237777 0.000000
+vn 0.973444 0.228927 0.000000
+vn 0.939724 0.341935 0.000000
+vn 0.965379 0.260852 0.000000
+vn 0.964909 0.260725 -0.031175
+vn 0.117291 0.991040 -0.063893
+vn 0.097191 0.990632 -0.095925
+vn 0.117291 0.991040 -0.063893
+vn 0.580264 0.794795 -0.177748
+vn 0.509041 0.750619 -0.421246
+vn 0.406328 0.844909 -0.347889
+vn 0.663610 0.680520 -0.310666
+vn 0.169328 0.818091 -0.549596
+vn 0.642753 0.585407 -0.494133
+vn 0.008975 0.665756 -0.746116
+vn 0.640658 0.662570 -0.388018
+vn 0.013507 0.795289 -0.606081
+vn 0.629337 0.749031 -0.207092
+vn 0.015595 0.945301 -0.325827
+vn 0.964909 0.260725 0.031175
+vn 0.003960 -0.990569 0.136954
+vn 0.003960 -0.990569 0.136954
+vn -0.054248 -0.035311 0.997903
+vn -0.056548 -0.026579 0.998046
+vn -0.058844 -0.017845 0.998108
+vn -0.008242 -0.844924 0.534823
+vn -0.040494 -0.294223 0.954878
+vn -0.046832 -0.642706 0.764680
+vn -0.048895 -0.289439 0.955947
+vn -0.057227 -0.284663 0.956918
+vn -0.078329 -0.403392 0.911669
+vn -0.139225 -0.140428 0.980253
+vn -0.139225 -0.140428 0.980253
+vn -0.176416 0.006735 0.984293
+vn -0.176416 0.006735 0.984293
+vn -0.176416 0.006735 0.984293
+vn 0.950690 -0.100397 0.293442
+vn 0.917871 0.186096 0.350544
+vn 0.868002 0.138068 0.476981
+vn 0.830271 -0.196277 0.521657
+vn 0.950690 -0.100397 0.293442
+vn 0.917871 0.186096 0.350544
+vn 0.868002 0.138068 0.476981
+vn 0.830271 -0.196277 0.521657
+vn -0.000197 -0.000261 1.000000
+vn -0.000082 -0.000105 1.000000
+vn -0.000082 -0.000105 1.000000
+vn -0.000140 -0.000183 1.000000
+vn -0.000140 -0.000183 1.000000
+vn -0.000166 -0.000082 -1.000000
+vn -0.000210 -0.000192 -1.000000
+vn -0.000188 -0.000137 -1.000000
+vn -0.000210 -0.000192 -1.000000
+vn -0.000188 -0.000137 -1.000000
+vn -0.000017 0.000000 1.000000
+vn 0.000000 -0.000016 1.000000
+vn 0.000000 -0.000016 1.000000
+vn -0.000008 -0.000008 1.000000
+vn -0.000008 -0.000008 1.000000
+vn -0.555518 -0.368362 -0.745459
+vn -0.390893 -0.269628 -0.880059
+vn -0.476491 -0.321209 -0.818402
+vn -0.390893 -0.269628 -0.880059
+vn -0.476491 -0.321209 -0.818402
+vn -0.032244 -0.998929 -0.033195
+vn -0.032244 -0.998929 -0.033195
+vn -0.063905 -0.997956 0.000000
+vn -0.063905 -0.997956 0.000000
+vn -0.000656 -1.000000 -0.000013
+vn -0.063765 -0.995760 -0.066306
+vn -0.063765 -0.995760 0.066306
+vn -0.032244 -0.998929 0.033195
+vn -0.032244 -0.998929 0.033195
+vn -0.000656 -1.000000 0.000013
+vn -0.000305 -0.000229 -1.000000
+vn -0.000225 -0.000132 -1.000000
+vn -0.000265 -0.000181 -1.000000
+vn -0.000225 -0.000132 -1.000000
+vn -0.000265 -0.000181 -1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 -0.000010
+vn 0.000000 1.000000 -0.000010
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 -0.000010
+vn 0.000000 1.000000 0.000010
+vn 0.000000 1.000000 0.000010
+vn 0.000000 1.000000 0.000010
+vn 0.918662 0.395043 0.000000
+vn 0.918662 0.395043 -0.000015
+vn 0.918662 0.395043 -0.000015
+vn 0.918662 0.395043 0.000000
+vn 0.918662 0.395043 0.000015
+vn 0.918662 0.395043 0.000015
+vn -0.000057 1.000000 -0.000103
+vn -0.000015 1.000000 -0.000141
+vn -0.000098 1.000000 -0.000066
+vn -0.000098 1.000000 0.000000
+vn -0.000015 1.000000 -0.000141
+vn -0.000057 1.000000 -0.000103
+vn -0.000098 1.000000 0.000000
+vn -0.000015 1.000000 0.000141
+vn -0.000057 1.000000 0.000103
+vn -0.000098 1.000000 0.000066
+vn -0.000015 1.000000 0.000141
+vn -0.000057 1.000000 0.000103
+vn -0.003009 0.999937 0.010797
+vn 0.365466 0.930591 0.020860
+vn 0.791482 0.609971 0.038629
+vn 0.883316 0.466393 0.047225
+vn 0.887087 0.459285 0.046201
+vn 0.887087 0.459285 0.046201
+vn 0.883316 0.466393 0.047225
+vn 0.791482 0.609971 0.038629
+vn 0.365466 0.930591 0.020860
+vn -0.003009 0.999937 0.010797
+vn 0.941501 0.337010 0.000000
+vn 0.941501 0.337010 0.000000
+vn 0.941501 0.337010 0.000000
+vn 0.941501 0.337010 0.000000
+vn 0.941501 0.337010 0.000000
+vn 0.941501 0.337010 0.000000
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 -0.382683
+vn 0.923880 0.000000 -0.382683
+vn 0.382684 0.000000 -0.923879
+vn -0.382683 0.000000 -0.923880
+vn -0.923879 0.000000 -0.382684
+vn -0.923879 0.000000 -0.382684
+vn -0.923879 0.000000 0.382684
+vn -0.923879 0.000000 0.382684
+vn -0.382683 0.000000 0.923880
+vn -0.382683 0.000000 0.923880
+vn 0.382684 0.000000 0.923879
+vn 0.382684 0.000000 0.923879
+vn -0.382683 0.000000 -0.923880
+vn 0.382684 0.000000 -0.923879
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 -0.382683
+vn 0.923880 0.000000 -0.382683
+vn -0.923879 0.000000 -0.382684
+vn -0.923879 0.000000 -0.382684
+vn -0.923879 0.000000 0.382684
+vn -0.923879 0.000000 0.382684
+vn -0.382683 0.000000 0.923880
+vn -0.382683 0.000000 0.923880
+vn 0.382683 0.000000 0.923880
+vn 0.382683 0.000000 0.923880
+vn -0.382683 0.000000 -0.923880
+vn -0.382683 0.000000 -0.923880
+vn 0.382683 0.000000 -0.923880
+vn 0.382683 0.000000 -0.923880
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.923823 0.011019 0.382660
+vn 0.849397 -0.393369 0.351832
+vn 0.825592 -0.448836 0.341971
+vn 0.917828 -0.114267 0.380176
+vn 0.923823 0.011019 -0.382660
+vn 0.849397 -0.393369 -0.351832
+vn 0.825592 -0.448836 -0.341971
+vn 0.917828 -0.114267 -0.380177
+vn -0.923823 0.011019 -0.382661
+vn -0.849397 -0.393369 -0.351832
+vn -0.825591 -0.448836 -0.341972
+vn -0.917828 -0.114266 -0.380177
+vn -0.923823 0.011019 0.382660
+vn -0.849397 -0.393369 0.351832
+vn -0.825591 -0.448837 0.341972
+vn -0.917828 -0.114266 0.380177
+vn -0.382660 0.011019 0.923824
+vn -0.465296 -0.256226 0.847259
+vn -0.341971 -0.448837 0.825592
+vn -0.380177 -0.114267 0.917828
+vn 0.382660 0.011019 0.923823
+vn 0.465296 -0.256226 0.847259
+vn 0.341971 -0.448837 0.825591
+vn 0.380177 -0.114267 0.917828
+vn 0.265892 -0.719194 0.641920
+vn -0.265891 -0.719194 0.641920
+vn 0.000000 -0.691140 0.722721
+vn 0.000000 0.010180 0.999948
+vn -0.382660 0.011019 -0.923824
+vn -0.465296 -0.256226 -0.847259
+vn -0.265891 -0.719194 -0.641920
+vn -0.341971 -0.448837 -0.825592
+vn -0.380177 -0.114267 -0.917828
+vn 0.382660 0.011019 -0.923823
+vn 0.465296 -0.256226 -0.847259
+vn 0.000000 0.010180 -0.999948
+vn 0.265892 -0.719195 -0.641920
+vn 0.341971 -0.448837 -0.825591
+vn 0.000000 -0.691141 -0.722720
+vn 0.380177 -0.114267 -0.917828
+vn 0.390967 -0.906045 0.161946
+vn 0.390967 -0.906045 0.161946
+vn 0.390967 -0.906046 -0.161945
+vn 0.390967 -0.906046 -0.161945
+vn -0.390967 -0.906045 -0.161946
+vn -0.390967 -0.906045 -0.161946
+vn -0.390967 -0.906045 0.161946
+vn -0.390967 -0.906045 0.161946
+vn -0.161944 -0.906046 0.390967
+vn -0.161944 -0.906046 0.390967
+vn 0.161944 -0.906046 0.390967
+vn 0.161944 -0.906046 0.390967
+vn -0.161944 -0.906046 -0.390967
+vn -0.161944 -0.906046 -0.390967
+vn 0.161944 -0.906046 -0.390966
+vn 0.161944 -0.906046 -0.390966
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 -0.382683
+vn 0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 0.382683
+vn -0.923880 0.000000 0.382683
+vn -0.382684 0.000000 0.923879
+vn -0.382684 0.000000 0.923879
+vn 0.382684 0.000000 0.923879
+vn 0.382684 0.000000 0.923879
+vn -0.382684 0.000000 -0.923879
+vn -0.382684 0.000000 -0.923879
+vn 0.382684 0.000000 -0.923879
+vn 0.382684 0.000000 -0.923879
+vn -0.174226 0.982058 -0.072168
+vn -0.174226 0.982058 -0.072168
+vn -0.174226 0.982058 0.072166
+vn -0.174226 0.982058 0.072166
+vn 0.174226 0.982058 0.072168
+vn 0.174226 0.982058 0.072168
+vn 0.174226 0.982058 -0.072168
+vn 0.174226 0.982058 -0.072168
+vn 0.072167 0.982058 -0.174226
+vn 0.072167 0.982058 -0.174226
+vn -0.072167 0.982058 -0.174227
+vn -0.072167 0.982058 -0.174227
+vn 0.072167 0.982058 0.174226
+vn 0.072167 0.982058 0.174226
+vn -0.072167 0.982058 0.174225
+vn -0.072167 0.982058 0.174225
+vn -0.915773 0.132185 -0.379325
+vn -0.915773 0.132185 -0.379325
+vn -0.915773 0.132185 0.379325
+vn -0.915773 0.132185 0.379325
+vn 0.915773 0.132184 0.379325
+vn 0.915773 0.132184 0.379325
+vn 0.915773 0.132184 -0.379325
+vn 0.915773 0.132184 -0.379325
+vn 0.379326 0.132184 -0.915773
+vn 0.379326 0.132184 -0.915773
+vn -0.379325 0.132185 -0.915773
+vn -0.379325 0.132185 -0.915773
+vn 0.379326 0.132184 0.915773
+vn 0.379326 0.132184 0.915773
+vn -0.379325 0.132185 0.915773
+vn -0.379325 0.132185 0.915773
+vn 0.044453 0.998842 0.018413
+vn 0.044453 0.998842 0.018413
+vn 0.044453 0.998842 -0.018413
+vn 0.044453 0.998842 -0.018413
+vn -0.044453 0.998842 -0.018413
+vn -0.044453 0.998842 -0.018413
+vn -0.044453 0.998842 0.018413
+vn -0.044453 0.998842 0.018413
+vn -0.018413 0.998842 0.044452
+vn -0.018413 0.998842 0.044452
+vn 0.018413 0.998842 0.044452
+vn 0.018413 0.998842 0.044452
+vn -0.018413 0.998842 -0.044452
+vn -0.018413 0.998842 -0.044452
+vn 0.018413 0.998842 -0.044452
+vn 0.018413 0.998842 -0.044452
+vn 0.923730 0.017953 0.382623
+vn 0.923730 0.017953 0.382623
+vn 0.923730 0.017953 -0.382623
+vn 0.923730 0.017953 -0.382623
+vn 0.382621 0.017953 -0.923731
+vn -0.382621 0.017953 -0.923731
+vn -0.923730 0.017953 -0.382622
+vn -0.923730 0.017953 -0.382622
+vn -0.923730 0.017953 0.382622
+vn -0.923730 0.017953 0.382622
+vn -0.382621 0.017953 0.923731
+vn -0.382621 0.017953 0.923731
+vn 0.382621 0.017953 0.923731
+vn 0.382621 0.017953 0.923731
+vn -0.382621 0.017953 -0.923731
+vn 0.382621 0.017953 -0.923731
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 -0.382683
+vn 0.923880 0.000000 -0.382683
+vn 0.382684 0.000000 -0.923879
+vn -0.382684 0.000000 -0.923879
+vn -0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 -0.382683
+vn -0.923879 0.000000 0.382684
+vn -0.923879 0.000000 0.382684
+vn -0.382683 0.000000 0.923880
+vn -0.382683 0.000000 0.923880
+vn 0.382684 0.000000 0.923879
+vn 0.382684 0.000000 0.923879
+vn -0.382684 0.000000 -0.923879
+vn 0.382684 0.000000 -0.923879
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 -0.382683
+vn 0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 0.382683
+vn -0.923880 0.000000 0.382683
+vn -0.382684 0.000000 0.923879
+vn -0.382684 0.000000 0.923879
+vn 0.382684 0.000000 0.923879
+vn 0.382684 0.000000 0.923879
+vn -0.382684 0.000000 -0.923879
+vn -0.382684 0.000000 -0.923879
+vn 0.382684 0.000000 -0.923879
+vn 0.382684 0.000000 -0.923879
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.923823 0.011019 0.382660
+vn 0.849397 -0.393368 0.351832
+vn 0.825592 -0.448836 0.341971
+vn 0.917828 -0.114267 0.380176
+vn 0.923823 0.011019 -0.382660
+vn 0.849397 -0.393368 -0.351832
+vn 0.825592 -0.448835 -0.341971
+vn 0.917828 -0.114267 -0.380176
+vn -0.923823 0.011019 -0.382660
+vn -0.849397 -0.393369 -0.351832
+vn -0.825591 -0.448837 -0.341972
+vn -0.917828 -0.114267 -0.380177
+vn -0.923823 0.011019 0.382660
+vn -0.849397 -0.393368 0.351832
+vn -0.825592 -0.448836 0.341972
+vn -0.917828 -0.114267 0.380177
+vn -0.382660 0.011019 0.923823
+vn -0.465297 -0.256225 0.847259
+vn -0.341971 -0.448836 0.825592
+vn -0.380177 -0.114267 0.917828
+vn 0.382660 0.011019 0.923824
+vn 0.465296 -0.256225 0.847259
+vn 0.341972 -0.448836 0.825592
+vn 0.380178 -0.114267 0.917828
+vn 0.265892 -0.719193 0.641921
+vn -0.265892 -0.719193 0.641921
+vn 0.000000 -0.691139 0.722722
+vn 0.000000 0.010180 0.999948
+vn -0.382660 0.011019 -0.923823
+vn -0.465297 -0.256226 -0.847259
+vn -0.265892 -0.719194 -0.641920
+vn -0.341971 -0.448837 -0.825592
+vn -0.380176 -0.114267 -0.917828
+vn 0.382660 0.011019 -0.923824
+vn 0.465296 -0.256225 -0.847259
+vn 0.000000 0.010180 -0.999948
+vn 0.265892 -0.719194 -0.641920
+vn 0.341972 -0.448837 -0.825591
+vn 0.000000 -0.691141 -0.722720
+vn 0.380178 -0.114267 -0.917828
+vn 0.390970 -0.906045 0.161944
+vn 0.390970 -0.906045 0.161944
+vn 0.390970 -0.906045 -0.161944
+vn 0.390970 -0.906045 -0.161944
+vn -0.390972 -0.906044 -0.161944
+vn -0.390972 -0.906044 -0.161944
+vn -0.390972 -0.906044 0.161944
+vn -0.390972 -0.906044 0.161944
+vn -0.161945 -0.906046 0.390965
+vn -0.161945 -0.906046 0.390965
+vn 0.161945 -0.906046 0.390965
+vn 0.161945 -0.906046 0.390965
+vn -0.161945 -0.906046 -0.390965
+vn -0.161945 -0.906046 -0.390965
+vn 0.161945 -0.906046 -0.390965
+vn 0.161945 -0.906046 -0.390965
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 0.382683
+vn 0.923880 0.000000 -0.382683
+vn 0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 -0.382683
+vn -0.923880 0.000000 0.382683
+vn -0.923880 0.000000 0.382683
+vn -0.382684 0.000000 0.923879
+vn -0.382684 0.000000 0.923879
+vn 0.382684 0.000000 0.923879
+vn 0.382684 0.000000 0.923879
+vn -0.382684 0.000000 -0.923879
+vn -0.382684 0.000000 -0.923879
+vn 0.382684 0.000000 -0.923879
+vn 0.382684 0.000000 -0.923879
+vn -0.174228 0.982057 -0.072166
+vn -0.174228 0.982057 -0.072166
+vn -0.174228 0.982057 0.072166
+vn -0.174228 0.982057 0.072166
+vn 0.174228 0.982057 0.072166
+vn 0.174228 0.982057 0.072166
+vn 0.174228 0.982057 -0.072166
+vn 0.174228 0.982057 -0.072166
+vn 0.072168 0.982058 -0.174226
+vn 0.072168 0.982058 -0.174226
+vn -0.072168 0.982058 -0.174226
+vn -0.072168 0.982058 -0.174226
+vn 0.072168 0.982058 0.174226
+vn 0.072168 0.982058 0.174226
+vn -0.072168 0.982058 0.174226
+vn -0.072168 0.982058 0.174226
+vn -0.915773 0.132186 -0.379325
+vn -0.915773 0.132186 -0.379325
+vn -0.915773 0.132186 0.379325
+vn -0.915773 0.132186 0.379325
+vn 0.915772 0.132185 0.379326
+vn 0.915772 0.132185 0.379326
+vn 0.915772 0.132185 -0.379326
+vn 0.915772 0.132185 -0.379326
+vn 0.379325 0.132185 -0.915773
+vn 0.379325 0.132185 -0.915773
+vn -0.379326 0.132185 -0.915772
+vn -0.379326 0.132185 -0.915772
+vn 0.379325 0.132185 0.915773
+vn 0.379325 0.132185 0.915773
+vn -0.379326 0.132185 0.915772
+vn -0.379326 0.132185 0.915772
+vn 0.044456 0.998842 0.018415
+vn 0.044456 0.998842 0.018415
+vn 0.044456 0.998842 -0.018415
+vn 0.044456 0.998842 -0.018415
+vn -0.044456 0.998842 -0.018415
+vn -0.044456 0.998842 -0.018415
+vn -0.044456 0.998842 0.018415
+vn -0.044456 0.998842 0.018415
+vn -0.018414 0.998842 0.044456
+vn -0.018414 0.998842 0.044456
+vn 0.018414 0.998842 0.044456
+vn 0.018414 0.998842 0.044456
+vn -0.018414 0.998842 -0.044454
+vn -0.018414 0.998842 -0.044454
+vn 0.018414 0.998842 -0.044454
+vn 0.018414 0.998842 -0.044454
+vn 0.923731 0.017953 0.382622
+vn 0.923731 0.017953 0.382622
+vn 0.923731 0.017953 -0.382622
+vn 0.923731 0.017953 -0.382622
+vn 0.382622 0.017953 -0.923731
+vn -0.382621 0.017953 -0.923731
+vn -0.923730 0.017953 -0.382623
+vn -0.923730 0.017953 -0.382623
+vn -0.923730 0.017953 0.382623
+vn -0.923730 0.017953 0.382623
+vn -0.382621 0.017953 0.923731
+vn -0.382621 0.017953 0.923731
+vn 0.382622 0.017953 0.923731
+vn 0.382622 0.017953 0.923731
+vn -0.382621 0.017953 -0.923731
+vn 0.382622 0.017953 -0.923731
+vn 0.997405 0.071989 0.000000
+vn 0.997405 0.071989 0.000000
+vn 0.705259 0.050902 -0.707120
+vn 0.705259 0.050902 -0.707120
+vn 0.000013 0.000002 -1.000000
+vn 0.000013 0.000002 -1.000000
+vn -0.705264 -0.050900 -0.707115
+vn -0.705264 -0.050900 -0.707115
+vn -0.997406 -0.071986 0.000000
+vn -0.997406 -0.071986 0.000000
+vn -0.705264 -0.050900 0.707115
+vn -0.705264 -0.050900 0.707115
+vn 0.000013 0.000002 1.000000
+vn 0.000013 0.000002 1.000000
+vn 0.705259 0.050902 0.707120
+vn 0.705259 0.050902 0.707120
+vn 0.071959 -0.997408 0.000000
+vn 0.071959 -0.997408 0.000000
+vn 0.071964 -0.997407 0.000019
+vn 0.071964 -0.997407 0.000019
+vn 0.071978 -0.997406 0.000007
+vn 0.071978 -0.997406 0.000007
+vn 0.071987 -0.997406 -0.000012
+vn 0.071987 -0.997406 -0.000012
+vn 0.071987 -0.997406 0.000000
+vn 0.071987 -0.997406 0.000000
+vn 0.071987 -0.997406 0.000012
+vn 0.071987 -0.997406 0.000012
+vn 0.071978 -0.997406 -0.000007
+vn 0.071978 -0.997406 -0.000007
+vn 0.071964 -0.997407 -0.000019
+vn 0.071964 -0.997407 -0.000019
+vn 0.997407 0.071973 0.000000
+vn 0.991926 -0.126817 0.000000
+vn 0.947926 -0.318492 0.000000
+vn 0.705268 0.050894 -0.707112
+vn 0.705568 -0.147480 -0.693126
+vn 0.678421 -0.337945 -0.652333
+vn 0.000007 -0.000003 -1.000000
+vn 0.014247 -0.197373 -0.980225
+vn 0.027776 -0.384902 -0.922539
+vn -0.705273 -0.050905 -0.707106
+vn -0.677081 -0.247265 -0.693125
+vn -0.622862 -0.431854 -0.652338
+vn -0.997406 -0.071987 0.000000
+vn -0.963438 -0.267930 0.000000
+vn -0.892370 -0.451304 0.000000
+vn -0.705273 -0.050905 0.707106
+vn -0.677081 -0.247265 0.693125
+vn -0.622862 -0.431854 0.652338
+vn 0.000008 -0.000003 1.000000
+vn 0.014247 -0.197373 0.980225
+vn 0.027776 -0.384901 0.922540
+vn 0.705269 0.050894 0.707111
+vn 0.705568 -0.147480 0.693125
+vn 0.678421 -0.337945 0.652333
+vn 0.071997 -0.997405 0.000000
+vn 0.071997 -0.997405 0.000000
+vn 0.071990 -0.997405 -0.000006
+vn 0.071990 -0.997405 -0.000006
+vn 0.071993 -0.997405 0.000006
+vn 0.071993 -0.997405 0.000006
+vn 0.072009 -0.997404 0.000018
+vn 0.072009 -0.997404 0.000018
+vn 0.072015 -0.997404 0.000000
+vn 0.072015 -0.997404 0.000000
+vn 0.072009 -0.997404 -0.000018
+vn 0.072009 -0.997404 -0.000018
+vn 0.071993 -0.997405 -0.000006
+vn 0.071993 -0.997405 -0.000006
+vn 0.071990 -0.997405 0.000006
+vn 0.071990 -0.997405 0.000006
+vn 0.997407 0.071963 0.000000
+vn 0.997407 0.071963 0.000000
+vn 0.705270 0.050889 -0.707110
+vn 0.705270 0.050889 -0.707110
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.705272 -0.050902 -0.707107
+vn -0.705272 -0.050902 -0.707107
+vn -0.997405 -0.071990 0.000000
+vn -0.997405 -0.071990 0.000000
+vn -0.705272 -0.050902 0.707107
+vn -0.705272 -0.050902 0.707107
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.705270 0.050889 0.707110
+vn 0.705270 0.050889 0.707110
+vn 0.247111 0.968987 0.000000
+vn 0.247111 0.968987 0.000000
+vn 0.154734 0.962317 -0.223616
+vn 0.154734 0.962317 -0.223616
+vn -0.068287 0.946220 -0.316235
+vn -0.068287 0.946220 -0.316235
+vn -0.291311 0.930127 -0.223610
+vn -0.291311 0.930127 -0.223610
+vn -0.383692 0.923461 0.000000
+vn -0.383692 0.923461 0.000000
+vn -0.291311 0.930128 0.223609
+vn -0.291311 0.930128 0.223609
+vn -0.068287 0.946220 0.316234
+vn -0.068287 0.946220 0.316234
+vn 0.154733 0.962317 0.223616
+vn 0.154733 0.962317 0.223616
+vn 0.756180 -0.654363 0.000000
+vn 0.756180 -0.654363 0.000000
+vn 0.549605 -0.669284 -0.499993
+vn 0.549605 -0.669284 -0.499993
+vn 0.050899 -0.705292 -0.707087
+vn 0.050899 -0.705292 -0.707087
+vn -0.447793 -0.741274 -0.499995
+vn -0.447793 -0.741274 -0.499995
+vn -0.654355 -0.756188 -0.000001
+vn -0.654355 -0.756188 -0.000001
+vn -0.447793 -0.741274 0.499994
+vn -0.447793 -0.741274 0.499994
+vn 0.050899 -0.705292 0.707087
+vn 0.050899 -0.705292 0.707087
+vn 0.549605 -0.669284 0.499994
+vn 0.549605 -0.669284 0.499994
+vn -0.072213 0.997389 0.000000
+vn 0.528444 0.848968 -0.000002
+vn 0.836129 0.548533 0.000000
+vn 0.356614 0.836559 -0.415928
+vn 0.580956 0.530107 -0.617638
+vn -0.058211 0.806620 -0.588197
+vn -0.035055 0.485649 -0.873451
+vn -0.473038 0.776694 -0.415910
+vn -0.651071 0.441199 -0.617616
+vn -0.644864 0.764297 0.000000
+vn -0.906230 0.422786 0.000000
+vn -0.473038 0.776694 0.415910
+vn -0.651071 0.441199 0.617616
+vn -0.058211 0.806620 0.588197
+vn -0.035055 0.485649 0.873451
+vn 0.356614 0.836560 0.415926
+vn 0.580956 0.530107 0.617637
+vn 0.013161 0.008894 0.999874
+vn 0.013161 0.008894 0.999874
+vn 0.409092 -0.576862 0.707017
+vn 0.409092 -0.576862 0.707017
+vn 0.573092 -0.819491 0.000000
+vn 0.573092 -0.819491 0.000000
+vn 0.409092 -0.576862 -0.707018
+vn 0.409092 -0.576862 -0.707018
+vn 0.013161 0.008894 -0.999874
+vn 0.013161 0.008894 -0.999874
+vn -0.382773 0.594654 -0.707016
+vn -0.382773 0.594654 -0.707016
+vn -0.546773 0.837281 0.000000
+vn -0.546773 0.837281 0.000000
+vn -0.382773 0.594654 0.707016
+vn -0.382773 0.594654 0.707016
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.005048 0.008466 -0.999951
+vn -0.001558 0.003019 -0.999994
+vn -0.008365 0.009773 -0.999917
+vn -0.006180 0.002751 -0.999977
+vn 0.031027 -0.045147 -0.998498
+vn 0.083067 -0.146694 -0.985688
+vn 0.171496 -0.296152 -0.939618
+vn 0.379549 -0.370895 -0.847573
+vn 0.612488 -0.633300 -0.473064
+vn 0.001662 -0.284907 -0.958554
+vn -0.002601 -0.611459 -0.791272
+vn -0.004739 -0.614960 -0.788544
+vn -0.001656 -0.620166 -0.784469
+vn -0.002364 -0.624637 -0.780912
+vn -0.003943 -0.628088 -0.778132
+vn -0.002765 -0.630722 -0.776004
+vn 0.001016 -0.631656 -0.775248
+vn 0.055700 -0.627733 -0.776433
+vn 0.226451 -0.593755 -0.772124
+vn 0.431595 -0.502047 -0.749449
+vn 0.559688 -0.398391 -0.726660
+vn 0.640943 -0.317266 -0.698952
+vn 0.637526 -0.529415 -0.559715
+vn 0.328249 -0.731406 -0.597743
+vn 0.503599 -0.691202 -0.518294
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.004050 -0.001464 -0.999991
+vn 0.004050 -0.001464 -0.999991
+vn 0.008099 -0.002928 -0.999963
+vn 0.008099 -0.002928 -0.999963
+vn 0.008099 -0.002928 -0.999963
+vn -0.000622 -0.957209 -0.289396
+vn -0.032745 -0.924632 -0.379451
+vn -0.088118 -0.757908 -0.646383
+vn -0.126585 -0.324875 -0.937248
+vn -0.155548 0.179096 -0.971457
+vn -0.182194 0.240699 -0.953346
+vn 0.682096 -0.710442 -0.173255
+vn 0.382114 -0.914355 -0.133959
+vn 0.484499 -0.866370 -0.121091
+vn 0.387995 -0.898366 -0.205909
+vn 0.665242 -0.692669 -0.278679
+vn 0.619534 -0.642008 -0.451667
+vn 0.343405 -0.880083 -0.327913
+vn 0.138085 -0.809093 -0.571228
+vn 0.423232 -0.483997 -0.765912
+vn -0.443970 0.883317 -0.150474
+vn -0.278328 0.947710 -0.156141
+vn -0.028994 0.982343 -0.184829
+vn 0.180907 0.973766 -0.138031
+vn -0.234810 -0.551473 -0.800463
+vn 0.112474 -0.299001 -0.947601
+vn -0.429138 -0.313068 -0.847248
+vn 0.058509 -0.134104 -0.989239
+vn 0.210505 0.971281 -0.110905
+vn 0.285194 0.197417 -0.937918
+vn 0.357690 0.769708 -0.528778
+vn 0.319524 0.907313 -0.273288
+vn 0.019270 0.977705 -0.209097
+vn -0.085357 0.390766 0.916524
+vn 0.317031 0.181809 -0.930826
+vn 0.436582 0.371589 -0.819340
+vn -0.191248 0.436032 0.879375
+vn 0.446545 0.800932 -0.398881
+vn -0.279063 0.516941 0.809256
+vn 0.068499 0.970003 -0.233244
+vn -0.313107 0.940180 -0.134258
+vn -0.443970 0.883317 -0.150474
+vn -0.191248 0.436032 0.879375
+vn -0.279063 0.516941 0.809256
+vn -0.085357 0.390766 0.916524
+vn -0.265697 0.367191 0.891390
+vn 0.382048 0.076277 -0.920989
+vn 0.556969 -0.013670 -0.830421
+vn 0.405430 0.172048 -0.897790
+vn 0.500121 0.035416 -0.865231
+vn 0.297561 0.153827 -0.942229
+vn 0.333241 0.015263 -0.942718
+vn 0.145215 -0.018635 -0.989225
+vn 0.123103 0.109724 -0.986309
+vn 0.095854 0.135837 -0.986083
+vn 0.110890 -0.030335 -0.993370
+vn 0.049046 0.176580 -0.983064
+vn 0.070909 -0.018533 -0.997311
+vn 0.007370 0.115608 -0.993268
+vn 0.040821 0.045228 -0.998142
+vn 0.004079 0.088693 -0.996051
+vn 0.004596 0.101518 -0.994823
+vn 0.013448 0.082595 -0.996492
+vn -0.015378 0.105704 -0.994279
+vn -0.044604 0.105798 -0.993387
+vn -0.029288 0.098868 -0.994669
+vn -0.032949 0.131347 -0.990789
+vn -0.045682 0.237634 -0.970280
+vn -0.042621 0.067021 -0.996841
+vn -0.093170 0.254066 -0.962689
+vn -0.072399 0.073942 -0.994631
+vn -0.125141 0.258126 -0.957972
+vn -0.105730 0.094396 -0.989904
+vn 0.304162 0.023810 -0.952323
+vn 0.270011 0.041486 -0.961963
+vn 0.374880 0.143776 -0.915857
+vn 0.265584 0.072621 -0.961349
+vn 0.298003 0.116049 -0.947484
+vn 0.159298 0.154959 -0.974993
+vn 0.234602 0.113939 -0.965391
+vn 0.320457 0.197980 -0.926343
+vn 0.136348 0.119007 -0.983487
+vn 0.151169 0.093855 -0.984042
+vn 0.146094 0.075611 -0.986377
+vn 0.112454 0.305711 -0.945460
+vn 0.017516 0.256234 -0.966456
+vn 0.000000 0.327190 -0.944959
+vn -0.027045 0.261613 -0.964794
+vn 0.017531 0.108058 -0.993990
+vn 0.020891 0.168337 -0.985508
+vn 0.031172 0.086795 -0.995738
+vn 0.086871 0.090782 -0.992075
+vn 0.116889 0.165352 -0.979283
+vn 0.116889 0.165352 -0.979283
+vn 0.053620 0.110638 -0.992413
+vn -0.018860 0.116248 -0.993041
+vn 0.030185 0.137334 -0.990065
+vn -0.012559 0.088054 -0.996037
+vn -0.177074 0.118082 -0.977088
+vn 0.000025 0.031657 -0.999499
+vn 0.038914 0.255286 -0.966082
+vn 0.015496 0.272673 -0.961982
+vn 0.000000 0.279250 -0.960218
+vn -0.006966 0.048920 -0.998778
+vn -0.004497 0.140224 -0.990110
+vn -0.004148 0.141952 -0.989865
+vn -0.004147 0.141439 -0.989938
+vn -0.017246 0.127797 -0.991650
+vn -0.026184 0.030281 -0.999198
+vn 0.016002 0.277204 -0.960678
+vn 0.016002 0.277204 -0.960678
+vn -0.012361 0.268507 -0.963198
+vn -0.012361 0.268507 -0.963198
+vn 0.000000 0.218824 -0.975764
+vn -0.023383 0.234430 -0.971852
+vn 0.000185 0.310974 -0.950418
+vn 0.000000 0.310542 -0.950560
+vn -0.061505 0.213730 -0.974955
+vn 0.000184 0.313300 -0.949654
+vn 0.000000 0.313741 -0.949509
+vn 0.000385 0.311767 -0.950159
+vn 0.000384 0.312493 -0.949920
+vn -0.081234 0.271336 -0.959051
+vn -0.130536 0.166777 -0.977316
+vn -0.087111 0.239852 -0.966893
+vn -0.119249 0.254206 -0.959770
+vn -0.132231 0.332916 -0.933639
+vn -0.163495 0.235513 -0.958020
+vn 0.109746 0.210021 -0.971518
+vn -0.088396 0.283924 -0.954763
+vn -0.047399 -0.020257 -0.998671
+vn -0.070976 0.018118 -0.997313
+vn 0.000000 -0.096813 -0.995303
+vn -0.014779 -0.045290 -0.998865
+vn -0.094775 -0.019741 -0.995303
+vn -0.063320 0.024917 -0.997682
+vn 0.014963 0.343466 -0.939046
+vn 0.014963 0.343466 -0.939046
+vn 0.044018 0.097420 -0.994269
+vn -0.014780 0.060170 -0.998079
+vn -0.010960 0.166519 -0.985977
+vn 0.000000 0.113789 -0.993505
+vn -0.065852 0.234308 -0.969930
+vn 0.381431 0.120164 -0.916554
+vn 0.264827 0.332418 0.905188
+vn 0.148874 0.354954 0.922954
+vn -0.004617 0.173236 -0.984869
+vn -0.051868 0.232639 -0.971179
+vn -0.139632 0.244987 -0.959419
+vn -0.169449 0.263015 -0.949795
+vn -0.182194 0.240699 -0.953346
+vn 0.716915 0.112171 -0.688078
+vn 0.758164 0.095473 -0.645037
+vn 0.758164 0.095473 -0.645037
+vn 0.716915 0.112171 -0.688078
+vn -0.183085 0.157225 -0.970443
+vn 0.148874 0.354954 0.922954
+vn 0.359364 0.324809 0.874846
+vn 0.367321 0.351698 0.861037
+vn 0.297364 0.317491 0.900430
+vn 0.458623 0.303871 0.835061
+vn 0.469618 0.323039 0.821647
+vn 0.276933 0.372860 0.885598
+vn 0.297364 0.317491 0.900430
+vn 0.312759 0.218473 0.924365
+vn 0.094421 0.280653 0.955154
+vn -0.018003 0.377460 0.925851
+vn -0.066775 0.368329 0.927294
+vn -0.177074 0.118082 -0.977088
+vn -0.293864 0.230645 0.927603
+vn -0.085639 0.233313 -0.968623
+vn -0.361786 0.326763 0.873119
+vn -0.146949 0.479817 0.864975
+vn 0.048479 0.329208 -0.943012
+vn 0.097063 0.293624 -0.950980
+vn 0.115750 0.257383 -0.959352
+vn 0.212250 0.267783 0.939809
+vn -0.018003 0.377460 0.925851
+vn -0.066775 0.368329 0.927294
+vn -0.293864 0.230645 0.927603
+vn -0.011620 -0.958525 -0.284770
+vn -0.016400 -0.961439 -0.274527
+vn -0.009060 -0.964396 -0.264307
+vn -0.007042 -0.966195 -0.257717
+vn -0.011348 -0.967312 -0.253337
+vn -0.008201 -0.968389 -0.249311
+vn 0.001985 -0.968728 -0.248118
+vn 0.099841 -0.959526 -0.263329
+vn 0.350932 -0.896456 -0.270578
+vn 0.637211 -0.736703 -0.226343
+vn 0.810509 -0.563456 -0.159977
+vn 0.898578 -0.431620 -0.079123
+vn -0.027915 -0.929989 -0.366525
+vn -0.025304 -0.933217 -0.358422
+vn -0.021026 -0.931393 -0.363408
+vn -0.013125 -0.931310 -0.363990
+vn -0.017126 -0.929639 -0.368073
+vn -0.009906 -0.925524 -0.378560
+vn 0.017727 -0.913313 -0.406872
+vn 0.138306 -0.872253 -0.469091
+vn 0.350660 -0.781717 -0.515709
+vn 0.604752 -0.636012 -0.479337
+vn 0.779066 -0.492478 -0.387970
+vn 0.869206 -0.411663 -0.273889
+vn -0.051298 -0.773044 -0.632274
+vn -0.029597 -0.786952 -0.616304
+vn -0.033228 -0.783409 -0.620617
+vn -0.020186 -0.775990 -0.630422
+vn -0.005117 -0.761370 -0.648297
+vn 0.018569 -0.730812 -0.682326
+vn 0.057344 -0.685707 -0.725615
+vn 0.162821 -0.645857 -0.745894
+vn 0.327546 -0.624718 -0.708831
+vn 0.568254 -0.552002 -0.610231
+vn 0.745434 -0.452974 -0.489023
+vn 0.828394 -0.409274 -0.382436
+vn -0.083031 -0.336373 -0.938061
+vn -0.049527 -0.354987 -0.933559
+vn -0.041844 -0.357783 -0.932867
+vn -0.021024 -0.344348 -0.938607
+vn 0.019876 -0.328586 -0.944265
+vn 0.058985 -0.312457 -0.948099
+vn 0.081012 -0.303002 -0.949540
+vn 0.135971 -0.321898 -0.936960
+vn 0.243140 -0.369569 -0.896829
+vn 0.485396 -0.368969 -0.792624
+vn 0.682836 -0.329533 -0.652029
+vn 0.768168 -0.313531 -0.558226
+vn 0.578350 0.285793 -0.764090
+vn 0.250386 0.130226 -0.959348
+vn 0.231372 0.415637 -0.879609
+vn 0.282524 0.559972 -0.778853
+vn 0.676715 0.399167 -0.618646
+vn 0.659150 0.075212 -0.748241
+vn 0.647834 -0.110155 -0.753775
+vn 0.590692 -0.107892 -0.799651
+vn 0.405847 0.360061 -0.840026
+vn 0.676715 0.399167 -0.618646
+vn 0.659150 0.075212 -0.748241
+vn 0.647834 -0.110155 -0.753775
+vn 0.590692 -0.107892 -0.799651
+vn 0.590692 -0.107892 -0.799651
+vn 0.590692 -0.107892 -0.799651
+vn 0.282524 0.559972 -0.778853
+vn -0.450579 0.527013 -0.720580
+vn -0.450579 0.527013 -0.720580
+vn -0.295642 0.828243 -0.476035
+vn -0.295642 0.828243 -0.476035
+vn -0.089100 0.984906 -0.148399
+vn 0.003960 -0.990569 -0.136954
+vn 0.003960 -0.990569 -0.136954
+vn -0.054248 -0.035311 -0.997903
+vn -0.056548 -0.026579 -0.998046
+vn -0.058844 -0.017845 -0.998108
+vn -0.040494 -0.294223 -0.954878
+vn -0.008242 -0.844924 -0.534823
+vn -0.046832 -0.642706 -0.764680
+vn -0.048895 -0.289439 -0.955947
+vn -0.057227 -0.284663 -0.956918
+vn -0.078329 -0.403392 -0.911668
+vn -0.139225 -0.140428 -0.980253
+vn -0.139225 -0.140428 -0.980253
+vn -0.176416 0.006735 -0.984293
+vn -0.176416 0.006735 -0.984293
+vn -0.176416 0.006735 -0.984293
+vn 0.950690 -0.100397 -0.293442
+vn 0.917871 0.186096 -0.350544
+vn 0.868001 0.138068 -0.476981
+vn 0.830271 -0.196277 -0.521657
+vn 0.950690 -0.100397 -0.293442
+vn 0.917871 0.186096 -0.350544
+vn 0.868001 0.138068 -0.476981
+vn 0.830271 -0.196277 -0.521657
+vn -0.000197 -0.000261 -1.000000
+vn -0.000082 -0.000105 -1.000000
+vn -0.000082 -0.000105 -1.000000
+vn -0.000140 -0.000183 -1.000000
+vn -0.000140 -0.000183 -1.000000
+vn -0.000166 -0.000082 1.000000
+vn -0.000210 -0.000192 1.000000
+vn -0.000188 -0.000137 1.000000
+vn -0.000210 -0.000192 1.000000
+vn -0.000188 -0.000137 1.000000
+vn -0.000017 0.000000 -1.000000
+vn 0.000000 -0.000016 -1.000000
+vn 0.000000 -0.000016 -1.000000
+vn -0.000008 -0.000008 -1.000000
+vn -0.000008 -0.000008 -1.000000
+vn -0.555518 -0.368362 0.745459
+vn -0.476491 -0.321209 0.818402
+vn -0.390893 -0.269628 0.880059
+vn -0.476491 -0.321209 0.818402
+vn -0.390893 -0.269628 0.880059
+vn -0.000305 -0.000229 1.000000
+vn -0.000225 -0.000132 1.000000
+vn -0.000265 -0.000181 1.000000
+vn -0.000225 -0.000132 1.000000
+vn -0.000265 -0.000181 1.000000
+vn -0.003009 0.999937 -0.010797
+vn 0.365466 0.930591 -0.020860
+vn 0.791482 0.609971 -0.038629
+vn 0.883316 0.466393 -0.047226
+vn 0.887087 0.459285 -0.046201
+vn 0.887087 0.459285 -0.046201
+vn 0.883316 0.466393 -0.047226
+vn 0.791482 0.609971 -0.038629
+vn 0.365466 0.930591 -0.020860
+vn -0.003009 0.999937 -0.010797
+vn 0.899818 0.432912 0.053989
+vn 0.855654 0.497688 0.141994
+vn 0.791101 0.611685 0.000000
+vn 0.667633 0.742423 0.055444
+vn 0.668223 0.743041 0.036983
+vn 0.668698 0.743534 0.000000
+vn -0.000002 0.998668 0.051588
+vn -0.000001 0.999408 0.034409
+vn 0.000000 1.000000 0.000000
+vn -0.667632 0.742424 0.055444
+vn -0.668222 0.743042 0.036983
+vn -0.668698 0.743534 0.000000
+vn -0.899815 0.432919 0.053989
+vn -0.900545 0.433268 0.036010
+vn -0.901130 0.433548 0.000000
+vn 0.745737 0.666074 0.014915
+vn 0.745737 0.666074 0.014915
+vn 0.745737 0.666074 0.014915
+vn 0.749358 0.661826 0.021169
+vn 0.756453 0.653702 0.021301
+vn 0.855819 0.216306 0.469878
+vn 0.835209 0.472749 0.280953
+vn 0.734879 0.677350 0.033918
+vn 0.705775 0.708095 0.021988
+vn 0.696867 0.716869 0.021803
+vn 0.692228 0.721546 0.013841
+vn 0.692296 0.721613 0.000000
+vn 0.909932 0.326044 0.256358
+vn 0.840054 0.537837 0.070998
+vn 0.808999 0.582269 0.080523
+vn 0.774704 0.631568 0.030906
+vn 0.766343 0.642432 0.000000
+vn 0.916005 0.359898 0.177223
+vn 0.908113 0.414910 0.056399
+vn 0.906833 0.421491 0.000000
+vn 0.852002 0.105637 0.512771
+vn 0.852948 0.109895 0.510297
+vn 0.812134 -0.000004 0.583472
+vn 0.845581 0.033342 0.532805
+vn 0.912297 0.090853 0.399324
+vn 0.942579 0.239933 0.232329
+vn 0.772410 -0.203442 0.601659
+vn 0.820110 -0.184602 0.541610
+vn 0.910916 -0.148014 0.385129
+vn 0.961603 -0.135715 0.238542
+vn 0.979385 -0.142420 0.143254
+vn 0.990364 -0.132350 0.040778
+vn 0.992556 -0.121791 0.000000
+vn 0.747426 -0.435266 0.501894
+vn 0.779154 -0.476694 0.407041
+vn 0.823362 -0.518545 0.230620
+vn 0.850162 -0.517719 0.095870
+vn 0.852938 -0.521533 0.022390
+vn 0.847102 -0.531397 0.005863
+vn 0.846332 -0.532656 -0.000027
+vn 0.730419 -0.548998 0.406312
+vn 0.740092 -0.613764 0.274877
+vn 0.752137 -0.648224 0.118726
+vn 0.802817 -0.593755 0.054228
+vn 0.832290 -0.554339 -0.000851
+vn 0.811583 -0.584236 -0.000878
+vn 0.789837 -0.613316 -0.000054
+vn 0.668223 0.743041 -0.036983
+vn 0.667633 0.742423 -0.055444
+vn 0.899818 0.432912 -0.053989
+vn 0.855654 0.497688 -0.141994
+vn 0.749358 0.661826 -0.021169
+vn 0.745737 0.666074 -0.014915
+vn 0.745737 0.666074 -0.014915
+vn 0.745737 0.666074 -0.014915
+vn 0.756453 0.653702 -0.021301
+vn -0.000001 0.999408 -0.034409
+vn -0.000002 0.998668 -0.051588
+vn -0.668222 0.743042 -0.036983
+vn -0.667632 0.742424 -0.055444
+vn -0.900545 0.433268 -0.036010
+vn -0.899815 0.432919 -0.053989
+vn 0.835209 0.472749 -0.280953
+vn 0.734879 0.677350 -0.033918
+vn 0.705775 0.708095 -0.021988
+vn 0.696867 0.716869 -0.021803
+vn 0.692228 0.721546 -0.013841
+vn 0.909932 0.326044 -0.256358
+vn 0.840054 0.537838 -0.070998
+vn 0.808999 0.582269 -0.080523
+vn 0.774704 0.631568 -0.030906
+vn 0.916005 0.359898 -0.177223
+vn 0.908113 0.414910 -0.056399
+vn 0.855819 0.216306 -0.469878
+vn 0.852002 0.105637 -0.512771
+vn 0.852948 0.109895 -0.510297
+vn 0.812134 -0.000004 -0.583472
+vn 0.845581 0.033342 -0.532805
+vn 0.912297 0.090853 -0.399324
+vn 0.942579 0.239933 -0.232329
+vn 0.772410 -0.203442 -0.601659
+vn 0.820110 -0.184602 -0.541610
+vn 0.910916 -0.148014 -0.385129
+vn 0.961603 -0.135715 -0.238542
+vn 0.979385 -0.142420 -0.143254
+vn 0.990364 -0.132350 -0.040778
+vn 0.747426 -0.435266 -0.501894
+vn 0.779154 -0.476694 -0.407041
+vn 0.823362 -0.518545 -0.230620
+vn 0.850162 -0.517719 -0.095870
+vn 0.852937 -0.521533 -0.022390
+vn 0.847112 -0.531381 -0.005890
+vn 0.730419 -0.548997 -0.406312
+vn 0.740092 -0.613764 -0.274877
+vn 0.752137 -0.648224 -0.118726
+vn 0.802817 -0.593755 -0.054228
+vn 0.832290 -0.554339 0.000851
+vn 0.811606 -0.584205 0.000825
+vn 0.899819 -0.432909 0.053989
+vn 0.899819 -0.432909 0.053989
+vn -0.899816 -0.432916 0.053989
+vn -0.900546 -0.433267 0.036010
+vn -0.901130 -0.433548 0.000000
+vn -0.667634 -0.742422 0.055444
+vn -0.662365 -0.748272 0.036898
+vn -0.656896 -0.753981 0.000000
+vn -0.000002 -0.998668 0.051588
+vn 0.017436 -0.999254 0.034473
+vn 0.034891 -0.999391 0.000000
+vn 0.667636 -0.742420 0.055444
+vn 0.571899 -0.819217 0.042606
+vn 0.371705 -0.928351 0.000000
+vn 0.371651 -0.928215 0.017132
+vn 0.371651 -0.928215 0.017132
+vn 0.371651 -0.928215 0.017132
+vn 0.371651 -0.928215 0.017132
+vn 0.371651 -0.928215 0.017132
+vn 0.899819 -0.432909 -0.053989
+vn 0.899819 -0.432909 -0.053989
+vn -0.900546 -0.433267 -0.036010
+vn -0.899816 -0.432916 -0.053989
+vn -0.662365 -0.748272 -0.036898
+vn -0.667635 -0.742422 -0.055444
+vn 0.017436 -0.999254 -0.034473
+vn -0.000002 -0.998668 -0.051588
+vn 0.571899 -0.819217 -0.042606
+vn 0.667636 -0.742420 -0.055444
+vn 0.371651 -0.928214 -0.017132
+vn 0.371651 -0.928214 -0.017132
+vn 0.371651 -0.928214 -0.017132
+vn 0.371651 -0.928214 -0.017132
+vn 0.371651 -0.928214 -0.017132
+vn -0.810233 -0.571641 -0.129415
+vn -0.671909 -0.740634 0.000000
+vn -0.676821 -0.736114 -0.007072
+vn -0.686546 -0.727050 -0.007295
+vn -0.696069 -0.717935 -0.007512
+vn -0.711305 -0.702696 -0.016204
+vn -0.769136 -0.634378 -0.077422
+vn -0.900372 -0.372538 -0.224823
+vn -0.922923 -0.139675 -0.358754
+vn -0.889126 -0.025617 -0.456944
+vn -0.844278 0.196119 -0.498731
+vn -0.795508 0.420875 -0.435926
+vn -0.766404 0.521943 -0.374433
+vn -0.772261 0.565928 -0.288684
+vn -0.793697 0.580479 -0.181904
+vn -0.856434 0.505553 -0.104576
+vn -0.892435 0.450389 -0.026622
+vn -0.873734 0.486253 -0.012079
+vn -0.852481 0.522757 0.000103
+vn -0.909932 -0.326044 -0.256358
+vn -0.840054 -0.537837 -0.070998
+vn -0.756313 -0.653454 -0.031438
+vn -0.808999 -0.582269 -0.080522
+vn -0.715976 -0.697868 -0.018952
+vn -0.729169 -0.684063 -0.019231
+vn -0.774704 -0.631568 -0.030905
+vn -0.706757 -0.707373 -0.010897
+vn -0.766343 -0.642431 0.000000
+vn -0.704435 -0.709768 0.000000
+vn -0.916005 -0.359898 -0.177223
+vn -0.908113 -0.414910 -0.056398
+vn -0.906833 -0.421491 0.000000
+vn -0.865371 -0.449519 -0.221508
+vn -0.891470 -0.127348 -0.434814
+vn -0.882252 -0.046081 -0.468518
+vn -0.912297 -0.090853 -0.399324
+vn -0.942579 -0.239933 -0.232329
+vn -0.853820 0.180375 -0.488320
+vn -0.910916 0.148014 -0.385129
+vn -0.961603 0.135715 -0.238542
+vn -0.979385 0.142420 -0.143254
+vn -0.990364 0.132350 -0.040778
+vn -0.992556 0.121791 0.000000
+vn -0.805482 0.449555 -0.386134
+vn -0.837657 0.479937 -0.260749
+vn -0.873595 0.471447 -0.120704
+vn -0.882382 0.469145 -0.036116
+vn -0.876455 0.481325 -0.012330
+vn -0.874376 0.485250 0.000052
+vn -0.810233 -0.571641 0.129415
+vn -0.676821 -0.736114 0.007072
+vn -0.686546 -0.727050 0.007295
+vn -0.696069 -0.717935 0.007512
+vn -0.711305 -0.702696 0.016205
+vn -0.769136 -0.634378 0.077422
+vn -0.900372 -0.372538 0.224823
+vn -0.922923 -0.139675 0.358754
+vn -0.889126 -0.025617 0.456944
+vn -0.844278 0.196119 0.498731
+vn -0.795508 0.420875 0.435926
+vn -0.766404 0.521943 0.374433
+vn -0.772261 0.565928 0.288684
+vn -0.793697 0.580480 0.181903
+vn -0.856434 0.505553 0.104576
+vn -0.892435 0.450389 0.026622
+vn -0.873776 0.486176 0.012183
+vn -0.756313 -0.653454 0.031438
+vn -0.840054 -0.537837 0.070998
+vn -0.909932 -0.326044 0.256358
+vn -0.729169 -0.684063 0.019231
+vn -0.715976 -0.697868 0.018952
+vn -0.808999 -0.582269 0.080523
+vn -0.706757 -0.707373 0.010897
+vn -0.774704 -0.631568 0.030905
+vn -0.908113 -0.414910 0.056398
+vn -0.916005 -0.359898 0.177223
+vn -0.865371 -0.449519 0.221508
+vn -0.891470 -0.127348 0.434814
+vn -0.882252 -0.046081 0.468518
+vn -0.912297 -0.090853 0.399324
+vn -0.942579 -0.239933 0.232329
+vn -0.853820 0.180375 0.488320
+vn -0.910916 0.148014 0.385128
+vn -0.961603 0.135715 0.238542
+vn -0.979385 0.142420 0.143254
+vn -0.990364 0.132350 0.040778
+vn -0.805482 0.449555 0.386134
+vn -0.837657 0.479937 0.260749
+vn -0.873595 0.471447 0.120704
+vn -0.882382 0.469145 0.036116
+vn -0.876476 0.481286 0.012381
+vn 0.738347 0.674421 0.000000
+vn 0.805468 0.567633 -0.170335
+vn 0.863787 0.499063 -0.069343
+vn 0.619227 0.785212 0.000000
+vn 0.618558 0.784468 -0.044670
+vn 0.617736 0.783530 -0.066952
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.999265 -0.038328
+vn 0.000000 0.998348 -0.057460
+vn -0.619247 0.785197 0.000000
+vn -0.618569 0.784460 -0.044669
+vn -0.617738 0.783529 -0.066951
+vn -0.865875 0.500261 0.000000
+vn -0.864947 0.499727 -0.046263
+vn -0.863789 0.499060 -0.069341
+vn 0.695032 0.718582 -0.023876
+vn 0.689708 0.723699 -0.023740
+vn 0.687015 0.726411 -0.018382
+vn 0.687015 0.726411 -0.018382
+vn 0.687015 0.726411 -0.018379
+vn 0.624714 0.780854 0.000000
+vn 0.624466 0.780880 -0.016398
+vn 0.628227 0.777635 -0.024792
+vn 0.636735 0.770667 -0.025327
+vn 0.717441 0.690516 -0.092012
+vn 0.798070 0.525003 -0.295730
+vn 0.780741 0.288022 -0.554514
+vn 0.731224 0.682138 0.000000
+vn 0.732744 0.680135 -0.022425
+vn 0.753104 0.652786 -0.081886
+vn 0.786793 0.583571 -0.201000
+vn 0.843100 0.418041 -0.338267
+vn 0.800048 0.262514 -0.539453
+vn 0.769962 0.223391 -0.597708
+vn 0.880395 0.474241 0.000000
+vn 0.882146 0.469741 -0.034090
+vn 0.882090 0.440111 -0.167985
+vn 0.866349 0.382375 -0.321293
+vn 0.834359 0.308219 -0.456996
+vn 0.757131 0.222409 -0.614237
+vn 0.729457 0.179958 -0.659930
+vn 0.996828 -0.079589 0.000000
+vn 0.996258 -0.085400 -0.013287
+vn 0.991315 -0.062658 -0.115625
+vn 0.949413 -0.021307 -0.313306
+vn 0.866787 -0.010319 -0.498572
+vn 0.771048 0.023567 -0.636341
+vn 0.732066 0.057951 -0.678764
+vn 0.810683 -0.585485 0.000000
+vn 0.811337 -0.584039 0.025115
+vn 0.820110 -0.571400 0.030345
+vn 0.829057 -0.541638 -0.138900
+vn 0.817000 -0.484846 -0.312147
+vn 0.824654 -0.352067 -0.442713
+vn 0.745632 -0.036899 -0.665336
+vn 0.718556 -0.695469 0.000000
+vn 0.725301 -0.687574 0.034360
+vn 0.709476 -0.701217 0.070270
+vn 0.690551 -0.722539 -0.032824
+vn 0.702154 -0.701121 -0.124136
+vn 0.726806 -0.682700 -0.075323
+vn 0.821862 -0.413404 -0.391969
+vn 0.687015 0.726411 0.018382
+vn 0.687015 0.726411 0.018382
+vn 0.689708 0.723699 0.023740
+vn 0.695032 0.718582 0.023876
+vn 0.805468 0.567634 0.170335
+vn 0.618558 0.784468 0.044669
+vn 0.687015 0.726411 0.018379
+vn 0.617736 0.783530 0.066951
+vn 0.863787 0.499063 0.069342
+vn 0.000000 0.999265 0.038328
+vn -0.000001 0.998348 0.057460
+vn -0.618569 0.784460 0.044669
+vn -0.617738 0.783529 0.066950
+vn -0.864947 0.499727 0.046262
+vn -0.863789 0.499060 0.069340
+vn 0.624466 0.780880 0.016398
+vn 0.628227 0.777635 0.024792
+vn 0.636735 0.770667 0.025327
+vn 0.717441 0.690516 0.092012
+vn 0.798070 0.525003 0.295730
+vn 0.780741 0.288022 0.554514
+vn 0.732744 0.680135 0.022425
+vn 0.753104 0.652786 0.081886
+vn 0.786793 0.583571 0.201000
+vn 0.843100 0.418041 0.338267
+vn 0.800048 0.262514 0.539453
+vn 0.769962 0.223391 0.597709
+vn 0.882146 0.469741 0.034090
+vn 0.882090 0.440111 0.167985
+vn 0.866349 0.382375 0.321293
+vn 0.834359 0.308219 0.456996
+vn 0.757131 0.222409 0.614237
+vn 0.729457 0.179958 0.659930
+vn 0.996258 -0.085400 0.013287
+vn 0.991315 -0.062658 0.115625
+vn 0.949413 -0.021307 0.313306
+vn 0.866786 -0.010319 0.498573
+vn 0.771048 0.023567 0.636341
+vn 0.732066 0.057951 0.678764
+vn 0.811337 -0.584039 -0.025115
+vn 0.820110 -0.571400 -0.030345
+vn 0.829057 -0.541638 0.138900
+vn 0.817000 -0.484846 0.312147
+vn 0.824654 -0.352067 0.442713
+vn 0.745632 -0.036899 0.665336
+vn 0.725301 -0.687574 -0.034360
+vn 0.709476 -0.701217 -0.070270
+vn 0.690551 -0.722539 0.032824
+vn 0.702154 -0.701121 0.124137
+vn 0.726806 -0.682700 0.075323
+vn 0.821862 -0.413404 0.391969
+vn 0.863809 -0.499025 -0.069340
+vn 0.863809 -0.499025 -0.069340
+vn -0.865891 -0.500233 0.000000
+vn -0.864965 -0.499694 -0.046264
+vn -0.863810 -0.499022 -0.069341
+vn -0.608435 -0.793604 0.000000
+vn -0.607419 -0.793149 -0.044239
+vn -0.606266 -0.792515 -0.066043
+vn 0.030470 -0.999536 0.000000
+vn 0.031549 -0.998760 -0.038505
+vn 0.032621 -0.997795 -0.057794
+vn 0.316691 -0.948529 0.000000
+vn 0.530133 -0.846344 -0.051588
+vn 0.631845 -0.772102 -0.068051
+vn 0.316637 -0.948366 -0.018523
+vn 0.316637 -0.948366 -0.018523
+vn 0.316637 -0.948366 -0.018523
+vn 0.316637 -0.948366 -0.018523
+vn 0.316637 -0.948366 -0.018523
+vn 0.863809 -0.499025 0.069340
+vn 0.863809 -0.499025 0.069340
+vn -0.864965 -0.499694 0.046264
+vn -0.863810 -0.499022 0.069341
+vn -0.607419 -0.793149 0.044240
+vn -0.606266 -0.792515 0.066044
+vn 0.031549 -0.998760 0.038505
+vn 0.032621 -0.997795 0.057794
+vn 0.530133 -0.846344 0.051587
+vn 0.316637 -0.948366 0.018523
+vn 0.316637 -0.948366 0.018523
+vn 0.316637 -0.948366 0.018523
+vn 0.316637 -0.948366 0.018523
+vn 0.316637 -0.948366 0.018523
+vn 0.631845 -0.772102 0.068051
+vn -0.599290 -0.800532 0.000000
+vn -0.746101 -0.646479 0.159366
+vn -0.701104 -0.707070 0.092223
+vn -0.639524 -0.768591 0.016628
+vn -0.624929 -0.780630 0.008978
+vn -0.614770 -0.788659 0.008694
+vn -0.604469 -0.796585 0.008397
+vn -0.848774 -0.450443 0.276919
+vn -0.871169 -0.237734 0.429590
+vn -0.832683 -0.174623 0.525496
+vn -0.828398 -0.010699 0.560038
+vn -0.829863 0.122709 0.544307
+vn -0.794675 0.607035 0.000000
+vn -0.800988 0.598102 -0.026321
+vn -0.783234 0.619693 -0.050241
+vn -0.761361 0.642562 0.086279
+vn -0.769103 0.605752 0.203825
+vn -0.799205 0.578094 0.164555
+vn -0.852670 0.383166 0.355157
+vn -0.731224 -0.682137 0.000000
+vn -0.732744 -0.680135 0.022424
+vn -0.637954 -0.769966 0.012870
+vn -0.635658 -0.771970 0.000000
+vn -0.753104 -0.652786 0.081886
+vn -0.646651 -0.762486 0.021393
+vn -0.786793 -0.583571 0.201001
+vn -0.659868 -0.751057 0.022055
+vn -0.737981 -0.668945 0.088861
+vn -0.843100 -0.418041 0.338266
+vn -0.839173 -0.496739 0.221446
+vn -0.849263 -0.269218 0.454175
+vn -0.880395 -0.474241 0.000000
+vn -0.882146 -0.469741 0.034089
+vn -0.882090 -0.440111 0.167985
+vn -0.866349 -0.382375 0.321293
+vn -0.834360 -0.308219 0.456996
+vn -0.808351 -0.219583 0.546216
+vn -0.996828 0.079589 0.000000
+vn -0.996258 0.085400 0.013287
+vn -0.991315 0.062658 0.115625
+vn -0.949413 0.021307 0.313306
+vn -0.866786 0.010319 0.498573
+vn -0.817925 0.000263 0.575325
+vn -0.843462 0.537189 0.000000
+vn -0.844250 0.535541 -0.020928
+vn -0.850533 0.525541 -0.019988
+vn -0.854246 0.493154 0.164505
+vn -0.835439 0.426097 0.347106
+vn -0.851671 0.327905 0.408821
+vn -0.746101 -0.646479 -0.159366
+vn -0.701104 -0.707070 -0.092223
+vn -0.639524 -0.768591 -0.016628
+vn -0.624929 -0.780630 -0.008978
+vn -0.614770 -0.788659 -0.008694
+vn -0.604469 -0.796585 -0.008397
+vn -0.848774 -0.450443 -0.276919
+vn -0.871169 -0.237734 -0.429590
+vn -0.832683 -0.174623 -0.525496
+vn -0.828398 -0.010700 -0.560038
+vn -0.829863 0.122709 -0.544306
+vn -0.800988 0.598102 0.026321
+vn -0.783234 0.619693 0.050241
+vn -0.761361 0.642562 -0.086279
+vn -0.769103 0.605752 -0.203824
+vn -0.799205 0.578094 -0.164555
+vn -0.852670 0.383166 -0.355157
+vn -0.637954 -0.769966 -0.012870
+vn -0.732744 -0.680135 -0.022424
+vn -0.646651 -0.762486 -0.021393
+vn -0.753104 -0.652786 -0.081886
+vn -0.659868 -0.751057 -0.022055
+vn -0.786793 -0.583571 -0.201001
+vn -0.737981 -0.668945 -0.088861
+vn -0.839173 -0.496739 -0.221446
+vn -0.843100 -0.418041 -0.338266
+vn -0.849263 -0.269218 -0.454175
+vn -0.882146 -0.469741 -0.034089
+vn -0.882090 -0.440111 -0.167985
+vn -0.866349 -0.382375 -0.321294
+vn -0.808351 -0.219583 -0.546216
+vn -0.834360 -0.308219 -0.456996
+vn -0.996258 0.085400 -0.013287
+vn -0.991315 0.062658 -0.115625
+vn -0.949413 0.021307 -0.313306
+vn -0.866786 0.010319 -0.498573
+vn -0.817925 0.000263 -0.575325
+vn -0.844250 0.535541 0.020928
+vn -0.850533 0.525541 0.019988
+vn -0.854246 0.493154 -0.164505
+vn -0.835439 0.426097 -0.347106
+vn -0.851671 0.327905 -0.408821
+vn 0.899889 0.432945 0.052521
+vn 0.856173 0.497731 0.138680
+vn 0.791103 0.611683 0.000000
+vn 0.667691 0.742482 0.053937
+vn 0.668249 0.743067 0.035977
+vn 0.668699 0.743533 0.000000
+vn -0.000002 0.998740 0.050186
+vn -0.000001 0.999440 0.033472
+vn 0.000000 1.000000 0.000000
+vn -0.667687 0.742485 0.053937
+vn -0.668247 0.743069 0.035977
+vn -0.668699 0.743534 0.000000
+vn -0.899883 0.432957 0.052521
+vn -0.900576 0.433284 0.035030
+vn -0.901132 0.433546 0.000000
+vn 0.745742 0.666076 0.014508
+vn 0.745742 0.666077 0.014508
+vn 0.745742 0.666077 0.014508
+vn 0.749368 0.661834 0.020592
+vn 0.756462 0.653710 0.020721
+vn 0.860948 0.217589 0.459809
+vn 0.837252 0.472812 0.274696
+vn 0.734903 0.677369 0.032995
+vn 0.705784 0.708104 0.021390
+vn 0.696876 0.716878 0.021209
+vn 0.692231 0.721550 0.013464
+vn 0.692296 0.721613 0.000000
+vn 0.911564 0.326059 0.250473
+vn 0.840178 0.537891 0.069091
+vn 0.809162 0.582337 0.078363
+vn 0.774726 0.631582 0.030066
+vn 0.766343 0.642432 0.000000
+vn 0.916801 0.360119 0.172597
+vn 0.908199 0.414926 0.054881
+vn 0.906833 0.421490 0.000000
+vn 0.858065 0.106377 0.502402
+vn 0.858963 0.110660 0.499938
+vn 0.819652 -0.000090 0.572862
+vn 0.852057 0.033503 0.522376
+vn 0.916174 0.091207 0.390264
+vn 0.943951 0.240171 0.226437
+vn 0.780046 -0.205409 0.591045
+vn 0.826581 -0.186060 0.531173
+vn 0.914503 -0.148473 0.376352
+vn 0.963096 -0.135585 0.232514
+vn 0.979949 -0.142243 0.139520
+vn 0.990415 -0.132297 0.039686
+vn 0.992556 -0.121789 0.000000
+vn 0.752566 -0.437952 0.491775
+vn 0.782666 -0.478388 0.398221
+vn 0.824610 -0.519048 0.224962
+vn 0.850384 -0.517822 0.093312
+vn 0.852950 -0.521538 0.021781
+vn 0.847103 -0.531398 0.005703
+vn 0.846332 -0.532656 -0.000026
+vn 0.733683 -0.551450 0.397004
+vn 0.741600 -0.614900 0.268192
+vn 0.752420 -0.648472 0.115536
+vn 0.802876 -0.593807 0.052761
+vn 0.832290 -0.554339 -0.000828
+vn 0.811583 -0.584236 -0.000855
+vn 0.789837 -0.613316 -0.000052
+vn 0.668249 0.743067 -0.035977
+vn 0.667691 0.742482 -0.053937
+vn 0.899889 0.432945 -0.052521
+vn 0.856173 0.497731 -0.138680
+vn 0.749368 0.661834 -0.020592
+vn 0.745742 0.666077 -0.014508
+vn 0.745742 0.666077 -0.014508
+vn 0.745742 0.666076 -0.014508
+vn 0.756462 0.653709 -0.020721
+vn -0.000002 0.999440 -0.033472
+vn -0.000002 0.998740 -0.050186
+vn -0.668247 0.743069 -0.035977
+vn -0.667688 0.742485 -0.053937
+vn -0.900576 0.433284 -0.035030
+vn -0.899883 0.432957 -0.052521
+vn 0.837252 0.472812 -0.274696
+vn 0.734903 0.677369 -0.032995
+vn 0.705784 0.708104 -0.021390
+vn 0.696876 0.716878 -0.021209
+vn 0.692231 0.721550 -0.013464
+vn 0.911564 0.326058 -0.250473
+vn 0.840178 0.537891 -0.069091
+vn 0.809162 0.582337 -0.078363
+vn 0.774726 0.631582 -0.030066
+vn 0.916801 0.360119 -0.172597
+vn 0.908199 0.414926 -0.054881
+vn 0.860948 0.217589 -0.459809
+vn 0.858065 0.106377 -0.502402
+vn 0.858963 0.110660 -0.499938
+vn 0.819652 -0.000090 -0.572862
+vn 0.852057 0.033503 -0.522376
+vn 0.916174 0.091206 -0.390264
+vn 0.943951 0.240171 -0.226436
+vn 0.780046 -0.205409 -0.591045
+vn 0.826581 -0.186060 -0.531173
+vn 0.914503 -0.148473 -0.376352
+vn 0.963096 -0.135585 -0.232514
+vn 0.979949 -0.142243 -0.139521
+vn 0.990415 -0.132297 -0.039686
+vn 0.752566 -0.437952 -0.491775
+vn 0.782666 -0.478388 -0.398221
+vn 0.824610 -0.519048 -0.224962
+vn 0.850384 -0.517822 -0.093312
+vn 0.852950 -0.521538 -0.021781
+vn 0.847113 -0.531381 -0.005729
+vn 0.733683 -0.551450 -0.397004
+vn 0.741600 -0.614900 -0.268192
+vn 0.752420 -0.648472 -0.115536
+vn 0.802876 -0.593807 -0.052761
+vn 0.832290 -0.554339 0.000828
+vn 0.811606 -0.584205 0.000803
+vn 0.899885 -0.432952 0.052522
+vn 0.899885 -0.432952 0.052522
+vn -0.899880 -0.432964 0.052522
+vn -0.900573 -0.433291 0.035031
+vn -0.901129 -0.433551 0.000000
+vn -0.667692 -0.742481 0.053937
+vn -0.662391 -0.748298 0.035894
+vn -0.656897 -0.753980 0.000000
+vn -0.000002 -0.998740 0.050186
+vn 0.017435 -0.999285 0.033535
+vn 0.034891 -0.999391 0.000000
+vn 0.667695 -0.742478 0.053937
+vn 0.571935 -0.819251 0.041448
+vn 0.371709 -0.928349 0.000000
+vn 0.371656 -0.928221 0.016665
+vn 0.371656 -0.928221 0.016665
+vn 0.371656 -0.928221 0.016665
+vn 0.371656 -0.928221 0.016665
+vn 0.371656 -0.928221 0.016665
+vn 0.899886 -0.432952 -0.052522
+vn 0.899886 -0.432952 -0.052522
+vn -0.900573 -0.433291 -0.035030
+vn -0.899880 -0.432964 -0.052521
+vn -0.662391 -0.748298 -0.035894
+vn -0.667692 -0.742481 -0.053937
+vn 0.017436 -0.999285 -0.033535
+vn -0.000002 -0.998740 -0.050186
+vn 0.571936 -0.819251 -0.041448
+vn 0.667696 -0.742478 -0.053937
+vn 0.371658 -0.928220 -0.016666
+vn 0.371658 -0.928220 -0.016666
+vn 0.371658 -0.928220 -0.016666
+vn 0.371658 -0.928220 -0.016666
+vn 0.371658 -0.928220 -0.016666
+vn -0.810598 -0.571899 -0.125946
+vn -0.671909 -0.740634 0.000000
+vn -0.676822 -0.736115 -0.006880
+vn -0.686547 -0.727051 -0.007096
+vn -0.696070 -0.717936 -0.007308
+vn -0.711311 -0.702701 -0.015763
+vn -0.769270 -0.634467 -0.075335
+vn -0.901669 -0.372819 -0.219088
+vn -0.926116 -0.140148 -0.350239
+vn -0.894138 -0.025648 -0.447056
+vn -0.849984 0.197430 -0.488415
+vn -0.799637 0.422898 -0.426307
+vn -0.769309 0.523922 -0.365608
+vn -0.773996 0.567145 -0.281562
+vn -0.794400 0.581001 -0.177106
+vn -0.856674 0.505719 -0.101775
+vn -0.892452 0.450398 -0.025896
+vn -0.873738 0.486256 -0.011750
+vn -0.852481 0.522758 0.000100
+vn -0.911564 -0.326059 -0.250473
+vn -0.840179 -0.537891 -0.069091
+vn -0.756334 -0.653470 -0.030582
+vn -0.809162 -0.582336 -0.078362
+vn -0.715983 -0.697874 -0.018436
+vn -0.729177 -0.684069 -0.018707
+vn -0.774726 -0.631581 -0.030066
+vn -0.706759 -0.707375 -0.010600
+vn -0.766343 -0.642432 0.000000
+vn -0.704436 -0.709768 0.000000
+vn -0.916801 -0.360119 -0.172597
+vn -0.908199 -0.414926 -0.054881
+vn -0.906833 -0.421490 0.000000
+vn -0.866689 -0.449486 -0.216360
+vn -0.895961 -0.127966 -0.425297
+vn -0.887493 -0.046300 -0.458490
+vn -0.916174 -0.091207 -0.390264
+vn -0.943952 -0.240171 -0.226436
+vn -0.859350 0.181510 -0.478092
+vn -0.914503 0.148472 -0.376352
+vn -0.963096 0.135585 -0.232513
+vn -0.979949 0.142243 -0.139521
+vn -0.990415 0.132297 -0.039686
+vn -0.992556 0.121789 0.000000
+vn -0.808768 0.451110 -0.377352
+vn -0.839214 0.480655 -0.254345
+vn -0.873936 0.471628 -0.117490
+vn -0.882413 0.469161 -0.035134
+vn -0.876459 0.481327 -0.011994
+vn -0.874376 0.485250 0.000050
+vn -0.810598 -0.571899 0.125945
+vn -0.676822 -0.736115 0.006880
+vn -0.686547 -0.727051 0.007096
+vn -0.696070 -0.717936 0.007308
+vn -0.711311 -0.702701 0.015763
+vn -0.769270 -0.634467 0.075335
+vn -0.901669 -0.372819 0.219088
+vn -0.926116 -0.140148 0.350239
+vn -0.894138 -0.025648 0.447056
+vn -0.849984 0.197430 0.488415
+vn -0.799637 0.422898 0.426307
+vn -0.769309 0.523922 0.365608
+vn -0.773996 0.567145 0.281563
+vn -0.794400 0.581001 0.177106
+vn -0.856674 0.505720 0.101775
+vn -0.892452 0.450398 0.025897
+vn -0.873779 0.486178 0.011850
+vn -0.756334 -0.653470 0.030582
+vn -0.840179 -0.537891 0.069091
+vn -0.911564 -0.326059 0.250473
+vn -0.729177 -0.684069 0.018707
+vn -0.715983 -0.697874 0.018436
+vn -0.809162 -0.582336 0.078362
+vn -0.706759 -0.707375 0.010600
+vn -0.774726 -0.631581 0.030066
+vn -0.908199 -0.414926 0.054881
+vn -0.916801 -0.360119 0.172597
+vn -0.866689 -0.449486 0.216360
+vn -0.895961 -0.127966 0.425297
+vn -0.887493 -0.046300 0.458490
+vn -0.916174 -0.091207 0.390264
+vn -0.943952 -0.240171 0.226436
+vn -0.859350 0.181510 0.478092
+vn -0.914503 0.148472 0.376352
+vn -0.963096 0.135585 0.232513
+vn -0.979949 0.142243 0.139521
+vn -0.990415 0.132297 0.039686
+vn -0.808768 0.451110 0.377352
+vn -0.839213 0.480655 0.254345
+vn -0.873936 0.471628 0.117490
+vn -0.882413 0.469161 0.035134
+vn -0.876480 0.481288 0.012044
+vn 0.738347 0.674421 0.000000
+vn 0.806153 0.567767 -0.166608
+vn 0.863896 0.499132 -0.067458
+vn 0.619226 0.785213 0.000000
+vn 0.618594 0.784508 -0.043454
+vn 0.617817 0.783620 -0.065133
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.999305 -0.037285
+vn -0.000001 0.998436 -0.055898
+vn -0.619244 0.785198 0.000000
+vn -0.618602 0.784502 -0.043455
+vn -0.617815 0.783622 -0.065133
+vn -0.865872 0.500266 0.000000
+vn -0.864990 0.499766 -0.045006
+vn -0.863892 0.499140 -0.067459
+vn 0.695043 0.718593 -0.023226
+vn 0.689718 0.723710 -0.023093
+vn 0.687022 0.726417 -0.017881
+vn 0.687022 0.726417 -0.017881
+vn 0.687022 0.726417 -0.017878
+vn 0.624714 0.780853 0.000000
+vn 0.624471 0.780885 -0.015951
+vn 0.628239 0.777647 -0.024117
+vn 0.636747 0.770679 -0.024639
+vn 0.717673 0.690581 -0.089681
+vn 0.800177 0.525367 -0.289320
+vn 0.787284 0.290410 -0.543917
+vn 0.731224 0.682137 0.000000
+vn 0.732755 0.680143 -0.021814
+vn 0.753271 0.652862 -0.079712
+vn 0.787727 0.584035 -0.195933
+vn 0.845671 0.419171 -0.330358
+vn 0.806306 0.264556 -0.529037
+vn 0.777431 0.225586 -0.587122
+vn 0.880395 0.474242 0.000000
+vn 0.882174 0.469754 -0.033162
+vn 0.882771 0.440367 -0.163686
+vn 0.868778 0.383372 -0.313451
+vn 0.838973 0.309714 -0.447438
+vn 0.764875 0.224491 -0.603796
+vn 0.738142 0.182045 -0.649620
+vn 0.996828 -0.079588 0.000000
+vn 0.996263 -0.085397 -0.012925
+vn 0.991668 -0.062376 -0.112711
+vn 0.951868 -0.021112 -0.305780
+vn 0.872481 -0.010318 -0.488540
+vn 0.779498 0.023999 -0.625944
+vn 0.741302 0.058701 -0.668599
+vn 0.810684 -0.585484 0.000000
+vn 0.811350 -0.584049 0.024432
+vn 0.820129 -0.571417 0.029518
+vn 0.829589 -0.541693 -0.135462
+vn 0.819375 -0.485373 -0.305022
+vn 0.829011 -0.352148 -0.434433
+vn 0.754667 -0.037342 -0.655044
+vn 0.718556 -0.695469 0.000000
+vn 0.725325 -0.687595 0.033425
+vn 0.709570 -0.701311 0.068364
+vn 0.690571 -0.722559 -0.031951
+vn 0.702443 -0.701413 -0.120804
+vn 0.726916 -0.682805 -0.073285
+vn 0.825351 -0.413141 -0.384851
+vn 0.687022 0.726417 0.017881
+vn 0.687022 0.726417 0.017881
+vn 0.689718 0.723710 0.023093
+vn 0.695043 0.718593 0.023226
+vn 0.806153 0.567767 0.166608
+vn 0.618594 0.784508 0.043455
+vn 0.687022 0.726417 0.017878
+vn 0.617817 0.783619 0.065133
+vn 0.863896 0.499131 0.067460
+vn 0.000000 0.999305 0.037285
+vn -0.000001 0.998436 0.055898
+vn -0.618602 0.784502 0.043455
+vn -0.617814 0.783622 0.065134
+vn -0.864990 0.499766 0.045007
+vn -0.863891 0.499140 0.067461
+vn 0.624471 0.780885 0.015952
+vn 0.628239 0.777647 0.024117
+vn 0.636747 0.770679 0.024639
+vn 0.717673 0.690581 0.089681
+vn 0.800177 0.525367 0.289320
+vn 0.787284 0.290410 0.543917
+vn 0.732755 0.680143 0.021814
+vn 0.753271 0.652862 0.079712
+vn 0.787727 0.584035 0.195933
+vn 0.845671 0.419171 0.330358
+vn 0.806306 0.264556 0.529037
+vn 0.777431 0.225586 0.587122
+vn 0.882174 0.469754 0.033162
+vn 0.882771 0.440367 0.163686
+vn 0.868778 0.383372 0.313451
+vn 0.838973 0.309714 0.447438
+vn 0.764875 0.224490 0.603796
+vn 0.738142 0.182045 0.649620
+vn 0.996263 -0.085397 0.012925
+vn 0.991668 -0.062376 0.112711
+vn 0.951868 -0.021112 0.305780
+vn 0.872481 -0.010318 0.488540
+vn 0.779498 0.023999 0.625944
+vn 0.741302 0.058701 0.668600
+vn 0.811351 -0.584049 -0.024432
+vn 0.820129 -0.571417 -0.029518
+vn 0.829589 -0.541693 0.135462
+vn 0.819375 -0.485373 0.305022
+vn 0.829011 -0.352148 0.434434
+vn 0.754667 -0.037342 0.655044
+vn 0.725325 -0.687595 -0.033425
+vn 0.709570 -0.701311 -0.068364
+vn 0.690571 -0.722559 0.031951
+vn 0.702443 -0.701413 0.120804
+vn 0.726916 -0.682805 0.073285
+vn 0.825351 -0.413141 0.384851
+vn 0.863925 -0.499082 -0.067460
+vn 0.863925 -0.499082 -0.067460
+vn -0.865893 -0.500229 0.000000
+vn -0.865015 -0.499723 -0.045006
+vn -0.863920 -0.499091 -0.067460
+vn -0.608436 -0.793603 0.000000
+vn -0.607457 -0.793186 -0.043037
+vn -0.606349 -0.792599 -0.064251
+vn 0.030471 -0.999536 0.000000
+vn 0.031551 -0.998800 -0.037458
+vn 0.032627 -0.997885 -0.056223
+vn 0.316688 -0.948530 0.000000
+vn 0.530187 -0.846394 -0.050186
+vn 0.631936 -0.772187 -0.066204
+vn 0.316636 -0.948376 -0.018019
+vn 0.316636 -0.948376 -0.018019
+vn 0.316636 -0.948376 -0.018019
+vn 0.316636 -0.948376 -0.018019
+vn 0.316636 -0.948376 -0.018019
+vn 0.863925 -0.499082 0.067460
+vn 0.863925 -0.499082 0.067460
+vn -0.865015 -0.499723 0.045006
+vn -0.863920 -0.499091 0.067460
+vn -0.607457 -0.793186 0.043037
+vn -0.606349 -0.792599 0.064251
+vn 0.031551 -0.998800 0.037458
+vn 0.032626 -0.997885 0.056224
+vn 0.530187 -0.846394 0.050187
+vn 0.316636 -0.948376 0.018019
+vn 0.316636 -0.948376 0.018019
+vn 0.316636 -0.948376 0.018019
+vn 0.316636 -0.948376 0.018019
+vn 0.316636 -0.948376 0.018019
+vn 0.631936 -0.772187 0.066205
+vn -0.599290 -0.800532 0.000000
+vn -0.746611 -0.646922 0.155129
+vn -0.701281 -0.707213 0.089752
+vn -0.639529 -0.768597 0.016175
+vn -0.624930 -0.780632 0.008733
+vn -0.614771 -0.788661 0.008457
+vn -0.604470 -0.796586 0.008169
+vn -0.850655 -0.451033 0.270102
+vn -0.875490 -0.238936 0.420031
+vn -0.838922 -0.175843 0.515063
+vn -0.835471 -0.010815 0.549428
+vn -0.836553 0.123691 0.533741
+vn -0.794675 0.607035 0.000000
+vn -0.801003 0.598112 -0.025605
+vn -0.783288 0.619735 -0.048875
+vn -0.761511 0.642683 0.084027
+vn -0.769960 0.606434 0.198493
+vn -0.799785 0.578517 0.160191
+vn -0.855618 0.383711 0.347394
+vn -0.731224 -0.682137 0.000000
+vn -0.732754 -0.680143 0.021814
+vn -0.637957 -0.769970 0.012520
+vn -0.635659 -0.771970 0.000000
+vn -0.753271 -0.652862 0.079711
+vn -0.646659 -0.762495 0.020811
+vn -0.787727 -0.584035 0.195932
+vn -0.659878 -0.751067 0.021455
+vn -0.738191 -0.669008 0.086614
+vn -0.845671 -0.419171 0.330358
+vn -0.840448 -0.496941 0.216096
+vn -0.853971 -0.270770 0.444317
+vn -0.880395 -0.474242 0.000000
+vn -0.882174 -0.469754 0.033162
+vn -0.882771 -0.440367 0.163685
+vn -0.868777 -0.383372 0.313452
+vn -0.838973 -0.309714 0.447439
+vn -0.814886 -0.221235 0.535739
+vn -0.996828 0.079588 0.000000
+vn -0.996263 0.085397 0.012925
+vn -0.991668 0.062376 0.112711
+vn -0.951868 0.021111 0.305780
+vn -0.872481 0.010318 0.488540
+vn -0.825279 0.000153 0.564726
+vn -0.843462 0.537189 0.000000
+vn -0.844260 0.535547 -0.020359
+vn -0.850544 0.525544 -0.019441
+vn -0.854915 0.493345 0.160407
+vn -0.838262 0.426955 0.339156
+vn -0.855533 0.328568 0.400132
+vn -0.746611 -0.646922 -0.155129
+vn -0.701281 -0.707213 -0.089752
+vn -0.639529 -0.768597 -0.016175
+vn -0.624930 -0.780632 -0.008733
+vn -0.614771 -0.788661 -0.008457
+vn -0.604470 -0.796586 -0.008169
+vn -0.850655 -0.451033 -0.270102
+vn -0.875490 -0.238936 -0.420031
+vn -0.838922 -0.175843 -0.515063
+vn -0.835471 -0.010815 -0.549428
+vn -0.836553 0.123691 -0.533741
+vn -0.801003 0.598112 0.025605
+vn -0.783288 0.619735 0.048875
+vn -0.761511 0.642683 -0.084027
+vn -0.769960 0.606434 -0.198493
+vn -0.799786 0.578517 -0.160191
+vn -0.855618 0.383711 -0.347394
+vn -0.637957 -0.769970 -0.012520
+vn -0.732754 -0.680143 -0.021814
+vn -0.646659 -0.762495 -0.020811
+vn -0.753271 -0.652862 -0.079711
+vn -0.659878 -0.751067 -0.021455
+vn -0.787727 -0.584035 -0.195932
+vn -0.738191 -0.669008 -0.086614
+vn -0.840448 -0.496941 -0.216096
+vn -0.845671 -0.419171 -0.330358
+vn -0.853971 -0.270770 -0.444317
+vn -0.882174 -0.469754 -0.033162
+vn -0.882771 -0.440367 -0.163685
+vn -0.868777 -0.383372 -0.313452
+vn -0.814886 -0.221235 -0.535739
+vn -0.838973 -0.309714 -0.447439
+vn -0.996263 0.085397 -0.012925
+vn -0.991668 0.062376 -0.112711
+vn -0.951868 0.021111 -0.305780
+vn -0.872481 0.010318 -0.488540
+vn -0.825279 0.000153 -0.564726
+vn -0.844260 0.535547 0.020359
+vn -0.850544 0.525544 0.019441
+vn -0.854915 0.493345 -0.160407
+vn -0.838262 0.426955 -0.339156
+vn -0.855533 0.328568 -0.400132
+vn 0.993924 0.089671 0.063831
+vn 0.991388 0.089520 0.095585
+vn 0.951185 -0.294245 0.093093
+vn 0.949761 -0.263276 0.169235
+vn 0.997765 -0.059685 0.030054
+vn 0.997956 -0.059356 0.023660
+vn 0.997550 -0.065796 0.023773
+vn 0.997092 -0.072360 0.023888
+vn 0.991277 -0.131793 0.000000
+vn 0.995962 0.089777 0.000000
+vn 0.997188 -0.067887 0.031734
+vn 0.679311 0.731442 0.059403
+vn 0.677813 0.729831 0.088978
+vn 0.680514 0.732736 0.000000
+vn 0.016056 0.997832 0.063832
+vn 0.016088 0.995291 0.095587
+vn 0.016015 0.999872 0.000000
+vn -0.364558 0.929104 0.062153
+vn -0.363677 0.926862 0.093094
+vn -0.365266 0.930903 0.000000
+vn 0.917270 -0.258315 0.303131
+vn 0.998959 -0.024410 0.038551
+vn 0.999612 0.008824 0.026436
+vn 0.999517 0.016521 0.026336
+vn 0.999675 0.018217 0.017848
+vn 0.999876 0.015741 0.000000
+vn 0.884956 -0.376979 0.273386
+vn 0.981145 -0.177428 0.076642
+vn 0.988508 -0.123689 0.086911
+vn 0.997365 -0.064404 0.033395
+vn 0.998710 -0.050770 0.000000
+vn 0.913828 -0.358465 0.190845
+vn 0.947530 -0.313813 0.060889
+vn 0.951301 -0.308263 0.000000
+vn 0.720988 -0.478886 0.500845
+vn 0.681368 -0.491661 0.542224
+vn 0.685009 -0.489335 0.539734
+vn 0.578949 -0.537358 0.613241
+vn 0.627789 -0.538212 0.562324
+vn 0.720934 -0.547029 0.425456
+vn 0.850335 -0.463283 0.249600
+vn 0.414986 -0.655129 0.631342
+vn 0.464139 -0.677064 0.571104
+vn 0.559696 -0.719904 0.410461
+vn 0.608602 -0.750976 0.256201
+vn 0.619061 -0.770047 0.154245
+vn 0.635383 -0.770942 0.044007
+vn 0.644398 -0.764690 0.000000
+vn 0.245694 -0.811195 0.530657
+vn 0.242252 -0.868554 0.432352
+vn 0.248688 -0.936525 0.247135
+vn 0.270344 -0.957192 0.103429
+vn 0.270056 -0.962541 0.024195
+vn 0.259082 -0.965835 0.006336
+vn 0.257662 -0.966235 -0.000029
+vn 0.159410 -0.887098 0.433181
+vn 0.123609 -0.947670 0.294352
+vn 0.109876 -0.985648 0.128163
+vn 0.184173 -0.981147 0.058577
+vn 0.232618 -0.972568 -0.000920
+vn 0.197099 -0.980383 -0.000950
+vn 0.161376 -0.986893 -0.000058
+vn 0.949760 -0.263276 -0.169235
+vn 0.951185 -0.294245 -0.093093
+vn 0.991388 0.089520 -0.095585
+vn 0.993924 0.089670 -0.063831
+vn 0.997188 -0.067888 -0.031734
+vn 0.997092 -0.072361 -0.023889
+vn 0.997550 -0.065797 -0.023773
+vn 0.997956 -0.059357 -0.023660
+vn 0.997765 -0.059686 -0.030054
+vn 0.677813 0.729831 -0.088978
+vn 0.679311 0.731442 -0.059403
+vn 0.016088 0.995291 -0.095586
+vn 0.016056 0.997832 -0.063831
+vn -0.363677 0.926862 -0.093094
+vn -0.364558 0.929104 -0.062153
+vn 0.917270 -0.258315 -0.303131
+vn 0.998959 -0.024410 -0.038551
+vn 0.999612 0.008824 -0.026436
+vn 0.999517 0.016521 -0.026336
+vn 0.999675 0.018217 -0.017848
+vn 0.981145 -0.177428 -0.076642
+vn 0.884956 -0.376979 -0.273386
+vn 0.988508 -0.123689 -0.086911
+vn 0.997365 -0.064404 -0.033395
+vn 0.947530 -0.313813 -0.060889
+vn 0.913828 -0.358465 -0.190845
+vn 0.720988 -0.478886 -0.500845
+vn 0.685009 -0.489335 -0.539734
+vn 0.681368 -0.491661 -0.542224
+vn 0.627789 -0.538212 -0.562324
+vn 0.578949 -0.537358 -0.613241
+vn 0.720935 -0.547029 -0.425456
+vn 0.850335 -0.463283 -0.249600
+vn 0.464139 -0.677064 -0.571104
+vn 0.414986 -0.655130 -0.631342
+vn 0.559696 -0.719904 -0.410461
+vn 0.608602 -0.750976 -0.256201
+vn 0.619061 -0.770047 -0.154245
+vn 0.635383 -0.770942 -0.044007
+vn 0.242252 -0.868554 -0.432352
+vn 0.245694 -0.811195 -0.530657
+vn 0.248688 -0.936525 -0.247135
+vn 0.270344 -0.957192 -0.103429
+vn 0.270056 -0.962541 -0.024195
+vn 0.259101 -0.965829 -0.006365
+vn 0.123609 -0.947670 -0.294352
+vn 0.159410 -0.887098 -0.433181
+vn 0.109876 -0.985648 -0.128163
+vn 0.184173 -0.981147 -0.058577
+vn 0.232618 -0.972568 0.000920
+vn 0.197137 -0.980376 0.000892
+vn 0.363681 -0.926860 0.093095
+vn 0.363681 -0.926860 0.093095
+vn -0.953481 0.294977 0.062153
+vn -0.951181 0.294258 0.093095
+vn -0.955326 0.295555 0.000000
+vn -0.993197 -0.097487 0.063683
+vn -0.991388 -0.089513 0.095585
+vn -0.994423 -0.105465 0.000000
+vn -0.666429 -0.743190 0.059512
+vn -0.677811 -0.729833 0.088975
+vn -0.654535 -0.756032 0.000000
+vn -0.138441 -0.987639 0.073510
+vn -0.016083 -0.995291 0.095585
+vn -0.359388 -0.933188 0.000000
+vn -0.359231 -0.932778 0.029619
+vn -0.359231 -0.932778 0.029619
+vn -0.359231 -0.932778 0.029619
+vn -0.359231 -0.932778 0.029619
+vn -0.359231 -0.932778 0.029619
+vn 0.363681 -0.926860 -0.093095
+vn 0.363681 -0.926860 -0.093095
+vn -0.951181 0.294258 -0.093095
+vn -0.953481 0.294977 -0.062153
+vn -0.991388 -0.089513 -0.095585
+vn -0.993197 -0.097487 -0.063683
+vn -0.677811 -0.729833 -0.088975
+vn -0.666428 -0.743190 -0.059512
+vn -0.016083 -0.995291 -0.095586
+vn -0.138440 -0.987639 -0.073511
+vn -0.359230 -0.932779 -0.029618
+vn -0.359230 -0.932779 -0.029618
+vn -0.359230 -0.932779 -0.029618
+vn -0.359230 -0.932779 -0.029618
+vn -0.359230 -0.932779 -0.029618
+vn -0.971639 0.185090 -0.147174
+vn -0.995051 -0.099362 0.000000
+vn -0.995892 -0.090233 -0.007566
+vn -0.997348 -0.072341 -0.007999
+vn -0.998441 -0.055175 -0.008410
+vn -0.999456 -0.027640 -0.018014
+vn -0.992159 0.088881 -0.087872
+vn -0.899393 0.362665 -0.244061
+vn -0.763166 0.520128 -0.383463
+vn -0.657767 0.576066 -0.485274
+vn -0.475302 0.703698 -0.528107
+vn -0.291509 0.836741 -0.463559
+vn -0.203996 0.893520 -0.400009
+vn -0.179387 0.933836 -0.309470
+vn -0.186052 0.962782 -0.196051
+vn -0.283313 0.952364 -0.112859
+vn -0.347407 0.937273 -0.028770
+vn -0.309315 0.950870 -0.013055
+vn -0.268903 0.963167 0.000112
+vn -0.998726 0.037141 -0.034171
+vn -0.981145 0.177428 -0.076642
+vn -0.884956 0.376980 -0.273385
+vn -0.999760 -0.006435 -0.020930
+vn -0.999410 -0.027537 -0.020543
+vn -0.988508 0.123690 -0.086912
+vn -0.999002 -0.043098 -0.011742
+vn -0.997365 0.064404 -0.033395
+vn -0.998863 -0.047679 0.000000
+vn -0.998710 0.050770 0.000000
+vn -0.947530 0.313814 -0.060889
+vn -0.913828 0.358464 -0.190846
+vn -0.951301 0.308264 0.000000
+vn -0.933355 0.268960 -0.237716
+vn -0.728648 0.505474 -0.462134
+vn -0.665783 0.556349 -0.497201
+vn -0.720935 0.547028 -0.425456
+vn -0.850335 0.463283 -0.249599
+vn -0.493020 0.699378 -0.517495
+vn -0.559696 0.719904 -0.410461
+vn -0.608602 0.750976 -0.256200
+vn -0.619061 0.770046 -0.154246
+vn -0.635382 0.770943 -0.044006
+vn -0.644397 0.764691 0.000000
+vn -0.280194 0.867283 -0.411476
+vn -0.285188 0.916831 -0.279443
+vn -0.318897 0.938804 -0.130196
+vn -0.327262 0.944127 -0.039028
+vn -0.314663 0.949110 -0.013326
+vn -0.310471 0.950583 0.000056
+vn -0.971639 0.185090 0.147174
+vn -0.992159 0.088881 0.087872
+vn -0.999456 -0.027640 0.018014
+vn -0.998441 -0.055175 0.008410
+vn -0.997348 -0.072341 0.007999
+vn -0.995892 -0.090233 0.007566
+vn -0.899393 0.362665 0.244061
+vn -0.763166 0.520128 0.383463
+vn -0.657767 0.576065 0.485274
+vn -0.475302 0.703698 0.528107
+vn -0.291509 0.836741 0.463559
+vn -0.179386 0.933836 0.309470
+vn -0.203995 0.893520 0.400009
+vn -0.186052 0.962782 0.196051
+vn -0.283313 0.952364 0.112859
+vn -0.347407 0.937273 0.028770
+vn -0.309398 0.950842 0.013167
+vn -0.884956 0.376980 0.273385
+vn -0.981145 0.177428 0.076642
+vn -0.998726 0.037141 0.034171
+vn -0.988508 0.123690 0.086912
+vn -0.999410 -0.027537 0.020543
+vn -0.999760 -0.006435 0.020930
+vn -0.997365 0.064404 0.033395
+vn -0.999002 -0.043098 0.011742
+vn -0.913828 0.358464 0.190846
+vn -0.947530 0.313814 0.060889
+vn -0.933355 0.268960 0.237715
+vn -0.728648 0.505474 0.462134
+vn -0.665783 0.556349 0.497201
+vn -0.720935 0.547028 0.425456
+vn -0.850335 0.463283 0.249599
+vn -0.493020 0.699378 0.517495
+vn -0.559696 0.719904 0.410461
+vn -0.608602 0.750976 0.256200
+vn -0.619061 0.770046 0.154246
+vn -0.635382 0.770943 0.044006
+vn -0.280194 0.867283 0.411476
+vn -0.285188 0.916831 0.279443
+vn -0.318897 0.938804 0.130196
+vn -0.327262 0.944127 0.039028
+vn -0.314704 0.949095 0.013381
+vn -0.642812 0.322219 -0.694958
+vn -0.650165 0.333777 -0.682552
+vn -0.849450 0.041378 -0.526043
+vn -0.842422 0.029896 -0.537988
+vn -0.827539 0.006894 -0.561366
+vn -0.627422 0.298775 -0.719079
+vn -0.811581 -0.016117 -0.584017
+vn -0.611142 0.274958 -0.742229
+vn -0.602686 0.262924 -0.753419
+vn -0.803213 -0.027610 -0.595052
+vn -0.046321 0.717759 -0.694749
+vn -0.053653 0.728221 -0.683239
+vn -0.031609 0.696187 -0.717165
+vn -0.016858 0.673791 -0.738729
+vn -0.009478 0.662301 -0.749178
+vn 0.564162 0.759634 -0.323539
+vn 0.555743 0.770805 -0.311463
+vn 0.580414 0.736503 -0.347393
+vn 0.595837 0.712377 -0.370807
+vn 0.603229 0.699959 -0.382325
+vn 0.784184 0.619398 -0.037437
+vn 0.775833 0.630406 -0.025904
+vn 0.800127 0.596773 -0.060487
+vn 0.815026 0.573381 -0.083465
+vn 0.822075 0.561413 -0.094908
+vn -0.822085 -0.561403 0.094886
+vn -0.815033 -0.573374 0.083450
+vn -0.800130 -0.596770 0.060483
+vn -0.784191 -0.619390 0.037429
+vn -0.775845 -0.630393 0.025889
+vn 0.811581 0.016120 0.584018
+vn 0.803210 0.027611 0.595056
+vn 0.827538 -0.006892 0.561367
+vn 0.842421 -0.029896 0.537989
+vn 0.849450 -0.041377 0.526044
+vn 0.709679 -0.058148 0.702122
+vn 0.602687 -0.262921 0.753420
+vn 0.889941 0.415456 0.188151
+vn 0.892509 -0.223533 0.391742
+vn 0.629453 -0.354577 0.691422
+vn -0.223873 -0.683965 0.694315
+vn 0.009484 -0.662297 0.749182
+vn -0.625676 -0.722287 0.294671
+vn -0.207820 -0.882913 0.421040
+vn -0.015531 -0.752037 0.658938
+vn -0.602513 -0.710136 0.364260
+vn -0.603235 -0.699957 0.382319
+vn -0.601723 -0.729113 0.326073
+vn -0.594215 -0.749427 0.292008
+vn -0.586599 -0.760692 0.277938
+vn 0.102923 -0.952597 0.286295
+vn -0.718606 -0.668081 0.193064
+vn -0.783697 -0.600587 0.158477
+vn -0.701348 -0.686166 0.193102
+vn -0.736019 -0.651153 0.185138
+vn -0.724907 -0.663690 0.184459
+vn -0.722846 -0.660000 0.204680
+vn -0.617182 -0.211719 0.757800
+vn -0.616660 0.061761 0.784803
+vn -0.260879 -0.304354 0.916139
+vn -0.442996 -0.518355 0.731480
+vn -0.447647 -0.175289 0.876861
+vn -0.629808 0.045048 0.775443
+vn -0.402821 -0.459036 0.791847
+vn 0.095227 -0.947330 -0.305775
+vn 0.140687 -0.977049 -0.159942
+vn 0.338509 -0.940657 -0.023994
+vn -0.938729 -0.318623 -0.131408
+vn -0.883564 -0.452435 -0.120904
+vn -0.851603 -0.511546 -0.114423
+vn -0.845397 -0.521171 -0.116980
+vn -0.857481 -0.498418 -0.127696
+vn -0.875425 -0.469677 -0.114172
+vn -0.873974 -0.241441 -0.421754
+vn -0.837168 -0.269334 -0.476035
+vn -0.926765 -0.199398 -0.318352
+vn -0.878921 -0.300919 -0.370061
+vn -0.851871 -0.357230 -0.383017
+vn -0.832390 -0.384968 -0.398656
+vn 0.873111 0.157976 0.461216
+vn 0.744340 0.292281 0.600441
+vn 0.819560 0.359560 0.446136
+vn 0.764305 0.374954 0.524641
+vn 0.864151 0.315618 0.391954
+vn 0.954311 0.086140 0.286130
+vn 0.978318 0.164080 0.126383
+vn 0.891798 0.426135 0.152003
+vn 0.853511 0.511445 0.099717
+vn 0.828453 0.545351 0.127506
+vn 0.835750 0.409742 0.365560
+vn 0.833345 0.511746 0.208932
+# 2372 vertices
+
+# 0 vertex parms
+
+# 0 texture vertices
+
+# 3377 normals
+
+g mast2
+s 1
+f 15//188 16//189 2//187 1//186
+s 2
+f 16//204 17//205 3//203 2//202
+s 3
+f 17//220 18//221 4//219 3//218
+s 4
+f 18//236 19//237 5//235 4//234
+s 5
+f 19//254 20//255 6//251 5//250
+f 20//255 21//256 7//252 6//251
+f 21//256 22//257 8//253 7//252
+s 6
+f 22//296 23//297 9//295 8//294
+s 7
+f 23//312 24//313 10//311 9//310
+s 8
+f 24//328 25//329 11//327 10//326
+s 9
+f 25//344 26//345 12//343 11//342
+s 10
+f 26//360 27//361 13//359 12//358
+s 11
+f 27//376 28//377 14//375 13//374
+s 1
+f 47//194 48//195 34//193 33//192
+s 2
+f 48//208 49//209 35//207 34//206
+s 3
+f 49//224 50//225 36//223 35//222
+s 4
+f 50//240 51//241 37//239 36//238
+s 5
+f 51//262 52//263 38//259 37//258
+f 52//263 53//264 39//260 38//259
+f 53//264 54//265 40//261 39//260
+s 6
+f 54//300 55//301 41//299 40//298
+s 7
+f 55//316 56//317 42//315 41//314
+s 8
+f 56//332 57//333 43//331 42//330
+s 9
+f 57//348 58//349 44//347 43//346
+s 10
+f 58//364 59//365 45//363 44//362
+s 11
+f 59//382 60//383 46//381 45//380
+s 1
+f 61//196 62//197 48//195 47//194
+s 2
+f 62//210 63//211 49//209 48//208
+s 3
+f 63//226 64//227 50//225 49//224
+s 4
+f 64//242 65//243 51//241 50//240
+s 5
+f 65//266 66//267 52//263 51//262
+f 66//267 90//275 67//268 53//264 52//263
+f 67//268 68//269 54//265 53//264
+s 6
+f 68//302 69//303 55//301 54//300
+s 7
+f 69//318 70//319 56//317 55//316
+s 8
+f 70//334 71//335 57//333 56//332
+s 9
+f 71//350 72//351 58//349 57//348
+s 10
+f 72//366 73//367 59//365 58//364
+s 11
+f 73//384 74//385 60//383 59//382
+s 1
+f 75//198 76//199 62//197 61//196
+s 2
+f 76//212 77//213 63//211 62//210
+s 3
+f 77//228 78//229 64//227 63//226
+s 4
+f 78//244 79//245 65//243 64//242
+s 5
+f 79//270 80//271 92//277 91//276 66//267 65//266
+s off
+f 100//1 99//1 102//1 101//1
+s 5
+f 81//272 82//273 68//269 67//268
+s 6
+f 82//304 83//305 69//303 68//302
+s 7
+f 83//320 84//321 70//319 69//318
+s 8
+f 84//336 85//337 71//335 70//334
+s 9
+f 85//352 86//353 72//351 71//350
+s 10
+f 86//368 87//369 73//367 72//366
+s 11
+f 87//386 88//387 74//385 73//384
+s 1
+f 1//186 2//187 76//199 75//198
+s 2
+f 2//202 3//203 77//213 76//212
+s 3
+f 3//218 4//219 78//229 77//228
+s 4
+f 4//234 5//235 79//245 78//244
+s 5
+f 5//250 6//251 80//271 79//270
+f 6//251 7//252 81//272 89//274 80//271
+f 7//252 8//253 82//273 81//272
+s 6
+f 8//294 9//295 83//305 82//304
+s 7
+f 9//310 10//311 84//321 83//320
+s 8
+f 10//326 11//327 85//337 84//336
+s 9
+f 11//342 12//343 86//353 85//352
+s 10
+f 12//358 13//359 87//369 86//368
+s 11
+f 13//374 14//375 88//387 87//386
+s off
+f 61//2 47//2 33//2 31//2 29//2 15//2 1//2 75//2
+f 30//3 32//3 46//3 60//3 74//3 88//3 14//3 28//3
+s 5
+f 89//274 81//272 67//268 90//275 94//279 93//278
+s off
+f 96//4 95//4 98//4 97//4
+f 104//5 103//5 106//5 105//5
+f 95//6 96//6 94//6 90//6
+f 96//7 97//7 91//7 94//7
+f 97//8 98//8 66//8 91//8
+f 98//9 95//9 90//9 66//9
+f 99//10 100//10 92//10 80//10
+f 100//11 101//11 93//11 92//11
+f 101//12 102//12 89//12 93//12
+f 102//13 99//13 80//13 89//13
+f 103//14 104//14 91//14 92//14
+f 104//15 105//15 94//15 91//15
+f 105//16 106//16 93//16 94//16
+f 106//17 103//17 92//17 93//17
+g keel
+s 21
+f 108//391 107//390 110//393 109//392
+f 110//393 107//390 112//395 111//394
+f 111//394 112//395 114//397 113//396
+f 113//396 114//397 116//399 115//398
+f 115//398 116//399 118//401 117//400
+f 117//400 118//401 120//403 119//402
+f 119//402 120//403 122//405 121//404
+f 121//404 122//405 124//407 123//406
+f 127//410 126//409 125//408 128//411
+f 127//410 128//411 130//413 129//412
+f 129//412 130//413 132//415 131//414
+f 131//414 132//415 134//417 133//416
+f 133//416 134//417 136//419 135//418
+f 135//418 136//419 138//421 137//420
+f 137//420 138//421 140//423 139//422
+f 139//422 140//423 142//425 141//424
+g hull
+f 141//424 142//425 144//427 143//426
+s 25
+f 143//447 144//448 146//450 145//449
+s 26
+f 145//453 146//454 148//456 147//455
+s 23
+f 147//477 148//478 150//480 149//479
+g keel
+f 151//481 110//460 111//461 152//482
+f 152//482 111//461 113//462 153//483
+f 153//483 113//462 115//463 154//484
+f 154//484 115//463 117//464 155//485
+f 155//485 117//464 119//465 156//486
+f 156//486 119//465 121//466 157//487
+f 157//487 121//466 123//467 158//488
+f 158//488 123//467 126//468 159//489
+f 159//489 126//468 127//469 160//490
+f 160//490 127//469 129//470 161//491
+f 161//491 129//470 131//471 162//492
+f 162//492 131//471 133//472 163//493
+f 163//493 133//472 135//473 164//494
+f 164//494 135//473 137//474 165//495
+f 165//495 137//474 139//475 166//496
+f 139//475 141//476 166//496
+f 151//481 222//552 109//459 110//460
+f 222//552 151//481 224//554 223//553
+f 223//553 224//554 226//556 225//555
+f 225//555 226//556 228//558 227//557
+f 227//557 228//558 230//560 229//559
+f 534//798 229//559 230//560 232//562 231//561
+g hull
+s 30
+f 224//906 151//901 167//902 233//912
+f 233//912 167//902 180//903 234//913
+f 180//903 194//904 234//913
+f 194//904 208//905 235//914 234//913
+f 234//913 235//914 236//915 233//912
+f 233//912 236//915 226//907 224//906
+f 228//908 226//907 236//915 237//916
+f 237//916 236//915 235//914 238//917
+f 238//917 235//914 208//905 239//918
+f 230//909 228//908 237//916 240//919
+f 237//916 241//920 240//919
+f 242//921 241//920 237//916 238//917
+f 238//917 243//922 242//921
+f 244//923 243//922 238//917 239//918
+g keel
+s 22
+f 229//1020 245//1021 246//1022 227//1019
+f 225//1018 247//1023 248//1024 223//1017
+f 223//1017 248//1024 249//1025 222//1016
+f 222//1016 249//1025 108//1014 109//1015
+f 227//1019 246//1022 247//1023 225//1018
+g hull
+s 23
+f 193//523 164//494 165//495 250//565
+f 250//565 165//495 166//496 251//566
+f 166//496 141//476 251//566
+f 251//566 252//567 250//565
+f 250//565 252//567 207//537 193//523
+f 221//551 207//537 252//567 253//568
+f 221//551 253//568 255//570 254//569
+s 24
+f 141//1035 256//1043 257//1044 251//1039
+f 251//1039 257//1044 258//1045 252//1040
+f 252//1040 258//1045 259//1046 253//1041
+f 141//1035 143//1036 256//1043
+f 143//1036 145//1037 256//1043
+s 23
+f 254//569 255//570 261//576 260//575
+f 260//575 261//576 263//578 262//577
+s 33
+f 262//1051 263//1052 265//1054 264//1053
+s 23
+f 536//800 265//580 259//574 537//801
+s 24
+f 263//1048 261//1047 255//1042 253//1041 259//1046 265//1049
+s 23
+f 537//801 259//574 258//573 538//802
+f 258//573 257//572 538//802
+f 271//586 270//585 266//581 272//587
+f 272//587 266//581 267//582 273//588
+f 273//588 267//582 268//583 274//589
+f 274//589 268//583 269//584 275//590
+f 276//591 147//477 149//479
+s 24
+f 145//1037 147//1038 276//1050 256//1043
+s 23
+f 256//571 276//591 269//584 257//572
+f 269//584 276//591 149//479 275//590
+g deck
+s off
+f 278//18 277//18 279//18
+s 23
+f 279//594 280//595 282//597 281//596
+f 284//599 283//598 286//601 285//600
+s off
+f 285//19 287//19 284//19
+s 23
+f 287//602 289//604 288//603
+f 290//605 289//604 287//602 285//600
+f 291//606 290//605 285//600 286//601 293//608 292//607
+g hull
+f 275//590 279//594 281//596 274//589
+f 288//603 273//588 274//589 281//596
+f 254//569 260//575 295//610 294//609
+f 294//609 295//610 297//612 296//611
+f 296//611 297//612 299//614 298//613
+f 301//616 300//615 303//618 302//617
+f 302//617 303//618 305//620 304//619
+f 304//619 305//620 307//622 306//621
+f 307//622 308//623 306//621
+f 306//621 308//623 310//625 309//624
+f 310//625 311//626 309//624
+f 309//624 311//626 313//628 312//627
+f 313//628 314//629 312//627
+f 312//627 314//629 316//631 315//630
+f 315//630 316//631 318//633 317//632
+f 317//632 318//633 320//635 319//634
+f 301//616 298//613 299//614 300//615
+f 260//575 262//577 321//636 295//610
+f 322//637 321//636 262//577 264//579
+f 297//612 295//610 321//636 323//638
+f 323//638 321//636 322//637 324//639
+f 324//639 322//637 326//641 325//640
+f 324//639 328//643 329//644 323//638
+f 323//638 329//644 299//614 297//612
+f 300//615 299//614 329//644 330//645
+f 330//645 329//644 328//643 331//646
+f 328//643 332//647 331//646
+f 328//643 324//639 325//640 332//647
+f 325//640 327//642 332//647
+g rig
+s off
+f 332//20 327//20 334//20 333//20
+f 334//21 327//21 335//21 336//21
+s 23
+f 337//652 333//648 334//649
+f 337//652 338//653 342//657 330//645
+s off
+f 342//22 338//22 343//22
+g hull
+s 23
+f 342//657 343//658 345//660 344//659
+g rig
+s off
+f 339//23 345//23 343//23 338//23
+f 339//24 344//24 345//24
+s 23
+f 346//661 344//659 339//654 340//655
+s off
+f 340//25 347//25 346//25
+f 348//26 347//26 340//26 341//26
+g hull
+s 23
+f 348//663 346//661 347//662
+f 346//661 348//663 350//665 349//664
+g rig
+s off
+f 330//27 331//27 337//27
+f 332//28 333//28 337//28 331//28
+f 336//29 335//29 348//29 341//29
+g hull
+s 23
+f 330//645 342//657 344//659 346//661 303//618 300//615
+f 349//664 305//620 303//618 346//661
+f 351//666 352//667 353//668 350//665
+f 350//665 353//668 354//669 349//664
+f 349//664 354//669 307//622 305//620
+f 307//622 354//669 355//670
+g rig
+f 307//622 356//671 357//672 308//623
+f 310//625 358//673 359//674 311//626
+f 313//628 360//675 361//676 314//629
+g hull
+f 362//677 310//625 308//623 363//678
+f 313//628 311//626 365//680 364//679
+f 314//629 367//682 366//681
+g rig
+f 360//675 368//683 371//686 361//676
+g hull
+f 353//668 352//667 373//688 372//687
+f 373//688 374//689 372//687
+f 374//689 375//690 372//687
+f 374//689 376//691 375//690
+g rig
+s off
+f 355//30 356//30 307//30
+f 353//31 369//31 370//31 354//31
+f 308//32 357//32 363//32
+f 358//33 362//33 363//33 357//33
+f 310//34 362//34 358//34
+f 360//35 313//35 364//35
+f 539//36 540//36 369//36 353//36 372//36 368//36
+f 367//37 314//37 361//37
+f 371//38 366//38 367//38 361//38
+f 368//39 372//39 366//39 371//39
+f 311//40 359//40 365//40
+f 360//41 364//41 365//41 359//41
+g hull
+s 23
+f 314//629 366//681 377//692 316//631
+f 378//693 377//692 366//681 372//687
+f 377//692 378//693 379//694
+f 377//692 379//694 381//696 380//695
+f 381//696 382//697 380//695
+f 380//695 382//697 384//699 383//698
+f 380//695 383//698 320//635 318//633
+f 380//695 318//633 316//631 377//692
+g rig
+f 379//694 378//693 386//701 385//700
+f 386//701 392//707 391//706
+f 387//702 388//703 382//697 381//696
+g hull
+f 378//693 394//709 393//708
+f 375//690 376//691 395//710 394//709
+f 397//712 396//711 381//696 379//694
+f 395//710 376//691 399//714 398//713
+f 399//714 400//715 398//713
+g rig
+s off
+f 386//42 378//42 393//42
+f 381//43 396//43 387//43
+f 385//44 397//44 379//44
+f 397//45 385//45 387//45 396//45
+f 394//46 392//46 386//46 393//46
+f 395//47 391//47 392//47 394//47
+f 391//48 395//48 398//48 390//48
+f 401//49 389//49 390//49 398//49
+f 388//50 389//50 401//50 402//50
+f 388//51 402//51 382//51
+g hull
+s 23
+f 394//709 378//693 372//687 375//690
+f 402//717 401//716 384//699 382//697
+f 398//713 403//718 384//699 401//716
+f 403//718 398//713 400//715 404//719
+f 403//718 404//719 406//721 405//720
+f 406//721 404//719 408//723 407//722
+s 45
+f 407//1056 408//1057 410//1059 409//1058
+f 411//1060 412//1061 409//1058
+s 23
+f 407//722 412//727 413//728 406//721
+f 406//721 413//728 414//729 405//720
+s 45
+f 411//1060 409//1058 416//1063 415//1062
+f 415//1062 416//1063 418//1065 417//1064
+f 417//1064 418//1065 420//1067 419//1066
+f 419//1066 420//1067 422//1069 421//1068
+f 421//1068 422//1069 424//1071 423//1070
+s 23
+f 421//733 423//734 425//735 419//732
+f 419//732 425//735 427//737 426//736
+f 426//736 427//737 429//739 428//738
+f 431//741 430//740 433//743 432//742
+f 431//741 432//742 435//745 434//744
+f 434//744 435//745 414//729 413//728
+f 415//730 434//744 413//728 412//727 411//726
+f 428//738 415//730 417//731 426//736
+f 417//731 419//732 426//736
+f 384//699 436//746 437//747 383//698
+f 383//698 437//747 438//748 320//635
+f 438//748 439//749 320//635
+f 428//738 429//739 430//740 431//741
+f 431//741 434//744 415//730 428//738
+f 535//799 244//564 239//563 439//749
+f 319//634 320//635 439//749 239//563
+g aft
+f 440//750 403//718 405//720 441//751
+f 441//751 405//720 414//729 442//752
+f 442//752 414//729 435//745 443//753
+f 443//753 435//745 432//742 444//754
+f 447//756 446//755 448//757 444//754
+f 444//754 448//757 449//758 443//753
+f 443//753 449//758 450//759 442//752
+f 442//752 450//759 451//760 441//751
+f 441//751 451//760 452//761 440//750
+f 440//750 452//761 454//763 453//762
+f 440//750 453//762 384//699 403//718
+s 51
+f 384//1094 453//1099 455//1101 436//1095
+f 456//1102 455//1101 453//1099 454//1100
+g windows
+f 456//1102 454//1100 452//1098 451//1097
+f 456//1102 451//1097 450//1096 457//1103
+s 30
+f 457//929 450//928 449//927 458//930
+f 458//930 449//927 448//926 459//931
+f 459//931 448//926 446//925 460//932
+g aft
+f 459//931 460//932 462//934 461//933
+f 461//933 463//935 459//931
+f 459//931 463//935 464//936 458//930
+f 464//936 465//937 458//930
+s 51
+f 466//1104 455//1101 456//1102 457//1103
+s 49
+f 436//1110 455//1114 467//1115 437//1111
+s 51
+f 467//1105 455//1101 466//1104 468//1106
+f 469//1107 467//1105 468//1106 471//1109 470//1108
+s 49
+f 437//1111 467//1115 469//1116 438//1112
+f 469//1116 470//1117 439//1113 438//1112
+g hull
+s 23
+f 244//564 535//799 485//764
+s 30
+f 473//943 472//942 475//945 474//944
+g aft
+f 465//937 464//936 477//947 476//946
+f 476//946 477//947 242//921 243//922
+g hull
+f 479//949 478//948 481//951 480//950
+g aft
+f 463//935 461//933 483//953 482//952
+f 466//938 484//954 485//955 468//939
+f 457//929 484//954 466//938
+f 457//929 458//930 465//937 484//954
+f 482//952 483//953 240//919 241//920
+s off
+f 464//52 463//52 478//52 479//52
+s 56
+f 463//1119 482//1122 481//1121 478//1120
+f 241//1118 481//1121 482//1122
+g hull
+s 30
+f 481//951 241//920 242//921 480//950
+g aft
+s 55
+f 477//1125 464//1124 479//1126 480//1127
+s 54
+f 476//1132 243//1128 475//1131
+f 472//1130 465//1129 476//1132 475//1131
+s 30
+f 484//954 465//937 472//942 473//943
+g hull
+f 475//945 243//922 244//923 474//944
+s 53
+f 244//1133 485//1137 474//1135
+g aft
+f 485//1137 484//1136 473//1134 474//1135
+g keel
+s 22
+f 486//1026 245//1021 229//1020 534//1027
+g aft
+s 31
+f 486//1141 534//1143 231//1138 461//1139 462//1140
+f 487//1142 461//1139 231//1138
+g hull
+s 30
+f 231//910 232//911 488//957 487//956
+g aft
+s 57
+f 483//1150 488//1152 240//1148
+g hull
+s 30
+f 488//957 232//911 230//909 240//919
+s 45
+f 422//1069 489//1073 424//1071
+f 489//1073 422//1069 420//1067 490//1074
+f 490//1074 420//1067 418//1065 491//1075
+f 491//1075 418//1065 416//1063 492//1076
+f 492//1076 416//1063 409//1058 445//1072
+f 445//1072 409//1058 494//1078 493//1077
+g deck
+s 58
+f 493//1153 494//1154 495//1155 497//1157 496//1156
+s off
+f 497//53 495//53 499//53 498//53
+f 498//54 500//54 497//54
+s 59
+f 497//1162 500//1163 501//1164 496//1161
+s 60
+f 499//1168 502//1171 503//1172 498//1167
+f 500//1169 498//1167 503//1172 504//1173 501//1170
+g hull
+s 44
+f 408//1183 404//1182 505//1185 410//1184
+f 505//1185 404//1182 400//1181 506//1186
+f 506//1186 400//1181 399//1180 507//1187
+f 507//1187 399//1180 376//1179 508//1188
+s 23
+f 508//772 376//691 374//689 509//773
+f 509//773 374//689 373//688 510//774
+f 511//775 352//667 351//666 512//776
+f 512//776 351//666 514//778 513//777
+f 513//777 514//778 516//780 515//779
+f 270//585 271//586 518//782 517//781 520//784 519//783
+g deck
+s off
+f 502//55 521//55 522//55 503//55
+f 522//56 523//56 503//56
+s 23
+f 525//789 524//788 523//787 522//786
+f 525//789 522//786 521//785 527//791 526//790
+f 528//792 526//790 527//791 530//794 529//793
+f 529//793 530//794 532//796 531//795
+s off
+f 292//57 529//57 531//57
+s 23
+f 528//792 529//793 292//607 293//608
+f 287//602 288//603 533//797 284//599
+f 283//598 284//599 533//797 281//596 282//597
+g hull
+f 352//667 511//775 510//774 373//688
+f 495//766 410//725 505//769
+f 505//769 506//770 499//767 495//766
+f 507//771 499//767 506//770
+f 508//772 502//768 499//767 507//771
+f 502//768 508//772 509//773 521//785
+f 510//774 521//785 509//773
+f 410//725 495//766 494//765 409//724
+g deck
+s 61
+f 523//1191 524//1192 504//1190 503//1189
+g hull
+s 23
+f 527//791 511//775 512//776 530//794
+f 521//785 510//774 511//775 527//791
+f 512//776 513//777 532//796 530//794
+f 517//781 518//782 515//779 516//780
+f 532//796 513//777 515//779 291//606
+g deck
+s off
+f 292//58 531//58 532//58 291//58
+g hull
+s 23
+f 518//782 291//606 515//779
+f 290//605 291//606 518//782 271//586
+f 167//497 151//481 152//482 168//498
+f 168//498 152//482 153//483 169//499
+f 169//499 153//483 154//484 170//500
+f 170//500 154//484 155//485 171//501
+f 171//501 155//485 156//486 172//502
+f 172//502 156//486 157//487 173//503
+f 173//503 157//487 158//488 174//504
+f 174//504 158//488 159//489 175//505
+f 175//505 159//489 160//490 176//506
+f 176//506 160//490 161//491 177//507
+f 177//507 161//491 162//492 178//508
+f 178//508 162//492 163//493 179//509
+f 163//493 164//494 179//509
+f 180//510 167//497 168//498 181//511
+f 181//511 168//498 169//499 182//512
+f 182//512 169//499 170//500 183//513
+f 183//513 170//500 171//501 184//514
+f 184//514 171//501 172//502 185//515
+f 185//515 172//502 173//503 186//516
+f 186//516 173//503 174//504 187//517
+f 187//517 174//504 175//505 188//518
+f 188//518 175//505 176//506 189//519
+f 189//519 176//506 177//507 190//520
+f 190//520 177//507 178//508 191//521
+f 191//521 178//508 179//509 192//522
+f 192//522 179//509 164//494 193//523
+f 194//524 180//510 181//511 195//525
+f 195//525 181//511 182//512 196//526
+f 196//526 182//512 183//513 197//527
+f 197//527 183//513 184//514 198//528
+f 198//528 184//514 185//515 199//529
+f 199//529 185//515 186//516 200//530
+f 200//530 186//516 187//517 201//531
+f 201//531 187//517 188//518 202//532
+f 202//532 188//518 189//519 203//533
+f 203//533 189//519 190//520 204//534
+f 204//534 190//520 191//521 205//535
+f 205//535 191//521 192//522 206//536
+f 206//536 192//522 193//523 207//537
+f 208//538 194//524 195//525 209//539
+f 209//539 195//525 196//526 210//540
+f 210//540 196//526 197//527 211//541
+f 211//541 197//527 198//528 212//542
+f 212//542 198//528 199//529 213//543
+f 213//543 199//529 200//530 214//544
+f 214//544 200//530 201//531 215//545
+f 215//545 201//531 202//532 216//546
+f 216//546 202//532 203//533 217//547
+f 217//547 203//533 204//534 218//548
+f 218//548 204//534 205//535 219//549
+f 219//549 205//535 206//536 220//550
+f 220//550 206//536 207//537 221//551
+f 239//563 208//538 209//539 319//634
+f 319//634 209//539 210//540 317//632
+f 317//632 210//540 211//541 315//630
+f 315//630 211//541 212//542 312//627
+f 312//627 212//542 213//543 309//624
+f 309//624 213//543 214//544 306//621
+f 306//621 214//544 215//545 304//619
+f 304//619 215//545 216//546 302//617
+f 302//617 216//546 217//547 301//616
+f 301//616 217//547 218//548 298//613
+f 298//613 218//548 219//549 296//611
+f 296//611 219//549 220//550 294//609
+f 294//609 220//550 221//551 254//569
+f 348//663 335//650 516//780 514//778
+f 519//783 520//784 327//642 325//640
+f 326//641 266//581 270//585
+f 517//781 335//650 327//642 520//784
+f 266//581 326//641 322//637 264//579
+f 279//594 275//590 149//479 278//593
+f 277//592 278//593 149//479 150//480
+g aft
+f 432//742 433//743 447//756 444//754
+g hull
+s 33
+f 265//1054 536//1055 264//1053
+s 23
+f 514//778 351//666 350//665 348//663
+g keel
+s 21
+f 123//406 124//407 125//408 126//409
+g aft
+s 55
+f 477//1125 480//1127 242//1123
+g hull
+s 23
+f 519//783 325//640 326//641 270//585
+f 289//604 272//587 273//588 288//603
+f 271//586 272//587 289//604 290//605
+g deck
+f 288//603 281//596 533//797
+g hull
+f 517//781 516//780 335//650
+g rig
+f 370//685 369//684 357//672 356//671
+f 357//672 369//684 540//804 358//673
+s off
+f 356//59 355//59 354//59 370//59
+g aft
+s 57
+f 487//1151 488//1152 483//1150 461//1149
+s 30
+f 439//924 470//940 471//941 535//958
+f 471//941 468//939 485//955 535//958
+g hull
+s 23
+f 267//582 266//581 536//800 537//801
+f 268//583 267//582 537//801 538//802
+f 269//584 268//583 538//802 257//572
+f 266//581 264//579 536//800
+s 45
+f 407//1056 409//1058 412//1061
+g rig
+s 23
+f 368//683 360//675 359//674 539//803
+f 539//803 359//674 358//673 540//804
+f 341//656 340//655 336//651
+f 336//651 340//655 339//654 338//653 337//652 334//649
+f 390//705 388//703 387//702 385//700 386//701 391//706
+f 389//704 388//703 390//705
+g mast1
+s 63
+f 555//1197 556//1198 542//1196 541//1195
+s 64
+f 556//1213 557//1214 543//1212 542//1211
+s 65
+f 557//1229 558//1230 544//1228 543//1227
+s 66
+f 558//1245 559//1246 545//1244 544//1243
+s 67
+f 559//1263 560//1264 546//1260 545//1259
+f 560//1264 561//1265 547//1261 546//1260
+f 561//1265 562//1266 548//1262 547//1261
+s 68
+f 562//1301 563//1302 549//1300 548//1299
+s 69
+f 563//1317 564//1318 550//1316 549//1315
+s 70
+f 564//1333 565//1334 551//1332 550//1331
+s 71
+f 565//1349 566//1350 552//1348 551//1347
+s 72
+f 566//1365 567//1366 553//1364 552//1363
+s 73
+f 567//1381 568//1382 554//1380 553//1379
+s 63
+f 587//1203 588//1204 574//1202 573//1201
+s 64
+f 588//1217 589//1218 575//1216 574//1215
+s 65
+f 589//1233 590//1234 576//1232 575//1231
+s 66
+f 590//1249 591//1250 577//1248 576//1247
+s 67
+f 591//1271 592//1272 578//1268 577//1267
+f 592//1272 593//1273 579//1269 578//1268
+f 593//1273 594//1274 580//1270 579//1269
+s 68
+f 594//1305 595//1306 581//1304 580//1303
+s 69
+f 595//1321 596//1322 582//1320 581//1319
+s 70
+f 596//1337 597//1338 583//1336 582//1335
+s 71
+f 597//1353 598//1354 584//1352 583//1351
+s 72
+f 598//1369 599//1370 585//1368 584//1367
+s 73
+f 599//1387 600//1388 586//1386 585//1385
+s 63
+f 601//1205 602//1206 588//1204 587//1203
+s 64
+f 602//1219 603//1220 589//1218 588//1217
+s 65
+f 603//1235 604//1236 590//1234 589//1233
+s 66
+f 604//1251 605//1252 591//1250 590//1249
+s 67
+f 605//1275 606//1276 592//1272 591//1271
+f 606//1276 630//1284 607//1277 593//1273 592//1272
+f 607//1277 608//1278 594//1274 593//1273
+s 68
+f 608//1307 609//1308 595//1306 594//1305
+s 69
+f 609//1323 610//1324 596//1322 595//1321
+s 70
+f 610//1339 611//1340 597//1338 596//1337
+s 71
+f 611//1355 612//1356 598//1354 597//1353
+s 72
+f 612//1371 613//1372 599//1370 598//1369
+s 73
+f 613//1389 614//1390 600//1388 599//1387
+s 63
+f 615//1207 616//1208 602//1206 601//1205
+s 64
+f 616//1221 617//1222 603//1220 602//1219
+s 65
+f 617//1237 618//1238 604//1236 603//1235
+s 66
+f 618//1253 619//1254 605//1252 604//1251
+s 67
+f 619//1279 620//1280 632//1286 606//1276 605//1275
+f 629//1283 621//1281 607//1277 630//1284 631//1285
+f 621//1281 622//1282 608//1278 607//1277
+s 68
+f 622//1309 623//1310 609//1308 608//1307
+s 69
+f 623//1325 624//1326 610//1324 609//1323
+s 70
+f 624//1341 625//1342 611//1340 610//1339
+s 71
+f 625//1357 626//1358 612//1356 611//1355
+s 72
+f 626//1373 627//1374 613//1372 612//1371
+s 73
+f 627//1391 628//1392 614//1390 613//1389
+s 63
+f 541//1195 542//1196 616//1208 615//1207
+s 64
+f 542//1211 543//1212 617//1222 616//1221
+s 65
+f 543//1227 544//1228 618//1238 617//1237
+s 66
+f 544//1243 545//1244 619//1254 618//1253
+s 67
+f 545//1259 546//1260 620//1280 619//1279
+f 546//1260 547//1261 621//1281 629//1283 620//1280
+f 547//1261 548//1262 622//1282 621//1281
+s 68
+f 548//1299 549//1300 623//1310 622//1309
+s 69
+f 549//1315 550//1316 624//1326 623//1325
+s 70
+f 550//1331 551//1332 625//1342 624//1341
+s 71
+f 551//1347 552//1348 626//1358 625//1357
+s 72
+f 552//1363 553//1364 627//1374 626//1373
+s 73
+f 553//1379 554//1380 628//1392 627//1391
+s off
+f 601//60 587//60 573//60 571//60 569//60 555//60 541//60 615//60
+f 570//61 572//61 586//61 600//61 614//61 628//61 554//61 568//61
+f 638//62 637//62 640//62 639//62
+f 634//63 633//63 636//63 635//63
+f 633//64 634//64 632//64 620//64
+f 634//65 635//65 631//65 632//65
+f 635//66 636//66 629//66 631//66
+f 636//67 633//67 620//67 629//67
+f 637//68 638//68 630//68 606//68
+f 638//69 639//69 631//69 630//69
+f 639//70 640//70 632//70 631//70
+f 640//71 637//71 606//71 632//71
+g mast3
+s 83
+f 655//1397 656//1398 642//1396 641//1395
+s 84
+f 656//1413 657//1414 643//1412 642//1411
+s 85
+f 657//1429 658//1430 644//1428 643//1427
+s 86
+f 658//1445 659//1446 645//1444 644//1443
+s 87
+f 659//1463 660//1464 646//1460 645//1459
+f 660//1464 661//1465 647//1461 646//1460
+f 661//1465 662//1466 648//1462 647//1461
+s 88
+f 662//1501 663//1502 649//1500 648//1499
+s 89
+f 663//1517 664//1518 650//1516 649//1515
+s 90
+f 664//1533 665//1534 651//1532 650//1531
+s 91
+f 665//1549 666//1550 652//1548 651//1547
+s 92
+f 666//1565 667//1566 653//1564 652//1563
+s 93
+f 667//1581 668//1582 654//1580 653//1579
+s 83
+f 687//1403 688//1404 674//1402 673//1401
+s 84
+f 688//1417 689//1418 675//1416 674//1415
+s 85
+f 689//1433 690//1434 676//1432 675//1431
+s 86
+f 690//1449 691//1450 677//1448 676//1447
+s 87
+f 691//1471 692//1472 678//1468 677//1467
+f 692//1472 693//1473 679//1469 678//1468
+f 693//1473 694//1474 680//1470 679//1469
+s 88
+f 694//1505 695//1506 681//1504 680//1503
+s 89
+f 695//1521 696//1522 682//1520 681//1519
+s 90
+f 696//1537 697//1538 683//1536 682//1535
+s 91
+f 697//1553 698//1554 684//1552 683//1551
+s 92
+f 698//1569 699//1570 685//1568 684//1567
+s 93
+f 699//1587 700//1588 686//1586 685//1585
+s 83
+f 701//1405 702//1406 688//1404 687//1403
+s 84
+f 702//1419 703//1420 689//1418 688//1417
+s 85
+f 703//1435 704//1436 690//1434 689//1433
+s 86
+f 704//1451 705//1452 691//1450 690//1449
+s 87
+f 705//1475 706//1476 692//1472 691//1471
+f 706//1476 730//1484 707//1477 693//1473 692//1472
+f 707//1477 708//1478 694//1474 693//1473
+s 88
+f 708//1507 709//1508 695//1506 694//1505
+s 89
+f 709//1523 710//1524 696//1522 695//1521
+s 90
+f 710//1539 711//1540 697//1538 696//1537
+s 91
+f 711//1555 712//1556 698//1554 697//1553
+s 92
+f 712//1571 713//1572 699//1570 698//1569
+s 93
+f 713//1589 714//1590 700//1588 699//1587
+s 83
+f 715//1407 716//1408 702//1406 701//1405
+s 84
+f 716//1421 717//1422 703//1420 702//1419
+s 85
+f 717//1437 718//1438 704//1436 703//1435
+s 86
+f 718//1453 719//1454 705//1452 704//1451
+s 87
+f 719//1479 720//1480 732//1486 706//1476 705//1475
+f 729//1483 721//1481 707//1477 730//1484 731//1485
+f 721//1481 722//1482 708//1478 707//1477
+s 88
+f 722//1509 723//1510 709//1508 708//1507
+s 89
+f 723//1525 724//1526 710//1524 709//1523
+s 90
+f 724//1541 725//1542 711//1540 710//1539
+s 91
+f 725//1557 726//1558 712//1556 711//1555
+s 92
+f 726//1573 727//1574 713//1572 712//1571
+s 93
+f 727//1591 728//1592 714//1590 713//1589
+s 83
+f 641//1395 642//1396 716//1408 715//1407
+s 84
+f 642//1411 643//1412 717//1422 716//1421
+s 85
+f 643//1427 644//1428 718//1438 717//1437
+s 86
+f 644//1443 645//1444 719//1454 718//1453
+s 87
+f 645//1459 646//1460 720//1480 719//1479
+f 646//1460 647//1461 721//1481 729//1483 720//1480
+f 647//1461 648//1462 722//1482 721//1481
+s 88
+f 648//1499 649//1500 723//1510 722//1509
+s 89
+f 649//1515 650//1516 724//1526 723//1525
+s 90
+f 650//1531 651//1532 725//1542 724//1541
+s 91
+f 651//1547 652//1548 726//1558 725//1557
+s 92
+f 652//1563 653//1564 727//1574 726//1573
+s 93
+f 653//1579 654//1580 728//1592 727//1591
+s off
+f 701//72 687//72 673//72 671//72 669//72 655//72 641//72 715//72
+f 670//73 672//73 686//73 700//73 714//73 728//73 654//73 668//73
+f 738//74 737//74 740//74 739//74
+f 734//75 733//75 736//75 735//75
+f 733//76 734//76 732//76 720//76
+f 734//77 735//77 731//77 732//77
+f 735//78 736//78 729//78 731//78
+f 736//79 733//79 720//79 729//79
+f 737//80 738//80 730//80 706//80
+f 738//81 739//81 731//81 730//81
+f 739//82 740//82 732//82 731//82
+f 740//83 737//83 706//83 732//83
+g lamp
+s 104
+f 752//1597 753//1598 743//1596 742//1595
+s 105
+f 753//1613 754//1614 744//1612 743//1611
+s 106
+f 754//1630 755//1631 745//1628 744//1627
+f 755//1631 756//1632 746//1629 745//1628
+s 107
+f 756//1653 757//1654 747//1652 746//1651
+s 108
+f 757//1669 758//1670 748//1668 747//1667
+s 109
+f 758//1685 759//1686 749//1684 748//1683
+s 110
+f 759//1701 760//1702 750//1700 749//1699
+s 103
+f 760//1718 761//1719 751//1717 750//1716
+f 761//1719 741//1715 751//1717
+s 104
+f 762//1599 763//1600 753//1598 752//1597
+s 105
+f 763//1615 764//1616 754//1614 753//1613
+s 106
+f 764//1633 765//1634 755//1631 754//1630
+f 765//1634 766//1635 756//1632 755//1631
+s 107
+f 766//1655 767//1656 757//1654 756//1653
+s 108
+f 767//1671 768//1672 758//1670 757//1669
+s 109
+f 768//1687 769//1688 759//1686 758//1685
+s 110
+f 769//1703 770//1704 760//1702 759//1701
+s 103
+f 770//1720 771//1721 761//1719 760//1718
+f 771//1721 741//1715 761//1719
+s 104
+f 772//1601 773//1602 763//1600 762//1599
+s 105
+f 773//1617 774//1618 764//1616 763//1615
+s 106
+f 774//1636 775//1637 765//1634 764//1633
+f 775//1637 776//1638 766//1635 765//1634
+s 107
+f 776//1657 777//1658 767//1656 766//1655
+s 108
+f 777//1673 778//1674 768//1672 767//1671
+s 109
+f 778//1689 779//1690 769//1688 768//1687
+s 110
+f 779//1705 780//1706 770//1704 769//1703
+s 103
+f 780//1722 781//1723 771//1721 770//1720
+f 781//1723 741//1715 771//1721
+s 104
+f 782//1603 783//1604 773//1602 772//1601
+s 105
+f 783//1619 784//1620 774//1618 773//1617
+s 106
+f 784//1639 785//1640 775//1637 774//1636
+f 785//1640 786//1641 776//1638 775//1637
+s 107
+f 786//1659 787//1660 777//1658 776//1657
+s 108
+f 787//1675 788//1676 778//1674 777//1673
+s 109
+f 788//1691 789//1692 779//1690 778//1689
+s 110
+f 789//1707 790//1708 780//1706 779//1705
+s 103
+f 790//1724 791//1725 781//1723 780//1722
+f 791//1725 741//1715 781//1723
+s 104
+f 792//1605 793//1606 783//1604 782//1603
+s 105
+f 793//1621 794//1622 784//1620 783//1619
+s 106
+f 794//1642 795//1643 785//1640 784//1639
+f 795//1643 796//1644 786//1641 785//1640
+s 107
+f 796//1661 797//1662 787//1660 786//1659
+s 108
+f 797//1677 798//1678 788//1676 787//1675
+s 109
+f 798//1693 799//1694 789//1692 788//1691
+s 110
+f 799//1709 800//1710 790//1708 789//1707
+s 103
+f 800//1726 801//1727 791//1725 790//1724
+f 801//1727 741//1715 791//1725
+s 104
+f 802//1607 803//1608 793//1606 792//1605
+s 105
+f 803//1623 804//1624 794//1622 793//1621
+s 106
+f 804//1645 805//1646 795//1643 794//1642
+f 805//1646 806//1647 796//1644 795//1643
+s 107
+f 806//1663 807//1664 797//1662 796//1661
+s 108
+f 807//1679 808//1680 798//1678 797//1677
+s 109
+f 808//1695 809//1696 799//1694 798//1693
+s 110
+f 809//1711 810//1712 800//1710 799//1709
+s 103
+f 810//1728 811//1729 801//1727 800//1726
+f 811//1729 741//1715 801//1727
+s 104
+f 812//1609 813//1610 803//1608 802//1607
+s 105
+f 813//1625 814//1626 804//1624 803//1623
+s 106
+f 814//1648 815//1649 805//1646 804//1645
+f 815//1649 816//1650 806//1647 805//1646
+s 107
+f 816//1665 817//1666 807//1664 806//1663
+s 108
+f 817//1681 818//1682 808//1680 807//1679
+s 109
+f 818//1697 819//1698 809//1696 808//1695
+s 110
+f 819//1713 820//1714 810//1712 809//1711
+s 103
+f 820//1730 821//1731 811//1729 810//1728
+f 821//1731 741//1715 811//1729
+s 104
+f 742//1595 743//1596 813//1610 812//1609
+s 105
+f 743//1611 744//1612 814//1626 813//1625
+s 106
+f 744//1627 745//1628 815//1649 814//1648
+f 745//1628 746//1629 816//1650 815//1649
+s 107
+f 746//1651 747//1652 817//1666 816//1665
+s 108
+f 747//1667 748//1668 818//1682 817//1681
+s 109
+f 748//1683 749//1684 819//1698 818//1697
+s 110
+f 749//1699 750//1700 820//1714 819//1713
+s 103
+f 750//1716 751//1717 821//1731 820//1730
+f 751//1717 741//1715 821//1731
+s off
+f 802//84 792//84 782//84 772//84 762//84 752//84 742//84 812//84
+g foremast
+s 112
+f 825//1735 824//1734 822//1732 823//1733
+f 827//1737 826//1736 824//1734 825//1735
+f 829//1739 828//1738 826//1736 827//1737
+f 831//1741 830//1740 828//1738 829//1739
+f 833//1743 832//1742 830//1740 831//1741
+f 835//1745 834//1744 832//1742 833//1743
+f 837//1747 836//1746 834//1744 835//1745
+f 823//1733 822//1732 836//1746 837//1747
+s off
+f 824//85 826//85 828//85 830//85 832//85 834//85 836//85 822//85
+f 837//86 835//86 833//86 831//86 829//86 827//86 825//86 823//86
+g keel
+s 21
+f 839//429 838//428 107//390 108//391
+f 840//430 112//395 107//390 838//428
+f 841//431 114//397 112//395 840//430
+f 842//432 116//399 114//397 841//431
+f 843//433 118//401 116//399 842//432
+f 844//434 120//403 118//401 843//433
+f 845//435 122//405 120//403 844//434
+f 846//436 124//407 122//405 845//435
+f 128//411 125//408 848//438 847//437
+f 849//439 130//413 128//411 847//437
+f 850//440 132//415 130//413 849//439
+f 851//441 134//417 132//415 850//440
+f 852//442 136//419 134//417 851//441
+f 853//443 138//421 136//419 852//442
+f 854//444 140//423 138//421 853//443
+f 855//445 142//425 140//423 854//444
+g hull
+f 856//446 144//427 142//425 855//445
+s 25
+f 857//452 146//450 144//448 856//451
+s 26
+f 858//458 148//456 146//454 857//457
+s 23
+f 859//806 150//480 148//478 858//805
+g keel
+s 113
+f 861//1767 840//1750 838//1748 860//1766
+f 862//1768 841//1751 840//1750 861//1767
+f 863//1769 842//1752 841//1751 862//1768
+f 864//1770 843//1753 842//1752 863//1769
+f 865//1771 844//1754 843//1753 864//1770
+f 866//1772 845//1755 844//1754 865//1771
+f 867//1773 846//1756 845//1755 866//1772
+f 868//1774 848//1758 846//1756 867//1773
+f 869//1775 847//1757 848//1758 868//1774
+f 870//1776 849//1759 847//1757 869//1775
+f 871//1777 850//1760 849//1759 870//1776
+f 872//1778 851//1761 850//1760 871//1777
+f 873//1779 852//1762 851//1761 872//1778
+f 874//1780 853//1763 852//1762 873//1779
+f 875//1781 854//1764 853//1763 874//1780
+f 875//1781 855//1765 854//1764
+f 838//1748 839//1749 876//1782 860//1766
+f 878//1784 877//1783 860//1766 876//1782
+f 880//1786 879//1785 877//1783 878//1784
+f 882//1788 881//1787 879//1785 880//1786
+f 884//1790 883//1789 881//1787 882//1788
+f 887//1793 886//1792 883//1789 884//1790 885//1791
+g hull
+s 30
+f 889//967 888//966 860//959 877//960
+f 891//969 890//968 888//966 889//967
+f 891//969 892//970 890//968
+f 891//969 894//972 893//971 892//970
+f 889//967 895//973 894//972 891//969
+f 877//960 879//961 895//973 889//967
+f 896//974 895//973 879//961 881//962
+f 897//975 894//972 895//973 896//974
+f 898//976 893//971 894//972 897//975
+f 899//977 896//974 881//962 883//963
+f 899//977 900//978 896//974
+f 897//975 896//974 900//978 901//979
+f 901//979 902//980 897//975
+f 898//976 897//975 902//980 903//981
+g keel
+s 22
+f 882//1032 246//1022 245//1021 884//1033
+f 878//1030 248//1024 247//1023 880//1031
+f 876//1029 249//1025 248//1024 878//1030
+f 839//1028 108//1014 249//1025 876//1029
+f 880//1031 247//1023 246//1022 882//1032
+g hull
+s 113
+f 905//1801 874//1780 873//1779 904//1800
+f 906//1802 875//1781 874//1780 905//1801
+f 906//1802 855//1765 875//1781
+f 905//1801 907//1803 906//1802
+f 904//1800 908//1804 907//1803 905//1801
+f 910//1806 907//1803 908//1804 909//1805
+f 912//1808 911//1807 910//1806 909//1805
+s 115
+f 906//2021 914//2026 913//2025 855//2017
+f 907//2022 915//2027 914//2026 906//2021
+f 910//2023 916//2028 915//2027 907//2022
+f 913//2025 856//2018 855//2017
+f 913//2025 857//2019 856//2018
+s 113
+f 918//1814 917//1813 911//1807 912//1808
+f 920//1816 919//1815 917//1813 918//1814
+s 120
+f 922//2036 921//2035 919//2033 920//2034
+s 113
+f 924//1820 916//1812 921//1817 923//1819
+s 115
+f 921//2031 916//2028 910//2023 911//2024 917//2029 919//2030
+s 113
+f 925//1821 915//1811 916//1812 924//1820
+f 925//1821 914//1810 915//1811
+s 23
+f 929//810 928//809 927//808 926//807
+f 931//812 930//811 928//809 929//810
+f 933//814 932//813 930//811 931//812
+f 935//816 934//815 932//813 933//814
+f 859//806 858//805 936//817
+s 115
+f 913//2025 936//2032 858//2020 857//2019
+s 113
+f 914//1810 934//1829 936//1830 913//1809
+s 23
+f 935//816 859//806 936//817 934//815
+g deck
+s off
+f 937//87 277//87 278//87
+s 23
+f 938//819 282//597 280//595 937//818
+f 940//821 286//601 283//598 939//820
+s off
+f 939//88 941//88 940//88
+s 23
+f 943//824 942//823 941//822
+f 940//821 941//822 942//823 944//825
+f 946//827 293//608 286//601 940//821 944//825 945//826
+g hull
+f 933//814 938//819 937//818 935//816
+f 938//819 933//814 931//812 943//824
+s 113
+f 948//1836 947//1835 918//1814 912//1808
+f 950//1838 949//1837 947//1835 948//1836
+f 952//1840 951//1839 949//1837 950//1838
+f 956//1844 955//1843 954//1842 953//1841
+f 958//1846 957//1845 955//1843 956//1844
+f 960//1848 959//1847 957//1845 958//1846
+f 960//1848 961//1849 959//1847
+f 963//1851 962//1850 961//1849 960//1848
+f 963//1851 964//1852 962//1850
+f 966//1854 965//1853 964//1852 963//1851
+f 966//1854 967//1855 965//1853
+f 969//1857 968//1856 967//1855 966//1854
+f 971//1859 970//1858 968//1856 969//1857
+f 973//1861 972//1860 970//1858 971//1859
+f 954//1842 951//1839 952//1840 953//1841
+f 947//1835 974//1862 920//1816 918//1814
+f 922//1818 920//1816 974//1862 975//1863
+f 976//1864 974//1862 947//1835 949//1837
+f 977//1865 975//1863 974//1862 976//1864
+f 979//1867 978//1866 975//1863 977//1865
+f 976//1864 981//1869 980//1868 977//1865
+f 949//1837 951//1839 981//1869 976//1864
+f 982//1870 981//1869 951//1839 954//1842
+f 983//1871 980//1868 981//1869 982//1870
+f 983//1871 984//1872 980//1868
+f 984//1872 979//1867 977//1865 980//1868
+f 984//1872 985//1873 979//1867
+g rig
+s off
+f 987//89 986//89 985//89 984//89
+f 989//90 988//90 985//90 986//90
+s 113
+f 986//1874 987//1875 990//1878
+f 982//1870 992//1880 991//1879 990//1878
+s off
+f 993//91 991//91 992//91
+g hull
+s 113
+f 995//1883 994//1882 993//1881 992//1880
+g rig
+s off
+f 991//92 993//92 994//92 996//92
+f 994//93 995//93 996//93
+s 113
+f 998//1886 996//1884 995//1883 997//1885
+s off
+f 997//94 999//94 998//94
+f 1001//95 998//95 999//95 1000//95
+g hull
+s 23
+f 999//829 997//828 1000//830
+f 1003//832 1002//831 1000//830 997//828
+g rig
+s off
+f 990//96 983//96 982//96
+f 983//97 990//97 987//97 984//97
+f 1001//98 1000//98 988//98 989//98
+g hull
+s 113
+f 954//1842 955//1843 997//1885 995//1883 992//1880 982//1870
+f 997//1885 955//1843 957//1845 1003//1889
+s 23
+f 1002//831 1006//835 1005//834 1004//833
+f 1003//832 1007//836 1006//835 1002//831
+s 113
+f 957//1845 959//1847 1007//1890 1003//1889
+f 1008//1891 1007//1890 959//1847
+g rig
+f 961//1849 1010//1893 1009//1892 959//1847
+f 964//1852 1012//1895 1011//1894 962//1850
+f 967//1855 1014//1897 1013//1896 965//1853
+g hull
+f 1016//1899 961//1849 962//1850 1015//1898
+f 1018//1901 1017//1900 964//1852 965//1853
+f 1020//1903 1019//1902 967//1855
+g rig
+f 1014//1897 1022//1905 1021//1904 1013//1896
+g hull
+s 23
+f 1024//838 1023//837 1005//834 1006//835
+f 1024//838 1025//839 1023//837
+f 1024//838 1026//840 1025//839
+f 1026//840 1027//841 1025//839
+g rig
+s off
+f 959//99 1009//99 1008//99
+f 1007//100 1029//100 1028//100 1006//100
+f 1016//101 1010//101 961//101
+f 1010//102 1016//102 1015//102 1011//102
+f 1011//103 1015//103 962//103
+f 1018//104 965//104 1013//104
+f 1021//105 1024//105 1006//105 1028//105 1031//105 1030//105
+f 1014//106 967//106 1019//106
+f 1014//107 1019//107 1020//107 1022//107
+f 1022//108 1020//108 1024//108 1021//108
+f 1017//109 1012//109 964//109
+f 1012//110 1017//110 1018//110 1013//110
+g hull
+s 113
+f 968//1856 1032//1911 1020//1903 967//1855
+f 1024//1906 1020//1903 1032//1911 1033//1912
+f 1034//1913 1033//1912 1032//1911
+f 1036//1915 1035//1914 1034//1913 1032//1911
+f 1036//1915 1037//1916 1035//1914
+f 1039//1918 1038//1917 1037//1916 1036//1915
+f 970//1858 972//1860 1039//1918 1036//1915
+f 1032//1911 968//1856 970//1858 1036//1915
+g rig
+f 1041//1920 1040//1919 1033//1912 1034//1913
+f 1043//1922 1042//1921 1040//1919
+f 1035//1914 1037//1916 1045//1924 1044//1923
+g hull
+s 23
+f 1047//844 1046//843 1033//842
+f 1046//843 1048//845 1027//841 1026//840
+s 113
+f 1034//1913 1035//1914 1050//1926 1049//1925
+s 23
+f 1052//847 1051//846 1027//841 1048//845
+f 1052//847 1053//848 1051//846
+g rig
+s off
+f 1047//111 1033//111 1040//111
+f 1044//112 1050//112 1035//112
+f 1034//113 1049//113 1041//113
+f 1050//114 1044//114 1041//114 1049//114
+f 1047//115 1040//115 1042//115 1046//115
+f 1046//116 1042//116 1043//116 1048//116
+f 1054//117 1052//117 1048//117 1043//117
+f 1052//118 1054//118 1056//118 1055//118
+f 1057//119 1055//119 1056//119 1045//119
+f 1037//120 1057//120 1045//120
+g hull
+s 23
+f 1026//840 1024//838 1033//842 1046//843
+s 113
+f 1037//1916 1038//1917 1055//1929 1057//1931
+f 1055//1929 1038//1917 1058//1932 1052//1927
+s 23
+f 1059//850 1053//848 1052//847 1058//849
+f 1061//852 1060//851 1059//850 1058//849
+f 1063//854 1062//853 1059//850 1060//851
+s 45
+f 1065//1082 1064//1081 1062//1079 1063//1080
+f 1065//1082 1067//1084 1066//1083
+s 23
+f 1060//851 1068//857 1067//856 1063//854
+f 1061//852 1069//858 1068//857 1060//851
+s 45
+f 1071//1086 1070//1085 1065//1082 1066//1083
+f 1073//1088 1072//1087 1070//1085 1071//1086
+f 1075//1090 1074//1089 1072//1087 1073//1088
+f 1077//1092 1076//1091 1074//1089 1075//1090
+f 423//1070 424//1071 1076//1091 1077//1092
+s 23
+f 1075//861 425//735 423//734 1077//862
+f 1078//863 427//737 425//735 1075//861
+f 1079//864 429//739 427//737 1078//863
+f 1081//866 433//743 430//740 1080//865
+f 1083//868 1082//867 1081//866 1080//865
+f 1068//857 1069//858 1082//867 1083//868
+f 1066//855 1067//856 1068//857 1083//868 1071//859
+f 1078//863 1073//860 1071//859 1079//864
+f 1078//863 1075//861 1073//860
+s 113
+f 1039//1918 1085//1936 1084//1935 1038//1917
+f 972//1860 1086//1937 1085//1936 1039//1918
+f 972//1860 1087//1938 1086//1937
+s 23
+f 1080//865 430//740 429//739 1079//864
+f 1079//864 1071//859 1083//868 1080//865
+s 113
+f 1087//1938 898//1798 903//1799 1088//1939
+f 898//1798 1087//1938 972//1860 973//1861
+g aft
+s 23
+f 1090//870 1061//852 1058//849 1089//869
+f 1091//871 1069//858 1061//852 1090//870
+f 1092//872 1082//867 1069//858 1091//871
+f 1093//873 1081//866 1082//867 1092//872
+f 1093//873 1094//874 446//755 447//756
+f 1092//872 1095//875 1094//874 1093//873
+f 1091//871 1096//876 1095//875 1092//872
+f 1090//870 1097//877 1096//876 1091//871
+f 1089//869 1098//878 1097//877 1090//870
+s 113
+f 1100//1943 1099//1942 1098//1941 1089//1940
+f 1058//1932 1038//1917 1100//1943 1089//1940
+s 137
+f 1084//2039 1101//2045 1100//2044 1038//2038
+f 1099//2043 1100//2044 1101//2045 1102//2046
+g windows
+f 1097//2041 1098//2042 1099//2043 1102//2046
+f 1103//2047 1096//2040 1097//2041 1102//2046
+s 30
+f 1104//988 1095//985 1096//986 1103//987
+f 1105//989 1094//984 1095//985 1104//988
+f 460//932 446//925 1094//984 1105//989
+g aft
+f 1106//990 462//934 460//932 1105//989
+f 1105//989 1107//991 1106//990
+f 1104//988 1108//992 1107//991 1105//989
+f 1104//988 1109//993 1108//992
+s 137
+f 1103//2047 1102//2046 1101//2045 1110//2048
+s 135
+f 1085//2055 1111//2059 1101//2058 1084//2054
+s 137
+f 1112//2050 1110//2048 1101//2045 1111//2049
+f 1115//2053 1114//2052 1112//2050 1111//2049 1113//2051
+s 135
+f 1086//2056 1113//2060 1111//2059 1085//2055
+f 1086//2056 1087//2057 1115//2061 1113//2060
+g hull
+s 113
+f 1116//1944 1088//1939 903//1799
+s 30
+f 1120//1002 1119//1001 1118//1000 1117//999
+g aft
+f 1122//1004 1121//1003 1108//992 1109//993
+f 902//980 901//979 1121//1003 1122//1004
+g hull
+f 1126//1008 1125//1007 1124//1006 1123//1005
+g aft
+f 1128//1010 1127//1009 1106//990 1107//991
+f 1112//995 1116//998 1129//1011 1110//994
+f 1110//994 1129//1011 1103//987
+f 1129//1011 1109//993 1104//988 1103//987
+f 900//978 899//977 1127//1009 1128//1010
+s off
+f 1123//121 1124//121 1107//121 1108//121
+s 141
+f 1124//2064 1125//2065 1128//2066 1107//2063
+f 1128//2066 1125//2065 900//2062
+g hull
+s 30
+f 1126//1008 901//979 900//978 1125//1007
+g aft
+s 140
+f 1126//2071 1123//2070 1108//2068 1121//2069
+s 139
+f 1119//2075 902//2072 1122//2076
+f 1119//2075 1122//2076 1109//2073 1118//2074
+s 30
+f 1117//999 1118//1000 1109//993 1129//1011
+g hull
+f 1120//1002 903//981 902//980 1119//1001
+s 138
+f 1120//2080 1116//2078 903//2077
+g aft
+f 1120//2080 1117//2079 1129//2081 1116//2078
+g keel
+s 22
+f 885//1034 884//1033 245//1021 486//1026
+g aft
+s 31
+f 462//1140 1106//1146 887//1145 885//1144 486//1141
+f 887//1145 1106//1146 1130//1147
+g hull
+s 30
+f 1130//1012 1131//1013 886//964 887//965
+g aft
+s 142
+f 899//2082 1131//2086 1127//2084
+g hull
+s 30
+f 899//977 883//963 886//964 1131//1013
+s 45
+f 424//1071 489//1073 1076//1091
+f 490//1074 1074//1089 1076//1091 489//1073
+f 491//1075 1072//1087 1074//1089 490//1074
+f 492//1076 1070//1085 1072//1087 491//1075
+f 445//1072 1065//1082 1070//1085 492//1076
+f 493//1077 1132//1093 1065//1082 445//1072
+g deck
+s 58
+f 496//1156 1134//1160 1133//1159 1132//1158 493//1153
+s off
+f 1136//122 1135//122 1133//122 1134//122
+f 1134//123 1137//123 1136//123
+s 59
+f 496//1161 501//1164 1137//1166 1134//1165
+s 60
+f 1136//1175 1139//1178 1138//1177 1135//1174
+f 501//1170 504//1173 1139//1178 1136//1175 1137//1176
+g hull
+s 131
+f 1064//2092 1140//2093 1059//2090 1062//2091
+f 1141//2094 1053//2089 1059//2090 1140//2093
+f 1142//2095 1051//2088 1053//2089 1141//2094
+f 1143//2096 1027//2087 1051//2088 1142//2095
+s 23
+f 1144//880 1025//839 1027//841 1143//879
+f 1145//881 1023//837 1025//839 1144//880
+f 1147//883 1004//833 1005//834 1146//882
+f 1149//885 1148//884 1004//833 1147//883
+f 1151//887 1150//886 1148//884 1149//885
+f 1155//891 1154//890 1153//889 1152//888 926//807 927//808
+g deck
+s off
+f 1139//124 1157//124 1156//124 1138//124
+f 1139//125 1158//125 1157//125
+s 23
+f 1157//893 1158//894 524//788 525//789
+f 526//790 1159//895 1156//892 1157//893 525//789
+f 1161//897 1160//896 1159//895 526//790 528//792
+f 1163//899 1162//898 1160//896 1161//897
+s off
+f 1163//126 1161//126 946//126
+s 23
+f 293//608 946//827 1161//897 528//792
+f 939//820 1164//900 943//824 941//822
+f 282//597 938//819 1164//900 939//820 283//598
+g hull
+f 1023//837 1145//881 1146//882 1005//834
+s 113
+f 1140//1949 1064//1933 1133//1946
+f 1133//1946 1135//1947 1141//1950 1140//1949
+f 1141//1950 1135//1947 1142//1951
+f 1142//1951 1135//1947 1138//1948 1143//1952
+f 1156//1965 1144//1953 1143//1952 1138//1948
+f 1144//1953 1156//1965 1145//1954
+f 1065//1934 1132//1945 1133//1946 1064//1933
+g deck
+s 61
+f 1139//1193 504//1190 524//1192 1158//1194
+g hull
+s 113
+f 1160//1967 1147//1956 1146//1955 1159//1966
+f 1159//1966 1146//1955 1145//1954 1156//1965
+f 1160//1967 1162//1968 1149//1958 1147//1956
+s 23
+f 1150//886 1151//887 1152//888 1153//889
+s 113
+f 945//1834 1151//1960 1149//1958 1162//1968
+g deck
+s off
+f 945//127 1162//127 1163//127 946//127
+g hull
+s 113
+f 1151//1960 945//1834 1152//1961
+f 926//1822 1152//1961 945//1834 944//1833
+f 1165//1969 861//1767 860//1766 888//1794
+f 1166//1970 862//1768 861//1767 1165//1969
+f 1167//1971 863//1769 862//1768 1166//1970
+f 1168//1972 864//1770 863//1769 1167//1971
+f 1169//1973 865//1771 864//1770 1168//1972
+f 1170//1974 866//1772 865//1771 1169//1973
+f 1171//1975 867//1773 866//1772 1170//1974
+f 1172//1976 868//1774 867//1773 1171//1975
+f 1173//1977 869//1775 868//1774 1172//1976
+f 1174//1978 870//1776 869//1775 1173//1977
+f 1175//1979 871//1777 870//1776 1174//1978
+f 1176//1980 872//1778 871//1777 1175//1979
+f 1176//1980 873//1779 872//1778
+f 1177//1981 1165//1969 888//1794 890//1795
+f 1178//1982 1166//1970 1165//1969 1177//1981
+f 1179//1983 1167//1971 1166//1970 1178//1982
+f 1180//1984 1168//1972 1167//1971 1179//1983
+f 1181//1985 1169//1973 1168//1972 1180//1984
+f 1182//1986 1170//1974 1169//1973 1181//1985
+f 1183//1987 1171//1975 1170//1974 1182//1986
+f 1184//1988 1172//1976 1171//1975 1183//1987
+f 1185//1989 1173//1977 1172//1976 1184//1988
+f 1186//1990 1174//1978 1173//1977 1185//1989
+f 1187//1991 1175//1979 1174//1978 1186//1990
+f 1188//1992 1176//1980 1175//1979 1187//1991
+f 904//1800 873//1779 1176//1980 1188//1992
+f 1189//1993 1177//1981 890//1795 892//1796
+f 1190//1994 1178//1982 1177//1981 1189//1993
+f 1191//1995 1179//1983 1178//1982 1190//1994
+f 1192//1996 1180//1984 1179//1983 1191//1995
+f 1193//1997 1181//1985 1180//1984 1192//1996
+f 1194//1998 1182//1986 1181//1985 1193//1997
+f 1195//1999 1183//1987 1182//1986 1194//1998
+f 1196//2000 1184//1988 1183//1987 1195//1999
+f 1197//2001 1185//1989 1184//1988 1196//2000
+f 1198//2002 1186//1990 1185//1989 1197//2001
+f 1199//2003 1187//1991 1186//1990 1198//2002
+f 1200//2004 1188//1992 1187//1991 1199//2003
+f 908//1804 904//1800 1188//1992 1200//2004
+f 1201//2005 1189//1993 892//1796 893//1797
+f 1202//2006 1190//1994 1189//1993 1201//2005
+f 1203//2007 1191//1995 1190//1994 1202//2006
+f 1204//2008 1192//1996 1191//1995 1203//2007
+f 1205//2009 1193//1997 1192//1996 1204//2008
+f 1206//2010 1194//1998 1193//1997 1205//2009
+f 1207//2011 1195//1999 1194//1998 1206//2010
+f 1208//2012 1196//2000 1195//1999 1207//2011
+f 1209//2013 1197//2001 1196//2000 1208//2012
+f 1210//2014 1198//2002 1197//2001 1209//2013
+f 1211//2015 1199//2003 1198//2002 1210//2014
+f 1212//2016 1200//2004 1199//2003 1211//2015
+f 909//1805 908//1804 1200//2004 1212//2016
+f 973//1861 1201//2005 893//1797 898//1798
+f 971//1859 1202//2006 1201//2005 973//1861
+f 969//1857 1203//2007 1202//2006 971//1859
+f 966//1854 1204//2008 1203//2007 969//1857
+f 963//1851 1205//2009 1204//2008 966//1854
+f 960//1848 1206//2010 1205//2009 963//1851
+f 958//1846 1207//2011 1206//2010 960//1848
+f 956//1844 1208//2012 1207//2011 958//1846
+f 953//1841 1209//2013 1208//2012 956//1844
+f 952//1840 1210//2014 1209//2013 953//1841
+f 950//1838 1211//2015 1210//2014 952//1840
+f 948//1836 1212//2016 1211//2015 950//1838
+f 912//1808 909//1805 1212//2016 948//1836
+f 1148//1957 1150//1959 988//1876 1000//1887
+f 979//1867 985//1873 1154//1963 1155//1964
+f 927//1823 928//1824 978//1866
+f 1154//1963 985//1873 988//1876 1153//1962
+f 922//1818 975//1863 978//1866 928//1824
+s 23
+f 278//593 859//806 935//816 937//818
+f 150//480 859//806 278//593 277//592
+g aft
+f 1093//873 447//756 433//743 1081//866
+g hull
+s 120
+f 922//2036 923//2037 921//2035
+s 23
+f 1000//830 1002//831 1004//833 1148//884
+g keel
+s 21
+f 848//438 125//408 124//407 846//436
+g aft
+s 140
+f 901//2067 1126//2071 1121//2069
+g hull
+s 113
+f 927//1823 978//1866 979//1867 1155//1964
+f 943//1832 931//1827 929//1825 942//1831
+f 944//1833 942//1831 929//1825 926//1822
+g deck
+s 23
+f 1164//900 938//819 943//824
+g hull
+s 113
+f 988//1876 1150//1959 1153//1962
+g rig
+f 1009//1892 1010//1893 1028//1907 1029//1908
+f 1011//1894 1031//1910 1028//1907 1010//1893
+s off
+f 1029//128 1007//128 1008//128 1009//128
+g aft
+s 142
+f 1106//2083 1127//2084 1131//2086 1130//2085
+s 30
+f 1088//983 1114//996 1115//997 1087//982
+f 1088//983 1116//998 1112//995 1114//996
+g hull
+s 113
+f 924//1820 923//1819 928//1824 930//1826
+f 925//1821 924//1820 930//1826 932//1828
+f 914//1810 925//1821 932//1828 934//1829
+f 923//1819 922//1818 928//1824
+s 45
+f 1067//1084 1065//1082 1063//1080
+g rig
+s 113
+f 1030//1909 1012//1895 1013//1896 1021//1904
+f 1031//1910 1011//1894 1012//1895 1030//1909
+f 989//1877 998//1886 1001//1888
+f 986//1874 990//1878 991//1879 996//1884 998//1886 989//1877
+f 1043//1922 1040//1919 1041//1920 1044//1923 1045//1924 1054//1928
+f 1054//1928 1045//1924 1056//1930
+g sail2
+s 143
+f 1217//2101 1216//2100 1213//2097 1214//2098
+f 1240//2115 1239//2114 1238//2113 1237//2112 1215//2099 1218//2102 1217//2101 1214//2098 1241//2116
+f 1220//2104 1219//2103 1216//2100 1217//2101
+f 1221//2105 1220//2104 1217//2101 1218//2102
+f 1223//2107 1222//2106 1219//2103 1220//2104
+f 1224//2108 1223//2107 1220//2104 1221//2105
+f 1226//2110 1225//2109 1222//2106 1223//2107
+f 1227//2111 1226//2110 1223//2107 1224//2108
+s 144
+f 1229//2216 1228//2215 1225//2212 1226//2213
+f 1230//2217 1229//2216 1226//2213 1227//2214
+f 1232//2219 1231//2218 1228//2215 1229//2216
+f 1233//2220 1232//2219 1229//2216 1230//2217
+f 1235//2222 1234//2221 1231//2218 1232//2219
+f 1236//2223 1242//2224 1243//2225 1244//2226 1245//2227 1246//2228 1235//2222 1232//2219 1233//2220
+f 1214//2211 1213//2210 1234//2221 1235//2222
+s off
+f 1216//129 1219//129 1222//129 1225//129 1228//129 1231//129 1234//129 1213//129
+s 143
+f 1248//2118 1241//2116 1214//2098
+f 1248//2118 1249//2119 1240//2115 1241//2116
+f 1249//2119 1250//2120 1239//2114 1240//2115
+f 1250//2120 1251//2121 1238//2113 1239//2114
+f 1251//2121 1252//2122 1237//2112 1238//2113
+f 1252//2122 1253//2123 1215//2099 1237//2112
+f 1254//2124 1255//2125 1249//2119
+f 1255//2125 1256//2126 1251//2121 1250//2120
+f 1256//2126 1257//2127 1252//2122 1251//2121
+f 1257//2127 1258//2128 1253//2123 1252//2122
+f 1259//2129 1260//2130 1257//2127 1256//2126
+f 1260//2130 1261//2131 1258//2128 1257//2127
+f 1247//2117 1248//2118 1214//2098
+f 1249//2119 1248//2118 1254//2124
+f 1250//2120 1249//2119 1255//2125
+f 1262//2132 1263//2133 1248//2118 1247//2117
+f 1263//2133 1254//2124 1248//2118
+f 1264//2134 1265//2135 1263//2133 1262//2132
+f 1265//2135 1266//2136 1254//2124 1263//2133
+f 1266//2136 1267//2137 1254//2124
+f 1267//2137 1259//2129 1256//2126 1255//2125
+f 1268//2138 1269//2139 1265//2135 1264//2134
+f 1269//2139 1270//2140 1266//2136 1265//2135
+f 1270//2140 1271//2141 1267//2137 1266//2136
+f 1271//2141 1272//2142 1259//2129 1267//2137
+f 1272//2142 1273//2143 1260//2130 1259//2129
+f 1273//2143 1274//2144 1261//2131 1260//2130
+f 1275//2145 1276//2146 1269//2139 1268//2138
+f 1276//2146 1277//2147 1270//2140 1269//2139
+f 1277//2147 1278//2148 1271//2141 1270//2140
+f 1278//2148 1279//2149 1272//2142 1271//2141
+f 1279//2149 1280//2150 1273//2143 1272//2142
+f 1280//2150 1281//2151 1274//2144 1273//2143
+f 1282//2152 1283//2153 1276//2146 1275//2145
+f 1283//2153 1284//2154 1277//2147 1276//2146
+f 1284//2154 1285//2155 1278//2148 1277//2147
+f 1285//2155 1286//2156 1279//2149 1278//2148
+f 1286//2156 1287//2157 1280//2150 1279//2149
+f 1287//2157 1288//2158 1281//2151 1280//2150
+f 1255//2125 1254//2124 1267//2137
+s 145
+f 1291//2265 1290//2264 1289//2263
+f 1294//2268 1293//2267 1292//2266 1290//2264
+f 1293//2267 1296//2270 1295//2269 1292//2266
+f 1296//2270 1298//2272 1297//2271 1295//2269
+f 1292//2266 1295//2269 1300//2274 1299//2273
+f 1295//2269 1297//2271 1301//2275 1300//2274
+f 1289//2263 1302//2276 1291//2265
+f 1290//2264 1291//2265 1294//2268
+f 1247//2251 1302//2276 1303//2277 1262//2252
+f 1302//2276 1289//2263 1303//2277
+f 1262//2252 1303//2277 1304//2278 1264//2253
+f 1303//2277 1289//2263 1305//2279 1304//2278
+f 1289//2263 1306//2280 1305//2279
+f 1290//2264 1292//2266 1299//2273 1306//2280
+f 1264//2253 1304//2278 1307//2281 1268//2254
+f 1304//2278 1305//2279 1308//2282 1307//2281
+f 1305//2279 1306//2280 1309//2283 1308//2282
+f 1306//2280 1299//2273 1310//2284 1309//2283
+f 1299//2273 1300//2274 1311//2285 1310//2284
+f 1300//2274 1301//2275 1312//2286 1311//2285
+f 1268//2254 1307//2281 1313//2287 1275//2255
+f 1307//2281 1308//2282 1314//2288 1313//2287
+f 1308//2282 1309//2283 1315//2289 1314//2288
+f 1309//2283 1310//2284 1316//2290 1315//2289
+f 1310//2284 1311//2285 1317//2291 1316//2290
+f 1311//2285 1312//2286 1318//2292 1317//2291
+f 1275//2255 1313//2287 1283//2257 1282//2256
+f 1313//2287 1314//2288 1284//2258 1283//2257
+f 1314//2288 1315//2289 1285//2259 1284//2258
+f 1315//2289 1316//2290 1286//2260 1285//2259
+f 1316//2290 1317//2291 1287//2261 1286//2260
+f 1317//2291 1318//2292 1288//2262 1287//2261
+f 1306//2280 1289//2263 1290//2264
+f 1298//2272 1296//2270 1242//2246 1236//2245
+s off
+f 1247//130 1214//130 1235//130
+s 145
+f 1302//2276 1247//2251 1235//2244 1246//2250
+f 1291//2265 1302//2276 1246//2250 1245//2249
+f 1294//2268 1291//2265 1245//2249 1244//2248
+f 1293//2267 1294//2268 1244//2248 1243//2247
+f 1296//2270 1293//2267 1243//2247 1242//2246
+s 143
+f 1322//2162 1321//2161 1320//2160 1319//2159
+f 1327//2167 1322//2162 1319//2159 1218//2102 1215//2099 1326//2166 1325//2165 1324//2164 1323//2163
+f 1319//2159 1320//2160 1329//2169 1328//2168
+f 1218//2102 1319//2159 1328//2168 1221//2105
+f 1328//2168 1329//2169 1331//2171 1330//2170
+f 1221//2105 1328//2168 1330//2170 1224//2108
+f 1330//2170 1331//2171 1333//2173 1332//2172
+f 1224//2108 1330//2170 1332//2172 1227//2111
+s 144
+f 1332//2231 1333//2232 1335//2234 1334//2233
+f 1227//2214 1332//2231 1334//2233 1230//2217
+f 1334//2233 1335//2234 1337//2236 1336//2235
+f 1230//2217 1334//2233 1336//2235 1233//2220
+f 1336//2235 1337//2236 1339//2238 1338//2237
+f 1233//2220 1336//2235 1338//2237 1344//2243 1343//2242 1342//2241 1341//2240 1340//2239 1236//2223
+f 1338//2237 1339//2238 1321//2229 1322//2230
+s off
+f 1321//131 1339//131 1337//131 1335//131 1333//131 1331//131 1329//131 1320//131
+s 143
+f 1322//2162 1327//2167 1345//2174
+f 1327//2167 1323//2163 1346//2175 1345//2174
+f 1323//2163 1324//2164 1347//2176 1346//2175
+f 1324//2164 1325//2165 1348//2177 1347//2176
+f 1325//2165 1326//2166 1349//2178 1348//2177
+f 1326//2166 1215//2099 1253//2123 1349//2178
+f 1346//2175 1351//2180 1350//2179
+f 1347//2176 1348//2177 1352//2181 1351//2180
+f 1348//2177 1349//2178 1353//2182 1352//2181
+f 1349//2178 1253//2123 1258//2128 1353//2182
+f 1352//2181 1353//2182 1355//2184 1354//2183
+f 1353//2182 1258//2128 1261//2131 1355//2184
+f 1322//2162 1345//2174 1356//2185
+f 1350//2179 1345//2174 1346//2175
+f 1351//2180 1346//2175 1347//2176
+f 1356//2185 1345//2174 1358//2187 1357//2186
+f 1345//2174 1350//2179 1358//2187
+f 1357//2186 1358//2187 1360//2189 1359//2188
+f 1358//2187 1350//2179 1361//2190 1360//2189
+f 1350//2179 1362//2191 1361//2190
+f 1351//2180 1352//2181 1354//2183 1362//2191
+f 1359//2188 1360//2189 1364//2193 1363//2192
+f 1360//2189 1361//2190 1365//2194 1364//2193
+f 1361//2190 1362//2191 1366//2195 1365//2194
+f 1362//2191 1354//2183 1367//2196 1366//2195
+f 1354//2183 1355//2184 1368//2197 1367//2196
+f 1355//2184 1261//2131 1274//2144 1368//2197
+f 1363//2192 1364//2193 1370//2199 1369//2198
+f 1364//2193 1365//2194 1371//2200 1370//2199
+f 1365//2194 1366//2195 1372//2201 1371//2200
+f 1366//2195 1367//2196 1373//2202 1372//2201
+f 1367//2196 1368//2197 1374//2203 1373//2202
+f 1368//2197 1274//2144 1281//2151 1374//2203
+f 1369//2198 1370//2199 1376//2205 1375//2204
+f 1370//2199 1371//2200 1377//2206 1376//2205
+f 1371//2200 1372//2201 1378//2207 1377//2206
+f 1372//2201 1373//2202 1379//2208 1378//2207
+f 1373//2202 1374//2203 1380//2209 1379//2208
+f 1374//2203 1281//2151 1288//2158 1380//2209
+f 1362//2191 1350//2179 1351//2180
+s 145
+f 1383//2312 1382//2311 1381//2310
+f 1382//2311 1386//2315 1385//2314 1384//2313
+f 1386//2315 1388//2317 1387//2316 1385//2314
+f 1388//2317 1297//2271 1298//2272 1387//2316
+f 1390//2319 1389//2318 1388//2317 1386//2315
+f 1389//2318 1301//2275 1297//2271 1388//2317
+f 1381//2310 1391//2320 1383//2312
+f 1384//2313 1381//2310 1382//2311
+f 1357//2300 1392//2321 1391//2320 1356//2299
+f 1392//2321 1383//2312 1391//2320
+f 1359//2301 1393//2322 1392//2321 1357//2300
+f 1393//2322 1394//2323 1383//2312 1392//2321
+f 1394//2323 1395//2324 1383//2312
+f 1395//2324 1390//2319 1386//2315 1382//2311
+f 1363//2302 1396//2325 1393//2322 1359//2301
+f 1396//2325 1397//2326 1394//2323 1393//2322
+f 1397//2326 1398//2327 1395//2324 1394//2323
+f 1398//2327 1399//2328 1390//2319 1395//2324
+f 1399//2328 1400//2329 1389//2318 1390//2319
+f 1400//2329 1312//2286 1301//2275 1389//2318
+f 1369//2303 1401//2330 1396//2325 1363//2302
+f 1401//2330 1402//2331 1397//2326 1396//2325
+f 1402//2331 1403//2332 1398//2327 1397//2326
+f 1403//2332 1404//2333 1399//2328 1398//2327
+f 1404//2333 1405//2334 1400//2329 1399//2328
+f 1405//2334 1318//2292 1312//2286 1400//2329
+f 1375//2304 1376//2305 1401//2330 1369//2303
+f 1376//2305 1377//2306 1402//2331 1401//2330
+f 1377//2306 1378//2307 1403//2332 1402//2331
+f 1378//2307 1379//2308 1404//2333 1403//2332
+f 1379//2308 1380//2309 1405//2334 1404//2333
+f 1380//2309 1288//2262 1318//2292 1405//2334
+f 1382//2311 1383//2312 1395//2324
+f 1236//2245 1340//2294 1387//2316 1298//2272
+s off
+f 1338//132 1322//132 1356//132
+s 145
+f 1344//2298 1338//2293 1356//2299 1391//2320
+f 1343//2297 1344//2298 1391//2320 1381//2310
+f 1342//2296 1343//2297 1381//2310 1384//2313
+f 1341//2295 1342//2296 1384//2313 1385//2314
+f 1340//2294 1341//2295 1385//2314 1387//2316
+g sail1
+s 151
+f 1438//2353 1437//2352 1436//2351 1435//2350 1407//2336 1410//2339 1409//2338 1406//2335 1439//2354
+f 1411//2340 1410//2339 1407//2336 1408//2337
+f 1413//2342 1412//2341 1409//2338 1410//2339
+f 1414//2343 1413//2342 1410//2339 1411//2340
+f 1416//2345 1415//2344 1412//2341 1413//2342
+f 1417//2346 1416//2345 1413//2342 1414//2343
+f 1419//2348 1418//2347 1415//2344 1416//2345
+f 1420//2349 1419//2348 1416//2345 1417//2346
+s 152
+f 1422//2454 1421//2453 1418//2450 1419//2451
+f 1423//2455 1422//2454 1419//2451 1420//2452
+f 1425//2457 1424//2456 1421//2453 1422//2454
+f 1426//2458 1425//2457 1422//2454 1423//2455
+f 1428//2460 1430//2462 1431//2463 1432//2464 1433//2465 1434//2466 1427//2459 1424//2456 1425//2457
+f 1429//2461 1428//2460 1425//2457 1426//2458
+f 1408//2449 1407//2448 1428//2460 1429//2461
+s off
+f 1429//133 1426//133 1423//133 1420//133 1417//133 1414//133 1411//133 1408//133
+s 151
+f 1440//2355 1441//2356 1439//2354 1406//2335
+f 1441//2356 1442//2357 1438//2353 1439//2354
+f 1442//2357 1443//2358 1437//2352 1438//2353
+f 1443//2358 1444//2359 1436//2351 1437//2352
+f 1444//2359 1445//2360 1435//2350 1436//2351
+f 1446//2361 1407//2336 1445//2360
+f 1447//2362 1448//2363 1441//2356 1440//2355
+f 1448//2363 1449//2364 1442//2357 1441//2356
+f 1449//2364 1450//2365 1443//2358 1442//2357
+f 1450//2365 1444//2359 1443//2358
+f 1451//2366 1445//2360 1444//2359
+f 1452//2367 1453//2368 1446//2361 1445//2360
+f 1454//2369 1455//2370 1448//2363 1447//2362
+f 1455//2370 1456//2371 1449//2364 1448//2363
+f 1456//2371 1457//2372 1450//2365 1449//2364
+f 1457//2372 1451//2366 1450//2365
+f 1458//2373 1459//2374 1452//2367 1451//2366
+f 1459//2374 1460//2375 1453//2368 1452//2367
+f 1461//2376 1462//2377 1455//2370 1454//2369
+f 1462//2377 1463//2378 1456//2371 1455//2370
+f 1463//2378 1464//2379 1457//2372 1456//2371
+f 1464//2379 1465//2380 1458//2373 1457//2372
+f 1465//2380 1466//2381 1459//2374 1458//2373
+f 1466//2381 1467//2382 1460//2375 1459//2374
+f 1468//2383 1469//2384 1462//2377 1461//2376
+f 1469//2384 1470//2385 1463//2378 1462//2377
+f 1470//2385 1471//2386 1464//2379 1463//2378
+f 1471//2386 1472//2387 1465//2380 1464//2379
+f 1472//2387 1473//2388 1466//2381 1465//2380
+f 1473//2388 1474//2389 1467//2382 1466//2381
+f 1475//2390 1476//2391 1469//2384 1468//2383
+f 1476//2391 1477//2392 1470//2385 1469//2384
+f 1477//2392 1478//2393 1471//2386 1470//2385
+f 1478//2393 1479//2394 1472//2387 1471//2386
+f 1479//2394 1480//2395 1473//2388 1472//2387
+f 1480//2395 1481//2396 1473//2388
+f 1435//2350 1445//2360 1407//2336
+f 1452//2367 1445//2360 1451//2366
+f 1451//2366 1444//2359 1450//2365
+f 1458//2373 1451//2366 1457//2372
+f 1481//2396 1474//2389 1473//2388
+s 153
+f 1485//2504 1484//2503 1483//2502 1482//2501
+f 1484//2503 1487//2506 1486//2505 1483//2502
+f 1487//2506 1489//2508 1488//2507 1486//2505
+f 1489//2508 1490//2509 1488//2507
+f 1490//2509 1492//2511 1491//2510
+f 1492//2511 1446//2489 1453//2490 1493//2512
+f 1482//2501 1483//2502 1495//2514 1494//2513
+f 1483//2502 1486//2505 1496//2515 1495//2514
+f 1486//2505 1488//2507 1497//2516 1496//2515
+f 1488//2507 1491//2510 1497//2516
+f 1491//2510 1493//2512 1499//2518 1498//2517
+f 1493//2512 1453//2490 1460//2491 1499//2518
+f 1494//2513 1495//2514 1501//2520 1500//2519
+f 1495//2514 1496//2515 1502//2521 1501//2520
+f 1496//2515 1497//2516 1503//2522 1502//2521
+f 1497//2516 1498//2517 1504//2523 1503//2522
+f 1498//2517 1499//2518 1505//2524 1504//2523
+f 1499//2518 1460//2491 1467//2492 1505//2524
+f 1500//2519 1501//2520 1507//2526 1506//2525
+f 1501//2520 1502//2521 1508//2527 1507//2526
+f 1502//2521 1503//2522 1509//2528 1508//2527
+f 1503//2522 1504//2523 1510//2529 1509//2528
+f 1504//2523 1505//2524 1511//2530 1510//2529
+f 1505//2524 1467//2492 1474//2493 1511//2530
+f 1506//2525 1507//2526 1476//2495 1475//2494
+f 1507//2526 1508//2527 1477//2496 1476//2495
+f 1508//2527 1509//2528 1478//2497 1477//2496
+f 1509//2528 1510//2529 1479//2498 1478//2497
+f 1510//2529 1511//2530 1480//2499 1479//2498
+f 1511//2530 1481//2500 1480//2499
+f 1491//2510 1492//2511 1493//2512
+f 1488//2507 1490//2509 1491//2510
+f 1497//2516 1491//2510 1498//2517
+f 1511//2530 1474//2493 1481//2500
+f 1428//2483 1446//2489 1492//2511 1430//2484
+f 1484//2503 1485//2504 1427//2482 1434//2488
+f 1487//2506 1484//2503 1434//2488 1433//2487
+f 1489//2508 1487//2506 1433//2487 1432//2486
+f 1490//2509 1489//2508 1432//2486 1431//2485
+f 1492//2511 1490//2509 1431//2485 1430//2484
+s off
+f 1428//134 1407//134 1446//134
+s 151
+f 1518//2403 1406//2335 1409//2338 1517//2402 1516//2401 1515//2400 1514//2399 1513//2398 1512//2397
+f 1520//2405 1516//2401 1517//2402 1519//2404
+f 1517//2402 1409//2338 1412//2341 1521//2406
+f 1519//2404 1517//2402 1521//2406 1522//2407
+f 1521//2406 1412//2341 1415//2344 1523//2408
+f 1522//2407 1521//2406 1523//2408 1524//2409
+f 1523//2408 1415//2344 1418//2347 1525//2410
+f 1524//2409 1523//2408 1525//2410 1526//2411
+s 152
+f 1525//2469 1418//2450 1421//2453 1527//2471
+f 1526//2470 1525//2469 1527//2471 1528//2472
+f 1527//2471 1421//2453 1424//2456 1529//2473
+f 1528//2472 1527//2471 1529//2473 1530//2474
+f 1529//2473 1424//2456 1427//2459 1536//2480 1535//2479 1534//2478 1533//2477 1532//2476 1531//2475
+f 1530//2474 1529//2473 1531//2475 1537//2481
+f 1537//2481 1531//2475 1516//2467 1520//2468
+s off
+f 1520//135 1519//135 1522//135 1524//135 1526//135 1528//135 1530//135 1537//135
+s 151
+f 1406//2335 1518//2403 1538//2412 1440//2355
+f 1518//2403 1512//2397 1539//2413 1538//2412
+f 1512//2397 1513//2398 1540//2414 1539//2413
+f 1513//2398 1514//2399 1541//2415 1540//2414
+f 1514//2399 1515//2400 1542//2416 1541//2415
+f 1542//2416 1516//2401 1543//2417
+f 1440//2355 1538//2412 1544//2418 1447//2362
+f 1538//2412 1539//2413 1545//2419 1544//2418
+f 1539//2413 1540//2414 1546//2420 1545//2419
+f 1540//2414 1541//2415 1546//2420
+f 1541//2415 1542//2416 1547//2421
+f 1542//2416 1543//2417 1549//2423 1548//2422
+f 1447//2362 1544//2418 1550//2424 1454//2369
+f 1544//2418 1545//2419 1551//2425 1550//2424
+f 1545//2419 1546//2420 1552//2426 1551//2425
+f 1546//2420 1547//2421 1552//2426
+f 1547//2421 1548//2422 1554//2428 1553//2427
+f 1548//2422 1549//2423 1555//2429 1554//2428
+f 1454//2369 1550//2424 1556//2430 1461//2376
+f 1550//2424 1551//2425 1557//2431 1556//2430
+f 1551//2425 1552//2426 1558//2432 1557//2431
+f 1552//2426 1553//2427 1559//2433 1558//2432
+f 1553//2427 1554//2428 1560//2434 1559//2433
+f 1554//2428 1555//2429 1561//2435 1560//2434
+f 1461//2376 1556//2430 1562//2436 1468//2383
+f 1556//2430 1557//2431 1563//2437 1562//2436
+f 1557//2431 1558//2432 1564//2438 1563//2437
+f 1558//2432 1559//2433 1565//2439 1564//2438
+f 1559//2433 1560//2434 1566//2440 1565//2439
+f 1560//2434 1561//2435 1567//2441 1566//2440
+f 1468//2383 1562//2436 1568//2442 1475//2390
+f 1562//2436 1563//2437 1569//2443 1568//2442
+f 1563//2437 1564//2438 1570//2444 1569//2443
+f 1564//2438 1565//2439 1571//2445 1570//2444
+f 1565//2439 1566//2440 1572//2446 1571//2445
+f 1566//2440 1573//2447 1572//2446
+f 1516//2401 1542//2416 1515//2400
+f 1547//2421 1542//2416 1548//2422
+f 1546//2420 1541//2415 1547//2421
+f 1552//2426 1547//2421 1553//2427
+f 1566//2440 1567//2441 1573//2447
+s 153
+f 1482//2501 1575//2549 1574//2548 1485//2504
+f 1575//2549 1577//2551 1576//2550 1574//2548
+f 1577//2551 1579//2553 1578//2552 1576//2550
+f 1579//2553 1580//2554 1578//2552
+f 1582//2556 1581//2555 1580//2554
+f 1583//2557 1549//2538 1543//2537 1581//2555
+f 1494//2513 1584//2558 1575//2549 1482//2501
+f 1584//2558 1585//2559 1577//2551 1575//2549
+f 1585//2559 1586//2560 1579//2553 1577//2551
+f 1586//2560 1582//2556 1579//2553
+f 1588//2562 1587//2561 1583//2557 1582//2556
+f 1587//2561 1555//2539 1549//2538 1583//2557
+f 1500//2519 1589//2563 1584//2558 1494//2513
+f 1589//2563 1590//2564 1585//2559 1584//2558
+f 1590//2564 1591//2565 1586//2560 1585//2559
+f 1591//2565 1592//2566 1588//2562 1586//2560
+f 1592//2566 1593//2567 1587//2561 1588//2562
+f 1593//2567 1561//2540 1555//2539 1587//2561
+f 1506//2525 1594//2568 1589//2563 1500//2519
+f 1594//2568 1595//2569 1590//2564 1589//2563
+f 1595//2569 1596//2570 1591//2565 1590//2564
+f 1596//2570 1597//2571 1592//2566 1591//2565
+f 1597//2571 1598//2572 1593//2567 1592//2566
+f 1598//2572 1567//2541 1561//2540 1593//2567
+f 1475//2494 1568//2542 1594//2568 1506//2525
+f 1568//2542 1569//2543 1595//2569 1594//2568
+f 1569//2543 1570//2544 1596//2570 1595//2569
+f 1570//2544 1571//2545 1597//2571 1596//2570
+f 1571//2545 1572//2546 1598//2572 1597//2571
+f 1572//2546 1573//2547 1598//2572
+f 1583//2557 1581//2555 1582//2556
+f 1582//2556 1580//2554 1579//2553
+f 1588//2562 1582//2556 1586//2560
+f 1573//2547 1567//2541 1598//2572
+f 1532//2532 1581//2555 1543//2537 1531//2531
+f 1536//2536 1427//2482 1485//2504 1574//2548
+f 1535//2535 1536//2536 1574//2548 1576//2550
+f 1534//2534 1535//2535 1576//2550 1578//2552
+f 1533//2533 1534//2534 1578//2552 1580//2554
+f 1532//2532 1533//2533 1580//2554 1581//2555
+s off
+f 1543//136 1516//136 1531//136
+g sail5
+s 158
+f 1603//2577 1602//2576 1599//2573 1600//2574
+f 1626//2591 1625//2590 1624//2589 1623//2588 1601//2575 1604//2578 1603//2577 1600//2574 1627//2592
+f 1606//2580 1605//2579 1602//2576 1603//2577
+f 1607//2581 1606//2580 1603//2577 1604//2578
+f 1609//2583 1608//2582 1605//2579 1606//2580
+f 1610//2584 1609//2583 1606//2580 1607//2581
+f 1612//2586 1611//2585 1608//2582 1609//2583
+f 1613//2587 1612//2586 1609//2583 1610//2584
+s 159
+f 1615//2692 1614//2691 1611//2688 1612//2689
+f 1616//2693 1615//2692 1612//2689 1613//2690
+f 1618//2695 1617//2694 1614//2691 1615//2692
+f 1619//2696 1618//2695 1615//2692 1616//2693
+f 1621//2698 1620//2697 1617//2694 1618//2695
+f 1622//2699 1628//2700 1629//2701 1630//2702 1631//2703 1632//2704 1621//2698 1618//2695 1619//2696
+f 1600//2687 1599//2686 1620//2697 1621//2698
+s off
+f 1602//137 1605//137 1608//137 1611//137 1614//137 1617//137 1620//137 1599//137
+s 158
+f 1634//2594 1627//2592 1600//2574
+f 1634//2594 1635//2595 1626//2591 1627//2592
+f 1635//2595 1636//2596 1625//2590 1626//2591
+f 1636//2596 1637//2597 1624//2589 1625//2590
+f 1637//2597 1638//2598 1623//2588 1624//2589
+f 1638//2598 1639//2599 1601//2575 1623//2588
+f 1640//2600 1641//2601 1635//2595
+f 1641//2601 1642//2602 1637//2597 1636//2596
+f 1642//2602 1643//2603 1638//2598 1637//2597
+f 1643//2603 1644//2604 1639//2599 1638//2598
+f 1645//2605 1646//2606 1643//2603 1642//2602
+f 1646//2606 1647//2607 1644//2604 1643//2603
+f 1633//2593 1634//2594 1600//2574
+f 1635//2595 1634//2594 1640//2600
+f 1636//2596 1635//2595 1641//2601
+f 1648//2608 1649//2609 1634//2594 1633//2593
+f 1649//2609 1640//2600 1634//2594
+f 1650//2610 1651//2611 1649//2609 1648//2608
+f 1651//2611 1652//2612 1640//2600 1649//2609
+f 1652//2612 1653//2613 1640//2600
+f 1653//2613 1645//2605 1642//2602 1641//2601
+f 1654//2614 1655//2615 1651//2611 1650//2610
+f 1655//2615 1656//2616 1652//2612 1651//2611
+f 1656//2616 1657//2617 1653//2613 1652//2612
+f 1657//2617 1658//2618 1645//2605 1653//2613
+f 1658//2618 1659//2619 1646//2606 1645//2605
+f 1659//2619 1660//2620 1647//2607 1646//2606
+f 1661//2621 1662//2622 1655//2615 1654//2614
+f 1662//2622 1663//2623 1656//2616 1655//2615
+f 1663//2623 1664//2624 1657//2617 1656//2616
+f 1664//2624 1665//2625 1658//2618 1657//2617
+f 1665//2625 1666//2626 1659//2619 1658//2618
+f 1666//2626 1667//2627 1660//2620 1659//2619
+f 1668//2628 1669//2629 1662//2622 1661//2621
+f 1669//2629 1670//2630 1663//2623 1662//2622
+f 1670//2630 1671//2631 1664//2624 1663//2623
+f 1671//2631 1672//2632 1665//2625 1664//2624
+f 1672//2632 1673//2633 1666//2626 1665//2625
+f 1673//2633 1674//2634 1667//2627 1666//2626
+f 1641//2601 1640//2600 1653//2613
+s 160
+f 1677//2741 1676//2740 1675//2739
+f 1680//2744 1679//2743 1678//2742 1676//2740
+f 1679//2743 1682//2746 1681//2745 1678//2742
+f 1682//2746 1684//2748 1683//2747 1681//2745
+f 1678//2742 1681//2745 1686//2750 1685//2749
+f 1681//2745 1683//2747 1687//2751 1686//2750
+f 1675//2739 1688//2752 1677//2741
+f 1676//2740 1677//2741 1680//2744
+f 1633//2727 1688//2752 1689//2753 1648//2728
+f 1688//2752 1675//2739 1689//2753
+f 1648//2728 1689//2753 1690//2754 1650//2729
+f 1689//2753 1675//2739 1691//2755 1690//2754
+f 1675//2739 1692//2756 1691//2755
+f 1676//2740 1678//2742 1685//2749 1692//2756
+f 1650//2729 1690//2754 1693//2757 1654//2730
+f 1690//2754 1691//2755 1694//2758 1693//2757
+f 1691//2755 1692//2756 1695//2759 1694//2758
+f 1692//2756 1685//2749 1696//2760 1695//2759
+f 1685//2749 1686//2750 1697//2761 1696//2760
+f 1686//2750 1687//2751 1698//2762 1697//2761
+f 1654//2730 1693//2757 1699//2763 1661//2731
+f 1693//2757 1694//2758 1700//2764 1699//2763
+f 1694//2758 1695//2759 1701//2765 1700//2764
+f 1695//2759 1696//2760 1702//2766 1701//2765
+f 1696//2760 1697//2761 1703//2767 1702//2766
+f 1697//2761 1698//2762 1704//2768 1703//2767
+f 1661//2731 1699//2763 1669//2733 1668//2732
+f 1699//2763 1700//2764 1670//2734 1669//2733
+f 1700//2764 1701//2765 1671//2735 1670//2734
+f 1701//2765 1702//2766 1672//2736 1671//2735
+f 1702//2766 1703//2767 1673//2737 1672//2736
+f 1703//2767 1704//2768 1674//2738 1673//2737
+f 1692//2756 1675//2739 1676//2740
+f 1684//2748 1682//2746 1628//2722 1622//2721
+s off
+f 1633//138 1600//138 1621//138
+s 160
+f 1688//2752 1633//2727 1621//2720 1632//2726
+f 1677//2741 1688//2752 1632//2726 1631//2725
+f 1680//2744 1677//2741 1631//2725 1630//2724
+f 1679//2743 1680//2744 1630//2724 1629//2723
+f 1682//2746 1679//2743 1629//2723 1628//2722
+s 158
+f 1708//2638 1707//2637 1706//2636 1705//2635
+f 1713//2643 1708//2638 1705//2635 1604//2578 1601//2575 1712//2642 1711//2641 1710//2640 1709//2639
+f 1705//2635 1706//2636 1715//2645 1714//2644
+f 1604//2578 1705//2635 1714//2644 1607//2581
+f 1714//2644 1715//2645 1717//2647 1716//2646
+f 1607//2581 1714//2644 1716//2646 1610//2584
+f 1716//2646 1717//2647 1719//2649 1718//2648
+f 1610//2584 1716//2646 1718//2648 1613//2587
+s 159
+f 1718//2707 1719//2708 1721//2710 1720//2709
+f 1613//2690 1718//2707 1720//2709 1616//2693
+f 1720//2709 1721//2710 1723//2712 1722//2711
+f 1616//2693 1720//2709 1722//2711 1619//2696
+f 1722//2711 1723//2712 1725//2714 1724//2713
+f 1619//2696 1722//2711 1724//2713 1730//2719 1729//2718 1728//2717 1727//2716 1726//2715 1622//2699
+f 1724//2713 1725//2714 1707//2705 1708//2706
+s off
+f 1707//139 1725//139 1723//139 1721//139 1719//139 1717//139 1715//139 1706//139
+s 158
+f 1708//2638 1713//2643 1731//2650
+f 1713//2643 1709//2639 1732//2651 1731//2650
+f 1709//2639 1710//2640 1733//2652 1732//2651
+f 1710//2640 1711//2641 1734//2653 1733//2652
+f 1711//2641 1712//2642 1735//2654 1734//2653
+f 1712//2642 1601//2575 1639//2599 1735//2654
+f 1732//2651 1737//2656 1736//2655
+f 1733//2652 1734//2653 1738//2657 1737//2656
+f 1734//2653 1735//2654 1739//2658 1738//2657
+f 1735//2654 1639//2599 1644//2604 1739//2658
+f 1738//2657 1739//2658 1741//2660 1740//2659
+f 1739//2658 1644//2604 1647//2607 1741//2660
+f 1708//2638 1731//2650 1742//2661
+f 1736//2655 1731//2650 1732//2651
+f 1737//2656 1732//2651 1733//2652
+f 1742//2661 1731//2650 1744//2663 1743//2662
+f 1731//2650 1736//2655 1744//2663
+f 1743//2662 1744//2663 1746//2665 1745//2664
+f 1744//2663 1736//2655 1747//2666 1746//2665
+f 1736//2655 1748//2667 1747//2666
+f 1737//2656 1738//2657 1740//2659 1748//2667
+f 1745//2664 1746//2665 1750//2669 1749//2668
+f 1746//2665 1747//2666 1751//2670 1750//2669
+f 1747//2666 1748//2667 1752//2671 1751//2670
+f 1748//2667 1740//2659 1753//2672 1752//2671
+f 1740//2659 1741//2660 1754//2673 1753//2672
+f 1741//2660 1647//2607 1660//2620 1754//2673
+f 1749//2668 1750//2669 1756//2675 1755//2674
+f 1750//2669 1751//2670 1757//2676 1756//2675
+f 1751//2670 1752//2671 1758//2677 1757//2676
+f 1752//2671 1753//2672 1759//2678 1758//2677
+f 1753//2672 1754//2673 1760//2679 1759//2678
+f 1754//2673 1660//2620 1667//2627 1760//2679
+f 1755//2674 1756//2675 1762//2681 1761//2680
+f 1756//2675 1757//2676 1763//2682 1762//2681
+f 1757//2676 1758//2677 1764//2683 1763//2682
+f 1758//2677 1759//2678 1765//2684 1764//2683
+f 1759//2678 1760//2679 1766//2685 1765//2684
+f 1760//2679 1667//2627 1674//2634 1766//2685
+f 1748//2667 1736//2655 1737//2656
+s 160
+f 1769//2788 1768//2787 1767//2786
+f 1768//2787 1772//2791 1771//2790 1770//2789
+f 1772//2791 1774//2793 1773//2792 1771//2790
+f 1774//2793 1683//2747 1684//2748 1773//2792
+f 1776//2795 1775//2794 1774//2793 1772//2791
+f 1775//2794 1687//2751 1683//2747 1774//2793
+f 1767//2786 1777//2796 1769//2788
+f 1770//2789 1767//2786 1768//2787
+f 1743//2776 1778//2797 1777//2796 1742//2775
+f 1778//2797 1769//2788 1777//2796
+f 1745//2777 1779//2798 1778//2797 1743//2776
+f 1779//2798 1780//2799 1769//2788 1778//2797
+f 1780//2799 1781//2800 1769//2788
+f 1781//2800 1776//2795 1772//2791 1768//2787
+f 1749//2778 1782//2801 1779//2798 1745//2777
+f 1782//2801 1783//2802 1780//2799 1779//2798
+f 1783//2802 1784//2803 1781//2800 1780//2799
+f 1784//2803 1785//2804 1776//2795 1781//2800
+f 1785//2804 1786//2805 1775//2794 1776//2795
+f 1786//2805 1698//2762 1687//2751 1775//2794
+f 1755//2779 1787//2806 1782//2801 1749//2778
+f 1787//2806 1788//2807 1783//2802 1782//2801
+f 1788//2807 1789//2808 1784//2803 1783//2802
+f 1789//2808 1790//2809 1785//2804 1784//2803
+f 1790//2809 1791//2810 1786//2805 1785//2804
+f 1791//2810 1704//2768 1698//2762 1786//2805
+f 1761//2780 1762//2781 1787//2806 1755//2779
+f 1762//2781 1763//2782 1788//2807 1787//2806
+f 1763//2782 1764//2783 1789//2808 1788//2807
+f 1764//2783 1765//2784 1790//2809 1789//2808
+f 1765//2784 1766//2785 1791//2810 1790//2809
+f 1766//2785 1674//2738 1704//2768 1791//2810
+f 1768//2787 1769//2788 1781//2800
+f 1622//2721 1726//2770 1773//2792 1684//2748
+s off
+f 1724//140 1708//140 1742//140
+s 160
+f 1730//2774 1724//2769 1742//2775 1777//2796
+f 1729//2773 1730//2774 1777//2796 1767//2786
+f 1728//2772 1729//2773 1767//2786 1770//2789
+f 1727//2771 1728//2772 1770//2789 1771//2790
+f 1726//2770 1727//2771 1771//2790 1773//2792
+g sail4
+s 166
+f 1824//2829 1823//2828 1822//2827 1821//2826 1793//2812 1796//2815 1795//2814 1792//2811 1825//2830
+f 1797//2816 1796//2815 1793//2812 1794//2813
+f 1799//2818 1798//2817 1795//2814 1796//2815
+f 1800//2819 1799//2818 1796//2815 1797//2816
+f 1802//2821 1801//2820 1798//2817 1799//2818
+f 1803//2822 1802//2821 1799//2818 1800//2819
+f 1805//2824 1804//2823 1801//2820 1802//2821
+f 1806//2825 1805//2824 1802//2821 1803//2822
+s 167
+f 1808//2930 1807//2929 1804//2926 1805//2927
+f 1809//2931 1808//2930 1805//2927 1806//2928
+f 1811//2933 1810//2932 1807//2929 1808//2930
+f 1812//2934 1811//2933 1808//2930 1809//2931
+f 1814//2936 1816//2938 1817//2939 1818//2940 1819//2941 1820//2942 1813//2935 1810//2932 1811//2933
+f 1815//2937 1814//2936 1811//2933 1812//2934
+f 1794//2925 1793//2924 1814//2936 1815//2937
+s off
+f 1815//141 1812//141 1809//141 1806//141 1803//141 1800//141 1797//141 1794//141
+s 166
+f 1826//2831 1827//2832 1825//2830 1792//2811
+f 1827//2832 1828//2833 1824//2829 1825//2830
+f 1828//2833 1829//2834 1823//2828 1824//2829
+f 1829//2834 1830//2835 1822//2827 1823//2828
+f 1830//2835 1831//2836 1821//2826 1822//2827
+f 1832//2837 1793//2812 1831//2836
+f 1833//2838 1834//2839 1827//2832 1826//2831
+f 1834//2839 1835//2840 1828//2833 1827//2832
+f 1835//2840 1836//2841 1829//2834 1828//2833
+f 1836//2841 1830//2835 1829//2834
+f 1837//2842 1831//2836 1830//2835
+f 1838//2843 1839//2844 1832//2837 1831//2836
+f 1840//2845 1841//2846 1834//2839 1833//2838
+f 1841//2846 1842//2847 1835//2840 1834//2839
+f 1842//2847 1843//2848 1836//2841 1835//2840
+f 1843//2848 1837//2842 1836//2841
+f 1844//2849 1845//2850 1838//2843 1837//2842
+f 1845//2850 1846//2851 1839//2844 1838//2843
+f 1847//2852 1848//2853 1841//2846 1840//2845
+f 1848//2853 1849//2854 1842//2847 1841//2846
+f 1849//2854 1850//2855 1843//2848 1842//2847
+f 1850//2855 1851//2856 1844//2849 1843//2848
+f 1851//2856 1852//2857 1845//2850 1844//2849
+f 1852//2857 1853//2858 1846//2851 1845//2850
+f 1854//2859 1855//2860 1848//2853 1847//2852
+f 1855//2860 1856//2861 1849//2854 1848//2853
+f 1856//2861 1857//2862 1850//2855 1849//2854
+f 1857//2862 1858//2863 1851//2856 1850//2855
+f 1858//2863 1859//2864 1852//2857 1851//2856
+f 1859//2864 1860//2865 1853//2858 1852//2857
+f 1861//2866 1862//2867 1855//2860 1854//2859
+f 1862//2867 1863//2868 1856//2861 1855//2860
+f 1863//2868 1864//2869 1857//2862 1856//2861
+f 1864//2869 1865//2870 1858//2863 1857//2862
+f 1865//2870 1866//2871 1859//2864 1858//2863
+f 1866//2871 1867//2872 1859//2864
+f 1821//2826 1831//2836 1793//2812
+f 1838//2843 1831//2836 1837//2842
+f 1837//2842 1830//2835 1836//2841
+f 1844//2849 1837//2842 1843//2848
+f 1867//2872 1860//2865 1859//2864
+s 168
+f 1871//2980 1870//2979 1869//2978 1868//2977
+f 1870//2979 1873//2982 1872//2981 1869//2978
+f 1873//2982 1875//2984 1874//2983 1872//2981
+f 1875//2984 1876//2985 1874//2983
+f 1876//2985 1878//2987 1877//2986
+f 1878//2987 1832//2965 1839//2966 1879//2988
+f 1868//2977 1869//2978 1881//2990 1880//2989
+f 1869//2978 1872//2981 1882//2991 1881//2990
+f 1872//2981 1874//2983 1883//2992 1882//2991
+f 1874//2983 1877//2986 1883//2992
+f 1877//2986 1879//2988 1885//2994 1884//2993
+f 1879//2988 1839//2966 1846//2967 1885//2994
+f 1880//2989 1881//2990 1887//2996 1886//2995
+f 1881//2990 1882//2991 1888//2997 1887//2996
+f 1882//2991 1883//2992 1889//2998 1888//2997
+f 1883//2992 1884//2993 1890//2999 1889//2998
+f 1884//2993 1885//2994 1891//3000 1890//2999
+f 1885//2994 1846//2967 1853//2968 1891//3000
+f 1886//2995 1887//2996 1893//3002 1892//3001
+f 1887//2996 1888//2997 1894//3003 1893//3002
+f 1888//2997 1889//2998 1895//3004 1894//3003
+f 1889//2998 1890//2999 1896//3005 1895//3004
+f 1890//2999 1891//3000 1897//3006 1896//3005
+f 1891//3000 1853//2968 1860//2969 1897//3006
+f 1892//3001 1893//3002 1862//2971 1861//2970
+f 1893//3002 1894//3003 1863//2972 1862//2971
+f 1894//3003 1895//3004 1864//2973 1863//2972
+f 1895//3004 1896//3005 1865//2974 1864//2973
+f 1896//3005 1897//3006 1866//2975 1865//2974
+f 1897//3006 1867//2976 1866//2975
+f 1877//2986 1878//2987 1879//2988
+f 1874//2983 1876//2985 1877//2986
+f 1883//2992 1877//2986 1884//2993
+f 1897//3006 1860//2969 1867//2976
+f 1814//2959 1832//2965 1878//2987 1816//2960
+f 1870//2979 1871//2980 1813//2958 1820//2964
+f 1873//2982 1870//2979 1820//2964 1819//2963
+f 1875//2984 1873//2982 1819//2963 1818//2962
+f 1876//2985 1875//2984 1818//2962 1817//2961
+f 1878//2987 1876//2985 1817//2961 1816//2960
+s off
+f 1814//142 1793//142 1832//142
+s 166
+f 1904//2879 1792//2811 1795//2814 1903//2878 1902//2877 1901//2876 1900//2875 1899//2874 1898//2873
+f 1906//2881 1902//2877 1903//2878 1905//2880
+f 1903//2878 1795//2814 1798//2817 1907//2882
+f 1905//2880 1903//2878 1907//2882 1908//2883
+f 1907//2882 1798//2817 1801//2820 1909//2884
+f 1908//2883 1907//2882 1909//2884 1910//2885
+f 1909//2884 1801//2820 1804//2823 1911//2886
+f 1910//2885 1909//2884 1911//2886 1912//2887
+s 167
+f 1911//2945 1804//2926 1807//2929 1913//2947
+f 1912//2946 1911//2945 1913//2947 1914//2948
+f 1913//2947 1807//2929 1810//2932 1915//2949
+f 1914//2948 1913//2947 1915//2949 1916//2950
+f 1915//2949 1810//2932 1813//2935 1922//2956 1921//2955 1920//2954 1919//2953 1918//2952 1917//2951
+f 1916//2950 1915//2949 1917//2951 1923//2957
+f 1923//2957 1917//2951 1902//2943 1906//2944
+s off
+f 1906//143 1905//143 1908//143 1910//143 1912//143 1914//143 1916//143 1923//143
+s 166
+f 1792//2811 1904//2879 1924//2888 1826//2831
+f 1904//2879 1898//2873 1925//2889 1924//2888
+f 1898//2873 1899//2874 1926//2890 1925//2889
+f 1899//2874 1900//2875 1927//2891 1926//2890
+f 1900//2875 1901//2876 1928//2892 1927//2891
+f 1928//2892 1902//2877 1929//2893
+f 1826//2831 1924//2888 1930//2894 1833//2838
+f 1924//2888 1925//2889 1931//2895 1930//2894
+f 1925//2889 1926//2890 1932//2896 1931//2895
+f 1926//2890 1927//2891 1932//2896
+f 1927//2891 1928//2892 1933//2897
+f 1928//2892 1929//2893 1935//2899 1934//2898
+f 1833//2838 1930//2894 1936//2900 1840//2845
+f 1930//2894 1931//2895 1937//2901 1936//2900
+f 1931//2895 1932//2896 1938//2902 1937//2901
+f 1932//2896 1933//2897 1938//2902
+f 1933//2897 1934//2898 1940//2904 1939//2903
+f 1934//2898 1935//2899 1941//2905 1940//2904
+f 1840//2845 1936//2900 1942//2906 1847//2852
+f 1936//2900 1937//2901 1943//2907 1942//2906
+f 1937//2901 1938//2902 1944//2908 1943//2907
+f 1938//2902 1939//2903 1945//2909 1944//2908
+f 1939//2903 1940//2904 1946//2910 1945//2909
+f 1940//2904 1941//2905 1947//2911 1946//2910
+f 1847//2852 1942//2906 1948//2912 1854//2859
+f 1942//2906 1943//2907 1949//2913 1948//2912
+f 1943//2907 1944//2908 1950//2914 1949//2913
+f 1944//2908 1945//2909 1951//2915 1950//2914
+f 1945//2909 1946//2910 1952//2916 1951//2915
+f 1946//2910 1947//2911 1953//2917 1952//2916
+f 1854//2859 1948//2912 1954//2918 1861//2866
+f 1948//2912 1949//2913 1955//2919 1954//2918
+f 1949//2913 1950//2914 1956//2920 1955//2919
+f 1950//2914 1951//2915 1957//2921 1956//2920
+f 1951//2915 1952//2916 1958//2922 1957//2921
+f 1952//2916 1959//2923 1958//2922
+f 1902//2877 1928//2892 1901//2876
+f 1933//2897 1928//2892 1934//2898
+f 1932//2896 1927//2891 1933//2897
+f 1938//2902 1933//2897 1939//2903
+f 1952//2916 1953//2917 1959//2923
+s 168
+f 1868//2977 1961//3025 1960//3024 1871//2980
+f 1961//3025 1963//3027 1962//3026 1960//3024
+f 1963//3027 1965//3029 1964//3028 1962//3026
+f 1965//3029 1966//3030 1964//3028
+f 1968//3032 1967//3031 1966//3030
+f 1969//3033 1935//3014 1929//3013 1967//3031
+f 1880//2989 1970//3034 1961//3025 1868//2977
+f 1970//3034 1971//3035 1963//3027 1961//3025
+f 1971//3035 1972//3036 1965//3029 1963//3027
+f 1972//3036 1968//3032 1965//3029
+f 1974//3038 1973//3037 1969//3033 1968//3032
+f 1973//3037 1941//3015 1935//3014 1969//3033
+f 1886//2995 1975//3039 1970//3034 1880//2989
+f 1975//3039 1976//3040 1971//3035 1970//3034
+f 1976//3040 1977//3041 1972//3036 1971//3035
+f 1977//3041 1978//3042 1974//3038 1972//3036
+f 1978//3042 1979//3043 1973//3037 1974//3038
+f 1979//3043 1947//3016 1941//3015 1973//3037
+f 1892//3001 1980//3044 1975//3039 1886//2995
+f 1980//3044 1981//3045 1976//3040 1975//3039
+f 1981//3045 1982//3046 1977//3041 1976//3040
+f 1982//3046 1983//3047 1978//3042 1977//3041
+f 1983//3047 1984//3048 1979//3043 1978//3042
+f 1984//3048 1953//3017 1947//3016 1979//3043
+f 1861//2970 1954//3018 1980//3044 1892//3001
+f 1954//3018 1955//3019 1981//3045 1980//3044
+f 1955//3019 1956//3020 1982//3046 1981//3045
+f 1956//3020 1957//3021 1983//3047 1982//3046
+f 1957//3021 1958//3022 1984//3048 1983//3047
+f 1958//3022 1959//3023 1984//3048
+f 1969//3033 1967//3031 1968//3032
+f 1968//3032 1966//3030 1965//3029
+f 1974//3038 1968//3032 1972//3036
+f 1959//3023 1953//3017 1984//3048
+f 1918//3008 1967//3031 1929//3013 1917//3007
+f 1922//3012 1813//2958 1871//2980 1960//3024
+f 1921//3011 1922//3012 1960//3024 1962//3026
+f 1920//3010 1921//3011 1962//3026 1964//3028
+f 1919//3009 1920//3010 1964//3028 1966//3030
+f 1918//3008 1919//3009 1966//3030 1967//3031
+s off
+f 1929//144 1902//144 1917//144
+g sail6
+s 173
+f 1985//3049 1986//3050 1987//3051 1988//3052
+f 1989//3053 1990//3054 1991//3055 1992//3056 1993//3057 1994//3058 1985//3049 1988//3052 1995//3059
+f 1996//3060 1997//3061 1986//3050 1985//3049
+f 1998//3062 1996//3060 1985//3049 1994//3058
+f 1999//3063 2000//3064 1997//3061 1996//3060
+f 2001//3065 1999//3063 1996//3060 1998//3062
+f 2002//3066 2003//3067 2000//3064 1999//3063
+f 2004//3068 2002//3066 1999//3063 2001//3065
+s 174
+f 2005//3167 2006//3168 2003//3165 2002//3164
+f 2007//3169 2005//3167 2002//3164 2004//3166
+f 2008//3170 2009//3171 2006//3168 2005//3167
+f 2010//3172 2008//3170 2005//3167 2007//3169
+f 2011//3173 2012//3174 2009//3171 2008//3170
+f 2013//3175 2014//3176 2015//3177 2016//3178 2017//3179 2018//3180 2011//3173 2008//3170 2010//3172
+f 1988//3163 1987//3162 2012//3174 2011//3173
+s off
+f 1986//145 1997//145 2000//145 2003//145 2006//145 2009//145 2012//145 1987//145
+s 173
+f 2019//3069 1995//3059 1988//3052
+f 2019//3069 2020//3070 1989//3053 1995//3059
+f 2020//3070 2021//3071 1990//3054 1989//3053
+f 2021//3071 2022//3072 1991//3055 1990//3054
+f 2022//3072 2023//3073 1992//3056 1991//3055
+f 2023//3073 2024//3074 1993//3057 1992//3056
+f 2025//3075 2026//3076 2020//3070
+f 2026//3076 2027//3077 2022//3072 2021//3071
+f 2027//3077 2028//3078 2023//3073 2022//3072
+f 2028//3078 2029//3079 2024//3074 2023//3073
+f 2030//3080 2031//3081 2028//3078 2027//3077
+f 2031//3081 2032//3082 2029//3079 2028//3078
+f 2033//3083 2019//3069 1988//3052
+f 2020//3070 2019//3069 2025//3075
+f 2021//3071 2020//3070 2026//3076
+f 2034//3084 2035//3085 2019//3069 2033//3083
+f 2035//3085 2025//3075 2019//3069
+f 2036//3086 2037//3087 2035//3085 2034//3084
+f 2037//3087 2038//3088 2025//3075 2035//3085
+f 2038//3088 2039//3089 2025//3075
+f 2039//3089 2030//3080 2027//3077 2026//3076
+f 2040//3090 2041//3091 2037//3087 2036//3086
+f 2041//3091 2042//3092 2038//3088 2037//3087
+f 2042//3092 2043//3093 2039//3089 2038//3088
+f 2043//3093 2044//3094 2030//3080 2039//3089
+f 2044//3094 2045//3095 2031//3081 2030//3080
+f 2045//3095 2046//3096 2032//3082 2031//3081
+f 2047//3097 2048//3098 2041//3091 2040//3090
+f 2048//3098 2049//3099 2042//3092 2041//3091
+f 2049//3099 2050//3100 2043//3093 2042//3092
+f 2050//3100 2051//3101 2044//3094 2043//3093
+f 2051//3101 2052//3102 2045//3095 2044//3094
+f 2052//3102 2053//3103 2046//3096 2045//3095
+f 2054//3104 2055//3105 2048//3098 2047//3097
+f 2055//3105 2056//3106 2049//3099 2048//3098
+f 2056//3106 2057//3107 2050//3100 2049//3099
+f 2057//3107 2058//3108 2051//3101 2050//3100
+f 2058//3108 2059//3109 2052//3102 2051//3101
+f 2059//3109 2060//3110 2053//3103 2052//3102
+f 2026//3076 2025//3075 2039//3089
+s 175
+f 2061//3215 2062//3216 2063//3217
+f 2064//3218 2065//3219 2066//3220 2062//3216
+f 2065//3219 2067//3221 2068//3222 2066//3220
+f 2067//3221 2069//3223 2070//3224 2068//3222
+f 2066//3220 2068//3222 2071//3225 2072//3226
+f 2068//3222 2070//3224 2073//3227 2071//3225
+f 2063//3217 2074//3228 2061//3215
+f 2062//3216 2061//3215 2064//3218
+f 2033//3203 2074//3228 2075//3229 2034//3204
+f 2074//3228 2063//3217 2075//3229
+f 2034//3204 2075//3229 2076//3230 2036//3205
+f 2075//3229 2063//3217 2077//3231 2076//3230
+f 2063//3217 2078//3232 2077//3231
+f 2062//3216 2066//3220 2072//3226 2078//3232
+f 2036//3205 2076//3230 2079//3233 2040//3206
+f 2076//3230 2077//3231 2080//3234 2079//3233
+f 2077//3231 2078//3232 2081//3235 2080//3234
+f 2078//3232 2072//3226 2082//3236 2081//3235
+f 2072//3226 2071//3225 2083//3237 2082//3236
+f 2071//3225 2073//3227 2084//3238 2083//3237
+f 2040//3206 2079//3233 2085//3239 2047//3207
+f 2079//3233 2080//3234 2086//3240 2085//3239
+f 2080//3234 2081//3235 2087//3241 2086//3240
+f 2081//3235 2082//3236 2088//3242 2087//3241
+f 2082//3236 2083//3237 2089//3243 2088//3242
+f 2083//3237 2084//3238 2090//3244 2089//3243
+f 2047//3207 2085//3239 2055//3209 2054//3208
+f 2085//3239 2086//3240 2056//3210 2055//3209
+f 2086//3240 2087//3241 2057//3211 2056//3210
+f 2087//3241 2088//3242 2058//3212 2057//3211
+f 2088//3242 2089//3243 2059//3213 2058//3212
+f 2089//3243 2090//3244 2060//3214 2059//3213
+f 2078//3232 2063//3217 2062//3216
+f 2069//3223 2067//3221 2014//3198 2013//3197
+s off
+f 2033//146 1988//146 2011//146
+s 175
+f 2074//3228 2033//3203 2011//3196 2018//3202
+f 2061//3215 2074//3228 2018//3202 2017//3201
+f 2064//3218 2061//3215 2017//3201 2016//3200
+f 2065//3219 2064//3218 2016//3200 2015//3199
+f 2067//3221 2065//3219 2015//3199 2014//3198
+s 173
+f 2091//3111 2092//3112 2093//3113 2094//3114
+f 2095//3115 2091//3111 2094//3114 1994//3058 1993//3057 2096//3116 2097//3117 2098//3118 2099//3119
+f 2094//3114 2093//3113 2100//3120 2101//3121
+f 1994//3058 2094//3114 2101//3121 1998//3062
+f 2101//3121 2100//3120 2102//3122 2103//3123
+f 1998//3062 2101//3121 2103//3123 2001//3065
+f 2103//3123 2102//3122 2104//3124 2105//3125
+f 2001//3065 2103//3123 2105//3125 2004//3068
+s 174
+f 2105//3184 2104//3183 2106//3185 2107//3186
+f 2004//3166 2105//3184 2107//3186 2007//3169
+f 2107//3186 2106//3185 2108//3187 2109//3188
+f 2007//3169 2107//3186 2109//3188 2010//3172
+f 2109//3188 2108//3187 2110//3189 2111//3190
+f 2010//3172 2109//3188 2111//3190 2112//3191 2113//3192 2114//3193 2115//3194 2116//3195 2013//3175
+f 2111//3190 2110//3189 2092//3182 2091//3181
+s off
+f 2092//147 2110//147 2108//147 2106//147 2104//147 2102//147 2100//147 2093//147
+s 173
+f 2091//3111 2095//3115 2117//3126
+f 2095//3115 2099//3119 2118//3127 2117//3126
+f 2099//3119 2098//3118 2119//3128 2118//3127
+f 2098//3118 2097//3117 2120//3129 2119//3128
+f 2097//3117 2096//3116 2121//3130 2120//3129
+f 2096//3116 1993//3057 2024//3074 2121//3130
+f 2118//3127 2122//3131 2123//3132
+f 2119//3128 2120//3129 2124//3133 2122//3131
+f 2120//3129 2121//3130 2125//3134 2124//3133
+f 2121//3130 2024//3074 2029//3079 2125//3134
+f 2124//3133 2125//3134 2126//3135 2127//3136
+f 2125//3134 2029//3079 2032//3082 2126//3135
+f 2091//3111 2117//3126 2128//3137
+f 2123//3132 2117//3126 2118//3127
+f 2122//3131 2118//3127 2119//3128
+f 2128//3137 2117//3126 2129//3138 2130//3139
+f 2117//3126 2123//3132 2129//3138
+f 2130//3139 2129//3138 2131//3140 2132//3141
+f 2129//3138 2123//3132 2133//3142 2131//3140
+f 2123//3132 2134//3143 2133//3142
+f 2122//3131 2124//3133 2127//3136 2134//3143
+f 2132//3141 2131//3140 2135//3144 2136//3145
+f 2131//3140 2133//3142 2137//3146 2135//3144
+f 2133//3142 2134//3143 2138//3147 2137//3146
+f 2134//3143 2127//3136 2139//3148 2138//3147
+f 2127//3136 2126//3135 2140//3149 2139//3148
+f 2126//3135 2032//3082 2046//3096 2140//3149
+f 2136//3145 2135//3144 2141//3150 2142//3151
+f 2135//3144 2137//3146 2143//3152 2141//3150
+f 2137//3146 2138//3147 2144//3153 2143//3152
+f 2138//3147 2139//3148 2145//3154 2144//3153
+f 2139//3148 2140//3149 2146//3155 2145//3154
+f 2140//3149 2046//3096 2053//3103 2146//3155
+f 2142//3151 2141//3150 2147//3156 2148//3157
+f 2141//3150 2143//3152 2149//3158 2147//3156
+f 2143//3152 2144//3153 2150//3159 2149//3158
+f 2144//3153 2145//3154 2151//3160 2150//3159
+f 2145//3154 2146//3155 2152//3161 2151//3160
+f 2146//3155 2053//3103 2060//3110 2152//3161
+f 2134//3143 2123//3132 2122//3131
+s 175
+f 2153//3262 2154//3263 2155//3264
+f 2154//3263 2156//3265 2157//3266 2158//3267
+f 2156//3265 2159//3268 2160//3269 2157//3266
+f 2159//3268 2070//3224 2069//3223 2160//3269
+f 2161//3270 2162//3271 2159//3268 2156//3265
+f 2162//3271 2073//3227 2070//3224 2159//3268
+f 2155//3264 2163//3272 2153//3262
+f 2158//3267 2155//3264 2154//3263
+f 2130//3252 2164//3273 2163//3272 2128//3251
+f 2164//3273 2153//3262 2163//3272
+f 2132//3253 2165//3274 2164//3273 2130//3252
+f 2165//3274 2166//3275 2153//3262 2164//3273
+f 2166//3275 2167//3276 2153//3262
+f 2167//3276 2161//3270 2156//3265 2154//3263
+f 2136//3254 2168//3277 2165//3274 2132//3253
+f 2168//3277 2169//3278 2166//3275 2165//3274
+f 2169//3278 2170//3279 2167//3276 2166//3275
+f 2170//3279 2171//3280 2161//3270 2167//3276
+f 2171//3280 2172//3281 2162//3271 2161//3270
+f 2172//3281 2084//3238 2073//3227 2162//3271
+f 2142//3255 2173//3282 2168//3277 2136//3254
+f 2173//3282 2174//3283 2169//3278 2168//3277
+f 2174//3283 2175//3284 2170//3279 2169//3278
+f 2175//3284 2176//3285 2171//3280 2170//3279
+f 2176//3285 2177//3286 2172//3281 2171//3280
+f 2177//3286 2090//3244 2084//3238 2172//3281
+f 2148//3257 2147//3256 2173//3282 2142//3255
+f 2147//3256 2149//3258 2174//3283 2173//3282
+f 2149//3258 2150//3259 2175//3284 2174//3283
+f 2150//3259 2151//3260 2176//3285 2175//3284
+f 2151//3260 2152//3261 2177//3286 2176//3285
+f 2152//3261 2060//3214 2090//3244 2177//3286
+f 2154//3263 2153//3262 2167//3276
+f 2013//3197 2116//3250 2160//3269 2069//3223
+s off
+f 2111//148 2091//148 2128//148
+s 175
+f 2112//3246 2111//3245 2128//3251 2163//3272
+f 2113//3247 2112//3246 2163//3272 2155//3264
+f 2114//3248 2113//3247 2155//3264 2158//3267
+f 2115//3249 2114//3248 2158//3267 2157//3266
+f 2116//3250 2115//3249 2157//3266 2160//3269
+g sail3
+s 181
+f 2181//3290 2180//3289 2179//3288 2178//3287
+f 2187//3296 2184//3293 2185//3294 2186//3295
+f 2178//3287 2179//3288 2189//3298 2188//3297
+f 2183//3292 2178//3287 2188//3297 2190//3299
+f 2185//3294 2183//3292 2190//3299 2191//3300
+f 2186//3295 2185//3294 2191//3300 2192//3301
+f 2188//3297 2189//3298 2194//3303 2193//3302
+f 2190//3299 2188//3297 2193//3302 2195//3304
+f 2191//3300 2190//3299 2195//3304 2196//3305
+f 2192//3301 2191//3300 2196//3305 2197//3306
+f 2193//3302 2194//3303 2199//3308 2198//3307
+f 2195//3304 2193//3302 2198//3307 2200//3309
+f 2196//3305 2195//3304 2200//3309 2201//3310
+f 2197//3306 2196//3305 2201//3310 2202//3311
+s 182
+f 2198//3317 2199//3318 2204//3323 2203//3322
+f 2200//3319 2198//3317 2203//3322 2205//3324
+f 2201//3320 2200//3319 2205//3324 2206//3325
+f 2202//3321 2201//3320 2206//3325 2207//3326
+f 2203//3322 2204//3323 2209//3328 2208//3327
+f 2207//3326 2206//3325 2211//3330 2212//3331
+f 2208//3327 2209//3328 2214//3333 2213//3332
+f 2212//3331 2211//3330 2216//3335 2217//3336
+f 2213//3332 2214//3333 2180//3312 2181//3313
+f 2217//3336 2216//3335 2184//3315 2187//3316
+s off
+f 2180//149 2214//149 2209//149 2204//149 2199//149 2194//149 2189//149 2179//149
+f 2187//150 2186//150 2192//150 2197//150 2202//150 2207//150 2212//150 2217//150
+s 182
+f 2213//3332 2181//3313 2182//3314 2215//3334
+f 2182//3314 2184//3315 2216//3335 2215//3334
+f 2231//3350 2241//3360 2233//3352 2218//3337
+f 2231//3350 2226//3345 2242//3361 2241//3360
+f 2242//3361 2226//3345 2230//3349
+f 2230//3349 2225//3344 2246//3365 2245//3364
+f 2245//3364 2244//3363 2242//3361 2230//3349
+f 2242//3361 2244//3363 2243//3362 2241//3360
+f 2233//3352 2241//3360 2243//3362 2232//3351
+f 2232//3351 2243//3362 2235//3354 2234//3353
+f 2235//3354 2243//3362 2244//3363 2236//3355
+f 2236//3355 2244//3363 2245//3364 2237//3356
+f 2237//3356 2245//3364 2246//3365 2238//3357
+f 2239//3358 2229//3348 2227//3346 2240//3359
+f 2240//3359 2227//3346 2228//3347
+f 2228//3347 2208//3327 2224//3343
+f 2224//3343 2222//3341 2240//3359 2228//3347
+f 2222//3341 2223//3342 2239//3358 2240//3359
+f 2239//3358 2223//3342 2210//3329 2238//3357
+f 2238//3357 2210//3329 2221//3340 2237//3356
+f 2237//3356 2221//3340 2219//3338 2236//3355
+f 2236//3355 2219//3338 2220//3339 2235//3354
+f 2235//3354 2220//3339 2211//3330 2234//3353
+f 2246//3365 2225//3344 2229//3348
+f 2229//3348 2239//3358 2238//3357 2246//3365
+f 2218//3337 2233//3352 2247//3366 2231//3350
+f 2247//3366 2248//3367 2226//3345 2231//3350
+f 2230//3349 2226//3345 2248//3367
+f 2249//3368 2250//3369 2225//3344 2230//3349
+f 2230//3349 2248//3367 2251//3370 2249//3368
+f 2247//3366 2252//3371 2251//3370 2248//3367
+f 2232//3351 2252//3371 2247//3366 2233//3352
+f 2234//3353 2253//3372 2252//3371 2232//3351
+f 2254//3373 2251//3370 2252//3371 2253//3372
+f 2255//3374 2249//3368 2251//3370 2254//3373
+f 2256//3375 2250//3369 2249//3368 2255//3374
+f 2257//3376 2227//3346 2229//3348 2258//3377
+f 2228//3347 2227//3346 2257//3376
+f 2229//3348 2225//3344 2250//3369
+f 2250//3369 2256//3375 2258//3377 2229//3348
+f 2228//3347 2257//3376 2258//3377 2205//3324 2203//3322
+f 2253//3372 2234//3353 2206//3325
+f 2255//3374 2254//3373 2253//3372 2206//3325 2205//3324
+f 2256//3375 2255//3374 2205//3324
+f 2258//3377 2256//3375 2205//3324
+f 2234//3353 2211//3330 2206//3325
+f 2228//3347 2203//3322 2208//3327
+s 181
+f 2182//3291 2181//3290 2178//3287 2183//3292
+f 2185//3294 2184//3293 2182//3291 2183//3292
+s 182
+f 2210//3329 2223//3342 2222//3341 2224//3343 2208//3327 2213//3332 2215//3334
+f 2210//3329 2215//3334 2216//3335 2211//3330 2220//3339 2219//3338 2221//3340
+g mast2
+s 1
+f 33//192 34//193 2259//200 31//191
+s 2
+f 34//206 35//207 2260//215 2259//214
+s 3
+f 35//222 36//223 2261//231 2260//230
+s 4
+f 36//238 37//239 2262//247 2261//246
+s 5
+f 37//258 38//259 2263//281 2262//280
+f 38//259 39//260 2265//283 2264//282 2263//281
+f 39//260 40//261 2266//284 2265//283
+s 6
+f 40//298 41//299 2267//307 2266//306
+s 7
+f 41//314 42//315 2268//323 2267//322
+s 8
+f 42//330 43//331 2269//339 2268//338
+s 9
+f 43//346 44//347 2270//355 2269//354
+s 10
+f 44//362 45//363 2271//371 2270//370
+s 11
+f 45//380 46//381 32//379 2271//388
+s 1
+f 31//191 2259//200 2272//201 29//190
+s 2
+f 2259//214 2260//215 2273//217 2272//216
+s 3
+f 2260//230 2261//231 2274//233 2273//232
+s 4
+f 2261//246 2262//247 2275//249 2274//248
+s 5
+f 2262//280 2263//281 2278//288 2277//287 2276//286 2275//285
+s off
+f 2282//151 2281//151 2280//151 2279//151
+s 5
+f 2265//283 2266//284 2284//290 2283//289
+s 6
+f 2266//306 2267//307 2285//309 2284//308
+s 7
+f 2267//322 2268//323 2286//325 2285//324
+s 8
+f 2268//338 2269//339 2287//341 2286//340
+s 9
+f 2269//354 2270//355 2288//357 2287//356
+s 10
+f 2270//370 2271//371 2289//373 2288//372
+s 11
+f 2271//388 32//379 30//378 2289//389
+s 1
+f 29//190 2272//201 16//189 15//188
+s 2
+f 2272//216 2273//217 17//205 16//204
+s 3
+f 2273//232 2274//233 18//221 17//220
+s 4
+f 2274//248 2275//249 19//237 18//236
+s 5
+f 2275//285 2276//286 20//255 19//254
+f 2276//286 2290//291 2283//289 21//256 20//255
+f 2283//289 2284//290 22//257 21//256
+s 6
+f 2284//308 2285//309 23//297 22//296
+s 7
+f 2285//324 2286//325 24//313 23//312
+s 8
+f 2286//340 2287//341 25//329 24//328
+s 9
+f 2287//356 2288//357 26//345 25//344
+s 10
+f 2288//372 2289//373 27//361 26//360
+s 11
+f 2289//389 30//378 28//377 27//376
+s 5
+f 2292//293 2291//292 2264//282 2265//283 2283//289 2290//291
+s off
+f 2296//152 2295//152 2294//152 2293//152
+f 2300//153 2299//153 2298//153 2297//153
+f 2264//154 2291//154 2293//154 2294//154
+f 2291//155 2278//155 2296//155 2293//155
+f 2278//156 2263//156 2295//156 2296//156
+f 2263//157 2264//157 2294//157 2295//157
+f 2276//158 2277//158 2279//158 2280//158
+f 2277//159 2292//159 2282//159 2279//159
+f 2292//160 2290//160 2281//160 2282//160
+f 2290//161 2276//161 2280//161 2281//161
+f 2277//162 2278//162 2297//162 2298//162
+f 2278//163 2291//163 2300//163 2297//163
+f 2291//164 2292//164 2299//164 2300//164
+f 2292//165 2277//165 2298//165 2299//165
+g mast1
+s 63
+f 573//1201 574//1202 2301//1209 571//1200
+s 64
+f 574//1215 575//1216 2302//1224 2301//1223
+s 65
+f 575//1231 576//1232 2303//1240 2302//1239
+s 66
+f 576//1247 577//1248 2304//1256 2303//1255
+s 67
+f 577//1267 578//1268 2305//1288 2304//1287
+f 578//1268 579//1269 2307//1290 2306//1289 2305//1288
+f 579//1269 580//1270 2308//1291 2307//1290
+s 68
+f 580//1303 581//1304 2309//1312 2308//1311
+s 69
+f 581//1319 582//1320 2310//1328 2309//1327
+s 70
+f 582//1335 583//1336 2311//1344 2310//1343
+s 71
+f 583//1351 584//1352 2312//1360 2311//1359
+s 72
+f 584//1367 585//1368 2313//1376 2312//1375
+s 73
+f 585//1385 586//1386 572//1384 2313//1393
+s 63
+f 571//1200 2301//1209 2314//1210 569//1199
+s 64
+f 2301//1223 2302//1224 2315//1226 2314//1225
+s 65
+f 2302//1239 2303//1240 2316//1242 2315//1241
+s 66
+f 2303//1255 2304//1256 2317//1258 2316//1257
+s 67
+f 2304//1287 2305//1288 2319//1294 2318//1293 2317//1292
+f 2322//1297 2306//1289 2307//1290 2321//1296 2320//1295
+f 2307//1290 2308//1291 2323//1298 2321//1296
+s 68
+f 2308//1311 2309//1312 2324//1314 2323//1313
+s 69
+f 2309//1327 2310//1328 2325//1330 2324//1329
+s 70
+f 2310//1343 2311//1344 2326//1346 2325//1345
+s 71
+f 2311//1359 2312//1360 2327//1362 2326//1361
+s 72
+f 2312//1375 2313//1376 2328//1378 2327//1377
+s 73
+f 2313//1393 572//1384 570//1383 2328//1394
+s 63
+f 569//1199 2314//1210 556//1198 555//1197
+s 64
+f 2314//1225 2315//1226 557//1214 556//1213
+s 65
+f 2315//1241 2316//1242 558//1230 557//1229
+s 66
+f 2316//1257 2317//1258 559//1246 558//1245
+s 67
+f 2317//1292 2318//1293 560//1264 559//1263
+f 2318//1293 2320//1295 2321//1296 561//1265 560//1264
+f 2321//1296 2323//1298 562//1266 561//1265
+s 68
+f 2323//1313 2324//1314 563//1302 562//1301
+s 69
+f 2324//1329 2325//1330 564//1318 563//1317
+s 70
+f 2325//1345 2326//1346 565//1334 564//1333
+s 71
+f 2326//1361 2327//1362 566//1350 565//1349
+s 72
+f 2327//1377 2328//1378 567//1366 566//1365
+s 73
+f 2328//1394 570//1383 568//1382 567//1381
+s off
+f 2332//166 2331//166 2330//166 2329//166
+f 2336//167 2335//167 2334//167 2333//167
+f 2318//168 2319//168 2333//168 2334//168
+f 2319//169 2322//169 2336//169 2333//169
+f 2322//170 2320//170 2335//170 2336//170
+f 2320//171 2318//171 2334//171 2335//171
+f 2305//172 2306//172 2329//172 2330//172
+f 2306//173 2322//173 2332//173 2329//173
+f 2322//174 2319//174 2331//174 2332//174
+f 2319//175 2305//175 2330//175 2331//175
+g mast3
+s 83
+f 673//1401 674//1402 2337//1409 671//1400
+s 84
+f 674//1415 675//1416 2338//1424 2337//1423
+s 85
+f 675//1431 676//1432 2339//1440 2338//1439
+s 86
+f 676//1447 677//1448 2340//1456 2339//1455
+s 87
+f 677//1467 678//1468 2341//1488 2340//1487
+f 678//1468 679//1469 2343//1490 2342//1489 2341//1488
+f 679//1469 680//1470 2344//1491 2343//1490
+s 88
+f 680//1503 681//1504 2345//1512 2344//1511
+s 89
+f 681//1519 682//1520 2346//1528 2345//1527
+s 90
+f 682//1535 683//1536 2347//1544 2346//1543
+s 91
+f 683//1551 684//1552 2348//1560 2347//1559
+s 92
+f 684//1567 685//1568 2349//1576 2348//1575
+s 93
+f 685//1585 686//1586 672//1584 2349//1593
+s 83
+f 671//1400 2337//1409 2350//1410 669//1399
+s 84
+f 2337//1423 2338//1424 2351//1426 2350//1425
+s 85
+f 2338//1439 2339//1440 2352//1442 2351//1441
+s 86
+f 2339//1455 2340//1456 2353//1458 2352//1457
+s 87
+f 2340//1487 2341//1488 2355//1494 2354//1493 2353//1492
+f 2358//1497 2342//1489 2343//1490 2357//1496 2356//1495
+f 2343//1490 2344//1491 2359//1498 2357//1496
+s 88
+f 2344//1511 2345//1512 2360//1514 2359//1513
+s 89
+f 2345//1527 2346//1528 2361//1530 2360//1529
+s 90
+f 2346//1543 2347//1544 2362//1546 2361//1545
+s 91
+f 2347//1559 2348//1560 2363//1562 2362//1561
+s 92
+f 2348//1575 2349//1576 2364//1578 2363//1577
+s 93
+f 2349//1593 672//1584 670//1583 2364//1594
+s 83
+f 669//1399 2350//1410 656//1398 655//1397
+s 84
+f 2350//1425 2351//1426 657//1414 656//1413
+s 85
+f 2351//1441 2352//1442 658//1430 657//1429
+s 86
+f 2352//1457 2353//1458 659//1446 658//1445
+s 87
+f 2353//1492 2354//1493 660//1464 659//1463
+f 2354//1493 2356//1495 2357//1496 661//1465 660//1464
+f 2357//1496 2359//1498 662//1466 661//1465
+s 88
+f 2359//1513 2360//1514 663//1502 662//1501
+s 89
+f 2360//1529 2361//1530 664//1518 663//1517
+s 90
+f 2361//1545 2362//1546 665//1534 664//1533
+s 91
+f 2362//1561 2363//1562 666//1550 665//1549
+s 92
+f 2363//1577 2364//1578 667//1566 666//1565
+s 93
+f 2364//1594 670//1583 668//1582 667//1581
+s off
+f 2368//176 2367//176 2366//176 2365//176
+f 2372//177 2371//177 2370//177 2369//177
+f 2354//178 2355//178 2369//178 2370//178
+f 2355//179 2358//179 2372//179 2369//179
+f 2358//180 2356//180 2371//180 2372//180
+f 2356//181 2354//181 2370//181 2371//181
+f 2341//182 2342//182 2365//182 2366//182
+f 2342//183 2358//183 2368//183 2365//183
+f 2358//184 2355//184 2367//184 2368//184
+f 2355//185 2341//185 2366//185 2367//185
+g deck
+s 23
+f 937//818 280//595 277//592
+f 277//592 280//595 279//594
+# 2384 elements
diff --git a/src/main/resources/geometry/gas.rgb b/src/main/resources/geometry/gas.rgb
new file mode 100644
index 0000000..dc13eb8
--- /dev/null
+++ b/src/main/resources/geometry/gas.rgb
Binary files differ
diff --git a/src/main/resources/geometry/gravel.int b/src/main/resources/geometry/gravel.int
new file mode 100644
index 0000000..33de30e
--- /dev/null
+++ b/src/main/resources/geometry/gravel.int
Binary files differ
diff --git a/src/main/resources/geometry/greenball.lwo b/src/main/resources/geometry/greenball.lwo
new file mode 100644
index 0000000..62cd08d
--- /dev/null
+++ b/src/main/resources/geometry/greenball.lwo
Binary files differ
diff --git a/src/main/resources/geometry/hand1.obj b/src/main/resources/geometry/hand1.obj
new file mode 100644
index 0000000..3cfcd5c
--- /dev/null
+++ b/src/main/resources/geometry/hand1.obj
@@ -0,0 +1,846 @@
+# Mon Jun 02 17:09:33 1997
+#
+#
+
+g hand1
+v -0.551223 0.307562 -3.946050
+v -0.215465 0.030475 -3.703516
+v -0.059140 0.068255 -1.551531
+v -0.487235 0.455792 -4.006029
+v -0.168743 0.090975 -3.755638
+v -0.338689 0.569450 -4.244848
+v -0.639211 0.502297 -4.165243
+v -0.760687 0.647871 -4.482797
+v -0.529792 0.073768 -3.945949
+v -0.707612 0.258064 -4.192451
+v -0.866004 0.446161 -4.511733
+v -0.367733 -0.147323 -4.191223
+v -0.717413 0.071719 -4.433171
+v -0.893823 0.253971 -4.589350
+v -0.172976 -0.188212 -3.754734
+v -0.089148 -0.103984 -1.450071
+v -0.234491 -0.100206 -3.756646
+v -0.131305 -0.032994 -1.531782
+v -0.589492 0.641054 -4.376035
+v -0.050594 -0.257375 -4.417058
+v 0.208857 -0.205637 -4.768191
+v 0.007882 -0.231806 -4.028160
+v 0.230232 -0.186379 -4.335583
+v 0.390435 -0.043258 -4.060836
+v 0.002626 -0.129308 -1.430840
+v -0.058465 -0.217994 -3.717670
+v 0.087189 -0.100005 -1.425612
+v 0.044163 -0.171797 -3.707954
+v 0.044240 0.657156 -4.536777
+v -0.137070 0.604272 -4.344090
+v 0.041139 0.604901 -4.118776
+v -0.080844 0.531805 -3.993031
+v 0.165095 0.484110 -3.906230
+v -0.081629 0.087632 -3.782753
+v -0.013872 0.088823 -1.554481
+v 0.008630 0.041677 -3.708195
+v 0.070162 0.059225 -1.467241
+v 0.349126 0.784380 -4.327246
+v 0.192656 0.707311 -4.316467
+v 0.240026 0.669896 -4.092967
+v 0.614077 0.770599 -4.245997
+v 0.448901 0.789330 -4.242595
+v 0.390683 0.635870 -4.050064
+v 0.823568 1.030378 -5.230011
+v 0.583262 0.935220 -4.789198
+v 0.936485 1.075914 -5.144932
+v 0.708930 0.972489 -4.713959
+v 1.079595 1.050653 -5.079602
+v 0.863290 0.942616 -4.657226
+v 0.731356 0.950572 -5.335061
+v 0.698927 0.816156 -5.569689
+v 0.452954 0.862935 -4.860037
+v 0.354245 0.777679 -5.103039
+v 0.109515 -0.020305 -1.439012
+v 0.321579 0.190660 -3.847763
+v 0.056950 -0.068344 -3.678991
+v 0.551677 0.397382 -4.027330
+v 0.748943 0.261978 -4.201552
+v 0.797463 0.611225 -4.241810
+v 0.934536 0.472987 -4.298673
+v 0.919641 0.370477 -5.597496
+v 1.079582 0.375487 -5.341094
+v 1.225601 0.456396 -5.207421
+v 0.593068 0.043314 -5.202118
+v 0.711852 0.101000 -4.865152
+v 0.871615 0.211454 -4.690717
+v 1.063296 0.399320 -4.647913
+v 1.342637 0.585582 -5.122607
+v 1.150690 0.608137 -4.641154
+v 1.366648 0.748651 -5.071675
+v 0.745367 0.246406 -5.988852
+v 0.494019 -0.022198 -5.740361
+v 0.141480 -0.193021 -5.470416
+v 0.693354 0.148862 -6.455598
+v 0.458179 -0.058425 -6.342125
+v 0.092861 -0.121753 -6.334044
+v 0.001903 0.615014 -5.359071
+v 0.310613 0.694999 -5.659912
+v 0.602326 0.700149 -5.960638
+v 0.014377 0.478587 -6.304075
+v 0.335968 0.619833 -6.312831
+v 0.600780 0.612337 -6.446789
+v -0.303419 0.594566 -6.098518
+v -0.599974 0.655996 -6.132385
+v -0.241202 0.626083 -5.200386
+v -0.457099 0.677790 -5.161324
+v -0.259616 -0.163854 -6.116562
+v -0.183392 -0.223625 -5.241480
+v -0.635209 0.061396 -6.121774
+v -0.504788 -0.103060 -5.122423
+v -0.950019 0.234128 -5.837874
+v -0.810067 0.092804 -5.080121
+v -1.144829 0.478824 -5.746136
+v -0.998398 0.334709 -5.084644
+v -0.994164 0.856674 -5.773610
+v -0.863354 0.756330 -5.102725
+v -0.801998 0.842826 -5.870856
+v -0.671650 0.764754 -5.123487
+v 1.045049 0.802118 -4.632644
+v 1.252493 0.924338 -5.055513
+v -0.995449 0.583125 -5.083862
+v -1.137996 0.713069 -5.735577
+v 1.598002 0.816988 -5.564189
+v 1.599381 0.700758 -5.624741
+v 1.532017 0.614642 -5.716787
+v 1.715526 0.933794 -5.717422
+v 1.699604 0.816034 -5.787023
+v 1.629737 0.731598 -5.898082
+v 1.883043 1.059492 -5.899169
+v 1.855109 0.932664 -5.998640
+v 1.774384 0.842472 -6.140775
+v 1.424351 0.559021 -5.523375
+v 1.505227 0.658051 -5.434678
+v 1.502338 0.787710 -5.373565
+v 1.297397 0.577850 -5.903827
+v 1.425129 0.560695 -5.822476
+v 1.155962 0.509306 -5.718982
+v 1.300644 0.494656 -5.623770
+v 1.509245 0.835318 -6.384689
+v 1.646807 0.801147 -6.286009
+v 1.406474 0.713747 -6.133959
+v 1.525574 0.687385 -6.031679
+v 1.380351 1.065119 -5.565239
+v 1.564172 1.172023 -5.714888
+v 1.780605 1.304970 -5.893034
+v 1.255719 1.087198 -5.619839
+v 1.438416 1.182678 -5.766468
+v 1.652418 1.312790 -5.952035
+v 1.154437 1.043031 -5.702960
+v 1.320461 1.134701 -5.855917
+v 1.512782 1.262635 -6.051604
+v 1.003945 1.036752 -5.521133
+v 1.104476 1.081637 -5.435655
+v 1.236055 1.056913 -5.374795
+v 1.089111 0.843044 -5.888583
+v 1.089661 0.962064 -5.803318
+v 1.230625 0.966122 -6.097103
+v 1.242952 1.066407 -5.981094
+v 1.362597 1.098246 -6.323909
+v 1.405432 1.196541 -6.191591
+v 0.929064 0.824679 -5.709339
+v 0.934340 0.953520 -5.615597
+v 1.859089 1.203879 -5.868989
+v 1.664971 1.072200 -5.695913
+v 1.510868 0.957577 -5.544997
+v 1.391678 0.940769 -5.352942
+v 1.170557 0.692380 -5.926214
+v 1.027666 0.653090 -5.757548
+v 0.869972 0.619560 -5.748698
+v 1.295478 0.827279 -6.155195
+v 1.403801 0.956111 -6.395917
+v 1.981874 0.878914 -6.465936
+v 1.802272 0.826665 -6.577847
+v 1.615752 0.851027 -6.620514
+v 2.128560 0.944598 -6.721747
+v 1.907593 0.869058 -6.790360
+v 1.708489 0.849226 -6.769275
+v 2.238363 1.116521 -6.349912
+v 2.094190 1.105140 -6.141595
+v 2.237261 1.035889 -6.535950
+v 2.075505 0.976585 -6.291769
+v 1.727506 1.346013 -6.328338
+v 1.936762 1.311864 -6.600124
+v 1.576315 1.256378 -6.447272
+v 1.741231 1.205721 -6.680005
+v 1.483882 1.132384 -6.546886
+v 1.595348 1.106596 -6.700094
+v 2.143625 1.363027 -6.343407
+v 2.083770 1.364678 -6.472173
+v 1.997907 1.370713 -6.136065
+v 1.880283 1.392692 -6.219747
+v 2.220069 1.245977 -6.358671
+v 2.223785 1.204368 -6.587201
+v 2.097329 1.131385 -6.757537
+v 1.644286 0.966614 -6.763514
+v 1.867680 1.032451 -6.812611
+v 0.883363 0.124343 -7.228944
+v 0.646839 -0.024425 -7.259110
+v 0.390212 -0.005959 -7.292361
+v 1.070393 0.135169 -7.703971
+v 0.802047 0.006235 -7.763816
+v 0.511476 0.026061 -7.813804
+v 1.163011 0.161832 -8.064369
+v 0.918797 0.093289 -8.161346
+v 0.636154 0.076768 -8.160398
+v 0.269275 -0.049054 -6.787587
+v 0.524823 -0.050661 -6.806285
+v 0.744409 0.117607 -6.839493
+v 0.827585 0.571806 -7.238711
+v 1.016438 0.562215 -7.711038
+v 1.115469 0.520019 -8.067395
+v 0.573132 0.588769 -7.270417
+v 0.731449 0.578986 -7.772986
+v 0.865027 0.502425 -8.164807
+v 0.338782 0.438496 -7.299040
+v 0.460865 0.446711 -7.820236
+v 0.590458 0.430524 -8.163703
+v 0.208617 0.434283 -6.784674
+v 0.437333 0.591011 -6.807528
+v 0.678646 0.577267 -6.844694
+v 0.947532 0.372788 -7.222228
+v 0.797216 0.376391 -6.856188
+v 0.734974 0.417910 -6.504792
+v 1.142651 0.368565 -7.694477
+v 1.195867 0.347815 -8.107895
+v 0.272439 0.191555 -7.307303
+v 0.163854 0.163934 -6.807784
+v 0.050485 0.143298 -6.551455
+v 0.390845 0.216656 -7.842326
+v 0.587957 0.247899 -8.218260
+v -0.187159 -0.021301 -8.489817
+v -0.144520 -0.066015 -8.115219
+v -0.135056 -0.086523 -7.519433
+v -0.455856 -0.036286 -8.505733
+v -0.424768 -0.127085 -8.081474
+v -0.379623 -0.149656 -7.480232
+v -0.721089 0.002465 -8.418228
+v -0.711949 -0.032964 -8.033904
+v -0.633023 -0.036474 -7.439595
+v -0.083764 -0.101907 -6.888419
+v -0.321252 -0.155635 -6.827525
+v -0.570598 -0.013135 -6.792706
+v -0.205536 0.346922 -8.488331
+v -0.478068 0.389386 -8.503635
+v -0.741261 0.375015 -8.416031
+v -0.166164 0.372104 -8.112885
+v -0.454556 0.470532 -8.077909
+v -0.734413 0.413380 -8.030973
+v -0.161420 0.377122 -7.515023
+v -0.412007 0.496828 -7.474960
+v -0.653762 0.440220 -7.436335
+v -0.124968 0.400042 -6.878002
+v -0.359615 0.536135 -6.818819
+v -0.582637 0.502600 -6.791322
+v -0.736234 0.212481 -7.423101
+v -0.655151 0.259193 -6.812274
+v -0.663333 0.364684 -6.389957
+v -0.775997 0.191334 -8.463245
+v -0.822719 0.196893 -8.024588
+v -0.031942 0.130966 -6.924860
+v -0.055396 0.134692 -7.532089
+v -0.056604 0.146553 -8.134798
+v -0.157928 0.161766 -8.546125
+v -1.836226 1.016590 -7.410828
+v -1.627684 0.872918 -7.538481
+v -1.370280 0.758218 -7.595252
+v -1.747767 0.932613 -7.142950
+v -1.528535 0.732919 -7.246038
+v -1.256016 0.658972 -7.340291
+v -1.538345 0.794709 -6.746178
+v -1.346968 0.594312 -6.836720
+v -1.106538 0.540492 -6.926594
+v -1.327304 0.638226 -6.296957
+v -1.144801 0.423090 -6.386161
+v -0.907648 0.349198 -6.500935
+v -1.381548 1.162123 -6.749738
+v -1.167106 1.131764 -6.834267
+v -1.001718 0.954827 -6.919466
+v -1.579033 1.276060 -7.151250
+v -1.336962 1.223187 -7.246882
+v -1.140912 1.040889 -7.333368
+v -1.682336 1.295016 -7.423892
+v -1.479018 1.212733 -7.544489
+v -1.266431 1.072053 -7.592119
+v -1.173291 1.003628 -6.309747
+v -0.980917 0.984092 -6.395974
+v -0.826961 0.810684 -6.501183
+v -0.978037 0.704393 -6.955856
+v -1.119137 0.806439 -7.374477
+v -1.298471 0.903687 -7.643332
+v -0.811802 0.542748 -6.562383
+v -1.320080 0.864534 -6.271852
+v -1.536038 1.021683 -6.715133
+v -1.746360 1.149667 -7.118443
+v -1.808232 1.181964 -7.439637
+v 2.071132 1.255908 -6.105393
+v 1.505985 0.975476 -6.611821
+v 0.931009 0.299286 -8.285854
+v -0.474965 0.178488 -8.633644
+v -1.589683 1.061216 -7.631387
+v 0.763920 0.520049 -6.078023
+# 281 vertices
+
+# 0 texture vertices
+
+# 0 normals
+
+usemtl hand
+f 2 4 1
+f 5 4 2
+f 3 5 2
+f 5 6 4
+f 1 10 9
+f 1 7 10
+f 7 11 10
+f 7 8 11
+f 10 12 9
+f 12 10 13
+f 10 14 13
+f 10 11 14
+f 12 17 9
+f 12 15 17
+f 18 15 16
+f 15 18 17
+f 9 2 1
+f 9 17 2
+f 18 2 17
+f 2 18 3
+f 19 4 6
+f 7 4 19
+f 8 7 19
+f 7 1 4
+f 20 22 12
+f 23 22 20
+f 21 23 20
+f 23 24 22
+f 16 26 25
+f 16 15 26
+f 15 22 26
+f 15 12 22
+f 25 28 27
+f 25 26 28
+f 22 28 26
+f 28 22 24
+f 30 31 29
+f 32 31 30
+f 6 32 30
+f 32 33 31
+f 5 32 6
+f 32 5 34
+f 5 35 34
+f 5 3 35
+f 34 33 32
+f 33 34 36
+f 35 36 34
+f 36 35 37
+f 39 40 38
+f 31 40 39
+f 29 31 39
+f 31 33 40
+f 42 43 41
+f 40 43 42
+f 38 40 42
+f 40 33 43
+f 45 46 44
+f 46 45 47
+f 38 47 45
+f 47 38 42
+f 46 49 48
+f 46 47 49
+f 47 41 49
+f 47 42 41
+f 44 52 45
+f 44 50 52
+f 50 53 52
+f 50 51 53
+f 52 38 45
+f 38 52 39
+f 52 29 39
+f 52 53 29
+f 36 55 33
+f 55 36 56
+f 37 56 36
+f 56 37 54
+f 56 24 55
+f 24 56 28
+f 27 56 54
+f 56 27 28
+f 33 57 43
+f 33 55 57
+f 55 58 57
+f 55 24 58
+f 57 41 43
+f 41 57 59
+f 58 59 57
+f 59 58 60
+f 62 64 61
+f 64 62 65
+f 63 65 62
+f 65 63 66
+f 65 21 64
+f 21 65 23
+f 66 23 65
+f 23 66 24
+f 66 58 24
+f 58 66 67
+f 63 67 66
+f 67 63 68
+f 67 60 58
+f 60 67 69
+f 68 69 67
+f 69 68 70
+f 61 72 71
+f 61 64 72
+f 64 73 72
+f 64 21 73
+f 71 75 74
+f 71 72 75
+f 72 76 75
+f 72 73 76
+f 53 77 29
+f 77 53 78
+f 51 78 53
+f 78 51 79
+f 78 80 77
+f 80 78 81
+f 79 81 78
+f 81 79 82
+f 83 77 80
+f 77 83 85
+f 83 86 85
+f 83 84 86
+f 85 29 77
+f 29 85 30
+f 86 30 85
+f 30 86 6
+f 73 87 76
+f 87 73 88
+f 21 88 73
+f 88 21 20
+f 88 89 87
+f 89 88 90
+f 20 90 88
+f 90 20 12
+f 90 91 89
+f 91 90 92
+f 90 13 92
+f 90 12 13
+f 91 94 93
+f 91 92 94
+f 92 14 94
+f 92 13 14
+f 95 98 97
+f 95 96 98
+f 8 98 96
+f 98 8 19
+f 97 86 84
+f 97 98 86
+f 19 86 98
+f 86 19 6
+f 59 49 41
+f 49 59 99
+f 59 69 99
+f 59 60 69
+f 99 48 49
+f 48 99 100
+f 99 70 100
+f 99 69 70
+f 8 101 11
+f 8 96 101
+f 96 102 101
+f 96 95 102
+f 101 14 11
+f 14 101 94
+f 101 93 94
+f 101 102 93
+f 103 107 106
+f 103 104 107
+f 105 107 104
+f 107 105 108
+f 107 109 106
+f 109 107 110
+f 108 110 107
+f 110 108 111
+f 63 113 68
+f 63 112 113
+f 112 104 113
+f 112 105 104
+f 68 114 70
+f 68 113 114
+f 113 103 114
+f 113 104 103
+f 115 118 117
+f 115 116 118
+f 105 118 116
+f 118 105 112
+f 117 62 61
+f 117 118 62
+f 112 62 118
+f 62 112 63
+f 120 121 119
+f 121 120 122
+f 111 122 120
+f 122 111 108
+f 122 115 121
+f 115 122 116
+f 108 116 122
+f 116 108 105
+f 123 127 126
+f 123 124 127
+f 124 128 127
+f 124 125 128
+f 126 130 129
+f 126 127 130
+f 127 131 130
+f 127 128 131
+f 44 133 132
+f 44 46 133
+f 48 133 46
+f 133 48 134
+f 132 126 129
+f 132 133 126
+f 134 126 133
+f 126 134 123
+f 135 138 137
+f 135 136 138
+f 136 130 138
+f 136 129 130
+f 137 140 139
+f 137 138 140
+f 138 131 140
+f 138 130 131
+f 51 142 141
+f 51 50 142
+f 50 132 142
+f 50 44 132
+f 141 136 135
+f 141 142 136
+f 142 129 136
+f 142 132 129
+f 109 144 106
+f 109 143 144
+f 125 144 143
+f 144 125 124
+f 106 145 103
+f 106 144 145
+f 124 145 144
+f 145 124 123
+f 100 134 48
+f 134 100 146
+f 70 146 100
+f 146 70 114
+f 146 123 134
+f 123 146 145
+f 114 145 146
+f 145 114 103
+f 135 148 141
+f 135 147 148
+f 147 117 148
+f 147 115 117
+f 141 149 51
+f 141 148 149
+f 148 61 149
+f 148 117 61
+f 115 150 121
+f 115 147 150
+f 135 150 147
+f 150 135 137
+f 121 151 119
+f 121 150 151
+f 137 151 150
+f 151 137 139
+f 120 152 111
+f 152 120 153
+f 119 153 120
+f 153 119 154
+f 152 156 155
+f 152 153 156
+f 153 157 156
+f 153 154 157
+f 158 161 160
+f 158 159 161
+f 159 110 161
+f 159 109 110
+f 160 152 155
+f 160 161 152
+f 161 111 152
+f 161 110 111
+f 162 140 131
+f 140 162 164
+f 162 165 164
+f 162 163 165
+f 164 139 140
+f 139 164 166
+f 164 167 166
+f 164 165 167
+f 168 171 170
+f 168 169 171
+f 163 171 169
+f 171 163 162
+f 171 125 170
+f 125 171 128
+f 162 128 171
+f 128 162 131
+f 172 169 168
+f 169 172 173
+f 158 173 172
+f 173 158 160
+f 169 174 163
+f 169 173 174
+f 160 174 173
+f 174 160 155
+f 157 176 156
+f 157 175 176
+f 167 176 175
+f 176 167 165
+f 176 155 156
+f 155 176 174
+f 176 163 174
+f 176 165 163
+f 177 181 180
+f 177 178 181
+f 178 182 181
+f 178 179 182
+f 181 183 180
+f 183 181 184
+f 181 185 184
+f 181 182 185
+f 186 75 76
+f 75 186 187
+f 179 187 186
+f 187 179 178
+f 187 74 75
+f 74 187 188
+f 178 188 187
+f 188 178 177
+f 189 193 192
+f 189 190 193
+f 191 193 190
+f 193 191 194
+f 192 196 195
+f 192 193 196
+f 193 197 196
+f 193 194 197
+f 81 198 80
+f 198 81 199
+f 82 199 81
+f 199 82 200
+f 199 195 198
+f 195 199 192
+f 200 192 199
+f 192 200 189
+f 200 201 189
+f 201 200 202
+f 200 203 202
+f 200 82 203
+f 202 177 201
+f 177 202 188
+f 202 74 188
+f 202 203 74
+f 177 204 201
+f 177 180 204
+f 183 204 180
+f 204 183 205
+f 204 189 201
+f 189 204 190
+f 204 191 190
+f 204 205 191
+f 195 207 198
+f 195 206 207
+f 179 207 206
+f 207 179 186
+f 198 208 80
+f 198 207 208
+f 186 208 207
+f 208 186 76
+f 206 182 179
+f 182 206 209
+f 206 196 209
+f 206 195 196
+f 209 185 182
+f 185 209 210
+f 209 197 210
+f 209 196 197
+f 211 215 214
+f 211 212 215
+f 213 215 212
+f 215 213 216
+f 215 217 214
+f 217 215 218
+f 216 218 215
+f 218 216 219
+f 220 216 213
+f 216 220 221
+f 76 221 220
+f 221 76 87
+f 221 219 216
+f 219 221 222
+f 87 222 221
+f 222 87 89
+f 223 227 226
+f 223 224 227
+f 225 227 224
+f 227 225 228
+f 227 229 226
+f 229 227 230
+f 228 230 227
+f 230 228 231
+f 230 232 229
+f 232 230 233
+f 231 233 230
+f 233 231 234
+f 233 80 232
+f 80 233 83
+f 233 84 83
+f 233 234 84
+f 222 235 219
+f 235 222 236
+f 222 237 236
+f 222 89 237
+f 236 231 235
+f 231 236 234
+f 237 234 236
+f 234 237 84
+f 217 239 238
+f 217 218 239
+f 219 239 218
+f 239 219 235
+f 239 225 238
+f 225 239 228
+f 239 231 228
+f 239 235 231
+f 220 208 76
+f 208 220 240
+f 213 240 220
+f 240 213 241
+f 208 232 80
+f 208 240 232
+f 240 229 232
+f 240 241 229
+f 241 226 229
+f 226 241 242
+f 241 212 242
+f 241 213 212
+f 242 223 226
+f 223 242 243
+f 242 211 243
+f 242 212 211
+f 244 248 247
+f 244 245 248
+f 246 248 245
+f 248 246 249
+f 248 250 247
+f 250 248 251
+f 249 251 248
+f 251 249 252
+f 250 254 253
+f 250 251 254
+f 252 254 251
+f 254 252 255
+f 253 91 93
+f 253 254 91
+f 254 89 91
+f 254 255 89
+f 256 260 259
+f 256 257 260
+f 258 260 257
+f 260 258 261
+f 260 262 259
+f 262 260 263
+f 260 264 263
+f 260 261 264
+f 97 265 95
+f 265 97 266
+f 84 266 97
+f 266 84 267
+f 265 257 256
+f 265 266 257
+f 267 257 266
+f 257 267 258
+f 249 268 252
+f 268 249 269
+f 249 270 269
+f 249 246 270
+f 269 258 268
+f 258 269 261
+f 269 264 261
+f 269 270 264
+f 255 237 89
+f 237 255 271
+f 252 271 255
+f 271 252 268
+f 271 84 237
+f 84 271 267
+f 268 267 271
+f 267 268 258
+f 102 253 93
+f 253 102 272
+f 102 265 272
+f 102 95 265
+f 272 250 253
+f 250 272 273
+f 272 256 273
+f 272 265 256
+f 259 273 256
+f 273 259 274
+f 262 274 259
+f 274 262 275
+f 273 247 250
+f 273 274 247
+f 274 244 247
+f 274 275 244
+f 172 159 158
+f 159 172 276
+f 172 170 276
+f 172 168 170
+f 276 109 159
+f 109 276 143
+f 170 143 276
+f 143 170 125
+f 151 154 119
+f 154 151 277
+f 151 166 277
+f 151 139 166
+f 154 175 157
+f 154 277 175
+f 277 167 175
+f 277 166 167
+f 197 278 210
+f 197 194 278
+f 191 278 194
+f 278 191 205
+f 278 185 210
+f 185 278 184
+f 278 183 184
+f 278 205 183
+f 223 279 224
+f 223 243 279
+f 211 279 243
+f 279 211 214
+f 279 225 224
+f 225 279 238
+f 279 217 238
+f 279 214 217
+f 262 280 275
+f 262 263 280
+f 264 280 263
+f 280 264 270
+f 280 244 275
+f 244 280 245
+f 270 245 280
+f 245 270 246
+f 74 281 71
+f 74 203 281
+f 82 281 203
+f 281 82 79
+f 71 149 61
+f 71 281 149
+f 79 149 281
+f 149 79 51
+# 552 elements
diff --git a/src/main/resources/geometry/hand2.obj b/src/main/resources/geometry/hand2.obj
new file mode 100644
index 0000000..e7321c1
--- /dev/null
+++ b/src/main/resources/geometry/hand2.obj
@@ -0,0 +1,846 @@
+# Mon Jun 02 17:09:49 1997
+#
+#
+
+g hand2
+v -0.545629 0.226597 -3.972744
+v -0.215053 0.028788 -3.704237
+v -0.048631 -0.141870 -1.731539
+v -0.486661 0.360120 -4.035744
+v -0.168475 0.089529 -3.756256
+v -0.340613 0.471505 -4.270064
+v -0.635471 0.403031 -4.188368
+v -0.756139 0.537011 -4.495984
+v -0.519863 0.020651 -3.964786
+v -0.700655 0.190824 -4.211964
+v -0.861473 0.372102 -4.526962
+v -0.356499 -0.174538 -4.199869
+v -0.714045 0.044261 -4.445632
+v -0.890476 0.203518 -4.607591
+v -0.170313 -0.192685 -3.756315
+v -0.069766 -0.312358 -1.638721
+v -0.232940 -0.103910 -3.758020
+v -0.115092 -0.245076 -1.715384
+v -0.586581 0.541254 -4.390105
+v -0.035952 -0.274007 -4.418982
+v 0.255124 -0.249237 -4.776807
+v 0.018833 -0.240104 -4.027362
+v 0.284973 -0.207728 -4.316310
+v 0.434752 -0.000032 -4.022241
+v 0.022704 -0.329702 -1.621020
+v -0.055377 -0.221593 -3.718934
+v 0.105371 -0.295391 -1.615597
+v 0.046896 -0.174033 -3.708722
+v 0.033445 0.525248 -4.572588
+v -0.146022 0.491685 -4.378734
+v -0.008484 0.509017 -4.183765
+v -0.109786 0.450335 -4.040698
+v 0.106167 0.452120 -3.961211
+v -0.081537 0.087205 -3.782939
+v -0.004783 -0.118520 -1.734107
+v 0.008732 0.041375 -3.708363
+v 0.080374 -0.144013 -1.651651
+v 0.267743 0.688582 -4.403843
+v 0.134602 0.595547 -4.385927
+v 0.155445 0.603098 -4.172839
+v 0.510348 0.750695 -4.322186
+v 0.351763 0.725704 -4.323452
+v 0.293357 0.616488 -4.126201
+v 0.644985 0.911535 -5.278749
+v 0.476753 0.808807 -4.843080
+v 0.729327 1.001220 -5.209341
+v 0.576282 0.887766 -4.779078
+v 0.861206 1.041806 -5.155231
+v 0.720826 0.920527 -4.727794
+v 0.591358 0.800004 -5.365947
+v 0.601106 0.662395 -5.579942
+v 0.385222 0.705498 -4.899085
+v 0.327338 0.605102 -5.113508
+v 0.123562 -0.217362 -1.626587
+v 0.301415 0.221510 -3.856624
+v 0.057648 -0.069121 -3.679395
+v 0.481419 0.465636 -4.058800
+v 0.733329 0.364516 -4.192796
+v 0.715407 0.668961 -4.293678
+v 0.891503 0.576285 -4.325380
+v 0.925616 0.325221 -5.607038
+v 1.087404 0.428685 -5.355153
+v 1.192964 0.581656 -5.247297
+v 0.655301 -0.002104 -5.205223
+v 0.826001 0.093037 -4.822896
+v 0.936937 0.282795 -4.650935
+v 1.071822 0.521897 -4.652002
+v 1.253768 0.746632 -5.184807
+v 1.087957 0.735338 -4.683784
+v 1.216838 0.899384 -5.149589
+v 0.711147 0.230918 -6.030735
+v 0.476647 -0.030016 -5.767413
+v 0.142223 -0.215576 -5.512595
+v 0.589280 0.158661 -6.504986
+v 0.382367 -0.041679 -6.374435
+v 0.052545 -0.020831 -6.416378
+v 0.004866 0.539221 -5.338164
+v 0.294897 0.599163 -5.651150
+v 0.547241 0.615171 -5.966590
+v -0.001080 0.527218 -6.226285
+v 0.274900 0.607360 -6.287489
+v 0.507029 0.599694 -6.459079
+v -0.304989 0.605648 -6.026434
+v -0.588412 0.775369 -6.061018
+v -0.235417 0.550011 -5.181865
+v -0.450388 0.614566 -5.143874
+v -0.283040 -0.067515 -6.255307
+v -0.179973 -0.263960 -5.306118
+v -0.665295 0.178195 -6.225147
+v -0.506975 -0.143513 -5.176296
+v -0.975091 0.334957 -5.897993
+v -0.814140 0.069075 -5.111338
+v -1.151849 0.543036 -5.754441
+v -1.001447 0.285489 -5.111672
+v -0.965973 0.855410 -5.679462
+v -0.853225 0.658026 -5.081767
+v -0.768725 0.885422 -5.758699
+v -0.661677 0.680318 -5.098948
+v 0.926772 0.868255 -4.695576
+v 1.052723 1.006416 -5.135924
+v -0.991553 0.504328 -5.086818
+v -1.125149 0.731518 -5.686989
+v 1.303689 1.033657 -5.689645
+v 1.349170 0.926230 -5.744081
+v 1.316995 0.810848 -5.819848
+v 1.335402 1.170071 -5.865595
+v 1.362673 1.055005 -5.926610
+v 1.324385 0.938256 -6.020778
+v 1.410471 1.327249 -6.076220
+v 1.420585 1.201262 -6.166119
+v 1.368728 1.073079 -6.289456
+v 1.275447 0.732420 -5.607525
+v 1.315548 0.861839 -5.536830
+v 1.265631 0.978431 -5.481887
+v 1.109960 0.647515 -5.964428
+v 1.236318 0.701507 -5.903873
+v 1.045745 0.541486 -5.756546
+v 1.185145 0.607547 -5.683672
+v 1.126042 0.911004 -6.484125
+v 1.260541 0.959921 -6.409129
+v 1.116033 0.789199 -6.215408
+v 1.238526 0.835123 -6.132965
+v 1.008562 1.150313 -5.667244
+v 1.106643 1.305370 -5.848235
+v 1.233100 1.484675 -6.059801
+v 0.888559 1.106689 -5.702088
+v 0.985226 1.254602 -5.879530
+v 1.105698 1.433834 -6.098895
+v 0.812199 1.014149 -5.765767
+v 0.891119 1.151850 -5.946655
+v 0.987588 1.322413 -6.173646
+v 0.736157 0.957482 -5.567209
+v 0.810319 1.047137 -5.499653
+v 0.932046 1.090406 -5.456793
+v 0.822744 0.790022 -5.929116
+v 0.782579 0.903754 -5.850531
+v 0.867396 0.936043 -6.161350
+v 0.843523 1.042929 -6.053780
+v 0.911772 1.081739 -6.408180
+v 0.912443 1.201594 -6.290159
+v 0.737027 0.724935 -5.731150
+v 0.703318 0.847734 -5.646091
+v 1.341226 1.437246 -6.046185
+v 1.236369 1.267617 -5.841922
+v 1.167446 1.119645 -5.663458
+v 1.107867 1.064412 -5.452231
+v 0.948806 0.689125 -5.971970
+v 0.872849 0.609231 -5.783209
+v 0.781035 0.526092 -5.762100
+v 0.973032 0.836092 -6.223403
+v 0.994805 0.967427 -6.481477
+v 1.495197 1.158527 -6.645423
+v 1.354724 1.014236 -6.722411
+v 1.195778 0.940855 -6.732456
+v 1.565488 1.249424 -6.923759
+v 1.406339 1.071370 -6.949717
+v 1.265445 0.960990 -6.892314
+v 1.638914 1.485047 -6.580676
+v 1.546930 1.431636 -6.350698
+v 1.642671 1.399706 -6.762676
+v 1.557898 1.303849 -6.492972
+v 1.099399 1.460928 -6.484489
+v 1.242754 1.502103 -6.790419
+v 0.999544 1.301628 -6.571692
+v 1.118751 1.308856 -6.829766
+v 0.979609 1.139385 -6.646541
+v 1.060424 1.149347 -6.815580
+v 1.455248 1.654590 -6.566786
+v 1.372638 1.624035 -6.688066
+v 1.365156 1.609915 -6.335397
+v 1.234614 1.575107 -6.401853
+v 1.565822 1.588197 -6.591331
+v 1.547752 1.535880 -6.818796
+v 1.445347 1.397323 -6.963596
+v 1.158417 1.039164 -6.880589
+v 1.288292 1.198123 -6.973975
+v 0.664087 0.148083 -7.294943
+v 0.435748 0.025040 -7.292446
+v 0.212877 0.160088 -7.281471
+v 0.785373 0.173634 -7.783887
+v 0.518575 0.067897 -7.800985
+v 0.271345 0.242325 -7.758057
+v 0.826827 0.208746 -8.147941
+v 0.572939 0.148727 -8.206624
+v 0.325508 0.231584 -8.119010
+v 0.164075 0.075407 -6.818721
+v 0.380953 -0.013843 -6.839242
+v 0.580180 0.132467 -6.892866
+v 0.608535 0.593486 -7.282530
+v 0.726502 0.591761 -7.775616
+v 0.772896 0.554086 -8.142780
+v 0.360286 0.622050 -7.265000
+v 0.437249 0.612740 -7.792085
+v 0.509853 0.535394 -8.204787
+v 0.160224 0.549868 -7.218602
+v 0.209808 0.590107 -7.721076
+v 0.267898 0.534017 -8.108936
+v 0.111090 0.516500 -6.720913
+v 0.298230 0.611278 -6.790854
+v 0.518079 0.589180 -6.874673
+v 0.726888 0.393165 -7.292970
+v 0.628159 0.389210 -6.913399
+v 0.624790 0.421710 -6.550771
+v 0.855781 0.401525 -7.780616
+v 0.850483 0.389631 -8.193182
+v 0.126257 0.432018 -7.223687
+v 0.081097 0.333542 -6.781929
+v 0.024773 0.331692 -6.543201
+v 0.179967 0.513803 -7.691848
+v 0.270466 0.398086 -8.149796
+v -0.085803 2.071088 -7.365792
+v -0.089283 1.657050 -7.409026
+v -0.132752 1.024134 -7.355868
+v -0.339231 2.178852 -7.313980
+v -0.362585 1.717826 -7.403921
+v -0.376816 1.020220 -7.374946
+v -0.609086 2.098261 -7.268658
+v -0.644951 1.683101 -7.308946
+v -0.620699 1.049622 -7.252518
+v -0.115696 0.389618 -6.975528
+v -0.348229 0.364394 -6.960135
+v -0.589678 0.477314 -6.850625
+v -0.063362 2.126922 -6.994926
+v -0.317776 2.207434 -6.893541
+v -0.592443 2.122036 -6.922650
+v -0.060384 1.753711 -6.967503
+v -0.330655 1.784850 -6.821116
+v -0.622382 1.744780 -6.913632
+v -0.111831 1.216582 -6.951138
+v -0.351669 1.253255 -6.832911
+v -0.599234 1.235825 -6.874247
+v -0.113630 0.786347 -6.638087
+v -0.343041 0.846074 -6.551879
+v -0.571143 0.863954 -6.597034
+v -0.702952 1.143454 -7.043127
+v -0.659979 0.708124 -6.719869
+v -0.688492 0.602267 -6.399982
+v -0.640513 2.158446 -7.091597
+v -0.733751 1.708568 -7.108687
+v -0.042639 0.608451 -6.846946
+v -0.033981 1.117844 -7.181334
+v 0.014576 1.681971 -7.232140
+v -0.034099 2.140646 -7.197904
+v -1.427884 2.125531 -6.104109
+v -1.232856 2.217431 -6.261067
+v -1.030471 2.172613 -6.454438
+v -1.433002 1.846260 -6.128913
+v -1.256178 1.899456 -6.333560
+v -1.021006 1.878065 -6.513752
+v -1.382181 1.396092 -6.219269
+v -1.241525 1.399828 -6.428739
+v -1.025330 1.377688 -6.574033
+v -1.304705 0.946481 -6.184714
+v -1.170819 0.841650 -6.394479
+v -0.946587 0.786927 -6.537124
+v -1.133362 1.480745 -5.995321
+v -0.908216 1.491027 -6.055746
+v -0.781984 1.482366 -6.234836
+v -1.166789 1.889461 -5.900780
+v -0.912111 1.929120 -5.973505
+v -0.773154 1.928164 -6.197147
+v -1.192128 2.159473 -5.918907
+v -0.979939 2.235226 -6.018824
+v -0.820842 2.203268 -6.203417
+v -1.073035 1.127979 -6.002315
+v -0.883316 1.138491 -6.095742
+v -0.766101 1.081268 -6.289536
+v -0.842475 1.437964 -6.469625
+v -0.835837 1.902370 -6.431089
+v -0.901630 2.225091 -6.358479
+v -0.809658 0.951527 -6.487935
+v -1.248762 1.053319 -6.037439
+v -1.326974 1.438433 -6.057952
+v -1.378537 1.859137 -5.972835
+v -1.347264 2.171041 -5.994931
+v 1.476370 1.548335 -6.314360
+v 1.060616 1.003273 -6.708851
+v 0.566455 0.353316 -8.324208
+v -0.326088 2.309241 -7.118046
+v -1.118212 2.311149 -6.146525
+v 0.706268 0.472086 -6.106736
+# 281 vertices
+
+# 0 texture vertices
+
+# 0 normals
+
+usemtl hand
+f 2 4 1
+f 5 4 2
+f 3 5 2
+f 5 6 4
+f 1 10 9
+f 1 7 10
+f 7 11 10
+f 7 8 11
+f 10 12 9
+f 12 10 13
+f 10 14 13
+f 10 11 14
+f 12 17 9
+f 12 15 17
+f 18 15 16
+f 15 18 17
+f 9 2 1
+f 9 17 2
+f 18 2 17
+f 2 18 3
+f 19 4 6
+f 7 4 19
+f 8 7 19
+f 7 1 4
+f 20 22 12
+f 23 22 20
+f 21 23 20
+f 23 24 22
+f 16 26 25
+f 16 15 26
+f 15 22 26
+f 15 12 22
+f 25 28 27
+f 25 26 28
+f 22 28 26
+f 28 22 24
+f 30 31 29
+f 32 31 30
+f 6 32 30
+f 32 33 31
+f 5 32 6
+f 32 5 34
+f 5 35 34
+f 5 3 35
+f 34 33 32
+f 33 34 36
+f 35 36 34
+f 36 35 37
+f 39 40 38
+f 31 40 39
+f 29 31 39
+f 31 33 40
+f 42 43 41
+f 40 43 42
+f 38 40 42
+f 40 33 43
+f 45 46 44
+f 46 45 47
+f 38 47 45
+f 47 38 42
+f 46 49 48
+f 46 47 49
+f 47 41 49
+f 47 42 41
+f 44 52 45
+f 44 50 52
+f 50 53 52
+f 50 51 53
+f 52 38 45
+f 38 52 39
+f 52 29 39
+f 52 53 29
+f 36 55 33
+f 55 36 56
+f 37 56 36
+f 56 37 54
+f 56 24 55
+f 24 56 28
+f 27 56 54
+f 56 27 28
+f 33 57 43
+f 33 55 57
+f 55 58 57
+f 55 24 58
+f 57 41 43
+f 41 57 59
+f 58 59 57
+f 59 58 60
+f 62 64 61
+f 64 62 65
+f 63 65 62
+f 65 63 66
+f 65 21 64
+f 21 65 23
+f 66 23 65
+f 23 66 24
+f 66 58 24
+f 58 66 67
+f 63 67 66
+f 67 63 68
+f 67 60 58
+f 60 67 69
+f 68 69 67
+f 69 68 70
+f 61 72 71
+f 61 64 72
+f 64 73 72
+f 64 21 73
+f 71 75 74
+f 71 72 75
+f 72 76 75
+f 72 73 76
+f 53 77 29
+f 77 53 78
+f 51 78 53
+f 78 51 79
+f 78 80 77
+f 80 78 81
+f 79 81 78
+f 81 79 82
+f 83 77 80
+f 77 83 85
+f 83 86 85
+f 83 84 86
+f 85 29 77
+f 29 85 30
+f 86 30 85
+f 30 86 6
+f 73 87 76
+f 87 73 88
+f 21 88 73
+f 88 21 20
+f 88 89 87
+f 89 88 90
+f 20 90 88
+f 90 20 12
+f 90 91 89
+f 91 90 92
+f 90 13 92
+f 90 12 13
+f 91 94 93
+f 91 92 94
+f 92 14 94
+f 92 13 14
+f 95 98 97
+f 95 96 98
+f 8 98 96
+f 98 8 19
+f 97 86 84
+f 97 98 86
+f 19 86 98
+f 86 19 6
+f 59 49 41
+f 49 59 99
+f 59 69 99
+f 59 60 69
+f 99 48 49
+f 48 99 100
+f 99 70 100
+f 99 69 70
+f 8 101 11
+f 8 96 101
+f 96 102 101
+f 96 95 102
+f 101 14 11
+f 14 101 94
+f 101 93 94
+f 101 102 93
+f 103 107 106
+f 103 104 107
+f 105 107 104
+f 107 105 108
+f 107 109 106
+f 109 107 110
+f 108 110 107
+f 110 108 111
+f 63 113 68
+f 63 112 113
+f 112 104 113
+f 112 105 104
+f 68 114 70
+f 68 113 114
+f 113 103 114
+f 113 104 103
+f 115 118 117
+f 115 116 118
+f 105 118 116
+f 118 105 112
+f 117 62 61
+f 117 118 62
+f 112 62 118
+f 62 112 63
+f 120 121 119
+f 121 120 122
+f 111 122 120
+f 122 111 108
+f 122 115 121
+f 115 122 116
+f 108 116 122
+f 116 108 105
+f 123 127 126
+f 123 124 127
+f 124 128 127
+f 124 125 128
+f 126 130 129
+f 126 127 130
+f 127 131 130
+f 127 128 131
+f 44 133 132
+f 44 46 133
+f 48 133 46
+f 133 48 134
+f 132 126 129
+f 132 133 126
+f 134 126 133
+f 126 134 123
+f 135 138 137
+f 135 136 138
+f 136 130 138
+f 136 129 130
+f 137 140 139
+f 137 138 140
+f 138 131 140
+f 138 130 131
+f 51 142 141
+f 51 50 142
+f 50 132 142
+f 50 44 132
+f 141 136 135
+f 141 142 136
+f 142 129 136
+f 142 132 129
+f 109 144 106
+f 109 143 144
+f 125 144 143
+f 144 125 124
+f 106 145 103
+f 106 144 145
+f 124 145 144
+f 145 124 123
+f 100 134 48
+f 134 100 146
+f 70 146 100
+f 146 70 114
+f 146 123 134
+f 123 146 145
+f 114 145 146
+f 145 114 103
+f 135 148 141
+f 135 147 148
+f 147 117 148
+f 147 115 117
+f 141 149 51
+f 141 148 149
+f 148 61 149
+f 148 117 61
+f 115 150 121
+f 115 147 150
+f 135 150 147
+f 150 135 137
+f 121 151 119
+f 121 150 151
+f 137 151 150
+f 151 137 139
+f 120 152 111
+f 152 120 153
+f 119 153 120
+f 153 119 154
+f 152 156 155
+f 152 153 156
+f 153 157 156
+f 153 154 157
+f 158 161 160
+f 158 159 161
+f 159 110 161
+f 159 109 110
+f 160 152 155
+f 160 161 152
+f 161 111 152
+f 161 110 111
+f 162 140 131
+f 140 162 164
+f 162 165 164
+f 162 163 165
+f 164 139 140
+f 139 164 166
+f 164 167 166
+f 164 165 167
+f 168 171 170
+f 168 169 171
+f 163 171 169
+f 171 163 162
+f 171 125 170
+f 125 171 128
+f 162 128 171
+f 128 162 131
+f 172 169 168
+f 169 172 173
+f 158 173 172
+f 173 158 160
+f 169 174 163
+f 169 173 174
+f 160 174 173
+f 174 160 155
+f 157 176 156
+f 157 175 176
+f 167 176 175
+f 176 167 165
+f 176 155 156
+f 155 176 174
+f 176 163 174
+f 176 165 163
+f 177 181 180
+f 177 178 181
+f 178 182 181
+f 178 179 182
+f 181 183 180
+f 183 181 184
+f 181 185 184
+f 181 182 185
+f 186 75 76
+f 75 186 187
+f 179 187 186
+f 187 179 178
+f 187 74 75
+f 74 187 188
+f 178 188 187
+f 188 178 177
+f 189 193 192
+f 189 190 193
+f 191 193 190
+f 193 191 194
+f 192 196 195
+f 192 193 196
+f 193 197 196
+f 193 194 197
+f 81 198 80
+f 198 81 199
+f 82 199 81
+f 199 82 200
+f 199 195 198
+f 195 199 192
+f 200 192 199
+f 192 200 189
+f 200 201 189
+f 201 200 202
+f 200 203 202
+f 200 82 203
+f 202 177 201
+f 177 202 188
+f 202 74 188
+f 202 203 74
+f 177 204 201
+f 177 180 204
+f 183 204 180
+f 204 183 205
+f 204 189 201
+f 189 204 190
+f 204 191 190
+f 204 205 191
+f 195 207 198
+f 195 206 207
+f 179 207 206
+f 207 179 186
+f 198 208 80
+f 198 207 208
+f 186 208 207
+f 208 186 76
+f 206 182 179
+f 182 206 209
+f 206 196 209
+f 206 195 196
+f 209 185 182
+f 185 209 210
+f 209 197 210
+f 209 196 197
+f 211 215 214
+f 211 212 215
+f 213 215 212
+f 215 213 216
+f 215 217 214
+f 217 215 218
+f 216 218 215
+f 218 216 219
+f 220 216 213
+f 216 220 221
+f 76 221 220
+f 221 76 87
+f 221 219 216
+f 219 221 222
+f 87 222 221
+f 222 87 89
+f 223 227 226
+f 223 224 227
+f 225 227 224
+f 227 225 228
+f 227 229 226
+f 229 227 230
+f 228 230 227
+f 230 228 231
+f 230 232 229
+f 232 230 233
+f 231 233 230
+f 233 231 234
+f 233 80 232
+f 80 233 83
+f 233 84 83
+f 233 234 84
+f 222 235 219
+f 235 222 236
+f 222 237 236
+f 222 89 237
+f 236 231 235
+f 231 236 234
+f 237 234 236
+f 234 237 84
+f 217 239 238
+f 217 218 239
+f 219 239 218
+f 239 219 235
+f 239 225 238
+f 225 239 228
+f 239 231 228
+f 239 235 231
+f 220 208 76
+f 208 220 240
+f 213 240 220
+f 240 213 241
+f 208 232 80
+f 208 240 232
+f 240 229 232
+f 240 241 229
+f 241 226 229
+f 226 241 242
+f 241 212 242
+f 241 213 212
+f 242 223 226
+f 223 242 243
+f 242 211 243
+f 242 212 211
+f 244 248 247
+f 244 245 248
+f 246 248 245
+f 248 246 249
+f 248 250 247
+f 250 248 251
+f 249 251 248
+f 251 249 252
+f 250 254 253
+f 250 251 254
+f 252 254 251
+f 254 252 255
+f 253 91 93
+f 253 254 91
+f 254 89 91
+f 254 255 89
+f 256 260 259
+f 256 257 260
+f 258 260 257
+f 260 258 261
+f 260 262 259
+f 262 260 263
+f 260 264 263
+f 260 261 264
+f 97 265 95
+f 265 97 266
+f 84 266 97
+f 266 84 267
+f 265 257 256
+f 265 266 257
+f 267 257 266
+f 257 267 258
+f 249 268 252
+f 268 249 269
+f 249 270 269
+f 249 246 270
+f 269 258 268
+f 258 269 261
+f 269 264 261
+f 269 270 264
+f 255 237 89
+f 237 255 271
+f 252 271 255
+f 271 252 268
+f 271 84 237
+f 84 271 267
+f 268 267 271
+f 267 268 258
+f 102 253 93
+f 253 102 272
+f 102 265 272
+f 102 95 265
+f 272 250 253
+f 250 272 273
+f 272 256 273
+f 272 265 256
+f 259 273 256
+f 273 259 274
+f 262 274 259
+f 274 262 275
+f 273 247 250
+f 273 274 247
+f 274 244 247
+f 274 275 244
+f 172 159 158
+f 159 172 276
+f 172 170 276
+f 172 168 170
+f 276 109 159
+f 109 276 143
+f 170 143 276
+f 143 170 125
+f 151 154 119
+f 154 151 277
+f 151 166 277
+f 151 139 166
+f 154 175 157
+f 154 277 175
+f 277 167 175
+f 277 166 167
+f 197 278 210
+f 197 194 278
+f 191 278 194
+f 278 191 205
+f 278 185 210
+f 185 278 184
+f 278 183 184
+f 278 205 183
+f 223 279 224
+f 223 243 279
+f 211 279 243
+f 279 211 214
+f 279 225 224
+f 225 279 238
+f 279 217 238
+f 279 214 217
+f 262 280 275
+f 262 263 280
+f 264 280 263
+f 280 264 270
+f 280 244 275
+f 244 280 245
+f 270 245 280
+f 245 270 246
+f 74 281 71
+f 74 203 281
+f 82 281 203
+f 281 82 79
+f 71 149 61
+f 71 281 149
+f 79 149 281
+f 149 79 51
+# 552 elements
diff --git a/src/main/resources/geometry/hand3.obj b/src/main/resources/geometry/hand3.obj
new file mode 100644
index 0000000..865b440
--- /dev/null
+++ b/src/main/resources/geometry/hand3.obj
@@ -0,0 +1,846 @@
+# Mon Jun 02 17:10:02 1997
+#
+#
+
+g hand3
+v -0.532397 0.197223 -3.999972
+v -0.214601 0.028608 -3.704992
+v -0.062767 -0.039672 -1.969593
+v -0.474970 0.318713 -4.067389
+v -0.168129 0.089251 -3.756891
+v -0.328587 0.420355 -4.296443
+v -0.623073 0.363357 -4.216684
+v -0.746171 0.497060 -4.524076
+v -0.506368 0.006295 -3.982003
+v -0.689049 0.168417 -4.231982
+v -0.853662 0.351475 -4.548802
+v -0.344509 -0.179734 -4.206146
+v -0.709169 0.037344 -4.456913
+v -0.884746 0.194925 -4.627260
+v -0.168024 -0.191951 -3.757912
+v -0.076841 -0.196481 -1.877360
+v -0.231457 -0.103955 -3.759368
+v -0.123436 -0.138285 -1.951048
+v -0.575776 0.499057 -4.413718
+v -0.022556 -0.274054 -4.419171
+v 0.295391 -0.244860 -4.781412
+v 0.027764 -0.237028 -4.026483
+v 0.328292 -0.191608 -4.297441
+v 0.452126 0.065151 -3.999771
+v 0.014266 -0.206977 -1.861471
+v -0.053052 -0.219763 -3.720458
+v 0.093672 -0.170271 -1.858756
+v 0.048687 -0.171678 -3.710009
+v 0.050155 0.444476 -4.604692
+v -0.133492 0.423989 -4.410464
+v -0.027107 0.434472 -4.242275
+v -0.117598 0.396084 -4.085021
+v 0.065233 0.421440 -4.017992
+v -0.081428 0.087141 -3.783137
+v -0.020959 -0.015459 -1.973519
+v 0.008804 0.041460 -3.708582
+v 0.062893 -0.032292 -1.896764
+v 0.225177 0.615409 -4.482480
+v 0.113530 0.511149 -4.450598
+v 0.102865 0.542478 -4.253375
+v 0.431656 0.735739 -4.416512
+v 0.288424 0.675882 -4.413925
+v 0.218974 0.589731 -4.211629
+v 0.541405 0.777453 -5.314148
+v 0.432074 0.710021 -4.892318
+v 0.593949 0.890727 -5.268293
+v 0.501790 0.814034 -4.847951
+v 0.700343 0.972337 -5.234181
+v 0.623032 0.889368 -4.811626
+v 0.521872 0.654464 -5.378404
+v 0.555062 0.525950 -5.571719
+v 0.375075 0.594255 -4.928543
+v 0.345045 0.495994 -5.115907
+v 0.108176 -0.097133 -1.871658
+v 0.273705 0.252739 -3.878058
+v 0.058055 -0.068344 -3.680041
+v 0.405284 0.512264 -4.112417
+v 0.687825 0.464139 -4.216795
+v 0.632930 0.719769 -4.375288
+v 0.825419 0.677113 -4.390901
+v 0.917800 0.280915 -5.602854
+v 1.056579 0.438767 -5.371966
+v 1.116715 0.631123 -5.302998
+v 0.705199 0.003471 -5.203117
+v 0.907904 0.141760 -4.788020
+v 0.962510 0.376613 -4.635034
+v 1.041596 0.636992 -4.691114
+v 1.130266 0.811997 -5.270994
+v 1.005013 0.831826 -4.762492
+v 1.055534 0.946727 -5.251543
+v 0.677585 0.233496 -6.061008
+v 0.460633 -0.018720 -5.787735
+v 0.144938 -0.190839 -5.542907
+v 0.494372 0.173628 -6.534559
+v 0.317081 -0.008497 -6.384122
+v 0.027201 0.131783 -6.428380
+v 0.013685 0.508910 -5.331713
+v 0.293216 0.555930 -5.655271
+v 0.510499 0.560260 -5.972243
+v -0.013202 0.565924 -6.175734
+v 0.224494 0.612542 -6.271984
+v 0.426059 0.599110 -6.464377
+v -0.306255 0.646060 -5.996577
+v -0.569808 0.913747 -5.981158
+v -0.228316 0.516391 -5.181461
+v -0.445620 0.586733 -5.146332
+v -0.293245 0.113327 -6.323775
+v -0.173597 -0.243629 -5.356423
+v -0.670974 0.376359 -6.246881
+v -0.505876 -0.129238 -5.220592
+v -0.981059 0.486591 -5.904088
+v -0.816316 0.081391 -5.139109
+v -1.148463 0.669179 -5.736072
+v -1.003358 0.292548 -5.142035
+v -0.951535 0.915719 -5.633423
+v -0.848045 0.626223 -5.094282
+v -0.743315 0.948671 -5.677959
+v -0.655824 0.645151 -5.103795
+v 0.822461 0.905362 -4.784215
+v 0.878885 0.998810 -5.230596
+v -0.989810 0.492494 -5.109306
+v -1.116492 0.823014 -5.656571
+v 0.996042 1.008486 -5.820419
+v 1.064506 0.912915 -5.870014
+v 1.060480 0.782157 -5.923663
+v 0.953680 1.113737 -6.014114
+v 1.005018 1.004616 -6.065710
+v 0.992276 0.867260 -6.135736
+v 0.944026 1.244268 -6.251624
+v 0.973965 1.115774 -6.327374
+v 0.945827 0.958451 -6.421946
+v 1.083427 0.733990 -5.698505
+v 1.090716 0.878610 -5.652200
+v 1.016854 0.980850 -5.602205
+v 0.904979 0.542860 -6.003450
+v 1.010214 0.640802 -5.976042
+v 0.918015 0.464134 -5.777233
+v 1.030665 0.577144 -5.740035
+v 0.758712 0.703562 -6.541620
+v 0.866703 0.798472 -6.502394
+v 0.825719 0.632441 -6.264884
+v 0.930940 0.724822 -6.214890
+v 0.693610 1.030609 -5.753376
+v 0.707614 1.171851 -5.966817
+v 0.745009 1.336440 -6.216925
+v 0.595931 0.948287 -5.758795
+v 0.607525 1.083062 -5.967039
+v 0.635682 1.245807 -6.223903
+v 0.548429 0.829721 -5.795010
+v 0.543563 0.948272 -6.001235
+v 0.548405 1.095687 -6.260015
+v 0.548777 0.793549 -5.588580
+v 0.593876 0.906330 -5.546043
+v 0.689842 0.988075 -5.529473
+v 0.608749 0.600589 -5.930038
+v 0.547295 0.706322 -5.859049
+v 0.567538 0.708497 -6.180083
+v 0.523106 0.816241 -6.083089
+v 0.535313 0.817538 -6.443928
+v 0.506392 0.943775 -6.343649
+v 0.600681 0.560351 -5.721073
+v 0.545933 0.674730 -5.647308
+v 0.856788 1.328405 -6.220259
+v 0.836996 1.177698 -5.982326
+v 0.846715 1.051347 -5.777648
+v 0.851110 1.017751 -5.553206
+v 0.745225 0.534151 -5.983995
+v 0.739831 0.476319 -5.779583
+v 0.715754 0.412378 -5.751285
+v 0.683826 0.635181 -6.249702
+v 0.633316 0.723667 -6.518804
+v 0.980715 1.013307 -6.803527
+v 0.892386 0.823377 -6.831568
+v 0.786718 0.714033 -6.798828
+v 0.975463 1.069959 -7.098132
+v 0.890573 0.852994 -7.068334
+v 0.825719 0.727882 -6.968780
+v 1.025155 1.371318 -6.805808
+v 0.995242 1.333836 -6.557353
+v 1.022430 1.262102 -6.975050
+v 1.017056 1.195056 -6.684767
+v 0.555587 1.202589 -6.599424
+v 0.612038 1.229948 -6.932652
+v 0.508225 1.012148 -6.644658
+v 0.562058 1.006498 -6.921506
+v 0.546766 0.850772 -6.693409
+v 0.585298 0.851819 -6.874451
+v 0.808246 1.473531 -6.773156
+v 0.714197 1.400582 -6.872624
+v 0.784961 1.443287 -6.523914
+v 0.661185 1.361980 -6.558956
+v 0.923633 1.442370 -6.812841
+v 0.880870 1.349604 -7.026019
+v 0.806732 1.163577 -7.130162
+v 0.703304 0.769882 -6.944597
+v 0.730493 0.929054 -7.083601
+v 0.467013 0.166173 -7.322286
+v 0.252376 0.062331 -7.273434
+v 0.071629 0.273589 -7.155980
+v 0.529329 0.193273 -7.810286
+v 0.270539 0.096977 -7.776154
+v 0.075855 0.318280 -7.578300
+v 0.525577 0.226801 -8.169828
+v 0.268313 0.167598 -8.189743
+v 0.062406 0.262263 -7.985266
+v 0.085250 0.215999 -6.753068
+v 0.257265 0.029724 -6.830193
+v 0.432281 0.147121 -6.919346
+v 0.412813 0.603853 -7.296127
+v 0.466553 0.601779 -7.797064
+v 0.466023 0.565097 -8.166368
+v 0.174599 0.635304 -7.236838
+v 0.178594 0.622429 -7.773725
+v 0.196329 0.546003 -8.196803
+v 0.010991 0.597067 -7.106261
+v -0.002380 0.607430 -7.576752
+v -0.009555 0.537996 -8.004534
+v 0.032977 0.584260 -6.637498
+v 0.178619 0.629919 -6.764370
+v 0.375331 0.599437 -6.884651
+v 0.527273 0.406770 -7.327760
+v 0.475094 0.400761 -6.944777
+v 0.524815 0.430983 -6.577858
+v 0.596379 0.415394 -7.817393
+v 0.540282 0.403398 -8.220389
+v 0.014701 0.567519 -7.027500
+v 0.022146 0.486002 -6.671004
+v 0.012141 0.498590 -6.467365
+v 0.012762 0.578347 -7.426854
+v 0.000619 0.410973 -8.007980
+v 0.092196 1.869408 -5.545787
+v 0.047882 1.788186 -5.963855
+v -0.060104 1.571916 -6.553101
+v -0.143875 1.937950 -5.383014
+v -0.207255 1.899992 -5.860848
+v -0.295062 1.638036 -6.546325
+v -0.421009 1.885218 -5.447442
+v -0.494485 1.814856 -5.875438
+v -0.539028 1.586470 -6.471877
+v -0.106805 0.842813 -6.743448
+v -0.330308 0.861681 -6.742823
+v -0.563357 0.915028 -6.614289
+v 0.092672 1.563475 -5.409472
+v -0.152484 1.549881 -5.266574
+v -0.427491 1.564068 -5.366186
+v 0.055291 1.459964 -5.769153
+v -0.213200 1.392345 -5.673015
+v -0.489819 1.484210 -5.757663
+v -0.047655 1.402047 -6.272863
+v -0.286444 1.362850 -6.194754
+v -0.519624 1.405953 -6.217000
+v -0.089194 0.975227 -6.316360
+v -0.314427 0.991839 -6.268511
+v -0.524734 1.082759 -6.324799
+v -0.620360 1.490346 -6.331055
+v -0.618762 1.036157 -6.434135
+v -0.671873 0.861513 -6.294051
+v -0.458822 1.733320 -5.357014
+v -0.588193 1.649792 -5.825307
+v -0.026324 0.948276 -6.554249
+v 0.032057 1.491511 -6.432297
+v 0.133877 1.609963 -5.922091
+v 0.135806 1.725175 -5.451552
+v -1.006792 1.503643 -5.022816
+v -0.746747 1.667615 -5.005004
+v -0.544041 1.766946 -5.171136
+v -1.101978 1.447230 -5.268406
+v -0.865298 1.642242 -5.298347
+v -0.629541 1.716881 -5.454040
+v -1.200089 1.376122 -5.716522
+v -1.019358 1.528275 -5.796288
+v -0.804275 1.567503 -5.929291
+v -1.252437 1.200355 -6.000518
+v -1.113296 1.218534 -6.177490
+v -0.889340 1.184153 -6.312213
+v -0.996484 1.194600 -5.651621
+v -0.760670 1.184919 -5.687916
+v -0.601537 1.292810 -5.762637
+v -0.889795 1.206167 -5.227293
+v -0.606970 1.236079 -5.234110
+v -0.434302 1.401078 -5.343227
+v -0.814929 1.299698 -4.991332
+v -0.554814 1.384489 -4.970828
+v -0.382345 1.502313 -5.098981
+v -1.034163 1.181285 -5.881442
+v -0.840806 1.210840 -5.961395
+v -0.711468 1.257639 -6.107090
+v -0.631209 1.479578 -5.875779
+v -0.464679 1.605436 -5.447018
+v -0.423460 1.665314 -5.121157
+v -0.743932 1.268292 -6.251357
+v -1.204943 1.178799 -5.894271
+v -1.175692 1.262678 -5.660164
+v -1.087312 1.296968 -5.240851
+v -0.942971 1.397147 -4.977907
+v 0.905754 1.424581 -6.519624
+v 0.658060 0.741935 -6.754919
+v 0.245147 0.365997 -8.304296
+v -0.134337 1.769119 -5.224316
+v -0.634812 1.552140 -4.922270
+v 0.657481 0.439112 -6.123274
+# 281 vertices
+
+# 0 texture vertices
+
+# 0 normals
+
+usemtl hand
+f 2 4 1
+f 5 4 2
+f 3 5 2
+f 5 6 4
+f 1 10 9
+f 1 7 10
+f 7 11 10
+f 7 8 11
+f 10 12 9
+f 12 10 13
+f 10 14 13
+f 10 11 14
+f 12 17 9
+f 12 15 17
+f 18 15 16
+f 15 18 17
+f 9 2 1
+f 9 17 2
+f 18 2 17
+f 2 18 3
+f 19 4 6
+f 7 4 19
+f 8 7 19
+f 7 1 4
+f 20 22 12
+f 23 22 20
+f 21 23 20
+f 23 24 22
+f 16 26 25
+f 16 15 26
+f 15 22 26
+f 15 12 22
+f 25 28 27
+f 25 26 28
+f 22 28 26
+f 28 22 24
+f 30 31 29
+f 32 31 30
+f 6 32 30
+f 32 33 31
+f 5 32 6
+f 32 5 34
+f 5 35 34
+f 5 3 35
+f 34 33 32
+f 33 34 36
+f 35 36 34
+f 36 35 37
+f 39 40 38
+f 31 40 39
+f 29 31 39
+f 31 33 40
+f 42 43 41
+f 40 43 42
+f 38 40 42
+f 40 33 43
+f 45 46 44
+f 46 45 47
+f 38 47 45
+f 47 38 42
+f 46 49 48
+f 46 47 49
+f 47 41 49
+f 47 42 41
+f 44 52 45
+f 44 50 52
+f 50 53 52
+f 50 51 53
+f 52 38 45
+f 38 52 39
+f 52 29 39
+f 52 53 29
+f 36 55 33
+f 55 36 56
+f 37 56 36
+f 56 37 54
+f 56 24 55
+f 24 56 28
+f 27 56 54
+f 56 27 28
+f 33 57 43
+f 33 55 57
+f 55 58 57
+f 55 24 58
+f 57 41 43
+f 41 57 59
+f 58 59 57
+f 59 58 60
+f 62 64 61
+f 64 62 65
+f 63 65 62
+f 65 63 66
+f 65 21 64
+f 21 65 23
+f 66 23 65
+f 23 66 24
+f 66 58 24
+f 58 66 67
+f 63 67 66
+f 67 63 68
+f 67 60 58
+f 60 67 69
+f 68 69 67
+f 69 68 70
+f 61 72 71
+f 61 64 72
+f 64 73 72
+f 64 21 73
+f 71 75 74
+f 71 72 75
+f 72 76 75
+f 72 73 76
+f 53 77 29
+f 77 53 78
+f 51 78 53
+f 78 51 79
+f 78 80 77
+f 80 78 81
+f 79 81 78
+f 81 79 82
+f 83 77 80
+f 77 83 85
+f 83 86 85
+f 83 84 86
+f 85 29 77
+f 29 85 30
+f 86 30 85
+f 30 86 6
+f 73 87 76
+f 87 73 88
+f 21 88 73
+f 88 21 20
+f 88 89 87
+f 89 88 90
+f 20 90 88
+f 90 20 12
+f 90 91 89
+f 91 90 92
+f 90 13 92
+f 90 12 13
+f 91 94 93
+f 91 92 94
+f 92 14 94
+f 92 13 14
+f 95 98 97
+f 95 96 98
+f 8 98 96
+f 98 8 19
+f 97 86 84
+f 97 98 86
+f 19 86 98
+f 86 19 6
+f 59 49 41
+f 49 59 99
+f 59 69 99
+f 59 60 69
+f 99 48 49
+f 48 99 100
+f 99 70 100
+f 99 69 70
+f 8 101 11
+f 8 96 101
+f 96 102 101
+f 96 95 102
+f 101 14 11
+f 14 101 94
+f 101 93 94
+f 101 102 93
+f 103 107 106
+f 103 104 107
+f 105 107 104
+f 107 105 108
+f 107 109 106
+f 109 107 110
+f 108 110 107
+f 110 108 111
+f 63 113 68
+f 63 112 113
+f 112 104 113
+f 112 105 104
+f 68 114 70
+f 68 113 114
+f 113 103 114
+f 113 104 103
+f 115 118 117
+f 115 116 118
+f 105 118 116
+f 118 105 112
+f 117 62 61
+f 117 118 62
+f 112 62 118
+f 62 112 63
+f 120 121 119
+f 121 120 122
+f 111 122 120
+f 122 111 108
+f 122 115 121
+f 115 122 116
+f 108 116 122
+f 116 108 105
+f 123 127 126
+f 123 124 127
+f 124 128 127
+f 124 125 128
+f 126 130 129
+f 126 127 130
+f 127 131 130
+f 127 128 131
+f 44 133 132
+f 44 46 133
+f 48 133 46
+f 133 48 134
+f 132 126 129
+f 132 133 126
+f 134 126 133
+f 126 134 123
+f 135 138 137
+f 135 136 138
+f 136 130 138
+f 136 129 130
+f 137 140 139
+f 137 138 140
+f 138 131 140
+f 138 130 131
+f 51 142 141
+f 51 50 142
+f 50 132 142
+f 50 44 132
+f 141 136 135
+f 141 142 136
+f 142 129 136
+f 142 132 129
+f 109 144 106
+f 109 143 144
+f 125 144 143
+f 144 125 124
+f 106 145 103
+f 106 144 145
+f 124 145 144
+f 145 124 123
+f 100 134 48
+f 134 100 146
+f 70 146 100
+f 146 70 114
+f 146 123 134
+f 123 146 145
+f 114 145 146
+f 145 114 103
+f 135 148 141
+f 135 147 148
+f 147 117 148
+f 147 115 117
+f 141 149 51
+f 141 148 149
+f 148 61 149
+f 148 117 61
+f 115 150 121
+f 115 147 150
+f 135 150 147
+f 150 135 137
+f 121 151 119
+f 121 150 151
+f 137 151 150
+f 151 137 139
+f 120 152 111
+f 152 120 153
+f 119 153 120
+f 153 119 154
+f 152 156 155
+f 152 153 156
+f 153 157 156
+f 153 154 157
+f 158 161 160
+f 158 159 161
+f 159 110 161
+f 159 109 110
+f 160 152 155
+f 160 161 152
+f 161 111 152
+f 161 110 111
+f 162 140 131
+f 140 162 164
+f 162 165 164
+f 162 163 165
+f 164 139 140
+f 139 164 166
+f 164 167 166
+f 164 165 167
+f 168 171 170
+f 168 169 171
+f 163 171 169
+f 171 163 162
+f 171 125 170
+f 125 171 128
+f 162 128 171
+f 128 162 131
+f 172 169 168
+f 169 172 173
+f 158 173 172
+f 173 158 160
+f 169 174 163
+f 169 173 174
+f 160 174 173
+f 174 160 155
+f 157 176 156
+f 157 175 176
+f 167 176 175
+f 176 167 165
+f 176 155 156
+f 155 176 174
+f 176 163 174
+f 176 165 163
+f 177 181 180
+f 177 178 181
+f 178 182 181
+f 178 179 182
+f 181 183 180
+f 183 181 184
+f 181 185 184
+f 181 182 185
+f 186 75 76
+f 75 186 187
+f 179 187 186
+f 187 179 178
+f 187 74 75
+f 74 187 188
+f 178 188 187
+f 188 178 177
+f 189 193 192
+f 189 190 193
+f 191 193 190
+f 193 191 194
+f 192 196 195
+f 192 193 196
+f 193 197 196
+f 193 194 197
+f 81 198 80
+f 198 81 199
+f 82 199 81
+f 199 82 200
+f 199 195 198
+f 195 199 192
+f 200 192 199
+f 192 200 189
+f 200 201 189
+f 201 200 202
+f 200 203 202
+f 200 82 203
+f 202 177 201
+f 177 202 188
+f 202 74 188
+f 202 203 74
+f 177 204 201
+f 177 180 204
+f 183 204 180
+f 204 183 205
+f 204 189 201
+f 189 204 190
+f 204 191 190
+f 204 205 191
+f 195 207 198
+f 195 206 207
+f 179 207 206
+f 207 179 186
+f 198 208 80
+f 198 207 208
+f 186 208 207
+f 208 186 76
+f 206 182 179
+f 182 206 209
+f 206 196 209
+f 206 195 196
+f 209 185 182
+f 185 209 210
+f 209 197 210
+f 209 196 197
+f 211 215 214
+f 211 212 215
+f 213 215 212
+f 215 213 216
+f 215 217 214
+f 217 215 218
+f 216 218 215
+f 218 216 219
+f 220 216 213
+f 216 220 221
+f 76 221 220
+f 221 76 87
+f 221 219 216
+f 219 221 222
+f 87 222 221
+f 222 87 89
+f 223 227 226
+f 223 224 227
+f 225 227 224
+f 227 225 228
+f 227 229 226
+f 229 227 230
+f 228 230 227
+f 230 228 231
+f 230 232 229
+f 232 230 233
+f 231 233 230
+f 233 231 234
+f 233 80 232
+f 80 233 83
+f 233 84 83
+f 233 234 84
+f 222 235 219
+f 235 222 236
+f 222 237 236
+f 222 89 237
+f 236 231 235
+f 231 236 234
+f 237 234 236
+f 234 237 84
+f 217 239 238
+f 217 218 239
+f 219 239 218
+f 239 219 235
+f 239 225 238
+f 225 239 228
+f 239 231 228
+f 239 235 231
+f 220 208 76
+f 208 220 240
+f 213 240 220
+f 240 213 241
+f 208 232 80
+f 208 240 232
+f 240 229 232
+f 240 241 229
+f 241 226 229
+f 226 241 242
+f 241 212 242
+f 241 213 212
+f 242 223 226
+f 223 242 243
+f 242 211 243
+f 242 212 211
+f 244 248 247
+f 244 245 248
+f 246 248 245
+f 248 246 249
+f 248 250 247
+f 250 248 251
+f 249 251 248
+f 251 249 252
+f 250 254 253
+f 250 251 254
+f 252 254 251
+f 254 252 255
+f 253 91 93
+f 253 254 91
+f 254 89 91
+f 254 255 89
+f 256 260 259
+f 256 257 260
+f 258 260 257
+f 260 258 261
+f 260 262 259
+f 262 260 263
+f 260 264 263
+f 260 261 264
+f 97 265 95
+f 265 97 266
+f 84 266 97
+f 266 84 267
+f 265 257 256
+f 265 266 257
+f 267 257 266
+f 257 267 258
+f 249 268 252
+f 268 249 269
+f 249 270 269
+f 249 246 270
+f 269 258 268
+f 258 269 261
+f 269 264 261
+f 269 270 264
+f 255 237 89
+f 237 255 271
+f 252 271 255
+f 271 252 268
+f 271 84 237
+f 84 271 267
+f 268 267 271
+f 267 268 258
+f 102 253 93
+f 253 102 272
+f 102 265 272
+f 102 95 265
+f 272 250 253
+f 250 272 273
+f 272 256 273
+f 272 265 256
+f 259 273 256
+f 273 259 274
+f 262 274 259
+f 274 262 275
+f 273 247 250
+f 273 274 247
+f 274 244 247
+f 274 275 244
+f 172 159 158
+f 159 172 276
+f 172 170 276
+f 172 168 170
+f 276 109 159
+f 109 276 143
+f 170 143 276
+f 143 170 125
+f 151 154 119
+f 154 151 277
+f 151 166 277
+f 151 139 166
+f 154 175 157
+f 154 277 175
+f 277 167 175
+f 277 166 167
+f 197 278 210
+f 197 194 278
+f 191 278 194
+f 278 191 205
+f 278 185 210
+f 185 278 184
+f 278 183 184
+f 278 205 183
+f 223 279 224
+f 223 243 279
+f 211 279 243
+f 279 211 214
+f 279 225 224
+f 225 279 238
+f 279 217 238
+f 279 214 217
+f 262 280 275
+f 262 263 280
+f 264 280 263
+f 280 264 270
+f 280 244 275
+f 244 280 245
+f 270 245 280
+f 245 270 246
+f 74 281 71
+f 74 203 281
+f 82 281 203
+f 281 82 79
+f 71 149 61
+f 71 281 149
+f 79 149 281
+f 149 79 51
+# 552 elements
diff --git a/src/main/resources/geometry/minimart.cg b/src/main/resources/geometry/minimart.cg
new file mode 100644
index 0000000..b8665fa
--- /dev/null
+++ b/src/main/resources/geometry/minimart.cg
Binary files differ
diff --git a/src/main/resources/geometry/minimart.mtl b/src/main/resources/geometry/minimart.mtl
new file mode 100644
index 0000000..897e5c8
--- /dev/null
+++ b/src/main/resources/geometry/minimart.mtl
@@ -0,0 +1,131 @@
+newmtl 58_3
+Ka 0.491326 0.491326 0.491326
+Kd 0.078057 0.208360 0.464741
+Ks 0.875138 0.875138 0.311181
+illum 2
+d 1.000000
+Ns 468.750000
+map_Kd concrete.int
+
+newmtl 0_0
+Ka 0.070740 0.070740 0.070740
+Kd 0.456263 0.456263 0.456263
+Ks 0.028991 0.028991 0.028991
+illum 2
+d 1.000000
+Ns 0.000000
+map_Kd pumps.int
+
+newmtl 58
+Ka 0.491326 0.491326 0.491326
+Kd 0.078057 0.208360 0.464741
+Ks 0.875138 0.875138 0.311181
+illum 2
+d 1.000000
+Ns 468.750000
+
+newmtl 50
+Ka 0.382389 0.382389 0.382389
+Kd 0.078057 0.208360 0.464741
+Ks 0.875138 0.875138 0.311181
+illum 2
+d 1.000000
+Ns 468.750000
+
+newmtl 0
+Ka 0.070740 0.070740 0.070740
+Kd 0.456263 0.456263 0.456263
+Ks 0.028991 0.028991 0.028991
+illum 2
+d 1.000000
+Ns 0.000000
+
+newmtl 0_1
+Ka 0.070740 0.070740 0.070740
+Kd 0.456263 0.456263 0.456263
+Ks 0.028991 0.028991 0.028991
+illum 2
+d 1.000000
+Ns 0.000000
+map_Kd numbers.int
+
+newmtl 49_4
+Ka 1.000000 1.000000 1.000000
+Kd 1.000000 1.000000 1.000000
+Ks 0.875138 0.875138 0.311181
+illum 2
+d 1.000000
+Ns 992.187500
+map_Kd gas.rgb
+
+newmtl 0_2
+Ka 0.070740 0.070740 0.070740
+Kd 0.456263 0.456263 0.456263
+Ks 0.028991 0.028991 0.028991
+illum 2
+d 1.000000
+Ns 0.000000
+map_Kd brick2.int
+
+newmtl 0_6
+Ka 0.070740 0.070740 0.070740
+Kd 0.456263 0.456263 0.456263
+Ks 0.028991 0.028991 0.028991
+illum 2
+d 1.000000
+Ns 0.000000
+map_Kd thdoor.inta
+
+newmtl 0_7
+Ka 0.070740 0.070740 0.070740
+Kd 0.456263 0.456263 0.456263
+Ks 0.028991 0.028991 0.028991
+illum 2
+d 1.000000
+Ns 0.000000
+map_Kd window.inta
+
+newmtl 0_8
+Ka 0.070740 0.070740 0.070740
+Kd 0.456263 0.456263 0.456263
+Ks 0.028991 0.028991 0.028991
+illum 2
+d 1.000000
+Ns 0.000000
+map_Kd gravel.int
+
+newmtl 0_5
+Ka 0.070740 0.070740 0.070740
+Kd 0.456263 0.456263 0.456263
+Ks 0.028991 0.028991 0.028991
+illum 2
+d 1.000000
+Ns 0.000000
+map_Kd products.rgb
+
+newmtl 0_4
+Ka 0.070740 0.070740 0.070740
+Kd 0.456263 0.456263 0.456263
+Ks 0.028991 0.028991 0.028991
+illum 2
+d 1.000000
+Ns 0.000000
+map_Kd gas.rgb
+
+newmtl 49
+Ka 1.000000 1.000000 1.000000
+Kd 1.000000 1.000000 1.000000
+Ks 0.875138 0.875138 0.311181
+illum 2
+d 1.000000
+Ns 992.187500
+
+newmtl 49_3
+Ka 1.000000 1.000000 1.000000
+Kd 1.000000 1.000000 1.000000
+Ks 0.875138 0.875138 0.311181
+illum 2
+d 1.000000
+Ns 992.187500
+map_Kd concrete.int
+
diff --git a/src/main/resources/geometry/minimart.obj b/src/main/resources/geometry/minimart.obj
new file mode 100644
index 0000000..2be323a
--- /dev/null
+++ b/src/main/resources/geometry/minimart.obj
@@ -0,0 +1,8696 @@
+#Exported from Designer's Workbench - Coryphaeus Software Inc.
+mtllib minimart.mtl
+g island
+usemtl 58_3
+v -4.995108 -6.843245 0.000000
+vn -0.475051 0.879958 0.000000
+vt -15.601297 6.160724 0.000000
+v -4.995108 -6.843245 0.356720
+vn -0.475051 0.879958 0.000000
+vt -16.075003 4.976460 0.000000
+v 5.517270 -6.843242 0.356720
+vn 0.492198 0.870483 0.000000
+vt 18.824732 -8.983429 0.000000
+v 5.517270 -6.843242 0.000000
+vn 0.492198 0.870483 0.000000
+vt 19.298437 -7.799165 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.517270 -8.066281 0.000000
+vn 0.492198 -0.870483 0.000000
+vt 19.298437 -7.799165 0.000000
+v 5.517270 -8.066281 0.356720
+vn 0.492198 -0.870483 0.000000
+vt 18.824732 -8.983429 0.000000
+v -4.995107 -8.066284 0.356720
+vn -0.475050 -0.879959 0.000000
+vt -16.075001 4.976459 0.000000
+v -4.995107 -8.066284 0.000000
+vn -0.475050 -0.879959 0.000000
+vt -15.601295 6.160723 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.262645 -7.250924 0.000000
+vn -0.958136 0.286313 0.000000
+vt -16.489489 6.516000 0.000000
+v -5.262645 -7.250924 0.356720
+vn -0.958136 0.286313 0.000000
+vt -16.963194 5.331737 0.000000
+v -4.995108 -6.843245 0.356720
+vn -0.475051 0.879958 0.000000
+vt -16.075003 4.976460 0.000000
+v -4.995108 -6.843245 0.000000
+vn -0.475051 0.879958 0.000000
+vt -15.601297 6.160724 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.762516 -7.250921 0.000000
+vn 0.963561 0.267488 0.000000
+vt 20.112621 -8.124839 0.000000
+v 5.762516 -7.250921 0.356720
+vn 0.963561 0.267488 0.000000
+vt 19.638916 -9.309103 0.000000
+v 5.762516 -7.658602 0.356720
+vn 0.963561 -0.267488 0.000000
+vt 19.638916 -9.309103 0.000000
+v 5.762516 -7.658602 0.000000
+vn 0.963561 -0.267488 0.000000
+vt 20.112621 -8.124839 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.995107 -8.066284 0.000000
+vn -0.475050 -0.879959 0.000000
+vt -15.601295 6.160723 0.000000
+v -4.995107 -8.066284 0.356720
+vn -0.475050 -0.879959 0.000000
+vt -16.075001 4.976459 0.000000
+v -5.262645 -7.658605 0.356720
+vn -0.958136 -0.286314 0.000000
+vt -16.963194 5.331737 0.000000
+v -5.262645 -7.658605 0.000000
+vn -0.958136 -0.286314 0.000000
+vt -16.489489 6.516000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.262645 -7.250924 0.356720
+vn -0.958136 0.286313 0.000000
+vt -16.963194 5.331737 0.000000
+v -5.262645 -7.250924 0.000000
+vn -0.958136 0.286313 0.000000
+vt -16.489489 6.516000 0.000000
+v -5.262645 -7.658605 0.000000
+vn -0.958136 -0.286314 0.000000
+vt -16.489489 6.516000 0.000000
+v -5.262645 -7.658605 0.356720
+vn -0.958136 -0.286314 0.000000
+vt -16.963194 5.331737 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.517270 -8.066281 0.356720
+vn 0.492198 -0.870483 0.000000
+vt 18.824732 -8.983429 0.000000
+v 5.517270 -8.066281 0.000000
+vn 0.492198 -0.870483 0.000000
+vt 19.298437 -7.799165 0.000000
+v 5.762516 -7.658602 0.000000
+vn 0.963561 -0.267488 0.000000
+vt 20.112621 -8.124839 0.000000
+v 5.762516 -7.658602 0.356720
+vn 0.963561 -0.267488 0.000000
+vt 19.638916 -9.309103 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.517270 -6.843242 0.000000
+vn 0.492198 0.870483 0.000000
+vt 19.298437 -7.799165 0.000000
+v 5.517270 -6.843242 0.356720
+vn 0.492198 0.870483 0.000000
+vt 18.824732 -8.983429 0.000000
+v 5.762516 -7.250921 0.356720
+vn 0.963561 0.267488 0.000000
+vt 19.638916 -9.309103 0.000000
+v 5.762516 -7.250921 0.000000
+vn 0.963561 0.267488 0.000000
+vt 20.112621 -8.124839 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.995109 -2.087548 0.000000
+vn -0.475051 0.879958 0.000000
+vt -15.601301 6.160726 0.000000
+v -4.995109 -2.087548 0.356720
+vn -0.475051 0.879958 0.000000
+vt -16.075006 4.976461 0.000000
+v 5.517269 -2.087545 0.356720
+vn 0.492198 0.870483 0.000000
+vt 18.824726 -8.983427 0.000000
+v 5.517269 -2.087545 0.000000
+vn 0.492198 0.870483 0.000000
+vt 19.298433 -7.799163 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.517269 -3.310584 0.000000
+vn 0.492199 -0.870483 0.000000
+vt 19.298433 -7.799164 0.000000
+v 5.517269 -3.310584 0.356720
+vn 0.492199 -0.870483 0.000000
+vt 18.824728 -8.983428 0.000000
+v -4.995108 -3.310587 0.356720
+vn -0.475051 -0.879959 0.000000
+vt -16.075005 4.976461 0.000000
+v -4.995108 -3.310587 0.000000
+vn -0.475051 -0.879959 0.000000
+vt -15.601299 6.160725 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.262647 -2.495228 0.000000
+vn -0.958136 0.286312 0.000000
+vt -16.489492 6.516002 0.000000
+v -5.262647 -2.495228 0.356720
+vn -0.958136 0.286312 0.000000
+vt -16.963198 5.331738 0.000000
+v -4.995109 -2.087548 0.356720
+vn -0.475051 0.879958 0.000000
+vt -16.075006 4.976461 0.000000
+v -4.995109 -2.087548 0.000000
+vn -0.475051 0.879958 0.000000
+vt -15.601301 6.160726 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.762515 -2.495225 0.000000
+vn 0.963561 0.267488 0.000000
+vt 20.112619 -8.124838 0.000000
+v 5.762515 -2.495225 0.356720
+vn 0.963561 0.267488 0.000000
+vt 19.638914 -9.309102 0.000000
+v 5.762515 -2.902904 0.356720
+vn 0.963561 -0.267488 0.000000
+vt 19.638914 -9.309102 0.000000
+v 5.762515 -2.902904 0.000000
+vn 0.963561 -0.267488 0.000000
+vt 20.112619 -8.124838 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.995108 -3.310587 0.000000
+vn -0.475051 -0.879959 0.000000
+vt -15.601299 6.160725 0.000000
+v -4.995108 -3.310587 0.356720
+vn -0.475051 -0.879959 0.000000
+vt -16.075005 4.976461 0.000000
+v -5.262646 -2.902907 0.356720
+vn -0.958136 -0.286314 0.000000
+vt -16.963196 5.331738 0.000000
+v -5.262646 -2.902907 0.000000
+vn -0.958136 -0.286314 0.000000
+vt -16.489491 6.516002 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.262647 -2.495228 0.356720
+vn -0.958136 0.286312 0.000000
+vt -16.963198 5.331738 0.000000
+v -5.262647 -2.495228 0.000000
+vn -0.958136 0.286312 0.000000
+vt -16.489492 6.516002 0.000000
+v -5.262646 -2.902907 0.000000
+vn -0.958136 -0.286314 0.000000
+vt -16.489491 6.516002 0.000000
+v -5.262646 -2.902907 0.356720
+vn -0.958136 -0.286314 0.000000
+vt -16.963196 5.331738 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.517269 -3.310584 0.356720
+vn 0.492199 -0.870483 0.000000
+vt 18.824728 -8.983428 0.000000
+v 5.517269 -3.310584 0.000000
+vn 0.492199 -0.870483 0.000000
+vt 19.298433 -7.799164 0.000000
+v 5.762515 -2.902904 0.000000
+vn 0.963561 -0.267488 0.000000
+vt 20.112619 -8.124838 0.000000
+v 5.762515 -2.902904 0.356720
+vn 0.963561 -0.267488 0.000000
+vt 19.638914 -9.309102 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.517269 -2.087545 0.000000
+vn 0.492198 0.870483 0.000000
+vt 19.298433 -7.799163 0.000000
+v 5.517269 -2.087545 0.356720
+vn 0.492198 0.870483 0.000000
+vt 18.824726 -8.983427 0.000000
+v 5.762515 -2.495225 0.356720
+vn 0.963561 0.267488 0.000000
+vt 19.638914 -9.309102 0.000000
+v 5.762515 -2.495225 0.000000
+vn 0.963561 0.267488 0.000000
+vt 20.112619 -8.124838 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.517270 -6.843242 0.356720
+vn 0.000000 0.000000 1.000000
+vt 1.411776 -11.148104 0.000000
+v -4.995108 -6.843245 0.356720
+vn 0.000000 0.000000 1.000000
+vt -6.998125 5.671706 0.000000
+v -5.262645 -7.250924 0.356720
+vn 0.000000 0.000000 1.000000
+vt -7.864442 5.773623 0.000000
+v -5.262645 -7.658605 0.356720
+vn 0.000000 0.000000 1.000000
+vt -8.516731 5.447478 0.000000
+v -4.995107 -8.066284 0.356720
+vn 0.000000 0.000000 1.000000
+vt -8.954988 4.693272 0.000000
+v 5.517270 -8.066281 0.356720
+vn 0.000000 0.000000 1.000000
+vt -0.545087 -12.126536 0.000000
+v 5.762516 -7.658602 0.356720
+vn 0.000000 0.000000 1.000000
+vt 0.303397 -12.192786 0.000000
+v 5.762516 -7.250921 0.356720
+vn 0.000000 0.000000 1.000000
+vt 0.955686 -11.866642 0.000000
+f -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.517269 -2.087545 0.356720
+vn 0.000000 0.000000 1.000000
+vt 9.020891 -7.343543 0.000000
+v -4.995109 -2.087548 0.356720
+vn 0.000000 0.000000 1.000000
+vt 0.610991 9.476266 0.000000
+v -5.262647 -2.495228 0.356720
+vn 0.000000 0.000000 1.000000
+vt -0.255328 9.578183 0.000000
+v -5.262646 -2.902907 0.356720
+vn 0.000000 0.000000 1.000000
+vt -0.907615 9.252039 0.000000
+v -4.995108 -3.310587 0.356720
+vn 0.000000 0.000000 1.000000
+vt -1.345873 8.497833 0.000000
+v 5.517269 -3.310584 0.356720
+vn 0.000000 0.000000 1.000000
+vt 7.064028 -8.321976 0.000000
+v 5.762515 -2.902904 0.356720
+vn 0.000000 0.000000 1.000000
+vt 7.912513 -8.388226 0.000000
+v 5.762515 -2.495225 0.356720
+vn 0.000000 0.000000 1.000000
+vt 8.564800 -8.062081 0.000000
+f -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+g pumps
+usemtl 0_0
+v 3.966174 -2.313679 0.356720
+vn 0.000000 0.999298 0.037474
+vt -0.006712 0.002003 0.000000
+v 3.966174 -2.361455 1.630720
+vn 0.000000 0.999298 0.037474
+vt -0.006712 0.995882 0.000000
+v 4.943970 -2.361455 1.630720
+vn 0.000000 0.999298 0.037474
+vt 1.001127 0.995882 0.000000
+v 4.943970 -2.313679 0.356720
+vn 0.000000 0.999298 0.037474
+vt 1.001127 0.002003 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.943971 -3.062155 0.356720
+vn 0.000000 -0.999298 0.037475
+vt 1.001127 0.002003 0.000000
+v 4.943971 -3.014379 1.630720
+vn 0.000000 -0.999298 0.037475
+vt 1.001127 0.995882 0.000000
+v 3.966174 -3.014379 1.630720
+vn 0.000000 -0.999298 0.037475
+vt -0.006712 0.995882 0.000000
+v 3.966174 -3.062155 0.356720
+vn 0.000000 -0.999298 0.037475
+vt -0.006712 0.002003 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.966174 -2.361455 1.630720
+vn 0.000000 0.000000 1.000000
+vt -0.006712 0.995882 0.000000
+v 3.966174 -3.014379 1.630720
+vn 0.000000 0.000000 1.000000
+vt -0.006712 0.995882 0.000000
+v 4.943971 -3.014379 1.630720
+vn 0.000000 0.000000 1.000000
+vt 1.001127 0.995882 0.000000
+v 4.943970 -2.361455 1.630720
+vn 0.000000 0.000000 1.000000
+vt 1.001127 0.995882 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.966174 -3.062155 0.356720
+vn -1.000000 -0.000001 0.000000
+vt -0.006712 0.002003 0.000000
+v 3.966174 -3.014379 1.630720
+vn -1.000000 -0.000001 0.000000
+vt -0.006712 0.995882 0.000000
+v 3.966174 -2.361455 1.630720
+vn -1.000000 -0.000001 0.000000
+vt -0.006712 0.995882 0.000000
+v 3.966174 -2.313679 0.356720
+vn -1.000000 -0.000001 0.000000
+vt -0.006712 0.002003 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.943970 -2.313679 0.356720
+vn 1.000000 0.000001 0.000000
+vt 1.001127 0.002003 0.000000
+v 4.943970 -2.361455 1.630720
+vn 1.000000 0.000001 0.000000
+vt 1.001127 0.995882 0.000000
+v 4.943971 -3.014379 1.630720
+vn 1.000000 0.000001 0.000000
+vt 1.001127 0.995882 0.000000
+v 4.943971 -3.062155 0.356720
+vn 1.000000 0.000001 0.000000
+vt 1.001127 0.002003 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.287601 -2.313680 0.356720
+vn 0.000000 0.999298 0.037474
+vt -0.015148 -0.007196 0.000000
+v 1.287601 -2.361456 1.630720
+vn 0.000000 0.999298 0.037474
+vt -0.015147 1.007197 0.000000
+v 2.265398 -2.361456 1.630720
+vn 0.000000 0.999298 0.037474
+vt 0.996964 1.007197 0.000000
+v 2.265398 -2.313680 0.356720
+vn 0.000000 0.999298 0.037474
+vt 0.996963 -0.007196 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.265398 -3.062156 0.356720
+vn 0.000000 -0.999298 0.037475
+vt 0.996963 -0.007196 0.000000
+v 2.265398 -3.014380 1.630720
+vn 0.000000 -0.999298 0.037475
+vt 0.996964 1.007197 0.000000
+v 1.287602 -3.014380 1.630720
+vn 0.000000 -0.999298 0.037475
+vt -0.015147 1.007197 0.000000
+v 1.287602 -3.062156 0.356720
+vn 0.000000 -0.999298 0.037475
+vt -0.015148 -0.007196 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.287601 -2.361456 1.630720
+vn 0.000000 0.000000 1.000000
+vt -0.015147 1.007197 0.000000
+v 1.287602 -3.014380 1.630720
+vn 0.000000 0.000000 1.000000
+vt -0.015147 1.007197 0.000000
+v 2.265398 -3.014380 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.996964 1.007197 0.000000
+v 2.265398 -2.361456 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.996964 1.007197 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.287602 -3.062156 0.356720
+vn -1.000000 0.000000 0.000000
+vt -0.015148 -0.007196 0.000000
+v 1.287602 -3.014380 1.630720
+vn -1.000000 0.000000 0.000000
+vt -0.015147 1.007197 0.000000
+v 1.287601 -2.361456 1.630720
+vn -1.000000 0.000000 0.000000
+vt -0.015147 1.007197 0.000000
+v 1.287601 -2.313680 0.356720
+vn -1.000000 0.000000 0.000000
+vt -0.015148 -0.007196 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.265398 -2.313680 0.356720
+vn 1.000000 0.000000 0.000000
+vt 0.996963 -0.007196 0.000000
+v 2.265398 -2.361456 1.630720
+vn 1.000000 0.000000 0.000000
+vt 0.996964 1.007197 0.000000
+v 2.265398 -3.014380 1.630720
+vn 1.000000 0.000000 0.000000
+vt 0.996964 1.007197 0.000000
+v 2.265398 -3.062156 0.356720
+vn 1.000000 0.000000 0.000000
+vt 0.996963 -0.007196 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.886559 -2.313681 0.356720
+vn 0.000000 0.999298 0.037474
+vt 0.991106 0.006118 0.000000
+v -1.886559 -2.361457 1.630720
+vn 0.000000 0.999298 0.037474
+vt 0.991106 1.004051 0.000000
+v -0.908766 -2.361457 1.630720
+vn 0.000000 0.999298 0.037474
+vt 0.000121 1.004051 0.000000
+v -0.908766 -2.313681 0.356720
+vn 0.000000 0.999298 0.037474
+vt 0.000122 0.006118 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -0.908766 -3.062157 0.356720
+vn 0.000000 -0.999298 0.037475
+vt 0.000122 0.006118 0.000000
+v -0.908766 -3.014381 1.630720
+vn 0.000000 -0.999298 0.037475
+vt 0.000121 1.004051 0.000000
+v -1.886558 -3.014381 1.630720
+vn 0.000000 -0.999298 0.037475
+vt 0.991106 1.004051 0.000000
+v -1.886558 -3.062157 0.356720
+vn 0.000000 -0.999298 0.037475
+vt 0.991106 0.006118 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.886559 -2.361457 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.991106 1.004051 0.000000
+v -1.886558 -3.014381 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.991106 1.004051 0.000000
+v -0.908766 -3.014381 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.000121 1.004051 0.000000
+v -0.908766 -2.361457 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.000121 1.004051 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.886558 -3.062157 0.356720
+vn -1.000000 0.000000 0.000000
+vt 0.991106 0.006118 0.000000
+v -1.886558 -3.014381 1.630720
+vn -1.000000 0.000000 0.000000
+vt 0.991106 1.004051 0.000000
+v -1.886559 -2.361457 1.630720
+vn -1.000000 0.000000 0.000000
+vt 0.991106 1.004051 0.000000
+v -1.886559 -2.313681 0.356720
+vn -1.000000 0.000000 0.000000
+vt 0.991106 0.006118 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -0.908766 -2.313681 0.356720
+vn 1.000000 0.000000 0.000000
+vt 0.000122 0.006118 0.000000
+v -0.908766 -2.361457 1.630720
+vn 1.000000 0.000000 0.000000
+vt 0.000121 1.004051 0.000000
+v -0.908766 -3.014381 1.630720
+vn 1.000000 0.000000 0.000000
+vt 0.000121 1.004051 0.000000
+v -0.908766 -3.062157 0.356720
+vn 1.000000 0.000000 0.000000
+vt 0.000122 0.006118 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.603353 -2.313682 0.356720
+vn 0.000000 0.999298 0.037474
+vt 0.994782 0.004058 0.000000
+v -4.603353 -2.361458 1.630720
+vn 0.000000 0.999298 0.037474
+vt 0.994782 0.995942 0.000000
+v -3.625556 -2.361458 1.630720
+vn 0.000000 0.999298 0.037474
+vt -0.003187 0.995942 0.000000
+v -3.625556 -2.313681 0.356720
+vn 0.000000 0.999298 0.037474
+vt -0.003187 0.004058 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.625556 -2.313681 0.356720
+vn 1.000000 0.000001 0.000000
+vt -0.003187 0.004058 0.000000
+v -3.625556 -2.361458 1.630720
+vn 1.000000 0.000001 0.000000
+vt -0.003187 0.995942 0.000000
+v -3.625556 -3.014381 1.630720
+vn 1.000000 0.000001 0.000000
+vt -0.003187 0.995942 0.000000
+v -3.625556 -3.062157 0.356720
+vn 1.000000 0.000001 0.000000
+vt -0.003187 0.004058 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.603353 -2.361458 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.994782 0.995942 0.000000
+v -4.603352 -3.014382 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.994782 0.995942 0.000000
+v -3.625556 -3.014381 1.630720
+vn 0.000000 0.000000 1.000000
+vt -0.003187 0.995942 0.000000
+v -3.625556 -2.361458 1.630720
+vn 0.000000 0.000000 1.000000
+vt -0.003187 0.995942 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.625556 -3.062157 0.356720
+vn 0.000000 -0.999298 0.037475
+vt -0.003187 0.004058 0.000000
+v -3.625556 -3.014381 1.630720
+vn 0.000000 -0.999298 0.037475
+vt -0.003187 0.995942 0.000000
+v -4.603352 -3.014382 1.630720
+vn 0.000000 -0.999298 0.037475
+vt 0.994782 0.995942 0.000000
+v -4.603352 -3.062158 0.356720
+vn 0.000000 -0.999298 0.037475
+vt 0.994782 0.004058 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.603352 -3.062158 0.356720
+vn -1.000000 -0.000001 0.000000
+vt 0.994782 0.004058 0.000000
+v -4.603352 -3.014382 1.630720
+vn -1.000000 -0.000001 0.000000
+vt 0.994782 0.995942 0.000000
+v -4.603353 -2.361458 1.630720
+vn -1.000000 -0.000001 0.000000
+vt 0.994782 0.995942 0.000000
+v -4.603353 -2.313682 0.356720
+vn -1.000000 -0.000001 0.000000
+vt 0.994782 0.004058 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.966175 -7.069377 0.356720
+vn 0.000000 0.999298 0.037474
+vt -0.006712 0.002003 0.000000
+v 3.966175 -7.117152 1.630720
+vn 0.000000 0.999298 0.037474
+vt -0.006712 0.995882 0.000000
+v 4.943972 -7.117152 1.630720
+vn 0.000000 0.999298 0.037474
+vt 1.001127 0.995882 0.000000
+v 4.943972 -7.069377 0.356720
+vn 0.000000 0.999298 0.037474
+vt 1.001127 0.002003 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.943972 -7.817852 0.356720
+vn 0.000000 -0.999298 0.037474
+vt 1.001127 0.002003 0.000000
+v 4.943972 -7.770077 1.630720
+vn 0.000000 -0.999298 0.037474
+vt 1.001127 0.995882 0.000000
+v 3.966175 -7.770077 1.630720
+vn 0.000000 -0.999298 0.037474
+vt -0.006712 0.995882 0.000000
+v 3.966175 -7.817852 0.356720
+vn 0.000000 -0.999298 0.037474
+vt -0.006712 0.002003 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.966175 -7.117152 1.630720
+vn 0.000000 0.000000 1.000000
+vt -0.006712 0.995882 0.000000
+v 3.966175 -7.770077 1.630720
+vn 0.000000 0.000000 1.000000
+vt -0.006712 0.995882 0.000000
+v 4.943972 -7.770077 1.630720
+vn 0.000000 0.000000 1.000000
+vt 1.001127 0.995882 0.000000
+v 4.943972 -7.117152 1.630720
+vn 0.000000 0.000000 1.000000
+vt 1.001127 0.995882 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.966175 -7.817852 0.356720
+vn -1.000000 0.000000 0.000000
+vt -0.006712 0.002003 0.000000
+v 3.966175 -7.770077 1.630720
+vn -1.000000 0.000000 0.000000
+vt -0.006712 0.995882 0.000000
+v 3.966175 -7.117152 1.630720
+vn -1.000000 0.000000 0.000000
+vt -0.006712 0.995882 0.000000
+v 3.966175 -7.069377 0.356720
+vn -1.000000 0.000000 0.000000
+vt -0.006712 0.002003 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.943972 -7.069377 0.356720
+vn 1.000000 0.000000 0.000000
+vt 1.001127 0.002003 0.000000
+v 4.943972 -7.117152 1.630720
+vn 1.000000 0.000000 0.000000
+vt 1.001127 0.995882 0.000000
+v 4.943972 -7.770077 1.630720
+vn 1.000000 0.000000 0.000000
+vt 1.001127 0.995882 0.000000
+v 4.943972 -7.817852 0.356720
+vn 1.000000 0.000000 0.000000
+vt 1.001127 0.002003 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.287602 -7.069378 0.356720
+vn 0.000000 0.999298 0.037474
+vt -0.015148 -0.007196 0.000000
+v 1.287603 -7.117153 1.630720
+vn 0.000000 0.999298 0.037474
+vt -0.015147 1.007197 0.000000
+v 2.265399 -7.117152 1.630720
+vn 0.000000 0.999298 0.037474
+vt 0.996964 1.007197 0.000000
+v 2.265399 -7.069378 0.356720
+vn 0.000000 0.999298 0.037474
+vt 0.996963 -0.007196 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.265399 -7.817852 0.356720
+vn 0.000001 -0.999298 0.037474
+vt 0.996963 -0.007196 0.000000
+v 2.265399 -7.770078 1.630720
+vn 0.000001 -0.999298 0.037474
+vt 0.996964 1.007197 0.000000
+v 1.287603 -7.770078 1.630720
+vn 0.000001 -0.999298 0.037474
+vt -0.015147 1.007197 0.000000
+v 1.287603 -7.817853 0.356720
+vn 0.000001 -0.999298 0.037474
+vt -0.015148 -0.007196 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.287603 -7.117153 1.630720
+vn 0.000000 0.000000 1.000000
+vt -0.015147 1.007197 0.000000
+v 1.287603 -7.770078 1.630720
+vn 0.000000 0.000000 1.000000
+vt -0.015147 1.007197 0.000000
+v 2.265399 -7.770078 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.996964 1.007197 0.000000
+v 2.265399 -7.117152 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.996964 1.007197 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.287603 -7.817853 0.356720
+vn -1.000000 0.000000 0.000000
+vt -0.015148 -0.007196 0.000000
+v 1.287603 -7.770078 1.630720
+vn -1.000000 0.000000 0.000000
+vt -0.015147 1.007197 0.000000
+v 1.287603 -7.117153 1.630720
+vn -1.000000 0.000000 0.000000
+vt -0.015147 1.007197 0.000000
+v 1.287602 -7.069378 0.356720
+vn -1.000000 0.000000 0.000000
+vt -0.015148 -0.007196 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.265399 -7.069378 0.356720
+vn 1.000000 0.000000 0.000000
+vt 0.996963 -0.007196 0.000000
+v 2.265399 -7.117152 1.630720
+vn 1.000000 0.000000 0.000000
+vt 0.996964 1.007197 0.000000
+v 2.265399 -7.770078 1.630720
+vn 1.000000 0.000000 0.000000
+vt 0.996964 1.007197 0.000000
+v 2.265399 -7.817852 0.356720
+vn 1.000000 0.000000 0.000000
+vt 0.996963 -0.007196 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.886558 -7.069379 0.356720
+vn 0.000000 0.999298 0.037473
+vt 0.991106 0.006118 0.000000
+v -1.886558 -7.117153 1.630720
+vn 0.000000 0.999298 0.037473
+vt 0.991106 1.004051 0.000000
+v -0.908765 -7.117153 1.630720
+vn 0.000000 0.999298 0.037473
+vt 0.000121 1.004051 0.000000
+v -0.908765 -7.069379 0.356720
+vn 0.000000 0.999298 0.037473
+vt 0.000122 0.006118 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -0.908765 -7.817853 0.356720
+vn 0.000000 -0.999298 0.037473
+vt 0.000122 0.006118 0.000000
+v -0.908765 -7.770079 1.630720
+vn 0.000000 -0.999298 0.037473
+vt 0.000121 1.004051 0.000000
+v -1.886557 -7.770079 1.630720
+vn 0.000000 -0.999298 0.037473
+vt 0.991106 1.004051 0.000000
+v -1.886557 -7.817853 0.356720
+vn 0.000000 -0.999298 0.037473
+vt 0.991106 0.006118 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.886558 -7.117153 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.991106 1.004051 0.000000
+v -1.886557 -7.770079 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.991106 1.004051 0.000000
+v -0.908765 -7.770079 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.000121 1.004051 0.000000
+v -0.908765 -7.117153 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.000121 1.004051 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.886557 -7.817853 0.356720
+vn -1.000000 0.000000 0.000000
+vt 0.991106 0.006118 0.000000
+v -1.886557 -7.770079 1.630720
+vn -1.000000 0.000000 0.000000
+vt 0.991106 1.004051 0.000000
+v -1.886558 -7.117153 1.630720
+vn -1.000000 0.000000 0.000000
+vt 0.991106 1.004051 0.000000
+v -1.886558 -7.069379 0.356720
+vn -1.000000 0.000000 0.000000
+vt 0.991106 0.006118 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -0.908765 -7.069379 0.356720
+vn 1.000000 0.000000 0.000000
+vt 0.000122 0.006118 0.000000
+v -0.908765 -7.117153 1.630720
+vn 1.000000 0.000000 0.000000
+vt 0.000121 1.004051 0.000000
+v -0.908765 -7.770079 1.630720
+vn 1.000000 0.000000 0.000000
+vt 0.000121 1.004051 0.000000
+v -0.908765 -7.817853 0.356720
+vn 1.000000 0.000000 0.000000
+vt 0.000122 0.006118 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.603352 -7.069380 0.356720
+vn -0.000001 0.999298 0.037473
+vt 0.994782 0.004058 0.000000
+v -4.603351 -7.117154 1.630720
+vn -0.000001 0.999298 0.037473
+vt 0.994782 0.995942 0.000000
+v -3.625555 -7.117154 1.630720
+vn -0.000001 0.999298 0.037473
+vt -0.003187 0.995942 0.000000
+v -3.625555 -7.069379 0.356720
+vn -0.000001 0.999298 0.037473
+vt -0.003187 0.004058 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.625555 -7.817854 0.356720
+vn 0.000000 -0.999298 0.037473
+vt -0.003187 0.004058 0.000000
+v -3.625555 -7.770079 1.630720
+vn 0.000000 -0.999298 0.037473
+vt -0.003187 0.995942 0.000000
+v -4.603351 -7.770080 1.630720
+vn 0.000000 -0.999298 0.037473
+vt 0.994782 0.995942 0.000000
+v -4.603351 -7.817854 0.356720
+vn 0.000000 -0.999298 0.037473
+vt 0.994782 0.004058 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.603351 -7.117154 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.994782 0.995942 0.000000
+v -4.603351 -7.770080 1.630720
+vn 0.000000 0.000000 1.000000
+vt 0.994782 0.995942 0.000000
+v -3.625555 -7.770079 1.630720
+vn 0.000000 0.000000 1.000000
+vt -0.003187 0.995942 0.000000
+v -3.625555 -7.117154 1.630720
+vn 0.000000 0.000000 1.000000
+vt -0.003187 0.995942 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.603351 -7.817854 0.356720
+vn -1.000000 -0.000001 0.000000
+vt 0.994782 0.004058 0.000000
+v -4.603351 -7.770080 1.630720
+vn -1.000000 -0.000001 0.000000
+vt 0.994782 0.995942 0.000000
+v -4.603351 -7.117154 1.630720
+vn -1.000000 -0.000001 0.000000
+vt 0.994782 0.995942 0.000000
+v -4.603352 -7.069380 0.356720
+vn -1.000000 -0.000001 0.000000
+vt 0.994782 0.004058 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.625555 -7.069379 0.356720
+vn 1.000000 0.000001 0.000000
+vt -0.003187 0.004058 0.000000
+v -3.625555 -7.117154 1.630720
+vn 1.000000 0.000001 0.000000
+vt -0.003187 0.995942 0.000000
+v -3.625555 -7.770079 1.630720
+vn 1.000000 0.000001 0.000000
+vt -0.003187 0.995942 0.000000
+v -3.625555 -7.817854 0.356720
+vn 1.000000 0.000001 0.000000
+vt -0.003187 0.004058 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+g poles
+usemtl 58
+v 0.219801 -2.543001 0.356720
+vn 0.595561 0.803310 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.219801 -2.543001 4.762428
+vn 0.595561 0.803310 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.404530 -2.679956 4.762428
+vn 0.595561 0.803310 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.404530 -2.679956 0.356720
+vn 0.595561 0.803310 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 0.404530 -2.679956 0.356720
+vn 0.951444 -0.307821 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.404530 -2.679956 4.762428
+vn 0.951444 -0.307821 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.334460 -2.896536 4.762428
+vn 0.951444 -0.307821 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.334460 -2.896536 0.356720
+vn 0.951444 -0.307821 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 0.334460 -2.896536 0.356720
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.334460 -2.896536 4.762428
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.105139 -2.896536 4.762428
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.105139 -2.896536 0.356720
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 0.105139 -2.896536 0.356720
+vn -0.951447 -0.307814 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.105139 -2.896536 4.762428
+vn -0.951447 -0.307814 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.035071 -2.679956 4.762428
+vn -0.951447 -0.307814 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.035071 -2.679956 0.356720
+vn -0.951447 -0.307814 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 0.035071 -2.679956 0.356720
+vn -0.595559 0.803312 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.035071 -2.679956 4.762428
+vn -0.595559 0.803312 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.219801 -2.543001 4.762428
+vn -0.595559 0.803312 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.219801 -2.543001 0.356720
+vn -0.595559 0.803312 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 0.219802 -7.279588 0.356720
+vn 0.586512 0.809940 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.219802 -7.279588 4.762428
+vn 0.586512 0.809940 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.404531 -7.413358 4.762428
+vn 0.586512 0.809940 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.404531 -7.413358 0.356720
+vn 0.586512 0.809940 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 0.404531 -7.413358 0.356720
+vn 0.951444 -0.307821 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.404531 -7.413358 4.762428
+vn 0.951444 -0.307821 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.334461 -7.629938 4.762428
+vn 0.951444 -0.307821 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.334461 -7.629938 0.356720
+vn 0.951444 -0.307821 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 0.334461 -7.629938 0.356720
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.334461 -7.629938 4.762428
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.105140 -7.629938 4.762428
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.105140 -7.629938 0.356720
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 0.105140 -7.629938 0.356720
+vn -0.951447 -0.307813 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.105140 -7.629938 4.762428
+vn -0.951447 -0.307813 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.035072 -7.413358 4.762428
+vn -0.951447 -0.307813 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.035072 -7.413358 0.356720
+vn -0.951447 -0.307813 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 0.035072 -7.413358 0.356720
+vn -0.586509 0.809943 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.035072 -7.413358 4.762428
+vn -0.586509 0.809943 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.219802 -7.279588 4.762428
+vn -0.586509 0.809943 0.000000
+vt 0.000000 0.000000 0.000000
+v 0.219802 -7.279588 0.356720
+vn -0.586509 0.809943 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+g lilpole
+usemtl 50
+v -5.093839 -7.359215 0.356720
+vn 0.609712 0.792623 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.093839 -7.359215 1.248520
+vn 0.609712 0.792623 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.011030 -7.422915 1.248520
+vn 0.609712 0.792623 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.011030 -7.422915 0.356720
+vn 0.609712 0.792623 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.011030 -7.422915 0.356720
+vn 0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.011030 -7.422915 1.248520
+vn 0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.042881 -7.521649 1.248520
+vn 0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.042881 -7.521649 0.356720
+vn 0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.042881 -7.521649 0.356720
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.042881 -7.521649 1.248520
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.147985 -7.521649 1.248520
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.147985 -7.521649 0.356720
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.147985 -7.521649 0.356720
+vn -0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.147985 -7.521649 1.248520
+vn -0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.179836 -7.422915 1.248520
+vn -0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.179836 -7.422915 0.356720
+vn -0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.179836 -7.422915 0.356720
+vn -0.595219 0.803564 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.179836 -7.422915 1.248520
+vn -0.595219 0.803564 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.093839 -7.359215 1.248520
+vn -0.595219 0.803564 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.093839 -7.359215 0.356720
+vn -0.595219 0.803564 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.093841 -2.606703 0.356720
+vn 0.590016 0.807392 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.093841 -2.606703 1.248520
+vn 0.590016 0.807392 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.011031 -2.667217 1.248520
+vn 0.590016 0.807392 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.011031 -2.667217 0.356720
+vn 0.590016 0.807392 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.011031 -2.667217 0.356720
+vn 0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.011031 -2.667217 1.248520
+vn 0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.042882 -2.769138 1.248520
+vn 0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.042882 -2.769138 0.356720
+vn 0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.042882 -2.769138 0.356720
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.042882 -2.769138 1.248520
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.147986 -2.769138 1.248520
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.147986 -2.769138 0.356720
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.147986 -2.769138 0.356720
+vn -0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.147986 -2.769138 1.248520
+vn -0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.179837 -2.667217 1.248520
+vn -0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.179837 -2.667217 0.356720
+vn -0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.179837 -2.667217 0.356720
+vn -0.575483 0.817814 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.179837 -2.667217 1.248520
+vn -0.575483 0.817814 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.093841 -2.606703 1.248520
+vn -0.575483 0.817814 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.093841 -2.606703 0.356720
+vn -0.575483 0.817814 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.536381 -7.359212 0.356720
+vn 0.595227 0.803558 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.536381 -7.359212 1.248520
+vn 0.595227 0.803558 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.622375 -7.422912 1.248520
+vn 0.595227 0.803558 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.622375 -7.422912 0.356720
+vn 0.595227 0.803558 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.622375 -7.422912 0.356720
+vn 0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.622375 -7.422912 1.248520
+vn 0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.590525 -7.521646 1.248520
+vn 0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.590525 -7.521646 0.356720
+vn 0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.590525 -7.521646 0.356720
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.590525 -7.521646 1.248520
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.485420 -7.521646 1.248520
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.485420 -7.521646 0.356720
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.485420 -7.521646 0.356720
+vn -0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.485420 -7.521646 1.248520
+vn -0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.453569 -7.422912 1.248520
+vn -0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.453569 -7.422912 0.356720
+vn -0.951706 -0.307010 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.453569 -7.422912 0.356720
+vn -0.609703 0.792630 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.453569 -7.422912 1.248520
+vn -0.609703 0.792630 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.536381 -7.359212 1.248520
+vn -0.609703 0.792630 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.536381 -7.359212 0.356720
+vn -0.609703 0.792630 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.536380 -2.606700 0.356720
+vn 0.575491 0.817808 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.536380 -2.606700 1.248520
+vn 0.575491 0.817808 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.622375 -2.667214 1.248520
+vn 0.575491 0.817808 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.622375 -2.667214 0.356720
+vn 0.575491 0.817808 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.622375 -2.667214 0.356720
+vn 0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.622375 -2.667214 1.248520
+vn 0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.590524 -2.769135 1.248520
+vn 0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.590524 -2.769135 0.356720
+vn 0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.590524 -2.769135 0.356720
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.590524 -2.769135 1.248520
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.485419 -2.769135 1.248520
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.485419 -2.769135 0.356720
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.485419 -2.769135 0.356720
+vn -0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.485419 -2.769135 1.248520
+vn -0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.453568 -2.667214 1.248520
+vn -0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.453568 -2.667214 0.356720
+vn -0.954478 -0.298280 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.453568 -2.667214 0.356720
+vn -0.590007 0.807398 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.453568 -2.667214 1.248520
+vn -0.590007 0.807398 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.536380 -2.606700 1.248520
+vn -0.590007 0.807398 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.536380 -2.606700 0.356720
+vn -0.590007 0.807398 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.179837 -2.667217 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -5.147986 -2.769138 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -5.042882 -2.769138 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -5.011031 -2.667217 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -5.093841 -2.606703 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.453569 -7.422912 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 5.485420 -7.521646 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 5.590525 -7.521646 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 5.622375 -7.422912 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 5.536381 -7.359212 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.179836 -7.422915 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -5.147985 -7.521649 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -5.042881 -7.521649 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -5.011030 -7.422915 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -5.093839 -7.359215 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.453568 -2.667214 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 5.485419 -2.769135 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 5.590524 -2.769135 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 5.622375 -2.667214 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 5.536380 -2.606700 1.248520
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+g nozzles
+usemtl 0
+v 3.973126 -7.474762 1.496231
+vn 0.079950 0.995278 0.055050
+vt 0.000000 0.000000 0.000000
+v 3.973126 -7.474762 1.461424
+vn 0.079950 0.995278 0.055050
+vt 0.000000 0.000000 0.000000
+v 3.901126 -7.461802 1.366481
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.973126 -7.474762 1.496231
+vn 0.079950 0.995278 0.055050
+vt 0.000000 0.000000 0.000000
+v 3.901126 -7.461802 1.366481
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+v 3.880126 -7.474762 1.429210
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.901126 -7.548202 1.173709
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+v 3.901126 -7.526602 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v 3.880126 -7.513642 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.901126 -7.548202 1.173709
+vn -0.894490 -0.444965 0.043517
+vt 0.000000 0.000000 0.000000
+v 3.880126 -7.513642 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v 3.880126 -7.548202 1.084686
+vn -0.894490 -0.444965 0.043517
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.973126 -7.513642 1.496231
+vn 0.079944 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v 3.880126 -7.513642 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v 3.901126 -7.526602 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.973126 -7.513642 1.461424
+vn 0.079944 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v 3.973126 -7.513642 1.496231
+vn 0.079944 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v 3.901126 -7.526602 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.880126 -7.474762 1.429210
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+v 3.901126 -7.461802 1.366481
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+v 3.901126 -7.440202 1.173709
+vn -0.333353 0.941613 0.047337
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.880126 -7.474762 1.429210
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+v 3.901126 -7.440202 1.173709
+vn -0.333353 0.941613 0.047337
+vt 0.000000 0.000000 0.000000
+v 3.880126 -7.440202 1.084686
+vn -0.333353 0.941613 0.047337
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.943840 -7.481327 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+v 3.943840 -7.481327 0.568535
+vn -0.024409 0.999698 0.002922
+vt 0.000000 0.000000 0.000000
+v 3.913849 -7.482033 0.568535
+vn -0.024409 0.999698 0.002922
+vt 0.000000 0.000000 0.000000
+v 3.913849 -7.482033 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.944546 -7.511319 1.084686
+vn 0.999877 0.015683 0.000000
+vt 0.000000 0.000000 0.000000
+v 3.944546 -7.511319 0.568535
+vn 0.983458 0.023141 0.179654
+vt 0.000000 0.000000 0.000000
+v 3.943840 -7.481327 0.568535
+vn 0.983458 0.023141 0.179654
+vt 0.000000 0.000000 0.000000
+v 3.943840 -7.481327 1.084686
+vn 0.999877 0.015683 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.914555 -7.512025 1.084686
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+v 3.914555 -7.512025 0.568535
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v 3.944546 -7.511319 0.568535
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v 3.944546 -7.511319 1.084686
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.913849 -7.482033 1.084686
+vn -0.894490 -0.444965 0.043517
+vt 0.000000 0.000000 0.000000
+v 3.913849 -7.482033 0.568535
+vn -0.984640 -0.023169 -0.173052
+vt 0.000000 0.000000 0.000000
+v 3.914555 -7.512025 0.568535
+vn -0.984640 -0.023169 -0.173052
+vt 0.000000 0.000000 0.000000
+v 3.914555 -7.512025 1.084686
+vn -0.894490 -0.444965 0.043517
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.943840 -7.481327 0.568535
+vn -0.024409 0.999698 0.002922
+vt 0.000000 0.000000 0.000000
+v 3.951936 -7.481327 0.511512
+vn -0.024409 0.999698 0.002922
+vt 0.000000 0.000000 0.000000
+v 3.921945 -7.482033 0.505522
+vn -0.024409 0.999698 0.002922
+vt 0.000000 0.000000 0.000000
+v 3.913849 -7.482033 0.568535
+vn -0.024409 0.999698 0.002922
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.944546 -7.511319 0.568535
+vn 0.983458 0.023141 0.179654
+vt 0.000000 0.000000 0.000000
+v 3.952641 -7.511319 0.511512
+vn 0.983458 0.023141 0.179654
+vt 0.000000 0.000000 0.000000
+v 3.951936 -7.481327 0.511512
+vn 0.983458 0.023141 0.179654
+vt 0.000000 0.000000 0.000000
+v 3.943840 -7.481327 0.568535
+vn 0.983458 0.023141 0.179654
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.914555 -7.512025 0.568535
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v 3.922650 -7.512025 0.505522
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v 3.952641 -7.511319 0.511512
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v 3.944546 -7.511319 0.568535
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.913849 -7.482033 0.568535
+vn -0.984640 -0.023169 -0.173052
+vt 0.000000 0.000000 0.000000
+v 3.921945 -7.482033 0.505522
+vn -0.984640 -0.023169 -0.173052
+vt 0.000000 0.000000 0.000000
+v 3.922650 -7.512025 0.505522
+vn -0.984640 -0.023169 -0.173052
+vt 0.000000 0.000000 0.000000
+v 3.914555 -7.512025 0.568535
+vn -0.984640 -0.023169 -0.173052
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.951936 -7.481327 0.511512
+vn -0.024409 0.999698 0.002922
+vt 0.000000 0.000000 0.000000
+v 4.019025 -7.476995 0.369762
+vn -0.027061 0.999476 0.017734
+vt 0.000000 0.000000 0.000000
+v 3.989034 -7.477701 0.363771
+vn -0.027061 0.999476 0.017734
+vt 0.000000 0.000000 0.000000
+v 3.921945 -7.482033 0.505522
+vn -0.024409 0.999698 0.002922
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.952641 -7.511319 0.511512
+vn 0.983458 0.023141 0.179654
+vt 0.000000 0.000000 0.000000
+v 4.019731 -7.506987 0.369762
+vn 0.903421 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v 4.019025 -7.476995 0.369762
+vn 0.903421 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v 3.951936 -7.481327 0.511512
+vn 0.983458 0.023141 0.179654
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.922650 -7.512025 0.505522
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v 3.989739 -7.507692 0.363771
+vn 0.027062 -0.999476 -0.017740
+vt 0.000000 0.000000 0.000000
+v 4.019731 -7.506987 0.369762
+vn 0.027062 -0.999476 -0.017740
+vt 0.000000 0.000000 0.000000
+v 3.952641 -7.511319 0.511512
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.921945 -7.482033 0.505522
+vn -0.984640 -0.023169 -0.173052
+vt 0.000000 0.000000 0.000000
+v 3.989034 -7.477701 0.363771
+vn -0.903421 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v 3.989739 -7.507692 0.363771
+vn -0.903421 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v 3.922650 -7.512025 0.505522
+vn -0.984640 -0.023169 -0.173052
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.295110 -7.474763 1.496231
+vn 0.079953 0.995277 0.055050
+vt 0.000000 0.000000 0.000000
+v 1.295110 -7.474763 1.461424
+vn 0.079953 0.995277 0.055050
+vt 0.000000 0.000000 0.000000
+v 1.223111 -7.461802 1.366481
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.295110 -7.474763 1.496231
+vn 0.079953 0.995277 0.055050
+vt 0.000000 0.000000 0.000000
+v 1.223111 -7.461802 1.366481
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+v 1.202111 -7.474763 1.429210
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.223111 -7.548203 1.173709
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+v 1.223111 -7.526603 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v 1.202111 -7.513643 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.223111 -7.548203 1.173709
+vn -0.894490 -0.444965 0.043517
+vt 0.000000 0.000000 0.000000
+v 1.202111 -7.513643 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v 1.202111 -7.548203 1.084686
+vn -0.894490 -0.444965 0.043517
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.295110 -7.513643 1.496231
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v 1.202111 -7.513643 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v 1.223111 -7.526603 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.295110 -7.513643 1.461424
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v 1.295110 -7.513643 1.496231
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v 1.223111 -7.526603 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.202111 -7.474763 1.429210
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+v 1.223111 -7.461802 1.366481
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+v 1.223111 -7.440203 1.173709
+vn -0.333353 0.941613 0.047337
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.202111 -7.474763 1.429210
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+v 1.223111 -7.440203 1.173709
+vn -0.333353 0.941613 0.047337
+vt 0.000000 0.000000 0.000000
+v 1.202111 -7.440203 1.084686
+vn -0.333353 0.941613 0.047337
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.265824 -7.481328 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.265824 -7.481328 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v 1.235833 -7.482034 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v 1.235833 -7.482034 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.266530 -7.511320 1.084686
+vn 0.999877 0.015683 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.266530 -7.511320 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v 1.265824 -7.481328 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v 1.265824 -7.481328 1.084686
+vn 0.999877 0.015683 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.236539 -7.512026 1.084686
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+v 1.236539 -7.512026 0.568535
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v 1.266530 -7.511320 0.568535
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v 1.266530 -7.511320 1.084686
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.235833 -7.482034 1.084686
+vn -0.894490 -0.444965 0.043517
+vt 0.000000 0.000000 0.000000
+v 1.235833 -7.482034 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v 1.236539 -7.512026 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v 1.236539 -7.512026 1.084686
+vn -0.894490 -0.444965 0.043517
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.265824 -7.481328 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v 1.273919 -7.481328 0.511512
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v 1.243928 -7.482034 0.505522
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v 1.235833 -7.482034 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.266530 -7.511320 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v 1.274625 -7.511320 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v 1.273919 -7.481328 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v 1.265824 -7.481328 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.236539 -7.512026 0.568535
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v 1.244634 -7.512026 0.505522
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v 1.274625 -7.511320 0.511512
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v 1.266530 -7.511320 0.568535
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.235833 -7.482034 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v 1.243928 -7.482034 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v 1.244634 -7.512026 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v 1.236539 -7.512026 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.273919 -7.481328 0.511512
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v 1.341008 -7.476996 0.369762
+vn -0.027061 0.999476 0.017734
+vt 0.000000 0.000000 0.000000
+v 1.311017 -7.477702 0.363771
+vn -0.027061 0.999476 0.017734
+vt 0.000000 0.000000 0.000000
+v 1.243928 -7.482034 0.505522
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.274625 -7.511320 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v 1.341714 -7.506988 0.369762
+vn 0.903421 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v 1.341008 -7.476996 0.369762
+vn 0.903421 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v 1.273919 -7.481328 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.244634 -7.512026 0.505522
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v 1.311723 -7.507693 0.363771
+vn 0.027062 -0.999476 -0.017740
+vt 0.000000 0.000000 0.000000
+v 1.341714 -7.506988 0.369762
+vn 0.027062 -0.999476 -0.017740
+vt 0.000000 0.000000 0.000000
+v 1.274625 -7.511320 0.511512
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.243928 -7.482034 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v 1.311017 -7.477702 0.363771
+vn -0.903421 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v 1.311723 -7.507693 0.363771
+vn -0.903421 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v 1.244634 -7.512026 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.295109 -2.701201 1.496231
+vn 0.079947 0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v 1.295109 -2.701201 1.461424
+vn 0.079947 0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v 1.223110 -2.688242 1.366481
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.295109 -2.701201 1.496231
+vn 0.079947 0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v 1.223110 -2.688242 1.366481
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+v 1.202110 -2.701201 1.429210
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.223110 -2.774641 1.173709
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+v 1.223110 -2.753041 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v 1.202110 -2.740082 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.223110 -2.774641 1.173709
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+v 1.202110 -2.740082 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v 1.202110 -2.774641 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.295109 -2.740082 1.496231
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v 1.202110 -2.740082 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v 1.223110 -2.753041 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.295109 -2.740082 1.461424
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v 1.295109 -2.740082 1.496231
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v 1.223110 -2.753041 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.202110 -2.701201 1.429210
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+v 1.223110 -2.688242 1.366481
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+v 1.223110 -2.666641 1.173709
+vn -0.178162 0.982760 0.049406
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.202110 -2.701201 1.429210
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+v 1.223110 -2.666641 1.173709
+vn -0.178162 0.982760 0.049406
+vt 0.000000 0.000000 0.000000
+v 1.202110 -2.666641 1.084686
+vn -0.178162 0.982760 0.049406
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.265823 -2.707767 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.265823 -2.707767 0.568535
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v 1.235832 -2.708473 0.568535
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v 1.235832 -2.708473 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.266529 -2.737758 1.084686
+vn 0.999877 0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.266529 -2.737758 0.568535
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v 1.265823 -2.707767 0.568535
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v 1.265823 -2.707767 1.084686
+vn 0.999877 0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.236538 -2.738464 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+v 1.236538 -2.738464 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v 1.266529 -2.737758 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v 1.266529 -2.737758 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.235832 -2.708473 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+v 1.235832 -2.708473 0.568535
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v 1.236538 -2.738464 0.568535
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v 1.236538 -2.738464 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.265823 -2.707767 0.568535
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v 1.273918 -2.707767 0.511512
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v 1.243927 -2.708473 0.505522
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v 1.235832 -2.708473 0.568535
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.266529 -2.737758 0.568535
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v 1.274624 -2.737758 0.511512
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v 1.273918 -2.707767 0.511512
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v 1.265823 -2.707767 0.568535
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.236538 -2.738464 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v 1.244633 -2.738464 0.505522
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v 1.274624 -2.737758 0.511512
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v 1.266529 -2.737758 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.235832 -2.708473 0.568535
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v 1.243927 -2.708473 0.505522
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v 1.244633 -2.738464 0.505522
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v 1.236538 -2.738464 0.568535
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.273918 -2.707767 0.511512
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v 1.341007 -2.703435 0.369762
+vn -0.027062 0.999476 0.017740
+vt 0.000000 0.000000 0.000000
+v 1.311016 -2.704140 0.363771
+vn -0.027062 0.999476 0.017740
+vt 0.000000 0.000000 0.000000
+v 1.243927 -2.708473 0.505522
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.274624 -2.737758 0.511512
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v 1.341713 -2.733427 0.369762
+vn 0.903420 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v 1.341007 -2.703435 0.369762
+vn 0.903420 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v 1.273918 -2.707767 0.511512
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.244633 -2.738464 0.505522
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v 1.311722 -2.734133 0.363771
+vn 0.027061 -0.999476 -0.017734
+vt 0.000000 0.000000 0.000000
+v 1.341713 -2.733427 0.369762
+vn 0.027061 -0.999476 -0.017734
+vt 0.000000 0.000000 0.000000
+v 1.274624 -2.737758 0.511512
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.243927 -2.708473 0.505522
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v 1.311016 -2.704140 0.363771
+vn -0.903420 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v 1.311722 -2.734133 0.363771
+vn -0.903420 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v 1.244633 -2.738464 0.505522
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.598340 -2.701203 1.496231
+vn 0.079950 0.995278 0.055048
+vt 0.000000 0.000000 0.000000
+v -4.598340 -2.701203 1.461424
+vn 0.079950 0.995278 0.055048
+vt 0.000000 0.000000 0.000000
+v -4.670339 -2.688243 1.366481
+vn -0.167706 0.979975 0.107352
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.598340 -2.701203 1.496231
+vn 0.079950 0.995278 0.055048
+vt 0.000000 0.000000 0.000000
+v -4.670339 -2.688243 1.366481
+vn -0.167706 0.979975 0.107352
+vt 0.000000 0.000000 0.000000
+v -4.691339 -2.701203 1.429210
+vn -0.167706 0.979975 0.107352
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.670339 -2.774643 1.173709
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+v -4.670339 -2.753043 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v -4.691339 -2.740083 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.670339 -2.774643 1.173709
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+v -4.691339 -2.740083 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v -4.691339 -2.774643 1.084686
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.598340 -2.740083 1.496231
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -4.691339 -2.740083 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v -4.670339 -2.753043 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.598340 -2.740083 1.461424
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -4.598340 -2.740083 1.496231
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -4.670339 -2.753043 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.691339 -2.701203 1.429210
+vn -0.167706 0.979975 0.107352
+vt 0.000000 0.000000 0.000000
+v -4.670339 -2.688243 1.366481
+vn -0.167706 0.979975 0.107352
+vt 0.000000 0.000000 0.000000
+v -4.670339 -2.666643 1.173709
+vn -0.178167 0.982759 0.049406
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.691339 -2.701203 1.429210
+vn -0.167706 0.979975 0.107352
+vt 0.000000 0.000000 0.000000
+v -4.670339 -2.666643 1.173709
+vn -0.178167 0.982759 0.049406
+vt 0.000000 0.000000 0.000000
+v -4.691339 -2.666643 1.084686
+vn -0.178167 0.982759 0.049406
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.627625 -2.707769 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.627625 -2.707769 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v -4.657617 -2.708474 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v -4.657617 -2.708474 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.626920 -2.737760 1.084686
+vn 0.999877 0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.626920 -2.737760 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v -4.627625 -2.707769 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v -4.627625 -2.707769 1.084686
+vn 0.999877 0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.656911 -2.738466 1.084686
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+v -4.656911 -2.738466 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -4.626920 -2.737760 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -4.626920 -2.737760 1.084686
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.657617 -2.708474 1.084686
+vn -0.999877 -0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.657617 -2.708474 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v -4.656911 -2.738466 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v -4.656911 -2.738466 1.084686
+vn -0.999877 -0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.627625 -2.707769 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v -4.619531 -2.707769 0.511512
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v -4.649522 -2.708474 0.505522
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v -4.657617 -2.708474 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.626920 -2.737760 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v -4.618825 -2.737760 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v -4.619531 -2.707769 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v -4.627625 -2.707769 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.656911 -2.738466 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -4.648816 -2.738466 0.505522
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -4.618825 -2.737760 0.511512
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -4.626920 -2.737760 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.657617 -2.708474 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v -4.649522 -2.708474 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v -4.648816 -2.738466 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v -4.656911 -2.738466 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.619531 -2.707769 0.511512
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v -4.552442 -2.703437 0.369762
+vn -0.027061 0.999476 0.017737
+vt 0.000000 0.000000 0.000000
+v -4.582433 -2.704142 0.363771
+vn -0.027061 0.999476 0.017737
+vt 0.000000 0.000000 0.000000
+v -4.649522 -2.708474 0.505522
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.618825 -2.737760 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v -4.551736 -2.733428 0.369762
+vn 0.903421 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v -4.552442 -2.703437 0.369762
+vn 0.903421 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v -4.619531 -2.707769 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.648816 -2.738466 0.505522
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -4.581727 -2.734134 0.363771
+vn 0.027061 -0.999476 -0.017737
+vt 0.000000 0.000000 0.000000
+v -4.551736 -2.733428 0.369762
+vn 0.027061 -0.999476 -0.017737
+vt 0.000000 0.000000 0.000000
+v -4.618825 -2.737760 0.511512
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.649522 -2.708474 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v -4.582433 -2.704142 0.363771
+vn -0.903421 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v -4.581727 -2.734134 0.363771
+vn -0.903421 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v -4.648816 -2.738466 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.882607 -2.701202 1.496231
+vn 0.079947 0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -1.882607 -2.701202 1.461424
+vn 0.079947 0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -1.954605 -2.688243 1.366481
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.882607 -2.701202 1.496231
+vn 0.079947 0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -1.954605 -2.688243 1.366481
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+v -1.975605 -2.701202 1.429210
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.954605 -2.774642 1.173709
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+v -1.954605 -2.753042 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v -1.975605 -2.740083 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.954605 -2.774642 1.173709
+vn -0.894490 -0.444965 0.043517
+vt 0.000000 0.000000 0.000000
+v -1.975605 -2.740083 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v -1.975605 -2.774642 1.084686
+vn -0.894490 -0.444965 0.043517
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.882607 -2.740083 1.496231
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -1.975605 -2.740083 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v -1.954605 -2.753042 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.882607 -2.740083 1.461424
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -1.882607 -2.740083 1.496231
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -1.954605 -2.753042 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.975605 -2.701202 1.429210
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+v -1.954605 -2.688243 1.366481
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+v -1.954605 -2.666642 1.173709
+vn -0.333345 0.941616 0.047338
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.975605 -2.701202 1.429210
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+v -1.954605 -2.666642 1.173709
+vn -0.333345 0.941616 0.047338
+vt 0.000000 0.000000 0.000000
+v -1.975605 -2.666642 1.084686
+vn -0.333345 0.941616 0.047338
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.911892 -2.707768 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.911892 -2.707768 0.568535
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v -1.941883 -2.708474 0.568535
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v -1.941883 -2.708474 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.911186 -2.737759 1.084686
+vn 0.999877 0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.911186 -2.737759 0.568535
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v -1.911892 -2.707768 0.568535
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v -1.911892 -2.707768 1.084686
+vn 0.999877 0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.941177 -2.738465 1.084686
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+v -1.941177 -2.738465 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -1.911186 -2.737759 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -1.911186 -2.737759 1.084686
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.941883 -2.708474 1.084686
+vn -0.894490 -0.444965 0.043517
+vt 0.000000 0.000000 0.000000
+v -1.941883 -2.708474 0.568535
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v -1.941177 -2.738465 0.568535
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v -1.941177 -2.738465 1.084686
+vn -0.894490 -0.444965 0.043517
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.911892 -2.707768 0.568535
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v -1.903797 -2.707768 0.511512
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v -1.933788 -2.708474 0.505522
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v -1.941883 -2.708474 0.568535
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.911186 -2.737759 0.568535
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v -1.903092 -2.737759 0.511512
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v -1.903797 -2.707768 0.511512
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v -1.911892 -2.707768 0.568535
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.941177 -2.738465 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -1.933083 -2.738465 0.505522
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -1.903092 -2.737759 0.511512
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -1.911186 -2.737759 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.941883 -2.708474 0.568535
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v -1.933788 -2.708474 0.505522
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v -1.933083 -2.738465 0.505522
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v -1.941177 -2.738465 0.568535
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.903797 -2.707768 0.511512
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v -1.836708 -2.703436 0.369762
+vn -0.027062 0.999476 0.017740
+vt 0.000000 0.000000 0.000000
+v -1.866699 -2.704141 0.363771
+vn -0.027062 0.999476 0.017740
+vt 0.000000 0.000000 0.000000
+v -1.933788 -2.708474 0.505522
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.903092 -2.737759 0.511512
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v -1.836002 -2.733428 0.369762
+vn 0.903420 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v -1.836708 -2.703436 0.369762
+vn 0.903420 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v -1.903797 -2.707768 0.511512
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.933083 -2.738465 0.505522
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -1.865994 -2.734133 0.363771
+vn 0.027061 -0.999476 -0.017734
+vt 0.000000 0.000000 0.000000
+v -1.836002 -2.733428 0.369762
+vn 0.027061 -0.999476 -0.017734
+vt 0.000000 0.000000 0.000000
+v -1.903092 -2.737759 0.511512
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.933788 -2.708474 0.505522
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v -1.866699 -2.704141 0.363771
+vn -0.903420 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v -1.865994 -2.734133 0.363771
+vn -0.903420 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v -1.933083 -2.738465 0.505522
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.882605 -7.446158 1.496231
+vn 0.079953 0.995277 0.055050
+vt 0.000000 0.000000 0.000000
+v -1.882605 -7.446158 1.461424
+vn 0.079953 0.995277 0.055050
+vt 0.000000 0.000000 0.000000
+v -1.954604 -7.433198 1.366481
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.882605 -7.446158 1.496231
+vn 0.079953 0.995277 0.055050
+vt 0.000000 0.000000 0.000000
+v -1.954604 -7.433198 1.366481
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+v -1.975604 -7.446158 1.429210
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.954604 -7.519598 1.173709
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+v -1.954604 -7.497998 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v -1.975604 -7.485039 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.954604 -7.519598 1.173709
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+v -1.975604 -7.485039 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v -1.975604 -7.519598 1.084686
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.882605 -7.485039 1.496231
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -1.975604 -7.485039 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v -1.954604 -7.497998 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.882605 -7.485039 1.461424
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -1.882605 -7.485039 1.496231
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -1.954604 -7.497998 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.975604 -7.446158 1.429210
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+v -1.954604 -7.433198 1.366481
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+v -1.954604 -7.411598 1.173709
+vn -0.068120 0.997311 0.027022
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.975604 -7.446158 1.429210
+vn -0.167715 0.979973 0.107353
+vt 0.000000 0.000000 0.000000
+v -1.954604 -7.411598 1.173709
+vn -0.694790 0.715621 0.071786
+vt 0.000000 0.000000 0.000000
+v -1.975604 -7.411598 1.084686
+vn -0.694790 0.715621 0.071786
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.911891 -7.452724 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.911891 -7.452724 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v -1.941882 -7.453429 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v -1.941882 -7.453429 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.911185 -7.482716 1.084686
+vn 0.999877 0.015683 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.911185 -7.482716 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v -1.911891 -7.452724 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v -1.911891 -7.452724 1.084686
+vn 0.999877 0.015683 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.941176 -7.483421 1.084686
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+v -1.941176 -7.483421 0.568535
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v -1.911185 -7.482716 0.568535
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v -1.911185 -7.482716 1.084686
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.941882 -7.453429 1.084686
+vn -0.999877 -0.015683 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.941882 -7.453429 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v -1.941176 -7.483421 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v -1.941176 -7.483421 1.084686
+vn -0.999877 -0.015683 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.911891 -7.452724 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v -1.903796 -7.452724 0.511512
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v -1.933787 -7.453429 0.505522
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v -1.941882 -7.453429 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.911185 -7.482716 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v -1.903090 -7.482716 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v -1.903796 -7.452724 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v -1.911891 -7.452724 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.941176 -7.483421 0.568535
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v -1.933082 -7.483421 0.505522
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v -1.903090 -7.482716 0.511512
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v -1.911185 -7.482716 0.568535
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.941882 -7.453429 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v -1.933787 -7.453429 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v -1.933082 -7.483421 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v -1.941176 -7.483421 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.903796 -7.452724 0.511512
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v -1.836707 -7.448392 0.369762
+vn -0.027061 0.999476 0.017734
+vt 0.000000 0.000000 0.000000
+v -1.866698 -7.449098 0.363771
+vn -0.027061 0.999476 0.017734
+vt 0.000000 0.000000 0.000000
+v -1.933787 -7.453429 0.505522
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.903090 -7.482716 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v -1.836001 -7.478383 0.369762
+vn 0.903421 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v -1.836707 -7.448392 0.369762
+vn 0.903421 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v -1.903796 -7.452724 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.933082 -7.483421 0.505522
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+v -1.865992 -7.479089 0.363771
+vn 0.027062 -0.999476 -0.017740
+vt 0.000000 0.000000 0.000000
+v -1.836001 -7.478383 0.369762
+vn 0.027062 -0.999476 -0.017740
+vt 0.000000 0.000000 0.000000
+v -1.903090 -7.482716 0.511512
+vn 0.024410 -0.999698 -0.002924
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.933787 -7.453429 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v -1.866698 -7.449098 0.363771
+vn -0.903421 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v -1.865992 -7.479089 0.363771
+vn -0.903421 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v -1.933082 -7.483421 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.598339 -7.418833 1.496231
+vn 0.079947 0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -4.598339 -7.418833 1.461424
+vn 0.079947 0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -4.670337 -7.405873 1.366481
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.598339 -7.418833 1.496231
+vn 0.079947 0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -4.670337 -7.405873 1.366481
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+v -4.691337 -7.418833 1.429210
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.670337 -7.492272 1.173709
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+v -4.670337 -7.470673 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v -4.691337 -7.457713 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.670337 -7.492272 1.173709
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+v -4.691337 -7.457713 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v -4.691337 -7.492272 1.084686
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.598339 -7.457713 1.496231
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -4.691337 -7.457713 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v -4.670337 -7.470673 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.598339 -7.457713 1.461424
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -4.598339 -7.457713 1.496231
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v -4.670337 -7.470673 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.691337 -7.418833 1.429210
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+v -4.670337 -7.405873 1.366481
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+v -4.670337 -7.384273 1.173709
+vn -0.333345 0.941616 0.047338
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.691337 -7.418833 1.429210
+vn -0.167696 0.979976 0.107351
+vt 0.000000 0.000000 0.000000
+v -4.670337 -7.384273 1.173709
+vn -0.333345 0.941616 0.047338
+vt 0.000000 0.000000 0.000000
+v -4.691337 -7.384273 1.084686
+vn -0.333345 0.941616 0.047338
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.627624 -7.425399 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.627624 -7.425399 0.568535
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v -4.657615 -7.426105 0.568535
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v -4.657615 -7.426105 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.626918 -7.455390 1.084686
+vn 0.999877 0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.626918 -7.455390 0.568535
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v -4.627624 -7.425399 0.568535
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v -4.627624 -7.425399 1.084686
+vn 0.999877 0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.656909 -7.456096 1.084686
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+v -4.656909 -7.456096 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -4.626918 -7.455390 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -4.626918 -7.455390 1.084686
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.657615 -7.426105 1.084686
+vn -0.999877 -0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.657615 -7.426105 0.568535
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v -4.656909 -7.456096 0.568535
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v -4.656909 -7.456096 1.084686
+vn -0.999877 -0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.627624 -7.425399 0.568535
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v -4.619529 -7.425399 0.511512
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v -4.649520 -7.426105 0.505522
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v -4.657615 -7.426105 0.568535
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.626918 -7.455390 0.568535
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v -4.618824 -7.455390 0.511512
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v -4.619529 -7.425399 0.511512
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v -4.627624 -7.425399 0.568535
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.656909 -7.456096 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -4.648815 -7.456096 0.505522
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -4.618824 -7.455390 0.511512
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -4.626918 -7.455390 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.657615 -7.426105 0.568535
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v -4.649520 -7.426105 0.505522
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v -4.648815 -7.456096 0.505522
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v -4.656909 -7.456096 0.568535
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.619529 -7.425399 0.511512
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+v -4.552440 -7.421066 0.369762
+vn -0.027062 0.999476 0.017740
+vt 0.000000 0.000000 0.000000
+v -4.582431 -7.421772 0.363771
+vn -0.027062 0.999476 0.017740
+vt 0.000000 0.000000 0.000000
+v -4.649520 -7.426105 0.505522
+vn -0.024410 0.999698 0.002924
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.618824 -7.455390 0.511512
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+v -4.551734 -7.451058 0.369762
+vn 0.903420 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v -4.552440 -7.421066 0.369762
+vn 0.903420 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v -4.619529 -7.425399 0.511512
+vn 0.983459 0.023142 0.179645
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.648815 -7.456096 0.505522
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v -4.581726 -7.451764 0.363771
+vn 0.027061 -0.999476 -0.017734
+vt 0.000000 0.000000 0.000000
+v -4.551734 -7.451058 0.369762
+vn 0.027061 -0.999476 -0.017734
+vt 0.000000 0.000000 0.000000
+v -4.618824 -7.455390 0.511512
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.649520 -7.426105 0.505522
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+v -4.582431 -7.421772 0.363771
+vn -0.903420 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v -4.581726 -7.451764 0.363771
+vn -0.903420 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v -4.648815 -7.456096 0.505522
+vn -0.984642 -0.023170 -0.173044
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.973448 -2.701201 1.496231
+vn 0.079950 0.995278 0.055048
+vt 0.000000 0.000000 0.000000
+v 3.973448 -2.701201 1.461424
+vn 0.079950 0.995278 0.055048
+vt 0.000000 0.000000 0.000000
+v 3.901449 -2.688241 1.366481
+vn -0.167706 0.979975 0.107352
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.973448 -2.701201 1.496231
+vn 0.079950 0.995278 0.055048
+vt 0.000000 0.000000 0.000000
+v 3.901449 -2.688241 1.366481
+vn -0.167706 0.979975 0.107352
+vt 0.000000 0.000000 0.000000
+v 3.880449 -2.701201 1.429210
+vn -0.167706 0.979975 0.107352
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.901449 -2.774640 1.173709
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+v 3.901449 -2.753041 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v 3.880449 -2.740081 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.901449 -2.774640 1.173709
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+v 3.880449 -2.740081 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v 3.880449 -2.774640 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.973448 -2.740081 1.496231
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v 3.880449 -2.740081 1.429210
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+v 3.901449 -2.753041 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.973448 -2.740081 1.461424
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v 3.973448 -2.740081 1.496231
+vn 0.079947 -0.995278 0.055046
+vt 0.000000 0.000000 0.000000
+v 3.901449 -2.753041 1.366481
+vn -0.167699 -0.979976 0.107349
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.880449 -2.701201 1.429210
+vn -0.167706 0.979975 0.107352
+vt 0.000000 0.000000 0.000000
+v 3.901449 -2.688241 1.366481
+vn -0.167706 0.979975 0.107352
+vt 0.000000 0.000000 0.000000
+v 3.901449 -2.666641 1.173709
+vn -0.068113 0.997312 0.027022
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.880449 -2.701201 1.429210
+vn -0.167706 0.979975 0.107352
+vt 0.000000 0.000000 0.000000
+v 3.901449 -2.666641 1.173709
+vn -0.694790 0.715621 0.071786
+vt 0.000000 0.000000 0.000000
+v 3.880449 -2.666641 1.084686
+vn -0.694790 0.715621 0.071786
+vt 0.000000 0.000000 0.000000
+f -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.944162 -2.707766 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+v 3.944162 -2.707766 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v 3.914171 -2.708472 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v 3.914171 -2.708472 1.084686
+vn -0.023524 0.999723 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.944868 -2.737758 1.084686
+vn 0.999877 0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+v 3.944868 -2.737758 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v 3.944162 -2.707766 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v 3.944162 -2.707766 1.084686
+vn 0.999877 0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.914877 -2.738464 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+v 3.914877 -2.738464 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v 3.944868 -2.737758 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v 3.944868 -2.737758 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.914171 -2.708472 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+v 3.914171 -2.708472 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v 3.914877 -2.738464 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v 3.914877 -2.738464 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.944162 -2.707766 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v 3.952257 -2.707766 0.511512
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v 3.922266 -2.708472 0.505522
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v 3.914171 -2.708472 0.568535
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.944868 -2.737758 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v 3.952963 -2.737758 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v 3.952257 -2.707766 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v 3.944162 -2.707766 0.568535
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.914877 -2.738464 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v 3.922972 -2.738464 0.505522
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v 3.952963 -2.737758 0.511512
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v 3.944868 -2.737758 0.568535
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.914171 -2.708472 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v 3.922266 -2.708472 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v 3.922972 -2.738464 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v 3.914877 -2.738464 0.568535
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.952257 -2.707766 0.511512
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+v 4.019346 -2.703434 0.369762
+vn -0.027061 0.999476 0.017737
+vt 0.000000 0.000000 0.000000
+v 3.989355 -2.704140 0.363771
+vn -0.027061 0.999476 0.017737
+vt 0.000000 0.000000 0.000000
+v 3.922266 -2.708472 0.505522
+vn -0.024409 0.999698 0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.952963 -2.737758 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+v 4.020052 -2.733426 0.369762
+vn 0.903421 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v 4.019346 -2.703434 0.369762
+vn 0.903421 0.021258 0.428228
+vt 0.000000 0.000000 0.000000
+v 3.952257 -2.707766 0.511512
+vn 0.983459 0.023141 0.179645
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.922972 -2.738464 0.505522
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+v 3.990061 -2.734132 0.363771
+vn 0.027061 -0.999476 -0.017737
+vt 0.000000 0.000000 0.000000
+v 4.020052 -2.733426 0.369762
+vn 0.027061 -0.999476 -0.017737
+vt 0.000000 0.000000 0.000000
+v 3.952963 -2.737758 0.511512
+vn 0.024409 -0.999698 -0.002923
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.922266 -2.708472 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+v 3.989355 -2.704140 0.363771
+vn -0.903421 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v 3.990061 -2.734132 0.363771
+vn -0.903421 -0.021258 -0.428228
+vt 0.000000 0.000000 0.000000
+v 3.922972 -2.738464 0.505522
+vn -0.984642 -0.023169 -0.173044
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.880126 -7.474762 1.429210
+vn -0.890127 0.000000 0.455713
+vt 0.000000 0.000000 0.000000
+v 3.880126 -7.513642 1.429210
+vn -0.890127 0.000000 0.455713
+vt 0.000000 0.000000 0.000000
+v 3.973126 -7.513642 1.496231
+vn -0.584651 0.000000 0.811285
+vt 0.000000 0.000000 0.000000
+v 3.973126 -7.474762 1.496231
+vn -0.584651 0.000000 0.811285
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.880126 -7.548202 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 3.880126 -7.440202 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 3.973126 -7.440202 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 3.973126 -7.548202 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.880126 -7.548202 1.084686
+vn -0.894490 -0.444965 0.043517
+vt 0.000000 0.000000 0.000000
+v 3.880126 -7.513642 1.429210
+vn -0.890127 0.000000 0.455713
+vt 0.000000 0.000000 0.000000
+v 3.880126 -7.474762 1.429210
+vn -0.890127 0.000000 0.455713
+vt 0.000000 0.000000 0.000000
+v 3.880126 -7.440202 1.084686
+vn -0.333353 0.941613 0.047337
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.901126 -7.548202 1.173709
+vn 0.999877 0.015683 0.000000
+vt 0.000000 0.000000 0.000000
+v 3.901126 -7.440202 1.173709
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 3.901126 -7.461802 1.366481
+vn 0.947838 0.000000 -0.318753
+vt 0.000000 0.000000 0.000000
+v 3.901126 -7.526602 1.366481
+vn 0.947838 0.000000 -0.318753
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.901126 -7.440202 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 3.901126 -7.548202 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 3.973126 -7.548202 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 3.973126 -7.440202 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.901126 -7.526602 1.366481
+vn 0.947838 0.000000 -0.318753
+vt 0.000000 0.000000 0.000000
+v 3.901126 -7.461802 1.366481
+vn 0.947838 0.000000 -0.318753
+vt 0.000000 0.000000 0.000000
+v 3.973126 -7.474762 1.461424
+vn 0.796793 0.000000 -0.604252
+vt 0.000000 0.000000 0.000000
+v 3.973126 -7.513642 1.461424
+vn 0.796793 0.000000 -0.604252
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.973126 -7.548202 1.084686
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+v 3.973126 -7.548202 1.173709
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 3.901126 -7.548202 1.173709
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+v 3.880126 -7.548202 1.084686
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.973126 -7.440202 1.173709
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 3.973126 -7.440202 1.084686
+vn -0.333353 0.941613 0.047337
+vt 0.000000 0.000000 0.000000
+v 3.880126 -7.440202 1.084686
+vn -0.333353 0.941613 0.047337
+vt 0.000000 0.000000 0.000000
+v 3.901126 -7.440202 1.173709
+vn -0.333353 0.941613 0.047337
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.202111 -7.474763 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v 1.202111 -7.513643 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v 1.295110 -7.513643 1.496231
+vn -0.584659 0.000000 0.811279
+vt 0.000000 0.000000 0.000000
+v 1.295110 -7.474763 1.496231
+vn -0.584659 0.000000 0.811279
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.202111 -7.548203 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.202111 -7.440203 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.295110 -7.440203 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.295110 -7.548203 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.202111 -7.548203 1.084686
+vn -0.894490 -0.444965 0.043517
+vt 0.000000 0.000000 0.000000
+v 1.202111 -7.513643 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v 1.202111 -7.474763 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v 1.202111 -7.440203 1.084686
+vn -0.333353 0.941613 0.047337
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.223111 -7.548203 1.173709
+vn 0.999877 0.015683 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.223111 -7.440203 1.173709
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.223111 -7.461802 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v 1.223111 -7.526603 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.223111 -7.440203 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.223111 -7.548203 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.295110 -7.548203 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.295110 -7.440203 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.223111 -7.526603 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v 1.223111 -7.461802 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v 1.295110 -7.474763 1.461424
+vn 0.796801 0.000000 -0.604242
+vt 0.000000 0.000000 0.000000
+v 1.295110 -7.513643 1.461424
+vn 0.796801 0.000000 -0.604242
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.295110 -7.548203 1.084686
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+v 1.295110 -7.548203 1.173709
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.223111 -7.548203 1.173709
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+v 1.202111 -7.548203 1.084686
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.295110 -7.440203 1.173709
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.295110 -7.440203 1.084686
+vn -0.333353 0.941613 0.047337
+vt 0.000000 0.000000 0.000000
+v 1.202111 -7.440203 1.084686
+vn -0.333353 0.941613 0.047337
+vt 0.000000 0.000000 0.000000
+v 1.223111 -7.440203 1.173709
+vn -0.333353 0.941613 0.047337
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.202110 -2.701201 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v 1.202110 -2.740082 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v 1.295109 -2.740082 1.496231
+vn -0.584659 0.000000 0.811279
+vt 0.000000 0.000000 0.000000
+v 1.295109 -2.701201 1.496231
+vn -0.584659 0.000000 0.811279
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.202110 -2.774641 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.202110 -2.666641 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.295109 -2.666641 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.295109 -2.774641 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.202110 -2.774641 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+v 1.202110 -2.740082 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v 1.202110 -2.701201 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v 1.202110 -2.666641 1.084686
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.223110 -2.774641 1.173709
+vn 0.999877 0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.223110 -2.666641 1.173709
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.223110 -2.688242 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v 1.223110 -2.753041 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.223110 -2.666641 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.223110 -2.774641 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.295109 -2.774641 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.295109 -2.666641 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.223110 -2.753041 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v 1.223110 -2.688242 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v 1.295109 -2.701201 1.461424
+vn 0.796801 0.000000 -0.604242
+vt 0.000000 0.000000 0.000000
+v 1.295109 -2.740082 1.461424
+vn 0.796801 0.000000 -0.604242
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.295109 -2.774641 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+v 1.295109 -2.774641 1.173709
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.223110 -2.774641 1.173709
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+v 1.202110 -2.774641 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.295109 -2.666641 1.173709
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.295109 -2.666641 1.084686
+vn -0.178162 0.982760 0.049406
+vt 0.000000 0.000000 0.000000
+v 1.202110 -2.666641 1.084686
+vn -0.178162 0.982760 0.049406
+vt 0.000000 0.000000 0.000000
+v 1.223110 -2.666641 1.173709
+vn -0.178162 0.982760 0.049406
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.691339 -2.701203 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -4.691339 -2.740083 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -4.598340 -2.740083 1.496231
+vn -0.584659 0.000000 0.811279
+vt 0.000000 0.000000 0.000000
+v -4.598340 -2.701203 1.496231
+vn -0.584659 0.000000 0.811279
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.691339 -2.774643 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.691339 -2.666643 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.598340 -2.666643 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.598340 -2.774643 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.691339 -2.774643 1.084686
+vn -0.999877 -0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.691339 -2.740083 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -4.691339 -2.701203 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -4.691339 -2.666643 1.084686
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.670339 -2.774643 1.173709
+vn 0.999877 0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.670339 -2.666643 1.173709
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.670339 -2.688243 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v -4.670339 -2.753043 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.670339 -2.666643 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.670339 -2.774643 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.598340 -2.774643 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.598340 -2.666643 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.670339 -2.753043 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v -4.670339 -2.688243 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v -4.598340 -2.701203 1.461424
+vn 0.796801 0.000000 -0.604242
+vt 0.000000 0.000000 0.000000
+v -4.598340 -2.740083 1.461424
+vn 0.796801 0.000000 -0.604242
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.598340 -2.774643 1.084686
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+v -4.598340 -2.774643 1.173709
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.670339 -2.774643 1.173709
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+v -4.691339 -2.774643 1.084686
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.598340 -2.666643 1.173709
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.598340 -2.666643 1.084686
+vn -0.178167 0.982759 0.049406
+vt 0.000000 0.000000 0.000000
+v -4.691339 -2.666643 1.084686
+vn -0.178167 0.982759 0.049406
+vt 0.000000 0.000000 0.000000
+v -4.670339 -2.666643 1.173709
+vn -0.178167 0.982759 0.049406
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.975605 -2.701202 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -1.975605 -2.740083 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -1.882607 -2.740083 1.496231
+vn -0.584659 0.000000 0.811279
+vt 0.000000 0.000000 0.000000
+v -1.882607 -2.701202 1.496231
+vn -0.584659 0.000000 0.811279
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.975605 -2.774642 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.975605 -2.666642 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.882607 -2.666642 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.882607 -2.774642 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.975605 -2.774642 1.084686
+vn -0.894490 -0.444965 0.043517
+vt 0.000000 0.000000 0.000000
+v -1.975605 -2.740083 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -1.975605 -2.701202 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -1.975605 -2.666642 1.084686
+vn -0.333345 0.941616 0.047338
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.954605 -2.774642 1.173709
+vn 0.999877 0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.954605 -2.666642 1.173709
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.954605 -2.688243 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v -1.954605 -2.753042 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.954605 -2.666642 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.954605 -2.774642 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.882607 -2.774642 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.882607 -2.666642 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.954605 -2.753042 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v -1.954605 -2.688243 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v -1.882607 -2.701202 1.461424
+vn 0.796801 0.000000 -0.604242
+vt 0.000000 0.000000 0.000000
+v -1.882607 -2.740083 1.461424
+vn 0.796801 0.000000 -0.604242
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.882607 -2.774642 1.084686
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+v -1.882607 -2.774642 1.173709
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.954605 -2.774642 1.173709
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+v -1.975605 -2.774642 1.084686
+vn -0.037437 -0.999137 0.017984
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.882607 -2.666642 1.173709
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.882607 -2.666642 1.084686
+vn -0.333345 0.941616 0.047338
+vt 0.000000 0.000000 0.000000
+v -1.975605 -2.666642 1.084686
+vn -0.333345 0.941616 0.047338
+vt 0.000000 0.000000 0.000000
+v -1.954605 -2.666642 1.173709
+vn -0.333345 0.941616 0.047338
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.975604 -7.446158 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -1.975604 -7.485039 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -1.882605 -7.485039 1.496231
+vn -0.584659 0.000000 0.811279
+vt 0.000000 0.000000 0.000000
+v -1.882605 -7.446158 1.496231
+vn -0.584659 0.000000 0.811279
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.975604 -7.519598 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.975604 -7.411598 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.882605 -7.411598 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.882605 -7.519598 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.975604 -7.519598 1.084686
+vn -0.999877 -0.015683 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.975604 -7.485039 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -1.975604 -7.446158 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -1.975604 -7.411598 1.084686
+vn -0.694790 0.715621 0.071786
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.954604 -7.519598 1.173709
+vn 0.999877 0.015683 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.954604 -7.411598 1.173709
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.954604 -7.433198 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v -1.954604 -7.497998 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.954604 -7.411598 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.954604 -7.519598 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.882605 -7.519598 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.882605 -7.411598 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.954604 -7.497998 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v -1.954604 -7.433198 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v -1.882605 -7.446158 1.461424
+vn 0.796801 0.000000 -0.604242
+vt 0.000000 0.000000 0.000000
+v -1.882605 -7.485039 1.461424
+vn 0.796801 0.000000 -0.604242
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.882605 -7.519598 1.084686
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+v -1.882605 -7.519598 1.173709
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.954604 -7.519598 1.173709
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+v -1.975604 -7.519598 1.084686
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.882605 -7.411598 1.173709
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.882605 -7.411598 1.084686
+vn -0.068120 0.997311 0.027022
+vt 0.000000 0.000000 0.000000
+v -1.975604 -7.411598 1.084686
+vn -0.068120 0.997311 0.027022
+vt 0.000000 0.000000 0.000000
+v -1.954604 -7.411598 1.173709
+vn -0.068120 0.997311 0.027022
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.691337 -7.418833 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -4.691337 -7.457713 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -4.598339 -7.457713 1.496231
+vn -0.584659 0.000000 0.811279
+vt 0.000000 0.000000 0.000000
+v -4.598339 -7.418833 1.496231
+vn -0.584659 0.000000 0.811279
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.691337 -7.492272 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.691337 -7.384273 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.598339 -7.384273 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.598339 -7.492272 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.691337 -7.492272 1.084686
+vn -0.999877 -0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.691337 -7.457713 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -4.691337 -7.418833 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v -4.691337 -7.384273 1.084686
+vn -0.333345 0.941616 0.047338
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.670337 -7.492272 1.173709
+vn 0.999877 0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.670337 -7.384273 1.173709
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.670337 -7.405873 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v -4.670337 -7.470673 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.670337 -7.384273 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.670337 -7.492272 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.598339 -7.492272 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.598339 -7.384273 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.670337 -7.470673 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v -4.670337 -7.405873 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v -4.598339 -7.418833 1.461424
+vn 0.796801 0.000000 -0.604242
+vt 0.000000 0.000000 0.000000
+v -4.598339 -7.457713 1.461424
+vn 0.796801 0.000000 -0.604242
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.598339 -7.492272 1.084686
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+v -4.598339 -7.492272 1.173709
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.670337 -7.492272 1.173709
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+v -4.691337 -7.492272 1.084686
+vn -0.127569 -0.991138 0.037036
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.598339 -7.384273 1.173709
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.598339 -7.384273 1.084686
+vn -0.333345 0.941616 0.047338
+vt 0.000000 0.000000 0.000000
+v -4.691337 -7.384273 1.084686
+vn -0.333345 0.941616 0.047338
+vt 0.000000 0.000000 0.000000
+v -4.670337 -7.384273 1.173709
+vn -0.333345 0.941616 0.047338
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.880449 -2.701201 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v 3.880449 -2.740081 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v 3.973448 -2.740081 1.496231
+vn -0.584659 0.000000 0.811279
+vt 0.000000 0.000000 0.000000
+v 3.973448 -2.701201 1.496231
+vn -0.584659 0.000000 0.811279
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.880449 -2.774640 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 3.880449 -2.666641 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 3.973448 -2.666641 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 3.973448 -2.774640 1.084686
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.880449 -2.774640 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+v 3.880449 -2.740081 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v 3.880449 -2.701201 1.429210
+vn -0.890129 0.000000 0.455709
+vt 0.000000 0.000000 0.000000
+v 3.880449 -2.666641 1.084686
+vn -0.694790 0.715621 0.071786
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.901449 -2.774640 1.173709
+vn 0.999877 0.015684 0.000000
+vt 0.000000 0.000000 0.000000
+v 3.901449 -2.666641 1.173709
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 3.901449 -2.688241 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v 3.901449 -2.753041 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.901449 -2.666641 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 3.901449 -2.774640 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 3.973448 -2.774640 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 3.973448 -2.666641 1.173709
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.901449 -2.753041 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v 3.901449 -2.688241 1.366481
+vn 0.947840 0.000000 -0.318747
+vt 0.000000 0.000000 0.000000
+v 3.973448 -2.701201 1.461424
+vn 0.796801 0.000000 -0.604242
+vt 0.000000 0.000000 0.000000
+v 3.973448 -2.740081 1.461424
+vn 0.796801 0.000000 -0.604242
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.973448 -2.774640 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+v 3.973448 -2.774640 1.173709
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 3.901449 -2.774640 1.173709
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+v 3.880449 -2.774640 1.084686
+vn -0.454582 -0.890091 0.033060
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 3.973448 -2.666641 1.173709
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 3.973448 -2.666641 1.084686
+vn -0.068113 0.997312 0.027022
+vt 0.000000 0.000000 0.000000
+v 3.880449 -2.666641 1.084686
+vn -0.068113 0.997312 0.027022
+vt 0.000000 0.000000 0.000000
+v 3.901449 -2.666641 1.173709
+vn -0.068113 0.997312 0.027022
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+g numbers
+v -4.305910 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.305910 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.253191 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.200476 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.147757 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.095037 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.042318 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.989603 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.936884 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.884165 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.884165 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.902357 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.902357 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.955076 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.007792 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.060511 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.113230 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.165949 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.218664 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.271383 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.324102 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.324102 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.134579 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.134579 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.187298 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.240017 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.292733 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.345452 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.398171 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.450890 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.503605 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.556324 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.556324 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.573956 -2.379366 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.573956 -2.309156 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.521237 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.468518 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.415802 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.363083 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.310364 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.257645 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.204930 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.152211 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.152211 -2.379366 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.134579 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.134579 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.556324 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.556324 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.503605 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.450890 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.398171 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.345452 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.292733 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.240017 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.187298 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.152211 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.152211 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.204930 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.257645 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.310364 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.363083 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.415802 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.468518 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.521237 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.573956 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.573956 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.305910 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.884165 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.884165 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.936884 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.989603 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.042318 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.095037 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.147757 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.200476 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.253191 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.305910 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.324102 -2.379366 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.324102 -2.309156 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.271383 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.218664 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.165949 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.113230 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.060511 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.007792 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.955076 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.902357 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.902357 -2.379366 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.819042 -7.151839 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.819042 -7.081628 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.819042 -7.081628 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.819042 -7.151839 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.385071 -7.151839 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.385071 -7.081628 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.385071 -7.081628 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.385071 -7.151839 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.385071 -7.151839 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.385071 -7.081628 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.819042 -7.081628 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.819042 -7.151839 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.819042 -7.151839 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.819042 -7.081628 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.385071 -7.081628 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.385071 -7.151839 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v -4.385071 -7.081628 1.402008
+vn 0.000000 1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v -3.819042 -7.081628 1.402008
+vn 0.000000 1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v -3.819042 -7.081628 1.340892
+vn 0.000000 1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v -4.385071 -7.081628 1.340893
+vn 0.000000 1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.161522 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.057919 0.872690 0.000000
+v -4.108803 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt -0.003269 0.865041 0.000000
+v -4.108803 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt -0.000314 0.634507 0.000000
+v -4.161522 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.060875 0.642155 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.950649 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v -3.897930 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v -3.897930 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v -3.950649 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v -3.897930 -7.151839 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.897930 -7.081628 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.897930 -7.081628 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.897930 -7.151839 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.319675 -7.151839 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.319675 -7.081628 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.319675 -7.081628 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.319675 -7.151839 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.072653 -7.151839 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.072653 -7.081628 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.072653 -7.081628 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.072653 -7.151839 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.638682 -7.151839 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.638682 -7.081628 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.638682 -7.081628 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.638682 -7.151839 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.638682 -7.151839 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.638682 -7.081628 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.072653 -7.081628 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.072653 -7.151839 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.072653 -7.151839 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.072653 -7.081628 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.638682 -7.081628 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.638682 -7.151839 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v -1.638682 -7.081628 1.402008
+vn 0.000000 1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v -1.072653 -7.081628 1.402008
+vn 0.000000 1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v -1.072653 -7.081628 1.340892
+vn 0.000000 1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v -1.638682 -7.081628 1.340893
+vn 0.000000 1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.415133 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.057919 0.872690 0.000000
+v -1.362414 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt -0.003269 0.865041 0.000000
+v -1.362414 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt -0.000314 0.634507 0.000000
+v -1.415133 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.060875 0.642155 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.204260 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v -1.151541 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v -1.151541 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v -1.204260 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v -1.151541 -7.151839 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.151541 -7.081628 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.151541 -7.081628 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.151541 -7.151839 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.573287 -7.151839 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.573287 -7.081628 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.573287 -7.081628 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.573287 -7.151839 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.083590 -7.151839 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.083590 -7.081628 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.083590 -7.081628 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.083590 -7.151839 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.517561 -7.151839 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.517561 -7.081628 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.517561 -7.081628 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.517561 -7.151839 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.517561 -7.151839 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.517561 -7.081628 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.083590 -7.081628 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.083590 -7.151839 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.083590 -7.151839 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.083590 -7.081628 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.517561 -7.081628 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.517561 -7.151839 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v 1.517561 -7.081628 1.402008
+vn 0.000000 1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v 2.083590 -7.081628 1.402008
+vn 0.000000 1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v 2.083590 -7.081628 1.340892
+vn 0.000000 1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v 1.517561 -7.081628 1.340893
+vn 0.000000 1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v 1.582957 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.635676 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.635676 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.582957 -7.081628 1.201047
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v 1.635676 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.983775 0.341888 0.000000
+v 1.688395 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.881347 0.342665 0.000000
+v 1.688395 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.881011 0.023548 0.000000
+v 1.635676 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.983439 0.022771 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.688395 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.493340 0.383044 0.000000
+v 1.741110 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.352631 0.375438 0.000000
+v 1.741110 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.346754 0.022725 0.000000
+v 1.688395 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.487463 0.030331 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.741110 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.057919 0.872690 0.000000
+v 1.793829 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt -0.003269 0.865041 0.000000
+v 1.793829 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt -0.000314 0.634507 0.000000
+v 1.741110 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.060875 0.642155 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.793829 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.682921 0.350577 0.000000
+v 1.846548 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.564458 0.350577 0.000000
+v 1.846548 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.564457 0.024422 0.000000
+v 1.793829 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.682920 0.024422 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.951983 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v 2.004702 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v 2.004702 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v 1.951983 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v 2.004702 -7.151839 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.004702 -7.081628 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.004702 -7.081628 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.004702 -7.151839 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.582957 -7.151839 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.582957 -7.081628 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.582957 -7.081628 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.582957 -7.151839 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.749442 -7.151839 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.749442 -7.081628 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.749442 -7.081628 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.749442 -7.151839 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.183414 -7.151839 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.183414 -7.081628 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.183414 -7.081628 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.183414 -7.151839 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.183414 -7.151839 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.183414 -7.081628 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.749442 -7.081628 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.749442 -7.151839 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.749442 -7.151839 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.749442 -7.081628 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.183414 -7.081628 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.183414 -7.151839 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v 4.183414 -7.081628 1.402008
+vn 0.000000 1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v 4.749442 -7.081628 1.402008
+vn 0.000000 1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v 4.749442 -7.081628 1.340892
+vn 0.000000 1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v 4.183414 -7.081628 1.340893
+vn 0.000000 1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.406962 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.057919 0.872690 0.000000
+v 4.459682 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt -0.003269 0.865041 0.000000
+v 4.459682 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt -0.000314 0.634507 0.000000
+v 4.406962 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.060875 0.642155 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.617835 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v 4.670554 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v 4.670554 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v 4.617835 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v 4.670554 -7.151839 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -7.081628 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -7.081628 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -7.151839 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.248809 -7.151839 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -7.081628 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -7.081628 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -7.151839 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.749442 -2.379366 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.749442 -2.309156 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.749442 -2.309156 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.749442 -2.379366 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.183414 -2.379366 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.183414 -2.309156 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.183414 -2.309156 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.183414 -2.379366 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.183414 -2.379366 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.183414 -2.309156 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.749442 -2.309156 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.749442 -2.379366 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.749442 -2.379366 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.749442 -2.309156 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.183414 -2.309156 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.183414 -2.379366 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v 4.183414 -2.309156 1.402008
+vn 0.000000 1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v 4.749442 -2.309156 1.402008
+vn 0.000000 1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v 4.749442 -2.309156 1.340892
+vn 0.000000 1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v 4.183414 -2.309156 1.340893
+vn 0.000000 1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.406962 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.057919 0.872690 0.000000
+v 4.459682 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt -0.003269 0.865041 0.000000
+v 4.459682 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt -0.000314 0.634507 0.000000
+v 4.406962 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.060875 0.642155 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.617835 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v 4.670554 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v 4.670554 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v 4.617835 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v 4.670554 -2.379366 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -2.309156 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -2.309156 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -2.379366 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.248809 -2.379366 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -2.309156 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -2.309156 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -2.379366 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.384798 -2.983796 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.384798 -3.054006 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.384798 -3.054006 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.384798 -2.983796 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.818769 -2.983796 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.818769 -3.054006 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.818769 -3.054006 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.818769 -2.983796 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.818769 -2.983796 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.818769 -3.054006 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.384798 -3.054006 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.384798 -2.983796 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.384798 -2.983796 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.384798 -3.054006 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.818769 -3.054006 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.818769 -2.983796 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v -3.818769 -3.054006 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v -4.384798 -3.054006 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v -4.384798 -3.054006 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v -3.818769 -3.054006 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.042318 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.057919 0.872690 0.000000
+v -4.095037 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt -0.003269 0.865041 0.000000
+v -4.095037 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt -0.000314 0.634507 0.000000
+v -4.042318 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.060875 0.642155 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.253191 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v -4.305910 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v -4.305910 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v -4.253191 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v -4.305910 -2.983796 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.305910 -3.054006 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.305910 -3.054006 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.305910 -2.983796 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.884165 -2.983796 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.884165 -3.054006 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.884165 -3.054006 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.884165 -2.983796 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.884165 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.884165 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.305910 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.305910 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.884165 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.884165 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.305910 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.305910 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.823469 -2.379366 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.823469 -2.309156 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.823469 -2.309156 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.823469 -2.379366 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.389498 -2.379366 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.389498 -2.309156 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.389498 -2.309156 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.389498 -2.379366 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.389498 -2.379366 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.389498 -2.309156 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.823469 -2.309156 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.823469 -2.379366 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.823469 -2.379366 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.823469 -2.309156 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.389498 -2.309156 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.389498 -2.379366 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v -4.389498 -2.309156 1.402008
+vn 0.000000 1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v -3.823469 -2.309156 1.402008
+vn 0.000000 1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v -3.823469 -2.309156 1.340892
+vn 0.000000 1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v -4.389498 -2.309156 1.340893
+vn 0.000000 1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v -4.324102 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.271383 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.271383 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.324102 -2.309156 1.201047
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v -4.271383 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.987156 0.369347 0.000000
+v -4.218664 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.866560 0.380085 0.000000
+v -4.218664 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.869835 0.013251 0.000000
+v -4.271383 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.990432 0.002513 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.218664 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.988972 0.335030 0.000000
+v -4.165949 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.890908 0.342649 0.000000
+v -4.165949 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.887622 0.037105 0.000000
+v -4.218664 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.985686 0.029486 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.165949 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.057919 0.872690 0.000000
+v -4.113230 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt -0.003269 0.865041 0.000000
+v -4.113230 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt -0.000314 0.634507 0.000000
+v -4.165949 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.060875 0.642155 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.113230 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.985800 0.367593 0.000000
+v -4.060511 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.893639 0.367593 0.000000
+v -4.060511 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.891341 0.019504 0.000000
+v -4.113230 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.983503 0.019504 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.060511 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.093398 0.357371 0.000000
+v -4.007792 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt -0.041278 0.364367 0.000000
+v -4.007792 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt -0.039250 0.003454 0.000000
+v -4.060511 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.095426 -0.003543 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v -4.007792 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.955076 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.955076 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.007792 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v -3.955076 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v -3.902357 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v -3.902357 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v -3.955076 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v -3.902357 -2.379366 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.902357 -2.309156 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.902357 -2.309156 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.902357 -2.379366 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.324102 -2.379366 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.324102 -2.309156 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.324102 -2.309156 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.324102 -2.379366 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.324102 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.324102 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.902357 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.902357 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.902357 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.902357 -2.379366 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.324102 -2.379366 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.324102 -2.309156 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.073323 -2.379366 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.073323 -2.309156 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.073323 -2.309156 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.073323 -2.379366 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.639351 -2.379366 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.639351 -2.309156 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.639351 -2.309156 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.639351 -2.379366 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.639351 -2.379366 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.639351 -2.309156 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.073323 -2.309156 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.073323 -2.379366 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.073323 -2.379366 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.073323 -2.309156 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.639351 -2.309156 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.639351 -2.379366 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v -1.639351 -2.309156 1.402008
+vn 0.000000 1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v -1.073323 -2.309156 1.402008
+vn 0.000000 1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v -1.073323 -2.309156 1.340892
+vn 0.000000 1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v -1.639351 -2.309156 1.340893
+vn 0.000000 1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.415802 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.057919 0.872690 0.000000
+v -1.363083 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt -0.003269 0.865041 0.000000
+v -1.363083 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt -0.000314 0.634507 0.000000
+v -1.415802 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.060875 0.642155 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.204930 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v -1.152211 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v -1.152211 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v -1.204930 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v -1.152211 -2.379366 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.152211 -2.309156 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.152211 -2.309156 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.152211 -2.379366 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.573956 -2.379366 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.573956 -2.309156 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.573956 -2.309156 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.573956 -2.379366 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.152211 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.152211 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.573956 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.573956 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.152211 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.152211 -2.379366 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.573956 -2.379366 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.573956 -2.309156 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.082560 -2.379366 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.082560 -2.309156 1.340892
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.082560 -2.309156 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.082560 -2.379366 1.402008
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.516531 -2.379366 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.516531 -2.309156 1.402008
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.516531 -2.309156 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.516531 -2.379366 1.340893
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.516531 -2.379366 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.516531 -2.309156 1.340893
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.082560 -2.309156 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.082560 -2.379366 1.340892
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.082560 -2.379366 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.082560 -2.309156 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.516531 -2.309156 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.516531 -2.379366 1.402008
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v 1.516531 -2.309156 1.402008
+vn 0.000000 1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v 2.082560 -2.309156 1.402008
+vn 0.000000 1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v 2.082560 -2.309156 1.340892
+vn 0.000000 1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v 1.516531 -2.309156 1.340893
+vn 0.000000 1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v 1.581927 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.634646 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.634646 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.581927 -2.309156 1.201047
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v 1.634646 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.895746 0.347823 0.000000
+v 1.687365 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.758008 0.348899 0.000000
+v 1.687365 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.764840 0.014207 0.000000
+v 1.634646 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.902577 0.013131 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.687365 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.789569 0.359760 0.000000
+v 1.740080 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.671191 0.359760 0.000000
+v 1.740080 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.671192 0.034609 0.000000
+v 1.687365 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.789570 0.034609 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.740080 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.057919 0.872690 0.000000
+v 1.792799 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt -0.003269 0.865041 0.000000
+v 1.792799 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt -0.000314 0.634507 0.000000
+v 1.740080 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.060875 0.642155 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.792799 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.277624 0.364670 0.000000
+v 1.845518 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.161278 0.363998 0.000000
+v 1.845518 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.161277 0.030931 0.000000
+v 1.792799 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.277623 0.031604 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.845518 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.090554 0.358346 0.000000
+v 1.898238 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt -0.012469 0.357616 0.000000
+v 1.898238 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt -0.012469 0.011003 0.000000
+v 1.845518 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.090555 0.011734 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v 1.898238 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.950953 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.950953 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.898238 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v 1.950953 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v 2.003672 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v 2.003672 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v 1.950953 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v 2.003672 -2.379366 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.003672 -2.309156 1.201046
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.003672 -2.309156 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.003672 -2.379366 1.262162
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.581927 -2.379366 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.581927 -2.309156 1.262162
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.581927 -2.309156 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.581927 -2.379366 1.201047
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.174451 -7.738350 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.174451 -7.808561 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.174451 -7.808561 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.174451 -7.738350 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.740479 -7.738350 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.740479 -7.808561 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.740479 -7.808561 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.740479 -7.738350 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.740479 -7.738350 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.740479 -7.808561 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.174451 -7.808561 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.174451 -7.738350 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.174451 -7.738350 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.174451 -7.808561 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.740479 -7.808561 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.740479 -7.738350 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v 4.740479 -7.808561 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v 4.174451 -7.808561 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v 4.174451 -7.808561 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v 4.740479 -7.808561 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v 4.675084 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.622365 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.622365 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.622365 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.569646 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.569646 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.622365 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.569646 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.516931 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.516931 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.569646 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v 4.516931 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.057919 0.872690 0.000000
+v 4.464211 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt -0.003269 0.865041 0.000000
+v 4.464211 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt -0.000314 0.634507 0.000000
+v 4.516931 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.060875 0.642155 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v 4.464211 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.411492 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.411492 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.464211 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.411492 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.358773 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.358773 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.411492 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.358773 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.306058 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.306058 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.358773 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v 4.306058 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v 4.253339 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v 4.253339 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v 4.306058 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v 4.253339 -7.738350 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -7.808561 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -7.808561 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -7.738350 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.675084 -7.738350 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -7.808561 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -7.808561 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -7.738350 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.174451 -2.983796 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.174451 -3.054006 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.174451 -3.054006 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.174451 -2.983796 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.740479 -2.983796 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.740479 -3.054006 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.740479 -3.054006 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.740479 -2.983796 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.740479 -2.983796 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.740479 -3.054006 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.174451 -3.054006 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.174451 -2.983796 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.174451 -2.983796 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.174451 -3.054006 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.740479 -3.054006 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.740479 -2.983796 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v 4.740479 -3.054006 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v 4.174451 -3.054006 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v 4.174451 -3.054006 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v 4.740479 -3.054006 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.516931 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.057919 0.872690 0.000000
+v 4.464211 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt -0.003269 0.865041 0.000000
+v 4.464211 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt -0.000314 0.634507 0.000000
+v 4.516931 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.060875 0.642155 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.306058 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v 4.253339 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v 4.253339 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v 4.306058 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v 4.253339 -2.983796 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -3.054006 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -3.054006 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -2.983796 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.675084 -2.983796 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -3.054006 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -3.054006 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -2.983796 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.505520 -2.983796 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.505520 -3.054006 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.505520 -3.054006 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.505520 -2.983796 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.071549 -2.983796 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.071549 -3.054006 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.071549 -3.054006 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.071549 -2.983796 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.071549 -2.983796 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.071549 -3.054006 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.505520 -3.054006 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.505520 -2.983796 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.505520 -2.983796 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.505520 -3.054006 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.071549 -3.054006 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.071549 -2.983796 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v 2.071549 -3.054006 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v 1.505520 -3.054006 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v 1.505520 -3.054006 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v 2.071549 -3.054006 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.848000 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.057919 0.872690 0.000000
+v 1.795281 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt -0.003269 0.865041 0.000000
+v 1.795281 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt -0.000314 0.634507 0.000000
+v 1.848000 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.060875 0.642155 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.637127 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v 1.584408 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v 1.584408 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v 1.637127 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v 1.584408 -2.983796 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.584408 -3.054006 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.584408 -3.054006 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.584408 -2.983796 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.006154 -2.983796 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.006154 -3.054006 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.006154 -3.054006 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.006154 -2.983796 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.635212 -2.983796 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.635212 -3.054006 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.635212 -3.054006 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.635212 -2.983796 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.069184 -2.983796 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.069184 -3.054006 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.069184 -3.054006 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.069184 -2.983796 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.069184 -2.983796 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.069184 -3.054006 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.635212 -3.054006 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.635212 -2.983796 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.635212 -2.983796 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.635212 -3.054006 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.069184 -3.054006 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.069184 -2.983796 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v -1.069184 -3.054006 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v -1.635212 -3.054006 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v -1.635212 -3.054006 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v -1.069184 -3.054006 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v -1.134579 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.187298 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.187298 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.134579 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v -1.187298 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.993724 0.368140 0.000000
+v -1.240017 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.875110 0.373063 0.000000
+v -1.240017 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.873244 -0.004528 0.000000
+v -1.187298 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.991859 -0.009452 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.240017 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.994656 0.360692 0.000000
+v -1.292733 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.890790 0.359933 0.000000
+v -1.292733 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.889033 0.018019 0.000000
+v -1.240017 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.992899 0.018777 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.292733 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.069261 0.916230 0.000000
+v -1.345452 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt -0.005706 0.912995 0.000000
+v -1.345452 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt -0.008209 0.683532 0.000000
+v -1.292733 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.066758 0.686768 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.345452 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.899745 0.361696 0.000000
+v -1.398171 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.765437 0.358252 0.000000
+v -1.398171 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.770229 0.009330 0.000000
+v -1.345452 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.904538 0.012773 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.503605 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v -1.556324 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v -1.556324 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v -1.503605 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v -1.556324 -2.983796 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.556324 -3.054006 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.556324 -3.054006 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.556324 -2.983796 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.134579 -2.983796 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.134579 -3.054006 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.134579 -3.054006 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.134579 -2.983796 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.556324 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.556324 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.134579 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.134579 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.134579 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.134579 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.556324 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.556324 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.380323 -7.738350 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.380323 -7.808561 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.380323 -7.808561 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.380323 -7.738350 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.814296 -7.738350 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.814296 -7.808561 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.814296 -7.808561 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.814296 -7.738350 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.814296 -7.738350 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.814296 -7.808561 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.380323 -7.808561 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.380323 -7.738350 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.380323 -7.738350 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.380323 -7.808561 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.814296 -7.808561 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.814296 -7.738350 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v -3.814296 -7.808561 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v -4.380323 -7.808561 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v -4.380323 -7.808561 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v -3.814296 -7.808561 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.037846 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.057919 0.872690 0.000000
+v -4.090565 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt -0.003269 0.865041 0.000000
+v -4.090565 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt -0.000314 0.634507 0.000000
+v -4.037846 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.060875 0.642155 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.248718 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v -4.301437 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v -4.301437 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v -4.248718 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v -4.301437 -7.738350 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.301437 -7.808561 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.301437 -7.808561 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.301437 -7.738350 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.879692 -7.738350 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.879692 -7.808561 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.879692 -7.808561 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.879692 -7.738350 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.635478 -7.738350 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.635478 -7.808561 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.635478 -7.808561 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.635478 -7.738350 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.069449 -7.738350 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.069449 -7.808561 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.069449 -7.808561 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.069449 -7.738350 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.069449 -7.738350 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.069449 -7.808561 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.635478 -7.808561 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.635478 -7.738350 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.635478 -7.738350 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.635478 -7.808561 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.069449 -7.808561 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.069449 -7.738350 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v -1.069449 -7.808561 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v -1.635478 -7.808561 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v -1.635478 -7.808561 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v -1.069449 -7.808561 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.292998 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.057919 0.872690 0.000000
+v -1.345717 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt -0.003269 0.865041 0.000000
+v -1.345717 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt -0.000314 0.634507 0.000000
+v -1.292998 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.060875 0.642155 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.503870 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v -1.556590 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v -1.556590 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v -1.503870 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v -1.556590 -7.738350 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.556590 -7.808561 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.556590 -7.808561 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.556590 -7.738350 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.134844 -7.738350 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.134844 -7.808561 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.134844 -7.808561 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.134844 -7.738350 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.511370 -7.738350 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.511370 -7.808561 1.350635
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.511370 -7.808561 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.511370 -7.738350 1.411750
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.077399 -7.738350 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.077399 -7.808561 1.411750
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.077399 -7.808561 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.077399 -7.738350 1.350635
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.077399 -7.738350 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.077399 -7.808561 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.511370 -7.808561 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.511370 -7.738350 1.350635
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.511370 -7.738350 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.511370 -7.808561 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.077399 -7.808561 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.077399 -7.738350 1.411750
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v 2.077399 -7.808561 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 1.052464 0.000000
+v 1.511370 -7.808561 1.411750
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 1.052464 0.000000
+v 1.511370 -7.808561 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 0.176553 0.603453 0.000000
+v 2.077399 -7.808561 1.350635
+vn 0.000000 -1.000000 0.000000
+vt 1.034086 0.603453 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v 2.012003 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.959284 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.959284 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.012003 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_1
+v 1.959284 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.894477 0.370989 0.000000
+v 1.906565 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.765038 0.370989 0.000000
+v 1.906565 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.765910 0.035986 0.000000
+v 1.959284 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.895348 0.035986 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.906565 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.892691 0.343399 0.000000
+v 1.853850 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.766199 0.347799 0.000000
+v 1.853850 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.767475 0.016247 0.000000
+v 1.906565 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.893967 0.011848 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.853850 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.057919 0.872690 0.000000
+v 1.801131 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt -0.003269 0.865041 0.000000
+v 1.801131 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt -0.000314 0.634507 0.000000
+v 1.853850 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.060875 0.642155 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.801131 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.089926 0.352071 0.000000
+v 1.748412 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt -0.000434 0.351873 0.000000
+v 1.748412 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt -0.000434 0.011557 0.000000
+v 1.801131 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.089926 0.011755 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.642977 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.191297 1.054731 0.000000
+v 1.590258 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.062637 1.059092 0.000000
+v 1.590258 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.067695 0.563608 0.000000
+v 1.642977 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.196355 0.559247 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v 1.590258 -7.738350 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.590258 -7.808561 1.210789
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.590258 -7.808561 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.590258 -7.738350 1.271904
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.012003 -7.738350 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.012003 -7.808561 1.271904
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.012003 -7.808561 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.012003 -7.738350 1.210789
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.584408 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.584408 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.006154 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.006154 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.006154 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.006154 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.584408 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.584408 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.006154 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.006154 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.953434 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.900715 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.848000 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.795281 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.742562 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.689843 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.637127 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.584408 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.584408 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.006154 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.006154 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.584408 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.584408 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.637127 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.689843 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.742562 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.795281 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.848000 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.900715 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.953434 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.003672 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.003672 -2.379366 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.581927 -2.379366 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.581927 -2.309156 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.003672 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.003672 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.581927 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.581927 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.003672 -2.379366 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.581927 -2.379366 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.581927 -2.309156 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.634646 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.687365 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.740080 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.792799 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.845518 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.898238 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.950953 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.003672 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.003672 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.003672 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.950953 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.898238 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.845518 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.792799 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.740080 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.687365 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.634646 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.581927 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.581927 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.253339 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.675084 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.253339 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.306058 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.358773 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.411492 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.464211 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.516931 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.569646 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.622365 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -3.054006 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -2.983796 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.675084 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.622365 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.569646 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.516931 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.464211 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.411492 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.358773 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.306058 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -3.054006 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -2.983796 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.248809 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.670554 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -2.379366 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -2.379366 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -2.309156 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.670554 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.617835 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.565120 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.512401 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.459682 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.406962 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.354247 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.301528 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -2.309156 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -2.379366 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.248809 -2.379366 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -2.309156 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.301528 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.354247 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.406962 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.459682 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.512401 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.565120 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.617835 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -2.309156 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -2.379366 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.675084 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -7.738350 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -7.738350 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.253339 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.253339 -7.738350 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.306058 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.358773 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.411492 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.464211 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.516931 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.569646 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.622365 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -7.738350 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.675084 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.622365 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.569646 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.516931 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.464211 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.411492 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.358773 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.306058 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.253339 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.248809 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.670554 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -7.151839 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -7.151839 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -7.081628 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.248809 -7.151839 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -7.081628 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.301528 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.354247 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.406962 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.459682 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.512401 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.565120 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.617835 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -7.151839 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.670554 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.670554 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.617835 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.565120 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.512401 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.459682 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.406962 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.354247 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.301528 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.012003 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.012003 -7.738350 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.590258 -7.738350 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.590258 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.590258 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.590258 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.012003 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.012003 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.012003 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.012003 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.959284 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.906565 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.853850 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.801131 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.748412 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.695692 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.642977 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.590258 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.590258 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.590258 -7.738350 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.590258 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.642977 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.695692 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.748412 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.801131 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.853850 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.906565 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.959284 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.012003 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.012003 -7.738350 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.582957 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.582957 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.004702 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.004702 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.004702 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.004702 -7.151839 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.582957 -7.151839 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.582957 -7.081628 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.582957 -7.151839 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.582957 -7.081628 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.635676 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.688395 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.741110 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.793829 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.846548 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.899268 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 1.951983 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.004702 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 2.004702 -7.151839 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 2.004702 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 2.004702 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.951983 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.899268 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.846548 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.793829 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.741110 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.688395 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.635676 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.582957 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 1.582957 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.134844 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.134844 -7.738350 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.556590 -7.738350 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.556590 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.556590 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.556590 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.134844 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.134844 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.134844 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.134844 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.187563 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.240283 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.292998 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.345717 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.398436 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.451155 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.503870 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.556590 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.556590 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.573287 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.573287 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.151541 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.151541 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.151541 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.151541 -7.151839 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.573287 -7.151839 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.573287 -7.081628 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.319675 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.319675 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.897930 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.897930 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.897930 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.897930 -7.151839 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.319675 -7.151839 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.319675 -7.081628 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.879692 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.879692 -7.738350 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.301437 -7.738350 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.301437 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.301437 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.301437 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.879692 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.879692 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.879692 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.879692 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.932411 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.985128 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.037846 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.090565 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.143284 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.196001 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.248718 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.301437 -7.808561 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.301437 -7.738350 1.210789
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.301437 -7.738350 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.301437 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.248718 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.196001 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.143284 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.090565 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.037846 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.985128 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.932411 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.879692 -7.808561 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.879692 -7.738350 1.271904
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.573287 -7.151839 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.573287 -7.081628 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.520567 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.467848 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.415133 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.362414 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.309695 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.256976 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.204260 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.151541 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -1.151541 -7.151839 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.151541 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.151541 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.204260 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.256976 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.309695 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.362414 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.415133 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.467848 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.520567 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.573287 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -1.573287 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.319675 -7.151839 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.319675 -7.081628 1.201047
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.266956 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.214237 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.161522 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.108803 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.056084 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -4.003365 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.950649 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.897930 -7.081628 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -3.897930 -7.151839 1.201046
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.897930 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.897930 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -3.950649 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.003365 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.056084 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.108803 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.161522 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.214237 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.266956 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.319675 -7.081628 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.319675 -7.151839 1.262162
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -11/-11/-11 -10/-10/-10 -9/-9/-9 -8/-8/-8 -7/-7/-7 -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.617835 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.617835 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.459682 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.459682 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.406962 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.406962 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -7.081628 1.201047
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.415802 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.415802 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.573956 -2.309156 1.201047
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.573956 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.204930 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.204930 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.363083 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.363083 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.292998 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.292998 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.134844 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.134844 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.503870 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.503870 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.345717 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.345717 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.848000 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.848000 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.006154 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 2.006154 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.637127 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.637127 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.795281 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.795281 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.037846 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.037846 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.879692 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.879692 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.248718 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.248718 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.090565 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.090565 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.042318 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.042318 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.884165 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.884165 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.253191 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.253191 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.095037 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.095037 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.406962 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.406962 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -2.309156 1.201047
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.248809 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.617835 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.617835 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.459682 -2.309156 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.459682 -2.309156 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.415133 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.415133 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.573287 -7.081628 1.201047
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.573287 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.204260 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.204260 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.362414 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.362414 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -1.398171 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.503605 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.503605 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -1.398171 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.306058 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.306058 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.464211 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.464211 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 4.516931 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.516931 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -3.054006 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 4.675084 -3.054006 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -3.950649 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -3.950649 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.108803 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.108803 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -4.161522 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.161522 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.319675 -7.081628 1.201047
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.319675 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.846548 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.951983 -7.081628 1.262162
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.951983 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.846548 -7.081628 1.201046
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.642977 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.642977 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.748412 -7.808561 1.210789
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 1.748412 -7.808561 1.271904
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+g curb
+v 6.706108 1.900000 0.000000
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 6.706108 10.200000 0.000000
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 6.706108 10.200000 0.200000
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 6.706108 1.900000 0.200000
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -6.249049 1.900000 0.200000
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 6.706108 1.900000 0.200000
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 6.706108 10.200000 0.200000
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -6.249049 10.200000 0.200000
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -6.249049 10.200000 0.200000
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 6.706108 10.200000 0.200000
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 6.706108 10.200000 0.000000
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -6.249049 10.200000 0.000000
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -6.249049 1.900000 0.000000
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 6.706108 1.900000 0.000000
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 6.706108 1.900000 0.200000
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -6.249049 1.900000 0.200000
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -6.249049 1.900000 0.200000
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -6.249049 10.200000 0.200000
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -6.249049 10.200000 0.000000
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -6.249049 1.900000 0.000000
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+g sign
+usemtl 49_4
+v -5.976064 2.312747 4.762428
+vn 0.000000 -1.000000 0.000000
+vt 0.077655 0.969763 0.000000
+v -5.976064 2.312747 3.787100
+vn 0.000000 -1.000000 0.000000
+vt 0.077048 0.748672 0.000000
+v 6.384918 2.312749 3.787100
+vn 0.000001 -1.000000 0.000000
+vt 0.916119 0.764068 0.000000
+v 6.384918 2.312749 4.762428
+vn 0.000000 -1.000000 0.000000
+vt 0.916727 0.985159 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+g mart
+usemtl 0_2
+v 6.384918 2.312749 0.175000
+vn 0.000002 -1.000000 0.000000
+vt 27.733219 1.260617 0.000000
+v 6.384918 2.312749 3.787100
+vn 0.000001 -1.000000 0.000000
+vt 28.118858 -6.837924 0.000000
+v 5.181950 2.312747 3.787100
+vn 0.000001 -1.000000 0.000000
+vt 25.421732 -6.966355 0.000000
+v 5.181950 2.312747 0.175000
+vn 0.000001 -1.000000 0.000000
+vt 25.036093 1.132185 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.976064 2.312747 3.787102
+vn 0.000000 -1.000000 0.000000
+vt -0.166020 -10.534680 0.000000
+v -5.976064 2.312747 0.175000
+vn 0.000000 -1.000000 0.000000
+vt -0.166016 -0.059065 0.000000
+v -4.784042 2.312747 0.175000
+vn 0.000000 -0.999996 0.002962
+vt 3.291019 -0.059065 0.000000
+v -4.784042 2.312747 3.787102
+vn 0.000000 -0.999895 -0.014514
+vt 3.291016 -10.534680 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.976064 10.190458 0.175000
+vn 0.000000 1.000000 0.000000
+vt 30.560835 0.066307 0.000000
+v -5.976064 10.190458 4.762428
+vn 0.000000 1.000000 0.000000
+vt 30.560843 11.459993 0.000000
+v 6.384918 10.190460 4.762428
+vn 0.000000 1.000000 0.000000
+vt -0.139819 11.459994 0.000000
+v 6.384918 10.190460 0.175000
+vn 0.000000 1.000000 0.000000
+vt -0.139827 0.066308 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 6.384918 10.190460 0.175000
+vn 1.000000 0.000000 0.000000
+vt -0.309169 0.038955 0.000000
+v 6.384918 10.190460 4.762428
+vn 1.000000 0.000000 0.000000
+vt -0.309166 -11.354722 0.000000
+v 6.384918 2.312749 4.762428
+vn 1.000000 0.000000 0.000000
+vt 19.256529 -11.354722 0.000000
+v 6.384918 2.312749 0.175000
+vn 1.000000 0.000000 0.000000
+vt 19.256525 0.038956 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.976064 2.312747 0.175000
+vn -1.000000 0.000000 0.000000
+vt 19.256529 0.038956 0.000000
+v -5.976064 2.312747 4.762428
+vn -1.000000 0.000000 0.000000
+vt 19.256533 -11.354722 0.000000
+v -5.976064 10.190458 4.762428
+vn -1.000000 0.000000 0.000000
+vt -0.309161 -11.354722 0.000000
+v -5.976064 10.190458 0.175000
+vn -1.000000 0.000000 0.000000
+vt -0.309165 0.038955 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+g glass
+usemtl 0_6
+v 1.406014 2.294974 3.175000
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 1.000000 0.000000
+v 0.393514 2.294974 3.175000
+vn 0.000000 -1.000000 0.000000
+vt 1.000000 1.000000 0.000000
+v 0.393514 2.294974 0.175000
+vn 0.000000 -1.000000 0.000000
+vt 1.000000 0.000000 0.000000
+v 1.406014 2.294974 0.175000
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 0.393514 2.294974 3.175000
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 1.000000 0.000000
+v -0.618985 2.294974 3.175000
+vn 0.000000 -0.999983 -0.005776
+vt 1.000000 1.000000 0.000000
+v -0.618985 2.294974 0.175000
+vn 0.000000 -0.999996 0.002962
+vt 1.000000 0.000000 0.000000
+v 0.393514 2.294974 0.175000
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 1.406014 2.294974 3.175000
+vn 0.000000 -1.000000 0.000000
+vt 0.970093 0.311469 0.000000
+v 1.406014 2.294974 3.787102
+vn 0.000000 -1.000000 0.000000
+vt 0.502225 0.311469 0.000000
+v -0.618985 2.294974 3.787102
+vn 0.000000 -0.999895 -0.014514
+vt 0.034357 0.311469 0.000000
+v -0.618985 2.294974 3.175000
+vn 0.000000 -0.999983 -0.005776
+vt 0.032185 0.007474 0.000000
+v 1.406014 2.294974 3.175000
+vn 0.000000 -1.000000 0.000000
+vt 0.967921 0.007474 0.000000
+f -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_7
+v -0.618985 2.294974 3.175000
+vn 0.000000 -0.999983 -0.005776
+vt 0.918247 1.001884 0.000000
+v -4.784042 2.312747 3.175000
+vn 0.000000 -0.999933 -0.011552
+vt 0.039452 1.001884 0.000000
+v -4.784042 2.294974 0.175000
+vn 0.000000 -0.999996 0.002962
+vt 0.037666 -0.001884 0.000000
+v -0.618985 2.294974 0.175000
+vn 0.000000 -0.999996 0.002962
+vt 0.916461 -0.001884 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -0.618985 2.294974 3.787102
+vn 0.000000 -0.999895 -0.014514
+vt 0.937962 0.710100 0.000000
+v -4.784042 2.294974 3.787102
+vn 0.000000 -0.999895 -0.014514
+vt 0.023903 0.727678 0.000000
+v -4.784042 2.312747 3.175000
+vn 0.000000 -0.999933 -0.011552
+vt 0.025536 0.149595 0.000000
+v -0.618985 2.294974 3.175000
+vn 0.000000 -0.999983 -0.005776
+vt 0.939595 0.132017 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.181950 2.294974 3.787102
+vn 0.000001 -1.000000 0.000000
+vt 0.937962 0.710100 0.000000
+v 1.406014 2.294974 3.787102
+vn 0.000000 -1.000000 0.000000
+vt 0.023903 0.727678 0.000000
+v 1.406014 2.294974 3.175000
+vn 0.000000 -1.000000 0.000000
+vt 0.025536 0.149595 0.000000
+v 5.181950 2.294974 3.175000
+vn 0.000000 -1.000000 0.000000
+vt 0.939595 0.132017 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.181950 2.294974 3.175000
+vn 0.000000 -1.000000 0.000000
+vt 0.918247 1.001884 0.000000
+v 1.406014 2.294974 3.175000
+vn 0.000000 -1.000000 0.000000
+vt 0.039452 1.001884 0.000000
+v 1.406014 2.294974 0.175000
+vn 0.000000 -1.000000 0.000000
+vt 0.037666 -0.001884 0.000000
+v 5.181950 2.294974 0.175000
+vn 0.000001 -1.000000 0.000000
+vt 0.916461 -0.001884 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+g ground
+usemtl 0_8
+v -13.000000 -18.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vt 9.840436 -15.110263 0.000000
+v 13.000000 -18.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vt 48.972878 18.570261 0.000000
+v 13.000000 12.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vt 10.110681 63.723015 0.000000
+v -13.000000 12.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vt -29.021761 30.042490 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+g fsign1_1
+
+usemtl 0_5
+v -11.437394 -15.391608 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.498142 0.100215 0.000000
+v -11.437394 -15.653270 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.453128 0.100215 0.000000
+v -11.519713 -17.338390 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.163234 0.100215 0.000000
+v -11.519713 -17.338390 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.163234 0.100215 0.000000
+v -11.519713 -13.685737 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.791605 0.100215 0.000000
+f -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -11.094885 -13.685737 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.791605 0.100215 0.000000
+v -11.175734 -15.391608 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.498142 0.100215 0.000000
+v -11.437394 -15.391608 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.498142 0.100215 0.000000
+v -11.519713 -13.685737 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.791605 0.100215 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v -11.519713 -13.685737 7.818437
+vn 0.000000 0.000000 1.000000
+vt -0.000648 1.006977 0.000000
+v -11.094885 -13.685737 7.818437
+vn 0.000000 0.000000 1.000000
+vt -0.000648 1.006977 0.000000
+l -2/-2/-2 -1/-1/-1
+usemtl 0_5
+v -11.094885 -13.685737 5.258250
+vn 0.000000 0.000000 1.000000
+vt 0.791605 0.100215 0.000000
+v -11.519713 -13.685737 5.258250
+vn 0.000000 0.000000 1.000000
+vt 0.791605 0.100215 0.000000
+l -2/-2/-2 -1/-1/-1
+v -11.519713 -13.685737 5.258250
+vn 0.000000 0.000000 1.000000
+vt 0.791605 0.100215 0.000000
+v -11.519713 -13.685737 5.258250
+vn 0.000000 0.000000 1.000000
+vt 0.791605 0.100215 0.000000
+l -2/-2/-2 -1/-1/-1
+v -11.519713 -17.338390 5.258250
+vn 0.000000 0.000000 1.000000
+vt 0.163234 0.100215 0.000000
+v -11.094885 -17.338390 5.258250
+vn 0.000000 0.000000 1.000000
+vt 0.163234 0.100215 0.000000
+l -2/-2/-2 -1/-1/-1
+v -11.519713 -17.338390 5.258250
+vn 0.000000 0.000000 1.000000
+vt 0.163234 0.100215 0.000000
+v -11.519713 -17.338390 5.258250
+vn 0.000000 0.000000 1.000000
+vt 0.163234 0.100215 0.000000
+l -2/-2/-2 -1/-1/-1
+usemtl 0
+v -11.094885 -13.685737 7.818437
+vn 1.000000 0.000000 0.000000
+vt 0.999559 1.018294 0.000000
+v -11.094885 -17.338390 7.818437
+vn 1.000000 0.000000 0.000000
+vt -0.002998 1.018294 0.000000
+v -11.094885 -17.338390 5.258250
+vn 1.000000 0.000000 0.000000
+vt -0.001285 0.003658 0.000000
+v -11.094885 -13.685737 5.258250
+vn 1.000000 0.000000 0.000000
+vt 1.001273 0.003658 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -11.519713 -17.338390 7.818437
+vn -1.000000 0.000000 0.000000
+vt 0.992244 1.006977 0.000000
+v -11.519713 -13.685737 7.818437
+vn -1.000000 0.000000 0.000000
+vt -0.000648 1.006977 0.000000
+v -11.519713 -13.685737 5.258250
+vn -1.000000 0.000000 0.000000
+vt -0.000648 0.001120 0.000000
+v -11.519713 -17.338390 5.258250
+vn -1.000000 0.000000 0.000000
+vt 0.992244 0.001120 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -11.094885 -17.338390 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.163234 0.100215 0.000000
+v -11.519713 -17.338390 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.163234 0.100215 0.000000
+v -11.437394 -15.653270 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.453128 0.100215 0.000000
+v -11.175734 -15.653270 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.453128 0.100215 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_5
+v -11.094885 -13.685737 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.791605 0.100215 0.000000
+v -11.094885 -13.685737 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.791605 0.100215 0.000000
+v -11.094885 -17.338390 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.163234 0.100215 0.000000
+v -11.094885 -17.338390 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.163234 0.100215 0.000000
+v -11.175734 -15.653270 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.453128 0.100215 0.000000
+v -11.175734 -15.391608 5.258250
+vn 0.000000 0.000000 -1.000000
+vt 0.498142 0.100215 0.000000
+f -6/-6/-6 -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0
+v -11.175734 -15.653270 0.000000
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -11.175734 -15.653270 5.258250
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -11.437394 -15.653270 5.258250
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -11.437394 -15.653270 0.000000
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -11.437394 -15.391608 0.000000
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -11.437394 -15.391608 5.258250
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -11.175734 -15.391608 5.258250
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -11.175734 -15.391608 0.000000
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -11.437394 -15.653270 0.000000
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -11.437394 -15.653270 5.258250
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -11.437394 -15.391608 5.258250
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -11.437394 -15.391608 0.000000
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -11.175734 -15.391608 0.000000
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -11.175734 -15.391608 5.258250
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -11.175734 -15.653270 5.258250
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -11.175734 -15.653270 0.000000
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_4
+v -11.094885 -13.685737 7.818437
+vn 0.000000 0.000000 1.000000
+vt -0.000648 1.006977 0.000000
+v -11.519713 -13.685737 7.818437
+vn 0.000000 0.000000 1.000000
+vt -0.000648 1.006977 0.000000
+v -11.519713 -17.338390 7.818437
+vn 0.000000 0.000000 1.000000
+vt 0.992244 1.006977 0.000000
+v -11.094885 -17.338390 7.818437
+vn 0.000000 0.000000 1.000000
+vt 0.992244 1.006977 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -11.094885 -17.338390 7.818437
+vn 0.000000 0.000000 1.000000
+vt 0.992244 1.006977 0.000000
+v -11.519713 -17.338390 7.818437
+vn 0.000000 0.000000 1.000000
+vt 0.992244 1.006977 0.000000
+l -2/-2/-2 -1/-1/-1
+v -11.519713 -13.685737 7.818437
+vn 0.000000 1.000000 0.000000
+vt -0.000648 1.006977 0.000000
+v -11.094885 -13.685737 7.818437
+vn 0.000000 1.000000 0.000000
+vt -0.000648 1.006977 0.000000
+v -11.094885 -13.685737 5.258250
+vn 0.000000 1.000000 0.000000
+vt -0.000648 0.001120 0.000000
+v -11.519713 -13.685737 5.258250
+vn 0.000000 1.000000 0.000000
+vt -0.000648 0.001120 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -11.519713 -17.338390 7.818437
+vn 0.000000 -1.000000 0.000000
+vt 0.992244 1.006977 0.000000
+v -11.519713 -17.338390 5.258250
+vn 0.000000 -1.000000 0.000000
+vt 0.992244 0.001120 0.000000
+v -11.094885 -17.338390 5.258250
+vn 0.000000 -1.000000 0.000000
+vt 0.992244 0.001120 0.000000
+v -11.094885 -17.338390 7.818437
+vn 0.000000 -1.000000 0.000000
+vt 0.992244 1.006977 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+g roof_1
+
+usemtl 49
+v 6.384918 10.190460 5.436793
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 6.384918 10.190460 4.762428
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.976064 10.190458 4.762428
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.976064 10.190458 5.436793
+vn 0.000000 1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.976058 -10.426369 5.436793
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.976058 -10.426369 4.762428
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 6.384923 -10.426366 4.762428
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 6.384923 -10.426366 5.436793
+vn 0.000000 -1.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v -5.976064 10.190458 5.436793
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.976064 10.190458 4.762428
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.976062 2.312747 4.762428
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.976058 -10.426369 4.762428
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -5.976058 -10.426369 5.436793
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 6.384923 -10.426366 5.436793
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 6.384923 -10.426366 4.762428
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 6.384920 2.312749 4.762428
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 6.384918 10.190460 4.762428
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 6.384918 10.190460 5.436793
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 49_3
+v 6.384923 -10.426366 5.436793
+vn 0.000000 0.000000 1.000000
+vt 1.139965 12.925941 0.000000
+v 6.384918 10.190460 5.436793
+vn 0.000000 0.000000 1.000000
+vt 0.633985 1.035478 0.000000
+v -5.976064 10.190458 5.436793
+vn 0.000000 0.000000 1.000000
+vt 7.830460 0.879040 0.000000
+v -5.976058 -10.426369 5.436793
+vn 0.000000 0.000000 1.000000
+vt 8.336439 12.769505 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 49
+v 6.384918 10.190460 4.762428
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 6.384920 2.312749 4.762428
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -5.976062 2.312748 4.762428
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -5.976064 10.190458 4.762428
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 6.384920 2.312749 4.762428
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v 6.384923 -10.426366 4.762428
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -5.976058 -10.426369 4.762428
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+v -5.976062 2.312748 4.762428
+vn 0.000000 0.000000 -1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+g inside_1
+
+usemtl 0
+v -4.784042 2.312747 0.175000
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.784042 3.303533 0.175000
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.784042 3.303533 4.762428
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.784042 2.312747 4.762428
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v -4.784042 2.312747 3.175000
+vn 1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -5/-5/-5 -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.181950 2.312747 0.178906
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v 5.181950 3.303533 0.178906
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.784042 3.303533 0.178906
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+v -4.784042 2.312747 0.178906
+vn 0.000000 0.000000 1.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+v 5.181950 2.312747 4.762428
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.181950 3.303533 4.762428
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.181950 3.303533 0.175000
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+v 5.181950 2.312747 0.175000
+vn -1.000000 0.000000 0.000000
+vt 0.000000 0.000000 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
+usemtl 0_5
+v 5.181950 3.303533 4.762428
+vn 0.000000 -1.000000 0.000000
+vt 0.996288 1.068620 0.000000
+v -4.784042 3.303533 4.762428
+vn 0.000000 -1.000000 0.000000
+vt -0.001865 1.072147 0.000000
+v -4.784042 3.303533 0.175000
+vn 0.000000 -1.000000 0.000000
+vt -0.003534 0.005611 0.000000
+v 5.181950 3.303533 0.175000
+vn 0.000000 -1.000000 0.000000
+vt 0.994619 0.002084 0.000000
+f -4/-4/-4 -3/-3/-3 -2/-2/-2 -1/-1/-1
diff --git a/src/main/resources/geometry/numbers.int b/src/main/resources/geometry/numbers.int
new file mode 100644
index 0000000..4807735
--- /dev/null
+++ b/src/main/resources/geometry/numbers.int
Binary files differ
diff --git a/src/main/resources/geometry/p51_mustang.cg b/src/main/resources/geometry/p51_mustang.cg
new file mode 100644
index 0000000..6ddcc5b
--- /dev/null
+++ b/src/main/resources/geometry/p51_mustang.cg
Binary files differ
diff --git a/src/main/resources/geometry/p51_mustang.obj b/src/main/resources/geometry/p51_mustang.obj
new file mode 100644
index 0000000..ff8f7b6
--- /dev/null
+++ b/src/main/resources/geometry/p51_mustang.obj
@@ -0,0 +1,5527 @@
+# Thu Oct 29 11:30:01 1992
+#
+# P51 Mustang Airplane
+#
+# Courtesy of:
+#
+# Viewpoint Animation Engineering
+# 870 West Center
+# Orem, Utah 84057
+# (801)224-2222
+# 1-800-DATASET
+#
+# (c) Copyright 1992 Viewpoint Animation Engineering Inc.
+# Sun Microsystems has been authorized to freely distribute
+# these Datasets. They are provided for unlimited use in
+# existing or modified form. The actual Dataset (ie, geometry)
+# may not, however, be resold in existing or modified form.
+#
+
+g default
+v 6.361460 0.669865 0.000000
+v 6.361460 -0.794649 0.000000
+v 6.361460 0.669865 -0.156457
+v 6.361460 0.615640 -0.312522
+v 6.361460 0.561399 -0.379419
+v 6.361460 0.398707 -0.490883
+v 6.361460 0.207409 -0.535484
+v 6.361460 -0.523492 -0.464885
+v 6.361460 -0.686183 -0.369020
+v 6.361460 -0.740424 -0.307323
+v 6.361460 -0.794649 -0.156457
+v 6.058460 -0.864940 -0.156457
+v 6.058460 -0.864940 0.000000
+v 6.058460 0.680933 0.000000
+v 6.058460 0.680933 -0.156457
+v 6.058460 0.623695 -0.312522
+v 6.058460 0.566441 -0.379419
+v 6.058460 0.394712 -0.490883
+v 6.058460 0.211786 -0.535484
+v 6.058460 -0.042087 -0.580071
+v 6.058460 -0.578719 -0.464885
+v 6.058460 -0.750448 -0.369020
+v 6.058460 -0.807703 -0.307323
+v 5.759059 -0.629551 -0.464885
+v 5.759059 -0.806535 -0.369020
+v 5.759059 -0.865547 -0.307323
+v 5.759059 -0.924679 -0.156457
+v 5.759059 -0.924679 0.000000
+v 5.759059 0.688910 0.000000
+v 5.759059 0.688910 -0.156457
+v 5.759059 0.633582 -0.312522
+v 5.759059 0.574636 -0.379419
+v 5.759059 0.397834 -0.490883
+v 5.759059 0.218724 -0.535484
+v 5.759059 -0.036405 -0.580071
+v 5.384059 0.218775 -0.535484
+v 5.384059 -0.034261 -0.580071
+v 5.384059 -0.439481 -0.533271
+v 5.384059 -0.690861 -0.464885
+v 5.384059 -0.877400 -0.369020
+v 5.384059 -0.938690 -0.307323
+v 5.384059 -1.000841 -0.156457
+v 5.384059 -1.000841 0.000000
+v 5.384059 0.701148 0.000000
+v 5.384059 0.701148 -0.156457
+v 5.384059 0.640479 -0.312522
+v 5.384059 0.579792 -0.379419
+v 5.384059 0.397767 -0.490883
+v 5.045059 0.651279 -0.312522
+v 5.045059 0.590592 -0.379419
+v 5.045059 0.408567 -0.490883
+v 5.045059 0.222375 -0.535484
+v 5.045059 -0.034608 -0.580071
+v 5.045059 -0.455493 -0.533271
+v 5.045059 -0.717533 -0.464885
+v 5.045059 -0.914058 -0.369020
+v 5.045059 -0.975665 -0.307323
+v 5.045059 -1.038557 -0.156457
+v 5.045059 -1.038557 0.000000
+v 5.045059 0.711948 0.000000
+v 5.045059 0.711948 -0.156457
+v 4.526059 -1.109240 0.000000
+v 4.526059 0.712244 0.000000
+v 4.526059 0.718504 -0.156457
+v 4.526059 0.658479 -0.312522
+v 4.526059 0.597792 -0.379419
+v 4.526059 0.414495 -0.490883
+v 4.526059 0.230297 -0.535484
+v 4.526059 -0.029135 -0.580071
+v 4.526059 -0.498435 -0.533271
+v 4.526059 -0.768878 -0.464885
+v 4.526059 -0.974194 -0.369020
+v 4.673659 -1.046356 -0.307323
+v 4.526059 -1.109240 -0.156457
+v 3.765859 -0.962355 -0.628220
+v 3.913459 -1.100734 -0.631323
+v 3.765859 -1.243404 -0.610057
+v 3.765859 -1.243404 0.000000
+v 3.765859 0.722259 0.000000
+v 3.765859 0.722259 -0.156457
+v 3.765859 0.656899 -0.312522
+v 3.765859 0.591162 -0.379419
+v 3.765859 0.431232 -0.490883
+v 3.765859 0.239029 -0.535484
+v 3.765859 -0.018264 -0.580071
+v 3.765859 -0.575051 -0.533271
+v 3.765859 -0.787602 -0.464885
+v 6.361460 -0.219626 -0.515268
+v 6.361460 -0.378841 -0.476876
+v 6.058460 -0.247173 -0.548869
+v 6.058460 -0.426032 -0.510478
+v 5.759059 -0.274659 -0.548869
+v 5.634072 -0.409004 -0.533271
+v 5.759059 -0.472355 -0.510478
+v 6.361460 0.028069 -0.567064
+v 6.286466 -0.044879 -0.580071
+v 6.361460 -0.103735 -0.558472
+v 6.684336 0.571381 -0.144191
+v 6.684336 0.571381 0.000000
+v 6.684336 0.526950 -0.276394
+v 6.684336 0.489194 -0.324534
+v 6.684336 0.352180 -0.421582
+v 6.684336 0.195568 -0.461057
+v 6.684336 0.031728 -0.471195
+v 6.684336 -0.075913 -0.450460
+v 6.684336 -0.164028 -0.427821
+v 6.684336 -0.307884 -0.397477
+v 6.684336 -0.434718 -0.390959
+v 6.684336 -0.565572 -0.311244
+v 6.684336 -0.601128 -0.269432
+v 6.684336 -0.644809 -0.143792
+v 6.684336 -0.644809 0.000000
+v 6.634465 0.607010 0.000000
+v 6.572132 0.636542 0.000000
+v 6.572132 0.636542 -0.156457
+v 6.634465 0.607010 -0.152369
+v 6.572089 0.583477 -0.312522
+v 6.634446 0.556960 -0.300481
+v 6.572050 0.530397 -0.379419
+v 6.634429 0.509124 -0.361126
+v 6.571951 0.389182 -0.490883
+v 6.634385 0.375719 -0.467785
+v 6.571836 0.207239 -0.535484
+v 6.634334 0.203329 -0.510677
+v 6.572061 0.027289 -0.553741
+v 6.634434 0.028676 -0.524650
+v 6.572553 -0.096294 -0.535720
+v 6.634652 -0.088625 -0.504625
+v 6.572738 -0.194421 -0.505845
+v 6.634734 -0.181332 -0.478734
+v 6.573818 -0.338568 -0.473719
+v 6.635214 -0.323683 -0.447942
+v 6.574113 -0.480045 -0.464885
+v 6.635345 -0.459933 -0.440246
+v 6.574482 -0.639148 -0.369020
+v 6.635196 -0.609515 -0.350011
+v 6.574611 -0.692189 -0.307323
+v 6.634674 -0.657331 -0.295157
+v 6.574741 -0.745212 -0.156457
+v 6.634470 -0.707556 -0.152436
+v 6.574741 -0.745212 0.000000
+v 6.634604 -0.707387 0.000000
+v 6.684336 -0.305939 -0.371757
+v 6.684336 -0.160612 -0.305211
+v 6.684336 -0.072625 -0.389017
+v 6.684336 0.032698 -0.427306
+v 6.684336 0.193252 -0.446172
+v 6.684336 0.345796 -0.407722
+v 6.684336 0.478740 -0.313557
+v 6.684336 0.513554 -0.269169
+v 6.684336 0.556381 -0.141738
+v 6.684336 -0.629809 -0.141259
+v 6.684336 -0.587882 -0.261854
+v 6.684336 -0.555708 -0.299689
+v 6.684336 -0.430156 -0.376173
+v 6.684336 0.557001 0.000000
+v 6.684336 -0.624314 0.000000
+v 6.684336 -0.144066 0.000000
+v 6.684336 -0.159855 -0.290230
+v 6.684336 -0.145284 -0.299096
+v 6.684336 -0.149751 -0.315557
+v 6.684336 -0.163603 -0.323078
+v 6.684336 -0.174250 -0.311456
+v 6.684336 -0.182333 -0.295363
+v 6.684336 -0.159085 0.000000
+v 6.684336 -0.129047 0.000000
+v 6.684336 -0.303959 -0.380123
+v 6.684336 -0.309463 -0.356873
+v 6.684336 -0.431677 -0.381101
+v 6.684336 -0.453436 -0.361991
+v 6.684336 -0.064552 -0.375992
+v 6.684336 -0.080699 -0.402043
+v 6.684336 0.036183 -0.412612
+v 6.684336 0.029323 -0.441543
+v 6.684336 0.234120 -0.435870
+v 6.684336 0.194024 -0.451133
+v 6.576936 -0.555708 -0.299689
+v 6.576936 -0.453436 -0.361991
+v 6.576936 -0.309463 -0.356873
+v 6.576936 -0.182333 -0.295363
+v 6.576936 -0.159085 0.000000
+v 6.576936 -0.624314 0.000000
+v 6.576936 -0.629809 -0.141259
+v 6.576936 -0.587882 -0.261854
+v 6.043650 0.214751 -0.637964
+v 6.058621 0.226609 -0.620602
+v 5.759221 0.233548 -0.620602
+v 5.759249 0.221346 -0.637962
+v 5.384221 0.233599 -0.620602
+v 5.384249 0.221400 -0.637983
+v 5.045221 0.237199 -0.620602
+v 4.991249 0.224993 -0.637944
+v 4.526221 0.245120 -0.620602
+v 4.526249 0.232911 -0.637921
+v 3.781049 0.241471 -0.637928
+v 3.766021 0.253853 -0.620602
+v 3.781049 0.013703 -0.677419
+v 3.766021 -0.003440 -0.665190
+v 4.526221 -0.014311 -0.665190
+v 4.526249 0.003046 -0.677426
+v 5.045221 -0.019784 -0.665190
+v 4.991249 -0.002431 -0.677403
+v 5.384221 -0.019437 -0.665190
+v 5.384249 -0.002091 -0.677364
+v 5.759221 -0.021581 -0.665190
+v 5.759249 -0.004231 -0.677385
+v 6.043650 -0.009627 -0.677383
+v 6.058621 -0.027263 -0.665190
+v 4.153649 0.237191 -0.637924
+v 4.153649 0.008374 -0.677423
+v 5.789249 0.191094 -0.643152
+v 6.013650 0.185887 -0.643132
+v 6.013650 0.020499 -0.672215
+v 5.789249 0.024753 -0.672195
+v 5.414249 0.191845 -0.643154
+v 5.729249 0.191804 -0.643162
+v 5.729249 0.025487 -0.672185
+v 5.414249 0.027289 -0.672193
+v 5.021249 0.195170 -0.643137
+v 5.354249 0.192117 -0.643125
+v 5.354249 0.027439 -0.672223
+v 5.021249 0.027142 -0.672210
+v 4.556249 0.202835 -0.643039
+v 4.961249 0.195935 -0.643036
+v 4.961249 0.027488 -0.672311
+v 4.556249 0.032255 -0.672308
+v 4.496249 0.033041 -0.672327
+v 4.183649 0.037514 -0.672337
+v 4.183649 0.207279 -0.643010
+v 4.496249 0.203690 -0.643020
+v 3.811049 0.211563 -0.643035
+v 4.123649 0.207974 -0.643046
+v 4.123649 0.038366 -0.672301
+v 3.811049 0.042839 -0.672312
+v 5.789492 0.053562 -0.750364
+v 5.789293 0.042097 -0.684394
+v 5.789293 0.178886 -0.660511
+v 5.789492 0.190348 -0.726466
+v 5.789601 0.150840 -0.770777
+v 5.789601 0.105671 -0.778663
+v 5.414381 0.056113 -0.750396
+v 5.414273 0.044631 -0.684364
+v 5.414273 0.179643 -0.660539
+v 5.414381 0.191118 -0.726524
+v 5.414440 0.152138 -0.770796
+v 5.414440 0.107646 -0.778647
+v 5.021388 0.055933 -0.750348
+v 5.021275 0.044489 -0.684432
+v 5.021275 0.182955 -0.660473
+v 5.021388 0.194402 -0.726400
+v 5.021451 0.154389 -0.770758
+v 5.021451 0.108581 -0.778684
+v 4.556449 0.060963 -0.750409
+v 4.556286 0.049591 -0.684552
+v 4.556286 0.190604 -0.660357
+v 4.556450 0.201979 -0.726233
+v 4.556540 0.161160 -0.770726
+v 4.556540 0.114385 -0.778751
+v 4.183840 0.066210 -0.750456
+v 4.183684 0.054845 -0.684565
+v 4.183684 0.195047 -0.660345
+v 4.183840 0.206412 -0.726231
+v 4.183927 0.165821 -0.770731
+v 4.183927 0.119353 -0.778758
+v 3.811241 0.071564 -0.750446
+v 3.811084 0.060172 -0.684528
+v 3.811084 0.199338 -0.660380
+v 3.811241 0.210728 -0.726285
+v 3.811327 0.170461 -0.770741
+v 3.811327 0.124387 -0.778736
+v 5.817692 0.190334 -0.715584
+v 5.817801 0.150825 -0.759894
+v 5.817801 0.105656 -0.767781
+v 5.817692 0.053548 -0.739481
+v 5.817493 0.042083 -0.673511
+v 5.817493 0.178872 -0.649628
+v 5.442580 0.191110 -0.715680
+v 5.442639 0.152130 -0.759951
+v 5.442639 0.107638 -0.767803
+v 5.442581 0.056106 -0.739551
+v 5.442473 0.044623 -0.673520
+v 5.442473 0.179635 -0.649694
+v 5.049588 0.194393 -0.715552
+v 5.049650 0.154380 -0.759911
+v 5.049650 0.108573 -0.767837
+v 5.049587 0.055925 -0.739501
+v 5.049474 0.044480 -0.673585
+v 5.049474 0.182947 -0.649626
+v 4.584650 0.201967 -0.715365
+v 4.584740 0.161148 -0.759858
+v 4.584740 0.114373 -0.767883
+v 4.584650 0.060952 -0.739541
+v 4.584486 0.049580 -0.673684
+v 4.584486 0.190592 -0.649489
+v 4.212040 0.206401 -0.715366
+v 4.212126 0.165810 -0.759866
+v 4.212126 0.119341 -0.767893
+v 4.212040 0.066199 -0.739591
+v 4.211884 0.054834 -0.673700
+v 4.211884 0.195036 -0.649480
+v 3.839440 0.210716 -0.715420
+v 3.839527 0.170450 -0.759876
+v 3.839527 0.124375 -0.767871
+v 3.839440 0.071553 -0.739581
+v 3.839284 0.060161 -0.673663
+v 3.839284 0.199327 -0.649515
+v 3.811327 0.194324 -0.766739
+v 3.811350 0.175562 -0.780006
+v 3.811362 0.159363 -0.787891
+v 4.068205 0.145550 -0.726652
+v 4.086716 0.181162 -0.709368
+v 4.086708 0.086824 -0.725603
+v 4.068201 0.126643 -0.729894
+v 3.811362 0.140609 -0.791145
+v 3.811350 0.122702 -0.789178
+v 3.811327 0.100585 -0.783005
+v 4.105228 0.197878 -0.695322
+v 4.123734 0.185025 -0.686379
+v 4.123706 0.212384 -0.668536
+v 3.811188 0.221690 -0.701638
+v 3.811252 0.221412 -0.729386
+v 3.811293 0.210542 -0.748835
+v 4.477716 0.193451 -0.695334
+v 4.496334 0.180709 -0.686337
+v 4.496305 0.208081 -0.668514
+v 4.183788 0.217388 -0.701617
+v 4.183852 0.217099 -0.729354
+v 4.183892 0.206109 -0.748821
+v 4.183927 0.189772 -0.766732
+v 4.183950 0.170900 -0.780002
+v 4.183962 0.154575 -0.787896
+v 4.440471 0.140779 -0.726736
+v 4.459093 0.176621 -0.709414
+v 4.459085 0.081705 -0.725677
+v 4.440467 0.121757 -0.729985
+v 4.183962 0.135704 -0.791156
+v 4.183950 0.117677 -0.789196
+v 4.183927 0.095454 -0.783025
+v 4.923962 0.075456 -0.723712
+v 4.905266 0.114847 -0.727001
+v 4.556577 0.130832 -0.791149
+v 4.556564 0.112713 -0.789185
+v 4.556540 0.090398 -0.783005
+v 4.556540 0.185169 -0.766745
+v 4.556565 0.166219 -0.780004
+v 4.556577 0.149793 -0.787895
+v 4.905259 0.133564 -0.723708
+v 4.923947 0.169028 -0.707369
+v 4.942648 0.185785 -0.694319
+v 4.961344 0.172981 -0.686409
+v 4.961312 0.200337 -0.668528
+v 4.556395 0.212955 -0.701644
+v 4.556462 0.212670 -0.729373
+v 4.556504 0.201594 -0.748841
+v 5.336073 0.182393 -0.694991
+v 5.354277 0.169258 -0.686567
+v 5.354268 0.196573 -0.668607
+v 5.021350 0.205343 -0.701733
+v 5.021396 0.205087 -0.729484
+v 5.021425 0.194306 -0.748900
+v 5.021451 0.178178 -0.766780
+v 5.021467 0.159499 -0.780023
+v 5.021476 0.143383 -0.787885
+v 5.299676 0.131285 -0.725579
+v 5.317865 0.165980 -0.708639
+v 5.317894 0.074511 -0.724930
+v 5.299691 0.112991 -0.728876
+v 5.021476 0.124705 -0.791117
+v 5.021467 0.106883 -0.789127
+v 5.021451 0.084825 -0.782933
+v 5.711139 0.181998 -0.695272
+v 5.729269 0.168957 -0.686537
+v 5.729262 0.196275 -0.668642
+v 5.414344 0.202034 -0.701747
+v 5.414388 0.201792 -0.729534
+v 5.414416 0.191394 -0.748909
+v 5.414440 0.175656 -0.766784
+v 5.414456 0.157327 -0.780035
+v 5.414464 0.141636 -0.787881
+v 5.674865 0.130383 -0.726270
+v 5.693003 0.165481 -0.709168
+v 5.692987 0.072871 -0.725261
+v 5.674857 0.111792 -0.729480
+v 5.414464 0.123345 -0.791109
+v 5.414456 0.105921 -0.789107
+v 5.414440 0.084232 -0.782917
+v 5.996122 0.176713 -0.696818
+v 6.013791 0.163037 -0.686547
+v 6.013744 0.190352 -0.668613
+v 5.789425 0.201277 -0.701746
+v 5.789506 0.201029 -0.729515
+v 5.789557 0.190434 -0.748909
+v 5.789602 0.174496 -0.766785
+v 5.789631 0.155988 -0.780030
+v 5.789646 0.140077 -0.787883
+v 5.960786 0.126591 -0.731008
+v 5.978448 0.160837 -0.712289
+v 5.978462 0.068958 -0.728487
+v 5.960793 0.108211 -0.734260
+v 5.789646 0.121588 -0.791111
+v 5.789631 0.103959 -0.789114
+v 5.789602 0.082080 -0.782921
+v 5.789557 0.061050 -0.771500
+v 5.789506 0.044538 -0.756843
+v 5.789425 0.034935 -0.730789
+v 6.013744 0.024964 -0.697696
+v 6.013791 0.056743 -0.705239
+v 5.996129 0.048074 -0.719460
+v 5.414416 0.063399 -0.771496
+v 5.414388 0.047085 -0.756851
+v 5.414345 0.037478 -0.730786
+v 5.729262 0.029958 -0.697665
+v 5.729269 0.061747 -0.705246
+v 5.711131 0.052529 -0.717831
+v 5.021425 0.063610 -0.771514
+v 5.021396 0.046912 -0.756849
+v 5.021350 0.037316 -0.730806
+v 5.354268 0.031894 -0.697705
+v 5.354277 0.063664 -0.705225
+v 5.336088 0.054313 -0.717686
+v 4.556504 0.068913 -0.771606
+v 4.556461 0.051943 -0.756944
+v 4.556395 0.042375 -0.730913
+v 4.961313 0.031890 -0.697803
+v 4.961344 0.063648 -0.705410
+v 4.942656 0.054771 -0.717128
+v 4.183892 0.074062 -0.771632
+v 4.183852 0.057188 -0.756981
+v 4.183788 0.047623 -0.730944
+v 4.496305 0.037432 -0.697820
+v 4.496334 0.069195 -0.705487
+v 4.477712 0.060663 -0.718120
+v 3.811293 0.079304 -0.771607
+v 3.811252 0.062541 -0.756958
+v 3.811188 0.052967 -0.730916
+v 4.123706 0.042776 -0.697792
+v 4.123734 0.074544 -0.705436
+v 4.105224 0.065899 -0.718068
+v 2.080458 -0.044641 -0.580071
+v 2.080458 -0.639738 -0.533271
+v 2.958858 -0.755430 -0.464885
+v 2.958858 -0.938409 -0.628220
+v 2.958858 -1.348629 -0.610057
+v 2.080458 -1.348629 0.000000
+v 2.930218 0.704509 0.000000
+v 2.930218 0.704509 -0.156457
+v 2.890618 0.634652 -0.312522
+v 2.890618 0.564392 -0.379419
+v 2.876219 0.393459 -0.490883
+v 2.080458 0.230355 -0.535484
+v 2.436418 0.357459 -0.490883
+v 1.626258 0.230355 -0.535484
+v 1.626258 -0.044641 -0.580071
+v 1.626258 -0.639738 -0.533271
+v 1.626258 -0.798630 -0.464885
+v 1.626258 -0.938409 -0.628220
+v 1.626258 -1.348629 -0.610057
+v 1.626258 -1.348629 0.000000
+v 2.193910 1.331267 0.000000
+v -1.167794 0.704509 0.000000
+v -1.167794 0.704509 -0.156457
+v -1.079142 0.634652 -0.312522
+v -0.966887 0.564392 -0.379419
+v -0.869141 0.451059 -0.454883
+v -0.869141 0.230355 -0.535484
+v -0.869141 -0.044641 -0.580071
+v -0.869141 -0.639738 -0.533271
+v -0.869141 -0.870630 -0.464885
+v -0.605987 -1.078982 -0.628220
+v -0.605987 -1.201591 -0.631323
+v -0.605987 -1.132629 -0.610057
+v -0.605987 -1.348629 0.000000
+v 1.124589 1.368707 0.000000
+v 1.121248 0.407859 -0.490883
+v 1.421248 0.393459 -0.490883
+v 2.398921 0.394306 -0.483900
+v 2.436418 0.321287 -0.500775
+v 2.473918 0.357459 -0.490883
+v 2.473427 0.371387 -0.481801
+v 1.421248 0.430267 -0.483714
+v 1.421248 0.357287 -0.500775
+v 1.121248 0.444280 -0.481952
+v 1.121248 0.371687 -0.500775
+v -0.886830 0.482470 -0.434400
+v -0.869141 0.414887 -0.464775
+v 2.224331 1.308867 0.000000
+v 2.156535 1.334394 0.000000
+v 2.203136 1.002782 -0.414086
+v 2.202622 1.205622 -0.359939
+v 2.184142 1.209105 -0.363017
+v 2.184413 1.007165 -0.415509
+v 2.202622 1.240752 -0.326490
+v 2.201731 1.279411 -0.200170
+v 2.184417 1.285425 -0.201149
+v 2.184142 1.244235 -0.329568
+v 2.164556 1.245486 -0.330265
+v 2.164830 1.286676 -0.201846
+v 2.218233 1.270108 -0.194992
+v 2.219124 1.231449 -0.321312
+v 2.367620 1.111280 -0.322231
+v 2.220967 1.202554 -0.354093
+v 2.369463 1.082385 -0.355012
+v 2.164928 1.007475 -0.416100
+v 2.164657 1.209415 -0.363608
+v 1.346727 1.260902 -0.362695
+v 1.346234 1.064003 -0.413891
+v 1.346727 1.296032 -0.329246
+v 1.198236 1.054193 -0.413891
+v 1.198729 1.251091 -0.362695
+v 0.619036 1.112495 -0.362695
+v 0.650207 1.022778 -0.402545
+v 1.198729 1.286221 -0.329246
+v 1.198709 1.327066 -0.201033
+v 0.619036 1.147625 -0.329246
+v -1.006543 -1.892791 -0.307323
+v -1.006543 -1.960629 -0.156457
+v -1.006543 -1.960629 0.000000
+v -1.373742 0.704509 0.000000
+v -1.373742 0.704509 -0.156457
+v -1.271461 0.634652 -0.312522
+v -1.158709 0.564392 -0.379419
+v -1.006543 0.482470 -0.434400
+v -1.006543 0.414887 -0.464775
+v -1.006543 0.230355 -0.535484
+v -1.006543 -0.044641 -0.580071
+v -1.006543 -0.639738 -0.533271
+v -1.006543 -1.615830 -0.464885
+v -1.006543 -1.824182 -0.369020
+v -1.655142 -0.639738 -0.506574
+v -1.655142 -1.414323 -0.441612
+v -1.655142 -1.622674 -0.350546
+v -1.655142 -1.691284 -0.291938
+v -1.655142 -1.759121 -0.148625
+v -1.655142 -1.759121 0.000000
+v -1.655142 0.704509 0.000000
+v -1.655142 0.704509 -0.148625
+v -1.655142 0.634652 -0.296876
+v -1.655142 0.564392 -0.360425
+v -1.655142 0.482471 -0.412653
+v -1.655142 0.414887 -0.441507
+v -1.655142 0.230355 -0.508676
+v -1.655142 -0.044641 -0.551031
+v -0.361405 -1.095250 -1.664383
+v 1.629640 -0.974871 -1.664383
+v 2.962241 -0.974871 -1.664383
+v 3.308442 -0.999037 -1.657746
+v 3.456042 -1.116736 -1.668975
+v 3.308442 -1.260532 -1.657578
+v 2.962241 -1.365507 -1.664820
+v 1.629640 -1.365507 -1.664820
+v -0.361405 -1.150019 -1.649955
+v 2.978287 -0.959703 -8.145055
+v 3.186722 -0.983870 -8.138417
+v 3.186722 -1.047697 -8.145931
+v 3.186722 -1.112480 -8.129084
+v 2.978287 -1.217455 -8.136325
+v 2.175970 -1.217455 -8.136325
+v 1.081943 -1.106119 -8.128645
+v 1.081943 -1.080082 -8.145055
+v 2.175970 -0.959703 -8.145055
+v 1.797642 -1.186562 -8.382774
+v 1.797642 -1.111711 -8.387530
+v 2.273984 -1.104526 -8.491683
+v 2.711147 -1.104526 -8.491683
+v 2.824718 -1.059287 -8.383914
+v 2.824718 -1.094065 -8.388008
+v 2.824718 -1.129364 -8.378828
+v 2.711147 -1.179377 -8.486926
+v 2.273984 -1.179377 -8.486926
+v 0.489037 -1.838894 -0.460791
+v 0.489037 -1.770285 -0.522487
+v 0.626440 -1.442896 -0.430831
+v 0.626440 -1.409934 0.000000
+v 0.489037 -1.906732 0.000000
+v 0.489037 -1.906732 -0.309925
+v 0.791476 -1.389575 0.000000
+v 0.654074 -1.799869 0.000000
+v 0.654074 -1.799869 -0.315172
+v 0.654074 -1.743844 -0.466038
+v 0.654074 -1.687181 -0.527734
+v 0.791476 -1.416797 -0.433712
+v -2.174141 0.397137 -0.397356
+v -2.174141 0.228038 -0.457809
+v -2.174141 -0.023960 -0.495928
+v -2.174141 -0.569288 -0.455917
+v -2.174141 -1.262241 -0.397451
+v -2.174141 -1.453168 -0.315491
+v -2.174141 -1.516039 -0.262744
+v -2.174141 -1.578203 -0.133762
+v -2.174141 -1.578203 0.000000
+v -2.174141 0.662537 0.000000
+v -2.174141 0.662537 -0.133762
+v -2.174141 0.598522 -0.267189
+v -2.174141 0.534139 -0.324382
+v -2.174141 0.459068 -0.371388
+v -2.693141 0.565465 -0.240470
+v -2.693141 0.508870 -0.291944
+v -2.693141 0.442880 -0.334249
+v -2.693141 0.388440 -0.357621
+v -2.693141 0.239795 -0.412028
+v -2.693141 0.018279 -0.446335
+v -2.693141 -0.461086 -0.410325
+v -2.693141 -0.925453 -0.357706
+v -2.693141 -1.093286 -0.283942
+v -2.693141 -1.148552 -0.236470
+v -2.693141 -1.203197 -0.120386
+v -2.693141 -1.203197 0.000000
+v -2.693141 0.621737 0.000000
+v -2.693141 0.621737 -0.120386
+v -3.492939 -0.720255 0.000000
+v -3.492939 0.557402 0.000000
+v -3.492939 0.557402 -0.108348
+v -3.492939 0.513374 -0.216423
+v -3.492939 0.469093 -0.262750
+v -3.492939 0.417462 -0.300824
+v -3.492939 0.374867 -0.321859
+v -3.492939 0.258566 -0.370825
+v -3.492939 0.085249 -0.401702
+v -3.492939 -0.289812 -0.369293
+v -3.492939 -0.502944 -0.321935
+v -3.492939 -0.634258 -0.255548
+v -3.492939 -0.677499 -0.212823
+v -3.492939 -0.720255 -0.108348
+v -4.296339 -0.594212 -0.216555
+v -4.296339 -0.637453 -0.180677
+v -4.296339 -0.680209 -0.092946
+v -4.296339 -0.680209 0.000000
+v -4.818340 0.679802 0.000000
+usemtl UNKNOWN
+v -4.818340 0.679802 -0.092946
+v -4.296339 0.513374 -0.183700
+v -4.296339 0.469093 -0.222602
+v -4.296339 0.417462 -0.254574
+v -4.296339 0.374867 -0.272238
+v -4.296339 0.258566 -0.313356
+v -4.296339 0.085249 -0.339284
+v -4.296339 -0.289812 -0.312069
+v -4.296339 -0.462899 -0.272302
+v -5.927646 0.105235 -0.249998
+v -5.726139 -0.219019 -0.229945
+v -5.726139 -0.308772 -0.200643
+v -5.726139 -0.422297 -0.159566
+v -5.726139 -0.459680 -0.133130
+v -5.726139 -0.496644 -0.092946
+v -5.726139 -0.496644 0.000000
+v -5.463337 2.538391 0.000000
+v -5.463337 2.538391 -0.092946
+v -5.726139 0.475365 -0.135358
+v -5.726139 0.437082 -0.164022
+v -5.726139 0.392445 -0.187581
+v -5.726139 0.355620 -0.200596
+v -5.927646 0.255074 -0.230894
+v -6.684336 0.366154 -0.063359
+v -6.684336 0.340187 -0.066688
+v -6.684336 0.269287 -0.074438
+v -6.684336 0.163628 -0.079325
+v -6.684336 -0.036876 -0.074195
+v -6.684336 -0.101561 -0.066700
+v -6.684336 -0.146963 -0.056193
+v -6.684336 -0.161913 -0.049431
+v -6.684336 -0.176696 -0.032895
+v -6.684336 -0.176696 0.000000
+v -6.421535 2.538391 0.000000
+v -6.421535 2.538391 -0.032895
+v -6.684336 0.424625 -0.050001
+v -6.684336 0.397630 -0.057333
+v -5.604433 0.030233 -3.198227
+v -5.797521 -0.012666 -3.060199
+v -5.021369 0.017902 -3.196647
+v -4.818594 -0.032663 -3.060443
+v -5.604435 0.079761 -3.184031
+v -5.797521 0.137173 -3.022758
+v -5.021374 0.077262 -3.185613
+v -4.818594 0.140654 -3.023002
+v 6.572738 -0.194421 0.505845
+v 6.572553 -0.096294 0.535720
+v 6.361460 -0.103735 0.558472
+v 6.361460 -0.219626 0.515268
+v 6.572132 0.636542 0.156457
+v 6.361460 0.669865 0.156457
+v 6.574741 -0.745212 0.156457
+v 6.361460 -0.794649 0.156457
+v 6.576936 -0.182333 0.295363
+v 6.576936 -0.309463 0.356873
+v 6.576936 -0.453436 0.361991
+v 6.576936 -0.555708 0.299689
+v 6.576936 -0.587882 0.261854
+v 6.576936 -0.629809 0.141259
+v -6.421535 2.538391 0.032895
+v -6.684336 -0.176696 0.032895
+v -6.684336 -0.161913 0.049431
+v -6.684336 -0.146963 0.056193
+v -6.684336 -0.101561 0.066700
+v -6.684336 -0.036876 0.074195
+v -6.684336 0.163628 0.079325
+v -6.684336 0.269287 0.074438
+v -6.684336 0.340187 0.066688
+v -6.684336 0.366154 0.063359
+v -6.684336 0.397630 0.057333
+v -6.684336 0.424625 0.050001
+v 6.361460 0.207409 0.535484
+v 6.571836 0.207239 0.535484
+v 6.571951 0.389182 0.490883
+v 6.361460 0.398707 0.490883
+v 6.573818 -0.338568 0.473719
+v 6.361460 -0.378841 0.476876
+v 6.361460 -0.523492 0.464885
+v 6.574113 -0.480045 0.464885
+v 6.361460 0.561399 0.379419
+v 6.572050 0.530397 0.379419
+v 6.572089 0.583477 0.312522
+v 6.361460 0.615640 0.312522
+v 6.361460 0.028069 0.567064
+v 6.572061 0.027289 0.553741
+v 6.574482 -0.639148 0.369020
+v 6.361460 -0.686183 0.369020
+v 6.361460 -0.740424 0.307323
+v 6.574611 -0.692189 0.307323
+v 6.058460 -0.864940 0.156457
+v 6.058460 0.680933 0.156457
+v 6.058460 0.623695 0.312522
+v 6.058460 0.566441 0.379419
+v 6.058460 0.394712 0.490883
+v 6.058460 0.211786 0.535484
+v 6.058460 -0.042087 0.580071
+v 6.286466 -0.044879 0.580071
+v 6.058460 -0.247173 0.548869
+v 6.058460 -0.426032 0.510478
+v 6.058460 -0.578719 0.464885
+v 6.058460 -0.750448 0.369020
+v 6.058460 -0.807703 0.307323
+v 5.759059 -0.629551 0.464885
+v 5.759059 -0.806535 0.369020
+v 5.759059 -0.865547 0.307323
+v 5.759059 -0.924679 0.156457
+v 5.759059 0.688910 0.156457
+v 5.759059 0.633582 0.312522
+v 5.759059 0.574636 0.379419
+v 5.759059 0.397834 0.490883
+v 5.759059 0.218724 0.535484
+v 5.960793 0.108211 0.734260
+v 5.960786 0.126591 0.731008
+v 5.789646 0.140077 0.787883
+v 5.789646 0.121588 0.791111
+v 5.759059 -0.036405 0.580071
+v 5.759059 -0.274659 0.548869
+v 5.759059 -0.472355 0.510478
+v 5.674857 0.111792 0.729480
+v 5.674865 0.130383 0.726270
+v 5.414464 0.141636 0.787881
+v 5.414464 0.123345 0.791109
+v 5.384059 -0.034261 0.580071
+v 5.384059 -0.439481 0.533271
+v 5.634072 -0.409004 0.533271
+v 5.384059 -0.690861 0.464885
+v 5.384059 -0.877400 0.369020
+v 5.384059 -0.938690 0.307323
+v 5.384059 -1.000841 0.156457
+v 5.384059 0.701148 0.156457
+v 5.384059 0.640479 0.312522
+v 5.384059 0.579792 0.379419
+v 5.384059 0.397767 0.490883
+v 5.384059 0.218775 0.535484
+v 5.045059 0.651279 0.312522
+v 5.045059 0.590592 0.379419
+v 5.045059 0.408567 0.490883
+v 5.045059 0.222375 0.535484
+v 5.299691 0.112991 0.728876
+v 5.299676 0.131285 0.725579
+v 5.021476 0.143383 0.787885
+v 5.021476 0.124705 0.791117
+v 5.045059 -0.034608 0.580071
+v 5.045059 -0.455493 0.533271
+v 5.045059 -0.717533 0.464885
+v 5.045059 -0.914058 0.369020
+v 5.045059 -0.975665 0.307323
+v 5.045059 -1.038557 0.156457
+v 5.045059 0.711948 0.156457
+v 4.526059 0.718504 0.156457
+v 4.526059 0.658479 0.312522
+v 4.526059 0.597792 0.379419
+v 4.526059 0.414495 0.490883
+v 4.526059 0.230297 0.535484
+v 4.905266 0.114847 0.727001
+v 4.905259 0.133564 0.723708
+v 4.556577 0.149793 0.787895
+v 4.556577 0.130832 0.791149
+v 4.526059 -0.029135 0.580071
+v 4.526059 -0.498435 0.533271
+v 4.526059 -0.768878 0.464885
+v 4.526059 -0.974194 0.369020
+v 4.673659 -1.046356 0.307323
+v 4.526059 -1.109240 0.156457
+v 3.765859 -0.962355 0.628220
+v 3.913459 -1.100734 0.631323
+v 3.765859 -1.243404 0.610057
+v 3.765859 0.722259 0.156457
+v 3.765859 0.656899 0.312522
+v 3.765859 0.591162 0.379419
+v 3.765859 0.431232 0.490883
+v 3.765859 0.239029 0.535484
+v 4.068201 0.126643 0.729894
+v 4.068205 0.145550 0.726652
+v 3.811362 0.159363 0.787891
+v 3.811362 0.140609 0.791145
+v 3.765859 -0.018264 0.580071
+v 3.765859 -0.575051 0.533271
+v 3.765859 -0.787602 0.464885
+v 6.634465 0.607010 0.152369
+v 6.684336 0.571381 0.144191
+v 6.684336 0.526950 0.276394
+v 6.634446 0.556960 0.300481
+v 6.684336 0.489194 0.324534
+v 6.634429 0.509124 0.361126
+v 6.684336 0.352180 0.421582
+v 6.634385 0.375719 0.467785
+v 6.684336 0.195568 0.461057
+v 6.634334 0.203329 0.510677
+v 6.684336 0.031728 0.471195
+v 6.634434 0.028676 0.524650
+v 6.684336 -0.075913 0.450460
+v 6.634652 -0.088625 0.504625
+v 6.634734 -0.181332 0.478734
+v 6.684336 -0.164028 0.427821
+v 6.684336 -0.307884 0.397477
+v 6.635214 -0.323683 0.447942
+v 6.684336 -0.434718 0.390959
+v 6.635345 -0.459933 0.440246
+v 6.684336 -0.565572 0.311244
+v 6.635196 -0.609515 0.350011
+v 6.684336 -0.601128 0.269432
+v 6.634674 -0.657331 0.295157
+v 6.684336 -0.644809 0.143792
+v 6.634470 -0.707556 0.152436
+v 6.684336 -0.303959 0.380123
+v 6.684336 -0.163603 0.323078
+v 6.684336 -0.080699 0.402043
+v 6.684336 0.029323 0.441543
+v 6.684336 0.194024 0.451133
+v 6.684336 0.234120 0.435870
+v 6.684336 0.345796 0.407722
+v 6.684336 0.478740 0.313557
+v 6.684336 0.513554 0.269169
+v 6.684336 0.556381 0.141738
+v 6.684336 -0.629809 0.141259
+v 6.684336 -0.587882 0.261854
+v 6.684336 -0.555708 0.299689
+v 6.684336 -0.453436 0.361991
+v 6.684336 -0.431677 0.381101
+v 6.684336 -0.064552 0.375992
+v 6.684336 -0.145284 0.299096
+v 6.684336 0.036183 0.412612
+v 6.684336 -0.159855 0.290230
+v 6.684336 -0.149751 0.315557
+v 6.684336 -0.160612 0.305211
+v 6.684336 -0.174250 0.311456
+v 6.684336 -0.182333 0.295363
+v 6.684336 -0.430156 0.376173
+v 6.684336 0.193252 0.446172
+v 6.684336 -0.305939 0.371757
+v 6.684336 -0.309463 0.356873
+v 6.684336 -0.072625 0.389017
+v 6.684336 0.032698 0.427306
+v 5.759221 0.233548 0.620602
+v 6.058621 0.226609 0.620602
+v 6.058621 -0.027263 0.665190
+v 5.759221 -0.021581 0.665190
+v 5.384221 -0.019437 0.665190
+v 5.045221 -0.019784 0.665190
+v 4.526221 -0.014311 0.665190
+v 3.766021 -0.003440 0.665190
+v 3.766021 0.253853 0.620602
+v 4.526221 0.245120 0.620602
+v 5.045221 0.237199 0.620602
+v 5.384221 0.233599 0.620602
+v 5.759249 0.221346 0.637962
+v 6.043650 0.214751 0.637964
+v 5.384249 0.221400 0.637983
+v 4.991249 0.224993 0.637944
+v 4.526249 0.232911 0.637921
+v 3.781049 0.241471 0.637928
+v 4.153649 0.237191 0.637924
+v 4.526249 0.003046 0.677426
+v 4.153649 0.008374 0.677423
+v 3.781049 0.013703 0.677419
+v 4.991249 -0.002431 0.677403
+v 5.384249 -0.002091 0.677364
+v 5.759249 -0.004231 0.677385
+v 6.043650 -0.009627 0.677383
+v 4.183962 0.154575 0.787896
+v 4.183962 0.135704 0.791156
+v 4.440467 0.121757 0.729985
+v 4.440471 0.140779 0.726736
+v 5.789249 0.191094 0.643152
+v 6.013650 0.185887 0.643132
+v 6.013650 0.020499 0.672215
+v 5.789249 0.024753 0.672195
+v 5.414249 0.191845 0.643154
+v 5.729249 0.191804 0.643162
+v 5.729249 0.025487 0.672185
+v 5.414249 0.027289 0.672193
+v 5.021249 0.195170 0.643137
+v 5.354249 0.192117 0.643125
+v 5.354249 0.027439 0.672223
+v 5.021249 0.027142 0.672210
+v 4.556249 0.202835 0.643039
+v 4.961249 0.195935 0.643036
+v 4.961249 0.027488 0.672311
+v 4.556249 0.032255 0.672308
+v 4.496249 0.033041 0.672327
+v 4.183649 0.037514 0.672337
+v 4.183649 0.207279 0.643010
+v 4.496249 0.203690 0.643020
+v 3.811049 0.211563 0.643035
+v 4.123649 0.207974 0.643046
+v 4.123649 0.038366 0.672301
+v 3.811049 0.042839 0.672312
+v 6.013744 0.190352 0.668613
+v 6.013791 0.163037 0.686547
+v 6.013791 0.056743 0.705239
+v 6.013744 0.024964 0.697696
+v 5.789425 0.034935 0.730789
+v 5.817692 0.053548 0.739481
+v 5.817801 0.105656 0.767781
+v 5.817801 0.150825 0.759894
+v 5.817692 0.190334 0.715584
+v 5.817493 0.178872 0.649628
+v 5.817493 0.042083 0.673511
+v 5.789425 0.201277 0.701746
+v 5.729262 0.196275 0.668642
+v 5.729269 0.168957 0.686537
+v 5.729269 0.061747 0.705246
+v 5.729262 0.029958 0.697665
+v 5.414345 0.037478 0.730786
+v 5.442581 0.056106 0.739551
+v 5.442639 0.107638 0.767803
+v 5.442639 0.152130 0.759951
+v 5.442580 0.191110 0.715680
+v 5.442473 0.179635 0.649694
+v 5.442473 0.044623 0.673520
+v 5.414344 0.202034 0.701747
+v 5.354268 0.196573 0.668607
+v 5.354277 0.169258 0.686567
+v 5.354277 0.063664 0.705225
+v 5.354268 0.031894 0.697705
+v 5.021350 0.037316 0.730806
+v 5.049587 0.055925 0.739501
+v 5.049650 0.108573 0.767837
+v 5.049650 0.154380 0.759911
+v 5.049588 0.194393 0.715552
+v 5.049474 0.182947 0.649626
+v 5.049474 0.044480 0.673585
+v 5.021350 0.205343 0.701733
+v 4.961312 0.200337 0.668528
+v 4.961344 0.172981 0.686409
+v 4.961344 0.063648 0.705410
+v 4.961313 0.031890 0.697803
+v 4.556395 0.042375 0.730913
+v 4.584650 0.060952 0.739541
+v 4.584740 0.114373 0.767883
+v 4.584740 0.161148 0.759858
+v 4.584650 0.201967 0.715365
+v 4.584486 0.190592 0.649489
+v 4.584486 0.049580 0.673684
+v 4.556395 0.212955 0.701644
+v 4.212040 0.066199 0.739591
+v 4.212126 0.119341 0.767893
+v 4.212126 0.165810 0.759866
+v 4.212040 0.206401 0.715366
+v 4.211884 0.195036 0.649480
+v 4.211884 0.054834 0.673700
+v 4.183788 0.217388 0.701617
+v 4.496305 0.208081 0.668514
+v 4.496334 0.180709 0.686337
+v 4.496334 0.069195 0.705487
+v 4.496305 0.037432 0.697820
+v 4.183788 0.047623 0.730944
+v 4.123706 0.212384 0.668536
+v 4.123734 0.185025 0.686379
+v 4.123734 0.074544 0.705436
+v 4.123706 0.042776 0.697792
+v 3.811188 0.052967 0.730916
+v 3.839440 0.071553 0.739581
+v 3.839527 0.124375 0.767871
+v 3.839527 0.170450 0.759876
+v 3.839440 0.210716 0.715420
+v 3.839284 0.199327 0.649515
+v 3.839284 0.060161 0.673663
+v 3.811188 0.221690 0.701638
+v 5.789602 0.174496 0.766785
+v 5.978448 0.160837 0.712289
+v 5.996122 0.176713 0.696818
+v 5.789557 0.190434 0.748909
+v 5.414440 0.175656 0.766784
+v 5.693003 0.165481 0.709168
+v 5.711139 0.181998 0.695272
+v 5.414416 0.191394 0.748909
+v 5.021451 0.178178 0.766780
+v 5.317865 0.165980 0.708639
+v 5.336073 0.182393 0.694991
+v 5.021425 0.194306 0.748900
+v 4.556540 0.185169 0.766745
+v 4.923947 0.169028 0.707369
+v 4.942648 0.185785 0.694319
+v 4.556504 0.201594 0.748841
+v 4.183927 0.189772 0.766732
+v 4.459093 0.176621 0.709414
+v 4.477716 0.193451 0.695334
+v 4.183892 0.206109 0.748821
+v 3.811327 0.194324 0.766739
+v 4.086716 0.181162 0.709368
+v 4.105228 0.197878 0.695322
+v 3.811293 0.210542 0.748835
+v 5.978462 0.068958 0.728487
+v 5.789602 0.082080 0.782921
+v 5.789557 0.061050 0.771500
+v 5.996129 0.048074 0.719460
+v 5.692987 0.072871 0.725261
+v 5.414440 0.084232 0.782917
+v 5.414416 0.063399 0.771496
+v 5.711131 0.052529 0.717831
+v 5.317894 0.074511 0.724930
+v 5.021451 0.084825 0.782933
+v 5.021425 0.063610 0.771514
+v 5.336088 0.054313 0.717686
+v 4.923962 0.075456 0.723712
+v 4.556540 0.090398 0.783005
+v 4.556504 0.068913 0.771606
+v 4.942656 0.054771 0.717128
+v 4.459085 0.081705 0.725677
+v 4.183927 0.095454 0.783025
+v 4.183892 0.074062 0.771632
+v 4.477712 0.060663 0.718120
+v 4.086708 0.086824 0.725603
+v 3.811327 0.100585 0.783005
+v 3.811293 0.079304 0.771607
+v 4.105224 0.065899 0.718068
+v 5.789506 0.044538 0.756843
+v 5.789492 0.053562 0.750364
+v 5.789293 0.042097 0.684394
+v 5.789293 0.178886 0.660511
+v 5.789492 0.190348 0.726466
+v 5.789506 0.201029 0.729515
+v 5.789601 0.150840 0.770777
+v 5.789631 0.155988 0.780030
+v 5.789601 0.105671 0.778663
+v 5.789631 0.103959 0.789114
+v 5.414388 0.047085 0.756851
+v 5.414381 0.056113 0.750396
+v 5.414273 0.044631 0.684364
+v 5.414273 0.179643 0.660539
+v 5.414381 0.191118 0.726524
+v 5.414388 0.201792 0.729534
+v 5.414440 0.152138 0.770796
+v 5.414456 0.157327 0.780035
+v 5.414440 0.107646 0.778647
+v 5.414456 0.105921 0.789107
+v 5.021396 0.046912 0.756849
+v 5.021388 0.055933 0.750348
+v 5.021275 0.044489 0.684432
+v 5.021275 0.182955 0.660473
+v 5.021388 0.194402 0.726400
+v 5.021396 0.205087 0.729484
+v 5.021451 0.154389 0.770758
+v 5.021467 0.159499 0.780023
+v 5.021451 0.108581 0.778684
+v 5.021467 0.106883 0.789127
+v 4.556461 0.051943 0.756944
+v 4.556449 0.060963 0.750409
+v 4.556286 0.049591 0.684552
+v 4.556286 0.190604 0.660357
+v 4.556450 0.201979 0.726233
+v 4.556462 0.212670 0.729373
+v 4.556540 0.161160 0.770726
+v 4.556565 0.166219 0.780004
+v 4.556540 0.114385 0.778751
+v 4.556564 0.112713 0.789185
+v 4.183852 0.057188 0.756981
+v 4.183840 0.066210 0.750456
+v 4.183684 0.054845 0.684565
+v 4.183684 0.195047 0.660345
+v 4.183840 0.206412 0.726231
+v 4.183852 0.217099 0.729354
+v 4.183927 0.165821 0.770731
+v 4.183950 0.170900 0.780002
+v 4.183927 0.119353 0.778758
+v 4.183950 0.117677 0.789196
+v 3.811252 0.062541 0.756958
+v 3.811241 0.071564 0.750446
+v 3.811084 0.060172 0.684528
+v 3.811084 0.199338 0.660380
+v 3.811241 0.210728 0.726285
+v 3.811252 0.221412 0.729386
+v 3.811327 0.170461 0.770741
+v 3.811350 0.175562 0.780006
+v 3.811327 0.124387 0.778736
+v 3.811350 0.122702 0.789178
+v 2.080458 -0.044641 0.580071
+v 2.080458 -0.639738 0.533271
+v 2.958858 -0.755430 0.464885
+v 2.958858 -0.938409 0.628220
+v 1.797642 -1.111711 8.387530
+v 1.797642 -1.186562 8.382774
+v 2.273984 -1.179377 8.486926
+v 2.273984 -1.104526 8.491683
+v 2.958858 -1.348629 0.610057
+v 2.930218 0.704509 0.156457
+v 2.890618 0.634652 0.312522
+v 2.890618 0.564392 0.379419
+v 2.876219 0.393459 0.490883
+v 2.080458 0.230355 0.535484
+v 2.369463 1.082385 0.355012
+v 2.220967 1.202554 0.354093
+v 2.203136 1.002782 0.414086
+v 2.436418 0.357459 0.490883
+v 2.473427 0.371387 0.481801
+v 2.473918 0.357459 0.490883
+v 2.436418 0.321287 0.500775
+v 1.626258 0.230355 0.535484
+v 1.626258 -0.044641 0.580071
+v 1.626258 -0.639738 0.533271
+v 1.626258 -0.798630 0.464885
+v 1.626258 -0.938409 0.628220
+v 1.626258 -1.348629 0.610057
+v 2.218233 1.270108 0.194992
+v 2.219124 1.231449 0.321312
+v 2.367620 1.111280 0.322231
+v 0.619036 1.147625 0.329246
+v 1.198729 1.286221 0.329246
+v 1.198709 1.327066 0.201033
+v -1.167794 0.704509 0.156457
+v -1.079142 0.634652 0.312522
+v 1.198729 1.251091 0.362695
+v -0.966887 0.564392 0.379419
+v 0.619036 1.112495 0.362695
+v 0.650207 1.022778 0.402545
+v -0.886830 0.482470 0.434400
+v 1.121248 0.444280 0.481952
+v -0.869141 0.230355 0.535484
+v 1.421248 0.357287 0.500775
+v 1.121248 0.371687 0.500775
+v -0.869141 0.414887 0.464775
+v -0.869141 -0.044641 0.580071
+v -0.869141 -0.639738 0.533271
+v -0.869141 -0.870630 0.464885
+v -0.605987 -1.078982 0.628220
+v -0.605987 -1.132629 0.610057
+v 2.164830 1.286676 0.201846
+v 2.164657 1.209415 0.363608
+v 2.164556 1.245486 0.330265
+v 1.346727 1.296032 0.329246
+v 1.346727 1.260902 0.362695
+v -0.869141 0.451059 0.454883
+v 2.184413 1.007165 0.415509
+v 2.164928 1.007475 0.416100
+v 2.398921 0.394306 0.483900
+v 1.421248 0.430267 0.483714
+v 1.421248 0.393459 0.490883
+v 1.121248 0.407859 0.490883
+v 2.202622 1.240752 0.326490
+v 2.202622 1.205622 0.359939
+v 2.184142 1.244235 0.329568
+v 2.184142 1.209105 0.363017
+v 2.201731 1.279411 0.200170
+v 2.184417 1.285425 0.201149
+v 1.346234 1.064003 0.413891
+v 1.198236 1.054193 0.413891
+v -1.006543 -1.615830 0.464885
+v -1.006543 -1.824182 0.369020
+v -0.605987 -1.201591 0.631323
+v -1.373742 0.704509 0.156457
+v -1.271461 0.634652 0.312522
+v -1.158709 0.564392 0.379419
+v -1.006543 0.482470 0.434400
+v -1.006543 0.414887 0.464775
+v -1.006543 0.230355 0.535484
+v -1.006543 -0.044641 0.580071
+v -1.006543 -0.639738 0.533271
+v -1.655142 -0.639738 0.506574
+v -1.655142 -1.414323 0.441612
+v -1.655142 -1.622674 0.350546
+v -1.655142 -1.691284 0.291938
+v -1.006543 -1.892791 0.307323
+v -1.655142 -1.759121 0.148625
+v -1.006543 -1.960629 0.156457
+v -1.655142 0.704509 0.148625
+v -1.655142 0.634652 0.296876
+v -1.655142 0.564392 0.360425
+v -1.655142 0.482471 0.412653
+v -1.655142 0.414887 0.441507
+v -1.655142 0.230355 0.508676
+v -1.655142 -0.044641 0.551031
+v 0.654074 -1.743844 0.466038
+v 0.654074 -1.799869 0.315172
+v 0.791476 -1.416797 0.433712
+v 0.654074 -1.687181 0.527734
+v -0.361405 -1.095250 1.664383
+v 1.629640 -0.974871 1.664383
+v 2.962241 -0.974871 1.664383
+v 3.308442 -0.999037 1.657746
+v 3.456042 -1.116736 1.668975
+v 3.308442 -1.260532 1.657578
+v 2.962241 -1.365507 1.664820
+v 1.629640 -1.365507 1.664820
+v -0.361405 -1.150019 1.649955
+v 2.978287 -0.959703 8.145055
+v 3.186722 -0.983870 8.138417
+v 3.186722 -1.047697 8.145931
+v 3.186722 -1.112480 8.129084
+v 2.978287 -1.217455 8.136325
+v 2.175970 -1.217455 8.136325
+v 1.081943 -1.106119 8.128645
+v 1.081943 -1.080082 8.145055
+v 2.175970 -0.959703 8.145055
+v 2.711147 -1.104526 8.491683
+v 2.824718 -1.059287 8.383914
+v 2.824718 -1.094065 8.388008
+v 2.824718 -1.129364 8.378828
+v 2.711147 -1.179377 8.486926
+v 0.489037 -1.838894 0.460791
+v 0.489037 -1.770285 0.522487
+v 0.626440 -1.442896 0.430831
+v 0.489037 -1.906732 0.309925
+v -2.174141 0.397137 0.397356
+v -2.174141 0.228038 0.457809
+v -2.174141 -0.023960 0.495928
+v -2.174141 -0.569288 0.455917
+v -2.174141 -1.262241 0.397451
+v -2.174141 -1.453168 0.315491
+v -2.174141 -1.516039 0.262744
+v -2.174141 -1.578203 0.133762
+v -2.174141 0.662537 0.133762
+v -2.174141 0.598522 0.267189
+v -2.174141 0.534139 0.324382
+v -2.174141 0.459068 0.371388
+v -2.693141 0.565465 0.240470
+v -2.693141 0.508870 0.291944
+v -2.693141 0.442880 0.334249
+v -2.693141 0.388440 0.357621
+v -2.693141 0.239795 0.412028
+v -2.693141 0.018279 0.446335
+v -2.693141 -0.461086 0.410325
+v -2.693141 -0.925453 0.357706
+v -2.693141 -1.093286 0.283942
+v -2.693141 -1.148552 0.236470
+v -2.693141 -1.203197 0.120386
+v -2.693141 0.621737 0.120386
+v -3.492939 0.557402 0.108348
+v -3.492939 0.513374 0.216423
+v -3.492939 0.469093 0.262750
+v -3.492939 0.417462 0.300824
+v -3.492939 0.374867 0.321859
+v -3.492939 0.258566 0.370825
+v -3.492939 0.085249 0.401702
+v -3.492939 -0.289812 0.369293
+v -3.492939 -0.502944 0.321935
+v -3.492939 -0.634258 0.255548
+v -3.492939 -0.677499 0.212823
+v -3.492939 -0.720255 0.108348
+v -4.296339 -0.594212 0.216555
+v -4.296339 -0.637453 0.180677
+v -4.296339 -0.680209 0.092946
+v -4.818340 0.679802 0.092946
+v -4.296339 0.513374 0.183700
+v -4.296339 0.469093 0.222602
+v -4.296339 0.417462 0.254574
+v -4.296339 0.374867 0.272238
+v -4.296339 0.258566 0.313356
+v -4.296339 0.085249 0.339284
+v -4.296339 -0.289812 0.312069
+v -4.296339 -0.462899 0.272302
+v -5.927646 0.105235 0.249998
+v -5.726139 -0.219019 0.229945
+v -5.726139 -0.308772 0.200643
+v -5.726139 -0.422297 0.159566
+v -5.726139 -0.459680 0.133130
+v -5.726139 -0.496644 0.092946
+v -5.463337 2.538391 0.092946
+v -5.726139 0.475365 0.135358
+v -5.726139 0.437082 0.164022
+v -5.726139 0.392445 0.187581
+v -5.726139 0.355620 0.200596
+v -5.927646 0.255074 0.230894
+v -5.021374 0.077262 3.185613
+v -5.604435 0.079761 3.184031
+v -5.604433 0.030233 3.198227
+v -5.021369 0.017902 3.196647
+v -5.797521 0.137173 3.022758
+v -4.818594 0.140654 3.023002
+v -4.818594 -0.032663 3.060443
+v -5.797521 -0.012666 3.060199
+v 6.942926 -1.766178 0.103431
+v 6.979002 -1.766170 0.076686
+v 6.957718 -1.898720 0.042740
+v 6.922789 -1.898728 0.070967
+v 6.935572 -1.368499 0.119729
+v 6.974705 -1.368492 0.097697
+v 6.914673 -0.829704 0.125437
+v 6.956964 -0.829700 0.110327
+v 6.900251 -0.517542 0.119161
+v 6.943820 -0.517538 0.108274
+v 6.887431 -0.226759 0.107292
+v 6.931813 -0.226757 0.100433
+v 6.878496 0.004158 0.092472
+v 6.923258 0.004159 0.088854
+v 6.872898 0.183762 0.075226
+v 6.917793 0.183763 0.074143
+v 6.871572 0.239352 0.072843
+v 6.916480 0.239353 0.072546
+v 6.828905 -1.898695 -0.045206
+v 6.863833 -1.898686 -0.073434
+v 6.843751 -1.766116 -0.105749
+v 6.807674 -1.766124 -0.079004
+v 6.851248 -1.368428 -0.121590
+v 6.812115 -1.368434 -0.099558
+v 6.872295 -0.829629 -0.126652
+v 6.830005 -0.829634 -0.111542
+v 6.886778 -0.517471 -0.119992
+v 6.843209 -0.517475 -0.109104
+v 6.899636 -0.226696 -0.107761
+v 6.855254 -0.226698 -0.100901
+v 6.908589 0.004212 -0.092651
+v 6.863826 0.004212 -0.089034
+v 6.914193 0.183807 -0.075180
+v 6.869297 0.183807 -0.074097
+v 6.915519 0.239396 -0.072727
+v 6.870612 0.239396 -0.072430
+v 6.941214 0.365903 2.029515
+v 6.977266 0.339125 2.029531
+v 6.955834 0.305159 2.162052
+v 6.920930 0.333417 2.162038
+v 6.934228 0.382324 1.631834
+v 6.973341 0.360259 1.631856
+v 6.913813 0.388212 1.093023
+v 6.956090 0.373064 1.093051
+v 6.899663 0.382040 0.780846
+v 6.943222 0.371114 0.780879
+v 6.887091 0.370269 0.490049
+v 6.931466 0.363370 0.490084
+v 6.878348 0.355525 0.259119
+v 6.923107 0.351867 0.259157
+v 6.872894 0.338338 0.079505
+v 6.917789 0.337215 0.079544
+v 6.871615 0.335972 0.023912
+v 6.916523 0.335635 0.023952
+v 6.826943 0.217327 2.161885
+v 6.861846 0.189069 2.161900
+v 6.841852 0.156810 2.029302
+v 6.805800 0.183588 2.029286
+v 6.849690 0.141082 1.631616
+v 6.810576 0.163148 1.631594
+v 6.871212 0.136160 1.092836
+v 6.828934 0.151307 1.092807
+v 6.885977 0.142899 0.780692
+v 6.842418 0.153826 0.780660
+v 6.899105 0.155205 0.489932
+v 6.854729 0.162104 0.489896
+v 6.908276 0.170375 0.259036
+v 6.863517 0.174033 0.258999
+v 6.914055 0.187895 0.079452
+v 6.869161 0.189018 0.079413
+v 6.915433 0.190364 0.023865
+v 6.870526 0.190701 0.023825
+v 6.943109 2.292618 -0.101995
+v 6.979137 2.292594 -0.075185
+v 6.957792 2.425125 -0.041198
+v 6.922914 2.425150 -0.069488
+v 6.935783 1.894950 -0.118541
+v 6.974877 1.894930 -0.096440
+v 6.914895 1.356158 -0.124605
+v 6.957159 1.356144 -0.109421
+v 6.900462 1.043993 -0.118540
+v 6.944012 1.043983 -0.107575
+v 6.887621 0.753203 -0.106866
+v 6.931991 0.753197 -0.099928
+v 6.878660 0.522277 -0.092199
+v 6.923416 0.522274 -0.088501
+v 6.873032 0.342663 -0.075070
+v 6.917925 0.342661 -0.073907
+v 6.871701 0.287070 -0.072721
+v 6.916608 0.287070 -0.072344
+v 6.828823 2.425047 0.046518
+v 6.863701 2.425022 0.074807
+v 6.843561 2.292433 0.107009
+v 6.807533 2.292456 0.080199
+v 6.851032 1.894735 0.122626
+v 6.811937 1.894755 0.100525
+v 6.872070 1.355934 0.127408
+v 6.829806 1.355947 0.112223
+v 6.886564 1.043780 0.120589
+v 6.843014 1.043790 0.109624
+v 6.899444 0.753012 0.108208
+v 6.855074 0.753018 0.101270
+v 6.908424 0.522112 0.092978
+v 6.863667 0.522115 0.089280
+v 6.914059 0.342529 0.075410
+v 6.869165 0.342529 0.074247
+v 6.915390 0.286941 0.072925
+v 6.870483 0.286941 0.072549
+v 6.944822 0.161679 -2.029341
+v 6.980874 0.188457 -2.029277
+v 6.959677 0.222503 -2.161817
+v 6.924774 0.194244 -2.161881
+v 6.937128 0.145022 -1.631683
+v 6.976243 0.167088 -1.631622
+v 6.915756 0.138816 -1.092913
+v 6.958033 0.153964 -1.092857
+v 6.901051 0.144802 -0.780758
+v 6.944610 0.155728 -0.780707
+v 6.887961 0.156401 -0.489977
+v 6.932338 0.163300 -0.489929
+v 6.878808 0.171008 -0.259054
+v 6.923568 0.174665 -0.259010
+v 6.873035 0.188089 -0.079440
+v 6.917930 0.189212 -0.079398
+v 6.871657 0.190422 -0.023848
+v 6.916565 0.190759 -0.023808
+v 6.830786 0.310333 -2.161827
+v 6.865690 0.338591 -2.161763
+v 6.845460 0.370772 -2.029181
+v 6.809408 0.343994 -2.029245
+v 6.852591 0.386265 -1.631473
+v 6.813478 0.364198 -1.631534
+v 6.873154 0.390867 -1.092652
+v 6.830877 0.375720 -1.092707
+v 6.887365 0.383943 -0.780487
+v 6.843806 0.373017 -0.780538
+v 6.899976 0.371465 -0.489711
+v 6.855599 0.364566 -0.489758
+v 6.908737 0.356158 -0.258808
+v 6.863977 0.352501 -0.258852
+v 6.914196 0.338531 -0.079225
+v 6.869302 0.337409 -0.079266
+v 6.915476 0.336030 -0.023637
+v 6.870568 0.335693 -0.023677
+v 7.431191 0.263190 0.000391
+v 7.322116 0.390445 0.000327
+v 7.140324 0.511639 0.000219
+v 6.891874 0.596476 0.000072
+v 6.770679 0.614655 0.000000
+v 6.770679 0.360146 0.000000
+v 6.455573 0.360146 -0.000187
+v 6.455573 0.263190 -0.000187
+v 7.322154 0.373402 -0.063290
+v 7.140398 0.478366 -0.123984
+v 6.891973 0.551841 -0.166542
+v 6.770783 0.567585 -0.175702
+v 6.770708 0.347161 -0.048470
+v 6.455602 0.347161 -0.048656
+v 7.322182 0.326839 -0.109867
+v 7.140451 0.387457 -0.214920
+v 6.892045 0.429890 -0.288530
+v 6.770860 0.438982 -0.304343
+v 6.770729 0.311685 -0.083957
+v 6.455623 0.311685 -0.084144
+v 7.322192 0.263228 -0.126928
+v 7.140471 0.263263 -0.248230
+v 6.892072 0.263288 -0.333214
+v 6.770888 0.263294 -0.351465
+v 6.770737 0.263219 -0.096956
+v 6.455630 0.263219 -0.097143
+v 7.322182 0.199606 -0.109904
+v 7.140451 0.139050 -0.214994
+v 6.892045 0.096661 -0.288628
+v 6.770860 0.087578 -0.304447
+v 6.770729 0.214745 -0.083986
+v 6.455623 0.214745 -0.084173
+v 7.322154 0.153015 -0.063355
+v 7.140398 0.048088 -0.124112
+v 6.891973 -0.025362 -0.166714
+v 6.770784 -0.041101 -0.175883
+v 6.770708 0.179247 -0.048520
+v 6.455602 0.179247 -0.048706
+v 7.322116 0.135935 0.000251
+v 7.140324 0.014740 0.000072
+v 6.891874 -0.070096 -0.000126
+v 6.770679 -0.088275 -0.000208
+v 6.770679 0.166234 -0.000058
+v 6.455573 0.166234 -0.000244
+v 7.322079 0.152940 0.063878
+v 7.140250 0.047940 0.124295
+v 6.891776 -0.025559 0.166516
+v 6.770576 -0.041309 0.175522
+v 6.770651 0.179190 0.048420
+v 6.455544 0.179190 0.048233
+v 7.322051 0.199475 0.110482
+v 7.140196 0.138795 0.215285
+v 6.891704 0.096319 0.288574
+v 6.770499 0.087217 0.304239
+v 6.770630 0.214645 0.083928
+v 6.455523 0.214645 0.083741
+v 7.322041 0.263077 0.127581
+v 7.140177 0.262969 0.248669
+v 6.891677 0.262894 0.333358
+v 6.770471 0.262878 0.351465
+v 6.770622 0.263104 0.096956
+v 6.455515 0.263104 0.096769
+v 7.322051 0.326708 0.110595
+v 7.140196 0.387202 0.215505
+v 6.891703 0.429548 0.288870
+v 6.770499 0.438622 0.304551
+v 6.770630 0.311585 0.084014
+v 6.455523 0.311585 0.083827
+v 7.322078 0.373327 0.064074
+v 7.140250 0.478218 0.124678
+v 6.891776 0.551643 0.167028
+v 6.770575 0.567377 0.176063
+v 6.770651 0.347104 0.048569
+v 6.455544 0.347104 0.048382
+vn -0.999996 0.000509 -0.002924
+vn 1.000000 -0.000087 0.000506
+vn -0.999999 0.000276 -0.001577
+vn 1.000000 -0.000122 0.000716
+vn -0.999999 0.000299 -0.001674
+vn 0.999997 -0.000413 0.002411
+vn -0.999997 0.000412 -0.002415
+vn -0.999997 0.000394 -0.002296
+vn 0.999998 -0.000370 0.002152
+vn 0.999998 -0.000371 0.002156
+vn -0.999997 0.000397 -0.002305
+vn -0.999996 0.000504 -0.002881
+vn -0.065375 0.983158 0.170664
+vn 0.355426 0.160761 -0.920776
+vn 0.065370 -0.983160 -0.170658
+vn -0.065441 0.983121 0.170854
+vn 0.354195 0.162521 -0.920941
+vn 0.065426 -0.983121 -0.170858
+vn -0.065325 0.983174 0.170593
+vn 0.354468 0.159426 -0.921377
+vn 0.065325 -0.983174 -0.170591
+vn -0.064994 0.983360 0.169642
+vn 0.355139 0.158085 -0.921350
+vn 0.064957 -0.983364 -0.169635
+vn -0.064908 0.983396 0.169465
+vn 0.354994 0.159140 -0.921224
+vn 0.064913 -0.983394 -0.169478
+vn -0.065033 0.983333 0.169785
+vn 0.354954 0.159832 -0.921120
+vn 0.065014 -0.983335 -0.169782
+vn 0.999997 -0.000222 0.002254
+vn 0.999997 -0.000500 0.002245
+vn 0.999997 -0.000503 0.002315
+vn 0.999997 -0.000498 0.002326
+vn 0.999998 -0.000220 0.002197
+vn 0.999998 -0.000440 0.002182
+vn 0.999998 -0.000492 0.001967
+vn 0.999997 -0.000327 0.002525
+vn 0.999997 -0.000494 0.002412
+vn 0.999999 -0.000304 0.001670
+vn 0.999999 0.000000 0.001517
+vn 0.999999 -0.000336 0.001498
+vn 0.999999 -0.000105 0.001599
+vn 0.999999 -0.000465 0.001534
+vn 0.999999 -0.000318 0.001527
+vn 0.999995 -0.000721 0.002924
+vn 0.999996 -0.000228 0.002758
+vn 0.999996 -0.000597 0.002733
+vn 0.999996 -0.000412 0.002932
+vn 0.999999 -0.000157 0.001554
+vn 0.999999 -0.000203 0.001692
+vn 0.999997 -0.000544 0.002342
+vn 0.999997 -0.000349 0.002365
+vn 0.999997 -0.000377 0.002311
+vn 0.944728 0.327855 0.000000
+vn -0.998866 0.008822 -0.046775
+vn -0.999996 0.000507 0.002924
+vn 1.000000 -0.000089 -0.000506
+vn -0.999999 0.000276 0.001577
+vn 1.000000 -0.000127 -0.000716
+vn -0.999999 0.000295 0.001674
+vn 0.999997 -0.000415 -0.002411
+vn -0.999997 0.000415 0.002415
+vn -0.999997 0.000394 0.002296
+vn 0.999998 -0.000368 -0.002152
+vn 0.999998 -0.000373 -0.002156
+vn -0.999997 0.000399 0.002305
+vn -0.065375 0.983158 -0.170664
+vn 0.355426 0.160763 0.920776
+vn 0.065371 -0.983159 0.170660
+vn -0.065440 0.983121 -0.170851
+vn 0.354195 0.162521 0.920941
+vn 0.065426 -0.983121 0.170858
+vn -0.065325 0.983174 -0.170593
+vn 0.354468 0.159427 0.921377
+vn 0.065325 -0.983174 0.170591
+vn -0.064994 0.983360 -0.169642
+vn 0.355139 0.158085 0.921350
+vn 0.064958 -0.983363 0.169638
+vn -0.064908 0.983396 -0.169465
+vn 0.354994 0.159141 0.921224
+vn 0.064913 -0.983394 0.169479
+vn -0.065032 0.983333 -0.169784
+vn 0.354954 0.159832 0.921120
+vn 0.065014 -0.983335 0.169782
+vn 0.999997 -0.000222 -0.002254
+vn 0.999997 -0.000500 -0.002245
+vn 0.999997 -0.000503 -0.002315
+vn 0.999997 -0.000498 -0.002326
+vn 0.999998 -0.000220 -0.002197
+vn 0.999998 -0.000440 -0.002182
+vn 0.999998 -0.000492 -0.001967
+vn 0.999997 -0.000327 -0.002525
+vn 0.999997 -0.000494 -0.002412
+vn 0.999999 -0.000304 -0.001670
+vn 0.999999 0.000000 -0.001517
+vn 0.999999 -0.000336 -0.001498
+vn 0.999999 -0.000105 -0.001599
+vn 0.999999 -0.000465 -0.001534
+vn 0.999999 -0.000318 -0.001527
+vn 0.999995 -0.000721 -0.002924
+vn 0.999996 -0.000228 -0.002758
+vn 0.999996 -0.000597 -0.002733
+vn 0.999996 -0.000412 -0.002932
+vn 0.999999 -0.000157 -0.001554
+vn 0.999999 -0.000203 -0.001692
+vn 0.999997 -0.000544 -0.002342
+vn 0.999997 -0.000349 -0.002365
+vn 0.999997 -0.000377 -0.002311
+vn 0.944728 0.327855 0.000000
+vn -0.998866 0.008822 0.046775
+vn 0.000000 -1.000000 -0.000291
+vn 0.000000 1.000000 0.000300
+vn -0.000893 -0.000591 0.999999
+vn 0.000895 0.000592 -0.999999
+vn 0.000000 1.000000 0.000884
+vn 0.000000 -1.000000 -0.000888
+vn 0.000880 0.001178 -0.999999
+vn -0.000882 -0.001184 0.999999
+vn 0.096543 0.995329 0.000000
+vn 0.225895 -0.974152 0.000000
+vn 0.093444 0.981504 -0.167085
+vn 0.078277 0.869366 -0.487929
+vn 0.048151 0.679173 -0.732397
+vn 0.016114 0.409757 -0.912052
+vn 0.009874 0.193892 -0.980973
+vn 0.080102 -0.323205 -0.942933
+vn 0.134491 -0.628115 -0.766410
+vn 0.189452 -0.843497 -0.502614
+vn 0.220937 -0.960529 -0.169029
+vn 0.205772 -0.962646 -0.175985
+vn 0.210852 -0.977518 0.000000
+vn 0.031569 0.999502 0.000000
+vn 0.030678 0.984732 -0.171354
+vn 0.024688 0.865180 -0.500854
+vn 0.012766 0.660960 -0.750313
+vn 0.003883 0.396901 -0.917853
+vn 0.002162 0.214863 -0.976642
+vn 0.024868 -0.070126 -0.997228
+vn 0.079626 -0.365264 -0.927492
+vn 0.121403 -0.614870 -0.779228
+vn 0.174347 -0.837447 -0.517964
+vn 0.063430 -0.376392 -0.924286
+vn 0.111642 -0.601284 -0.791197
+vn 0.161824 -0.830605 -0.532831
+vn 0.192401 -0.964049 -0.183281
+vn 0.197353 -0.980332 0.000000
+vn 0.029626 0.999561 0.000000
+vn 0.028237 0.984248 -0.174523
+vn 0.022063 0.859203 -0.511159
+vn 0.012260 0.648326 -0.761264
+vn 0.004503 0.391865 -0.920012
+vn 0.002010 0.240473 -0.970654
+vn 0.005836 -0.130388 -0.991446
+vn 0.002520 0.239500 -0.970893
+vn 0.004657 -0.116984 -0.993123
+vn 0.016127 -0.190798 -0.981497
+vn 0.044936 -0.361851 -0.931152
+vn 0.085278 -0.589725 -0.803089
+vn 0.126417 -0.827960 -0.546352
+vn 0.151028 -0.969986 -0.190571
+vn 0.154960 -0.987921 0.000000
+vn 0.032230 0.999480 0.000000
+vn 0.030006 0.983103 -0.180577
+vn 0.022677 0.853219 -0.521059
+vn 0.014089 0.640435 -0.767883
+vn 0.006391 0.386887 -0.922105
+vn 0.019300 0.850624 -0.525419
+vn 0.014418 0.637512 -0.770306
+vn 0.007942 0.383236 -0.923616
+vn 0.004082 0.235712 -0.971814
+vn 0.003245 -0.108577 -0.994083
+vn 0.011353 -0.181311 -0.983360
+vn 0.031852 -0.347614 -0.937096
+vn 0.064590 -0.556543 -0.828304
+vn 0.107632 -0.819845 -0.562378
+vn 0.125923 -0.976026 -0.177531
+vn 0.122769 -0.992435 0.000000
+vn 0.019224 0.999815 0.000000
+vn 0.020491 0.983648 -0.178930
+vn 0.154402 -0.988008 0.000000
+vn 0.007829 0.999969 0.000000
+vn 0.007481 0.984219 -0.176794
+vn 0.005097 0.846608 -0.532192
+vn 0.004176 0.638782 -0.769376
+vn 0.004357 0.387784 -0.921740
+vn 0.003493 0.232368 -0.972622
+vn 0.003851 -0.097708 -0.995208
+vn 0.011886 -0.179770 -0.983637
+vn 0.064435 -0.200229 -0.977628
+vn 0.175325 -0.176463 -0.968567
+vn 0.268466 -0.638399 -0.721369
+vn 0.201092 -0.960276 -0.193473
+vn 0.280788 0.660043 -0.696779
+vn 0.696050 -0.209643 -0.686705
+vn 0.297302 -0.944222 -0.141618
+vn 0.129141 -0.991626 0.000000
+vn -0.006092 0.999981 0.000000
+vn -0.008250 0.981578 -0.190882
+vn -0.011129 0.833814 -0.551934
+vn -0.010156 0.636620 -0.771111
+vn -0.004448 0.402782 -0.915285
+vn -0.000807 0.216468 -0.976289
+vn 0.001476 -0.002218 -0.999996
+vn 0.007075 -0.206109 -0.978503
+vn 0.058209 0.055564 -0.996757
+vn 0.090270 -0.252225 -0.963449
+vn 0.076699 -0.177294 -0.981165
+vn 0.057598 -0.200244 -0.978052
+vn 0.072827 -0.223005 -0.972093
+vn 0.029634 -0.162793 -0.986215
+vn 0.042608 -0.194130 -0.980050
+vn 0.047877 -0.235596 -0.970671
+vn 0.088586 0.036443 -0.995402
+vn 0.101391 -0.044491 -0.993851
+vn 0.120682 -0.183597 -0.975565
+vn 0.892552 0.445033 -0.072774
+vn 0.889192 0.457535 0.000000
+vn 0.896724 0.389637 -0.209924
+vn 0.908323 0.294080 -0.297433
+vn 0.923173 0.167007 -0.346208
+vn 0.926185 0.059650 -0.372321
+vn 0.930481 -0.018877 -0.365854
+vn 0.932505 -0.078773 -0.352460
+vn 0.931712 -0.084581 -0.353213
+vn 0.929360 -0.047991 -0.366043
+vn 0.935095 -0.102512 -0.339246
+vn 0.939066 -0.222023 -0.262415
+vn 0.943348 -0.287376 -0.165860
+vn 0.945089 -0.322182 -0.054816
+vn 0.944161 -0.329485 0.000000
+vn 0.506738 0.862100 0.000000
+vn 0.295199 0.955436 0.000000
+vn 0.294953 0.942578 -0.156686
+vn 0.512376 0.847389 -0.139294
+vn 0.281016 0.841550 -0.461327
+vn 0.516533 0.752832 -0.407968
+vn 0.250628 0.676794 -0.692196
+vn 0.532717 0.596996 -0.599840
+vn 0.216804 0.419373 -0.881545
+vn 0.558116 0.363016 -0.746141
+vn 0.206375 0.172213 -0.963199
+vn 0.562304 0.134508 -0.815918
+vn 0.244446 -0.005427 -0.969648
+vn 0.586639 -0.032139 -0.809211
+vn 0.272488 -0.207830 -0.939445
+vn 0.601496 -0.174000 -0.779697
+vn 0.261876 -0.252058 -0.931605
+vn 0.595896 -0.192994 -0.779526
+vn 0.230128 -0.139008 -0.963181
+vn 0.579252 -0.108411 -0.807907
+vn 0.256808 -0.286024 -0.923168
+vn 0.603172 -0.231930 -0.763146
+vn 0.316493 -0.608910 -0.727366
+vn 0.633396 -0.498629 -0.591759
+vn 0.360565 -0.805607 -0.470097
+vn 0.658206 -0.651321 -0.377551
+vn 0.383849 -0.910033 -0.156526
+vn 0.669788 -0.731966 -0.124941
+vn 0.385167 -0.922847 0.000000
+vn 0.667722 -0.744411 0.000000
+vn 1.000000 -0.000003 0.000000
+vn 1.000000 -0.000020 0.000000
+vn 1.000000 -0.000004 0.000000
+vn 1.000000 -0.000004 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 -0.000005 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000006 0.000000
+vn 1.000000 -0.000005 0.000000
+vn 1.000000 0.000009 0.000000
+vn 1.000000 0.000009 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 -0.000036 0.000000
+vn 1.000000 -0.000007 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 -0.000003 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 -0.000011 0.000000
+vn 1.000000 -0.000023 0.000000
+vn 1.000000 -0.000008 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 -0.000006 0.000000
+vn 1.000000 -0.000027 0.000000
+vn 1.000000 -0.000036 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 -0.000004 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 -0.000004 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000118 0.041779 -0.999127
+vn 0.004361 -0.241410 -0.970413
+vn 0.008088 0.177899 -0.984015
+vn 0.014506 0.911985 -0.409966
+vn 0.066062 -0.997725 0.013449
+vn 0.042067 -0.999115 0.000000
+vn 0.328847 0.944383 0.000000
+vn 0.210143 0.953980 -0.213921
+vn 0.310136 0.801340 -0.511537
+vn 0.135811 0.548046 -0.825349
+vn -0.025188 0.448375 -0.893490
+vn -0.008098 0.250078 -0.968192
+vn 0.036677 0.248498 -0.967938
+vn -0.007024 0.260000 -0.965583
+vn 0.000000 0.041117 -0.999154
+vn 0.003777 -0.229714 -0.973251
+vn -0.007993 0.188495 -0.982042
+vn -0.027910 0.912583 -0.407938
+vn -0.037452 -0.998552 -0.038624
+vn -0.023984 -0.999712 0.000000
+vn 0.339704 0.940533 0.000000
+vn -0.133410 0.991061 0.000000
+vn -0.088761 0.970649 -0.223523
+vn -0.115128 0.815953 -0.566539
+vn -0.069032 0.486006 -0.871225
+vn -0.196272 0.304785 -0.931978
+vn -0.000503 0.244794 -0.969575
+vn 0.000000 0.041117 -0.999154
+vn 0.075248 -0.150999 -0.985666
+vn -0.058861 0.090750 -0.994133
+vn -0.223013 0.483736 -0.846324
+vn 0.032285 -0.055227 -0.997952
+vn 0.029338 -0.836754 -0.546792
+vn -0.048325 -0.998832 0.000000
+vn -0.116349 0.993208 0.000000
+vn -0.000728 0.285135 -0.958487
+vn 0.009044 0.233697 -0.972268
+vn -0.013201 0.132175 -0.991138
+vn -0.004652 0.310945 -0.950416
+vn -0.018855 0.447342 -0.894164
+vn 0.043458 0.440540 -0.896680
+vn 0.003916 0.157116 -0.987572
+vn 0.006671 0.275006 -0.961419
+vn -0.014593 0.201752 -0.979328
+vn -0.000354 0.275012 -0.961441
+vn -0.123125 0.363192 -0.923543
+vn -0.114732 0.318831 -0.940842
+vn 0.609271 0.792962 0.000000
+vn 0.058337 0.998297 0.000000
+vn 0.197793 0.214288 -0.956535
+vn 0.304132 0.472189 -0.827370
+vn 0.128468 0.480293 -0.867649
+vn 0.065978 0.189378 -0.979685
+vn 0.383183 0.789276 -0.479806
+vn 0.430408 0.871019 -0.236801
+vn 0.190432 0.945960 -0.262479
+vn 0.166458 0.834950 -0.524548
+vn 0.049704 0.851931 -0.521290
+vn 0.056490 0.967265 -0.247400
+vn 0.576789 0.789410 -0.210110
+vn 0.541155 0.732740 -0.412606
+vn 0.581176 0.677308 -0.451097
+vn 0.384395 0.460905 -0.799879
+vn 0.443801 0.510231 -0.736685
+vn 0.000427 0.177360 -0.984146
+vn 0.032994 0.482791 -0.875114
+vn 0.009100 0.407303 -0.913248
+vn -0.000105 0.181530 -0.983385
+vn 0.035850 0.860189 -0.508714
+vn -0.025353 0.194003 -0.980673
+vn -0.057223 0.467260 -0.882266
+vn -0.118863 0.422606 -0.898485
+vn -0.059832 0.238478 -0.969303
+vn -0.098458 0.840329 -0.533060
+vn -0.061775 0.969422 -0.237498
+vn -0.232898 0.803810 -0.547401
+vn -0.143590 -0.795741 -0.588369
+vn -0.141811 -0.967321 -0.210191
+vn -0.132215 -0.991221 0.000000
+vn 0.000000 1.000000 0.000000
+vn -0.003805 0.977194 -0.212315
+vn -0.011263 0.810119 -0.586157
+vn -0.014934 0.612838 -0.790067
+vn -0.015544 0.475502 -0.879577
+vn -0.016986 0.379868 -0.924885
+vn -0.019762 0.257273 -0.966137
+vn -0.021477 0.040608 -0.998944
+vn 0.050288 -0.085461 -0.995072
+vn -0.106372 -0.161111 -0.981187
+vn -0.111393 -0.445081 -0.888535
+vn -0.077229 -0.077284 -0.994013
+vn -0.127649 -0.242163 -0.961802
+vn -0.206479 -0.521637 -0.827805
+vn -0.271257 -0.765705 -0.583195
+vn -0.310725 -0.927582 -0.207465
+vn -0.312974 -0.949762 0.000000
+vn -0.040337 0.999186 0.000000
+vn -0.046535 0.974924 -0.217619
+vn -0.056074 0.801126 -0.595864
+vn -0.060043 0.600440 -0.797413
+vn -0.060965 0.463805 -0.883837
+vn -0.062809 0.369571 -0.927077
+vn -0.067524 0.249810 -0.965938
+vn -0.073146 0.039379 -0.996544
+vn -0.069726 0.997341 -0.021186
+vn -0.034886 0.999214 -0.018813
+vn 0.032197 0.999302 -0.018955
+vn 0.411150 0.906523 -0.095771
+vn 0.976876 0.025959 -0.212226
+vn 0.527427 -0.844375 -0.094086
+vn 0.135009 -0.990750 -0.013653
+vn -0.051866 -0.998619 -0.008406
+vn -0.103589 -0.994531 -0.013352
+vn 0.046793 0.976775 -0.209096
+vn 0.457431 0.798407 -0.391541
+vn 0.847454 -0.018415 -0.530549
+vn 0.630059 -0.666311 -0.398818
+vn 0.231409 -0.953935 -0.190937
+vn -0.043369 -0.998008 -0.045816
+vn -0.207819 -0.893378 -0.398355
+vn -0.229995 0.765419 -0.601029
+vn -0.045652 0.977629 -0.205324
+vn -0.259232 -0.528097 -0.808649
+vn -0.260944 0.261958 -0.929132
+vn -0.095869 0.521504 -0.847846
+vn 0.248125 0.539662 -0.804487
+vn 0.516214 0.366865 -0.773908
+vn 0.604854 -0.053684 -0.794525
+vn 0.612852 -0.315056 -0.724674
+vn 0.375445 -0.548659 -0.747004
+vn -0.093425 -0.706458 -0.701562
+vn 0.199035 -0.800251 -0.565670
+vn 0.042273 -0.328413 -0.943588
+vn 0.025681 0.159732 -0.986826
+vn 0.300600 -0.953750 0.000000
+vn 0.278571 -0.940195 -0.196039
+vn 0.942300 -0.334770 0.000000
+vn 0.784540 -0.620079 0.000000
+vn 0.698871 -0.703626 -0.128414
+vn 0.646387 -0.662210 -0.379027
+vn 0.545333 -0.308626 -0.779334
+vn 0.643198 0.013530 -0.765581
+vn -0.084206 0.363731 -0.927690
+vn -0.087661 0.245638 -0.965390
+vn -0.098013 0.038713 -0.994432
+vn -0.109844 -0.081303 -0.990618
+vn -0.186310 -0.240439 -0.952616
+vn -0.304684 -0.500675 -0.810242
+vn -0.401035 -0.723077 -0.562432
+vn -0.458050 -0.866633 -0.197831
+vn -0.462277 -0.886736 0.000000
+vn -0.079489 0.996836 0.000000
+vn -0.083433 0.972138 -0.219061
+vn -0.085615 0.798350 -0.596077
+vn -0.084580 0.601225 -0.794591
+vn -0.084314 0.462244 -0.882735
+vn -0.076338 0.809012 -0.582814
+vn -0.069369 0.616683 -0.784149
+vn -0.065168 0.477120 -0.876419
+vn -0.061681 0.376950 -0.924177
+vn -0.062003 0.255222 -0.964892
+vn -0.073929 0.040324 -0.996448
+vn -0.097517 -0.098392 -0.990358
+vn -0.202468 -0.260945 -0.943883
+vn -0.355273 -0.504010 -0.787245
+vn -0.475706 -0.702539 -0.529285
+vn -0.544375 -0.819047 -0.181157
+vn -0.551755 -0.834006 0.000000
+vn -0.079275 0.996853 0.000000
+vn -0.080490 0.973956 -0.211972
+vn -0.292192 -0.956360 0.000000
+vn 0.005911 0.999983 0.000000
+vn -0.010045 0.957199 -0.289256
+vn -0.037078 0.765770 -0.642045
+vn -0.049204 0.630291 -0.774798
+vn -0.051020 0.489962 -0.870250
+vn -0.052345 0.388216 -0.920081
+vn -0.056114 0.263335 -0.963071
+vn -0.064667 0.041643 -0.997038
+vn -0.077768 -0.131092 -0.988315
+vn -0.127193 -0.302169 -0.944731
+vn -0.199676 -0.542251 -0.816146
+vn -0.258426 -0.782296 -0.566771
+vn -0.290983 -0.935773 -0.199146
+vn -0.081828 -0.522507 -0.848699
+vn -0.087270 -0.774273 -0.626805
+vn -0.090272 -0.966499 -0.240272
+vn -0.088629 -0.996065 0.000000
+vn 0.091958 0.995763 0.000000
+vn 0.035578 0.626193 -0.778856
+vn -0.023493 0.613633 -0.789242
+vn -0.042544 0.598927 -0.799673
+vn -0.049535 0.459947 -0.886564
+vn -0.054183 0.371894 -0.926692
+vn -0.061990 0.293182 -0.954045
+vn -0.069005 -0.000585 -0.997616
+vn -0.068773 -0.159516 -0.984797
+vn -0.074360 -0.316209 -0.945771
+vn -0.156648 -0.039216 -0.986876
+vn -0.131359 -0.173162 -0.976094
+vn -0.134864 -0.288527 -0.947926
+vn -0.155348 -0.454765 -0.876958
+vn -0.186067 -0.682064 -0.707225
+vn -0.221422 -0.924455 -0.310412
+vn -0.223083 -0.974799 0.000000
+vn -0.016518 0.019447 -0.999674
+vn -0.047409 0.316835 -0.947295
+vn -0.082045 0.496204 -0.864321
+vn -0.089743 0.368982 -0.925094
+vn -0.097611 0.337583 -0.936221
+vn -0.138302 0.279381 -0.950168
+vn -0.129405 0.305064 -0.943499
+vn -0.144895 0.317413 -0.937152
+vn -0.182430 0.240311 -0.953399
+vn -0.205468 -0.016514 -0.978525
+vn -0.196732 -0.176165 -0.964501
+vn -0.191382 -0.265461 -0.944936
+vn -0.215512 -0.415006 -0.883926
+vn -0.258760 -0.620424 -0.740350
+vn -0.316544 -0.883601 -0.345034
+vn -0.316717 -0.948520 0.000000
+vn -0.076263 0.023801 -0.996804
+vn -0.095773 0.259282 -0.961041
+vn -0.117053 0.420661 -0.899635
+vn 0.261876 -0.252058 0.931605
+vn 0.272488 -0.207830 0.939445
+vn 0.120682 -0.183597 0.975565
+vn 0.090270 -0.252224 0.963449
+vn 0.294953 0.942577 0.156687
+vn 0.093444 0.981504 0.167085
+vn 0.383850 -0.910033 0.156526
+vn 0.220937 -0.960529 0.169029
+vn -0.076263 0.023801 0.996804
+vn -0.316544 -0.883602 0.345034
+vn -0.258760 -0.620423 0.740350
+vn -0.215512 -0.415005 0.883926
+vn -0.191382 -0.265461 0.944936
+vn -0.196732 -0.176166 0.964501
+vn -0.205468 -0.016515 0.978525
+vn -0.182430 0.240311 0.953399
+vn -0.144895 0.317413 0.937152
+vn -0.129405 0.305064 0.943499
+vn -0.117053 0.420661 0.899635
+vn -0.095773 0.259282 0.961041
+vn 0.009874 0.193892 0.980973
+vn 0.206375 0.172213 0.963199
+vn 0.216804 0.419374 0.881545
+vn 0.016114 0.409757 0.912052
+vn 0.230128 -0.139008 0.963181
+vn 0.076699 -0.177294 0.981165
+vn 0.080102 -0.323205 0.942933
+vn 0.256808 -0.286024 0.923168
+vn 0.048151 0.679173 0.732397
+vn 0.250628 0.676795 0.692196
+vn 0.281017 0.841550 0.461327
+vn 0.078277 0.869366 0.487929
+vn 0.088586 0.036443 0.995402
+vn 0.244446 -0.005428 0.969648
+vn 0.316493 -0.608910 0.727366
+vn 0.134491 -0.628115 0.766410
+vn 0.189452 -0.843497 0.502614
+vn 0.360565 -0.805606 0.470097
+vn 0.205772 -0.962646 0.175985
+vn 0.030678 0.984732 0.171354
+vn 0.024688 0.865180 0.500854
+vn 0.012766 0.660960 0.750313
+vn 0.003883 0.396901 0.917853
+vn 0.002162 0.214863 0.976642
+vn 0.024868 -0.070126 0.997228
+vn 0.101391 -0.044491 0.993851
+vn 0.057598 -0.200244 0.978052
+vn 0.072827 -0.223005 0.972093
+vn 0.079626 -0.365264 0.927492
+vn 0.121403 -0.614870 0.779228
+vn 0.174347 -0.837447 0.517964
+vn 0.063430 -0.376392 0.924286
+vn 0.111642 -0.601284 0.791197
+vn 0.161824 -0.830605 0.532831
+vn 0.192401 -0.964049 0.183281
+vn 0.028237 0.984248 0.174523
+vn 0.022063 0.859203 0.511159
+vn 0.012260 0.648326 0.761264
+vn 0.004503 0.391865 0.920012
+vn 0.002010 0.240473 0.970654
+vn 0.005836 -0.130388 0.991446
+vn 0.029634 -0.162793 0.986215
+vn 0.047877 -0.235596 0.970671
+vn 0.004657 -0.116984 0.993123
+vn 0.016127 -0.190798 0.981497
+vn 0.042608 -0.194130 0.980050
+vn 0.044936 -0.361851 0.931152
+vn 0.085278 -0.589725 0.803089
+vn 0.126417 -0.827960 0.546352
+vn 0.151028 -0.969986 0.190571
+vn 0.030006 0.983103 0.180577
+vn 0.022677 0.853219 0.521059
+vn 0.014089 0.640435 0.767883
+vn 0.006391 0.386887 0.922105
+vn 0.002520 0.239500 0.970893
+vn 0.019300 0.850624 0.525419
+vn 0.014418 0.637512 0.770306
+vn 0.007942 0.383236 0.923616
+vn 0.004082 0.235712 0.971814
+vn 0.003246 -0.108577 0.994083
+vn 0.011353 -0.181311 0.983360
+vn 0.031852 -0.347614 0.937096
+vn 0.064590 -0.556543 0.828304
+vn 0.107632 -0.819845 0.562378
+vn 0.125923 -0.976026 0.177531
+vn 0.020491 0.983648 0.178930
+vn 0.007481 0.984219 0.176794
+vn 0.005097 0.846608 0.532192
+vn 0.004176 0.638782 0.769376
+vn 0.004357 0.387784 0.921740
+vn 0.003493 0.232368 0.972622
+vn 0.003852 -0.097708 0.995208
+vn 0.011886 -0.179770 0.983637
+vn 0.064435 -0.200229 0.977628
+vn 0.175325 -0.176463 0.968567
+vn 0.268466 -0.638399 0.721369
+vn 0.201092 -0.960276 0.193473
+vn 0.280788 0.660043 0.696779
+vn 0.696050 -0.209643 0.686705
+vn 0.297302 -0.944222 0.141618
+vn -0.008250 0.981578 0.190882
+vn -0.011129 0.833814 0.551934
+vn -0.010156 0.636620 0.771111
+vn -0.004448 0.402782 0.915285
+vn -0.000807 0.216468 0.976289
+vn 0.001476 -0.002218 0.999996
+vn 0.007075 -0.206109 0.978503
+vn 0.058209 0.055564 0.996757
+vn 0.512377 0.847389 0.139294
+vn 0.892555 0.445027 0.072774
+vn 0.896726 0.389633 0.209924
+vn 0.516532 0.752833 0.407968
+vn 0.908323 0.294081 0.297433
+vn 0.532717 0.596997 0.599839
+vn 0.923173 0.167008 0.346207
+vn 0.558116 0.363016 0.746140
+vn 0.926185 0.059651 0.372321
+vn 0.562304 0.134509 0.815918
+vn 0.930481 -0.018877 0.365854
+vn 0.586638 -0.032140 0.809211
+vn 0.932505 -0.078773 0.352460
+vn 0.601496 -0.174000 0.779697
+vn 0.595896 -0.192994 0.779526
+vn 0.931712 -0.084581 0.353213
+vn 0.929360 -0.047991 0.366043
+vn 0.579252 -0.108411 0.807907
+vn 0.935095 -0.102512 0.339246
+vn 0.603172 -0.231930 0.763146
+vn 0.939066 -0.222023 0.262415
+vn 0.633396 -0.498629 0.591759
+vn 0.943348 -0.287375 0.165860
+vn 0.658208 -0.651320 0.377552
+vn 0.945090 -0.322181 0.054816
+vn 0.669789 -0.731964 0.124941
+vn 1.000000 0.000000 0.000000
+vn 1.000000 -0.000017 0.000000
+vn 1.000000 -0.000013 0.000000
+vn 1.000000 -0.000004 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 -0.000005 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 -0.000003 0.000000
+vn 1.000000 -0.000013 0.000000
+vn 1.000000 0.000009 0.000000
+vn 1.000000 0.000009 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 -0.000036 0.000000
+vn 1.000000 -0.000027 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 -0.000003 0.000000
+vn 1.000000 -0.000009 0.000000
+vn 1.000000 -0.000020 0.000000
+vn 1.000000 -0.000023 0.000000
+vn 1.000000 -0.000008 0.000000
+vn 1.000000 -0.000036 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 -0.000003 0.000000
+vn 1.000000 -0.000006 0.000000
+vn 1.000000 -0.000013 0.000000
+vn 1.000000 -0.000004 0.000000
+vn 0.000118 0.041779 0.999127
+vn 0.004361 -0.241410 0.970413
+vn 0.008088 0.177899 0.984015
+vn 0.014506 0.911985 0.409966
+vn -0.260943 0.261958 0.929132
+vn -0.259232 -0.528097 0.808649
+vn -0.093425 -0.706458 0.701562
+vn -0.095869 0.521504 0.847846
+vn 0.066062 -0.997725 -0.013449
+vn 0.210143 0.953980 0.213921
+vn 0.310136 0.801340 0.511537
+vn 0.135811 0.548046 0.825349
+vn -0.025188 0.448375 0.893490
+vn -0.008098 0.250078 0.968192
+vn 0.443801 0.510231 0.736685
+vn 0.384395 0.460904 0.799880
+vn 0.197793 0.214288 0.956535
+vn 0.036677 0.248498 0.967938
+vn 0.043458 0.440540 0.896680
+vn -0.018855 0.447342 0.894164
+vn -0.004652 0.310945 0.950416
+vn -0.007024 0.260000 0.965583
+vn 0.000000 0.041117 0.999154
+vn 0.003777 -0.229714 0.973251
+vn -0.007993 0.188495 0.982042
+vn -0.027910 0.912583 0.407938
+vn -0.037452 -0.998552 0.038624
+vn 0.576789 0.789410 0.210110
+vn 0.541156 0.732739 0.412607
+vn 0.581176 0.677308 0.451097
+vn -0.232898 0.803810 0.547401
+vn -0.098458 0.840329 0.533060
+vn -0.061775 0.969422 0.237498
+vn -0.088761 0.970649 0.223523
+vn -0.115128 0.815953 0.566539
+vn -0.057223 0.467260 0.882266
+vn -0.069032 0.486006 0.871225
+vn -0.118863 0.422606 0.898485
+vn -0.059832 0.238478 0.969303
+vn -0.123125 0.363192 0.923543
+vn -0.014593 0.201752 0.979328
+vn -0.000503 0.244794 0.969575
+vn 0.006671 0.275006 0.961419
+vn -0.000354 0.275012 0.961441
+vn -0.114732 0.318831 0.940842
+vn 0.000000 0.041117 0.999154
+vn 0.075248 -0.150999 0.985666
+vn -0.058861 0.090750 0.994133
+vn -0.223013 0.483736 0.846324
+vn 0.029338 -0.836754 0.546792
+vn 0.056490 0.967265 0.247401
+vn 0.032994 0.482791 0.875114
+vn 0.049705 0.851930 0.521291
+vn 0.035850 0.860189 0.508714
+vn 0.009100 0.407303 0.913248
+vn -0.196272 0.304785 0.931978
+vn 0.065978 0.189378 0.979685
+vn 0.000427 0.177360 0.984146
+vn -0.013201 0.132175 0.991138
+vn 0.003916 0.157116 0.987572
+vn 0.009044 0.233697 0.972268
+vn -0.000728 0.285135 0.958487
+vn 0.383184 0.789275 0.479807
+vn 0.304132 0.472188 0.827371
+vn 0.166458 0.834949 0.524549
+vn 0.128468 0.480293 0.867649
+vn 0.430408 0.871019 0.236801
+vn 0.190432 0.945960 0.262480
+vn -0.000105 0.181530 0.983385
+vn -0.025353 0.194003 0.980673
+vn -0.106372 -0.161111 0.981187
+vn -0.111393 -0.445081 0.888535
+vn 0.032285 -0.055227 0.997952
+vn -0.003805 0.977194 0.212315
+vn -0.011263 0.810119 0.586157
+vn -0.014934 0.612838 0.790067
+vn -0.015544 0.475502 0.879577
+vn -0.016986 0.379868 0.924885
+vn -0.019762 0.257273 0.966137
+vn -0.021477 0.040608 0.998944
+vn 0.050288 -0.085461 0.995072
+vn -0.077229 -0.077284 0.994013
+vn -0.127649 -0.242163 0.961802
+vn -0.206479 -0.521637 0.827805
+vn -0.271257 -0.765705 0.583195
+vn -0.143590 -0.795741 0.588369
+vn -0.310725 -0.927582 0.207465
+vn -0.141811 -0.967321 0.210191
+vn -0.046535 0.974924 0.217619
+vn -0.056074 0.801126 0.595864
+vn -0.060043 0.600440 0.797413
+vn -0.060965 0.463805 0.883837
+vn -0.062809 0.369571 0.927077
+vn -0.067524 0.249810 0.965938
+vn -0.073146 0.039379 0.996544
+vn 0.646387 -0.662210 0.379027
+vn 0.698871 -0.703626 0.128414
+vn 0.643198 0.013530 0.765581
+vn 0.545333 -0.308626 0.779334
+vn -0.069726 0.997341 0.021186
+vn -0.034886 0.999214 0.018813
+vn 0.032197 0.999302 0.018955
+vn 0.411150 0.906523 0.095771
+vn 0.976876 0.025959 0.212226
+vn 0.527427 -0.844375 0.094086
+vn 0.135008 -0.990750 0.013653
+vn -0.051866 -0.998619 0.008406
+vn -0.103589 -0.994531 0.013352
+vn 0.046793 0.976775 0.209096
+vn 0.457431 0.798407 0.391541
+vn 0.847454 -0.018415 0.530549
+vn 0.630058 -0.666312 0.398818
+vn 0.231408 -0.953936 0.190937
+vn -0.043369 -0.998008 0.045816
+vn -0.207819 -0.893378 0.398356
+vn -0.229995 0.765419 0.601029
+vn -0.045652 0.977629 0.205324
+vn 0.248124 0.539662 0.804487
+vn 0.516213 0.366866 0.773908
+vn 0.604853 -0.053684 0.794526
+vn 0.612852 -0.315056 0.724674
+vn 0.375444 -0.548659 0.747005
+vn 0.199035 -0.800251 0.565670
+vn 0.042273 -0.328413 0.943588
+vn 0.025681 0.159732 0.986826
+vn 0.278571 -0.940195 0.196039
+vn -0.084206 0.363731 0.927690
+vn -0.087661 0.245638 0.965390
+vn -0.098013 0.038713 0.994432
+vn -0.109844 -0.081303 0.990618
+vn -0.186310 -0.240439 0.952616
+vn -0.304684 -0.500675 0.810242
+vn -0.401035 -0.723077 0.562432
+vn -0.458050 -0.866633 0.197831
+vn -0.083433 0.972138 0.219061
+vn -0.085615 0.798350 0.596077
+vn -0.084581 0.601225 0.794591
+vn -0.084315 0.462244 0.882735
+vn -0.076338 0.809012 0.582814
+vn -0.069369 0.616683 0.784149
+vn -0.065168 0.477120 0.876419
+vn -0.061681 0.376950 0.924177
+vn -0.062003 0.255222 0.964892
+vn -0.073929 0.040324 0.996448
+vn -0.097517 -0.098392 0.990358
+vn -0.202468 -0.260945 0.943883
+vn -0.355274 -0.504010 0.787245
+vn -0.475706 -0.702539 0.529285
+vn -0.544375 -0.819047 0.181157
+vn -0.080490 0.973956 0.211972
+vn -0.010045 0.957199 0.289256
+vn -0.037078 0.765770 0.642045
+vn -0.049204 0.630291 0.774798
+vn -0.051020 0.489962 0.870250
+vn -0.052345 0.388216 0.920081
+vn -0.056114 0.263335 0.963071
+vn -0.064667 0.041643 0.997038
+vn -0.077768 -0.131092 0.988315
+vn -0.127193 -0.302169 0.944731
+vn -0.199676 -0.542251 0.816146
+vn -0.258426 -0.782296 0.566771
+vn -0.290983 -0.935773 0.199146
+vn -0.081828 -0.522507 0.848699
+vn -0.087270 -0.774273 0.626805
+vn -0.090272 -0.966499 0.240272
+vn 0.035578 0.626193 0.778856
+vn -0.023493 0.613633 0.789242
+vn -0.042544 0.598927 0.799673
+vn -0.049535 0.459947 0.886564
+vn -0.054183 0.371894 0.926692
+vn -0.061990 0.293182 0.954045
+vn -0.069005 -0.000585 0.997616
+vn -0.068773 -0.159516 0.984797
+vn -0.074360 -0.316209 0.945771
+vn -0.156648 -0.039216 0.986876
+vn -0.131359 -0.173162 0.976094
+vn -0.134864 -0.288527 0.947926
+vn -0.155348 -0.454765 0.876958
+vn -0.186067 -0.682064 0.707225
+vn -0.221422 -0.924455 0.310412
+vn -0.016518 0.019447 0.999674
+vn -0.047409 0.316835 0.947295
+vn -0.082045 0.496204 0.864321
+vn -0.089743 0.368982 0.925094
+vn -0.097611 0.337583 0.936221
+vn -0.138302 0.279380 0.950168
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.022725 0.984893 0.171666
+vn 0.715093 0.688205 0.122535
+vn 0.700503 -0.703494 -0.119966
+vn -0.018573 -0.984982 -0.171657
+vn 0.442431 0.581662 -0.682586
+vn 0.828765 0.201586 -0.522027
+vn 0.595042 0.762626 -0.253627
+vn 0.073398 0.993862 -0.082776
+vn 0.186778 0.813074 -0.551384
+vn 0.271517 0.532244 -0.801870
+vn 0.312600 0.295061 -0.902896
+vn 0.406128 0.246469 -0.879950
+vn 0.384743 0.412823 -0.825560
+vn 0.374997 -0.108303 -0.920678
+vn 0.402864 0.068195 -0.912716
+vn 0.307486 0.029894 -0.951083
+vn 0.256398 -0.229557 -0.938916
+vn 0.158240 -0.581157 -0.798258
+vn 0.033661 -0.908984 -0.415470
+vn 0.576129 -0.641576 -0.506414
+vn 0.827259 -0.011722 -0.561698
+vn 0.427580 -0.317928 -0.846225
+vn 0.000045 0.985135 0.171780
+vn 0.000045 0.985135 0.171780
+vn -0.005544 -0.985119 -0.171785
+vn -0.005544 -0.985119 -0.171785
+vn 0.377820 0.593820 -0.710373
+vn 0.577384 0.292620 -0.762235
+vn 0.268424 0.910044 -0.315860
+vn 0.036618 0.995773 -0.084236
+vn 0.122776 0.819215 -0.560190
+vn 0.190407 0.540732 -0.819362
+vn 0.224767 0.301336 -0.926648
+vn 0.325503 0.252839 -0.911109
+vn 0.307451 0.421201 -0.853267
+vn 0.306652 -0.106375 -0.945859
+vn 0.325248 0.070885 -0.942968
+vn 0.224404 0.031012 -0.974003
+vn 0.189302 -0.229516 -0.954718
+vn 0.119973 -0.580100 -0.805662
+vn 0.031666 -0.908463 -0.416765
+vn 0.264101 -0.749828 -0.606637
+vn 0.576238 -0.017632 -0.817092
+vn 0.375761 -0.317792 -0.870524
+vn 0.008960 0.985157 0.171423
+vn 0.008960 0.985157 0.171423
+vn 0.000935 -0.985198 -0.171416
+vn 0.000935 -0.985198 -0.171416
+vn 0.373069 0.592621 -0.713876
+vn 0.569460 0.296695 -0.766608
+vn 0.270451 0.908442 -0.318732
+vn 0.043793 0.995221 -0.087272
+vn 0.123610 0.815411 -0.565531
+vn 0.184339 0.537627 -0.822786
+vn 0.214410 0.302118 -0.928845
+vn 0.315467 0.254667 -0.914126
+vn 0.299932 0.420076 -0.856491
+vn 0.297474 -0.103792 -0.949071
+vn 0.314621 0.073484 -0.946369
+vn 0.213042 0.032909 -0.976489
+vn 0.180362 -0.227654 -0.956892
+vn 0.117003 -0.577311 -0.808098
+vn 0.035696 -0.907578 -0.418365
+vn 0.265422 -0.747956 -0.608369
+vn 0.570069 -0.015393 -0.821453
+vn 0.370563 -0.315056 -0.873741
+vn 0.016785 0.985270 0.170180
+vn 0.016785 0.985270 0.170180
+vn -0.011599 -0.985345 -0.170180
+vn -0.011599 -0.985345 -0.170180
+vn 0.263594 -0.100529 -0.959381
+vn 0.279464 0.073947 -0.957304
+vn 0.176949 0.033429 -0.983652
+vn 0.147213 -0.223117 -0.963612
+vn 0.158458 0.532069 -0.831741
+vn 0.180876 0.299274 -0.936867
+vn 0.282002 0.252841 -0.925498
+vn 0.270953 0.416038 -0.868042
+vn 0.349082 0.591007 -0.727223
+vn 0.539755 0.302162 -0.785725
+vn 0.260661 0.907674 -0.328912
+vn 0.046183 0.994578 -0.093173
+vn 0.110928 0.810103 -0.575698
+vn 0.090567 -0.571837 -0.815352
+vn 0.018597 -0.906518 -0.421758
+vn 0.239519 -0.748313 -0.618594
+vn 0.537460 -0.019386 -0.843066
+vn 0.338057 -0.313692 -0.887308
+vn 0.011307 0.985318 0.170356
+vn 0.011307 0.985318 0.170356
+vn -0.014082 -0.985281 -0.170364
+vn -0.014082 -0.985281 -0.170364
+vn 0.198078 0.531781 -0.823392
+vn 0.229448 0.296405 -0.927091
+vn 0.327668 0.248963 -0.911400
+vn 0.311452 0.414058 -0.855309
+vn 0.305501 -0.103344 -0.946567
+vn 0.325647 0.070835 -0.942834
+vn 0.226346 0.031618 -0.973534
+vn 0.189093 -0.224545 -0.955941
+vn 0.380063 0.587823 -0.714154
+vn 0.573061 0.292839 -0.765406
+vn 0.274385 0.906358 -0.321290
+vn 0.048915 0.994705 -0.090387
+vn 0.133893 0.811542 -0.568746
+vn 0.116769 -0.574284 -0.810286
+vn 0.024644 -0.907276 -0.419813
+vn 0.255015 -0.749365 -0.611081
+vn 0.570098 -0.020160 -0.821329
+vn 0.370111 -0.315507 -0.873770
+vn 0.000000 0.989089 0.147320
+vn 0.000000 0.867991 0.496580
+vn 0.000000 0.649261 0.760565
+vn 0.000000 1.000000 0.000000
+vn 0.000000 -0.435535 0.900172
+vn 0.000000 -0.240696 0.970601
+vn 0.000000 0.253023 0.967460
+vn 0.000000 0.649261 0.760565
+vn 0.000000 0.253023 0.967460
+vn 0.000000 -0.240696 0.970601
+vn 0.000000 -0.435535 0.900172
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.989089 0.147320
+vn 0.000000 0.867991 0.496580
+vn 0.000000 -0.435535 -0.900172
+vn 0.000000 -0.240696 -0.970601
+vn 0.000000 0.253023 -0.967460
+vn 0.000000 0.649261 -0.760565
+vn 0.000000 0.867991 -0.496580
+vn 0.000000 0.989089 -0.147320
+vn 0.000000 0.989089 -0.147320
+vn 0.000000 0.867991 -0.496580
+vn 0.000000 0.649261 -0.760565
+vn 0.000000 0.253023 -0.967460
+vn 0.000000 -0.435535 -0.900172
+vn 0.000000 -0.240696 -0.970601
+vn 0.000000 -0.996917 0.078467
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -0.996917 0.078467
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -0.996917 -0.078467
+vn 0.000000 -0.996917 -0.078467
+vn 0.715131 0.688397 0.121236
+vn 0.700465 -0.703326 -0.121167
+vn 0.011480 0.985103 0.171583
+vn -0.012163 -0.985095 -0.171583
+vn 0.005298 0.985155 0.171583
+vn -0.002312 -0.985168 -0.171577
+vn 0.012748 0.985087 0.171583
+vn -0.004690 -0.985159 -0.171580
+vn 0.013175 0.985082 0.171580
+vn -0.012238 -0.985094 -0.171583
+vn -0.703094 0.700778 0.120703
+vn -0.712068 -0.691469 -0.121780
+vn 0.206549 0.360936 -0.909430
+vn 0.620159 0.681677 -0.388226
+vn 0.011378 0.975827 -0.218247
+vn 0.004881 0.415620 -0.909525
+vn 0.005059 0.975327 -0.220709
+vn 0.001946 0.414682 -0.909965
+vn 0.012601 0.974265 -0.225051
+vn 0.005085 0.410836 -0.911695
+vn 0.013212 0.974751 -0.222903
+vn 0.005680 0.411152 -0.911549
+vn -0.194631 0.359866 -0.912477
+vn -0.604869 0.690602 -0.396488
+vn -0.199265 -0.031938 -0.979425
+vn -0.614347 -0.511882 -0.600463
+vn -0.010591 -0.845778 -0.533430
+vn -0.001003 -0.085844 -0.996308
+vn -0.004126 -0.845554 -0.533874
+vn -0.000144 -0.084531 -0.996421
+vn -0.001988 -0.844281 -0.535897
+vn -0.000113 -0.081623 -0.996663
+vn -0.010430 -0.844321 -0.535737
+vn -0.001048 -0.082229 -0.996613
+vn 0.198338 -0.030174 -0.979669
+vn 0.604471 -0.517660 -0.605511
+vn 0.003711 0.314682 -0.949190
+vn 0.000216 0.021923 -0.999760
+vn 0.003838 0.172336 -0.985031
+vn 0.003839 0.172840 -0.984942
+vn 0.003440 0.172849 -0.984942
+vn 0.003438 0.172345 -0.985031
+vn 0.000274 0.173246 -0.984879
+vn 0.000273 0.172451 -0.985018
+vn 0.000736 0.172449 -0.985018
+vn 0.000738 0.173244 -0.984879
+vn 0.001126 0.171499 -0.985184
+vn 0.001135 0.172987 -0.984923
+vn 0.000307 0.172983 -0.984925
+vn 0.000298 0.171496 -0.985185
+vn 0.002659 0.169704 -0.985491
+vn 0.002665 0.170604 -0.985336
+vn 0.002240 0.170612 -0.985336
+vn 0.002235 0.169712 -0.985491
+vn 0.002312 0.169531 -0.985522
+vn 0.002312 0.169945 -0.985451
+vn 0.002063 0.169948 -0.985451
+vn 0.002062 0.169533 -0.985522
+vn 0.002073 0.170681 -0.985324
+vn 0.002073 0.170262 -0.985397
+vn 0.002324 0.170258 -0.985397
+vn 0.002323 0.170677 -0.985324
+vn -0.014108 -0.985357 -0.169922
+vn -0.014108 -0.985357 -0.169922
+vn 0.011333 0.985393 0.169920
+vn 0.011333 0.985393 0.169920
+vn 0.378848 0.586557 -0.715839
+vn 0.570944 0.292955 -0.766942
+vn 0.273360 0.905956 -0.323293
+vn 0.049134 0.994534 -0.092129
+vn 0.134209 0.809746 -0.571226
+vn 0.198240 0.529544 -0.824793
+vn 0.229467 0.295026 -0.927526
+vn 0.327183 0.247842 -0.911880
+vn 0.311016 0.412253 -0.856339
+vn 0.305018 -0.102621 -0.946801
+vn 0.325144 0.070697 -0.943018
+vn 0.226340 0.031675 -0.973533
+vn 0.189188 -0.223278 -0.956219
+vn 0.116991 -0.572707 -0.811369
+vn 0.024774 -0.906943 -0.420524
+vn 0.253881 -0.748981 -0.612023
+vn 0.567951 -0.020955 -0.822796
+vn 0.368814 -0.314888 -0.874541
+vn -0.999996 0.000537 -0.002923
+vn -0.999996 0.000503 -0.002922
+vn -0.999996 0.000510 -0.002920
+vn -0.999996 0.000503 -0.002922
+vn -0.999996 0.000537 -0.002923
+vn -0.999996 0.000527 -0.002921
+vn -0.999996 0.000519 -0.002945
+vn -0.999996 0.000519 -0.002945
+vn -0.999996 0.000537 -0.002923
+vn -0.999996 0.000527 -0.002921
+vn -0.999996 0.000517 -0.002918
+vn -0.999996 0.000517 -0.002918
+vn -0.999996 0.000519 -0.002945
+vn -0.999995 0.000521 -0.002972
+vn -0.999995 0.000521 -0.002972
+vn -0.999996 0.000519 -0.002945
+vn -0.999996 0.000518 -0.002918
+vn -0.999996 0.000518 -0.002918
+vn -0.999996 0.000510 -0.002920
+vn -0.999996 0.000503 -0.002922
+vn -0.999999 0.000263 -0.001577
+vn -0.999999 0.000266 -0.001576
+vn -0.999999 0.000290 -0.001571
+vn -0.999999 0.000266 -0.001576
+vn -0.999999 0.000263 -0.001577
+vn -0.999999 0.000251 -0.001575
+vn -0.999999 0.000263 -0.001562
+vn -0.999999 0.000298 -0.001560
+vn -0.999999 0.000251 -0.001588
+vn -0.999999 0.000251 -0.001575
+vn -0.999999 0.000251 -0.001563
+vn -0.999999 0.000251 -0.001563
+vn -0.999999 0.000263 -0.001562
+vn -0.999999 0.000275 -0.001562
+vn -0.999999 0.000275 -0.001562
+vn -0.999999 0.000298 -0.001560
+vn -0.999999 0.000322 -0.001557
+vn -0.999999 0.000322 -0.001557
+vn -0.999999 0.000290 -0.001571
+vn -0.999999 0.000258 -0.001586
+vn -0.999999 0.000267 -0.001698
+vn -0.999999 0.000318 -0.001693
+vn -0.999999 0.000324 -0.001651
+vn -0.999999 0.000318 -0.001693
+vn -0.999999 0.000267 -0.001698
+vn -0.999999 0.000243 -0.001661
+vn -0.999999 0.000261 -0.001635
+vn -0.999999 0.000291 -0.001631
+vn -0.999999 0.000238 -0.001674
+vn -0.999999 0.000243 -0.001661
+vn -0.999999 0.000249 -0.001648
+vn -0.999999 0.000249 -0.001648
+vn -0.999999 0.000261 -0.001635
+vn -0.999999 0.000274 -0.001622
+vn -0.999999 0.000274 -0.001622
+vn -0.999999 0.000291 -0.001631
+vn -0.999999 0.000308 -0.001639
+vn -0.999999 0.000308 -0.001639
+vn -0.999999 0.000324 -0.001651
+vn -0.999999 0.000340 -0.001664
+vn -0.999997 0.000426 -0.002415
+vn -0.999997 0.000399 -0.002412
+vn -0.999997 0.000405 -0.002410
+vn -0.999997 0.000399 -0.002412
+vn -0.999997 0.000426 -0.002415
+vn -0.999997 0.000425 -0.002407
+vn -0.999997 0.000423 -0.002415
+vn -0.999997 0.000430 -0.002421
+vn -0.999997 0.000430 -0.002432
+vn -0.999997 0.000430 -0.002421
+vn -0.999997 0.000430 -0.002409
+vn -0.999997 0.000416 -0.002398
+vn -0.999997 0.000423 -0.002415
+vn -0.999997 0.000430 -0.002432
+vn -0.999997 0.000435 -0.002417
+vn -0.999997 0.000425 -0.002407
+vn -0.999997 0.000416 -0.002398
+vn -0.999997 0.000430 -0.002409
+vn -0.999997 0.000405 -0.002410
+vn -0.999997 0.000381 -0.002411
+vn -0.999997 0.000382 -0.002297
+vn -0.999997 0.000410 -0.002293
+vn -0.999997 0.000378 -0.002306
+vn -0.999997 0.000382 -0.002297
+vn -0.999997 0.000410 -0.002293
+vn -0.999997 0.000398 -0.002302
+vn -0.999997 0.000387 -0.002292
+vn -0.999997 0.000395 -0.002292
+vn -0.999997 0.000421 -0.002300
+vn -0.999997 0.000398 -0.002302
+vn -0.999997 0.000374 -0.002304
+vn -0.999997 0.000374 -0.002304
+vn -0.999997 0.000387 -0.002292
+vn -0.999997 0.000400 -0.002280
+vn -0.999997 0.000400 -0.002280
+vn -0.999997 0.000395 -0.002292
+vn -0.999997 0.000389 -0.002303
+vn -0.999997 0.000389 -0.002303
+vn -0.999997 0.000378 -0.002306
+vn -0.999997 0.000367 -0.002308
+vn -0.999997 0.000397 -0.002306
+vn -0.999997 0.000397 -0.002304
+vn -0.999997 0.000400 -0.002299
+vn -0.999997 0.000397 -0.002304
+vn -0.999997 0.000397 -0.002306
+vn -0.999997 0.000393 -0.002301
+vn -0.999997 0.000394 -0.002295
+vn -0.999997 0.000400 -0.002295
+vn -0.999997 0.000393 -0.002292
+vn -0.999997 0.000394 -0.002295
+vn -0.999997 0.000395 -0.002297
+vn -0.999997 0.000395 -0.002297
+vn -0.999997 0.000400 -0.002295
+vn -0.999997 0.000406 -0.002292
+vn -0.999997 0.000394 -0.002310
+vn -0.999997 0.000393 -0.002301
+vn -0.999997 0.000393 -0.002292
+vn -0.999997 0.000406 -0.002292
+vn -0.999997 0.000400 -0.002299
+vn -0.999997 0.000394 -0.002305
+vn -0.320848 0.452536 0.832026
+vn -0.248976 -0.723191 0.644210
+vn -0.318726 -0.466155 0.825296
+vn -0.355692 0.153461 0.921918
+vn -0.248976 -0.723191 0.644210
+vn -0.318726 -0.466155 0.825296
+vn -0.355692 0.153461 0.921918
+vn -0.320848 0.452536 0.832026
+vn -0.319376 0.455816 0.830801
+vn -0.246432 -0.727554 0.640263
+vn -0.316994 -0.469739 0.823930
+vn -0.354603 0.154404 0.922180
+vn -0.246432 -0.727554 0.640263
+vn -0.316994 -0.469739 0.823930
+vn -0.354603 0.154404 0.922180
+vn -0.319376 0.455816 0.830801
+vn -0.320639 0.449217 0.833903
+vn -0.249649 -0.719205 0.648397
+vn -0.318344 -0.463006 0.827213
+vn -0.354789 0.152294 0.922459
+vn -0.249649 -0.719205 0.648397
+vn -0.318344 -0.463006 0.827213
+vn -0.354789 0.152294 0.922459
+vn -0.320639 0.449217 0.833903
+vn -0.322035 0.444116 0.836095
+vn -0.252301 -0.713292 0.653880
+vn -0.319726 -0.458638 0.829112
+vn -0.355476 0.150154 0.922545
+vn -0.252301 -0.713292 0.653880
+vn -0.319726 -0.458638 0.829112
+vn -0.355476 0.150154 0.922545
+vn -0.322035 0.444116 0.836095
+vn -0.321724 0.445479 0.835489
+vn -0.251485 -0.715305 0.651992
+vn -0.319321 -0.460392 0.828296
+vn -0.355391 0.150376 0.922542
+vn -0.251485 -0.715305 0.651992
+vn -0.319321 -0.460392 0.828296
+vn -0.355391 0.150376 0.922542
+vn -0.321724 0.445479 0.835489
+vn -0.321362 0.447485 0.834556
+vn -0.250590 -0.717758 0.649637
+vn -0.318969 -0.462268 0.827386
+vn -0.355342 0.151132 0.922438
+vn -0.250590 -0.717758 0.649637
+vn -0.318969 -0.462268 0.827386
+vn -0.355342 0.151132 0.922438
+vn -0.321362 0.447485 0.834556
+vn -0.970111 -0.069859 -0.232388
+vn -0.970111 -0.069859 -0.232388
+vn -0.970111 -0.069859 -0.232388
+vn -0.971427 -0.076347 -0.224723
+vn -0.971427 -0.076347 -0.224723
+vn -0.972644 -0.082827 -0.217034
+vn -0.972644 -0.082827 -0.217034
+vn 0.134640 0.975921 0.171614
+vn 0.136667 0.990617 0.000000
+vn -0.002541 0.998628 0.052302
+vn -0.002544 0.999997 0.000000
+vn -0.139967 0.990156 0.000000
+vn -0.139636 0.987812 -0.068765
+vn 0.134640 0.975921 -0.171614
+vn -0.139636 0.987812 0.068765
+vn -0.002541 0.998628 -0.052302
+vn 0.981127 0.034773 -0.190211
+vn 0.981127 0.034773 -0.190211
+vn -0.312100 0.225050 -0.923009
+vn -0.595290 0.201461 -0.777845
+vn 0.306742 0.205567 -0.929328
+vn 0.840628 0.107966 -0.530743
+vn -0.312100 0.225050 -0.923009
+vn -0.595290 0.201461 -0.777845
+vn 0.306742 0.205567 -0.929328
+vn 0.840628 0.107966 -0.530743
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn -0.004017 0.999087 -0.042538
+vn -0.004017 0.999087 -0.042538
+vn -0.000997 0.936958 -0.349442
+vn -0.002538 0.980110 -0.198437
+vn -0.000997 0.936958 -0.349442
+vn -0.002538 0.980110 -0.198437
+vn -0.013807 -0.998955 0.043566
+vn -0.013807 -0.998955 0.043566
+vn -0.019315 -0.946567 -0.321928
+vn -0.016851 -0.989778 -0.141615
+vn -0.019315 -0.946567 -0.321928
+vn -0.016851 -0.989778 -0.141615
+vn 0.402864 0.068194 0.912716
+vn 0.406128 0.246469 0.879950
+vn 0.312600 0.295061 0.902896
+vn 0.307486 0.029892 0.951083
+vn 0.022725 0.984893 -0.171666
+vn 0.715093 0.688205 -0.122535
+vn 0.700503 -0.703494 0.119966
+vn -0.018573 -0.984982 0.171657
+vn 0.595042 0.762626 0.253627
+vn 0.828765 0.201587 0.522027
+vn 0.827259 -0.011721 0.561698
+vn 0.576129 -0.641576 0.506414
+vn 0.033661 -0.908984 0.415470
+vn 0.073398 0.993862 0.082776
+vn 0.271517 0.532244 0.801870
+vn 0.384743 0.412823 0.825560
+vn 0.442431 0.581663 0.682586
+vn 0.186778 0.813074 0.551384
+vn 0.374997 -0.108304 0.920678
+vn 0.256398 -0.229559 0.938916
+vn 0.158240 -0.581157 0.798258
+vn 0.427580 -0.317928 0.846225
+vn 0.325247 0.070884 0.942969
+vn 0.325503 0.252839 0.911109
+vn 0.224766 0.301336 0.926648
+vn 0.224404 0.031012 0.974003
+vn 0.000045 0.985135 -0.171780
+vn 0.000045 0.985135 -0.171780
+vn -0.005544 -0.985119 0.171785
+vn -0.005544 -0.985119 0.171785
+vn 0.268424 0.910044 0.315860
+vn 0.577384 0.292619 0.762235
+vn 0.576238 -0.017633 0.817092
+vn 0.264101 -0.749828 0.606637
+vn 0.031666 -0.908463 0.416765
+vn 0.036618 0.995773 0.084236
+vn 0.190407 0.540732 0.819362
+vn 0.307451 0.421200 0.853267
+vn 0.377820 0.593820 0.710374
+vn 0.122776 0.819215 0.560190
+vn 0.306651 -0.106375 0.945859
+vn 0.189302 -0.229514 0.954719
+vn 0.119974 -0.580098 0.805663
+vn 0.375760 -0.317791 0.870525
+vn 0.314621 0.073484 0.946369
+vn 0.315467 0.254668 0.914125
+vn 0.214410 0.302118 0.928845
+vn 0.213042 0.032909 0.976489
+vn 0.008960 0.985157 -0.171423
+vn 0.008960 0.985157 -0.171423
+vn 0.000935 -0.985198 0.171416
+vn 0.000935 -0.985198 0.171416
+vn 0.270451 0.908442 0.318732
+vn 0.569460 0.296695 0.766607
+vn 0.570069 -0.015392 0.821452
+vn 0.265422 -0.747956 0.608370
+vn 0.035696 -0.907577 0.418365
+vn 0.043793 0.995221 0.087273
+vn 0.184339 0.537627 0.822786
+vn 0.299932 0.420077 0.856491
+vn 0.373069 0.592621 0.713876
+vn 0.123610 0.815411 0.565531
+vn 0.297475 -0.103792 0.949071
+vn 0.180362 -0.227654 0.956892
+vn 0.117003 -0.577311 0.808098
+vn 0.370563 -0.315056 0.873741
+vn 0.279465 0.073947 0.957304
+vn 0.282002 0.252840 0.925498
+vn 0.180876 0.299273 0.936867
+vn 0.176949 0.033429 0.983652
+vn 0.016785 0.985270 -0.170180
+vn 0.016785 0.985270 -0.170180
+vn -0.011599 -0.985345 0.170180
+vn -0.011599 -0.985345 0.170180
+vn 0.260660 0.907674 0.328912
+vn 0.539755 0.302161 0.785724
+vn 0.537461 -0.019386 0.843066
+vn 0.239519 -0.748313 0.618594
+vn 0.018597 -0.906518 0.421758
+vn 0.046183 0.994578 0.093173
+vn 0.158458 0.532068 0.831742
+vn 0.270953 0.416038 0.868042
+vn 0.349082 0.591007 0.727223
+vn 0.110928 0.810103 0.575698
+vn 0.263594 -0.100530 0.959381
+vn 0.147213 -0.223117 0.963612
+vn 0.090567 -0.571837 0.815352
+vn 0.338058 -0.313692 0.887307
+vn 0.325647 0.070835 0.942834
+vn 0.327669 0.248962 0.911401
+vn 0.229448 0.296405 0.927091
+vn 0.226346 0.031619 0.973534
+vn 0.011307 0.985318 -0.170356
+vn 0.011307 0.985318 -0.170356
+vn -0.014082 -0.985281 0.170364
+vn -0.014082 -0.985281 0.170364
+vn 0.274385 0.906358 0.321290
+vn 0.573061 0.292838 0.765406
+vn 0.570098 -0.020161 0.821329
+vn 0.255015 -0.749365 0.611080
+vn 0.024644 -0.907276 0.419813
+vn 0.048915 0.994705 0.090387
+vn 0.198078 0.531780 0.823392
+vn 0.311452 0.414057 0.855310
+vn 0.380064 0.587822 0.714155
+vn 0.133893 0.811541 0.568747
+vn 0.305501 -0.103345 0.946567
+vn 0.189093 -0.224545 0.955941
+vn 0.116769 -0.574285 0.810285
+vn 0.370111 -0.315508 0.873769
+vn 0.715131 0.688397 -0.121236
+vn 0.700465 -0.703326 0.121167
+vn 0.011480 0.985103 -0.171583
+vn -0.012163 -0.985095 0.171583
+vn -0.002312 -0.985168 0.171577
+vn 0.005298 0.985155 -0.171583
+vn 0.012748 0.985087 -0.171582
+vn -0.004690 -0.985159 0.171580
+vn 0.013175 0.985082 -0.171579
+vn -0.012238 -0.985094 0.171583
+vn -0.703094 0.700778 -0.120703
+vn -0.712068 -0.691469 0.121780
+vn 0.011378 0.975827 0.218247
+vn 0.620159 0.681677 0.388226
+vn 0.604471 -0.517660 0.605511
+vn -0.010430 -0.844321 0.535737
+vn -0.001988 -0.844281 0.535897
+vn -0.004126 -0.845554 0.533874
+vn -0.010591 -0.845778 0.533430
+vn -0.614347 -0.511882 0.600463
+vn -0.604869 0.690602 0.396488
+vn 0.013212 0.974751 0.222904
+vn 0.012601 0.974265 0.225051
+vn 0.005059 0.975327 0.220709
+vn 0.004881 0.415620 0.909525
+vn 0.206549 0.360936 0.909430
+vn 0.001946 0.414682 0.909965
+vn 0.005085 0.410836 0.911695
+vn 0.005680 0.411152 0.911549
+vn -0.194631 0.359866 0.912478
+vn 0.003711 0.314682 0.949190
+vn -0.001003 -0.085844 0.996308
+vn 0.000217 0.021923 0.999760
+vn -0.199265 -0.031938 0.979425
+vn -0.000144 -0.084531 0.996421
+vn -0.000113 -0.081623 0.996663
+vn -0.001048 -0.082229 0.996613
+vn 0.198338 -0.030174 0.979669
+vn 0.003838 0.172336 0.985031
+vn 0.003839 0.172840 0.984942
+vn 0.003440 0.172849 0.984942
+vn 0.003439 0.172345 0.985031
+vn 0.000275 0.173246 0.984879
+vn 0.000273 0.172450 0.985018
+vn 0.000736 0.172449 0.985018
+vn 0.000738 0.173244 0.984879
+vn 0.001127 0.171499 0.985184
+vn 0.001135 0.172987 0.984924
+vn 0.000307 0.172983 0.984925
+vn 0.000299 0.171496 0.985185
+vn 0.002659 0.169704 0.985491
+vn 0.002665 0.170604 0.985336
+vn 0.002240 0.170612 0.985336
+vn 0.002235 0.169712 0.985491
+vn 0.002312 0.169531 0.985522
+vn 0.002313 0.169945 0.985451
+vn 0.002064 0.169948 0.985451
+vn 0.002062 0.169533 0.985522
+vn 0.002073 0.170681 0.985324
+vn 0.002073 0.170261 0.985397
+vn 0.002324 0.170257 0.985397
+vn 0.002323 0.170677 0.985324
+vn 0.229467 0.295025 0.927526
+vn 0.226340 0.031675 0.973533
+vn 0.325144 0.070696 0.943018
+vn 0.327183 0.247841 0.911880
+vn -0.014108 -0.985357 0.169922
+vn -0.014108 -0.985357 0.169922
+vn 0.011333 0.985393 -0.169919
+vn 0.011333 0.985393 -0.169919
+vn 0.049134 0.994534 0.092129
+vn 0.273360 0.905956 0.323293
+vn 0.570944 0.292954 0.766942
+vn 0.567951 -0.020956 0.822796
+vn 0.253881 -0.748980 0.612024
+vn 0.024774 -0.906943 0.420524
+vn 0.198240 0.529543 0.824794
+vn 0.311016 0.412252 0.856340
+vn 0.378848 0.586557 0.715839
+vn 0.134209 0.809746 0.571226
+vn 0.305018 -0.102622 0.946801
+vn 0.189188 -0.223278 0.956219
+vn 0.116991 -0.572706 0.811370
+vn 0.368814 -0.314888 0.874541
+vn -0.999995 0.000526 0.002972
+vn -0.999995 0.000526 0.002972
+vn -0.999996 0.000515 0.002902
+vn -0.999996 0.000512 0.002902
+vn -0.999996 0.000516 0.002922
+vn -0.999996 0.000523 0.002923
+vn -0.999996 0.000534 0.002918
+vn -0.999996 0.000534 0.002918
+vn -0.999996 0.000513 0.002918
+vn -0.999996 0.000513 0.002918
+vn -0.999996 0.000515 0.002920
+vn -0.999996 0.000515 0.002920
+vn -0.999996 0.000512 0.002902
+vn -0.999996 0.000515 0.002902
+vn -0.999996 0.000529 0.002921
+vn -0.999996 0.000529 0.002921
+vn -0.999996 0.000530 0.002945
+vn -0.999996 0.000530 0.002945
+vn -0.999996 0.000520 0.002945
+vn -0.999996 0.000520 0.002945
+vn -0.999999 0.000281 0.001562
+vn -0.999999 0.000281 0.001562
+vn -0.999999 0.000254 0.001577
+vn -0.999999 0.000265 0.001576
+vn -0.999999 0.000258 0.001586
+vn -0.999999 0.000238 0.001588
+vn -0.999999 0.000251 0.001563
+vn -0.999999 0.000251 0.001563
+vn -0.999999 0.000318 0.001557
+vn -0.999999 0.000318 0.001557
+vn -0.999999 0.000288 0.001571
+vn -0.999999 0.000288 0.001571
+vn -0.999999 0.000265 0.001576
+vn -0.999999 0.000254 0.001577
+vn -0.999999 0.000245 0.001575
+vn -0.999999 0.000245 0.001575
+vn -0.999999 0.000266 0.001562
+vn -0.999999 0.000266 0.001562
+vn -0.999999 0.000299 0.001560
+vn -0.999999 0.000299 0.001560
+vn -0.999999 0.000274 0.001622
+vn -0.999999 0.000274 0.001622
+vn -0.999999 0.000261 0.001698
+vn -0.999999 0.000312 0.001693
+vn -0.999999 0.000326 0.001664
+vn -0.999999 0.000224 0.001674
+vn -0.999999 0.000231 0.001648
+vn -0.999999 0.000231 0.001648
+vn -0.999999 0.000308 0.001639
+vn -0.999999 0.000308 0.001639
+vn -0.999999 0.000317 0.001651
+vn -0.999999 0.000317 0.001651
+vn -0.999999 0.000312 0.001693
+vn -0.999999 0.000261 0.001698
+vn -0.999999 0.000228 0.001661
+vn -0.999999 0.000228 0.001661
+vn -0.999999 0.000253 0.001635
+vn -0.999999 0.000253 0.001635
+vn -0.999999 0.000291 0.001631
+vn -0.999999 0.000291 0.001631
+vn -0.999997 0.000430 0.002432
+vn -0.999997 0.000430 0.002432
+vn -0.999997 0.000421 0.002415
+vn -0.999997 0.000397 0.002412
+vn -0.999997 0.000374 0.002411
+vn -0.999997 0.000421 0.002417
+vn -0.999997 0.000399 0.002398
+vn -0.999997 0.000399 0.002398
+vn -0.999997 0.000413 0.002409
+vn -0.999997 0.000413 0.002409
+vn -0.999997 0.000394 0.002410
+vn -0.999997 0.000394 0.002410
+vn -0.999997 0.000397 0.002412
+vn -0.999997 0.000421 0.002415
+vn -0.999997 0.000410 0.002407
+vn -0.999997 0.000410 0.002407
+vn -0.999997 0.000415 0.002415
+vn -0.999997 0.000415 0.002415
+vn -0.999997 0.000422 0.002421
+vn -0.999997 0.000422 0.002421
+vn -0.999997 0.000395 0.002280
+vn -0.999997 0.000395 0.002280
+vn -0.999997 0.000381 0.002297
+vn -0.999997 0.000408 0.002293
+vn -0.999997 0.000421 0.002300
+vn -0.999997 0.000367 0.002308
+vn -0.999997 0.000374 0.002304
+vn -0.999997 0.000374 0.002304
+vn -0.999997 0.000398 0.002303
+vn -0.999997 0.000398 0.002303
+vn -0.999997 0.000382 0.002306
+vn -0.999997 0.000382 0.002306
+vn -0.999997 0.000381 0.002297
+vn -0.999997 0.000408 0.002293
+vn -0.999997 0.000398 0.002302
+vn -0.999997 0.000398 0.002302
+vn -0.999997 0.000385 0.002292
+vn -0.999997 0.000385 0.002292
+vn -0.999997 0.000396 0.002292
+vn -0.999997 0.000396 0.002292
+vn -0.999997 0.000400 0.002297
+vn -0.999997 0.000400 0.002297
+vn -0.999997 0.000389 0.002306
+vn -0.999997 0.000392 0.002304
+vn -0.999997 0.000387 0.002305
+vn -0.999997 0.000381 0.002310
+vn -0.999997 0.000410 0.002292
+vn -0.999997 0.000410 0.002292
+vn -0.999997 0.000402 0.002292
+vn -0.999997 0.000402 0.002292
+vn -0.999997 0.000395 0.002299
+vn -0.999997 0.000395 0.002299
+vn -0.999997 0.000392 0.002304
+vn -0.999997 0.000389 0.002306
+vn -0.999997 0.000395 0.002301
+vn -0.999997 0.000395 0.002301
+vn -0.999997 0.000405 0.002295
+vn -0.999997 0.000405 0.002295
+vn -0.999997 0.000401 0.002295
+vn -0.999997 0.000401 0.002295
+vn -0.320849 0.452532 -0.832028
+vn -0.355692 0.153456 -0.921919
+vn -0.318725 -0.466157 -0.825295
+vn -0.248976 -0.723191 -0.644210
+vn -0.320849 0.452532 -0.832028
+vn -0.248976 -0.723191 -0.644210
+vn -0.318725 -0.466157 -0.825295
+vn -0.355692 0.153456 -0.921919
+vn -0.319376 0.455816 -0.830801
+vn -0.354603 0.154405 -0.922180
+vn -0.316994 -0.469738 -0.823930
+vn -0.246432 -0.727554 -0.640263
+vn -0.319376 0.455816 -0.830801
+vn -0.246432 -0.727554 -0.640263
+vn -0.316994 -0.469738 -0.823930
+vn -0.354603 0.154405 -0.922180
+vn -0.320639 0.449217 -0.833903
+vn -0.354789 0.152293 -0.922460
+vn -0.318344 -0.463010 -0.827211
+vn -0.249647 -0.719210 -0.648393
+vn -0.320639 0.449217 -0.833903
+vn -0.249647 -0.719210 -0.648393
+vn -0.318344 -0.463010 -0.827211
+vn -0.354789 0.152293 -0.922460
+vn -0.322034 0.444120 -0.836093
+vn -0.355476 0.150156 -0.922545
+vn -0.319726 -0.458635 -0.829113
+vn -0.252303 -0.713288 -0.653884
+vn -0.322034 0.444120 -0.836093
+vn -0.252303 -0.713288 -0.653884
+vn -0.319726 -0.458635 -0.829113
+vn -0.355476 0.150156 -0.922545
+vn -0.321724 0.445479 -0.835489
+vn -0.355391 0.150376 -0.922542
+vn -0.319321 -0.460392 -0.828296
+vn -0.251485 -0.715305 -0.651992
+vn -0.321724 0.445479 -0.835489
+vn -0.251485 -0.715305 -0.651992
+vn -0.319321 -0.460392 -0.828296
+vn -0.355391 0.150376 -0.922542
+vn -0.321362 0.447485 -0.834556
+vn -0.355342 0.151131 -0.922438
+vn -0.318969 -0.462269 -0.827385
+vn -0.250590 -0.717758 -0.649637
+vn -0.321362 0.447485 -0.834556
+vn -0.250590 -0.717758 -0.649637
+vn -0.318969 -0.462269 -0.827385
+vn -0.355342 0.151131 -0.922438
+vn -0.970111 -0.069859 0.232388
+vn -0.970111 -0.069859 0.232388
+vn -0.970111 -0.069859 0.232388
+vn -0.971427 -0.076347 0.224723
+vn -0.971427 -0.076347 0.224723
+vn -0.972644 -0.082827 0.217034
+vn -0.972644 -0.082827 0.217034
+vn 0.981127 0.034773 0.190211
+vn 0.981127 0.034773 0.190211
+vn 0.306742 0.205567 0.929328
+vn -0.312100 0.225050 0.923009
+vn -0.312100 0.225050 0.923009
+vn 0.306742 0.205567 0.929328
+vn -0.595290 0.201461 0.777845
+vn 0.840628 0.107966 0.530743
+vn 0.840628 0.107966 0.530743
+vn -0.595290 0.201461 0.777845
+vn -0.004017 0.999087 0.042538
+vn -0.004017 0.999087 0.042538
+vn -0.000997 0.936958 0.349442
+vn -0.000997 0.936958 0.349442
+vn -0.002538 0.980110 0.198437
+vn -0.002538 0.980110 0.198437
+vn -0.013807 -0.998955 -0.043566
+vn -0.013807 -0.998955 -0.043566
+vn -0.019315 -0.946567 0.321928
+vn -0.019315 -0.946567 0.321928
+vn -0.016851 -0.989778 0.141615
+vn -0.016851 -0.989778 0.141615
+vn 0.570725 -0.158007 0.805796
+vn 0.570725 -0.158007 0.805796
+vn 0.587402 -0.281827 0.758639
+vn 0.587402 -0.281827 0.758639
+vn 0.480805 -0.016031 0.876681
+vn 0.480805 -0.016031 0.876681
+vn 0.353177 0.012506 0.935473
+vn 0.353177 0.012506 0.935473
+vn 0.243935 0.033631 0.969208
+vn 0.243935 0.033631 0.969208
+vn 0.157199 0.051399 0.986229
+vn 0.157199 0.051399 0.986229
+vn 0.084379 0.075629 0.993559
+vn 0.084379 0.075629 0.993559
+vn 0.033769 0.063145 0.997433
+vn 0.033769 0.063145 0.997433
+vn 0.015354 0.036135 0.999229
+vn 0.015354 0.036135 0.999229
+vn -0.587515 -0.280783 -0.758938
+vn -0.587515 -0.280783 -0.758938
+vn -0.570788 -0.156897 -0.805968
+vn -0.570788 -0.156897 -0.805968
+vn -0.480813 -0.014845 -0.876698
+vn -0.480813 -0.014845 -0.876698
+vn -0.353185 0.013729 -0.935453
+vn -0.353185 0.013729 -0.935453
+vn -0.243948 0.034872 -0.969161
+vn -0.243948 0.034872 -0.969161
+vn -0.157203 0.052645 -0.986162
+vn -0.157203 0.052645 -0.986162
+vn -0.084367 0.076875 -0.993465
+vn -0.084367 0.076875 -0.993465
+vn -0.033760 0.064397 -0.997353
+vn -0.033760 0.064397 -0.997353
+vn -0.015355 0.037392 -0.999183
+vn -0.015355 0.037392 -0.999183
+vn -0.817737 -0.000196 0.575592
+vn -0.793345 -0.000210 0.608772
+vn -0.877559 -0.000153 0.479469
+vn -0.935258 -0.000100 0.353967
+vn -0.969245 -0.000059 0.246097
+vn -0.987125 -0.000030 0.159949
+vn -0.996183 -0.000009 0.087295
+vn -0.999376 0.000000 0.035320
+vn -0.999880 0.000000 0.015480
+vn -0.793345 -0.000210 0.608772
+vn -0.817737 -0.000196 0.575592
+vn -0.877559 -0.000153 0.479469
+vn -0.935258 -0.000100 0.353967
+vn -0.969245 -0.000059 0.246097
+vn -0.987125 -0.000030 0.159949
+vn -0.996183 -0.000009 0.087295
+vn -0.999376 0.000000 0.035320
+vn -0.999880 0.000000 0.015480
+vn 0.817737 0.000141 -0.575592
+vn 0.793346 0.000145 -0.608771
+vn 0.877558 0.000130 -0.479471
+vn 0.935257 0.000111 -0.353970
+vn 0.969245 0.000090 -0.246098
+vn 0.987126 0.000070 -0.159947
+vn 0.996183 0.000047 -0.087289
+vn 0.999376 0.000017 -0.035315
+vn 0.999880 0.000000 -0.015479
+vn 0.793346 0.000145 -0.608771
+vn 0.817737 0.000141 -0.575592
+vn 0.877558 0.000130 -0.479471
+vn 0.935257 0.000111 -0.353970
+vn 0.969245 0.000090 -0.246098
+vn 0.987126 0.000070 -0.159947
+vn 0.996183 0.000047 -0.087289
+vn 0.999376 0.000017 -0.035315
+vn 0.999880 0.000000 -0.015479
+vn 0.571305 0.805237 0.158754
+vn 0.571305 0.805237 0.158754
+vn 0.587841 0.758020 0.282575
+vn 0.587841 0.758020 0.282575
+vn 0.481563 0.876252 0.016719
+vn 0.481563 0.876252 0.016719
+vn 0.354021 0.935161 -0.011916
+vn 0.354021 0.935161 -0.011916
+vn 0.244838 0.968998 -0.033128
+vn 0.244838 0.968998 -0.033128
+vn 0.158130 0.986102 -0.050966
+vn 0.158130 0.986102 -0.050966
+vn 0.085334 0.993506 -0.075258
+vn 0.085334 0.993506 -0.075258
+vn 0.034714 0.997421 -0.062822
+vn 0.034714 0.997421 -0.062822
+vn 0.016276 0.999225 -0.035835
+vn 0.016276 0.999225 -0.035835
+vn -0.588445 -0.758492 0.280040
+vn -0.588445 -0.758492 0.280040
+vn -0.571649 -0.805503 0.156151
+vn -0.571649 -0.805503 0.156151
+vn -0.481596 -0.876279 0.014157
+vn -0.481596 -0.876279 0.014157
+vn -0.353988 -0.935140 -0.014319
+vn -0.353988 -0.935140 -0.014319
+vn -0.244773 -0.968935 -0.035376
+vn -0.244773 -0.968935 -0.035376
+vn -0.158039 -0.986005 -0.053080
+vn -0.158039 -0.986005 -0.053080
+vn -0.085197 -0.993365 -0.077249
+vn -0.085197 -0.993365 -0.077249
+vn -0.034599 -0.997303 -0.064730
+vn -0.034599 -0.997303 -0.064730
+vn -0.016211 -0.999157 -0.037715
+vn -0.016211 -0.999157 -0.037715
+vn -0.817224 0.576320 -0.000359
+vn -0.792804 0.609476 -0.000312
+vn -0.877131 0.480251 -0.000484
+vn -0.934942 0.354799 -0.000627
+vn -0.969026 0.246958 -0.000730
+vn -0.986983 0.160824 -0.000799
+vn -0.996104 0.088178 -0.000851
+vn -0.999344 0.036206 -0.000873
+vn -0.999866 0.016365 -0.000872
+vn -0.792804 0.609476 -0.000312
+vn -0.817224 0.576320 -0.000359
+vn -0.877131 0.480251 -0.000484
+vn -0.934942 0.354799 -0.000627
+vn -0.969026 0.246958 -0.000730
+vn -0.986983 0.160824 -0.000799
+vn -0.996104 0.088178 -0.000851
+vn -0.999344 0.036206 -0.000873
+vn -0.999866 0.016365 -0.000872
+vn 0.817225 -0.576318 0.000413
+vn 0.792804 -0.609476 0.000376
+vn 0.877132 -0.480248 0.000507
+vn 0.934943 -0.354797 0.000615
+vn 0.969027 -0.246955 0.000700
+vn 0.986983 -0.160823 0.000763
+vn 0.996104 -0.088181 0.000812
+vn 0.999344 -0.036213 0.000855
+vn 0.999865 -0.016376 0.000877
+vn 0.792804 -0.609476 0.000376
+vn 0.817225 -0.576318 0.000413
+vn 0.877132 -0.480248 0.000507
+vn 0.934943 -0.354797 0.000615
+vn 0.969027 -0.246955 0.000700
+vn 0.986983 -0.160823 0.000763
+vn 0.996104 -0.088181 0.000812
+vn 0.999344 -0.036213 0.000855
+vn 0.999865 -0.016376 0.000877
+vn 0.572169 0.158484 -0.804677
+vn 0.572169 0.158484 -0.804677
+vn 0.588769 0.282275 -0.757411
+vn 0.588769 0.282275 -0.757411
+vn 0.482358 0.016550 -0.875818
+vn 0.482358 0.016550 -0.875818
+vn 0.354828 -0.011952 -0.934855
+vn 0.354828 -0.011952 -0.934855
+vn 0.245657 -0.033058 -0.968793
+vn 0.245657 -0.033058 -0.968793
+vn 0.158956 -0.050815 -0.985977
+vn 0.158956 -0.050815 -0.985977
+vn 0.086151 -0.075040 -0.993452
+vn 0.086151 -0.075040 -0.993452
+vn 0.035547 -0.062564 -0.997408
+vn 0.035547 -0.062564 -0.997408
+vn 0.017135 -0.035565 -0.999220
+vn 0.017135 -0.035565 -0.999220
+vn -0.588871 0.280332 0.758053
+vn -0.588871 0.280332 0.758053
+vn -0.572224 0.156417 0.805042
+vn -0.572224 0.156417 0.805042
+vn -0.482362 0.014327 0.875855
+vn -0.482362 0.014327 0.875855
+vn -0.354833 -0.014280 0.934820
+vn -0.354833 -0.014280 0.934820
+vn -0.245657 -0.035446 0.968709
+vn -0.245657 -0.035446 0.968709
+vn -0.158950 -0.053231 0.985851
+vn -0.158950 -0.053231 0.985851
+vn -0.086145 -0.077466 0.993266
+vn -0.086145 -0.077466 0.993266
+vn -0.035538 -0.064996 0.997252
+vn -0.035538 -0.064996 0.997252
+vn -0.017123 -0.038001 0.999131
+vn -0.017123 -0.038001 0.999131
+vn -0.816712 0.000541 -0.577046
+vn -0.792262 0.000577 -0.610181
+vn -0.876704 0.000438 -0.481029
+vn -0.934627 0.000309 -0.355630
+vn -0.968806 0.000205 -0.247821
+vn -0.986839 0.000125 -0.161704
+vn -0.996026 0.000059 -0.089068
+vn -0.999312 0.000022 -0.037098
+vn -0.999851 0.000016 -0.017259
+vn -0.792262 0.000577 -0.610181
+vn -0.816712 0.000541 -0.577046
+vn -0.876704 0.000438 -0.481029
+vn -0.934627 0.000309 -0.355630
+vn -0.968806 0.000205 -0.247821
+vn -0.986839 0.000125 -0.161704
+vn -0.996026 0.000059 -0.089068
+vn -0.999312 0.000022 -0.037098
+vn -0.999851 0.000016 -0.017259
+vn 0.816712 -0.000483 0.577046
+vn 0.792260 -0.000506 0.610183
+vn 0.876706 -0.000414 0.481027
+vn 0.934627 -0.000321 0.355629
+vn 0.968806 -0.000236 0.247820
+vn 0.986839 -0.000162 0.161703
+vn 0.996026 -0.000101 0.089063
+vn 0.999312 -0.000044 0.037092
+vn 0.999851 -0.000012 0.017254
+vn 0.792260 -0.000506 0.610183
+vn 0.816712 -0.000483 0.577046
+vn 0.876706 -0.000414 0.481027
+vn 0.934627 -0.000321 0.355629
+vn 0.968806 -0.000236 0.247820
+vn 0.986839 -0.000162 0.161703
+vn 0.996026 -0.000101 0.089063
+vn 0.999312 -0.000044 0.037092
+vn 0.999851 -0.000012 0.017254
+vn 0.571587 -0.805144 -0.158216
+vn 0.571587 -0.805144 -0.158216
+vn 0.588342 -0.757853 -0.281980
+vn 0.588342 -0.757853 -0.281980
+vn 0.481591 -0.876243 -0.016382
+vn 0.481591 -0.876243 -0.016382
+vn 0.353996 -0.935170 0.011990
+vn 0.353996 -0.935170 0.011990
+vn 0.244775 -0.969019 0.032988
+vn 0.244775 -0.969019 0.032988
+vn 0.158032 -0.986133 0.050662
+vn 0.158032 -0.986133 0.050662
+vn 0.085188 -0.993552 0.074822
+vn 0.085188 -0.993552 0.074822
+vn 0.034597 -0.997458 0.062295
+vn 0.034597 -0.997458 0.062295
+vn 0.016214 -0.999246 0.035272
+vn 0.016214 -0.999246 0.035272
+vn -0.587936 0.758667 -0.280635
+vn -0.587936 0.758667 -0.280635
+vn -0.571369 0.805597 -0.156688
+vn -0.571369 0.805597 -0.156688
+vn -0.481582 0.876281 -0.014493
+vn -0.481582 0.876281 -0.014493
+vn -0.354017 0.935130 0.014243
+vn -0.354017 0.935130 0.014243
+vn -0.244826 0.968916 0.035515
+vn -0.244826 0.968916 0.035515
+vn -0.158119 0.985976 0.053382
+vn -0.158119 0.985976 0.053382
+vn -0.085314 0.993321 0.077686
+vn -0.085314 0.993321 0.077686
+vn -0.034697 0.997265 0.065257
+vn -0.034697 0.997265 0.065257
+vn -0.016267 0.999135 0.038270
+vn -0.016267 0.999135 0.038270
+vn -0.817224 -0.576318 -0.001436
+vn -0.792802 -0.609478 -0.001459
+vn -0.877132 -0.480248 -0.001360
+vn -0.934942 -0.354798 -0.001246
+vn -0.969026 -0.246957 -0.001141
+vn -0.986982 -0.160825 -0.001051
+vn -0.996104 -0.088178 -0.000970
+vn -0.999344 -0.036204 -0.000926
+vn -0.999866 -0.016365 -0.000917
+vn -0.792802 -0.609478 -0.001459
+vn -0.817224 -0.576318 -0.001436
+vn -0.877132 -0.480248 -0.001360
+vn -0.934942 -0.354798 -0.001246
+vn -0.969026 -0.246957 -0.001141
+vn -0.986982 -0.160825 -0.001051
+vn -0.996104 -0.088178 -0.000970
+vn -0.999344 -0.036204 -0.000926
+vn -0.999866 -0.016365 -0.000917
+vn 0.817223 0.576319 0.001382
+vn 0.792803 0.609477 0.001397
+vn 0.877131 0.480249 0.001337
+vn 0.934941 0.354800 0.001258
+vn 0.969025 0.246960 0.001168
+vn 0.986983 0.160823 0.001087
+vn 0.996104 0.088177 0.001012
+vn 0.999344 0.036208 0.000943
+vn 0.999866 0.016369 0.000908
+vn 0.792803 0.609477 0.001397
+vn 0.817223 0.576319 0.001382
+vn 0.877131 0.480249 0.001337
+vn 0.934941 0.354800 0.001258
+vn 0.969025 0.246960 0.001168
+vn 0.986983 0.160823 0.001087
+vn 0.996104 0.088177 0.001012
+vn 0.999344 0.036208 0.000943
+vn 0.999866 0.016369 0.000908
+vn 1.000000 -0.000151 0.000553
+vn 0.663679 0.748017 0.000623
+vn 0.443030 0.896507 0.000533
+vn 0.236823 0.971553 0.000430
+vn 0.148338 0.988937 0.000381
+vn 0.663901 0.647840 -0.373549
+vn 0.443295 0.776443 -0.447912
+vn 0.237109 0.841439 -0.485551
+vn 0.148629 0.856494 -0.494295
+vn 0.664063 0.374136 -0.647335
+vn 0.443489 0.448405 -0.776048
+vn 0.237321 0.485942 -0.841153
+vn 0.148844 0.494637 -0.856259
+vn 0.664122 0.000218 -0.747624
+vn 0.443560 0.000264 -0.896245
+vn 0.237398 0.000286 -0.971412
+vn 0.148924 0.000292 -0.988849
+vn 0.664062 -0.373756 -0.647555
+vn 0.443489 -0.447946 -0.776313
+vn 0.237321 -0.485443 -0.841442
+vn 0.148846 -0.494127 -0.856553
+vn 0.663902 -0.647617 -0.373933
+vn 0.443294 -0.776177 -0.448374
+vn 0.237111 -0.841149 -0.486053
+vn 0.148632 -0.856199 -0.494805
+vn 0.663681 -0.748016 -0.000052
+vn 0.443029 -0.896507 -0.000270
+vn 0.236822 -0.971553 -0.000435
+vn 0.148339 -0.988936 -0.000498
+vn 0.663459 -0.648061 0.373951
+vn 0.442763 -0.776708 0.447979
+vn 0.236534 -0.841726 0.485335
+vn 0.148046 -0.856786 0.493964
+vn 0.663297 -0.374516 0.647900
+vn 0.442570 -0.448867 0.776306
+vn 0.236324 -0.486442 0.841145
+vn 0.147832 -0.495146 0.856141
+vn 0.663238 -0.000662 0.748408
+vn 0.442499 -0.000795 0.896769
+vn 0.236247 -0.000862 0.971693
+vn 0.147753 -0.000878 0.989024
+vn 0.663295 0.373366 0.648565
+vn 0.442569 0.447487 0.777102
+vn 0.236325 0.484946 0.842008
+vn 0.147832 0.493623 0.857019
+vn 0.663458 0.647509 0.374908
+vn 0.442765 0.776044 0.449127
+vn 0.236536 0.841006 0.486580
+vn 0.148047 0.856053 0.495232
+vn -1.000000 0.000000 -0.000591
+vn -1.000000 0.000000 -0.000591
+vn -1.000000 0.000000 -0.000594
+vn -1.000000 0.000000 -0.000594
+vn -1.000000 0.000000 -0.000595
+vn -1.000000 0.000000 -0.000595
+vn -1.000000 0.000000 -0.000594
+vn -1.000000 0.000000 -0.000594
+vn -1.000000 0.000000 -0.000594
+vn -1.000000 0.000000 -0.000594
+vn -1.000000 0.000000 -0.000596
+vn -1.000000 0.000000 -0.000596
+vn -1.000000 0.000000 -0.000591
+vn -1.000000 0.000000 -0.000591
+vn -1.000000 0.000000 -0.000589
+vn -1.000000 0.000000 -0.000589
+vn -1.000000 0.000000 -0.000593
+vn -1.000000 0.000000 -0.000593
+vn -1.000000 0.000000 -0.000593
+vn -1.000000 0.000000 -0.000593
+vn -1.000000 0.000000 -0.000592
+vn -1.000000 0.000000 -0.000592
+vn -1.000000 0.000000 -0.000590
+vn -1.000000 0.000000 -0.000590
+vn 0.000000 1.000000 0.000292
+vn 0.000000 1.000000 0.000292
+vn 0.000296 0.866077 -0.499910
+vn 0.000296 0.866077 -0.499910
+vn 0.000513 0.500175 -0.865924
+vn 0.000513 0.500175 -0.865924
+vn 0.000593 0.000300 -1.000000
+vn 0.000593 0.000300 -1.000000
+vn 0.000513 -0.499653 -0.866225
+vn 0.000513 -0.499653 -0.866225
+vn 0.000296 -0.865781 -0.500422
+vn 0.000296 -0.865781 -0.500422
+vn 0.000000 -1.000000 -0.000588
+vn 0.000000 -1.000000 -0.000588
+vn -0.000296 -0.866373 0.499397
+vn -0.000296 -0.866373 0.499397
+vn -0.000514 -0.500686 0.865629
+vn -0.000514 -0.500686 0.865629
+vn -0.000593 -0.000884 0.999999
+vn -0.000593 -0.000884 0.999999
+vn -0.000514 0.499145 0.866518
+vn -0.000514 0.499145 0.866518
+vn -0.000297 0.865630 0.500684
+vn -0.000297 0.865630 0.500684
+vn -1.000000 0.000000 -0.000599
+vn -1.000000 0.000000 -0.000596
+vn -1.000000 0.000006 -0.000597
+vn -1.000000 0.000006 -0.000590
+vn -1.000000 0.000000 -0.000585
+vn -1.000000 -0.000013 -0.000590
+vn -1.000000 -0.000013 -0.000597
+vn -1.000000 0.000000 -0.000600
+vn -1.000000 0.000006 -0.000597
+vn -1.000000 0.000006 -0.000597
+vn -1.000000 0.000013 -0.000600
+vn -1.000000 0.000000 -0.000597
+vn -1.000000 -0.000013 -0.000597
+vn -1.000000 0.000009 0.000000
+vn -1.000000 0.000009 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000019 0.000000
+vn -1.000000 0.000013 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 -0.000010 0.000000
+vn -0.992360 0.123378 0.000000
+vn -0.992360 0.123378 0.000000
+vn -0.998088 0.061807 0.000000
+vn -1.000000 0.000000 0.000000
+vn -0.992360 0.123378 0.000000
+vn -1.000000 -0.000031 0.000000
+vn -1.000000 0.000002 0.000000
+vn -1.000000 0.000019 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000009 0.000000
+vn -1.000000 0.000009 0.000000
+vn -1.000000 0.000000 0.000000
+vn -0.996600 0.082392 0.000000
+# 1508 vertices
+
+# 0 vertex parms
+
+# 0 texture vertices
+
+# 2135 normals
+
+g fuselage
+usemtl UNKNOWN
+s 1
+f 88//207 97//216 127//246 129//248
+f 3//122 1//120 114//233 115//234
+f 2//121 11//130 139//258 141//260
+s 15
+f 183//875 184//876 177//869 178//870 179//871 180//872 181//873 182//874
+s 1
+f 6//125 121//240 123//242 7//126
+f 133//252 8//127 89//208 131//250
+f 4//123 117//236 119//238 5//124
+f 3//122 115//234 117//236 4//123
+f 121//240 6//125 5//124 119//238
+f 125//244 95//214 7//126 123//242
+f 137//256 10//129 9//128 135//254
+f 8//127 133//252 135//254 9//128
+f 139//258 11//130 10//129 137//256
+f 11//130 2//121 13//132 12//131
+f 1//120 3//122 15//134 14//133
+f 3//122 4//123 16//135 15//134
+f 4//123 5//124 17//136 16//135
+f 5//124 6//125 18//137 17//136
+f 6//125 7//126 19//138 18//137
+f 7//126 95//214 96//215 20//139 19//138
+f 97//216 88//207 90//209 20//139 96//215
+f 89//208 8//127 21//140 91//210
+f 8//127 9//128 22//141 21//140
+f 9//128 10//129 23//142 22//141
+f 10//129 11//130 12//131 23//142
+f 21//140 22//141 25//144 24//143
+f 22//141 23//142 26//145 25//144
+f 23//142 12//131 27//146 26//145
+f 12//131 13//132 28//147 27//146
+f 14//133 15//134 30//149 29//148
+f 15//134 16//135 31//150 30//149
+f 16//135 17//136 32//151 31//150
+f 17//136 18//137 33//152 32//151
+f 18//137 19//138 34//153 33//152
+g exhaust
+s 44
+f 400//898 395//893 396//894 399//897
+g fuselage
+s 1
+f 20//139 90//209 92//211 35//154
+f 91//210 21//140 24//143 94//213
+g exhaust
+s 42
+f 384//920 379//915 380//916 383//919
+g fuselage
+s 1
+f 35//154 92//211 93//212 38//157 37//156
+f 94//213 24//143 39//158 38//157 93//212
+f 24//143 25//144 40//159 39//158
+f 25//144 26//145 41//160 40//159
+f 26//145 27//146 42//161 41//160
+f 27//146 28//147 43//162 42//161
+f 29//148 30//149 45//164 44//163
+f 30//149 31//150 46//165 45//164
+f 31//150 32//151 47//166 46//165
+f 32//151 33//152 48//167 47//166
+f 33//152 34//153 36//155 48//167
+f 46//165 47//166 50//169 49//168
+f 47//166 48//167 51//170 50//169
+f 48//167 36//155 52//171 51//170
+g exhaust
+s 40
+f 368//942 363//937 364//938 367//941
+g fuselage
+s 1
+f 37//156 38//157 54//173 53//172
+f 38//157 39//158 55//174 54//173
+f 39//158 40//159 56//175 55//174
+f 40//159 41//160 57//176 56//175
+f 41//160 42//161 58//177 57//176
+f 42//161 43//162 59//178 58//177
+f 44//163 45//164 61//180 60//179
+f 45//164 46//165 49//168 61//180
+f 60//179 61//180 64//183 63//182
+f 61//180 49//168 65//184 64//183
+f 49//168 50//169 66//185 65//184
+f 50//169 51//170 67//186 66//185
+f 51//170 52//171 68//187 67//186
+g exhaust
+s 38
+f 341//955 346//958 347//959 340//954
+g fuselage
+s 1
+f 53//172 54//173 70//189 69//188
+f 54//173 55//174 71//190 70//189
+f 55//174 56//175 72//191 71//190
+f 56//175 57//176 73//192 72//191
+f 57//176 58//177 74//193 73//192
+f 58//177 59//178 62//181 74//193
+f 72//191 73//192 76//195 75//194
+f 73//192 74//193 77//196 76//195
+f 74//193 62//181 78//197 77//196
+f 63//182 64//183 80//199 79//198
+f 64//183 65//184 81//200 80//199
+f 65//184 66//185 82//201 81//200
+f 66//185 67//186 83//202 82//201
+f 67//186 68//187 84//203 83//202
+g exhaust
+s 34
+f 314//981 309//976 310//977 313//980
+g fuselage
+s 1
+f 69//188 70//189 86//205 85//204
+f 70//189 71//190 87//206 86//205
+f 71//190 72//191 75//194 87//206
+f 92//211 94//213 93//212
+f 88//207 129//248 131//250 89//208
+f 90//209 88//207 89//208 91//210
+f 92//211 90//209 91//210 94//213
+f 95//214 97//216 96//215
+f 127//246 97//216 95//214 125//244
+f 99//218 98//217 116//235 113//232
+f 118//237 116//235 98//217 100//219
+f 120//239 118//237 100//219 101//220
+f 122//241 120//239 101//220 102//221
+f 124//243 122//241 102//221 103//222
+f 126//245 124//243 103//222 104//223
+f 128//247 126//245 104//223 105//224
+f 105//224 106//225 130//249 128//247
+f 132//251 130//249 106//225 107//226
+f 134//253 132//251 107//226 108//227
+f 136//255 134//253 108//227 109//228
+f 138//257 136//255 109//228 110//229
+f 140//259 138//257 110//229 111//230
+f 111//230 112//231 142//261 140//259
+f 115//234 114//233 113//232 116//235
+f 117//236 115//234 116//235 118//237
+f 119//238 117//236 118//237 120//239
+f 121//240 119//238 120//239 122//241
+f 123//242 121//240 122//241 124//243
+f 125//244 123//242 124//243 126//245
+f 127//246 125//244 126//245 128//247
+f 129//248 127//246 128//247 130//249
+f 131//250 129//248 130//249 132//251
+f 133//252 131//250 132//251 134//253
+f 135//254 133//252 134//253 136//255
+f 137//256 135//254 136//255 138//257
+f 139//258 137//256 138//257 140//259
+f 141//260 139//258 140//259 142//261
+f 162//281 167//286 107//226 106//225
+f 172//291 162//281 106//225 105//224
+f 174//293 172//291 105//224 104//223
+f 176//295 174//293 104//223 103//222
+f 103//222 102//221 148//267 175//294 176//295
+f 102//221 101//220 149//268 148//267
+f 101//220 100//219 150//269 149//268
+f 100//219 98//217 151//270 150//269
+f 98//217 99//218 156//275 151//270
+f 157//276 112//231 111//230 152//271
+f 111//230 110//229 153//272 152//271
+f 110//229 109//228 154//273 153//272
+f 109//228 108//227 169//288 170//289 154//273
+f 167//286 169//288 108//227 107//226
+f 173//292 175//294 148//267 149//268 150//269 151//270 156//275 166//285 160//279 171//290
+f 144//263 161//280 160//279 159//278
+f 144//263 162//281 161//280
+f 144//263 163//282 162//281
+f 144//263 159//278 164//283 163//282
+f 155//274 170//289 169//288
+f 147//266 176//295 175//294
+f 164//283 159//278 158//277 165//284
+f 159//278 160//279 166//285 158//277
+f 162//281 163//282 143//262 167//286
+f 163//282 164//283 168//287 143//262
+f 167//286 143//262 155//274 169//288
+f 143//262 168//287 170//289 155//274
+f 172//291 145//264 161//280 162//281
+f 145//264 171//290 160//279 161//280
+f 174//293 146//265 145//264 172//291
+f 146//265 173//292 171//290 145//264
+f 176//295 147//266 146//265 174//293
+f 147//266 175//294 173//292 146//265
+s 11
+f 154//995 170//999 178//1001 177//1000
+f 170//999 168//998 179//1002 178//1001
+f 168//998 164//997 180//1003 179//1002
+s 13
+f 164//1019 165//1020 181//1022 180//1021
+s 11
+f 157//996 152//993 183//1005 182//1004
+f 152//993 153//994 184//1006 183//1005
+f 153//994 154//995 177//1000 184//1006
+g exhaust
+s 4
+f 34//1027 19//1025 186//1038 187//1039
+f 19//1025 20//1026 208//1060 186//1038
+f 20//1026 35//1028 205//1057 208//1060
+f 35//1028 37//1030 203//1055 205//1057
+f 37//1030 53//1032 201//1053 203//1055
+f 53//1032 69//1034 199//1051 201//1053
+f 69//1034 85//1036 198//1050 199//1051
+g fuselage
+f 85//1036 84//1035 196//1048 198//1050
+g exhaust
+f 84//1035 68//1033 193//1045 196//1048
+f 68//1033 52//1031 191//1043 193//1045
+f 52//1031 36//1029 189//1041 191//1043
+f 36//1029 34//1027 187//1039 189//1041
+f 187//1039 186//1038 185//1037 188//1040
+f 189//1041 187//1039 188//1040 190//1042
+f 191//1043 189//1041 190//1042 192//1044
+f 193//1045 191//1043 192//1044 194//1046
+f 196//1048 193//1045 194//1046 209//1061 195//1047
+f 199//1051 198//1050 197//1049 210//1062 200//1052
+f 201//1053 199//1051 200//1052 202//1054
+f 203//1055 201//1053 202//1054 204//1056
+f 205//1057 203//1055 204//1056 206//1058
+f 208//1060 205//1057 206//1058 207//1059
+f 186//1038 208//1060 207//1059 185//1037
+f 198//1050 196//1048 195//1047 197//1049
+s 36
+f 332//1098 335//1101 336//1102 331//1097
+s 4
+f 188//1040 185//1037 212//1064 211//1063
+f 185//1037 207//1059 213//1065 212//1064
+f 207//1059 206//1058 214//1066 213//1065
+f 206//1058 188//1040 211//1063 214//1066
+f 190//1042 188//1040 216//1068 215//1067
+f 188//1040 206//1058 217//1069 216//1068
+f 206//1058 204//1056 218//1070 217//1069
+f 204//1056 190//1042 215//1067 218//1070
+f 192//1044 190//1042 220//1072 219//1071
+f 190//1042 204//1056 221//1073 220//1072
+f 204//1056 202//1054 222//1074 221//1073
+f 202//1054 192//1044 219//1071 222//1074
+f 194//1046 192//1044 224//1076 223//1075
+f 192//1044 202//1054 225//1077 224//1076
+f 202//1054 200//1052 226//1078 225//1077
+f 200//1052 194//1046 223//1075 226//1078
+f 200//1052 210//1062 228//1080 227//1079
+f 210//1062 209//1061 229//1081 228//1080
+f 209//1061 194//1046 230//1082 229//1081
+f 194//1046 200//1052 227//1079 230//1082
+f 195//1047 209//1061 232//1084 231//1083
+f 209//1061 210//1062 233//1085 232//1084
+f 210//1062 197//1049 234//1086 233//1085
+f 197//1049 195//1047 231//1083 234//1086
+s 44
+f 212//884 213//885 406//902 407//903 388//888 389//889
+f 213//885 214//886 405//901 406//902
+s off
+f 275//1 276//1 271//1 272//1 273//1 274//1
+s 44
+f 211//883 212//884 389//889 390//890
+s off
+f 216//2 217//2 412//2 413//2 372//2 373//2
+s 42
+f 217//907 218//908 411//923 412//924
+s off
+f 281//3 282//3 277//3 278//3 279//3 280//3
+s 42
+f 215//905 216//906 373//911 374//912
+s off
+f 220//4 221//4 418//4 419//4 356//4 357//4
+s 40
+f 221//929 222//930 417//945 418//946
+s off
+f 287//5 288//5 283//5 284//5 285//5 286//5
+s 40
+f 219//927 220//928 357//933 358//934
+s off
+f 224//6 225//6 424//6 425//6 350//6 351//6
+s 38
+f 225//951 226//952 423//967 424//968
+s off
+f 293//7 294//7 289//7 290//7 291//7 292//7
+s 38
+f 223//949 224//950 351//963 352//964
+s off
+f 299//8 300//8 295//8 296//8 297//8 298//8
+s 36
+f 229//1089 230//1090 325//1093 326//1094
+s off
+f 230//9 227//9 430//9 431//9 324//9 325//9
+s 36
+f 227//1087 228//1088 429//1105 430//1106
+s off
+f 232//10 233//10 436//10 437//10 318//10 319//10
+s 34
+f 233//973 234//974 435//989 436//990
+s off
+f 305//11 306//11 301//11 302//11 303//11 304//11
+s 34
+f 231//971 232//972 319//985 320//986
+s 44
+f 392//891 387//887 397//895 393//892
+s 42
+f 376//913 371//909 381//917 377//914
+s 40
+f 360//935 355//931 365//939 361//936
+s 38
+f 354//965 349//961 348//960 344//957
+s 36
+f 328//1095 323//1091 333//1099 329//1096
+s 34
+f 322//987 317//983 311//978 307//975
+s 44
+f 408//904 403//900 402//899 398//896
+s 42
+f 414//926 409//922 386//921 382//918
+s 40
+f 420//948 415//944 370//943 366//940
+s 38
+f 426//970 421//966 343//956 339//953
+s 36
+f 432//1108 427//1104 338//1103 334//1100
+s 34
+f 438//992 433//988 316//982 312//979
+s 44
+f 388//888 407//903 408//904 398//896 399//897 396//894 397//895 387//887
+s 42
+f 372//910 413//925 414//926 382//918 383//919 380//916 381//917 371//909
+s 40
+f 356//932 419//947 420//948 366//940 367//941 364//938 365//939 355//931
+s 38
+f 350//962 425//969 426//970 339//953 340//954 347//959 348//960 349//961
+s 36
+f 324//1092 431//1107 432//1108 334//1100 335//1101 332//1098 333//1099 323//1091
+s 34
+f 318//984 437//991 438//992 312//979 313//980 310//977 311//978 317//983
+s 26
+f 405//1128 214//1110 236//1112 235//1111 404//1127
+s off
+f 214//12 211//12 237//12 236//12
+s 26
+f 211//1109 390//1117 391//1118 238//1114 237//1113
+f 392//1119 393//1120 394//1121 239//1115 238//1114 391//1118
+f 395//1122 400//1123 401//1124 240//1116 239//1115 394//1121
+f 402//1125 403//1126 404//1127 235//1111 240//1116 401//1124
+s 21
+f 411//1148 218//1130 242//1132 241//1131 410//1147
+f 218//1130 215//1129 243//1133 242//1132
+f 215//1129 374//1137 375//1138 244//1134 243//1133
+f 376//1139 377//1140 378//1141 245//1135 244//1134 375//1138
+f 379//1142 384//1143 385//1144 246//1136 245//1135 378//1141
+f 386//1145 409//1146 410//1147 241//1131 246//1136 385//1144
+s 22
+f 417//1168 222//1150 248//1152 247//1151 416//1167
+f 222//1150 219//1149 249//1153 248//1152
+f 219//1149 358//1157 359//1158 250//1154 249//1153
+f 360//1159 361//1160 362//1161 251//1155 250//1154 359//1158
+f 363//1162 368//1163 369//1164 252//1156 251//1155 362//1161
+f 370//1165 415//1166 416//1167 247//1151 252//1156 369//1164
+s 23
+f 423//1188 226//1170 254//1172 253//1171 422//1187
+f 226//1170 223//1169 255//1173 254//1172
+f 223//1169 352//1183 353//1184 256//1174 255//1173
+f 354//1185 344//1180 345//1181 257//1175 256//1174 353//1184
+f 346//1182 341//1177 342//1178 258//1176 257//1175 345//1181
+f 343//1179 421//1186 422//1187 253//1171 258//1176 342//1178
+s 24
+f 429//1208 228//1189 260//1192 259//1191 428//1207
+f 228//1189 229//1190 261//1193 260//1192
+f 229//1190 326//1197 327//1198 262//1194 261//1193
+f 328//1199 329//1200 330//1201 263//1195 262//1194 327//1198
+f 331//1202 336//1203 337//1204 264//1196 263//1195 330//1201
+f 338//1205 427//1206 428//1207 259//1191 264//1196 337//1204
+s 25
+f 435//1228 234//1210 266//1212 265//1211 434//1227
+f 234//1210 231//1209 267//1213 266//1212
+f 231//1209 320//1223 321//1224 268//1214 267//1213
+f 322//1225 307//1217 308//1218 269//1215 268//1214 321//1224
+f 309//1219 314//1220 315//1221 270//1216 269//1215 308//1218
+f 316//1222 433//1226 434//1227 265//1211 270//1216 315//1221
+s 28
+f 238//1230 239//1231 272//1234 271//1233
+f 239//1231 240//1232 273//1235 272//1234
+f 240//1232 235//1229 274//1236 273//1235
+s off
+f 235//13 236//13 275//13 274//13
+f 236//14 237//14 276//14 275//14
+f 237//15 238//15 271//15 276//15
+s 29
+f 244//1238 245//1239 278//1242 277//1241
+f 245//1239 246//1240 279//1243 278//1242
+f 246//1240 241//1237 280//1244 279//1243
+s off
+f 241//16 242//16 281//16 280//16
+f 242//17 243//17 282//17 281//17
+f 243//18 244//18 277//18 282//18
+s 30
+f 250//1246 251//1247 284//1250 283//1249
+f 251//1247 252//1248 285//1251 284//1250
+f 252//1248 247//1245 286//1252 285//1251
+s off
+f 247//19 248//19 287//19 286//19
+f 248//20 249//20 288//20 287//20
+f 249//21 250//21 283//21 288//21
+s 31
+f 256//1254 257//1255 290//1258 289//1257
+f 257//1255 258//1256 291//1259 290//1258
+f 258//1256 253//1253 292//1260 291//1259
+s off
+f 253//22 254//22 293//22 292//22
+f 254//23 255//23 294//23 293//23
+f 255//24 256//24 289//24 294//24
+s 32
+f 262//1262 263//1263 296//1266 295//1265
+f 263//1263 264//1264 297//1267 296//1266
+f 264//1264 259//1261 298//1268 297//1267
+s off
+f 259//25 260//25 299//25 298//25
+f 260//26 261//26 300//26 299//26
+f 261//27 262//27 295//27 300//27
+s 33
+f 268//1270 269//1271 302//1274 301//1273
+f 269//1271 270//1272 303//1275 302//1274
+f 270//1272 265//1269 304//1276 303//1275
+s off
+f 265//28 266//28 305//28 304//28
+f 266//29 267//29 306//29 305//29
+f 267//30 268//30 301//30 306//30
+f 307//31 309//31 308//31
+f 314//32 316//32 315//32
+s 34
+f 317//983 319//985 318//984
+s off
+f 320//33 322//33 321//33
+s 36
+f 323//1091 325//1093 324//1092
+s off
+f 326//34 328//34 327//34
+f 329//35 331//35 330//35
+f 336//36 338//36 337//36
+f 341//37 343//37 342//37
+f 344//38 346//38 345//38
+s 38
+f 349//961 351//963 350//962
+s off
+f 352//39 354//39 353//39
+s 40
+f 355//931 357//933 356//932
+s off
+f 358//40 360//40 359//40
+f 361//41 363//41 362//41
+f 368//42 370//42 369//42
+s 42
+f 371//909 373//911 372//910
+s off
+f 374//43 376//43 375//43
+f 377//44 379//44 378//44
+f 384//45 386//45 385//45
+s 44
+f 387//887 389//889 388//888
+s off
+f 390//46 392//46 391//46
+f 393//47 395//47 394//47
+f 400//48 402//48 401//48
+f 403//49 405//49 404//49
+s 44
+f 406//902 408//904 407//903
+s off
+f 409//50 411//50 410//50
+s 42
+f 412//924 414//926 413//925
+s off
+f 415//51 417//51 416//51
+s 40
+f 418//946 420//948 419//947
+s off
+f 421//52 423//52 422//52
+s 38
+f 424//968 426//970 425//969
+s off
+f 427//53 429//53 428//53
+s 36
+f 430//1106 432//1108 431//1107
+s off
+f 433//54 435//54 434//54
+s 34
+f 436//990 438//992 437//991
+f 310//977 309//976 307//975 311//978
+f 314//981 313//980 312//979 316//982
+f 320//986 319//985 317//983 322//987
+s 36
+f 326//1094 325//1093 323//1091 328//1095
+f 332//1098 331//1097 329//1096 333//1099
+f 336//1102 335//1101 334//1100 338//1103
+s 38
+f 341//955 340//954 339//953 343//956
+f 347//959 346//958 344//957 348//960
+f 352//964 351//963 349//961 354//965
+s 40
+f 358//934 357//933 355//931 360//935
+f 364//938 363//937 361//936 365//939
+f 368//942 367//941 366//940 370//943
+s 42
+f 374//912 373//911 371//909 376//913
+f 380//916 379//915 377//914 381//917
+f 384//920 383//919 382//918 386//921
+s 44
+f 390//890 389//889 387//887 392//891
+f 396//894 395//893 393//892 397//895
+f 400//898 399//897 398//896 402//899
+f 406//902 405//901 403//900 408//904
+s 42
+f 412//924 411//923 409//922 414//926
+s 40
+f 418//946 417//945 415//944 420//948
+s 38
+f 424//968 423//967 421//966 426//970
+s 36
+f 430//1106 429//1105 427//1104 432//1108
+s 34
+f 436//990 435//989 433//988 438//992
+g fuselage
+s 1
+f 85//204 86//205 440//297 439//296
+f 86//205 87//206 441//298 440//297
+f 87//206 75//194 442//299 441//298
+g wings
+f 563//420 569//426 561//418 562//419
+g fuselage
+f 77//196 78//197 444//301 443//300
+f 79//198 80//199 446//303 445//302
+f 80//199 81//200 447//304 446//303
+f 81//200 82//201 448//305 447//304
+f 82//201 83//202 449//306 448//305
+f 83//202 84//203 450//307 449//306
+f 84//203 85//204 439//296 450//307
+g canopy
+f 448//305 479//336 451//308 488//345 501//358 502//359
+g fuselage
+f 449//306 450//307 452//309 477//334 478//335
+f 450//307 439//296 453//310 452//309
+f 439//296 440//297 454//311 453//310
+f 440//297 441//298 455//312 454//311
+f 441//298 442//299 456//313 455//312
+f 443//300 444//301 458//315 457//314
+g canopy
+f 486//343 445//302 446//303 447//304 500//357 499//356 498//355
+f 502//359 500//357 447//304 448//305
+f 462//319 461//318 460//317 473//330 513//370 512//369 514//371
+f 510//367 463//320 462//319 514//371 512//369 509//366
+f 482//339 484//341 463//320 511//368
+g fuselage
+f 485//342 483//340 481//338 477//334 452//309 465//322
+f 452//309 453//310 466//323 465//322
+f 453//310 454//311 467//324 466//323
+f 454//311 455//312 468//325 467//324
+f 455//312 456//313 469//326 468//325
+f 457//314 458//315 472//329 471//328
+f 479//336 448//305 449//306 478//335
+g canopy
+f 497//354 513//370 473//330 487//344
+f 505//362 509//366 512//369 507//364 496//353 504//361
+g fuselage
+f 451//308 478//335 477//334
+f 451//308 479//336 478//335
+f 464//321 485//342 484//341
+g canopy
+f 451//308 476//333 503//360 491//348
+g fuselage
+f 476//333 451//308 475//332 480//337
+f 451//308 477//334 481//338 475//332
+f 480//337 475//332 474//331 482//339
+f 475//332 481//338 483//340 474//331
+f 482//339 474//331 464//321 484//341
+f 474//331 483//340 485//342 464//321
+g canopy
+f 501//358 489//346 492//349 499//356
+f 490//347 504//361 496//353 495//352
+f 498//355 493//350 459//316 486//343
+f 494//351 497//354 487//344 459//316
+f 488//345 491//348 490//347 489//346
+f 492//349 495//352 494//351 493//350
+f 510//367 511//368 463//320
+f 492//349 489//346 490//347 495//352
+f 495//352 496//353 497//354 494//351
+f 459//316 493//350 494//351
+f 493//350 498//355 499//356 492//349
+f 500//357 502//359 501//358 499//356
+f 489//346 501//358 488//345
+f 488//345 451//308 491//348
+f 491//348 503//360 504//361 490//347
+f 506//363 505//362 504//361 503//360
+f 508//365 509//366 505//362 506//363
+f 511//368 510//367 509//366 508//365
+f 482//339 508//365 506//363 480//337
+f 480//337 506//363 503//360 476//333
+f 482//339 511//368 508//365
+f 513//370 497//354 496//353 507//364 512//369
+g fuselage
+f 470//327 528//385 527//384 469//326
+f 460//317 461//318 519//376 518//375
+f 461//318 462//319 520//377 519//376
+f 462//319 463//320 521//378 520//377
+f 463//320 484//341 522//379 521//378
+f 484//341 485//342 523//380 522//379
+f 485//342 465//322 524//381 523//380
+f 465//322 466//323 525//382 524//381
+f 466//323 467//324 526//383 525//382
+f 467//324 468//325 527//384 526//383
+f 468//325 469//326 527//384
+f 526//383 527//384 530//387 529//386
+f 527//384 528//385 531//388 530//387
+f 528//385 515//372 532//389 531//388
+f 515//372 516//373 533//390 532//389
+f 516//373 517//374 534//391 533//390
+f 518//375 519//376 536//393 535//392
+f 519//376 520//377 537//394 536//393
+f 520//377 521//378 538//395 537//394
+f 521//378 522//379 539//396 538//395
+f 522//379 523//380 540//397 539//396
+f 523//380 524//381 541//398 540//397
+f 524//381 525//382 542//399 541//398
+f 525//382 526//383 529//386 542//399
+f 580//436 581//437 576//432 577//433 578//434 579//435
+g wings
+f 469//326 456//313 544//401 543//400
+f 456//313 442//299 545//402 544//401
+f 442//299 75//194 546//403 545//402
+f 75//194 76//195 547//404 546//403
+f 76//195 77//196 548//405 547//404
+f 77//196 443//300 549//406 548//405
+f 443//300 457//314 550//407 549//406
+f 457//314 471//328 551//408 550//407
+s 57
+f 471//1279 470//1278 469//1277 543//1280 551//1281
+s 1
+f 545//402 546//403 553//410 552//409
+f 546//403 547//404 554//411 553//410
+f 547//404 548//405 555//412 554//411
+f 548//405 549//406 556//413 555//412
+f 549//406 550//407 557//414 556//413
+f 550//407 551//408 558//415 557//414
+s 57
+f 551//1281 543//1280 559//1283 558//1282
+s 1
+f 543//400 544//401 560//417 559//416
+f 544//401 545//402 552//409 560//417
+f 558//415 559//416 562//419 561//418
+f 559//416 560//417 563//420 562//419
+f 560//417 552//409 564//421 563//420
+f 552//409 553//410 565//422 564//421
+f 553//410 554//411 566//423 565//422
+f 554//411 555//412 567//424 566//423
+f 555//412 556//413 568//425 567//424
+f 556//413 557//414 569//426 568//425
+f 557//414 558//415 561//418 569//426
+g fuselage
+f 515//372 528//385 571//428 570//427
+f 528//385 470//327 572//429 571//428
+f 470//327 471//328 572//429
+f 517//374 516//373 575//431 574//430
+f 516//373 515//372 570//427 575//431
+s 52
+f 573//1287 572//1286 471//1284 472//1285
+s 1
+f 574//430 575//431 578//434 577//433
+f 575//431 570//427 579//435 578//434
+f 570//427 571//428 580//436 579//435
+f 571//428 572//429 581//437 580//436
+s 52
+f 572//1286 573//1287 576//1288 581//1289
+g wings
+s 1
+f 568//425 564//421 565//422 566//423 567//424
+f 569//426 563//420 564//421 568//425
+g fuselage
+f 540//397 541//398 583//439 582//438
+f 541//398 542//399 584//440 583//439
+f 542//399 529//386 585//441 584//440
+f 529//386 530//387 586//442 585//441
+f 530//387 531//388 587//443 586//442
+f 531//388 532//389 588//444 587//443
+f 532//389 533//390 589//445 588//444
+f 533//390 534//391 590//446 589//445
+f 535//392 536//393 592//448 591//447
+f 536//393 537//394 593//449 592//448
+f 537//394 538//395 594//450 593//449
+f 538//395 539//396 595//451 594//450
+f 539//396 540//397 582//438 595//451
+f 593//449 594//450 597//453 596//452
+f 594//450 595//451 598//454 597//453
+f 595//451 582//438 599//455 598//454
+f 582//438 583//439 600//456 599//455
+f 583//439 584//440 601//457 600//456
+f 584//440 585//441 602//458 601//457
+f 585//441 586//442 603//459 602//458
+f 586//442 587//443 604//460 603//459
+f 587//443 588//444 605//461 604//460
+f 588//444 589//445 606//462 605//461
+f 589//445 590//446 607//463 606//462
+f 591//447 592//448 609//465 608//464
+f 592//448 593//449 596//452 609//465
+f 608//464 609//465 612//468 611//467
+f 609//465 596//452 613//469 612//468
+f 596//452 597//453 614//470 613//469
+f 597//453 598//454 615//471 614//470
+f 598//454 599//455 616//472 615//471
+f 599//455 600//456 617//473 616//472
+f 600//456 601//457 618//474 617//473
+f 601//457 602//458 619//475 618//474
+f 602//458 603//459 620//476 619//475
+f 603//459 604//460 621//477 620//476
+f 604//460 605//461 622//478 621//477
+f 605//461 606//462 623//479 622//478
+f 606//462 607//463 610//466 623//479
+f 621//477 622//478 625//481 624//480
+f 622//478 623//479 626//482 625//481
+f 623//479 610//466 627//483 626//482
+g wings
+f 611//467 612//468 629//485 628//484
+f 612//468 613//469 630//486 629//485
+g fuselage
+f 613//469 614//470 631//487 630//486
+f 614//470 615//471 632//488 631//487
+f 615//471 616//472 633//489 632//488
+f 616//472 617//473 634//490 633//489
+f 617//473 618//474 635//491 634//490
+f 618//474 619//475 636//492 635//491
+f 619//475 620//476 637//493 636//492
+f 620//476 621//477 624//480 637//493
+f 635//491 636//492 639//495 638//494
+f 636//492 637//493 640//496 639//495
+f 637//493 624//480 641//497 640//496
+f 624//480 625//481 642//498 641//497
+f 625//481 626//482 643//499 642//498
+f 626//482 627//483 644//500 643//499
+g wings
+s off
+f 628//55 629//55 646//55 645//55
+s 1
+f 629//485 647//502 646//501
+g fuselage
+f 630//486 631//487 648//503 647//502
+f 631//487 632//488 649//504 648//503
+f 632//488 633//489 650//505 649//504
+f 633//489 634//490 651//506 650//505
+g wings
+s 64
+f 668//1297 666//1295 670//1299 672//1301
+g fuselage
+s 1
+f 649//504 650//505 653//508 652//507
+f 650//505 651//506 654//509 653//508
+f 651//506 638//494 655//510 654//509
+f 638//494 639//495 656//511 655//510
+f 639//495 640//496 657//512 656//511
+f 640//496 641//497 658//513 657//512
+f 641//497 642//498 659//514 658//513
+f 642//498 643//499 660//515 659//514
+f 643//499 644//500 661//516 660//515
+g wings
+s 61
+f 645//1303 646//1304 663//1306 662//1305
+s 1
+f 646//501 647//502 664//518 663//517
+g fuselage
+f 647//502 648//503 665//519 664//518
+f 648//503 649//504 652//507 665//519
+g wings
+s 66
+f 651//1310 634//1309 673//1314 671//1312
+s 64
+f 634//1293 635//1294 669//1298 673//1302
+s 65
+f 635//1315 638//1316 667//1318 669//1320
+s off
+f 638//56 651//56 671//56 667//56
+s 65
+f 669//1320 667//1318 666//1317 668//1319
+s 64
+f 667//1296 671//1300 670//1299 666//1295
+s 66
+f 671//1312 673//1314 672//1313 670//1311
+s 64
+f 673//1302 669//1298 668//1297 672//1301
+g fuselage
+s 1
+f 674//520 675//521 676//522 677//523
+f 678//524 114//233 1//120 679//525
+f 141//260 680//526 681//527 2//121
+s 15
+f 182//874 181//873 682//877 683//878 684//879 685//880 686//881 687//882
+s 1
+f 700//540 701//541 702//542 703//543
+f 704//544 705//545 706//546 707//547
+f 708//548 709//549 710//550 711//551
+f 711//551 710//550 678//524 679//525
+f 709//549 708//548 703//543 702//542
+f 701//541 700//540 712//552 713//553
+f 714//554 715//555 716//556 717//557
+f 715//555 714//554 707//547 706//546
+f 717//557 716//556 681//527 680//526
+f 718//558 13//132 2//121 681//527
+f 14//133 719//559 679//525 1//120
+f 719//559 720//560 711//551 679//525
+f 720//560 721//561 708//548 711//551
+f 721//561 722//562 703//543 708//548
+f 722//562 723//563 700//540 703//543
+f 723//563 724//564 725//565 712//552 700//540
+f 725//565 724//564 726//566 677//523 676//522
+f 727//567 728//568 706//546 705//545
+f 728//568 729//569 715//555 706//546
+f 729//569 730//570 716//556 715//555
+f 730//570 718//558 681//527 716//556
+f 731//571 732//572 729//569 728//568
+f 732//572 733//573 730//570 729//569
+f 733//573 734//574 718//558 730//570
+f 734//574 28//147 13//132 718//558
+f 29//148 735//575 719//559 14//133
+f 735//575 736//576 720//560 719//559
+f 736//576 737//577 721//561 720//560
+f 737//577 738//578 722//562 721//561
+f 738//578 739//579 723//563 722//562
+g exhaust
+s 71
+f 740//1321 741//1322 742//1323 743//1324
+g fuselage
+s 1
+f 744//580 745//581 726//566 724//564
+f 746//582 731//571 728//568 727//567
+g exhaust
+s 73
+f 747//1343 748//1344 749//1345 750//1346
+g fuselage
+s 1
+f 751//583 752//584 753//585 745//581 744//580
+f 753//585 752//584 754//586 731//571 746//582
+f 754//586 755//587 732//572 731//571
+f 755//587 756//588 733//573 732//572
+f 756//588 757//589 734//574 733//573
+f 757//589 43//162 28//147 734//574
+f 44//163 758//590 735//575 29//148
+f 758//590 759//591 736//576 735//575
+f 759//591 760//592 737//577 736//576
+f 760//592 761//593 738//578 737//577
+f 761//593 762//594 739//579 738//578
+f 763//595 764//596 760//592 759//591
+f 764//596 765//597 761//593 760//592
+f 765//597 766//598 762//594 761//593
+g exhaust
+s 74
+f 767//1365 768//1366 769//1367 770//1368
+g fuselage
+s 1
+f 771//599 772//600 752//584 751//583
+f 772//600 773//601 754//586 752//584
+f 773//601 774//602 755//587 754//586
+f 774//602 775//603 756//588 755//587
+f 775//603 776//604 757//589 756//588
+f 776//604 59//178 43//162 757//589
+f 60//179 777//605 758//590 44//163
+f 777//605 763//595 759//591 758//590
+f 63//182 778//606 777//605 60//179
+f 778//606 779//607 763//595 777//605
+f 779//607 780//608 764//596 763//595
+f 780//608 781//609 765//597 764//596
+f 781//609 782//610 766//598 765//597
+g exhaust
+s 75
+f 783//1387 784//1388 785//1389 786//1390
+g fuselage
+s 1
+f 787//611 788//612 772//600 771//599
+f 788//612 789//613 773//601 772//600
+f 789//613 790//614 774//602 773//601
+f 790//614 791//615 775//603 774//602
+f 791//615 792//616 776//604 775//603
+f 792//616 62//181 59//178 776//604
+f 793//617 794//618 791//615 790//614
+f 794//618 795//619 792//616 791//615
+f 795//619 78//197 62//181 792//616
+f 79//198 796//620 778//606 63//182
+f 796//620 797//621 779//607 778//606
+f 797//621 798//622 780//608 779//607
+f 798//622 799//623 781//609 780//608
+f 799//623 800//624 782//610 781//609
+g exhaust
+s 76
+f 801//1409 802//1410 803//1411 804//1412
+g fuselage
+s 1
+f 805//625 806//626 788//612 787//611
+f 806//626 807//627 789//613 788//612
+f 807//627 793//617 790//614 789//613
+f 753//585 746//582 745//581
+f 705//545 704//544 674//520 677//523
+f 727//567 705//545 677//523 726//566
+f 746//582 727//567 726//566 745//581
+f 725//565 676//522 712//552
+f 713//553 712//552 676//522 675//521
+f 113//232 808//628 809//629 99//218
+f 810//630 809//629 808//628 811//631
+f 812//632 810//630 811//631 813//633
+f 814//634 812//632 813//633 815//635
+f 816//636 814//634 815//635 817//637
+f 818//638 816//636 817//637 819//639
+f 820//640 818//638 819//639 821//641
+f 821//641 822//642 823//643 820//640
+f 824//644 823//643 822//642 825//645
+f 826//646 824//644 825//645 827//647
+f 828//648 826//646 827//647 829//649
+f 830//650 828//648 829//649 831//651
+f 832//652 830//650 831//651 833//653
+f 833//653 142//261 112//231 832//652
+f 808//628 113//232 114//233 678//524
+f 811//631 808//628 678//524 710//550
+f 813//633 811//631 710//550 709//549
+f 815//635 813//633 709//549 702//542
+f 817//637 815//635 702//542 701//541
+f 819//639 817//637 701//541 713//553
+f 821//641 819//639 713//553 675//521
+f 822//642 821//641 675//521 674//520
+f 825//645 822//642 674//520 704//544
+f 827//647 825//645 704//544 707//547
+f 829//649 827//647 707//547 714//554
+f 831//651 829//649 714//554 717//557
+f 833//653 831//651 717//557 680//526
+f 142//261 833//653 680//526 141//260
+f 823//643 824//644 834//654 835//655
+f 820//640 823//643 835//655 836//656
+f 818//638 820//640 836//656 837//657
+f 816//636 818//638 837//657 838//658
+f 838//658 839//659 840//660 814//634 816//636
+f 840//660 841//661 812//632 814//634
+f 841//661 842//662 810//630 812//632
+f 842//662 843//663 809//629 810//630
+f 843//663 156//275 99//218 809//629
+f 844//664 832//652 112//231 157//276
+f 844//664 845//665 830//650 832//652
+f 845//665 846//666 828//648 830//650
+f 846//666 847//667 848//668 826//646 828//648
+f 824//644 826//646 848//668 834//654
+f 849//669 850//670 166//285 156//275 843//663 842//662 841//661 840//660 839//659 851//671
+f 852//672 850//670 853//673 854//674
+f 853//673 835//655 854//674
+f 835//655 855//675 854//674
+f 855//675 856//676 852//672 854//674
+f 848//668 847//667 857//677
+f 839//659 838//658 858//678
+f 165//284 158//277 852//672 856//676
+f 158//277 166//285 850//670 852//672
+f 834//654 859//679 855//675 835//655
+f 859//679 860//680 856//676 855//675
+f 848//668 857//677 859//679 834//654
+f 857//677 847//667 860//680 859//679
+f 835//655 853//673 861//681 836//656
+f 853//673 850//670 849//669 861//681
+f 836//656 861//681 862//682 837//657
+f 861//681 849//669 851//671 862//682
+f 837//657 862//682 858//678 838//658
+f 862//682 851//671 839//659 858//678
+s 11
+f 685//1010 684//1009 847//1016 846//1015
+f 684//1009 683//1008 860//1018 847//1016
+f 683//1008 682//1007 856//1017 860//1018
+s 13
+f 682//1023 181//1022 165//1020 856//1024
+s 11
+f 182//1004 687//1012 844//1013 157//996
+f 687//1012 686//1011 845//1014 844//1013
+f 686//1011 685//1010 846//1015 845//1014
+g exhaust
+s 70
+f 863//1443 864//1444 723//1431 739//1433
+f 864//1444 865//1445 724//1432 723//1431
+f 865//1445 866//1446 744//1434 724//1432
+f 866//1446 867//1447 751//1435 744//1434
+f 867//1447 868//1448 771//1438 751//1435
+f 868//1448 869//1449 787//1440 771//1438
+f 869//1449 870//1450 805//1442 787//1440
+g fuselage
+f 870//1450 871//1451 800//1441 805//1442
+g exhaust
+f 871//1451 872//1452 782//1439 800//1441
+f 872//1452 873//1453 766//1437 782//1439
+f 873//1453 874//1454 762//1436 766//1437
+f 874//1454 863//1443 739//1433 762//1436
+f 875//1455 876//1456 864//1444 863//1443
+f 877//1457 875//1455 863//1443 874//1454
+f 878//1458 877//1457 874//1454 873//1453
+f 879//1459 878//1458 873//1453 872//1452
+f 880//1460 881//1461 879//1459 872//1452 871//1451
+f 882//1462 883//1463 884//1464 870//1450 869//1449
+f 885//1465 882//1462 869//1449 868//1448
+f 886//1466 885//1465 868//1448 867//1447
+f 887//1467 886//1466 867//1447 866//1446
+f 888//1468 887//1467 866//1446 865//1445
+f 876//1456 888//1468 865//1445 864//1444
+f 884//1464 880//1460 871//1451 870//1450
+s 79
+f 889//1493 890//1494 891//1495 892//1496
+s 70
+f 893//1469 894//1470 876//1456 875//1455
+f 894//1470 895//1471 888//1468 876//1456
+f 895//1471 896//1472 887//1467 888//1468
+f 896//1472 893//1469 875//1455 887//1467
+f 897//1473 898//1474 875//1455 877//1457
+f 898//1474 899//1475 887//1467 875//1455
+f 899//1475 900//1476 886//1466 887//1467
+f 900//1476 897//1473 877//1457 886//1466
+f 901//1477 902//1478 877//1457 878//1458
+f 902//1478 903//1479 886//1466 877//1457
+f 903//1479 904//1480 885//1465 886//1466
+f 904//1480 901//1477 878//1458 885//1465
+f 905//1481 906//1482 878//1458 879//1459
+f 906//1482 907//1483 885//1465 878//1458
+f 907//1483 908//1484 882//1462 885//1465
+f 908//1484 905//1481 879//1459 882//1462
+f 909//1485 910//1486 883//1463 882//1462
+f 910//1486 911//1487 881//1461 883//1463
+f 911//1487 912//1488 879//1459 881//1461
+f 912//1488 909//1485 882//1462 879//1459
+f 913//1489 914//1490 881//1461 880//1460
+f 914//1490 915//1491 883//1463 881//1461
+f 915//1491 916//1492 884//1464 883//1463
+f 916//1492 913//1489 880//1460 884//1464
+s 71
+f 917//1329 918//1330 919//1331 920//1332 895//1327 894//1326
+f 920//1332 921//1333 896//1328 895//1327
+s off
+f 922//57 923//57 924//57 925//57 926//57 927//57
+s 71
+f 928//1334 917//1329 894//1326 893//1325
+s off
+f 929//58 930//58 931//58 932//58 899//58 898//58
+s 73
+f 932//1354 933//1355 900//1350 899//1349
+s off
+f 934//59 935//59 936//59 937//59 938//59 939//59
+s 73
+f 940//1356 929//1351 898//1348 897//1347
+s off
+f 941//60 942//60 943//60 944//60 903//60 902//60
+s 74
+f 944//1376 945//1377 904//1372 903//1371
+s off
+f 946//61 947//61 948//61 949//61 950//61 951//61
+s 74
+f 952//1378 941//1373 902//1370 901//1369
+s off
+f 953//62 954//62 955//62 956//62 907//62 906//62
+s 75
+f 956//1398 957//1399 908//1394 907//1393
+s off
+f 958//63 959//63 960//63 961//63 962//63 963//63
+s 75
+f 964//1400 953//1395 906//1392 905//1391
+s off
+f 965//64 966//64 967//64 968//64 969//64 970//64
+s 79
+f 971//1501 972//1502 912//1500 911//1499
+s off
+f 972//65 973//65 974//65 975//65 909//65 912//65
+s 79
+f 975//1505 976//1506 910//1498 909//1497
+s off
+f 977//66 978//66 979//66 980//66 915//66 914//66
+s 76
+f 980//1420 981//1421 916//1416 915//1415
+s off
+f 982//67 983//67 984//67 985//67 986//67 987//67
+s 76
+f 988//1422 977//1417 914//1414 913//1413
+s 71
+f 989//1335 990//1336 991//1337 992//1338
+s 73
+f 993//1357 994//1358 995//1359 996//1360
+s 74
+f 997//1379 998//1380 999//1381 1000//1382
+s 75
+f 1001//1401 1002//1402 1003//1403 1004//1404
+s 79
+f 1005//1507 1006//1508 1007//1509 1008//1510
+s 76
+f 1009//1423 1010//1424 1011//1425 1012//1426
+s 71
+f 1013//1339 1014//1340 1015//1341 1016//1342
+s 73
+f 1017//1361 1018//1362 1019//1363 1020//1364
+s 74
+f 1021//1383 1022//1384 1023//1385 1024//1386
+s 75
+f 1025//1405 1026//1406 1027//1407 1028//1408
+s 79
+f 1029//1511 1030//1512 1031//1513 1032//1514
+s 76
+f 1033//1427 1034//1428 1035//1429 1036//1430
+s 71
+f 991//1337 990//1336 741//1322 740//1321 1013//1339 1016//1342 919//1331 918//1330
+s 73
+f 995//1359 994//1358 748//1344 747//1343 1017//1361 1020//1364 931//1353 930//1352
+s 74
+f 999//1381 998//1380 768//1366 767//1365 1021//1383 1024//1386 943//1375 942//1374
+s 75
+f 1003//1403 1002//1402 784//1388 783//1387 1025//1405 1028//1408 955//1397 954//1396
+s 79
+f 1007//1509 1006//1508 892//1496 891//1495 1029//1511 1032//1514 974//1504 973//1503
+s 76
+f 1011//1425 1010//1424 802//1410 801//1409 1033//1427 1036//1430 979//1419 978//1418
+s 80
+f 1037//1525 1038//1526 1039//1527 896//1518 921//1519
+f 1039//1527 1040//1528 893//1517 896//1518
+f 1040//1528 1041//1529 1042//1530 928//1520 893//1517
+f 1042//1530 1041//1529 1043//1531 1044//1532 989//1521 992//1522
+f 1044//1532 1043//1531 1045//1533 1046//1534 743//1516 742//1515
+f 1046//1534 1045//1533 1038//1526 1037//1525 1015//1524 1014//1523
+s 81
+f 1047//1545 1048//1546 1049//1547 900//1538 933//1539
+f 1049//1547 1050//1548 897//1537 900//1538
+f 1050//1548 1051//1549 1052//1550 940//1540 897//1537
+f 1052//1550 1051//1549 1053//1551 1054//1552 993//1541 996//1542
+f 1054//1552 1053//1551 1055//1553 1056//1554 750//1536 749//1535
+f 1056//1554 1055//1553 1048//1546 1047//1545 1019//1544 1018//1543
+s 82
+f 1057//1565 1058//1566 1059//1567 904//1558 945//1559
+f 1059//1567 1060//1568 901//1557 904//1558
+f 1060//1568 1061//1569 1062//1570 952//1560 901//1557
+f 1062//1570 1061//1569 1063//1571 1064//1572 997//1561 1000//1562
+f 1064//1572 1063//1571 1065//1573 1066//1574 770//1556 769//1555
+f 1066//1574 1065//1573 1058//1566 1057//1565 1023//1564 1022//1563
+s 83
+f 1067//1585 1068//1586 1069//1587 908//1578 957//1579
+f 1069//1587 1070//1588 905//1577 908//1578
+f 1070//1588 1071//1589 1072//1590 964//1580 905//1577
+f 1072//1590 1071//1589 1073//1591 1074//1592 1001//1581 1004//1582
+f 1074//1592 1073//1591 1075//1593 1076//1594 786//1576 785//1575
+f 1076//1594 1075//1593 1068//1586 1067//1585 1027//1584 1026//1583
+s 84
+f 1077//1605 1078//1606 1079//1607 910//1597 976//1600
+f 1079//1607 1080//1608 911//1598 910//1597
+f 1080//1608 1081//1609 1082//1610 971//1599 911//1598
+f 1082//1610 1081//1609 1083//1611 1084//1612 1005//1601 1008//1602
+f 1084//1612 1083//1611 1085//1613 1086//1614 890//1596 889//1595
+f 1086//1614 1085//1613 1078//1606 1077//1605 1031//1604 1030//1603
+s 85
+f 1087//1625 1088//1626 1089//1627 916//1618 981//1619
+f 1089//1627 1090//1628 913//1617 916//1618
+f 1090//1628 1091//1629 1092//1630 988//1620 913//1617
+f 1092//1630 1091//1629 1093//1631 1094//1632 1009//1621 1012//1622
+f 1094//1632 1093//1631 1095//1633 1096//1634 804//1616 803//1615
+f 1096//1634 1095//1633 1088//1626 1087//1625 1035//1624 1034//1623
+s 89
+f 925//1638 924//1637 1043//1641 1041//1640
+f 924//1637 923//1636 1045//1642 1043//1641
+f 923//1636 922//1635 1038//1639 1045//1642
+s off
+f 922//68 927//68 1039//68 1038//68
+f 927//69 926//69 1040//69 1039//69
+f 926//70 925//70 1041//70 1040//70
+s 92
+f 937//1646 936//1645 1053//1649 1051//1648
+f 936//1645 935//1644 1055//1650 1053//1649
+f 935//1644 934//1643 1048//1647 1055//1650
+s off
+f 934//71 939//71 1049//71 1048//71
+f 939//72 938//72 1050//72 1049//72
+f 938//73 937//73 1051//73 1050//73
+s 95
+f 949//1654 948//1653 1063//1657 1061//1656
+f 948//1653 947//1652 1065//1658 1063//1657
+f 947//1652 946//1651 1058//1655 1065//1658
+s off
+f 946//74 951//74 1059//74 1058//74
+f 951//75 950//75 1060//75 1059//75
+f 950//76 949//76 1061//76 1060//76
+s 98
+f 961//1662 960//1661 1073//1665 1071//1664
+f 960//1661 959//1660 1075//1666 1073//1665
+f 959//1660 958//1659 1068//1663 1075//1666
+s off
+f 958//77 963//77 1069//77 1068//77
+f 963//78 962//78 1070//78 1069//78
+f 962//79 961//79 1071//79 1070//79
+s 99
+f 968//1670 967//1669 1083//1673 1081//1672
+f 967//1669 966//1668 1085//1674 1083//1673
+f 966//1668 965//1667 1078//1671 1085//1674
+s off
+f 965//80 970//80 1079//80 1078//80
+f 970//81 969//81 1080//81 1079//81
+f 969//82 968//82 1081//82 1080//82
+s 104
+f 985//1678 984//1677 1093//1681 1091//1680
+f 984//1677 983//1676 1095//1682 1093//1681
+f 983//1676 982//1675 1088//1679 1095//1682
+s off
+f 982//83 987//83 1089//83 1088//83
+f 987//84 986//84 1090//84 1089//84
+f 986//85 985//85 1091//85 1090//85
+f 1094//86 803//86 1009//86
+f 1096//87 1034//87 804//87
+s 76
+f 978//1418 977//1417 1011//1425
+s off
+f 1092//88 1012//88 988//88
+s 79
+f 973//1503 972//1502 1007//1509
+s off
+f 1082//89 1008//89 971//89
+f 1084//90 889//90 1005//90
+f 1086//91 1030//91 890//91
+f 1076//92 1026//92 786//92
+f 1074//93 785//93 1001//93
+s 75
+f 954//1396 953//1395 1003//1403
+s off
+f 1072//94 1004//94 964//94
+s 74
+f 942//1374 941//1373 999//1381
+s off
+f 1062//95 1000//95 952//95
+f 1064//96 769//96 997//96
+f 1066//97 1022//97 770//97
+s 73
+f 930//1352 929//1351 995//1359
+s off
+f 1052//98 996//98 940//98
+f 1054//99 749//99 993//99
+f 1056//100 1018//100 750//100
+s 71
+f 918//1330 917//1329 991//1337
+s off
+f 1042//101 992//101 928//101
+f 1044//102 742//102 989//102
+f 1046//103 1014//103 743//103
+f 1037//104 921//104 1015//104
+s 71
+f 919//1331 1016//1342 920//1332
+s off
+f 1047//105 933//105 1019//105
+s 73
+f 931//1353 1020//1364 932//1354
+s off
+f 1057//106 945//106 1023//106
+s 74
+f 943//1375 1024//1386 944//1376
+s off
+f 1067//107 957//107 1027//107
+s 75
+f 955//1397 1028//1408 956//1398
+s off
+f 1077//108 976//108 1031//108
+s 79
+f 974//1504 1032//1514 975//1505
+s off
+f 1087//109 981//109 1035//109
+s 76
+f 979//1419 1036//1430 980//1420
+f 1010//1424 1009//1423 803//1411 802//1410
+f 1034//1428 1033//1427 801//1409 804//1412
+f 1012//1426 1011//1425 977//1417 988//1422
+s 79
+f 1008//1510 1007//1509 972//1502 971//1501
+f 1006//1508 1005//1507 889//1493 892//1496
+f 1030//1512 1029//1511 891//1495 890//1494
+s 75
+f 1026//1406 1025//1405 783//1387 786//1390
+f 1002//1402 1001//1401 785//1389 784//1388
+f 1004//1404 1003//1403 953//1395 964//1400
+s 74
+f 1000//1382 999//1381 941//1373 952//1378
+f 998//1380 997//1379 769//1367 768//1366
+f 1022//1384 1021//1383 767//1365 770//1368
+s 73
+f 996//1360 995//1359 929//1351 940//1356
+f 994//1358 993//1357 749//1345 748//1344
+f 1018//1362 1017//1361 747//1343 750//1346
+s 71
+f 992//1338 991//1337 917//1329 928//1334
+f 990//1336 989//1335 742//1323 741//1322
+f 1014//1340 1013//1339 740//1321 743//1324
+f 1016//1342 1015//1341 921//1333 920//1332
+s 73
+f 1020//1364 1019//1363 933//1355 932//1354
+s 74
+f 1024//1386 1023//1385 945//1377 944//1376
+s 75
+f 1028//1408 1027//1407 957//1399 956//1398
+s 79
+f 1032//1514 1031//1513 976//1506 975//1505
+s 76
+f 1036//1430 1035//1429 981//1421 980//1420
+g fuselage
+s 1
+f 1097//683 1098//684 806//626 805//625
+f 1098//684 1099//685 807//627 806//626
+f 1099//685 1100//686 793//617 807//627
+g wings
+f 1101//687 1102//688 1103//689 1104//690
+g fuselage
+f 1105//691 444//301 78//197 795//619
+f 445//302 1106//692 796//620 79//198
+f 1106//692 1107//693 797//621 796//620
+f 1107//693 1108//694 798//622 797//621
+f 1108//694 1109//695 799//623 798//622
+f 1109//695 1110//696 800//624 799//623
+f 1110//696 1097//683 805//625 800//624
+g canopy
+f 1111//697 1112//698 1113//699 1114//700 1115//701 1108//694
+g fuselage
+f 1116//702 1117//703 1118//704 1110//696 1109//695
+f 1118//704 1119//705 1097//683 1110//696
+f 1119//705 1120//706 1098//684 1097//683
+f 1120//706 1121//707 1099//685 1098//684
+f 1121//707 1122//708 1100//686 1099//685
+f 1123//709 458//315 444//301 1105//691
+g canopy
+f 1124//710 1125//711 1126//712 1107//693 1106//692 445//302 486//343
+f 1108//694 1107//693 1126//712 1111//697
+f 1127//713 1128//714 1129//715 473//330 460//317 1130//716 1131//717
+f 1132//718 1128//714 1127//713 1131//717 1133//719 1134//720
+f 1135//721 1133//719 1136//722 1137//723
+g fuselage
+f 1138//724 1118//704 1117//703 1139//725 1140//726 1141//727
+f 1138//724 1142//728 1119//705 1118//704
+f 1142//728 1143//729 1120//706 1119//705
+f 1143//729 1144//730 1121//707 1120//706
+f 1144//730 1145//731 1122//708 1121//707
+f 1146//732 472//329 458//315 1123//709
+f 1116//702 1109//695 1108//694 1115//701
+g canopy
+f 487//344 473//330 1129//715 1147//733
+f 1148//734 1149//735 1150//736 1128//714 1132//718 1151//737
+g fuselage
+f 1117//703 1116//702 1114//700
+f 1116//702 1115//701 1114//700
+f 1136//722 1141//727 1152//738
+g canopy
+f 1153//739 1154//740 1155//741 1114//700
+g fuselage
+f 1156//742 1157//743 1114//700 1155//741
+f 1157//743 1139//725 1117//703 1114//700
+f 1137//723 1158//744 1157//743 1156//742
+f 1158//744 1140//726 1139//725 1157//743
+f 1136//722 1152//738 1158//744 1137//723
+f 1152//738 1141//727 1140//726 1158//744
+g canopy
+f 1125//711 1159//745 1160//746 1112//698
+f 1161//747 1149//735 1148//734 1162//748
+f 486//343 459//316 1163//749 1124//710
+f 459//316 487//344 1147//733 1164//750
+f 1160//746 1162//748 1153//739 1113//699
+f 1163//749 1164//750 1161//747 1159//745
+f 1133//719 1135//721 1134//720
+f 1161//747 1162//748 1160//746 1159//745
+f 1164//750 1147//733 1149//735 1161//747
+f 1164//750 1163//749 459//316
+f 1159//745 1125//711 1124//710 1163//749
+f 1125//711 1112//698 1111//697 1126//712
+f 1113//699 1112//698 1160//746
+f 1153//739 1114//700 1113//699
+f 1162//748 1148//734 1154//740 1153//739
+f 1154//740 1148//734 1151//737 1165//751
+f 1165//751 1151//737 1132//718 1166//752
+f 1166//752 1132//718 1134//720 1135//721
+f 1156//742 1165//751 1166//752 1137//723
+f 1155//741 1154//740 1165//751 1156//742
+f 1166//752 1135//721 1137//723
+f 1128//714 1150//736 1149//735 1147//733 1129//715
+g fuselage
+f 1145//731 1167//753 1168//754 1169//755
+f 518//375 1170//756 1130//716 460//317
+f 1170//756 1171//757 1131//717 1130//716
+f 1171//757 1172//758 1133//719 1131//717
+f 1172//758 1173//759 1136//722 1133//719
+f 1173//759 1174//760 1141//727 1136//722
+f 1174//760 1175//761 1138//724 1141//727
+f 1175//761 1176//762 1142//728 1138//724
+f 1176//762 1177//763 1143//729 1142//728
+f 1177//763 1167//753 1144//730 1143//729
+f 1167//753 1145//731 1144//730
+f 1178//764 1179//765 1167//753 1177//763
+f 1179//765 1180//766 1168//754 1167//753
+f 1180//766 1181//767 1182//768 1168//754
+f 1181//767 1183//769 1184//770 1182//768
+f 1183//769 534//391 517//374 1184//770
+f 535//392 1185//771 1170//756 518//375
+f 1185//771 1186//772 1171//757 1170//756
+f 1186//772 1187//773 1172//758 1171//757
+f 1187//773 1188//774 1173//759 1172//758
+f 1188//774 1189//775 1174//760 1173//759
+f 1189//775 1190//776 1175//761 1174//760
+f 1190//776 1191//777 1176//762 1175//761
+f 1191//777 1178//764 1177//763 1176//762
+f 1192//778 1193//779 577//433 576//432 1194//780 1195//781
+g wings
+f 1196//782 1197//783 1122//708 1145//731
+f 1197//783 1198//784 1100//686 1122//708
+f 1198//784 1199//785 793//617 1100//686
+f 1199//785 1200//786 794//618 793//617
+f 1200//786 1201//787 795//619 794//618
+f 1201//787 1202//788 1105//691 795//619
+f 1202//788 1203//789 1123//709 1105//691
+f 1203//789 1204//790 1146//732 1123//709
+s 110
+f 1204//1687 1196//1686 1145//1683 1169//1685 1146//1684
+s 1
+f 1205//791 1206//792 1199//785 1198//784
+f 1206//792 1207//793 1200//786 1199//785
+f 1207//793 1208//794 1201//787 1200//786
+f 1208//794 1209//795 1202//788 1201//787
+f 1209//795 1210//796 1203//789 1202//788
+f 1210//796 1211//797 1204//790 1203//789
+s 110
+f 1211//1688 1212//1689 1196//1686 1204//1687
+s 1
+f 1212//798 1213//799 1197//783 1196//782
+f 1213//799 1205//791 1198//784 1197//783
+f 1102//688 1101//687 1212//798 1211//797
+f 1101//687 1104//690 1213//799 1212//798
+f 1104//690 1214//800 1205//791 1213//799
+f 1214//800 1215//801 1206//792 1205//791
+f 1215//801 1216//802 1207//793 1206//792
+f 1216//802 1217//803 1208//794 1207//793
+f 1217//803 1218//804 1209//795 1208//794
+f 1218//804 1103//689 1210//796 1209//795
+f 1103//689 1102//688 1211//797 1210//796
+g fuselage
+f 1219//805 1220//806 1168//754 1182//768
+f 1220//806 1221//807 1169//755 1168//754
+f 1221//807 1146//732 1169//755
+f 574//430 1222//808 1184//770 517//374
+f 1222//808 1219//805 1182//768 1184//770
+s 52
+f 472//1285 1146//1290 1221//1292 573//1287
+s 1
+f 577//433 1193//779 1222//808 574//430
+f 1193//779 1192//778 1219//805 1222//808
+f 1192//778 1195//781 1220//806 1219//805
+f 1195//781 1194//780 1221//807 1220//806
+s 52
+f 1194//1291 576//1288 573//1287 1221//1292
+g wings
+s 1
+f 1217//803 1216//802 1215//801 1214//800 1218//804
+f 1218//804 1214//800 1104//690 1103//689
+g fuselage
+f 1223//809 1224//810 1190//776 1189//775
+f 1224//810 1225//811 1191//777 1190//776
+f 1225//811 1226//812 1178//764 1191//777
+f 1226//812 1227//813 1179//765 1178//764
+f 1227//813 1228//814 1180//766 1179//765
+f 1228//814 1229//815 1181//767 1180//766
+f 1229//815 1230//816 1183//769 1181//767
+f 1230//816 590//446 534//391 1183//769
+f 591//447 1231//817 1185//771 535//392
+f 1231//817 1232//818 1186//772 1185//771
+f 1232//818 1233//819 1187//773 1186//772
+f 1233//819 1234//820 1188//774 1187//773
+f 1234//820 1223//809 1189//775 1188//774
+f 1235//821 1236//822 1233//819 1232//818
+f 1236//822 1237//823 1234//820 1233//819
+f 1237//823 1238//824 1223//809 1234//820
+f 1238//824 1239//825 1224//810 1223//809
+f 1239//825 1240//826 1225//811 1224//810
+f 1240//826 1241//827 1226//812 1225//811
+f 1241//827 1242//828 1227//813 1226//812
+f 1242//828 1243//829 1228//814 1227//813
+f 1243//829 1244//830 1229//815 1228//814
+f 1244//830 1245//831 1230//816 1229//815
+f 1245//831 607//463 590//446 1230//816
+f 608//464 1246//832 1231//817 591//447
+f 1246//832 1235//821 1232//818 1231//817
+f 611//467 1247//833 1246//832 608//464
+f 1247//833 1248//834 1235//821 1246//832
+f 1248//834 1249//835 1236//822 1235//821
+f 1249//835 1250//836 1237//823 1236//822
+f 1250//836 1251//837 1238//824 1237//823
+f 1251//837 1252//838 1239//825 1238//824
+f 1252//838 1253//839 1240//826 1239//825
+f 1253//839 1254//840 1241//827 1240//826
+f 1254//840 1255//841 1242//828 1241//827
+f 1255//841 1256//842 1243//829 1242//828
+f 1256//842 1257//843 1244//830 1243//829
+f 1257//843 1258//844 1245//831 1244//830
+f 1258//844 610//466 607//463 1245//831
+f 1259//845 1260//846 1257//843 1256//842
+f 1260//846 1261//847 1258//844 1257//843
+f 1261//847 627//483 610//466 1258//844
+g wings
+f 628//484 1262//848 1247//833 611//467
+f 1262//848 1263//849 1248//834 1247//833
+g fuselage
+f 1263//849 1264//850 1249//835 1248//834
+f 1264//850 1265//851 1250//836 1249//835
+f 1265//851 1266//852 1251//837 1250//836
+f 1266//852 1267//853 1252//838 1251//837
+f 1267//853 1268//854 1253//839 1252//838
+f 1268//854 1269//855 1254//840 1253//839
+f 1269//855 1270//856 1255//841 1254//840
+f 1270//856 1259//845 1256//842 1255//841
+f 1271//857 1272//858 1269//855 1268//854
+f 1272//858 1273//859 1270//856 1269//855
+f 1273//859 1274//860 1259//845 1270//856
+f 1274//860 1275//861 1260//846 1259//845
+f 1275//861 1276//862 1261//847 1260//846
+f 1276//862 644//500 627//483 1261//847
+g wings
+s off
+f 645//110 1277//110 1262//110 628//110
+s 1
+f 1277//863 1278//864 1262//848
+g fuselage
+f 1278//864 1279//865 1264//850 1263//849
+f 1279//865 1280//866 1265//851 1264//850
+f 1280//866 1281//867 1266//852 1265//851
+f 1281//867 1282//868 1267//853 1266//852
+g wings
+s 112
+f 1283//1692 1284//1693 1285//1694 1286//1695
+g fuselage
+s 1
+f 697//537 696//536 1281//867 1280//866
+f 696//536 695//535 1282//868 1281//867
+f 695//535 694//534 1271//857 1282//868
+f 694//534 693//533 1272//858 1271//857
+f 693//533 692//532 1273//859 1272//858
+f 692//532 691//531 1274//860 1273//859
+f 691//531 690//530 1275//861 1274//860
+f 690//530 689//529 1276//862 1275//861
+f 689//529 661//516 644//500 1276//862
+g wings
+s 61
+f 662//1305 688//1307 1277//1308 645//1303
+s 1
+f 688//528 699//539 1278//864 1277//863
+g fuselage
+f 699//539 698//538 1279//865 1278//864
+f 698//538 697//537 1280//866 1279//865
+g wings
+s 113
+f 1287//1704 1288//1705 1267//1700 1282//1701
+s 112
+f 1288//1697 1289//1698 1268//1691 1267//1690
+s 114
+f 1289//1710 1290//1711 1271//1707 1268//1706
+s off
+f 1290//111 1287//111 1282//111 1271//111
+s 114
+f 1286//1709 1285//1708 1290//1711 1289//1710
+s 112
+f 1285//1694 1284//1693 1287//1696 1290//1699
+s 113
+f 1284//1703 1283//1702 1288//1705 1287//1704
+s 112
+f 1283//1692 1286//1695 1289//1698 1288//1697
+g prop
+s 115
+f 1294//1715 1293//1714 1292//1713 1291//1712
+f 1291//1712 1292//1713 1296//1717 1295//1716
+f 1295//1716 1296//1717 1298//1719 1297//1718
+f 1297//1718 1298//1719 1300//1721 1299//1720
+f 1299//1720 1300//1721 1302//1723 1301//1722
+f 1301//1722 1302//1723 1304//1725 1303//1724
+f 1303//1724 1304//1725 1306//1727 1305//1726
+f 1305//1726 1306//1727 1308//1729 1307//1728
+s 118
+f 1312//1733 1311//1732 1310//1731 1309//1730
+f 1314//1735 1313//1734 1311//1732 1312//1733
+f 1316//1737 1315//1736 1313//1734 1314//1735
+f 1318//1739 1317//1738 1315//1736 1316//1737
+f 1320//1741 1319//1740 1317//1738 1318//1739
+f 1322//1743 1321//1742 1319//1740 1320//1741
+f 1324//1745 1323//1744 1321//1742 1322//1743
+f 1326//1747 1325//1746 1323//1744 1324//1745
+s 116
+f 1309//1757 1294//1749 1291//1748 1312//1758
+f 1312//1758 1291//1748 1295//1750 1314//1759
+f 1314//1759 1295//1750 1297//1751 1316//1760
+f 1316//1760 1297//1751 1299//1752 1318//1761
+f 1318//1761 1299//1752 1301//1753 1320//1762
+f 1320//1762 1301//1753 1303//1754 1322//1763
+f 1322//1763 1303//1754 1305//1755 1324//1764
+f 1324//1764 1305//1755 1307//1756 1326//1765
+s 117
+f 1325//1783 1308//1774 1306//1773 1323//1782
+f 1323//1782 1306//1773 1304//1772 1321//1781
+f 1321//1781 1304//1772 1302//1771 1319//1780
+f 1319//1780 1302//1771 1300//1770 1317//1779
+f 1317//1779 1300//1770 1298//1769 1315//1778
+f 1315//1778 1298//1769 1296//1768 1313//1777
+f 1313//1777 1296//1768 1292//1766 1311//1776
+f 1311//1776 1292//1766 1293//1767 1310//1775
+s off
+f 1309//112 1310//112 1293//112 1294//112
+f 1307//113 1308//113 1325//113 1326//113
+s 119
+f 1330//1787 1329//1786 1328//1785 1327//1784
+f 1327//1784 1328//1785 1332//1789 1331//1788
+f 1331//1788 1332//1789 1334//1791 1333//1790
+f 1333//1790 1334//1791 1336//1793 1335//1792
+f 1335//1792 1336//1793 1338//1795 1337//1794
+f 1337//1794 1338//1795 1340//1797 1339//1796
+f 1339//1796 1340//1797 1342//1799 1341//1798
+f 1341//1798 1342//1799 1344//1801 1343//1800
+s 122
+f 1348//1805 1347//1804 1346//1803 1345//1802
+f 1350//1807 1349//1806 1347//1804 1348//1805
+f 1352//1809 1351//1808 1349//1806 1350//1807
+f 1354//1811 1353//1810 1351//1808 1352//1809
+f 1356//1813 1355//1812 1353//1810 1354//1811
+f 1358//1815 1357//1814 1355//1812 1356//1813
+f 1360//1817 1359//1816 1357//1814 1358//1815
+f 1362//1819 1361//1818 1359//1816 1360//1817
+s 120
+f 1345//1829 1330//1821 1327//1820 1348//1830
+f 1348//1830 1327//1820 1331//1822 1350//1831
+f 1350//1831 1331//1822 1333//1823 1352//1832
+f 1352//1832 1333//1823 1335//1824 1354//1833
+f 1354//1833 1335//1824 1337//1825 1356//1834
+f 1356//1834 1337//1825 1339//1826 1358//1835
+f 1358//1835 1339//1826 1341//1827 1360//1836
+f 1360//1836 1341//1827 1343//1828 1362//1837
+s 121
+f 1361//1855 1344//1846 1342//1845 1359//1854
+f 1359//1854 1342//1845 1340//1844 1357//1853
+f 1357//1853 1340//1844 1338//1843 1355//1852
+f 1355//1852 1338//1843 1336//1842 1353//1851
+f 1353//1851 1336//1842 1334//1841 1351//1850
+f 1351//1850 1334//1841 1332//1840 1349//1849
+f 1349//1849 1332//1840 1328//1838 1347//1848
+f 1347//1848 1328//1838 1329//1839 1346//1847
+s off
+f 1345//114 1346//114 1329//114 1330//114
+f 1343//115 1344//115 1361//115 1362//115
+s 123
+f 1366//1859 1365//1858 1364//1857 1363//1856
+f 1363//1856 1364//1857 1368//1861 1367//1860
+f 1367//1860 1368//1861 1370//1863 1369//1862
+f 1369//1862 1370//1863 1372//1865 1371//1864
+f 1371//1864 1372//1865 1374//1867 1373//1866
+f 1373//1866 1374//1867 1376//1869 1375//1868
+f 1375//1868 1376//1869 1378//1871 1377//1870
+f 1377//1870 1378//1871 1380//1873 1379//1872
+s 126
+f 1384//1877 1383//1876 1382//1875 1381//1874
+f 1386//1879 1385//1878 1383//1876 1384//1877
+f 1388//1881 1387//1880 1385//1878 1386//1879
+f 1390//1883 1389//1882 1387//1880 1388//1881
+f 1392//1885 1391//1884 1389//1882 1390//1883
+f 1394//1887 1393//1886 1391//1884 1392//1885
+f 1396//1889 1395//1888 1393//1886 1394//1887
+f 1398//1891 1397//1890 1395//1888 1396//1889
+s 124
+f 1381//1901 1366//1893 1363//1892 1384//1902
+f 1384//1902 1363//1892 1367//1894 1386//1903
+f 1386//1903 1367//1894 1369//1895 1388//1904
+f 1388//1904 1369//1895 1371//1896 1390//1905
+f 1390//1905 1371//1896 1373//1897 1392//1906
+f 1392//1906 1373//1897 1375//1898 1394//1907
+f 1394//1907 1375//1898 1377//1899 1396//1908
+f 1396//1908 1377//1899 1379//1900 1398//1909
+s 125
+f 1397//1927 1380//1918 1378//1917 1395//1926
+f 1395//1926 1378//1917 1376//1916 1393//1925
+f 1393//1925 1376//1916 1374//1915 1391//1924
+f 1391//1924 1374//1915 1372//1914 1389//1923
+f 1389//1923 1372//1914 1370//1913 1387//1922
+f 1387//1922 1370//1913 1368//1912 1385//1921
+f 1385//1921 1368//1912 1364//1910 1383//1920
+f 1383//1920 1364//1910 1365//1911 1382//1919
+s off
+f 1381//116 1382//116 1365//116 1366//116
+f 1379//117 1380//117 1397//117 1398//117
+s 127
+f 1402//1931 1401//1930 1400//1929 1399//1928
+f 1399//1928 1400//1929 1404//1933 1403//1932
+f 1403//1932 1404//1933 1406//1935 1405//1934
+f 1405//1934 1406//1935 1408//1937 1407//1936
+f 1407//1936 1408//1937 1410//1939 1409//1938
+f 1409//1938 1410//1939 1412//1941 1411//1940
+f 1411//1940 1412//1941 1414//1943 1413//1942
+f 1413//1942 1414//1943 1416//1945 1415//1944
+s 130
+f 1420//1949 1419//1948 1418//1947 1417//1946
+f 1422//1951 1421//1950 1419//1948 1420//1949
+f 1424//1953 1423//1952 1421//1950 1422//1951
+f 1426//1955 1425//1954 1423//1952 1424//1953
+f 1428//1957 1427//1956 1425//1954 1426//1955
+f 1430//1959 1429//1958 1427//1956 1428//1957
+f 1432//1961 1431//1960 1429//1958 1430//1959
+f 1434//1963 1433//1962 1431//1960 1432//1961
+s 128
+f 1417//1973 1402//1965 1399//1964 1420//1974
+f 1420//1974 1399//1964 1403//1966 1422//1975
+f 1422//1975 1403//1966 1405//1967 1424//1976
+f 1424//1976 1405//1967 1407//1968 1426//1977
+f 1426//1977 1407//1968 1409//1969 1428//1978
+f 1428//1978 1409//1969 1411//1970 1430//1979
+f 1430//1979 1411//1970 1413//1971 1432//1980
+f 1432//1980 1413//1971 1415//1972 1434//1981
+s 129
+f 1433//1999 1416//1990 1414//1989 1431//1998
+f 1431//1998 1414//1989 1412//1988 1429//1997
+f 1429//1997 1412//1988 1410//1987 1427//1996
+f 1427//1996 1410//1987 1408//1986 1425//1995
+f 1425//1995 1408//1986 1406//1985 1423//1994
+f 1423//1994 1406//1985 1404//1984 1421//1993
+f 1421//1993 1404//1984 1400//1982 1419//1992
+f 1419//1992 1400//1982 1401//1983 1418//1991
+s off
+f 1417//118 1418//118 1401//118 1402//118
+f 1415//119 1416//119 1433//119 1434//119
+s 131
+f 1435//2000 1443//2005 1436//2001
+f 1436//2001 1443//2005 1444//2006 1437//2002
+f 1437//2002 1444//2006 1445//2007 1438//2003
+f 1438//2003 1445//2007 1446//2008 1439//2004
+s 132
+f 1439//2049 1446//2051 1447//2052 1440//2050
+s 133
+f 1440//2073 1447//2075 1448//2076 1441//2074
+s 134
+f 1441//2097 1448//2099 1442//2098
+s 131
+f 1435//2000 1449//2009 1443//2005
+f 1443//2005 1449//2009 1450//2010 1444//2006
+f 1444//2006 1450//2010 1451//2011 1445//2007
+f 1445//2007 1451//2011 1452//2012 1446//2008
+s 132
+f 1446//2051 1452//2053 1453//2054 1447//2052
+s 133
+f 1447//2075 1453//2077 1454//2078 1448//2076
+s 134
+f 1448//2099 1454//2100 1442//2098
+s 131
+f 1435//2000 1455//2013 1449//2009
+f 1449//2009 1455//2013 1456//2014 1450//2010
+f 1450//2010 1456//2014 1457//2015 1451//2011
+f 1451//2011 1457//2015 1458//2016 1452//2012
+s 132
+f 1452//2053 1458//2055 1459//2056 1453//2054
+s 133
+f 1453//2077 1459//2079 1460//2080 1454//2078
+s 134
+f 1454//2100 1460//2101 1442//2098
+s 131
+f 1435//2000 1461//2017 1455//2013
+f 1455//2013 1461//2017 1462//2018 1456//2014
+f 1456//2014 1462//2018 1463//2019 1457//2015
+f 1457//2015 1463//2019 1464//2020 1458//2016
+s 132
+f 1458//2055 1464//2057 1465//2058 1459//2056
+s 133
+f 1459//2079 1465//2081 1466//2082 1460//2080
+s 134
+f 1460//2101 1466//2102 1442//2098
+s 131
+f 1435//2000 1467//2021 1461//2017
+f 1461//2017 1467//2021 1468//2022 1462//2018
+f 1462//2018 1468//2022 1469//2023 1463//2019
+f 1463//2019 1469//2023 1470//2024 1464//2020
+s 132
+f 1464//2057 1470//2059 1471//2060 1465//2058
+s 133
+f 1465//2081 1471//2083 1472//2084 1466//2082
+s 134
+f 1466//2102 1472//2103 1442//2098
+s 131
+f 1435//2000 1473//2025 1467//2021
+f 1467//2021 1473//2025 1474//2026 1468//2022
+f 1468//2022 1474//2026 1475//2027 1469//2023
+f 1469//2023 1475//2027 1476//2028 1470//2024
+s 132
+f 1470//2059 1476//2061 1477//2062 1471//2060
+s 133
+f 1471//2083 1477//2085 1478//2086 1472//2084
+s 134
+f 1472//2103 1478//2104 1442//2098
+s 131
+f 1435//2000 1479//2029 1473//2025
+f 1473//2025 1479//2029 1480//2030 1474//2026
+f 1474//2026 1480//2030 1481//2031 1475//2027
+f 1475//2027 1481//2031 1482//2032 1476//2028
+s 132
+f 1476//2061 1482//2063 1483//2064 1477//2062
+s 133
+f 1477//2085 1483//2087 1484//2088 1478//2086
+s 134
+f 1478//2104 1484//2105 1442//2098
+s 131
+f 1435//2000 1485//2033 1479//2029
+f 1479//2029 1485//2033 1486//2034 1480//2030
+f 1480//2030 1486//2034 1487//2035 1481//2031
+f 1481//2031 1487//2035 1488//2036 1482//2032
+s 132
+f 1482//2063 1488//2065 1489//2066 1483//2064
+s 133
+f 1483//2087 1489//2089 1490//2090 1484//2088
+s 134
+f 1484//2105 1490//2106 1442//2098
+s 131
+f 1435//2000 1491//2037 1485//2033
+f 1485//2033 1491//2037 1492//2038 1486//2034
+f 1486//2034 1492//2038 1493//2039 1487//2035
+f 1487//2035 1493//2039 1494//2040 1488//2036
+s 132
+f 1488//2065 1494//2067 1495//2068 1489//2066
+s 133
+f 1489//2089 1495//2091 1496//2092 1490//2090
+s 134
+f 1490//2106 1496//2107 1442//2098
+s 131
+f 1435//2000 1497//2041 1491//2037
+f 1491//2037 1497//2041 1498//2042 1492//2038
+f 1492//2038 1498//2042 1499//2043 1493//2039
+f 1493//2039 1499//2043 1500//2044 1494//2040
+s 132
+f 1494//2067 1500//2069 1501//2070 1495//2068
+s 133
+f 1495//2091 1501//2093 1502//2094 1496//2092
+s 134
+f 1496//2107 1502//2108 1442//2098
+s 131
+f 1435//2000 1503//2045 1497//2041
+f 1497//2041 1503//2045 1504//2046 1498//2042
+f 1498//2042 1504//2046 1505//2047 1499//2043
+f 1499//2043 1505//2047 1506//2048 1500//2044
+s 132
+f 1500//2069 1506//2071 1507//2072 1501//2070
+s 133
+f 1501//2093 1507//2095 1508//2096 1502//2094
+s 134
+f 1502//2108 1508//2109 1442//2098
+s 131
+f 1435//2000 1436//2001 1503//2045
+f 1503//2045 1436//2001 1437//2002 1504//2046
+f 1504//2046 1437//2002 1438//2003 1505//2047
+f 1505//2047 1438//2003 1439//2004 1506//2048
+s 132
+f 1506//2071 1439//2049 1440//2050 1507//2072
+s 133
+f 1507//2095 1440//2073 1441//2074 1508//2096
+s 134
+f 1508//2109 1441//2097 1442//2098
+g wings
+s 1
+f 1278//864 1263//849 1262//848
+f 629//485 630//486 647//502
+s 62
+f 663//2121 664//2122 699//2135 662//2120
+f 662//2120 699//2135 688//2124
+g fuselage
+f 664//2122 665//2123 698//2134 699//2135
+f 665//2123 652//2110 697//2133 698//2134
+f 652//2110 653//2111 696//2132 697//2133
+f 653//2111 654//2112 695//2131 696//2132
+f 654//2112 655//2113 694//2130 695//2131
+f 655//2113 656//2114 693//2129 694//2130
+f 656//2114 657//2115 692//2128 693//2129
+f 657//2115 658//2116 691//2127 692//2128
+f 658//2116 659//2117 690//2126 691//2127
+f 659//2117 660//2118 661//2119
+f 690//2126 661//2119 689//2125
+f 659//2117 661//2119 690//2126
+# 1430 elements
diff --git a/src/main/resources/geometry/products.rgb b/src/main/resources/geometry/products.rgb
new file mode 100644
index 0000000..0586d1f
--- /dev/null
+++ b/src/main/resources/geometry/products.rgb
Binary files differ
diff --git a/src/main/resources/geometry/pumps.int b/src/main/resources/geometry/pumps.int
new file mode 100644
index 0000000..359b7b3
--- /dev/null
+++ b/src/main/resources/geometry/pumps.int
Binary files differ
diff --git a/src/main/resources/geometry/redcone.lwo b/src/main/resources/geometry/redcone.lwo
new file mode 100644
index 0000000..214a15d
--- /dev/null
+++ b/src/main/resources/geometry/redcone.lwo
Binary files differ
diff --git a/src/main/resources/geometry/thdoor.inta b/src/main/resources/geometry/thdoor.inta
new file mode 100644
index 0000000..7f8c084
--- /dev/null
+++ b/src/main/resources/geometry/thdoor.inta
Binary files differ
diff --git a/src/main/resources/geometry/window.inta b/src/main/resources/geometry/window.inta
new file mode 100644
index 0000000..cbfca58
--- /dev/null
+++ b/src/main/resources/geometry/window.inta
Binary files differ
diff --git a/src/main/resources/images/Java3Ddot3.jpg b/src/main/resources/images/Java3Ddot3.jpg
new file mode 100644
index 0000000..011e574
--- /dev/null
+++ b/src/main/resources/images/Java3Ddot3.jpg
Binary files differ
diff --git a/src/main/resources/images/Java3d.jpg b/src/main/resources/images/Java3d.jpg
new file mode 100644
index 0000000..b6e6090
--- /dev/null
+++ b/src/main/resources/images/Java3d.jpg
Binary files differ
diff --git a/src/main/resources/images/animation1.gif b/src/main/resources/images/animation1.gif
new file mode 100644
index 0000000..6bba810
--- /dev/null
+++ b/src/main/resources/images/animation1.gif
Binary files differ
diff --git a/src/main/resources/images/animation10.gif b/src/main/resources/images/animation10.gif
new file mode 100644
index 0000000..cb04e3a
--- /dev/null
+++ b/src/main/resources/images/animation10.gif
Binary files differ
diff --git a/src/main/resources/images/animation2.gif b/src/main/resources/images/animation2.gif
new file mode 100644
index 0000000..c20aefe
--- /dev/null
+++ b/src/main/resources/images/animation2.gif
Binary files differ
diff --git a/src/main/resources/images/animation3.gif b/src/main/resources/images/animation3.gif
new file mode 100644
index 0000000..4813a7c
--- /dev/null
+++ b/src/main/resources/images/animation3.gif
Binary files differ
diff --git a/src/main/resources/images/animation4.gif b/src/main/resources/images/animation4.gif
new file mode 100644
index 0000000..c4d0083
--- /dev/null
+++ b/src/main/resources/images/animation4.gif
Binary files differ
diff --git a/src/main/resources/images/animation5.gif b/src/main/resources/images/animation5.gif
new file mode 100644
index 0000000..b41fb5d
--- /dev/null
+++ b/src/main/resources/images/animation5.gif
Binary files differ
diff --git a/src/main/resources/images/animation6.gif b/src/main/resources/images/animation6.gif
new file mode 100644
index 0000000..ce9015f
--- /dev/null
+++ b/src/main/resources/images/animation6.gif
Binary files differ
diff --git a/src/main/resources/images/animation7.gif b/src/main/resources/images/animation7.gif
new file mode 100644
index 0000000..2f1face
--- /dev/null
+++ b/src/main/resources/images/animation7.gif
Binary files differ
diff --git a/src/main/resources/images/animation8.gif b/src/main/resources/images/animation8.gif
new file mode 100644
index 0000000..7ed54bf
--- /dev/null
+++ b/src/main/resources/images/animation8.gif
Binary files differ
diff --git a/src/main/resources/images/animation9.gif b/src/main/resources/images/animation9.gif
new file mode 100644
index 0000000..e629b8c
--- /dev/null
+++ b/src/main/resources/images/animation9.gif
Binary files differ
diff --git a/src/main/resources/images/bg.jpg b/src/main/resources/images/bg.jpg
new file mode 100644
index 0000000..9790379
--- /dev/null
+++ b/src/main/resources/images/bg.jpg
Binary files differ
diff --git a/src/main/resources/images/duke-gears.jpg b/src/main/resources/images/duke-gears.jpg
new file mode 100644
index 0000000..6016262
--- /dev/null
+++ b/src/main/resources/images/duke-gears.jpg
Binary files differ
diff --git a/src/main/resources/images/earth.jpg b/src/main/resources/images/earth.jpg
new file mode 100644
index 0000000..95f004b
--- /dev/null
+++ b/src/main/resources/images/earth.jpg
Binary files differ
diff --git a/src/main/resources/images/gold.jpg b/src/main/resources/images/gold.jpg
new file mode 100644
index 0000000..aec73c5
--- /dev/null
+++ b/src/main/resources/images/gold.jpg
Binary files differ
diff --git a/src/main/resources/images/mask.png b/src/main/resources/images/mask.png
new file mode 100644
index 0000000..e5a2e35
--- /dev/null
+++ b/src/main/resources/images/mask.png
Binary files differ
diff --git a/src/main/resources/images/one.jpg b/src/main/resources/images/one.jpg
new file mode 100644
index 0000000..1eaee12
--- /dev/null
+++ b/src/main/resources/images/one.jpg
Binary files differ
diff --git a/src/main/resources/images/stone.jpg b/src/main/resources/images/stone.jpg
new file mode 100644
index 0000000..6aa8914
--- /dev/null
+++ b/src/main/resources/images/stone.jpg
Binary files differ
diff --git a/src/main/resources/images/ttimage.jpg b/src/main/resources/images/ttimage.jpg
new file mode 100644
index 0000000..f3eecb6
--- /dev/null
+++ b/src/main/resources/images/ttimage.jpg
Binary files differ
diff --git a/src/main/resources/images/wood.jpg b/src/main/resources/images/wood.jpg
new file mode 100644
index 0000000..99370c5
--- /dev/null
+++ b/src/main/resources/images/wood.jpg
Binary files differ