topical media & game development
student-ar-org-papervision3d-core-render-data-QuadTreeNode.ax
student-ar-org-papervision3d-core-render-data-QuadTreeNode.ax
[swf]
[flash]
flex
package org.papervision3d.core.render.data
{
import flash.display.Graphics;
import flash.geom.Rectangle;
import org.papervision3d.core.render.command.RenderableListItem;
import org.papervision3d.objects.DisplayObject3D;
Quadrant tree node
public final class @ax-student-ar-org-papervision3d-core-render-data-QuadTreeNode
{
private var render_center_length:int = -1;
private var render_center_index:int = -1;
private var halfwidth:Number;
private var halfheight:Number;
private var level:int;
public var maxlevel:int = 4;
private function render_other(limit:Number, renderSessionData:RenderSessionData, graphics:Graphics):void
{
if (lefttopFlag)
lefttop.render(limit, renderSessionData, graphics);
if (leftbottomFlag)
leftbottom.render(limit, renderSessionData, graphics);
if (righttopFlag)
righttop.render(limit, renderSessionData, graphics);
if (rightbottomFlag)
rightbottom.render(limit, renderSessionData, graphics);
}
Array of primitives that lie in the center of the quadrant.
public var center:Array;
The quadrant tree node for the top left quadrant.
public var lefttop:@ax-student-ar-org-papervision3d-core-render-data-QuadTreeNode;
The quadrant tree node for the bottom left quadrant.
public var leftbottom:@ax-student-ar-org-papervision3d-core-render-data-QuadTreeNode;
The quadrant tree node for the top right quadrant.
public var righttop:@ax-student-ar-org-papervision3d-core-render-data-QuadTreeNode;
The quadrant tree node for the bottom right quadrant.
public var rightbottom:@ax-student-ar-org-papervision3d-core-render-data-QuadTreeNode;
Determines if the bounds of the top left quadrant need re-calculating.
public var lefttopFlag:Boolean;
Determines if the bounds of the bottom left quadrant need re-calculating.
public var leftbottomFlag:Boolean;
Determines if the bounds of the top right quadrant need re-calculating.
public var righttopFlag:Boolean;
Determines if the bounds of the bottom right quadrant need re-calculating.
public var rightbottomFlag:Boolean;
Determines if the quadrant node contains only one source.
public var onlysourceFlag:Boolean = true;
hold the 3d object referenced when <code>onlysourceFlag</code> is true.
public var onlysource:DisplayObject3D;
The x coordinate of the quadrant division.
public var xdiv:Number;
The x coordinate of the quadrant division.
public var ydiv:Number;
The quadrant parent.
public var parent:@ax-student-ar-org-papervision3d-core-render-data-QuadTreeNode;
Placeholder function for creating new quadrant node from a cache of objects.
Saves recreating objects and GC problems.
public var create:Function;
Says if node has content or not
public var hasContent:Boolean = false;
Creates a new <code>PrimitiveQuadrantTreeNode</code> object.
@param xdiv The x coordinate for the division between left and right child quadrants.
@param ydiv The y coordinate for the division between top and bottom child quadrants.
@param width The width of the quadrant node.
@param xdiv The height of the quadrant node.
@param level The iteration number of the quadrant node.
@param parent The parent quadrant of the quadrant node.
@param maxLevel The deepest a Node can go
public function @ax-student-ar-org-papervision3d-core-render-data-QuadTreeNode(xdiv:Number, ydiv:Number, width:Number, height:Number, level:int, parent:@ax-student-ar-org-papervision3d-core-render-data-QuadTreeNode = null, maxLevel:uint = 4)
{
this.level = level;
this.xdiv = xdiv;
this.ydiv = ydiv;
halfwidth = width / 2;
halfheight = height / 2;
this.parent = parent;
this.maxlevel = maxLevel;
}
Adds a primitive to the quadrant
public function push(pri:RenderableListItem):void
{
hasContent = true;
if (onlysourceFlag) {
if (onlysource != null && onlysource != pri.instance)
onlysourceFlag = false;
onlysource = pri.instance;
}
if (level < maxlevel) {
if (pri.maxX <= xdiv)
{
if (pri.maxY <= ydiv)
{
if (lefttop == null) {
lefttopFlag = true;
lefttop = new @ax-student-ar-org-papervision3d-core-render-data-QuadTreeNode(xdiv - halfwidth/2, ydiv - halfheight/2, halfwidth, halfheight, level+1, this, maxlevel);
} else if (!lefttopFlag) {
lefttopFlag = true;
lefttop.reset(xdiv - halfwidth/2, ydiv - halfheight/2, halfwidth, halfheight, maxlevel);
}
lefttop.push(pri);
return;
}
else if (pri.minY >= ydiv)
{
if (leftbottom == null) {
leftbottomFlag = true;
leftbottom = new @ax-student-ar-org-papervision3d-core-render-data-QuadTreeNode(xdiv - halfwidth/2, ydiv + halfheight/2, halfwidth, halfheight, level+1, this, maxlevel);
} else if (!leftbottomFlag) {
leftbottomFlag = true;
leftbottom.reset(xdiv - halfwidth/2, ydiv + halfheight/2, halfwidth, halfheight, maxlevel);
}
leftbottom.push(pri);
return;
}
}
else if (pri.minX >= xdiv)
{
if (pri.maxY <= ydiv)
{
if (righttop == null) {
righttopFlag = true;
righttop = new @ax-student-ar-org-papervision3d-core-render-data-QuadTreeNode(xdiv + halfwidth/2, ydiv - halfheight/2, halfwidth, halfheight, level+1, this, maxlevel);
} else if (!righttopFlag) {
righttopFlag = true;
righttop.reset(xdiv + halfwidth/2, ydiv - halfheight/2, halfwidth, halfheight, maxlevel);
}
righttop.push(pri);
return;
}
else if (pri.minY >= ydiv)
{
if (rightbottom == null) {
rightbottomFlag = true;
rightbottom = new @ax-student-ar-org-papervision3d-core-render-data-QuadTreeNode(xdiv + halfwidth/2, ydiv + halfheight/2, halfwidth, halfheight, level+1, this, maxlevel);
} else if (!rightbottomFlag) {
rightbottomFlag = true;
rightbottom.reset(xdiv + halfwidth/2, ydiv + halfheight/2, halfwidth, halfheight, maxlevel);
}
rightbottom.push(pri);
return;
}
}
}
//no quadrant, store in center array
if (center == null)
center = new Array();
center.push(pri);
pri.quadrant = this;
}
Clears the quadrant of all primitives and child nodes
public function reset(xdiv:Number, ydiv:Number, width:Number, height:Number, maxLevel:uint):void
{
this.xdiv = xdiv;
this.ydiv = ydiv;
halfwidth = width / 2;
halfheight = height / 2;
lefttopFlag = false;
leftbottomFlag = false;
righttopFlag = false;
rightbottomFlag = false;
onlysourceFlag = true;
onlysource = null;
render_center_length = -1;
render_center_index = -1;
hasContent = false;
maxlevel = maxLevel;
}
public function getRect():Rectangle{
return new Rectangle(xdiv, ydiv, halfwidth*2, halfheight*2);
}
Sorts and renders the contents of the quadrant tree
public function render(limit:Number, renderSessionData:RenderSessionData, graphics:Graphics):void
{
if (render_center_length == -1)
{
if (center != null)
{
render_center_length = center.length;
if (render_center_length > 1)
center.sortOn("screenZ", Array.DESCENDING | Array.NUMERIC);
}
else
render_center_length = 0;
render_center_index = 0;
}
while (render_center_index < render_center_length)
{
var pri:RenderableListItem = center[render_center_index];
if (pri.screenZ < limit)
break;
render_other(pri.screenZ, renderSessionData, graphics);
pri.render(renderSessionData, graphics);
renderSessionData.viewPort.lastRenderList.push(pri);
render_center_index++;
}
if (render_center_index == render_center_length)
center = null;
render_other(limit, renderSessionData, graphics);
}
}
}
(C) Æliens
04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.