diff options
author | phil <[email protected]> | 2016-11-06 17:03:11 +1300 |
---|---|---|
committer | phil <[email protected]> | 2016-11-06 17:03:11 +1300 |
commit | b519162cc27f380d36c5d2f779189628a42b3800 (patch) | |
tree | 05da9b1cb5045da85665cee0b0484257552dbe73 /src/main | |
parent | 7d153738e397b6f9e7b51ea2d127fc55cdff6032 (diff) |
move java into maven standard src/main/java and resources into
src/main/resources
Diffstat (limited to 'src/main')
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 
"/> + </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 
"/> + </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 Binary files differnew file mode 100644 index 0000000..08d7456 --- /dev/null +++ b/src/main/resources/audio/hello_universe.au diff --git a/src/main/resources/audio/magic_bells.wav b/src/main/resources/audio/magic_bells.wav Binary files differnew file mode 100644 index 0000000..f89a7fd --- /dev/null +++ b/src/main/resources/audio/magic_bells.wav diff --git a/src/main/resources/audio/roar.au b/src/main/resources/audio/roar.au Binary files differnew file mode 100644 index 0000000..202b628 --- /dev/null +++ b/src/main/resources/audio/roar.au diff --git a/src/main/resources/audio/techno_machine.au b/src/main/resources/audio/techno_machine.au Binary files differnew file mode 100644 index 0000000..12e47ea --- /dev/null +++ b/src/main/resources/audio/techno_machine.au 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 Binary files differnew file mode 100644 index 0000000..8df4211 --- /dev/null +++ b/src/main/resources/geometry/brick2.int diff --git a/src/main/resources/geometry/concrete.int b/src/main/resources/geometry/concrete.int Binary files differnew file mode 100644 index 0000000..bffe4f6 --- /dev/null +++ b/src/main/resources/geometry/concrete.int diff --git a/src/main/resources/geometry/galleon.cg b/src/main/resources/geometry/galleon.cg Binary files differnew file mode 100644 index 0000000..4964118 --- /dev/null +++ b/src/main/resources/geometry/galleon.cg 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 Binary files differnew file mode 100644 index 0000000..dc13eb8 --- /dev/null +++ b/src/main/resources/geometry/gas.rgb diff --git a/src/main/resources/geometry/gravel.int b/src/main/resources/geometry/gravel.int Binary files differnew file mode 100644 index 0000000..33de30e --- /dev/null +++ b/src/main/resources/geometry/gravel.int diff --git a/src/main/resources/geometry/greenball.lwo b/src/main/resources/geometry/greenball.lwo Binary files differnew file mode 100644 index 0000000..62cd08d --- /dev/null +++ b/src/main/resources/geometry/greenball.lwo 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 Binary files differnew file mode 100644 index 0000000..b8665fa --- /dev/null +++ b/src/main/resources/geometry/minimart.cg 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 Binary files differnew file mode 100644 index 0000000..4807735 --- /dev/null +++ b/src/main/resources/geometry/numbers.int diff --git a/src/main/resources/geometry/p51_mustang.cg b/src/main/resources/geometry/p51_mustang.cg Binary files differnew file mode 100644 index 0000000..6ddcc5b --- /dev/null +++ b/src/main/resources/geometry/p51_mustang.cg 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 Binary files differnew file mode 100644 index 0000000..0586d1f --- /dev/null +++ b/src/main/resources/geometry/products.rgb diff --git a/src/main/resources/geometry/pumps.int b/src/main/resources/geometry/pumps.int Binary files differnew file mode 100644 index 0000000..359b7b3 --- /dev/null +++ b/src/main/resources/geometry/pumps.int diff --git a/src/main/resources/geometry/redcone.lwo b/src/main/resources/geometry/redcone.lwo Binary files differnew file mode 100644 index 0000000..214a15d --- /dev/null +++ b/src/main/resources/geometry/redcone.lwo diff --git a/src/main/resources/geometry/thdoor.inta b/src/main/resources/geometry/thdoor.inta Binary files differnew file mode 100644 index 0000000..7f8c084 --- /dev/null +++ b/src/main/resources/geometry/thdoor.inta diff --git a/src/main/resources/geometry/window.inta b/src/main/resources/geometry/window.inta Binary files differnew file mode 100644 index 0000000..cbfca58 --- /dev/null +++ b/src/main/resources/geometry/window.inta diff --git a/src/main/resources/images/Java3Ddot3.jpg b/src/main/resources/images/Java3Ddot3.jpg Binary files differnew file mode 100644 index 0000000..011e574 --- /dev/null +++ b/src/main/resources/images/Java3Ddot3.jpg diff --git a/src/main/resources/images/Java3d.jpg b/src/main/resources/images/Java3d.jpg Binary files differnew file mode 100644 index 0000000..b6e6090 --- /dev/null +++ b/src/main/resources/images/Java3d.jpg diff --git a/src/main/resources/images/animation1.gif b/src/main/resources/images/animation1.gif Binary files differnew file mode 100644 index 0000000..6bba810 --- /dev/null +++ b/src/main/resources/images/animation1.gif diff --git a/src/main/resources/images/animation10.gif b/src/main/resources/images/animation10.gif Binary files differnew file mode 100644 index 0000000..cb04e3a --- /dev/null +++ b/src/main/resources/images/animation10.gif diff --git a/src/main/resources/images/animation2.gif b/src/main/resources/images/animation2.gif Binary files differnew file mode 100644 index 0000000..c20aefe --- /dev/null +++ b/src/main/resources/images/animation2.gif diff --git a/src/main/resources/images/animation3.gif b/src/main/resources/images/animation3.gif Binary files differnew file mode 100644 index 0000000..4813a7c --- /dev/null +++ b/src/main/resources/images/animation3.gif diff --git a/src/main/resources/images/animation4.gif b/src/main/resources/images/animation4.gif Binary files differnew file mode 100644 index 0000000..c4d0083 --- /dev/null +++ b/src/main/resources/images/animation4.gif diff --git a/src/main/resources/images/animation5.gif b/src/main/resources/images/animation5.gif Binary files differnew file mode 100644 index 0000000..b41fb5d --- /dev/null +++ b/src/main/resources/images/animation5.gif diff --git a/src/main/resources/images/animation6.gif b/src/main/resources/images/animation6.gif Binary files differnew file mode 100644 index 0000000..ce9015f --- /dev/null +++ b/src/main/resources/images/animation6.gif diff --git a/src/main/resources/images/animation7.gif b/src/main/resources/images/animation7.gif Binary files differnew file mode 100644 index 0000000..2f1face --- /dev/null +++ b/src/main/resources/images/animation7.gif diff --git a/src/main/resources/images/animation8.gif b/src/main/resources/images/animation8.gif Binary files differnew file mode 100644 index 0000000..7ed54bf --- /dev/null +++ b/src/main/resources/images/animation8.gif diff --git a/src/main/resources/images/animation9.gif b/src/main/resources/images/animation9.gif Binary files differnew file mode 100644 index 0000000..e629b8c --- /dev/null +++ b/src/main/resources/images/animation9.gif diff --git a/src/main/resources/images/bg.jpg b/src/main/resources/images/bg.jpg Binary files differnew file mode 100644 index 0000000..9790379 --- /dev/null +++ b/src/main/resources/images/bg.jpg diff --git a/src/main/resources/images/duke-gears.jpg b/src/main/resources/images/duke-gears.jpg Binary files differnew file mode 100644 index 0000000..6016262 --- /dev/null +++ b/src/main/resources/images/duke-gears.jpg diff --git a/src/main/resources/images/earth.jpg b/src/main/resources/images/earth.jpg Binary files differnew file mode 100644 index 0000000..95f004b --- /dev/null +++ b/src/main/resources/images/earth.jpg diff --git a/src/main/resources/images/gold.jpg b/src/main/resources/images/gold.jpg Binary files differnew file mode 100644 index 0000000..aec73c5 --- /dev/null +++ b/src/main/resources/images/gold.jpg diff --git a/src/main/resources/images/mask.png b/src/main/resources/images/mask.png Binary files differnew file mode 100644 index 0000000..e5a2e35 --- /dev/null +++ b/src/main/resources/images/mask.png diff --git a/src/main/resources/images/one.jpg b/src/main/resources/images/one.jpg Binary files differnew file mode 100644 index 0000000..1eaee12 --- /dev/null +++ b/src/main/resources/images/one.jpg diff --git a/src/main/resources/images/stone.jpg b/src/main/resources/images/stone.jpg Binary files differnew file mode 100644 index 0000000..6aa8914 --- /dev/null +++ b/src/main/resources/images/stone.jpg diff --git a/src/main/resources/images/ttimage.jpg b/src/main/resources/images/ttimage.jpg Binary files differnew file mode 100644 index 0000000..f3eecb6 --- /dev/null +++ b/src/main/resources/images/ttimage.jpg diff --git a/src/main/resources/images/wood.jpg b/src/main/resources/images/wood.jpg Binary files differnew file mode 100644 index 0000000..99370c5 --- /dev/null +++ b/src/main/resources/images/wood.jpg |