]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d/src/org/simantics/proconf/g3d/views/AppearanceEditor.java
git-svn-id: https://www.simantics.org/svn/simantics/3d/trunk@22280 ac1ea38d-2e2b...
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / proconf / g3d / views / AppearanceEditor.java
diff --git a/org.simantics.g3d/src/org/simantics/proconf/g3d/views/AppearanceEditor.java b/org.simantics.g3d/src/org/simantics/proconf/g3d/views/AppearanceEditor.java
new file mode 100644 (file)
index 0000000..81cb95f
--- /dev/null
@@ -0,0 +1,1146 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ *     VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.proconf.g3d.views;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.Iterator;\r
+\r
+import org.eclipse.jface.viewers.ISelection;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.MouseAdapter;\r
+import org.eclipse.swt.events.MouseEvent;\r
+import org.eclipse.swt.events.SelectionAdapter;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.graphics.RGB;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.layout.GridLayout;\r
+import org.eclipse.swt.widgets.Button;\r
+import org.eclipse.swt.widgets.ColorDialog;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Slider;\r
+import org.eclipse.swt.widgets.Text;\r
+import org.eclipse.ui.IWorkbenchPart;\r
+import org.simantics.db.Graph;\r
+import org.simantics.db.GraphRequestAdapter;\r
+import org.simantics.db.GraphRequestStatus;\r
+import org.simantics.db.Resource;\r
+import org.simantics.layer0.utils.IEntity;\r
+import org.simantics.layer0.utils.StubLinkedList;\r
+import org.simantics.layer0.utils.internal.Entity;\r
+import org.simantics.proconf.g3d.Resources;\r
+import org.simantics.proconf.g3d.base.AppearanceTools;\r
+import org.simantics.proconf.g3d.stubs.Appearance;\r
+import org.simantics.proconf.g3d.stubs.ImageTexture;\r
+import org.simantics.proconf.g3d.stubs.Material;\r
+import org.simantics.proconf.g3d.stubs.MultiTexture;\r
+import org.simantics.proconf.g3d.stubs.Shader;\r
+import org.simantics.proconf.g3d.stubs.Texture;\r
+import org.simantics.proconf.g3d.stubs.TextureCoordinateGenerator;\r
+import org.simantics.proconf.image.ImageUtils;\r
+import org.simantics.proconf.image.interfaces.IImage;\r
+import org.simantics.proconf.image.interfaces.IImageFactory;\r
+import org.simantics.proconf.image.ui.ImageComposite;\r
+import org.simantics.proconf.ui.utils.ResourceAdaptionUtils;\r
+import org.simantics.utils.ui.ErrorLogger;\r
+\r
+\r
+public class AppearanceEditor extends SinglePageResourceView{\r
+\r
+    //Appearance appearance;\r
+       Resource shapeResource;\r
+       Resource appearanceResource;\r
+       \r
+       private enum EditorState{NONE,NO_SHAPE,NO_APPEARANCE, APPEARANCE};\r
+       EditorState state = EditorState.NONE;\r
+       \r
+    Button materialButton;\r
+    \r
+    Composite ambientComposite;\r
+    Composite diffuseComposite;\r
+    Composite specularComposite;\r
+    Composite emissiveComposite;\r
+    Slider specularSlider;\r
+    Slider transparencySlider;\r
+    \r
+    \r
+    Composite textureParent;\r
+    \r
+    Button textureButton;\r
+    Button addTextureButton;\r
+    \r
+    \r
+    //Image image = null;\r
+    \r
+    boolean updating = false;\r
+    \r
+    private ArrayList<TextureComposite> textureComposites = new ArrayList<TextureComposite>();\r
+    \r
+    Button shaderButton;\r
+    Text fragmentShaderText; \r
+    Text vertexShaderText; \r
+    \r
+    Button apply3Button;\r
+    Button apply2Button;\r
+    Button applyButton;\r
+    \r
+    public AppearanceEditor() {\r
+       super();\r
+        //super(Activator.PLUGIN_ID);\r
+       \r
+    }\r
+    \r
+    @Override\r
+    public void createPartControl(Composite parent) {\r
+       super.createPartControl(parent);\r
+       createWidgets();\r
+    }\r
+\r
+    @Override\r
+    protected String getFormText() {\r
+        return "Appearance Editor";\r
+    }\r
+\r
+//    @Override\r
+//    protected void beforeCreateWidgets() {\r
+//        if (!(getInputResource().isInstanceOf(GlobalIdMap.get(ThreeDimensionalModelingOntologyMapping.APPEARANCE))))\r
+//            throw new RuntimeException("Trying to open resource that is not appearance");\r
+//        appearance = AppearanceFactory.create(getInputResource());\r
+//    }\r
+    \r
+    \r
+\r
+    @Override\r
+    protected void createWidgets() {\r
+       \r
+       if (shapeResource == null) {\r
+               if (state != EditorState.NO_SHAPE) {\r
+                       clearForm();\r
+                       state = EditorState.NO_SHAPE;\r
+                       toolkit.createLabel(getBody(), "No shape selected");\r
+                       getActiveForm().layout(true, true);\r
+               }\r
+       } else if (appearanceResource == null){\r
+               if (state != EditorState.NO_APPEARANCE) {\r
+                       clearForm();\r
+                       state = EditorState.NO_APPEARANCE;\r
+                       toolkit.createLabel(getBody(), "Selected shape does not have material definition.");\r
+                       Button b = toolkit.createButton(getBody(), "Create Appearance", SWT.PUSH);\r
+                       b.addSelectionListener(new SelectionAdapter() {\r
+                               @Override\r
+                               public void widgetSelected(SelectionEvent e) {\r
+                                       getSession().asyncWrite(new GraphRequestAdapter() {\r
+                                               @Override\r
+                                               public GraphRequestStatus perform(Graph g) throws Exception {\r
+                                                       Appearance appearance = Appearance.createDefault(g);\r
+                                                       appearanceResource = appearance.getResource();\r
+                                                       g.addStatement(shapeResource, Resources.g3dResource.HasAppearance, appearanceResource);\r
+                                                       return GraphRequestStatus.transactionComplete();\r
+                                               }\r
+                                               \r
+                                               @Override\r
+                                               public void requestCompleted( GraphRequestStatus status) {\r
+                                                       reloadInUIThread();\r
+                                               }\r
+                                       });\r
+\r
+                               }\r
+                       });\r
+                       getActiveForm().layout(true, true);\r
+               }\r
+       } else {\r
+               if (state != EditorState.APPEARANCE) {\r
+                       clearForm();\r
+                       state = EditorState.APPEARANCE;\r
+                       createMaterialGroup(newGridSection(2, 2, false, false, "Material", "Material properties"));\r
+                       createTextureGroup(newGridSection(1, 1, false, false, "Texture", "Texture properties"));\r
+                       createShaderGroup(newGridSection(2, 2, false, false, "Shader", "Shader properties"));\r
+                       getActiveForm().layout(true, true);\r
+               }\r
+               \r
+       }\r
+    }\r
+    \r
+    @Override\r
+    public void clearForm() {\r
+       super.clearForm();\r
+       textureComposites.clear();\r
+    }\r
+    \r
+    @Override\r
+    protected void pageSelectionChanged(IWorkbenchPart part, ISelection selection) {\r
+       Resource res[] = ResourceAdaptionUtils.toResources(selection);\r
+       if (res.length == 0) {\r
+               shapeResource = null;\r
+               appearanceResource = null;\r
+               reload();\r
+               return;\r
+       }\r
+       final Resource sel = res[0];\r
+       if (sel.equals(shapeResource))\r
+                       return;\r
+       //System.out.println("AppearanceEditor.pageSelectionChanged");\r
+       getSession().asyncRead(new GraphRequestAdapter() {\r
+               @Override\r
+               public GraphRequestStatus perform(Graph g) throws Exception {\r
+                       \r
+                       shapeResource = null;\r
+                       appearanceResource = null;\r
+                       // selected object must be a shape\r
+                       if (!g.isInstanceOf(sel, Resources.g3dResource.Shape)) {\r
+                               return GraphRequestStatus.transactionCancel();\r
+                       }\r
+                       // the shape must not be ah geometry definition\r
+                       if (g.getObjects(sel, Resources.g3dResource.GeometryDefinitionOf).size() > 0)\r
+                               return GraphRequestStatus.transactionCancel();\r
+                       \r
+                       shapeResource = sel;\r
+                       Collection<Resource> res = g.getObjects(shapeResource, Resources.g3dResource.HasAppearance);\r
+                       if (res.size() == 1)\r
+                               appearanceResource = res.iterator().next();\r
+                       return GraphRequestStatus.transactionComplete();\r
+               }\r
+               \r
+               @Override\r
+               public void requestCompleted(GraphRequestStatus status) {\r
+                       reloadInUIThread();\r
+               }\r
+       });\r
+    }\r
+    \r
+    public void reloadInUIThread() {\r
+       parent.getDisplay().asyncExec(new Runnable() {\r
+                       @Override\r
+                       public void run() {\r
+                               reload();\r
+                       }\r
+               });\r
+    }\r
+    \r
+    public void reload() {\r
+        if (updating)\r
+             return;\r
+       createWidgets();\r
+       if (state == EditorState.APPEARANCE) {\r
+               getSession().asyncRead(new GraphRequestAdapter() {\r
+                       @Override\r
+                       public GraphRequestStatus perform(Graph g) throws Exception {\r
+                               reload(g);\r
+                               return GraphRequestStatus.transactionComplete();\r
+                       }\r
+               });\r
+       }\r
+    }\r
+\r
+    @Override\r
+    public void reload(Graph g) {\r
+        if (updating)\r
+            return;\r
+        if (state != EditorState.APPEARANCE) {\r
+               return;\r
+        }\r
+        Appearance appearance = new Appearance(g,appearanceResource);\r
+        Material m = appearance.getMaterial();\r
+        Texture t = appearance.getTexture();\r
+        Shader s = appearance.getShader();\r
+        loadMaterial(m);\r
+        loadTexture(t);\r
+        loadShader(s);\r
+\r
+\r
+    }\r
+    \r
+    private void loadMaterial(Material m) {\r
+       final boolean hasMaterial;\r
+       final Color ambient;\r
+       final Color diffuse;\r
+       final Color specular;\r
+       final Color emissive;\r
+       final int shininess;\r
+       final int transparency;\r
+       if (m == null) {\r
+               hasMaterial = false;\r
+               ambient = null;\r
+               diffuse = null;\r
+               specular = null;\r
+               emissive = null;\r
+               shininess = 0;\r
+               transparency = 0;\r
+       } else {\r
+               hasMaterial = true;\r
+               ambient = AppearanceTools.getColor(m.getAmbientColor(), this.getBody().getDisplay());\r
+               diffuse = AppearanceTools.getColor(m.getDiffuseColor(), this.getBody().getDisplay());\r
+               specular = AppearanceTools.getColor(m.getSpecularColor(), this.getBody().getDisplay());\r
+               emissive = AppearanceTools.getColor(m.getEmissiveColor(), this.getBody().getDisplay());\r
+               shininess = (int)m.getShininess()[0];\r
+               transparency = (int)(m.getTransparency()[0]*100.0);\r
+       }\r
+       parent.getDisplay().asyncExec(new Runnable() {\r
+               @Override\r
+               public void run() {\r
+                       boolean t = hasMaterial;\r
+                   materialButton.setSelection(t);\r
+                   ambientComposite.setEnabled(t);\r
+                   diffuseComposite.setEnabled(t);\r
+                   specularComposite.setEnabled(t);\r
+                   emissiveComposite.setEnabled(t);\r
+                   specularSlider.setEnabled(t);\r
+                   transparencySlider.setEnabled(t);\r
+                       if (hasMaterial) {\r
+                   ambientComposite.setBackground(ambient);\r
+                   diffuseComposite.setBackground(diffuse);\r
+                   specularComposite.setBackground(specular);\r
+                   emissiveComposite.setBackground(emissive);\r
+                   specularSlider.setSelection(shininess);\r
+                   transparencySlider.setSelection(transparency);\r
+               } else {\r
+                       Color c = parent.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY);\r
+                       ambientComposite.setBackground(c);\r
+                   diffuseComposite.setBackground(c);\r
+                   specularComposite.setBackground(c);\r
+                   emissiveComposite.setBackground(c);\r
+               }\r
+                       \r
+               };\r
+       });\r
+        \r
+    }\r
+    \r
+    private void loadTexture(Texture t) {\r
+       //System.out.println("AppearanceEditor.loadTexture");\r
+        if (t == null) {\r
+               parent.getDisplay().asyncExec(new Runnable() {\r
+                       @Override\r
+                       public void run() {\r
+                               textureButton.setSelection(false);\r
+                       }\r
+               });\r
+            \r
+            return;\r
+        }\r
+        parent.getDisplay().asyncExec(new Runnable() {\r
+               @Override\r
+               public void run() {\r
+                       textureButton.setSelection(true);\r
+               }\r
+        });\r
+        \r
+        if (t.isInstanceOf(Resources.g3dResource.ImageTexture)) {\r
+            //final ImageTexture t2 = new ImageTexture(t);\r
+               final Resource t2 = t.getResource();\r
+               parent.getDisplay().asyncExec(new Runnable() {\r
+                       @Override\r
+                       public void run() {\r
+                               while (textureComposites.size() > 1) {\r
+                           textureComposites.remove(textureComposites.size()-1).dispose();\r
+                       }\r
+                       if (textureComposites.size() == 0) {\r
+                           textureComposites.add(new TextureComposite(textureParent,SWT.NONE));\r
+                       }\r
+                       getSession().asyncWrite(new GraphRequestAdapter() {\r
+                               public GraphRequestStatus perform(Graph g) throws Exception {\r
+                                       try {\r
+                                   textureComposites.get(0).update(new ImageTexture(g,t2));\r
+                               } catch (Exception e) {\r
+                                   ErrorLogger.defaultLogError(e);\r
+                               }\r
+                               return GraphRequestStatus.transactionComplete();\r
+                               };\r
+                   \r
+                       });\r
+                       }\r
+               });\r
+            \r
+            \r
+        } else if (t.isInstanceOf(Resources.g3dResource.MultiTexture)) {\r
+            \r
+            MultiTexture mt = new MultiTexture(t);\r
+            StubLinkedList<IEntity> elements = new StubLinkedList<IEntity>(mt.getMultiTextureElementList());\r
+            final Resource listResource = mt.getMultiTextureElementList().getResource();\r
+            final int count = elements.size();\r
+            parent.getDisplay().asyncExec(new Runnable() {\r
+               @Override\r
+               public void run() {\r
+                       while (textureComposites.size() > count) {\r
+                        textureComposites.get(textureComposites.size()-1).dispose();\r
+                        textureComposites.remove(textureComposites.size()-1);\r
+                    }\r
+                    while (textureComposites.size() < count) {\r
+                        textureComposites.add(new TextureComposite(textureParent,SWT.NONE));\r
+                    }\r
+                       getSession().asyncWrite(new GraphRequestAdapter() {\r
+                               @Override\r
+                               public GraphRequestStatus perform(Graph g)\r
+                                               throws Exception {\r
+                                       StubLinkedList<IEntity> elements = new StubLinkedList<IEntity>(new Entity(g,listResource));\r
+                                       Iterator<IEntity> i = elements.iterator();\r
+                           int index = 0;\r
+                           while (i.hasNext()) {\r
+                               //MultiTextureElement e = new MultiTextureElement(i.next());\r
+                               //int index = e.getMultiTextureIndexValue();\r
+                               Texture tex = new Texture(i.next());//e.getTexture();\r
+                               if (tex.isInstanceOf(Resources.g3dResource.ImageTexture)) {\r
+                                   ImageTexture t2 = new ImageTexture(tex);\r
+                                   try {\r
+                                       textureComposites.get(index).update(t2);\r
+                                   } catch (Exception err) {\r
+                                       ErrorLogger.defaultLogError(err);\r
+                                   }\r
+                               }\r
+                               index++;\r
+                           }\r
+                                       return null;\r
+                               }\r
+                       });\r
+               }\r
+            });\r
+            \r
+            \r
+            \r
+        }\r
+    }\r
+    \r
+    private void loadShader(Shader s) {\r
+       final boolean hasShader = (s != null);\r
+       final String vertexShader;\r
+       final String fragmentShader;\r
+       if (hasShader) {\r
+               vertexShader = s.getVertexShader()[0];\r
+               fragmentShader = s.getFragmentShader()[0];\r
+       } else {\r
+               vertexShader = null;\r
+               fragmentShader = null;\r
+       }\r
+       parent.getDisplay().asyncExec(new Runnable() {\r
+               @Override\r
+               public void run() {\r
+                       if (!hasShader) {\r
+                   shaderButton.setSelection(false);\r
+               } else {\r
+                   shaderButton.setSelection(true);\r
+                   vertexShaderText.setText(vertexShader);\r
+                   fragmentShaderText.setText(fragmentShader);\r
+               }\r
+                       \r
+               }\r
+       });\r
+        \r
+    }\r
+    \r
+    private void createMaterialGroup(Composite parent) {\r
+        toolkit.paintBordersFor(parent);\r
+        toolkit.setBorderStyle(SWT.BORDER);\r
+        \r
+        materialButton = toolkit.createButton(parent, "Has Material", SWT.CHECK);\r
+        materialButton.addSelectionListener(new SelectionAdapter() {\r
+            public void widgetSelected(SelectionEvent e) {\r
+               boolean t = materialButton.getSelection();\r
+                   ambientComposite.setEnabled(t);\r
+                   diffuseComposite.setEnabled(t);\r
+                   specularComposite.setEnabled(t);\r
+                   emissiveComposite.setEnabled(t);\r
+                   specularSlider.setEnabled(t);\r
+                   transparencySlider.setEnabled(t);\r
+                \r
+            }\r
+        });\r
+        GridData data = new GridData(GridData.FILL, GridData.FILL, false, false,2,1);\r
+        materialButton.setLayoutData(data);\r
+     \r
+        data = new GridData(GridData.FILL, GridData.FILL, false, false,1,1);\r
+        data.widthHint = 100;\r
+        data.heightHint = 20;\r
+\r
+        toolkit.createLabel(parent, "Ambient");\r
+        ambientComposite = toolkit.createComposite(parent, SWT.BORDER);\r
+        ambientComposite.setLayoutData(data);\r
+        ambientComposite.addMouseListener(new MouseAdapter() {\r
+           @Override\r
+            public void mouseUp(MouseEvent e) {\r
+                ColorDialog dialog = new ColorDialog(AppearanceEditor.this.getBody().getShell());\r
+                RGB rgb = dialog.open();\r
+                if (rgb != null) {\r
+                    ambientComposite.setBackground(new Color(AppearanceEditor.this.getBody().getDisplay(),rgb));\r
+                    \r
+                }\r
+           } \r
+        });\r
+\r
+        toolkit.createLabel(parent, "Diffuse");\r
+        diffuseComposite = toolkit.createComposite(parent, SWT.BORDER);\r
+        diffuseComposite.setLayoutData(data);\r
+        diffuseComposite.addMouseListener(new MouseAdapter() {\r
+            @Override\r
+             public void mouseUp(MouseEvent e) {\r
+                 ColorDialog dialog = new ColorDialog(AppearanceEditor.this.getBody().getShell());\r
+                 RGB rgb = dialog.open();\r
+                 if (rgb != null) {\r
+                     diffuseComposite.setBackground(new Color(AppearanceEditor.this.getBody().getDisplay(),rgb));\r
+                     \r
+                 }\r
+            } \r
+         });\r
+        toolkit.createLabel(parent, "Specular");\r
+        specularComposite = toolkit.createComposite(parent, SWT.BORDER);\r
+        specularComposite.setLayoutData(data);\r
+        specularComposite.addMouseListener(new MouseAdapter() {\r
+            @Override\r
+             public void mouseUp(MouseEvent e) {\r
+                 ColorDialog dialog = new ColorDialog(AppearanceEditor.this.getBody().getShell());\r
+                 \r
+                 RGB rgb = dialog.open();\r
+                 if (rgb != null) {\r
+                     specularComposite.setBackground(new Color(AppearanceEditor.this.getBody().getDisplay(),rgb));\r
+                     \r
+                 }\r
+            } \r
+         });\r
+        toolkit.createLabel(parent, "Emissive");\r
+        emissiveComposite = toolkit.createComposite(parent, SWT.BORDER);\r
+        emissiveComposite.setLayoutData(data);\r
+        emissiveComposite.addMouseListener(new MouseAdapter() {\r
+            @Override\r
+             public void mouseUp(MouseEvent e) {\r
+                 ColorDialog dialog = new ColorDialog(AppearanceEditor.this.getBody().getShell());\r
+                 RGB rgb = dialog.open();\r
+                 if (rgb != null) {\r
+                     emissiveComposite.setBackground(new Color(AppearanceEditor.this.getBody().getDisplay(),rgb));\r
+                     \r
+                 }\r
+            } \r
+         });\r
+        toolkit.createLabel(parent, "Shininess");\r
+        specularSlider = new Slider(parent,SWT.NONE);\r
+        specularSlider.setValues(20, 0, 255, 1, 1, 10);\r
+        toolkit.adapt(specularSlider, true, true);\r
+        toolkit.createLabel(parent, "Transparency");\r
+        transparencySlider = new Slider(parent,SWT.NONE);\r
+        transparencySlider.setValues(0, 0, 100, 1, 1, 10);\r
+        toolkit.adapt(transparencySlider, true, true);\r
+        apply2Button = toolkit.createButton(parent, "Apply", SWT.PUSH);\r
+        apply2Button.addSelectionListener(new SelectionAdapter() {\r
+            public void widgetSelected(SelectionEvent e) {\r
+                convertMaterial();\r
+            }\r
+        });\r
+        \r
+    }\r
+    \r
+    private void createTextureGroup(Composite parent) {\r
+        textureParent = parent;\r
+        toolkit.paintBordersFor(parent);\r
+        toolkit.setBorderStyle(SWT.BORDER);\r
+        \r
+        textureButton = toolkit.createButton(parent, "Has Texture", SWT.CHECK);\r
+        textureButton.addSelectionListener(new SelectionAdapter() {\r
+            public void widgetSelected(SelectionEvent e) {\r
+                //loadImageButton.setEnabled(textureButton.getSelection());\r
+                //imageComposite.setEnabled(textureButton.getSelection());\r
+                //textureButton.setEnabled(textureButton.getSelection());\r
+                \r
+            }\r
+        });\r
+        \r
+        \r
+        \r
+        textureButton.addSelectionListener(new SelectionAdapter() {\r
+            public void widgetSelected(SelectionEvent e) {\r
+                //loadImageButton.setEnabled(textureButton.getSelection());\r
+                //imageComposite.setEnabled(textureButton.getSelection());\r
+                //textureButton.setEnabled(textureButton.getSelection());\r
+                \r
+            }\r
+        });\r
+        addTextureButton = toolkit.createButton(parent, "Add Texture", SWT.PUSH);\r
+        addTextureButton.addSelectionListener(new SelectionAdapter() {\r
+            public void widgetSelected(SelectionEvent e) {\r
+                textureComposites.add(new TextureComposite(textureParent,SWT.NONE));\r
+            }\r
+        });\r
+        applyButton = toolkit.createButton(parent, "Apply", SWT.PUSH);\r
+        applyButton.addSelectionListener(new SelectionAdapter() {\r
+            public void widgetSelected(SelectionEvent e) {\r
+                convertImage();\r
+            }\r
+        });\r
+        \r
+    }\r
+    \r
+    private void createShaderGroup(Composite parent) {\r
+        toolkit.paintBordersFor(parent);\r
+        toolkit.setBorderStyle(SWT.BORDER);\r
+        GridData data = new GridData(SWT.FILL,SWT.FILL,true,true,2,1);\r
+        shaderButton = toolkit.createButton(parent, "Has Shader", SWT.CHECK);\r
+        shaderButton.addSelectionListener(new SelectionAdapter() {\r
+            public void widgetSelected(SelectionEvent e) {\r
+               \r
+                \r
+            }\r
+        });\r
+        shaderButton.setLayoutData(data);\r
+        data = new GridData(SWT.FILL,SWT.FILL,true,true,1,1);\r
+        data.widthHint = 400;\r
+        data.heightHint = 200;\r
+        toolkit.createLabel(parent, "Vertex Shader");\r
+        vertexShaderText = toolkit.createText(parent,"", SWT.MULTI);\r
+        vertexShaderText.setLayoutData(data);\r
+        toolkit.createLabel(parent, "Fragment Shader");\r
+        fragmentShaderText = toolkit.createText(parent,"", SWT.MULTI);\r
+        fragmentShaderText.setLayoutData(data);\r
+        apply3Button = toolkit.createButton(parent, "Apply", SWT.PUSH);\r
+        apply3Button.addSelectionListener(new SelectionAdapter() {\r
+            public void widgetSelected(SelectionEvent e) {\r
+                convertShader();\r
+            }\r
+        });\r
+    }\r
+    \r
+    \r
+    \r
+    private void convertShader() {\r
+        updating = true;\r
+        final boolean hasShader = shaderButton.getSelection();\r
+        final String vertexShader = vertexShaderText.getText();\r
+        final String fragmentShader = fragmentShaderText.getText();\r
+        getSession().asyncWrite(new GraphRequestAdapter() {\r
+               @Override\r
+               public GraphRequestStatus perform(Graph g) throws Exception {\r
+                       Appearance appearance = new Appearance(g,appearanceResource);\r
+                       if (hasShader) {\r
+                    Shader s = appearance.getShader();\r
+                    if (s == null) {\r
+                        s = Shader.createDefault(g);\r
+                        appearance.setShader(s);\r
+\r
+                    }\r
+                    s.setVertexShader(vertexShader);\r
+                    s.setFragmentShader(fragmentShader);\r
+                } else {\r
+                    appearance.setShader(null);\r
+                }\r
+                       \r
+                       updating = false;\r
+                       return GraphRequestStatus.transactionComplete();\r
+               }\r
+        });\r
+        \r
+        \r
+    }\r
+    \r
+    private void convertMaterial() {\r
+        updating = true;\r
+        \r
+        final boolean hasMaterial = materialButton.getSelection();\r
+        final Color ambientColor = ambientComposite.getBackground();\r
+        final Color diffuseColor = diffuseComposite.getBackground();\r
+        final Color specularColor = specularComposite.getBackground();\r
+        final Color emissiveColor = emissiveComposite.getBackground();\r
+        final double shininess = (double)specularSlider.getSelection();\r
+        final double transparency = (double)transparencySlider.getSelection()/ 100.0;\r
+        \r
+        getSession().asyncWrite(new GraphRequestAdapter() {\r
+               @Override\r
+               public GraphRequestStatus perform(Graph g) throws Exception {\r
+                       Appearance appearance = new Appearance(g,appearanceResource);\r
+                       if (hasMaterial) {\r
+                    Material m = appearance.getMaterial();\r
+                    if (m == null) {\r
+                        m = Material.createDefault(g);\r
+                    }\r
+                    org.simantics.proconf.g3d.stubs.Color aColor = m.getAmbientColor();\r
+                    org.simantics.proconf.g3d.stubs.Color dColor = m.getDiffuseColor();\r
+                    org.simantics.proconf.g3d.stubs.Color sColor = m.getSpecularColor();\r
+                    org.simantics.proconf.g3d.stubs.Color eColor = m.getEmissiveColor();\r
+                    AppearanceTools.setColor(aColor,ambientColor);\r
+                    AppearanceTools.setColor(dColor,diffuseColor);\r
+                    AppearanceTools.setColor(sColor, specularColor);\r
+                    AppearanceTools.setColor(eColor, emissiveColor);\r
+                    m.setShininess(shininess);\r
+                    m.setTransparency(transparency);\r
+                    appearance.setMaterial(m);\r
+                } else {\r
+                       appearance.removeRelatedStatements(Resources.g3dResource.HasMaterial);\r
+                }\r
+                       \r
+                       updating = false;\r
+                       return GraphRequestStatus.transactionComplete();\r
+               }\r
+        });\r
+        \r
+    }\r
+    \r
+    private void convertImage() {\r
+        updating = true;\r
+        getSession().syncWrite(new GraphRequestAdapter() {\r
+               @Override\r
+               public GraphRequestStatus perform(Graph g) throws Exception {\r
+                       Appearance appearance = new Appearance(g,appearanceResource);\r
+                       Texture t = appearance.getTexture();\r
+                if (textureComposites.size() == 1) {\r
+                    ImageTexture t2 = null;\r
+                    if (t != null && t.isInstanceOf(Resources.g3dResource.ImageTexture)) {\r
+                        t2 = new ImageTexture(t);\r
+                    } else {\r
+                        t2 = ImageTexture.createDefault(g);\r
+                        appearance.setTexture(t2);\r
+                    }\r
+                    final Resource mode = textureComposites.get(0).getModeType();\r
+                               \r
+\r
+                    if (mode != null)\r
+                        t2.setTextureMode(mode);\r
+                    textureComposites.get(0).getTexture(t2);\r
+                    \r
+                } else if (textureComposites.size() > 1) {\r
+                    MultiTexture mt = null;\r
+                    if (t != null\r
+                            && t.isInstanceOf(Resources.g3dResource.MultiTexture)) {\r
+                        mt = new MultiTexture(t);\r
+                    } else {\r
+                        mt = MultiTexture.createDefault(g);\r
+                        appearance.setTexture(mt);\r
+                    }\r
+                    StubLinkedList<IEntity> elements = new StubLinkedList<IEntity>(mt.getMultiTextureElementList());\r
+                    //PropertyTypeSet<MultiTextureElement> elements = mt.getMultiTextureElementSet();\r
+                    Iterator<IEntity> it = elements.iterator();\r
+                    for (int i = 0; i < textureComposites.size(); i++) {\r
+                        TextureComposite tc = textureComposites.get(i);\r
+                        \r
+                        ImageTexture tex = null;\r
+                        if (it.hasNext())\r
+                               tex = new ImageTexture(it.next());\r
+                        else {\r
+                               tex = ImageTexture.createDefault(g);\r
+                               elements.add(i,tex);\r
+                        }\r
+                        Resource mode = tc.getModeType();\r
+                        if (mode == null)\r
+                            tex.setTextureMode(Resources.g3dResource.CombineMode_modulate);\r
+                        else\r
+                            tex.setTextureMode(mode);\r
+                        \r
+                        textureComposites.get(i).getTexture(tex);\r
+                        \r
+                    }\r
+                } else {\r
+                    appearance.setTexture(null);\r
+                }\r
+          \r
+                updating = false;\r
+                       return GraphRequestStatus.transactionComplete();\r
+               }\r
+        });\r
+     \r
+            \r
+           \r
+        \r
+    }\r
+\r
+    private class TextureComposite extends Composite {\r
+        private Button textureGeneratorButton;\r
+        private Button sphereMapButton;\r
+        private Button eyeLinearButton;\r
+        private Button objectLinearButton;\r
+        private Button normalMapButton;\r
+        private Button reflectionMapButton;\r
+        \r
+        private Button modulateButton;\r
+        private Button replaceButton;\r
+        private Button decalButton;\r
+        private Button blendButton;\r
+        \r
+        \r
+        \r
+        private Button loadImageButton;\r
+        private ImageComposite imageComposite;\r
+        private Button removeButton;\r
+        \r
+        \r
+        public TextureComposite(Composite parent, int style) {\r
+            super(parent,style);\r
+            GridLayout layout = new GridLayout(2,false);\r
+            this.setLayout(layout);\r
+            \r
+            loadImageButton = toolkit.createButton(this, "Load Texture", SWT.PUSH);\r
+            loadImageButton.addSelectionListener(new SelectionAdapter() {\r
+                public void widgetSelected(SelectionEvent e) {\r
+\r
+                       IImage[] images = ImageUtils.loadImagesDialog(getSite().getShell(), false, ImageUtils.getImageFactories());\r
+                       if (images == null)\r
+                               return;\r
+                       IImage image = images[0];\r
+                       setImage(image);\r
+\r
+                }\r
+            });\r
+            GridData data = new GridData(SWT.LEFT,SWT.FILL,false,false,2,1);\r
+            \r
+            loadImageButton.setLayoutData(data);\r
+            data = new GridData(SWT.FILL,SWT.FILL,true,true,2,1);\r
+            imageComposite = new ImageComposite(this,SWT.BORDER);\r
+            imageComposite.setLayoutData(data);\r
+            \r
+            Composite texGenComposite = toolkit.createComposite(this, SWT.BORDER);\r
+            layout = new GridLayout(1,false);\r
+            texGenComposite.setLayout(layout);\r
+            data = new GridData(SWT.FILL,SWT.FILL,true,true,1,1);\r
+            data.heightHint = 140;\r
+            texGenComposite.setLayoutData(data);\r
+            textureGeneratorButton = toolkit.createButton(texGenComposite, "Has Texture Coordinate Generator", SWT.CHECK);\r
+            textureGeneratorButton.addSelectionListener(new SelectionAdapter() {\r
+                public void widgetSelected(SelectionEvent e) {\r
+                    sphereMapButton.setEnabled(textureGeneratorButton.getSelection());\r
+                    eyeLinearButton.setEnabled(textureGeneratorButton.getSelection());\r
+                    objectLinearButton.setEnabled(textureGeneratorButton.getSelection());\r
+                    normalMapButton.setEnabled(textureGeneratorButton.getSelection());\r
+                    reflectionMapButton.setEnabled(textureGeneratorButton.getSelection());\r
+                    \r
+                }\r
+            });\r
+            \r
+            sphereMapButton = toolkit.createButton(texGenComposite, "Shpere Map", SWT.RADIO);\r
+            sphereMapButton.addSelectionListener(new SelectionAdapter() {\r
+                public void widgetSelected(SelectionEvent e) {\r
+                    if (!sphereMapButton.getSelection()) {\r
+                        sphereMapButton.setSelection(true);\r
+                    } else {\r
+                        eyeLinearButton.setSelection(false);\r
+                        objectLinearButton.setSelection(false);\r
+                        normalMapButton.setSelection(false);\r
+                        reflectionMapButton.setSelection(false);\r
+                    }\r
+                }\r
+            });\r
+            eyeLinearButton = toolkit.createButton(texGenComposite, "Eye Linear", SWT.RADIO);\r
+            eyeLinearButton.addSelectionListener(new SelectionAdapter() {\r
+                public void widgetSelected(SelectionEvent e) {\r
+                    if (!eyeLinearButton.getSelection()) {\r
+                        eyeLinearButton.setSelection(true);\r
+                    } else {\r
+                        sphereMapButton.setSelection(false);\r
+                        objectLinearButton.setSelection(false);\r
+                        normalMapButton.setSelection(false);\r
+                        reflectionMapButton.setSelection(false);\r
+                    }\r
+                }\r
+            });\r
+            objectLinearButton = toolkit.createButton(texGenComposite, "Object Linear", SWT.RADIO);\r
+            objectLinearButton.addSelectionListener(new SelectionAdapter() {\r
+                public void widgetSelected(SelectionEvent e) {\r
+                    if (!objectLinearButton.getSelection()) {\r
+                        objectLinearButton.setSelection(true);\r
+                    } else {\r
+                        eyeLinearButton.setSelection(false);\r
+                        sphereMapButton.setSelection(false);\r
+                        normalMapButton.setSelection(false);\r
+                        reflectionMapButton.setSelection(false);\r
+                    }\r
+                }\r
+            });\r
+            normalMapButton = toolkit.createButton(texGenComposite, "Normal Map", SWT.RADIO);\r
+            normalMapButton.addSelectionListener(new SelectionAdapter() {\r
+                public void widgetSelected(SelectionEvent e) {\r
+                    if (!normalMapButton.getSelection()) {\r
+                        normalMapButton.setSelection(true);\r
+                    } else {\r
+                        eyeLinearButton.setSelection(false);\r
+                        objectLinearButton.setSelection(false);\r
+                        sphereMapButton.setSelection(false);\r
+                        reflectionMapButton.setSelection(false);\r
+                    }\r
+                }\r
+            });\r
+            reflectionMapButton = toolkit.createButton(texGenComposite, "Reflection Map", SWT.RADIO);\r
+            reflectionMapButton.addSelectionListener(new SelectionAdapter() {\r
+                public void widgetSelected(SelectionEvent e) {\r
+                    if (!reflectionMapButton.getSelection()) {\r
+                        reflectionMapButton.setSelection(true);\r
+                    } else {\r
+                        eyeLinearButton.setSelection(false);\r
+                        objectLinearButton.setSelection(false);\r
+                        normalMapButton.setSelection(false);\r
+                        sphereMapButton.setSelection(false);\r
+                    }\r
+                }\r
+            });\r
+            \r
+            Composite texModeComposite = toolkit.createComposite(this, SWT.BORDER);\r
+            texModeComposite.setLayout(layout);\r
+            texModeComposite.setLayoutData(data);\r
+            modulateButton = toolkit.createButton(texModeComposite, "Modulate", SWT.RADIO);\r
+            modulateButton.addSelectionListener(new SelectionAdapter() {\r
+                public void widgetSelected(SelectionEvent e) {\r
+                        modulateButton.setSelection(true);\r
+                        replaceButton.setSelection(false);\r
+                        blendButton.setSelection(false);\r
+                        decalButton.setSelection(false);\r
+\r
+                }\r
+            });\r
+            blendButton = toolkit.createButton(texModeComposite, "Blend", SWT.RADIO);\r
+            blendButton.addSelectionListener(new SelectionAdapter() {\r
+                public void widgetSelected(SelectionEvent e) {\r
+                        modulateButton.setSelection(false);\r
+                        replaceButton.setSelection(false);\r
+                        blendButton.setSelection(true);\r
+                        decalButton.setSelection(false);\r
+\r
+                }\r
+            });\r
+            replaceButton = toolkit.createButton(texModeComposite, "Replace", SWT.RADIO);\r
+            replaceButton.addSelectionListener(new SelectionAdapter() {\r
+                public void widgetSelected(SelectionEvent e) {\r
+                        modulateButton.setSelection(false);\r
+                        replaceButton.setSelection(true);\r
+                        blendButton.setSelection(false);\r
+                        decalButton.setSelection(false);\r
+\r
+                }\r
+            });\r
+            decalButton = toolkit.createButton(texModeComposite, "Decal", SWT.RADIO);\r
+            decalButton.addSelectionListener(new SelectionAdapter() {\r
+                public void widgetSelected(SelectionEvent e) {\r
+                        modulateButton.setSelection(false);\r
+                        replaceButton.setSelection(false);\r
+                        blendButton.setSelection(false);\r
+                        decalButton.setSelection(true);\r
+\r
+                }\r
+            });\r
+            \r
+            removeButton = toolkit.createButton(this, "Remove texture", SWT.PUSH);\r
+            parent.getParent().getParent().layout(true, true);\r
+        }\r
+        \r
+        public void setImage(IImage image) {\r
+            imageComposite.setImage(image);\r
+        }\r
+        \r
+        public IImage getImage() {\r
+            return imageComposite.getImage();\r
+        }\r
+        \r
+        public void update(ImageTexture t2) throws Exception {\r
+               Graph graph = t2.getGraph();\r
+            org.simantics.image.stubs.Image i = t2.getImage();\r
+            IImageFactory f = ImageUtils.getImageFactoryForResource(graph,i.getResource());\r
+            final IImage p = f.createImageForResource(graph,i.getResource());\r
+//            PixelDimension pd = p.getDimensions().getPixelDimension();\r
+//            if (pd==null) pd = AppearanceTools.DEFAULT_SIZE;\r
+//             final ImageData id = p.rasterize(pd.getWidth(), pd.getHeight());\r
+            \r
+            parent.getDisplay().asyncExec(new Runnable() {\r
+               @Override\r
+               public void run() {\r
+                       //Image im = new Image(AppearanceEditor.this.getBody().getDisplay(),id);\r
+                       //imageComposite.setImage(im);\r
+                    //showImage();\r
+                       setImage(p);\r
+\r
+               }\r
+            });\r
+            \r
+            TextureCoordinateGenerator gen = t2.getTextureCoordinateGenerator();\r
+            final boolean tg;\r
+            final boolean sm;\r
+            final boolean el;\r
+            final boolean ol;\r
+            final boolean nm;\r
+            final boolean rm;\r
+            if (gen == null) {\r
+               tg = false;\r
+               sm = false;\r
+               el = false;\r
+               ol = false;\r
+               nm = false;\r
+               rm = false;\r
+            } else {\r
+                //type = gen.getTextureCoordinateGeneratorTypeValue();\r
+                //textureGeneratorButton.setSelection(true);\r
+                tg = true;\r
+                if (gen.equals(Resources.g3dResource.TextureCoordinateGenerator_sphere)) {\r
+                       sm = true;\r
+                       el = false;\r
+                       ol = false;\r
+                       nm = false;\r
+                       rm = false;\r
+                } else if (gen.equals(Resources.g3dResource.TextureCoordinateGenerator_eyelinear)) {\r
+                       sm = false;\r
+                       el = true;\r
+                       ol = false;\r
+                       nm = false;\r
+                       rm = false;\r
+                } else if (gen.equals(Resources.g3dResource.TextureCoordinateGenerator_objectlinear)) {\r
+                       sm = false;\r
+                       el = false;\r
+                       ol = true;\r
+                       nm = false;\r
+                       rm = false;\r
+                } else if (gen.equals(Resources.g3dResource.TextureCoordinateGenerator_normal)) {\r
+                       sm = false;\r
+                       el = false;\r
+                       ol = false;\r
+                       nm = true;\r
+                       rm = false;\r
+                } else if (gen.equals(Resources.g3dResource.TextureCoordinateGenerator_reflection)) {\r
+                       sm = false;\r
+                       el = false;\r
+                       ol = false;\r
+                       nm = false;\r
+                       rm = true;\r
+                } else {\r
+                       sm = false;\r
+                       el = false;\r
+                       ol = false;\r
+                       nm = false;\r
+                       rm = false;\r
+                }\r
+                \r
+            }\r
+            \r
+            parent.getDisplay().asyncExec(new Runnable() {\r
+                       @Override\r
+                       public void run() {\r
+                               textureGeneratorButton.setSelection(tg);\r
+                               sphereMapButton.setSelection(sm);\r
+                               eyeLinearButton.setSelection(el);\r
+                               objectLinearButton.setSelection(ol);\r
+                               normalMapButton.setSelection(nm);\r
+                               reflectionMapButton.setSelection(rm);\r
+                               sphereMapButton.setEnabled(textureGeneratorButton.getSelection());\r
+                    eyeLinearButton.setEnabled(textureGeneratorButton.getSelection());\r
+                    objectLinearButton.setEnabled(textureGeneratorButton.getSelection());\r
+                    normalMapButton.setEnabled(textureGeneratorButton.getSelection());\r
+                    reflectionMapButton.setEnabled(textureGeneratorButton.getSelection());\r
+                               \r
+                       }\r
+               });\r
+        }\r
+        \r
+        \r
+        public Resource getGenType() {\r
+            if (sphereMapButton.getSelection())\r
+                return Resources.g3dResource.TextureCoordinateGenerator_sphere;\r
+            else if (eyeLinearButton.getSelection())\r
+               return Resources.g3dResource.TextureCoordinateGenerator_eyelinear;\r
+            else if (objectLinearButton.getSelection())\r
+               return Resources.g3dResource.TextureCoordinateGenerator_objectlinear;\r
+            else if (normalMapButton.getSelection())\r
+               return Resources.g3dResource.TextureCoordinateGenerator_normal;\r
+            else if (reflectionMapButton.getSelection())\r
+               return Resources.g3dResource.TextureCoordinateGenerator_reflection;\r
+            return null;\r
+        }\r
+        \r
+        public Resource getModeType() {\r
+            if (modulateButton.getSelection())\r
+                return Resources.g3dResource.MultiTextureMode_modulate;\r
+            else if (replaceButton.getSelection())\r
+               return Resources.g3dResource.MultiTextureMode_replace;\r
+            else if (blendButton.getSelection())\r
+               return Resources.g3dResource.MultiTextureMode_blend;\r
+            else if (decalButton.getSelection())\r
+               return Resources.g3dResource.MultiTextureMode_decal;\r
+\r
+            return null;\r
+        }\r
+        \r
+        public void getTexture(ImageTexture t2) throws Exception{\r
+               Graph g = t2.getGraph();\r
+               IImage image = getImage();\r
+               if (image != null) {\r
+                       Resource res = image.instantiateAsResource(g);\r
+                       t2.setImage(res);\r
+               }\r
+               final Resource t2res = t2.getResource();\r
+\r
+                       if (textureGeneratorButton.getSelection()) {\r
+                               final Resource type;\r
+                               if (sphereMapButton.getSelection())\r
+                                       type = Resources.g3dResource.TextureCoordinateGenerator_sphere;\r
+                               else if (eyeLinearButton.getSelection())\r
+                                       type = Resources.g3dResource.TextureCoordinateGenerator_eyelinear;\r
+                               else if (objectLinearButton.getSelection())\r
+                                       type = Resources.g3dResource.TextureCoordinateGenerator_objectlinear;\r
+                               else if (normalMapButton.getSelection())\r
+                                       type = Resources.g3dResource.TextureCoordinateGenerator_normal;\r
+                               else if (reflectionMapButton.getSelection())\r
+                                       type = Resources.g3dResource.TextureCoordinateGenerator_reflection;\r
+                               else\r
+                                       type = null;\r
+                               if (type != null) {\r
+                                       getSession().asyncWrite(new GraphRequestAdapter() {\r
+                                               @Override\r
+                                               public GraphRequestStatus perform(Graph g)\r
+                                                               throws Exception {\r
+                                                       ImageTexture t2 = new ImageTexture(g, t2res);\r
+                                                       t2.setTextureCoordinateGenerator(type);\r
+                                                       return GraphRequestStatus.transactionComplete();\r
+                                               }\r
+                                       });\r
+\r
+                               }\r
+\r
+                       }\r
+        }\r
+        \r
+        /*\r
+                * public void getTexture(ImageTexture t2) { if\r
+                * (imageComposite.getImage() != null) { ImageData data =\r
+                * imageComposite.getImage().getImageData(); if (!data.palette.isDirect) {\r
+                * throw new RuntimeException("Not direct"); } int bytes = 0; String\r
+                * type = ""; if (data.depth != 32 && data.depth != 24) { throw new\r
+                * UnsupportedOperationException("Cannot handle bitdepth " +\r
+                * data.depth); } if (data.depth == 32) { bytes = 4; type = "RGBA"; }\r
+                * else if (data.depth == 24) { bytes = 3; type = "RGB"; } String size =\r
+                * data.width + " " + data.height; byte texturedata[] = new\r
+                * byte[data.width * data.height * bytes]; for (int y = 0; y <\r
+                * data.height; y++) { for (int x = 0; x < data.width; x++) { int index =\r
+                * (y * data.width + x) * bytes;\r
+                * \r
+                * texturedata[index] = data.data[index]; texturedata[index + 1] =\r
+                * data.data[index + 1]; texturedata[index + 2] = data.data[index + 2];\r
+                * if (bytes == 4) texturedata[index + 3] = data.data[index + 3];\r
+                *  } } String base64 = new\r
+                * sun.misc.BASE64Encoder().encode(texturedata); // if\r
+                * (coreTC.getCurrentTransaction() == null)\r
+                * \r
+                * \r
+                * \r
+                * fi.vtt.proconf.threedimensionalmodeling.stub.v1_0.Image i =\r
+                * t2.getImage(); if (i == null) { i = ImageFactory.instantiate(graph);\r
+                * graph.commitChanges(this); t2.setImage(i); }\r
+                * i.setImageDataValue(base64); i.setImageTypeValue(type);\r
+                * i.setImageSizeValue(size); graph.commitChanges(this); if\r
+                * (textureGeneratorButton.getSelection()) { type = null; if\r
+                * (sphereMapButton.getSelection()) type =\r
+                * AppearanceTools.TEXTURE_COORD_GEN_SPHERE; else if\r
+                * (eyeLinearButton.getSelection()) type =\r
+                * AppearanceTools.TEXTURE_COORD_GEN_EYE_LINEAR; else if\r
+                * (objectLinearButton.getSelection()) type =\r
+                * AppearanceTools.TEXTURE_COORD_GEN_OBJECT_LINEAR; else if\r
+                * (normalMapButton.getSelection()) type =\r
+                * AppearanceTools.TEXTURE_COORD_GEN_NORMAL; else if\r
+                * (reflectionMapButton.getSelection()) type =\r
+                * AppearanceTools.TEXTURE_COORD_GEN_REFLECTION; else type = null; if\r
+                * (type != null) { TextureCoordinateGenerator gen =\r
+                * t2.getTextureCoordinateGenerator(); if (gen == null) { gen =\r
+                * TextureCoordinateGeneratorFactory.instantiate(graph);\r
+                * graph.commitChanges(this); t2.setTextureCoordinateGenerator(gen); }\r
+                * gen.setTextureCoordinateGeneratorTypeValue(type);\r
+                * graph.commitChanges(this); }\r
+                *  } else { //t2.setTextureCoordinateGenerator(null);\r
+                * graph.commitChanges(this); }\r
+                *  } }\r
+                */\r
+    }\r
+}\r