]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkEdgeNode.java
Optimization of district scene graph node rendering
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / nodes / DistrictNetworkEdgeNode.java
index a089ecaf149e61653a6849c6bf536a523c94aab3..00fe2184e49dcc53ba77fa922e426b1e4888562c 100644 (file)
@@ -13,12 +13,11 @@ import java.awt.geom.Rectangle2D;
 import org.simantics.district.network.ModelledCRS;
 import org.simantics.district.network.ui.DistrictNetworkEdge;
 import org.simantics.district.network.ui.adapters.DistrictNetworkEdgeElementFactory;
-import org.simantics.maps.MapScalingTransform;
 import org.simantics.scenegraph.INode;
 import org.simantics.scenegraph.ISelectionPainterNode;
-import org.simantics.scenegraph.INode.PropertySetter;
 import org.simantics.scenegraph.g2d.G2DNode;
 import org.simantics.scenegraph.g2d.G2DParentNode;
+import org.simantics.scenegraph.g2d.G2DRenderingHints;
 import org.simantics.scenegraph.g2d.nodes.SVGNode;
 import org.simantics.scenegraph.utils.GeometryUtils;
 import org.simantics.scenegraph.utils.NodeUtil;
@@ -34,7 +33,7 @@ public class DistrictNetworkEdgeNode extends G2DParentNode implements ISelection
     private Rectangle2D bounds;
     private transient Path2D path;
 
-    private boolean scaleStroke = true;
+    private static boolean scaleStroke = true;
     private Color color;
     private Double stroke;
     private transient Color dynamicColor = null;
@@ -68,17 +67,19 @@ public class DistrictNetworkEdgeNode extends G2DParentNode implements ISelection
     public void render(Graphics2D g2d) {
         AffineTransform ot = null;
         AffineTransform t = getTransform();
+        double scale = scaleStroke ? (Double) g2d.getRenderingHint(DistrictRenderingHints.KEY_VIEW_SCALE_UNDER_SPATIAL_ROOT) : 1.0;
         if (t != null && !t.isIdentity()) {
-            ot = g2d.getTransform();
-            g2d.transform(getTransform());
+            //ot = g2d.getTransform();
+            ot = (AffineTransform) g2d.getRenderingHint(G2DRenderingHints.KEY_TRANSFORM_UNDER_SPATIAL_ROOT);
+            g2d.transform(t);
+            if (scaleStroke) {
+                AffineTransform work = DistrictNetworkNodeUtils.sharedTransform.get();
+                work.setTransform(ot);
+                work.concatenate(t);
+                scale = DistrictNetworkNodeUtils.getScale(work);
+            }
         }
 
-        double scale = 1.0;
-        if (scaleStroke) {
-            AffineTransform tr = g2d.getTransform();
-            scale = DistrictNetworkNodeUtils.getScale(tr);
-        }
-        
         if (!hidden) {
             Object aaHint = g2d.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
             g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
@@ -92,8 +93,8 @@ public class DistrictNetworkEdgeNode extends G2DParentNode implements ISelection
             } else {
                 bs = STROKE;
             }
-            
-            int zoomLevel = MapScalingTransform.zoomLevel(ot);
+
+            int zoomLevel = (Integer) g2d.getRenderingHint(DistrictRenderingHints.KEY_VIEW_ZOOM_LEVEL);
             path = calculatePath(edge, path, zoomLevel > 15);
     
             if (isSelected()) {
@@ -143,7 +144,7 @@ public class DistrictNetworkEdgeNode extends G2DParentNode implements ISelection
             g2d.setColor(oldColor);
             g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, aaHint);
         }
-            
+
         for (INode nn : getNodes()) {
             G2DNode g2dNode = (G2DNode)nn;
             if (g2dNode instanceof SVGNode) {
@@ -152,16 +153,20 @@ public class DistrictNetworkEdgeNode extends G2DParentNode implements ISelection
                 if (scaleStroke) {
                     viewScaleRecip /= scale;
                 }
-                
+
+                // If the node is hidden from the start, then the center point cannot be calculated yet.
                 Point2D p = getCenterPoint();
+                if (p == null)
+                    break;
+
                 symbolRect = DistrictNetworkNodeUtils.calculateDrawnGeometry(p, NORMAL, symbolRect, viewScaleRecip);
                 symbolTransform = DistrictNetworkNodeUtils.getTransformToRectangle(symbolRect, symbolTransform);
-                
+
                 g2dNode.setTransform(symbolTransform);
             }
             g2dNode.render(g2d);
         }
-        
+
         if (ot != null)
             g2d.setTransform(ot);
     }
@@ -189,9 +194,10 @@ public class DistrictNetworkEdgeNode extends G2DParentNode implements ISelection
     }
     
     private Point2D getCenterPoint() {
+        if (path == null)
+            return null;
         if (centerPoint == null)
             centerPoint = new Point2D.Double();
-        
         Rectangle2D bounds = path.getBounds2D();
         centerPoint.setLocation(bounds.getCenterX(), bounds.getCenterY());
         return centerPoint;
@@ -282,7 +288,7 @@ public class DistrictNetworkEdgeNode extends G2DParentNode implements ISelection
     }
     
     @PropertySetter(value = "arrowLength")
-    public void setArroLength(Double length) {
+    public void setArrowLength(Double length) {
         arrowLength = length;
     }