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