--- /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.Iterator;\r
+import java.util.List;\r
+\r
+import org.eclipse.core.runtime.IAdaptable;\r
+import org.eclipse.jface.action.Action;\r
+import org.eclipse.jface.action.IMenuManager;\r
+import org.eclipse.jface.action.IToolBarManager;\r
+import org.eclipse.jface.resource.ImageDescriptor;\r
+import org.eclipse.jface.viewers.ITreeContentProvider;\r
+import org.eclipse.jface.viewers.LabelProvider;\r
+import org.eclipse.jface.viewers.TreeViewer;\r
+import org.eclipse.jface.viewers.Viewer;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.ui.IActionBars;\r
+import org.eclipse.ui.IPartListener;\r
+import org.eclipse.ui.IWorkbenchPart;\r
+import org.eclipse.ui.IWorkbenchWindow;\r
+import org.eclipse.ui.PlatformUI;\r
+import org.eclipse.ui.part.ViewPart;\r
+import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;\r
+import org.eclipse.ui.views.properties.IPropertyDescriptor;\r
+import org.eclipse.ui.views.properties.IPropertySource;\r
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;\r
+import org.simantics.proconf.g3d.Activator;\r
+import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
+import org.simantics.proconf.g3d.base.ThreeDimensionalEditorPart;\r
+import org.simantics.proconf.g3d.scenegraph.IGeometryNode;\r
+import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
+import org.simantics.proconf.g3d.scenegraph.ISelectableNode;\r
+import org.simantics.utils.ui.gfx.ImageCache;\r
+\r
+import com.jme.scene.Geometry;\r
+import com.jme.scene.Node;\r
+import com.jme.scene.SceneElement;\r
+import com.jme.scene.Spatial;\r
+import com.jme.scene.batch.GeomBatch;\r
+\r
+public class ScenegraphViewPart extends ViewPart{\r
+ \r
+ private static final ImageDescriptor GEOMETRY_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/geometry.png");\r
+ private static final ImageDescriptor BATCH_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/batch.png");\r
+ private static final ImageDescriptor NODE_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/node.png");\r
+ \r
+ \r
+ TreeViewer viewer;\r
+ \r
+ IPartListener listener;\r
+ \r
+ Action showJMEAction;\r
+ \r
+ @Override\r
+ public void createPartControl(Composite parent) {\r
+\r
+ viewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL| SWT.V_SCROLL);\r
+ viewer.setContentProvider(new GNScenegraphContentProvider());\r
+ viewer.setLabelProvider(new GNScenegraphLabelProvider());\r
+ getSite().setSelectionProvider(viewer);\r
+ \r
+ makeActions();\r
+ \r
+ IActionBars actionBar = getViewSite().getActionBars();\r
+ contributeToActionBars(actionBar);\r
+ \r
+ listener = new IPartListener() {\r
+ @Override\r
+ public void partActivated(IWorkbenchPart part) {\r
+ if (part instanceof ThreeDimensionalEditorPart) {\r
+ ThreeDimensionalEditorPart p = (ThreeDimensionalEditorPart)part;\r
+ Object newInput = p.getEditor();\r
+ if (viewer.getInput() != newInput)\r
+ viewer.setInput(newInput);\r
+ } else {\r
+ //viewer.setInput(null);\r
+ }\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public void partBroughtToTop(IWorkbenchPart part) {\r
+\r
+ }\r
+ \r
+ @Override\r
+ public void partClosed(IWorkbenchPart part) {\r
+\r
+ }\r
+ \r
+ @Override\r
+ public void partDeactivated(IWorkbenchPart part) {\r
+\r
+ }\r
+ \r
+ @Override\r
+ public void partOpened(IWorkbenchPart part) {\r
+\r
+ }\r
+ };\r
+ for (IWorkbenchWindow w : PlatformUI.getWorkbench().getWorkbenchWindows()) {\r
+ w.getPartService().addPartListener(listener);\r
+ \r
+ }\r
+ \r
+ }\r
+ \r
+ protected void makeActions() {\r
+ showJMEAction = new Action("jME",Action.AS_CHECK_BOX) {\r
+ @Override\r
+ public void run() {\r
+ Object input = viewer.getInput();\r
+ viewer.setInput(null);\r
+ if (this.isChecked()) {\r
+ viewer.setContentProvider(new JMEScenegraphContentProvider());\r
+ viewer.setLabelProvider(new JMEScenegraphLabelProvider());\r
+ } else {\r
+ viewer.setContentProvider(new GNScenegraphContentProvider());\r
+ viewer.setLabelProvider(new GNScenegraphLabelProvider());\r
+ }\r
+ viewer.setInput(input);\r
+ }\r
+ };\r
+ }\r
+ \r
+ protected void contributeToActionBars(IActionBars bars) {\r
+ fillLocalToolBar(bars.getToolBarManager());\r
+ fillLocalPullDown(bars.getMenuManager());\r
+ bars.updateActionBars();\r
+ }\r
+\r
+ protected void fillLocalToolBar(IToolBarManager manager) {\r
+ manager.add(showJMEAction);\r
+ }\r
+\r
+ protected void fillLocalPullDown(IMenuManager manager) {\r
+\r
+ }\r
+ \r
+ @Override\r
+ public void setFocus() {\r
+ viewer.getControl().setFocus();\r
+ }\r
+ \r
+ public void dispose() {\r
+ for (IWorkbenchWindow w : PlatformUI.getWorkbench().getWorkbenchWindows()) {\r
+ w.getPartService().removePartListener(listener);\r
+ \r
+ }\r
+ super.dispose();\r
+ }\r
+ \r
+\r
+ private class JMEScenegraphContentProvider implements ITreeContentProvider {\r
+ @Override\r
+ public Object[] getChildren(Object parentElement) {\r
+ if (parentElement instanceof JMEAdaptable)\r
+ parentElement = ((JMEAdaptable)parentElement).getElement();\r
+ \r
+ if (parentElement instanceof Node) {\r
+ Node n = (Node)parentElement;\r
+ Object o[] = new Object[n.getChildren().size()];\r
+ for (int i = 0; i < n.getChildren().size(); i++) {\r
+ o[i] = new JMEAdaptable(n.getChild(i));\r
+ }\r
+ return o;\r
+ }\r
+ if (parentElement instanceof Geometry) {\r
+ Geometry g = (Geometry)parentElement;\r
+ Object o[] = new Object[g.getBatchCount()];\r
+ for (int i = 0 ; i < g.getBatchCount(); i++)\r
+ o[i] = new JMEAdaptable(g.getBatch(i));\r
+ return o;\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ @Override\r
+ public Object[] getElements(Object inputElement) {\r
+ if (inputElement instanceof ThreeDimensionalEditorBase) {\r
+ SceneElement root = ((ThreeDimensionalEditorBase)inputElement).getRenderingComponent().getRoot();\r
+ if (root != null)\r
+ return new Object[]{new JMEAdaptable(root)};\r
+ }\r
+ return new Object[0];\r
+ }\r
+ \r
+ @Override\r
+ public Object getParent(Object element) {\r
+ SceneElement e;\r
+ if (element instanceof JMEAdaptable)\r
+ e = ((JMEAdaptable)element).getElement();\r
+ else\r
+ e = (SceneElement)element;\r
+ if (e instanceof Spatial) {\r
+ Spatial s = (Spatial)e;\r
+ return s.getParent();\r
+ } \r
+ if (e instanceof GeomBatch) {\r
+ GeomBatch g = (GeomBatch)e;\r
+ return g.getParentGeom();\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ @Override\r
+ public boolean hasChildren(Object element) {\r
+ if (element instanceof JMEAdaptable)\r
+ element = ((JMEAdaptable)element).getElement();\r
+ if (element instanceof Node) {\r
+ Node n = (Node)element;\r
+ if (n.getChildren() == null)\r
+ return false;\r
+ return n.getChildren().size() > 0;\r
+ }\r
+ if (element instanceof Geometry) {\r
+ Geometry g = (Geometry)element;\r
+ return g.getBatchCount() > 0;\r
+ }\r
+ return false;\r
+ }\r
+ \r
+ @Override\r
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public void dispose() {\r
+ \r
+ }\r
+ }\r
+ \r
+ private class JMEScenegraphLabelProvider extends LabelProvider {\r
+ @Override\r
+ public String getText(Object element) {\r
+ if (element == null)\r
+ return null;\r
+ if (element instanceof JMEAdaptable)\r
+ element = ((JMEAdaptable)element).getElement();\r
+ SceneElement e = (SceneElement)element;\r
+ return e.getName() + " : " + e.getClass();\r
+ }\r
+ \r
+ @Override\r
+ public Image getImage(Object element) {\r
+ if (element == null)\r
+ return null;\r
+ if (element instanceof JMEAdaptable)\r
+ element = ((JMEAdaptable)element).getElement();\r
+ ImageDescriptor desc = null;\r
+ if (element instanceof GeomBatch)\r
+ desc = BATCH_IMAGE;\r
+ else if (element instanceof Geometry)\r
+ desc = GEOMETRY_IMAGE;\r
+ else if (element instanceof Node)\r
+ desc = NODE_IMAGE;\r
+ else \r
+ return null;\r
+ return ImageCache.getInstance().getImage(desc);\r
+ }\r
+ }\r
+ \r
+ private class GNScenegraphContentProvider implements ITreeContentProvider {\r
+ @Override\r
+ public Object[] getChildren(Object parentElement) {\r
+ if (parentElement instanceof GNAdaptable)\r
+ parentElement = ((GNAdaptable)parentElement).getNode();\r
+ IGraphicsNode node = (IGraphicsNode)parentElement;\r
+ Object children[] = new Object[node.getChildren().size()];\r
+ Iterator<IGraphicsNode> it = node.getChildren().iterator();\r
+ for (int i = 0; i < node.getChildren().size(); i++) {\r
+ children[i] = new GNAdaptable(it.next());\r
+ }\r
+ return children;\r
+ }\r
+ \r
+ @Override\r
+ public Object[] getElements(Object inputElement) {\r
+ if (inputElement instanceof ThreeDimensionalEditorBase) {\r
+ IGraphicsNode root = ((ThreeDimensionalEditorBase)inputElement).getScenegraphAdapter().getRootNode();\r
+ if (root != null)\r
+ return new Object[]{new GNAdaptable(root)};\r
+ }\r
+ return new Object[0];\r
+ }\r
+ \r
+ @Override\r
+ public Object getParent(Object element) {\r
+ if (element instanceof GNAdaptable)\r
+ element = ((GNAdaptable)element).getNode();\r
+ IGraphicsNode node = (IGraphicsNode)element;\r
+ return node.getParent();\r
+ }\r
+ \r
+ @Override\r
+ public boolean hasChildren(Object element) {\r
+ if (element instanceof GNAdaptable)\r
+ element = ((GNAdaptable)element).getNode();\r
+ IGraphicsNode node = (IGraphicsNode)element;\r
+ return node.getChildren().size() > 0;\r
+ }\r
+ \r
+ @Override\r
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public void dispose() {\r
+ \r
+ }\r
+ }\r
+ \r
+ private class GNScenegraphLabelProvider extends LabelProvider {\r
+ @Override\r
+ public String getText(Object element) {\r
+ if (element instanceof GNAdaptable)\r
+ element = ((GNAdaptable)element).getNode();\r
+ IGraphicsNode node = (IGraphicsNode)element;\r
+ return node.getGroup().getName() + " : " + node.getClass();\r
+ }\r
+ \r
+ @Override\r
+ public Image getImage(Object element) {\r
+ ImageDescriptor desc = NODE_IMAGE;\r
+// if (element instanceof GeomBatch)\r
+// desc = BATCH_IMAGE;\r
+// else if (element instanceof Geometry)\r
+// desc = GEOMETRY_IMAGE;\r
+// else if (element instanceof Node)\r
+// desc = NODE_IMAGE;\r
+// else \r
+// return null;\r
+ return ImageCache.getInstance().getImage(desc);\r
+ }\r
+ }\r
+ \r
+ private class JMEAdaptable implements IAdaptable {\r
+ SceneElement element;\r
+ \r
+ public JMEAdaptable(SceneElement element) {\r
+ assert (element != null);\r
+ this.element = element;\r
+ }\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public Object getAdapter(Class adapter) {\r
+ if (adapter == IPropertySource.class) {\r
+ return new JMEProperties(element);\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ public SceneElement getElement() {\r
+ return element;\r
+ }\r
+ }\r
+ \r
+ private class GNAdaptable implements IAdaptable {\r
+ IGraphicsNode node;\r
+ \r
+ public GNAdaptable(IGraphicsNode node) {\r
+ assert (node != null);\r
+ this.node = node;\r
+ }\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public Object getAdapter(Class adapter) {\r
+ if (adapter == IPropertySource.class) {\r
+ return new GNProperties(node);\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ public IGraphicsNode getNode() {\r
+ return node;\r
+ }\r
+ }\r
+ \r
+ private static final String NAME = "name";\r
+ private static final String CULL_MODE = "cullmode";\r
+ private static final String CULL_MODES[] = {"Inherit","Dynamic","Always","Never"};\r
+ private static final String LIGHT_MODE = "lightmode";\r
+ private static final String LIGHT_MODES[] = {"Off","Combine First","Combine Closest","Combine Recent Enabled","Inherit","Replace"};\r
+ private static final String LOCAL_CULL_MODE = "localcullmode";\r
+ private static final String LOCAL_LIGHT_MODE = "locallightmode";\r
+ private static final String LOCAL_NORMALS_MODE = "localnormalsmode";\r
+ private static final String LOCAL_RENDER_QUEUE_MODE ="localrenderqueuemode";\r
+ private static final String LOCAL_TEXTURE_COMBINE_MODE = "localtexturecombinemode";\r
+ private static final String LOCKS = "locks";\r
+ private static final String NORMALS_MODE = "normalsmode";\r
+ private static final String NORMALS_MODES[] = {"Inherit","Use Provided","Normalize Provided","Normalize if scaled","Off"};\r
+ private static final String RENDER_QUEUE_MODE = "renderqueuemode";\r
+ private static final String RENDER_QUEUE_MODES[] = {"Inherit","Skip","Opaque","Transparent","Ortho"};\r
+ private static final String TEXTURE_COMBINE_MODE = "texturecombinemode";\r
+ private static final String TEXTURE_COMBINE_MODES[] = {"Off","First","Closest","Recent enabled","Inherit","Replace"};\r
+ \r
+ private static final String BOOLEAN_VALUES[] = {"False","True"};\r
+ \r
+ private class JMEProperties implements IPropertySource { \r
+ \r
+ SceneElement element;\r
+ \r
+ public JMEProperties(SceneElement element) {\r
+ this.element = element;\r
+ }\r
+ \r
+ @Override\r
+ public Object getEditableValue() {\r
+ return this;\r
+ }\r
+ \r
+ @Override\r
+ public IPropertyDescriptor[] getPropertyDescriptors() {\r
+ List<IPropertyDescriptor> desc = new ArrayList<IPropertyDescriptor>();\r
+ desc.add(new TextPropertyDescriptor(NAME,"Name"));\r
+ desc.add(new ComboBoxPropertyDescriptor(CULL_MODE,"Cull Mode",CULL_MODES));\r
+ desc.add(new ComboBoxPropertyDescriptor(LIGHT_MODE,"Light Combine Mode",LIGHT_MODES));\r
+ desc.add(new ComboBoxPropertyDescriptor(LOCAL_CULL_MODE,"Local Cull Mode",CULL_MODES));\r
+ desc.add(new ComboBoxPropertyDescriptor(LOCAL_LIGHT_MODE,"Local Light Combine Mode",LIGHT_MODES));\r
+ desc.add(new ComboBoxPropertyDescriptor(LOCAL_NORMALS_MODE,"Local Normals Mode",NORMALS_MODES));\r
+ desc.add(new ComboBoxPropertyDescriptor(LOCAL_RENDER_QUEUE_MODE,"Local Render Queue Mode",RENDER_QUEUE_MODES));\r
+ desc.add(new ComboBoxPropertyDescriptor(LOCAL_TEXTURE_COMBINE_MODE,"Local Texture Combine Mode",TEXTURE_COMBINE_MODES));\r
+ desc.add(new TextPropertyDescriptor(LOCKS,"Locks"));\r
+ desc.add(new ComboBoxPropertyDescriptor(NORMALS_MODE,"Normals Mode",NORMALS_MODES));\r
+ desc.add(new ComboBoxPropertyDescriptor(RENDER_QUEUE_MODE,"Render Queue Mode",RENDER_QUEUE_MODES));\r
+ desc.add(new ComboBoxPropertyDescriptor(TEXTURE_COMBINE_MODE,"Texture Combine Mode",TEXTURE_COMBINE_MODES));\r
+ return desc.toArray(new IPropertyDescriptor[desc.size()]);\r
+\r
+ }\r
+ \r
+ @Override\r
+ public Object getPropertyValue(Object id) {\r
+ if (id == NAME) {\r
+ return element.getName();\r
+ } else if (id == CULL_MODE) {\r
+ return element.getCullMode();\r
+ } else if (id == LIGHT_MODE) {\r
+ return element.getLightCombineMode();\r
+ } else if (id == LOCAL_CULL_MODE) {\r
+ return element.getLocalCullMode();\r
+ } else if (id == LOCAL_LIGHT_MODE) {\r
+ return element.getLocalLightCombineMode();\r
+ } else if (id == LOCAL_NORMALS_MODE) {\r
+ return element.getLocalNormalsMode();\r
+ } else if (id == LOCAL_RENDER_QUEUE_MODE) {\r
+ return element.getLocalRenderQueueMode();\r
+ } else if (id == LOCAL_TEXTURE_COMBINE_MODE) {\r
+ return element.getLocalTextureCombineMode();\r
+ } else if (id == LOCKS) {\r
+ return element.getLocks();\r
+ } else if (id == NORMALS_MODE) {\r
+ return element.getNormalsMode();\r
+ } else if (id == RENDER_QUEUE_MODE) {\r
+ return element.getRenderQueueMode();\r
+ } else if (id == TEXTURE_COMBINE_MODE) {\r
+ return element.getTextureCombineMode();\r
+ }\r
+ \r
+// element.getZOrder();\r
+// element.isCollidable();\r
+\r
+ return null;\r
+ }\r
+ \r
+ @Override\r
+ public boolean isPropertySet(Object id) {\r
+ return false;\r
+ }\r
+ \r
+ @Override\r
+ public void resetPropertyValue(Object id) {\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public void setPropertyValue(Object id, Object value) {\r
+ if (id == NAME) {\r
+ element.setName((String)value);\r
+ } else if (id == CULL_MODE) {\r
+ element.setCullMode((Integer)value);\r
+ } else if (id == LIGHT_MODE) {\r
+ element.setLightCombineMode((Integer)value);\r
+ } else if (id == LOCAL_CULL_MODE) {\r
+ \r
+ } else if (id == LOCAL_LIGHT_MODE) {\r
+ \r
+ } else if (id == LOCAL_NORMALS_MODE) {\r
+ \r
+ } else if (id == LOCAL_RENDER_QUEUE_MODE) {\r
+ \r
+ } else if (id == LOCAL_TEXTURE_COMBINE_MODE) {\r
+ \r
+ } else if (id == LOCKS) {\r
+ element.setLocks((Integer)value);\r
+ } else if (id == NORMALS_MODE) {\r
+ element.setNormalsMode((Integer)value);\r
+ } else if (id == RENDER_QUEUE_MODE) {\r
+ element.setRenderQueueMode((Integer)value);\r
+ } else if (id == TEXTURE_COMBINE_MODE) {\r
+ element.setTextureCombineMode((Integer)value);\r
+ }\r
+ \r
+ }\r
+\r
+ }\r
+ \r
+ private static final String SELECTED = "selected";\r
+ private static final String HIGHLIGHTED = "highlighted";\r
+ private static final String VISIBLE = "visible";\r
+ \r
+ private class GNProperties implements IPropertySource {\r
+ IGraphicsNode node;\r
+ \r
+ public GNProperties(IGraphicsNode node) {\r
+ this.node = node;\r
+ }\r
+ \r
+ \r
+ @Override\r
+ public Object getEditableValue() {\r
+ return this;\r
+ }\r
+ \r
+ @Override\r
+ public IPropertyDescriptor[] getPropertyDescriptors() {\r
+ List<IPropertyDescriptor> desc = new ArrayList<IPropertyDescriptor>();\r
+ if (node instanceof ISelectableNode) {\r
+ //ISelectableNode n = (ISelectableNode)node;\r
+ \r
+ desc.add(new ComboBoxPropertyDescriptor(SELECTED,"Selected",BOOLEAN_VALUES));\r
+ desc.add(new ComboBoxPropertyDescriptor(HIGHLIGHTED,"Highlighted",BOOLEAN_VALUES));\r
+ desc.add(new ComboBoxPropertyDescriptor(VISIBLE,"Visible",BOOLEAN_VALUES));\r
+ \r
+ }\r
+ return desc.toArray(new IPropertyDescriptor[desc.size()]);\r
+ }\r
+ \r
+ @Override\r
+ public Object getPropertyValue(Object id) {\r
+ if (node instanceof ISelectableNode) {\r
+ ISelectableNode n = (ISelectableNode)node;\r
+ if (id == SELECTED) {\r
+ if (n.isSelected())\r
+ return 1;\r
+ return 0;\r
+ } else if (id == HIGHLIGHTED) {\r
+ if (n.isHighlighted())\r
+ return 1;\r
+ return 0;\r
+ } else if (id == VISIBLE) {\r
+ if (n.isVisible())\r
+ return 1;\r
+ return 0;\r
+ }\r
+ }\r
+ if (node instanceof IGeometryNode) {\r
+ //IGeometryNode n = (IGeometryNode)node;\r
+ }\r
+\r
+ return null;\r
+ }\r
+ \r
+ @Override\r
+ public boolean isPropertySet(Object id) {\r
+ return false;\r
+ }\r
+ \r
+ @Override\r
+ public void resetPropertyValue(Object id) {\r
+\r
+ }\r
+ \r
+ @Override\r
+ public void setPropertyValue(Object id, Object value) {\r
+ if (node instanceof ISelectableNode) {\r
+ ISelectableNode n = (ISelectableNode)node;\r
+ boolean b = ((Integer)value) == 1;\r
+ if (id == SELECTED) {\r
+ n.setSelected(b);\r
+ } else if (id == HIGHLIGHTED) {\r
+ n.setHighlighted(b);\r
+ } else if (id == VISIBLE) {\r
+ n.setVisible(b);\r
+ }\r
+ }\r
+ \r
+ }\r
+\r
+ \r
+ }\r
+ \r
+}\r
+ \r
+\r