+/*******************************************************************************\r
+ * Copyright (c) 2007 VTT Technical Research Centre of Finland and others.\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.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