index 852ae85907aef43276c003fe6b74bfbb9aa20ab7..4f3e9938c0fe9c5f5acb617621a6242e890a5983 100644 (file)
--- a/src/game/z_aabbtree.pas
+++ b/src/game/z_aabbtree.pas
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*)
{$INCLUDE ../shared/a_modes.inc}
-{$DEFINE aabbtree_many_asserts}
-{$DEFINE aabbtree_query_count}
+{.$DEFINE aabbtree_many_asserts}
+{.$DEFINE aabbtree_query_count}
unit z_aabbtree;
interface
public
{$IFDEF aabbtree_query_count}
- nodesVisited, nodesDeepVisited: Integer;
+ mNodesVisited, mNodesDeepVisited: Integer;
{$ENDIF}
public
property extraGap: Float read mExtraGap write mExtraGap;
property nodeCount: Integer read mNodeCount;
property nodeAlloced: Integer read mAllocCount;
+ {$IFDEF aabbtree_query_count}
+ property nodesVisited: Integer read mNodesVisited;
+ property nodesDeepVisited: Integer read mNodesDeepVisited;
+ {$ELSE}
+ const nodesVisited = 0;
+ const nodesDeepVisited = 0;
+ {$ENDIF}
end;
bigstack: array of Integer = nil;
sp: Integer = 0;
- procedure spush (id: Integer);
+ procedure spush (id: Integer); inline;
var
xsp: Integer;
begin
end;
end;
- function spop (): Integer;
+ (*
+ function spop (): Integer; inline;
begin
- assert(sp > 0);
+ {$IFDEF aabbtree_many_asserts}assert(sp > 0);{$ENDIF}
if (sp <= length(stack)) then
begin
// use "small stack"
result := bigstack[sp-length(stack)];
end;
end;
+ *)
var
nodeId: Integer;
//if not assigned(visitor) then begin result := -1; exit; end;
try
{$IFDEF aabbtree_query_count}
- nodesVisited := 0;
- nodesDeepVisited := 0;
+ mNodesVisited := 0;
+ mNodesDeepVisited := 0;
{$ENDIF}
// start from root node
while (sp > 0) do
begin
// get the next node id to visit
- nodeId := spop();
+ //nodeId := spop();
+ {$IFDEF aabbtree_many_asserts}assert(sp > 0);{$ENDIF}
+ if (sp <= length(stack)) then
+ begin
+ // use "small stack"
+ Dec(sp);
+ nodeId := stack[sp];
+ end
+ else
+ begin
+ // use "big stack"
+ Dec(sp);
+ nodeId := bigstack[sp-length(stack)];
+ end;
+
// skip it if it is a nil node
if (nodeId = TTreeNode.NullTreeNode) then continue;
- {$IFDEF aabbtree_query_count}Inc(nodesVisited);{$ENDIF}
+ {$IFDEF aabbtree_query_count}Inc(mNodesVisited);{$ENDIF}
// get the corresponding node
node := @mNodes[nodeId];
// should we investigate this node?
if (node.leaf) then
begin
// call visitor on it
- {$IFDEF aabbtree_query_count}Inc(nodesDeepVisited);{$ENDIF}
+ {$IFDEF aabbtree_query_count}Inc(mNodesDeepVisited);{$ENDIF}
if assigned(visitor) then
begin
if (visitor(node.flesh)) then begin result := nodeId; exit; end;