]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d.csg/src/org/simantics/g3d/csg/editor/CSGNodeMap.java
1776694178f99a164dc61fd8387e93f553806674
[simantics/3d.git] / org.simantics.g3d.csg / src / org / simantics / g3d / csg / editor / CSGNodeMap.java
1 package org.simantics.g3d.csg.editor;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 import java.util.List;\r
6 import java.util.Set;\r
7 \r
8 import org.simantics.db.Session;\r
9 import org.simantics.g3d.csg.scenegraph2.CSGrootNode;\r
10 import org.simantics.g3d.csg.scenegraph2.ICSGnode;\r
11 import org.simantics.g3d.scenegraph.base.ParentNode;\r
12 import org.simantics.g3d.vtk.common.AbstractVTKNodeMap;\r
13 import org.simantics.g3d.vtk.common.InteractiveVtkPanel;\r
14 import org.simantics.objmap.graph.IMapping;\r
15 import org.simantics.utils.threads.AWTThread;\r
16 \r
17 import vtk.vtkProp;\r
18 import vtk.vtkProp3D;\r
19 import vtk.vtkRenderer;\r
20 \r
21 public class CSGNodeMap extends AbstractVTKNodeMap<ICSGnode> {\r
22         \r
23 \r
24         \r
25         public CSGNodeMap(Session session, IMapping mapping, InteractiveVtkPanel panel, CSGrootNode rootNode) {\r
26                 super(session, mapping, panel, rootNode);\r
27                 rootNode.setNodeMap(this);\r
28         }\r
29         \r
30 \r
31         @SuppressWarnings("unchecked")\r
32         protected void updateActor(ICSGnode node, Set<String> ids) {\r
33                 //System.out.println("CSGNodeMap.updateActor " + node);\r
34                 if (node.getParent() instanceof ICSGnode) {\r
35                         ICSGnode parent = (ICSGnode) node.getParent();\r
36                         if (!"child".equals(node.getParentRel())) {\r
37                                 updateActor(parent,null);\r
38                                 return;\r
39                         }\r
40                 }\r
41                 \r
42                 if (node instanceof ParentNode<?>) {\r
43                         ParentNode<ICSGnode> p = (ParentNode<ICSGnode>)node;\r
44                         for (ICSGnode n : p.getNodes())\r
45                                 remActor(n);\r
46                 }\r
47                 \r
48                 remActor(node);\r
49                 addActor(node);\r
50 \r
51         }\r
52 \r
53         @Override\r
54         protected Collection<vtkProp> getActors(ICSGnode node) {\r
55                 List<vtkProp> props = new ArrayList<vtkProp>();\r
56                 for (vtkProp3D p : ((ICSGnode)node).getActors())\r
57                         props.add(p);\r
58                 return props;\r
59         }\r
60         \r
61         protected void removeActor(ICSGnode node) {\r
62                 //System.out.println("CSGNodeMap.removeActor " + node);\r
63                 remActor(node);\r
64                 \r
65                 if (!"child".equals(node.getParentRel())) {\r
66                         if (node.getParent() instanceof ICSGnode)\r
67                                 updateActor((ICSGnode)node.getParent(),null);\r
68                 }\r
69         }\r
70         \r
71         protected void addActor(ICSGnode node) {\r
72                 //System.out.println("CSGNodeMap.addActor " + node);\r
73                 if (hasActor(node))\r
74                         return;\r
75                 if (Thread.currentThread() != AWTThread.getThreadAccess().getThread())\r
76                         throw new RuntimeException("Illegal thread.");\r
77                 \r
78                 panel.lock();\r
79                 \r
80                 node.visualize(panel);\r
81 \r
82                 for (vtkProp3D act : node.getActors()) {\r
83                         nodeToActor.add(node, act);\r
84             actorToNode.put(act, node);\r
85                 }\r
86 \r
87         panel.unlock();\r
88 \r
89         }\r
90         \r
91         \r
92         \r
93         private boolean hasActor(ICSGnode node) {\r
94                 List<vtkProp> list = nodeToActor.getValues(node);\r
95                 if (list == null || list.size() == 0)\r
96                         return false;\r
97                 return true;\r
98         }\r
99         \r
100         private void remActor(ICSGnode node) {\r
101                 if (Thread.currentThread() != AWTThread.getThreadAccess().getThread())\r
102                         throw new RuntimeException("Illegal thread.");\r
103 \r
104                 List<vtkProp> list = nodeToActor.getValues(node);\r
105                 if (list != null) {\r
106                         for (vtkProp obj : list) {\r
107                                 actorToNode.remove(obj);        \r
108                         }\r
109                         nodeToActor.remove(node);\r
110                         panel.lock();\r
111                         \r
112                         node.stopVisualize();\r
113                         \r
114                         panel.unlock();\r
115                 }\r
116         }\r
117         \r
118 \r
119 }\r