]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d.csg/src/org/simantics/g3d/csg/scenegraph2/CSGparentNode.java
Copyrights
[simantics/3d.git] / org.simantics.g3d.csg / src / org / simantics / g3d / csg / scenegraph2 / CSGparentNode.java
1 /*******************************************************************************\r
2  * Copyright (c) 2012, 2013 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.g3d.csg.scenegraph2;\r
13 \r
14 import java.util.Collection;\r
15 import java.util.Collections;\r
16 \r
17 import javax.vecmath.AxisAngle4d;\r
18 import javax.vecmath.Quat4d;\r
19 import javax.vecmath.Vector3d;\r
20 \r
21 import org.jcae.opencascade.jni.TopoDS_Shape;\r
22 import org.simantics.g3d.csg.ontology.CSG;\r
23 import org.simantics.g3d.math.MathTools;\r
24 import org.simantics.g3d.ontology.G3D;\r
25 import org.simantics.g3d.property.annotations.GetPropertyValue;\r
26 import org.simantics.g3d.property.annotations.PropertyContributor;\r
27 import org.simantics.g3d.property.annotations.SetPropertyValue;\r
28 import org.simantics.g3d.scenegraph.IG3DNode;\r
29 import org.simantics.g3d.scenegraph.base.ParentNode;\r
30 import org.simantics.g3d.tools.NodeTools;\r
31 import org.simantics.layer0.Layer0;\r
32 import org.simantics.objmap.graph.annotations.RelatedElementsAdd;\r
33 import org.simantics.objmap.graph.annotations.RelatedElementsGet;\r
34 import org.simantics.objmap.graph.annotations.RelatedElementsRem;\r
35 import org.simantics.objmap.graph.annotations.RelatedGetValue;\r
36 import org.simantics.objmap.graph.annotations.RelatedSetValue;\r
37 import org.simantics.opencascade.OccTriangulator;\r
38 import org.simantics.opencascade.vtk.vtkSolidObject;\r
39 import org.simantics.utils.threads.AWTThread;\r
40 \r
41 import vtk.vtkPanel;\r
42 import vtk.vtkProp3D;\r
43 \r
44 @PropertyContributor\r
45 public abstract class CSGparentNode extends ParentNode<ICSGnode> implements ICSGnode {\r
46 \r
47         private String name;\r
48         \r
49 \r
50         @RelatedGetValue(Layer0.URIs.HasName)\r
51         @GetPropertyValue(value = Layer0.URIs.HasName, tabId = "Default", name = "Name")\r
52         public String getName() {\r
53                 return name;\r
54         }\r
55         \r
56         @RelatedSetValue(Layer0.URIs.HasName)\r
57         @SetPropertyValue(Layer0.URIs.HasName)\r
58         public void setName(String name) {\r
59                 if (name == null)\r
60                         return;\r
61                 this.name = name;\r
62                 firePropertyChanged(Layer0.URIs.HasName);\r
63         }\r
64         \r
65         @Override\r
66         public String toString() {\r
67                 return getName();\r
68         }\r
69         \r
70         private Vector3d position = new Vector3d();\r
71         private Quat4d orientation = MathTools.getIdentityQuat();\r
72         \r
73         @Override\r
74         @GetPropertyValue(value = G3D.URIs.hasOrientation, tabId = "Transform", name = "Orientation")\r
75         public Quat4d getOrientation() {\r
76                 return orientation;\r
77         }\r
78         \r
79         @RelatedGetValue(G3D.URIs.hasOrientation)\r
80         public double[] getOrientationArr() {\r
81                 double arr[] = new double[4];\r
82                 orientation.get(arr);\r
83                 return arr;\r
84                 \r
85         }\r
86         \r
87         @Override\r
88         @GetPropertyValue(value = G3D.URIs.hasPosition, tabId = "Transform", name = "Position")\r
89         public Vector3d getPosition() {\r
90                 return position;\r
91         }\r
92         \r
93         @RelatedGetValue(G3D.URIs.hasPosition)\r
94         public double[] getPositionArr() {\r
95                 double arr[] = new double[3];\r
96                 position.get(arr);\r
97                 return arr;\r
98         }\r
99         \r
100         @RelatedElementsAdd(CSG.URIs.hasPrimaryShape)\r
101         public void addPrimaryChild(ICSGnode node) {\r
102                 addNode("primary",node);\r
103         }\r
104         \r
105         @RelatedElementsGet(CSG.URIs.hasPrimaryShape)\r
106         public Collection<ICSGnode> getPrimaryChild() {\r
107                 return getNodes("primary");\r
108         }\r
109         \r
110         @RelatedElementsRem(CSG.URIs.hasPrimaryShape)\r
111         public void remPrimaryChild(ICSGnode node) {\r
112                 removeNode("primary", node);\r
113         }\r
114         \r
115         @RelatedElementsAdd(CSG.URIs.hasSecondaryShape)\r
116         public void addSecondaryChild(ICSGnode node) {\r
117                 addNode("secondary",node);\r
118         }\r
119         \r
120         @RelatedElementsGet(CSG.URIs.hasSecondaryShape)\r
121         public Collection<ICSGnode> getSecondaryChild() {\r
122                 return getNodes("secondary");\r
123         }\r
124         \r
125         @RelatedElementsRem(CSG.URIs.hasSecondaryShape)\r
126         public void remSecondaryChild(ICSGnode node) {\r
127                 removeNode("secondary", node);\r
128         }\r
129         \r
130 \r
131         @RelatedElementsAdd(CSG.URIs.hasChildShape)\r
132         public void addChild(ICSGnode node) {\r
133                 addNode("child",node);\r
134         }\r
135         \r
136         @RelatedElementsGet(CSG.URIs.hasChildShape)\r
137         public Collection<ICSGnode> getChild() {\r
138                 return getNodes("child");\r
139         }\r
140         \r
141         @RelatedElementsRem(CSG.URIs.hasChildShape)\r
142         public void remChild(ICSGnode node) {\r
143                 removeNode("child", node);\r
144         }\r
145         \r
146         \r
147         \r
148         protected TopoDS_Shape getPrimary() {\r
149                 for (ICSGnode node : getNodes("primary"))\r
150                         return node.getGeometry();\r
151                 return null;\r
152         }\r
153         \r
154         protected TopoDS_Shape getSecondary() {\r
155                 for (ICSGnode node : getNodes("secondary"))\r
156                         return node.getGeometry();\r
157                 return null;\r
158         }\r
159         \r
160         @Override\r
161         public TopoDS_Shape getGeometry() {\r
162                 TopoDS_Shape shape = getBaseGeometry();\r
163                 if (shape == null)\r
164                         return null;\r
165                 Quat4d q = getOrientation();\r
166                 AxisAngle4d r = new AxisAngle4d();\r
167                 r.set(q);\r
168                 TopoDS_Shape tshape = OccTriangulator.makeRotation(shape, new double[] { 0.0, 0.0, 0.0, r.x, r.y, r.z }, r.angle);\r
169                 shape.delete();\r
170                 shape = tshape;\r
171                 Vector3d p = getPosition();\r
172                 tshape = OccTriangulator.makeTranslation(shape, p.x, p.y, p.z);\r
173                 shape.delete();\r
174                 return tshape;\r
175                         \r
176         }\r
177         \r
178 \r
179         \r
180         @Override\r
181         @SetPropertyValue(G3D.URIs.hasOrientation)\r
182         public void setOrientation(Quat4d orientation) {\r
183                 assert(orientation != null);\r
184                 this.orientation = orientation;\r
185                 \r
186                 firePropertyChanged(G3D.URIs.hasOrientation);\r
187         }\r
188         \r
189         @Override\r
190         @SetPropertyValue(G3D.URIs.hasPosition)\r
191         public void setPosition(Vector3d position) {\r
192                 assert(position != null);\r
193                 this.position = position;\r
194                 \r
195                 firePropertyChanged(G3D.URIs.hasPosition);\r
196         }\r
197         \r
198         @RelatedSetValue(G3D.URIs.hasOrientation)\r
199         public void setOrientation(double[] arr) {\r
200                 if (arr == null)\r
201                         return;\r
202                 setOrientation(new Quat4d(arr));\r
203         }\r
204         \r
205         @RelatedSetValue(G3D.URIs.hasPosition)\r
206         public void setPosition(double[] arr) {\r
207                 if (arr == null)\r
208                         return;\r
209                 setPosition(new Vector3d(arr));\r
210         }\r
211         \r
212         @Override\r
213         @GetPropertyValue(value = G3D.URIs.hasWorldPosition, tabId = "Transform", name = "World Position")\r
214         public Vector3d getWorldPosition() {\r
215                 IG3DNode parent = (IG3DNode) getParent();\r
216                 if (parent == null)\r
217                         return position;\r
218                 return NodeTools.getWorldPosition(parent, new Vector3d(position));\r
219         }\r
220 \r
221         public Vector3d getWorldPosition(Vector3d localPosition) {\r
222                 return NodeTools.getWorldPosition(this, localPosition);\r
223         }\r
224 \r
225         \r
226         @Override\r
227         @GetPropertyValue(value = G3D.URIs.hasWorldOrientation, tabId = "Transform", name = "World Orientation")\r
228         public Quat4d getWorldOrientation() {\r
229                 return getWorldOrientation(new Quat4d(orientation));\r
230         }\r
231         \r
232         public Quat4d getWorldOrientation(Quat4d localOrientation) {\r
233                 IG3DNode parent = (IG3DNode)getParent();\r
234                 if (parent == null)\r
235                         return localOrientation;\r
236                 return NodeTools.getWorldOrientation(parent, localOrientation);\r
237         }\r
238         \r
239         @Override\r
240         public Vector3d getLocalPosition(Vector3d worldPosition) {\r
241                 IG3DNode parent = (IG3DNode)getParent();\r
242                 if (parent == null)\r
243                         return worldPosition;\r
244                 return NodeTools.getLocalPosition(parent,new Vector3d(worldPosition));\r
245         }\r
246         \r
247         @Override\r
248         public Quat4d getLocalOrientation(Quat4d worldOrientation) {\r
249                 IG3DNode parent = (IG3DNode)getParent();\r
250                 if (parent == null)\r
251                         return worldOrientation;\r
252                 return NodeTools.getLocalOrientation(parent, new Quat4d(worldOrientation));\r
253         }\r
254         \r
255         @Override\r
256         @SetPropertyValue(G3D.URIs.hasWorldPosition)\r
257         public void setWorldPosition(Vector3d position) {\r
258                 Vector3d localPos = getLocalPosition(position);\r
259                 setPosition(localPos);\r
260         }\r
261         \r
262         @Override\r
263         @SetPropertyValue(G3D.URIs.hasWorldOrientation)\r
264         public void setWorldOrientation(Quat4d orientation) {\r
265                 Quat4d localOr = getLocalOrientation(orientation);\r
266                 setOrientation(localOr);\r
267         }\r
268 \r
269 \r
270         private vtkSolidObject solidObject;\r
271         \r
272         \r
273         public void visualize(vtkPanel panel) {\r
274                 if (solidObject != null) {\r
275                         solidObject.delete();\r
276                         solidObject = null;\r
277                 }\r
278                 TopoDS_Shape shape = getGeometry();\r
279                 if (shape == null)\r
280                         return;\r
281                 solidObject = new vtkSolidObject(panel, shape);\r
282                 solidObject.visualizeSolid(true, false);\r
283         }\r
284         \r
285         @SuppressWarnings("unchecked")\r
286         public Collection<vtkProp3D> getActors() {\r
287                 if (solidObject == null)\r
288                         return Collections.EMPTY_LIST;\r
289                 return solidObject.getActors();\r
290         }\r
291         \r
292         public void stopVisualize() {\r
293                 if (solidObject != null) {\r
294                         if (Thread.currentThread() == AWTThread.getThreadAccess().getThread())\r
295                                 solidObject.delete();\r
296                         else\r
297                                 solidObject.dispose();\r
298                         solidObject = null;\r
299                 }\r
300         }\r
301         \r
302         @Override\r
303         public void cleanup() {\r
304                 stopVisualize();\r
305                 super.cleanup();\r
306         }\r
307         \r
308         \r
309         @Override\r
310         public void remove() {\r
311                 //FIXME: creating boolean shapes (removing nodes from parent and attaching under boolean shape would destroy the existing hierarchy, if default implementation is used.\r
312                 super.remove();\r
313         }\r
314 \r
315         @Override\r
316         public Object getAdapter(Class adapter) {\r
317                 return null;\r
318         }\r
319 }\r