]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d.csg/src/org/simantics/g3d/csg/scenegraph2/CSGnode.java
3D framework (Simca 2012)
[simantics/3d.git] / org.simantics.g3d.csg / src / org / simantics / g3d / csg / scenegraph2 / CSGnode.java
diff --git a/org.simantics.g3d.csg/src/org/simantics/g3d/csg/scenegraph2/CSGnode.java b/org.simantics.g3d.csg/src/org/simantics/g3d/csg/scenegraph2/CSGnode.java
new file mode 100644 (file)
index 0000000..f783d4e
--- /dev/null
@@ -0,0 +1,109 @@
+package org.simantics.g3d.csg.scenegraph2;\r
+\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+\r
+import javax.vecmath.AxisAngle4d;\r
+import javax.vecmath.Quat4d;\r
+import javax.vecmath.Vector3d;\r
+\r
+import org.jcae.opencascade.jni.TopoDS_Shape;\r
+import org.simantics.g3d.property.annotations.GetPropertyValue;\r
+import org.simantics.g3d.property.annotations.SetPropertyValue;\r
+import org.simantics.g3d.scenegraph.G3DNode;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.objmap.graph.annotations.RelatedGetValue;\r
+import org.simantics.objmap.graph.annotations.RelatedSetValue;\r
+import org.simantics.opencascade.OccTriangulator;\r
+import org.simantics.opencascade.vtk.vtkSolidObject;\r
+import org.simantics.utils.threads.AWTThread;\r
+\r
+import vtk.vtkPanel;\r
+import vtk.vtkProp3D;\r
+import vtk.vtkRenderer;\r
+\r
+public abstract class CSGnode extends G3DNode implements ICSGnode {\r
+\r
+       public static final double MIN_VALUE = 0.001;\r
+       \r
+       private String name;\r
+       \r
+\r
+       @RelatedGetValue(Layer0.URIs.HasName)\r
+       @GetPropertyValue(value = Layer0.URIs.HasName, tabId = "Default", name = "Name")\r
+       public String getName() {\r
+               return name;\r
+       }\r
+       \r
+       @RelatedSetValue(Layer0.URIs.HasName)\r
+       @SetPropertyValue(Layer0.URIs.HasName)\r
+       public void setName(String name) {\r
+               if (name == null)\r
+                       return;\r
+               this.name = name;\r
+               firePropertyChanged(Layer0.URIs.HasName);\r
+       }\r
+       \r
+       @Override\r
+       public String toString() {\r
+               return getName();\r
+       }\r
+       \r
+       \r
+       private vtkSolidObject solidObject;\r
+       \r
+       @Override\r
+       public TopoDS_Shape getGeometry() {\r
+               TopoDS_Shape shape = getBaseGeometry();\r
+               if (shape == null)\r
+                       return null;\r
+               Quat4d q = getOrientation();\r
+               AxisAngle4d r = new AxisAngle4d();\r
+               r.set(q);\r
+               TopoDS_Shape tshape = OccTriangulator.makeRotation(shape, new double[] { 0.0, 0.0, 0.0, r.x, r.y, r.z }, r.angle);\r
+               shape.delete();\r
+               shape = tshape;\r
+               Vector3d p = getPosition();\r
+               tshape = OccTriangulator.makeTranslation(shape, p.x, p.y, p.z);\r
+               shape.delete();\r
+               return tshape;  \r
+       }\r
+       \r
+       public void visualize(vtkPanel panel) {\r
+               if (solidObject != null) {\r
+                       solidObject.delete();\r
+                       solidObject = null;\r
+               }\r
+               TopoDS_Shape shape = getGeometry();\r
+               if (shape == null)\r
+                       return;\r
+               solidObject = new vtkSolidObject(panel, shape);\r
+               solidObject.visualizeSolid(true, false);\r
+       }\r
+       \r
+       @SuppressWarnings("unchecked")\r
+       public Collection<vtkProp3D> getActors() {\r
+               if (solidObject == null)\r
+                       return Collections.EMPTY_LIST;\r
+               return solidObject.getActors();\r
+       }\r
+       \r
+       public void stopVisualize() {\r
+               if (solidObject != null) {\r
+                       if (Thread.currentThread() == AWTThread.getThreadAccess().getThread())\r
+                               solidObject.delete();\r
+                       else\r
+                               solidObject.dispose();\r
+                       solidObject = null;\r
+               }\r
+       }\r
+       \r
+       @Override\r
+       public void cleanup() {\r
+               stopVisualize();\r
+               super.cleanup();\r
+       }\r
+       \r
+       \r
+\r
+}\r