package org.simantics.g3d.vtk.shape; import org.simantics.g3d.shape.Mesh; import org.simantics.utils.threads.AWTThread; import org.simantics.utils.threads.ThreadUtils; import vtk.vtkPanel; import vtk.vtkRenderer; public class vtkMeshObject { private vtkPanel panel; private Mesh mesh; private MeshActor meshActor; public vtkMeshObject(vtkPanel panel, Mesh mesh) { this.mesh = mesh; this.panel = panel; } public void visualizeMesh() { clearActorsAWT(); meshActor = new MeshActor(); meshActor.setMesh(mesh); //System.out.println("Set mesh " + mesh.getVertices().size() + " " + mesh.getIndices().size() + " " + this); showActorsAWT(); } public MeshActor getActor() { assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread()); return meshActor; } public void showActorsAWT() { //System.out.println("showActorsAWT " + this + " " + meshActor != null); assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread()); vtkRenderer ren = panel.GetRenderer(); if (meshActor != null) ren.AddActor(meshActor); } public void showActors() { ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() { @Override public void run() { showActorsAWT(); } }); } public void clearActorsAWT() { assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread()); if (meshActor == null) return; //System.out.println("clearActorsAwt " + this); vtkRenderer ren = panel.GetRenderer(); if (ren == null) return; panel.lock(); if (meshActor.GetVTKId() != 0) { ren.RemoveActor(meshActor); meshActor.Delete(); } panel.unlock(); meshActor = null; } private void clearActorsAWT(MeshActor meshActor) { assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread()); if (meshActor == null) return; //System.out.println("clearActorsAwt2 " + this); vtkRenderer ren = panel.GetRenderer(); if (ren == null) return; panel.lock(); if (meshActor.GetVTKId() != 0) { ren.RemoveActor(meshActor); meshActor.Delete(); } panel.unlock(); meshActor = null; } public void clearActors() { if (meshActor == null) return; ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() { @Override public void run() { clearActorsAWT(meshActor); } }); } public void dispose() { mesh = null; clearActors(); } public void delete() { mesh = null; clearActorsAWT(); } }