+++ /dev/null
-/*******************************************************************************\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