*******************************************************************************/
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;
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;
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
private transient ArrayList<IG2DNode> collected = new ArrayList<IG2DNode>();
private transient Set<IG2DNode> simplified = new HashSet<IG2DNode>();
+ @Override
+ protected Map<String, INode> createChildMap() {
+ return super.createChildMap(1 << 15);
+ }
+
@Override
public void render(Graphics2D g) {
if (DISABLE_RTREE) {
return new Rectangle((float) rect.getMinX(), (float) rect.getMinY(), (float) rect.getMaxX(), (float) rect.getMaxY());
}
+ public List<IG2DNode> intersectingNodes(Rectangle2D rect, List<IG2DNode> 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
*