]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java
Support for inline component rotations
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / scenegraph / controlpoint / PipeControlPoint.java
index 02bce62246e8748612ac72f7e2b64afae4da06de..b822b2f3535ebf0c85f6302e9fb53706e0902234 100644 (file)
@@ -30,6 +30,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
        
        private Type type;
        private boolean fixed = true;
+       private boolean rotate = false;
        private boolean deletable = true;
        private boolean sub = false;
        
@@ -81,6 +82,16 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                this.fixed = fixed;
        }
        
+       @GetPropertyValue(name="Rotate",tabId="Debug",value="rotate")
+       public boolean isRotate() {
+               return rotate;
+       }
+       
+       
+       public void setRotate(boolean rotate) {
+               this.rotate = rotate;
+       }
+       
        public void setSub(boolean sub) {
                this.sub = sub;
        }
@@ -173,7 +184,9 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                                component.setNext(next != null ? next.component : null);
                        else
                                component.setBranch0(next != null ? next.component : null);
+                       updateSubPoint();
                }
+               
        }
        
        public void setPrevious(PipeControlPoint previous) {
@@ -182,11 +195,14 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
 //             if (previous != null && getPipeRun() == null)
 //                     throw new RuntimeException("Cannot connect control point befor piperun has been set");
                this.previous = previous;
-               if (component != null)
+               if (component != null) {
                        if (parent == null || sub)
                                component.setPrevious(previous != null ? previous.component : null);
                        else
                                component.setBranch0(previous != null ? previous.component : null);
+                       updateSubPoint();
+               }
+               
        }
        
        public PipeControlPoint parent;
@@ -290,7 +306,17 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                if (rotationAngle == null)
                        rotationAngle = 0.0;
                Quat4d q = getControlPointOrientationQuat(dir, rotationAngle);
-               Vector3d v = new Vector3d(0.0,0.0,offset);
+               Vector3d v = new Vector3d(0.0,offset,0.0);
+       Vector3d offset = new Vector3d();
+       MathTools.rotate(q, v, offset);
+       return offset;
+       }
+       
+       public Vector3d getSizeChangeOffsetVector() {
+               if (rotationAngle == null)
+                       rotationAngle = 0.0;
+               Quat4d q = getControlPointOrientationQuat(rotationAngle);
+               Vector3d v = new Vector3d(0.0,offset,0.0);
        Vector3d offset = new Vector3d();
        MathTools.rotate(q, v, offset);
        return offset;
@@ -547,8 +573,12 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                                        
                                } else {
                                        if (isInline()) {
+                                               PipeControlPoint pcp = this;
+                                               if (pcp.isDualSub()) {
+                                                       pcp = pcp.getParentPoint();
+                                               }
                                                Vector3d v = new Vector3d();
-                                               v.sub(getWorldPosition(),previous.getWorldPosition());
+                                               v.sub(pcp.getWorldPosition(),previous.getWorldPosition());
                                                return v;
                                        } else if (isDirected()) {
                                                return getDirectedControlPointDirection();
@@ -579,8 +609,12 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                                        return v;
                                } else {
                                        if (isInline()) {
+                                               PipeControlPoint pcp = this;
+                                               if (pcp.isDualInline()) {
+                                                       pcp = pcp.getSubPoint().get(0);
+                                               }
                                                Vector3d v = new Vector3d();
-                                               v.sub(getWorldPosition(),next.getWorldPosition());
+                                               v.sub(pcp.getWorldPosition(),next.getWorldPosition());
                                                return v;
                                        } else if (isDirected()) {
                                                Vector3d v = getDirectedControlPointDirection();
@@ -1031,10 +1065,7 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                super.setOrientation(orientation);
                if (getParentPoint() == null && component != null)
                        component._setWorldOrientation(getWorldOrientation());
-               for (PipeControlPoint sub : getSubPoint()) {
-                       sub.setWorldPosition(getWorldPosition());
-                       sub.setWorldOrientation(getWorldOrientation());
-               }
+               updateSubPoint();
        }
        
        @Override
@@ -1044,9 +1075,31 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
                super.setPosition(position);
                if (getParentPoint() == null && component != null)
                        component._setWorldPosition(getWorldPosition());
-               for (PipeControlPoint sub : getSubPoint()) {
-                       sub.setWorldPosition(getWorldPosition());
-                       sub.setWorldOrientation(getWorldOrientation());
+               if (isDualSub())
+                       System.out.println();
+               updateSubPoint();
+       }
+       
+       private void updateSubPoint() {
+               if (isOffset()) {
+                       if (next == null && previous == null) {
+                               for (PipeControlPoint sub : getSubPoint()) {
+                                       sub.setWorldPosition(getWorldPosition());
+                                       sub.setWorldOrientation(getWorldOrientation());
+                               }
+                               return;
+                       }
+                       for (PipeControlPoint sub : getSubPoint()) {
+                               Vector3d wp = getWorldPosition();
+                               wp.add(getSizeChangeOffsetVector());
+                               sub.setWorldPosition(wp);
+                               sub.setWorldOrientation(getWorldOrientation());
+                       }
+               } else {
+                       for (PipeControlPoint sub : getSubPoint()) {
+                               sub.setWorldPosition(getWorldPosition());
+                               sub.setWorldOrientation(getWorldOrientation());
+                       }
                }
        }
 
@@ -1054,19 +1107,13 @@ public class PipeControlPoint extends G3DNode implements IP3DNode {
        public void _setWorldPosition(Vector3d position) {
                Vector3d localPos = getLocalPosition(position);
                super.setPosition(localPos);
-               for (PipeControlPoint sub : getSubPoint()) {
-                       sub.setWorldPosition(getWorldPosition());
-                       sub.setWorldOrientation(getWorldOrientation());
-               }
+               updateSubPoint();
        }
        
        public void _setWorldOrientation(Quat4d orientation) {
                Quat4d localOr = getLocalOrientation(orientation);
                super.setOrientation(localOr);
-               for (PipeControlPoint sub : getSubPoint()) {
-                       sub.setWorldPosition(getWorldPosition());
-                       sub.setWorldOrientation(getWorldOrientation());
-               }
+               updateSubPoint();
        }
        
        @Override