@Override protected QTModelScene<T> createNode( int son ) { float[] newEnv = bboxForSon( son ); return new QTModelScene<T>( numberOfObjects, newEnv, (byte) ( currentDepth + 1 ), maxPixelError ); }
@Override public boolean contains( Object o ) { if ( o instanceof PositionableModel ) { return root.contains( (PositionableModel) o ); } return false; }
private void getObjects( ViewParams viewParams, float[] eye, Set<T> result ) { if ( viewParams.getViewFrustum().intersects( getEnvelope() ) ) { if ( hasCoveringObjects() ) { for ( Entry<T> obj : objectsCoveringEnv ) { result.add( obj.entryValue ); if ( isLeaf() ) { if ( leafObjects != null ) { double distance = VectorUtils.getDistance( envelope, eye ); for ( QTree<T> n : children ) { if ( n != null ) { ( (QTModelScene<T>) n ).getObjects( viewParams, eye, result );
/** * (Re) set the valid domain of this renderer. Be careful, this will create a new quad tree. * * @param newDomain * of this manager */ public void setValidDomain( Envelope newDomain ) { this.validDomain = newDomain; QTModelScene<T> scene = new QTModelScene<T>( this.validDomain, numberOfObjectsInLeaf, root.getMaxPixelError() ); List<T> objects = root.getObjects(); if ( objects != null && !objects.isEmpty() ) { for ( T obj : objects ) { if ( obj != null ) { objects.add( obj ); } } } root = scene; }
/** * @param object * @return true if this tree contains the given object */ public boolean contains( PositionableModel object ) { if ( object != null && intersects( envelope, object.getModelBBox(), getMaxOffset() ) ) { List<T> r = getObjects( object.getModelBBox() ); if ( r != null && !r.isEmpty() ) { return r.contains( object ); } } return false; }
/** * @param viewParams * @return the list of objects this manager manages. */ public Set<T> getObjects( ViewParams viewParams ) { return root.getObjects( viewParams ); }
@Override public boolean add( T renderable ) { boolean result = root.insert( renderable ); if ( result ) { size++; } return result; }
/** * @param validDomain * @param numberOfObjectsInLeaf * @param maxPixelError */ public RenderableManager( Envelope validDomain, int numberOfObjectsInLeaf, double maxPixelError ) { this.validDomain = validDomain; root = new QTModelScene<T>( validDomain, numberOfObjectsInLeaf, maxPixelError ); this.numberOfObjectsInLeaf = numberOfObjectsInLeaf; }
/** * @return the used max pixel error. */ public double getMaxPixelError() { return root.getMaxPixelError(); }
@Override public void clear() { root.clear(); }
@Override public Object[] toArray() { return root.getObjects().toArray(); }
@Override public boolean addAll( Collection<? extends T> c ) { boolean result = true; for ( T p : c ) { if ( !result ) { break; } result = root.insert( p ); } return result; }
@Override public Iterator<T> iterator() { return root.getObjects().iterator(); }
/** * This method uses the envelope of the object instead of the given envelope; * * @param envelope * of the object * @param object * to insert * @return true if the object was inserted, false otherwise. */ @Override public boolean insert( float[] envelope, T object ) { if ( envelope == null || object == null ) { return false; } return insert( object ); }
@Override public boolean isEmpty() { return root.getObjects().isEmpty(); }
@Override public <U> U[] toArray( U[] a ) { return root.getObjects().toArray( a ); }
/** * @param viewParams * to get the objects for. * @return the objects which intersect with the given view parameters and or it's children, or the empty list. */ public Set<T> getObjects( ViewParams viewParams ) { Set<T> result = new HashSet<T>(); Point3d e = viewParams.getViewFrustum().getEyePos(); float[] eye = new float[] { (float) e.x, (float) e.y, (float) e.z }; getObjects( viewParams, eye, result ); return result; }