]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.opencascade.jme/src/org/simantics/opencascade/jme/JmeSolidObject.java
Alpha-version of jME-bindings for g3d.
[simantics/3d.git] / org.simantics.opencascade.jme / src / org / simantics / opencascade / jme / JmeSolidObject.java
1 package org.simantics.opencascade.jme;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 import java.util.List;\r
6 \r
7 import org.eclipse.swt.widgets.Display;\r
8 import org.jcae.opencascade.jni.BRepMesh_IncrementalMesh;\r
9 import org.jcae.opencascade.jni.TopAbs_ShapeEnum;\r
10 import org.jcae.opencascade.jni.TopExp_Explorer;\r
11 import org.jcae.opencascade.jni.TopoDS_Face;\r
12 import org.jcae.opencascade.jni.TopoDS_Shape;\r
13 import org.simantics.opencascade.OCCTTool;\r
14 \r
15 import com.jme3.app.Application;\r
16 import com.jme3.material.Material;\r
17 import com.jme3.math.ColorRGBA;\r
18 import com.jme3.renderer.RenderManager;\r
19 import com.jme3.scene.Geometry;\r
20 import com.jme3.scene.Mesh;\r
21 import com.jme3.scene.Node;\r
22 import com.jme3.scene.Spatial;\r
23 \r
24 public class JmeSolidObject {\r
25 \r
26         \r
27         public static double deflection = 0.001;\r
28         \r
29         public static double featureAngle = 30;\r
30         public static boolean computeNormals = true;\r
31         public static boolean cleanPart = false;\r
32         public static boolean mergePoints = false;\r
33         \r
34         private Application app;\r
35         private TopoDS_Shape shape;\r
36         \r
37         private List<Spatial> actors = new ArrayList<Spatial>(2);\r
38         \r
39         private List<Spatial> solid = new ArrayList<Spatial>(1);\r
40         private List<Spatial> edges =  new ArrayList<Spatial>(1);\r
41         \r
42         public JmeSolidObject(Application app,TopoDS_Shape shape) {\r
43                 this.shape = shape;\r
44                 this.app = app;\r
45         }\r
46         \r
47         public void visualizeSolid(boolean showEdges, boolean showVertices) {\r
48                 visualizeSolid(true, showEdges, showVertices);\r
49         }\r
50         \r
51         \r
52         public void visualizeSolid(boolean showFaces, boolean showEdges, boolean showVertices) {\r
53                 clearActorsSWT();\r
54                 Mesh data = createSolidMesh(shape);\r
55                 if (data == null)\r
56                         return;\r
57                 if (showFaces) {\r
58                         solid.add(createActor(data));           \r
59                 }\r
60                 if (showEdges) {\r
61                         Spatial edge = createEdgesActor(data);\r
62                         edges.add(edge);                        \r
63                         if (showVertices) {\r
64                                 actors.add(createVerticesActor(edge));\r
65                         }\r
66                 }\r
67                 \r
68                 actors.addAll(solid);\r
69                 actors.addAll(edges);\r
70 \r
71                 showActorsSWT();\r
72         }\r
73         \r
74         public void visualizeFaces(boolean showEdges, boolean showVertices) {\r
75                 clearActorsSWT();\r
76                 Collection<Mesh> datas = createFaceMeshes(shape);\r
77                 for (Mesh data : datas) {\r
78                         solid.add(createActor(data));\r
79                         \r
80                         if (showEdges) {\r
81                                 Spatial edgesActor = createEdgesActor(data); \r
82                                 edges.add(edgesActor);\r
83                                 if (showVertices) {\r
84                                         actors.add(createVerticesActor(edgesActor));\r
85                                 }\r
86                         }\r
87                 }\r
88                 actors.addAll(solid);\r
89                 actors.addAll(edges);\r
90                 \r
91                 showActorsSWT();\r
92         }\r
93         \r
94         public List<Spatial> getActors() {\r
95                 return actors;\r
96         }\r
97         \r
98         public List<Spatial> getSolid() {\r
99                 return solid;\r
100         }\r
101         \r
102         public List<Spatial> getEdges() {\r
103                 return edges;\r
104         }\r
105         \r
106 \r
107         \r
108         public void showActorsSWT() {\r
109                 assert (Thread.currentThread() == Display.getDefault().getThread());\r
110                 Node root = (Node)(app.getRenderManager().getMainView("Default").getScenes().get(0));\r
111                 for (Spatial act : actors) {\r
112                         root.attachChild(act);\r
113                 }\r
114         }\r
115         \r
116         public void showActors() {\r
117                 Display.getDefault().asyncExec(new Runnable() {\r
118                         \r
119                         @Override\r
120                         public void run() {\r
121                                 showActorsSWT();\r
122                         }\r
123                 });\r
124         }\r
125         \r
126         public void clearActorsSWT() {\r
127                 assert (Thread.currentThread() == Display.getDefault().getThread());\r
128                 if (actors.size() == 0)\r
129                         return;\r
130                 for (Spatial act : actors) {\r
131                         act.removeFromParent();\r
132                 }\r
133                 actors.clear();\r
134                 solid.clear();\r
135                 edges.clear();\r
136         }\r
137         \r
138         private void clearActorsSWT(List<Spatial> actors) {\r
139                 assert (Thread.currentThread() == Display.getDefault().getThread());\r
140                 if (actors.size() == 0)\r
141                         return;\r
142                 for (Spatial act : actors) {\r
143                         act.removeFromParent();\r
144                 }\r
145         }\r
146         \r
147         public void clearActors() {\r
148                 if (actors.size() == 0)\r
149                         return;\r
150                 final List<Spatial> temp = new ArrayList<Spatial>(actors.size());\r
151                 temp.addAll(actors);\r
152                 actors.clear();\r
153                 solid.clear();\r
154                 edges.clear();\r
155                 Display.getDefault().asyncExec(new Runnable() {\r
156                         \r
157                         @Override\r
158                         public void run() {\r
159                                 clearActorsSWT(temp);\r
160                         }\r
161                 });\r
162         }\r
163         \r
164         public void dispose() {\r
165                 if (shape != null) {\r
166                         shape.delete();\r
167                         shape = null;\r
168                 }\r
169                 clearActors();\r
170         }\r
171         \r
172         public void delete() {\r
173                 if (shape != null) {\r
174                         shape.delete();\r
175                         shape = null;\r
176                 }\r
177                 clearActorsSWT();\r
178         }\r
179         \r
180         private static double TOLERANCE = 0.01;\r
181         \r
182         public static Mesh createSolidMesh(TopoDS_Shape shape) {\r
183                 \r
184                 double volume = OCCTTool.getBoundingBoxDiagonal(shape);\r
185                 if (volume < TOLERANCE)\r
186                         return null;\r
187                 \r
188                 BRepMesh_IncrementalMesh mesh = new BRepMesh_IncrementalMesh(shape,deflection*volume);\r
189         \r
190                 TopExp_Explorer expFace = new TopExp_Explorer();\r
191                 \r
192                 List<Double> meshPoints = new ArrayList<Double>();\r
193                 List<Integer> meshTriangles = new ArrayList<Integer>();\r
194                 for (expFace.init(shape, TopAbs_ShapeEnum.FACE); expFace.more(); expFace.next()) {\r
195                         TopoDS_Face face = (TopoDS_Face) expFace.current();\r
196                         OCCTTool.appendToMesh(face, meshPoints, meshTriangles);\r
197                         face.delete();\r
198                 }\r
199                 if (meshPoints.size() == 0 || meshTriangles.size() == 0)\r
200                         return null;\r
201                         \r
202                 Mesh data = JmeOCCTTool.createPartGrid(meshPoints, meshTriangles);\r
203                 \r
204                 expFace.delete();\r
205                 mesh.delete();\r
206                 \r
207                 return data;\r
208         }\r
209         \r
210         public static Collection<Mesh> createFaceMeshes(TopoDS_Shape shape) {\r
211                 \r
212                 double volume = OCCTTool.getBoundingBoxDiagonal(shape);\r
213                 Collection<Mesh> faces = new ArrayList<Mesh>();\r
214                 \r
215                 if (volume > TOLERANCE) {\r
216                 \r
217                         BRepMesh_IncrementalMesh mesh = new BRepMesh_IncrementalMesh(shape,deflection*volume);\r
218                 \r
219                         TopExp_Explorer expFace = new TopExp_Explorer();\r
220                         \r
221                         \r
222                         for (expFace.init(shape, TopAbs_ShapeEnum.FACE); expFace.more(); expFace.next()) {\r
223                                 TopoDS_Face face = (TopoDS_Face) expFace.current();\r
224                                 Mesh data = JmeOCCTTool.createPartGrid(face);\r
225                                 face.delete();\r
226                                 faces.add(data);\r
227                         }\r
228                         \r
229                         expFace.delete();\r
230                         mesh.delete();\r
231                 }\r
232                 \r
233                 return faces;\r
234         }\r
235         \r
236         \r
237         \r
238         public Spatial createActor(Mesh partGrid) {\r
239                 \r
240                 \r
241                 Geometry geom = new Geometry();\r
242                 \r
243                 geom.setMesh(partGrid);\r
244                 \r
245                 ColorRGBA color = new ColorRGBA(1.0f, 1.0f, 0.0f, 1.0f);\r
246                 //Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");\r
247                 //mat.setColor("Color", color);\r
248                 Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md");\r
249                 mat.setColor("Diffuse", color);\r
250                 mat.setColor("Ambient", color);\r
251                 mat.setColor("Specular", new ColorRGBA(1, 1, 1, 1));\r
252                 mat.setBoolean("UseMaterialColors", true);\r
253                 geom.setMaterial(mat);\r
254                 geom.updateModelBound();\r
255                 return geom;\r
256 \r
257         }\r
258         \r
259         public Spatial createEdgesActor(Mesh partGrid) {\r
260                 Mesh edgeMesh = JmeOCCTTool.createEdgeMesh(partGrid);\r
261                 edgeMesh.setLineWidth(2.f);\r
262                 Geometry geom = new Geometry();\r
263                 geom.setMesh(edgeMesh);\r
264                 \r
265                 Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");\r
266             ColorRGBA color = new ColorRGBA(0.0f, 0.0f, 0.0f, 1.0f);\r
267                 mat.setColor("Color", color);\r
268                 geom.setMaterial(mat);\r
269                 geom.updateModelBound();\r
270                 return geom;\r
271         }\r
272         \r
273         public Spatial createVerticesActor(Spatial partEdgesActor) {\r
274                 Geometry edgeGeom = (Geometry)partEdgesActor;\r
275                 Mesh vertexMesh = JmeOCCTTool.createVertexMesh(edgeGeom.getMesh());\r
276                 \r
277                 Geometry geom = new Geometry();\r
278                 geom.setMesh(vertexMesh);\r
279                 \r
280                 Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");\r
281             ColorRGBA color = new ColorRGBA(0.0f, 0.0f, 0.0f, 1.0f);\r
282                 mat.setColor("Color", color);\r
283                 geom.setMaterial(mat);\r
284                 geom.updateModelBound();\r
285                 return geom;\r
286         }\r
287         \r
288         \r
289         \r
290 \r
291 }\r