1 /*******************************************************************************
\r
2 * Copyright (c) 2012, 2013 Association for Decentralized Information Management in
\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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.opencascade.jme;
\r
14 import java.util.ArrayList;
\r
15 import java.util.Collection;
\r
16 import java.util.List;
\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
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
35 public class JmeSolidObject {
\r
38 public static double deflection = 0.001;
\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
45 private Application app;
\r
46 private TopoDS_Shape shape;
\r
48 private List<Spatial> actors = new ArrayList<Spatial>(2);
\r
50 private List<Spatial> solid = new ArrayList<Spatial>(1);
\r
51 private List<Spatial> edges = new ArrayList<Spatial>(1);
\r
53 public JmeSolidObject(Application app,TopoDS_Shape shape) {
\r
58 public void visualizeSolid(boolean showEdges, boolean showVertices) {
\r
59 visualizeSolid(true, showEdges, showVertices);
\r
63 public void visualizeSolid(boolean showFaces, boolean showEdges, boolean showVertices) {
\r
65 Mesh data = createSolidMesh(shape);
\r
69 solid.add(createActor(data));
\r
72 Spatial edge = createEdgesActor(data);
\r
75 actors.add(createVerticesActor(edge));
\r
79 actors.addAll(solid);
\r
80 actors.addAll(edges);
\r
85 public void visualizeFaces(boolean showEdges, boolean showVertices) {
\r
87 Collection<Mesh> datas = createFaceMeshes(shape);
\r
88 for (Mesh data : datas) {
\r
89 solid.add(createActor(data));
\r
92 Spatial edgesActor = createEdgesActor(data);
\r
93 edges.add(edgesActor);
\r
95 actors.add(createVerticesActor(edgesActor));
\r
99 actors.addAll(solid);
\r
100 actors.addAll(edges);
\r
105 public List<Spatial> getActors() {
\r
109 public List<Spatial> getSolid() {
\r
113 public List<Spatial> getEdges() {
\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
127 public void showActors() {
\r
128 Display.getDefault().asyncExec(new Runnable() {
\r
131 public void run() {
\r
137 public void clearActorsSWT() {
\r
138 assert (Thread.currentThread() == Display.getDefault().getThread());
\r
139 if (actors.size() == 0)
\r
141 for (Spatial act : actors) {
\r
142 act.removeFromParent();
\r
149 private void clearActorsSWT(List<Spatial> actors) {
\r
150 assert (Thread.currentThread() == Display.getDefault().getThread());
\r
151 if (actors.size() == 0)
\r
153 for (Spatial act : actors) {
\r
154 act.removeFromParent();
\r
158 public void clearActors() {
\r
159 if (actors.size() == 0)
\r
161 final List<Spatial> temp = new ArrayList<Spatial>(actors.size());
\r
162 temp.addAll(actors);
\r
166 Display.getDefault().asyncExec(new Runnable() {
\r
169 public void run() {
\r
170 clearActorsSWT(temp);
\r
175 public void dispose() {
\r
176 if (shape != null) {
\r
183 public void delete() {
\r
184 if (shape != null) {
\r
191 private static double TOLERANCE = 0.01;
\r
193 public static Mesh createSolidMesh(TopoDS_Shape shape) {
\r
195 double volume = OCCTTool.getBoundingBoxDiagonal(shape);
\r
196 if (volume < TOLERANCE)
\r
199 BRepMesh_IncrementalMesh mesh = new BRepMesh_IncrementalMesh(shape,deflection*volume);
\r
201 TopExp_Explorer expFace = new TopExp_Explorer();
\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
210 if (meshPoints.size() == 0 || meshTriangles.size() == 0)
\r
213 Mesh data = JmeOCCTTool.createPartGrid(meshPoints, meshTriangles);
\r
221 public static Collection<Mesh> createFaceMeshes(TopoDS_Shape shape) {
\r
223 double volume = OCCTTool.getBoundingBoxDiagonal(shape);
\r
224 Collection<Mesh> faces = new ArrayList<Mesh>();
\r
226 if (volume > TOLERANCE) {
\r
228 BRepMesh_IncrementalMesh mesh = new BRepMesh_IncrementalMesh(shape,deflection*volume);
\r
230 TopExp_Explorer expFace = new TopExp_Explorer();
\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
249 public Spatial createActor(Mesh partGrid) {
\r
252 Geometry geom = new Geometry();
\r
254 geom.setMesh(partGrid);
\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
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
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
284 public Spatial createVerticesActor(Spatial partEdgesActor) {
\r
285 Geometry edgeGeom = (Geometry)partEdgesActor;
\r
286 Mesh vertexMesh = JmeOCCTTool.createVertexMesh(edgeGeom.getMesh());
\r
288 Geometry geom = new Geometry();
\r
289 geom.setMesh(vertexMesh);
\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