1 package org.simantics.opencascade.jme;
\r
3 import java.util.ArrayList;
\r
4 import java.util.Collection;
\r
5 import java.util.List;
\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
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
24 public class JmeSolidObject {
\r
27 public static double deflection = 0.001;
\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
34 private Application app;
\r
35 private TopoDS_Shape shape;
\r
37 private List<Spatial> actors = new ArrayList<Spatial>(2);
\r
39 private List<Spatial> solid = new ArrayList<Spatial>(1);
\r
40 private List<Spatial> edges = new ArrayList<Spatial>(1);
\r
42 public JmeSolidObject(Application app,TopoDS_Shape shape) {
\r
47 public void visualizeSolid(boolean showEdges, boolean showVertices) {
\r
48 visualizeSolid(true, showEdges, showVertices);
\r
52 public void visualizeSolid(boolean showFaces, boolean showEdges, boolean showVertices) {
\r
54 Mesh data = createSolidMesh(shape);
\r
58 solid.add(createActor(data));
\r
61 Spatial edge = createEdgesActor(data);
\r
64 actors.add(createVerticesActor(edge));
\r
68 actors.addAll(solid);
\r
69 actors.addAll(edges);
\r
74 public void visualizeFaces(boolean showEdges, boolean showVertices) {
\r
76 Collection<Mesh> datas = createFaceMeshes(shape);
\r
77 for (Mesh data : datas) {
\r
78 solid.add(createActor(data));
\r
81 Spatial edgesActor = createEdgesActor(data);
\r
82 edges.add(edgesActor);
\r
84 actors.add(createVerticesActor(edgesActor));
\r
88 actors.addAll(solid);
\r
89 actors.addAll(edges);
\r
94 public List<Spatial> getActors() {
\r
98 public List<Spatial> getSolid() {
\r
102 public List<Spatial> getEdges() {
\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
116 public void showActors() {
\r
117 Display.getDefault().asyncExec(new Runnable() {
\r
120 public void run() {
\r
126 public void clearActorsSWT() {
\r
127 assert (Thread.currentThread() == Display.getDefault().getThread());
\r
128 if (actors.size() == 0)
\r
130 for (Spatial act : actors) {
\r
131 act.removeFromParent();
\r
138 private void clearActorsSWT(List<Spatial> actors) {
\r
139 assert (Thread.currentThread() == Display.getDefault().getThread());
\r
140 if (actors.size() == 0)
\r
142 for (Spatial act : actors) {
\r
143 act.removeFromParent();
\r
147 public void clearActors() {
\r
148 if (actors.size() == 0)
\r
150 final List<Spatial> temp = new ArrayList<Spatial>(actors.size());
\r
151 temp.addAll(actors);
\r
155 Display.getDefault().asyncExec(new Runnable() {
\r
158 public void run() {
\r
159 clearActorsSWT(temp);
\r
164 public void dispose() {
\r
165 if (shape != null) {
\r
172 public void delete() {
\r
173 if (shape != null) {
\r
180 private static double TOLERANCE = 0.01;
\r
182 public static Mesh createSolidMesh(TopoDS_Shape shape) {
\r
184 double volume = OCCTTool.getBoundingBoxDiagonal(shape);
\r
185 if (volume < TOLERANCE)
\r
188 BRepMesh_IncrementalMesh mesh = new BRepMesh_IncrementalMesh(shape,deflection*volume);
\r
190 TopExp_Explorer expFace = new TopExp_Explorer();
\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
199 if (meshPoints.size() == 0 || meshTriangles.size() == 0)
\r
202 Mesh data = JmeOCCTTool.createPartGrid(meshPoints, meshTriangles);
\r
210 public static Collection<Mesh> createFaceMeshes(TopoDS_Shape shape) {
\r
212 double volume = OCCTTool.getBoundingBoxDiagonal(shape);
\r
213 Collection<Mesh> faces = new ArrayList<Mesh>();
\r
215 if (volume > TOLERANCE) {
\r
217 BRepMesh_IncrementalMesh mesh = new BRepMesh_IncrementalMesh(shape,deflection*volume);
\r
219 TopExp_Explorer expFace = new TopExp_Explorer();
\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
238 public Spatial createActor(Mesh partGrid) {
\r
241 Geometry geom = new Geometry();
\r
243 geom.setMesh(partGrid);
\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
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
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
273 public Spatial createVerticesActor(Spatial partEdgesActor) {
\r
274 Geometry edgeGeom = (Geometry)partEdgesActor;
\r
275 Mesh vertexMesh = JmeOCCTTool.createVertexMesh(edgeGeom.getMesh());
\r
277 Geometry geom = new Geometry();
\r
278 geom.setMesh(vertexMesh);
\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