X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scenegraph%2Fsrc%2Forg%2Fsimantics%2Fscenegraph%2Fg2d%2Fnodes%2Fspatial%2FRTreeNode.java;h=56b6be302e44910e22fb62f47310406ba2c419e8;hb=refs%2Fchanges%2F63%2F1963%2F9;hp=d9b34dee60455bdf819e03d078cf89a4d1c429d4;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/spatial/RTreeNode.java b/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/spatial/RTreeNode.java index d9b34dee6..56b6be302 100644 --- a/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/spatial/RTreeNode.java +++ b/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/spatial/RTreeNode.java @@ -11,9 +11,6 @@ *******************************************************************************/ package org.simantics.scenegraph.g2d.nodes.spatial; -import gnu.trove.TIntObjectHashMap; -import gnu.trove.TIntProcedure; - import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Shape; @@ -22,9 +19,12 @@ import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; +import java.util.List; +import java.util.Map; import java.util.Properties; import java.util.Set; +import org.simantics.scenegraph.INode; import org.simantics.scenegraph.g2d.G2DParentNode; import org.simantics.scenegraph.g2d.IG2DNode; import org.simantics.scenegraph.g2d.events.Event; @@ -37,6 +37,9 @@ import org.simantics.scenegraph.utils.NodeUtil; import com.infomatiq.jsi.Rectangle; import com.infomatiq.jsi.rtree.RTree; +import gnu.trove.TIntObjectHashMap; +import gnu.trove.TIntProcedure; + /** * A G2D scene graph node that spatially decomposes all of its immediate child * nodes into an R-Tree structure to optimize the painting of its direct child @@ -113,6 +116,11 @@ public class RTreeNode extends G2DParentNode implements INodeEventHandlerProvide private transient ArrayList collected = new ArrayList(); private transient Set simplified = new HashSet(); + @Override + protected Map createChildMap() { + return super.createChildMap(1 << 15); + } + @Override public void render(Graphics2D g) { if (DISABLE_RTREE) { @@ -311,6 +319,31 @@ public class RTreeNode extends G2DParentNode implements INodeEventHandlerProvide return new Rectangle((float) rect.getMinX(), (float) rect.getMinY(), (float) rect.getMaxX(), (float) rect.getMaxY()); } + public List intersectingNodes(Rectangle2D rect, List result) { + final Tree tree = getSpatialDecomposition(); + if (rect == null || tree.bounds == null || containedBy(tree.bounds, rect)) { + IG2DNode[] nodes = getSortedNodes(); + for (IG2DNode node : nodes) { + if (node.validate()) { + result.add(node); + } + } + } else { + tree.rtree.intersects(toRectangle(rect), value -> { + //System.out.println("exec: " + value); + IG2DNode node = tree.toNodes.get(value); + //System.out.println(" node: " + node); + if (node == null || !node.validate()) + return true; + + result.add(node); + return true; + }); + } + Collections.sort(result, G2DParentNode.G2DNODE_Z_COMPARATOR); + return result; + } + /** * Determine whether this rectangle is contained by the passed rectangle *