X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.g3d.csg%2Fsrc%2Forg%2Fsimantics%2Fg3d%2Fcsg%2Fscenegraph2%2FCSGparentNode.java;h=46610414f8c6ab4a061f6a08ab54ffab60caf870;hb=refs%2Fchanges%2F08%2F3908%2F2;hp=dcc564ab0abfe318f3006a5e8181520f724013f7;hpb=87b3241ec277ba3d8e414b26186a032c9cdcaeed;p=simantics%2F3d.git diff --git a/org.simantics.g3d.csg/src/org/simantics/g3d/csg/scenegraph2/CSGparentNode.java b/org.simantics.g3d.csg/src/org/simantics/g3d/csg/scenegraph2/CSGparentNode.java index dcc564ab..46610414 100644 --- a/org.simantics.g3d.csg/src/org/simantics/g3d/csg/scenegraph2/CSGparentNode.java +++ b/org.simantics.g3d.csg/src/org/simantics/g3d/csg/scenegraph2/CSGparentNode.java @@ -1,308 +1,326 @@ -package org.simantics.g3d.csg.scenegraph2; - -import java.util.Collection; -import java.util.Collections; - -import javax.vecmath.AxisAngle4d; -import javax.vecmath.Quat4d; -import javax.vecmath.Vector3d; - -import org.jcae.opencascade.jni.TopoDS_Shape; -import org.simantics.g3d.csg.ontology.CSG; -import org.simantics.g3d.math.MathTools; -import org.simantics.g3d.ontology.G3D; -import org.simantics.g3d.property.annotations.GetPropertyValue; -import org.simantics.g3d.property.annotations.PropertyContributor; -import org.simantics.g3d.property.annotations.SetPropertyValue; -import org.simantics.g3d.scenegraph.IG3DNode; -import org.simantics.g3d.scenegraph.base.ParentNode; -import org.simantics.g3d.tools.NodeTools; -import org.simantics.layer0.Layer0; -import org.simantics.objmap.graph.annotations.RelatedElementsAdd; -import org.simantics.objmap.graph.annotations.RelatedElementsGet; -import org.simantics.objmap.graph.annotations.RelatedElementsRem; -import org.simantics.objmap.graph.annotations.RelatedGetValue; -import org.simantics.objmap.graph.annotations.RelatedSetValue; -import org.simantics.opencascade.OccTriangulator; -import org.simantics.opencascade.vtk.vtkSolidObject; -import org.simantics.utils.threads.AWTThread; - -import vtk.vtkPanel; -import vtk.vtkProp3D; - -@PropertyContributor -public abstract class CSGparentNode extends ParentNode implements ICSGnode { - - private String name; - - - @RelatedGetValue(Layer0.URIs.HasName) - @GetPropertyValue(value = Layer0.URIs.HasName, tabId = "Default", name = "Name") - public String getName() { - return name; - } - - @RelatedSetValue(Layer0.URIs.HasName) - @SetPropertyValue(Layer0.URIs.HasName) - public void setName(String name) { - if (name == null) - return; - this.name = name; - firePropertyChanged(Layer0.URIs.HasName); - } - - @Override - public String toString() { - return getName(); - } - - private Vector3d position = new Vector3d(); - private Quat4d orientation = MathTools.getIdentityQuat(); - - @Override - @GetPropertyValue(value = G3D.URIs.hasOrientation, tabId = "Transform", name = "Orientation") - public Quat4d getOrientation() { - return orientation; - } - - @RelatedGetValue(G3D.URIs.hasOrientation) - public double[] getOrientationArr() { - double arr[] = new double[4]; - orientation.get(arr); - return arr; - - } - - @Override - @GetPropertyValue(value = G3D.URIs.hasPosition, tabId = "Transform", name = "Position") - public Vector3d getPosition() { - return position; - } - - @RelatedGetValue(G3D.URIs.hasPosition) - public double[] getPositionArr() { - double arr[] = new double[3]; - position.get(arr); - return arr; - } - - @RelatedElementsAdd(CSG.URIs.hasPrimaryShape) - public void addPrimaryChild(ICSGnode node) { - addNode("primary",node); - } - - @RelatedElementsGet(CSG.URIs.hasPrimaryShape) - public Collection getPrimaryChild() { - return getNodes("primary"); - } - - @RelatedElementsRem(CSG.URIs.hasPrimaryShape) - public void remPrimaryChild(ICSGnode node) { - removeNode("primary", node); - } - - @RelatedElementsAdd(CSG.URIs.hasSecondaryShape) - public void addSecondaryChild(ICSGnode node) { - addNode("secondary",node); - } - - @RelatedElementsGet(CSG.URIs.hasSecondaryShape) - public Collection getSecondaryChild() { - return getNodes("secondary"); - } - - @RelatedElementsRem(CSG.URIs.hasSecondaryShape) - public void remSecondaryChild(ICSGnode node) { - removeNode("secondary", node); - } - - - @RelatedElementsAdd(CSG.URIs.hasChildShape) - public void addChild(ICSGnode node) { - addNode("child",node); - } - - @RelatedElementsGet(CSG.URIs.hasChildShape) - public Collection getChild() { - return getNodes("child"); - } - - @RelatedElementsRem(CSG.URIs.hasChildShape) - public void remChild(ICSGnode node) { - removeNode("child", node); - } - - - - protected TopoDS_Shape getPrimary() { - for (ICSGnode node : getNodes("primary")) - return node.getGeometry(); - return null; - } - - protected TopoDS_Shape getSecondary() { - for (ICSGnode node : getNodes("secondary")) - return node.getGeometry(); - return null; - } - - @Override - public TopoDS_Shape getGeometry() { - TopoDS_Shape shape = getBaseGeometry(); - if (shape == null) - return null; - Quat4d q = getOrientation(); - AxisAngle4d r = new AxisAngle4d(); - r.set(q); - TopoDS_Shape tshape = OccTriangulator.makeRotation(shape, new double[] { 0.0, 0.0, 0.0, r.x, r.y, r.z }, r.angle); - shape.delete(); - shape = tshape; - Vector3d p = getPosition(); - tshape = OccTriangulator.makeTranslation(shape, p.x, p.y, p.z); - shape.delete(); - return tshape; - - } - - - - @Override - @SetPropertyValue(G3D.URIs.hasOrientation) - public void setOrientation(Quat4d orientation) { - assert(orientation != null); - this.orientation = orientation; - - firePropertyChanged(G3D.URIs.hasOrientation); - } - - @Override - @SetPropertyValue(G3D.URIs.hasPosition) - public void setPosition(Vector3d position) { - assert(position != null); - this.position = position; - - firePropertyChanged(G3D.URIs.hasPosition); - } - - @RelatedSetValue(G3D.URIs.hasOrientation) - public void setOrientation(double[] arr) { - if (arr == null) - return; - setOrientation(new Quat4d(arr)); - } - - @RelatedSetValue(G3D.URIs.hasPosition) - public void setPosition(double[] arr) { - if (arr == null) - return; - setPosition(new Vector3d(arr)); - } - - @Override - @GetPropertyValue(value = G3D.URIs.hasWorldPosition, tabId = "Transform", name = "World Position") - public Vector3d getWorldPosition() { - IG3DNode parent = (IG3DNode) getParent(); - if (parent == null) - return position; - return NodeTools.getWorldPosition(parent, new Vector3d(position)); - } - - public Vector3d getWorldPosition(Vector3d localPosition) { - return NodeTools.getWorldPosition(this, localPosition); - } - - - @Override - @GetPropertyValue(value = G3D.URIs.hasWorldOrientation, tabId = "Transform", name = "World Orientation") - public Quat4d getWorldOrientation() { - return getWorldOrientation(new Quat4d(orientation)); - } - - public Quat4d getWorldOrientation(Quat4d localOrientation) { - IG3DNode parent = (IG3DNode)getParent(); - if (parent == null) - return localOrientation; - return NodeTools.getWorldOrientation(parent, localOrientation); - } - - @Override - public Vector3d getLocalPosition(Vector3d worldPosition) { - IG3DNode parent = (IG3DNode)getParent(); - if (parent == null) - return worldPosition; - return NodeTools.getLocalPosition(parent,new Vector3d(worldPosition)); - } - - @Override - public Quat4d getLocalOrientation(Quat4d worldOrientation) { - IG3DNode parent = (IG3DNode)getParent(); - if (parent == null) - return worldOrientation; - return NodeTools.getLocalOrientation(parent, new Quat4d(worldOrientation)); - } - - @Override - @SetPropertyValue(G3D.URIs.hasWorldPosition) - public void setWorldPosition(Vector3d position) { - Vector3d localPos = getLocalPosition(position); - setPosition(localPos); - } - - @Override - @SetPropertyValue(G3D.URIs.hasWorldOrientation) - public void setWorldOrientation(Quat4d orientation) { - Quat4d localOr = getLocalOrientation(orientation); - setOrientation(localOr); - } - - - private vtkSolidObject solidObject; - - - public void visualize(vtkPanel panel) { - if (solidObject != null) { - solidObject.delete(); - solidObject = null; - } - TopoDS_Shape shape = getGeometry(); - if (shape == null) - return; - solidObject = new vtkSolidObject(panel, shape); - solidObject.visualizeSolid(true, false); - } - - @SuppressWarnings("unchecked") - public Collection getActors() { - if (solidObject == null) - return Collections.EMPTY_LIST; - return solidObject.getActors(); - } - - public void stopVisualize() { - if (solidObject != null) { - if (Thread.currentThread() == AWTThread.getThreadAccess().getThread()) - solidObject.delete(); - else - solidObject.dispose(); - solidObject = null; - } - } - - @Override - public void cleanup() { - stopVisualize(); - super.cleanup(); - } - - - @Override - public void remove() { - //FIXME: creating boolean shapes (removing nodes from parent and attaching under boolean shape would destroy the existing hierarchy, if default implementation is used. - super.remove(); - } - - @Override - public Object getAdapter(Class adapter) { - return null; - } -} +/******************************************************************************* + * Copyright (c) 2012, 2013 Association for Decentralized Information Management in + * Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.g3d.csg.scenegraph2; + +import java.util.Collection; +import java.util.Collections; +import java.util.Objects; + +import javax.vecmath.AxisAngle4d; +import javax.vecmath.Quat4d; +import javax.vecmath.Vector3d; + +import org.jcae.opencascade.jni.TopoDS_Shape; +import org.simantics.g3d.csg.ontology.CSG; +import org.simantics.g3d.math.MathTools; +import org.simantics.g3d.ontology.G3D; +import org.simantics.g3d.property.annotations.GetPropertyValue; +import org.simantics.g3d.property.annotations.PropertyContributor; +import org.simantics.g3d.property.annotations.SetPropertyValue; +import org.simantics.g3d.scenegraph.IG3DNode; +import org.simantics.g3d.scenegraph.base.ParentNode; +import org.simantics.g3d.tools.NodeTools; +import org.simantics.g3d.vtk.common.VtkView; +import org.simantics.layer0.Layer0; +import org.simantics.objmap.graph.annotations.RelatedElementsAdd; +import org.simantics.objmap.graph.annotations.RelatedElementsGet; +import org.simantics.objmap.graph.annotations.RelatedElementsRem; +import org.simantics.objmap.graph.annotations.RelatedGetValue; +import org.simantics.objmap.graph.annotations.RelatedSetValue; +import org.simantics.opencascade.OccTriangulator; +import org.simantics.opencascade.vtk.vtkSolidObject; +import org.simantics.utils.threads.AWTThread; + +import vtk.vtkProp3D; + +@PropertyContributor +public abstract class CSGparentNode extends ParentNode implements ICSGnode { + + private String name; + + + @RelatedGetValue(Layer0.URIs.HasName) + @GetPropertyValue(value = Layer0.URIs.HasName, tabId = "Default", name = "Name") + public String getName() { + return name; + } + + @RelatedSetValue(Layer0.URIs.HasName) + @SetPropertyValue(Layer0.URIs.HasName) + public void setName(String name) { + if (name == null || name.equals(this.name)) + return; + this.name = name; + firePropertyChanged(Layer0.URIs.HasName); + } + + @Override + public String toString() { + return getName(); + } + + private Vector3d position = new Vector3d(); + private Quat4d orientation = MathTools.getIdentityQuat(); + + @Override + @GetPropertyValue(value = G3D.URIs.hasOrientation, tabId = "Transform", name = "Orientation") + public Quat4d getOrientation() { + return orientation; + } + + @RelatedGetValue(G3D.URIs.hasOrientation) + public double[] getOrientationArr() { + double arr[] = new double[4]; + orientation.get(arr); + return arr; + + } + + @Override + @GetPropertyValue(value = G3D.URIs.hasPosition, tabId = "Transform", name = "Position") + public Vector3d getPosition() { + return position; + } + + @RelatedGetValue(G3D.URIs.hasPosition) + public double[] getPositionArr() { + double arr[] = new double[3]; + position.get(arr); + return arr; + } + + @RelatedElementsAdd(CSG.URIs.hasPrimaryShape) + public void addPrimaryChild(ICSGnode node) { + addNode("primary",node); + } + + @RelatedElementsGet(CSG.URIs.hasPrimaryShape) + public Collection getPrimaryChild() { + return getNodes("primary"); + } + + @RelatedElementsRem(CSG.URIs.hasPrimaryShape) + public void remPrimaryChild(ICSGnode node) { + removeNode("primary", node); + } + + @RelatedElementsAdd(CSG.URIs.hasSecondaryShape) + public void addSecondaryChild(ICSGnode node) { + addNode("secondary",node); + } + + @RelatedElementsGet(CSG.URIs.hasSecondaryShape) + public Collection getSecondaryChild() { + return getNodes("secondary"); + } + + @RelatedElementsRem(CSG.URIs.hasSecondaryShape) + public void remSecondaryChild(ICSGnode node) { + removeNode("secondary", node); + } + + + @RelatedElementsAdd(CSG.URIs.hasChildShape) + public void addChild(ICSGnode node) { + addNode("child",node); + } + + @RelatedElementsGet(CSG.URIs.hasChildShape) + public Collection getChild() { + return getNodes("child"); + } + + @RelatedElementsRem(CSG.URIs.hasChildShape) + public void remChild(ICSGnode node) { + removeNode("child", node); + } + + + + protected TopoDS_Shape getPrimary() { + for (ICSGnode node : getNodes("primary")) + return node.getGeometry(); + return null; + } + + protected TopoDS_Shape getSecondary() { + for (ICSGnode node : getNodes("secondary")) + return node.getGeometry(); + return null; + } + + @Override + public TopoDS_Shape getGeometry() { + TopoDS_Shape shape = getBaseGeometry(); + if (shape == null) + return null; + Quat4d q = getOrientation(); + AxisAngle4d r = new AxisAngle4d(); + r.set(q); + TopoDS_Shape tshape = OccTriangulator.makeRotation(shape, new double[] { 0.0, 0.0, 0.0, r.x, r.y, r.z }, r.angle); + shape.delete(); + shape = tshape; + Vector3d p = getPosition(); + tshape = OccTriangulator.makeTranslation(shape, p.x, p.y, p.z); + shape.delete(); + return tshape; + + } + + + + @Override + @SetPropertyValue(G3D.URIs.hasOrientation) + public void setOrientation(Quat4d orientation) { + assert(orientation != null); + if (Objects.equals(this.orientation, orientation)) + return; + + this.orientation = orientation; + + firePropertyChanged(G3D.URIs.hasOrientation); + } + + @Override + @SetPropertyValue(G3D.URIs.hasPosition) + public void setPosition(Vector3d position) { + assert(position != null); + if (Objects.equals(this.position, position)) + return; + + this.position = position; + + firePropertyChanged(G3D.URIs.hasPosition); + } + + @RelatedSetValue(G3D.URIs.hasOrientation) + public void setOrientation(double[] arr) { + if (arr == null) + return; + setOrientation(new Quat4d(arr)); + } + + @RelatedSetValue(G3D.URIs.hasPosition) + public void setPosition(double[] arr) { + if (arr == null) + return; + setPosition(new Vector3d(arr)); + } + + @Override + @GetPropertyValue(value = G3D.URIs.hasWorldPosition, tabId = "Transform", name = "World Position") + public Vector3d getWorldPosition() { + IG3DNode parent = (IG3DNode) getParent(); + if (parent == null) + return position; + return NodeTools.getWorldPosition(parent, new Vector3d(position)); + } + + public Vector3d getWorldPosition(Vector3d localPosition) { + return NodeTools.getWorldPosition(this, localPosition); + } + + + @Override + @GetPropertyValue(value = G3D.URIs.hasWorldOrientation, tabId = "Transform", name = "World Orientation") + public Quat4d getWorldOrientation() { + return getWorldOrientation(new Quat4d(orientation)); + } + + public Quat4d getWorldOrientation(Quat4d localOrientation) { + IG3DNode parent = (IG3DNode)getParent(); + if (parent == null) + return localOrientation; + return NodeTools.getWorldOrientation(parent, localOrientation); + } + + @Override + public Vector3d getLocalPosition(Vector3d worldPosition) { + IG3DNode parent = (IG3DNode)getParent(); + if (parent == null) + return worldPosition; + return NodeTools.getLocalPosition(parent,new Vector3d(worldPosition)); + } + + @Override + public Quat4d getLocalOrientation(Quat4d worldOrientation) { + IG3DNode parent = (IG3DNode)getParent(); + if (parent == null) + return worldOrientation; + return NodeTools.getLocalOrientation(parent, new Quat4d(worldOrientation)); + } + + @Override + @SetPropertyValue(G3D.URIs.hasWorldPosition) + public void setWorldPosition(Vector3d position) { + Vector3d localPos = getLocalPosition(position); + setPosition(localPos); + } + + @Override + @SetPropertyValue(G3D.URIs.hasWorldOrientation) + public void setWorldOrientation(Quat4d orientation) { + Quat4d localOr = getLocalOrientation(orientation); + setOrientation(localOr); + } + + + private vtkSolidObject solidObject; + + + public void visualize(VtkView panel) { + if (solidObject != null) { + solidObject.delete(); + solidObject = null; + } + TopoDS_Shape shape = getGeometry(); + if (shape == null) + return; + solidObject = new vtkSolidObject(panel, shape); + solidObject.visualizeSolid(true, false); + } + + @SuppressWarnings("unchecked") + public Collection getActors() { + if (solidObject == null) + return Collections.EMPTY_LIST; + return solidObject.getActors(); + } + + public void stopVisualize() { + if (solidObject != null) { + if (Thread.currentThread() == AWTThread.getThreadAccess().getThread()) + solidObject.delete(); + else + solidObject.dispose(); + solidObject = null; + } + } + + @Override + public void cleanup() { + stopVisualize(); + super.cleanup(); + } + + + @Override + public void remove() { + //FIXME: creating boolean shapes (removing nodes from parent and attaching under boolean shape would destroy the existing hierarchy, if default implementation is used. + super.remove(); + } + + @Override + public C getAdapter(Class adapter) { + return null; + } +}