1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>Castle Game Engine: CastleOctree: Class TOctree</title>
<meta name="generator" content="PasDoc 0.13.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>Castle Game Engine</h2><p><a href="introduction.html" class="navigation">Introduction</a></p><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<a name="TOctree"></a><h1 class="cio">Class TOctree</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td>Fields</td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td><a class="section" href="#PasDoc-Properties">Properties</a></td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="CastleOctree.html">CastleOctree</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TOctree = class(TObject)</code></p>
<h2 class="description">Description</h2>
<p>
Base abstract octree class. Holds some settings common for the whole octree (like <a class="normal" href="CastleOctree.TOctree.html#MaxDepth">MaxDepth</a>) and a reference to the root octree node (of <a class="normal" href="CastleOctree.TOctreeNode.html">TOctreeNode</a> class) in the protected property <a class="normal" href="CastleOctree.TOctree.html#InternalTreeRoot">InternalTreeRoot</a>.</p>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TObject</li>
<li class="thisitem">TOctree</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Methods"></a><h3 class="summary">Methods</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><code>function <b><a href="CastleOctree.TOctree.html#StatisticsBonus">StatisticsBonus</a></b>( const LeavesCount, ItemsCount, NonLeafNodesCount: Int64): string; virtual;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>constructor <b><a href="CastleOctree.TOctree.html#Create">Create</a></b>(AMaxDepth, ALeafCapacity: integer; const ARootBox: <a href="CastleBoxes.TBox3D.html">TBox3D</a>; AOctreeNodeFinalClass: <a href="CastleOctree.html#TOctreeNodeClass">TOctreeNodeClass</a>; AItemsInNonLeafNodes: boolean);</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>constructor <b><a href="CastleOctree.TOctree.html#Create">Create</a></b>(const Limits: <a href="CastleOctree.TOctreeLimits.html">TOctreeLimits</a>; const ARootBox: <a href="CastleBoxes.TBox3D.html">TBox3D</a>; AOctreeNodeFinalClass: <a href="CastleOctree.html#TOctreeNodeClass">TOctreeNodeClass</a>; AItemsInNonLeafNodes: boolean);</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>destructor <b><a href="CastleOctree.TOctree.html#Destroy">Destroy</a></b>; override;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="CastleOctree.TOctree.html#EnumerateCollidingOctreeItems">EnumerateCollidingOctreeItems</a></b>( const Frustum: <a href="CastleFrustum.TFrustum.html">TFrustum</a>; EnumerateOctreeItemsFunc: <a href="CastleOctree.html#TEnumerateOctreeItemsFunc">TEnumerateOctreeItemsFunc</a>);</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>function <b><a href="CastleOctree.TOctree.html#Statistics">Statistics</a></b>: string;</code></td>
</tr>
</table>
<a name="PasDoc-Properties"></a><h3 class="summary">Properties</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><code>property <b><a href="CastleOctree.TOctree.html#InternalTreeRoot">InternalTreeRoot</a></b>: <a href="CastleOctree.TOctreeNode.html">TOctreeNode</a> read FTreeRoot;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a href="CastleOctree.TOctree.html#MaxDepth">MaxDepth</a></b>: integer read FMaxDepth write FMaxDepth;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a href="CastleOctree.TOctree.html#LeafCapacity">LeafCapacity</a></b>: Integer
read FLeafCapacity write FLeafCapacity;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a href="CastleOctree.TOctree.html#ItemsInNonLeafNodes">ItemsInNonLeafNodes</a></b>: boolean
read FItemsInNonLeafNodes;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a href="CastleOctree.TOctree.html#OctreeNodeFinalClass">OctreeNodeFinalClass</a></b>: <a href="CastleOctree.html#TOctreeNodeClass">TOctreeNodeClass</a>
read FOctreeNodeFinalClass;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Methods</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><a name="StatisticsBonus"></a><code>function <b>StatisticsBonus</b>( const LeavesCount, ItemsCount, NonLeafNodesCount: Int64): string; virtual;</code></td>
</tr>
<tr><td colspan="2">
<p>
This will be appended to output of <a class="normal" href="CastleOctree.TOctree.html#Statistics">Statistics</a>. In this class this returns ''. You can override this if you want, and you can use there LeavesCount, ItemsCount, NonLeafNodesCount counts (they are already calculated for the sake of Statistics anyway).
<p>Every line, including the last one, must be terminated by <a class="normal" href="CastleUtils.html#NL">nl</a>.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Create"></a><code>constructor <b>Create</b>(AMaxDepth, ALeafCapacity: integer; const ARootBox: <a href="CastleBoxes.TBox3D.html">TBox3D</a>; AOctreeNodeFinalClass: <a href="CastleOctree.html#TOctreeNodeClass">TOctreeNodeClass</a>; AItemsInNonLeafNodes: boolean);</code></td>
</tr>
<tr><td colspan="2">
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Create"></a><code>constructor <b>Create</b>(const Limits: <a href="CastleOctree.TOctreeLimits.html">TOctreeLimits</a>; const ARootBox: <a href="CastleBoxes.TBox3D.html">TBox3D</a>; AOctreeNodeFinalClass: <a href="CastleOctree.html#TOctreeNodeClass">TOctreeNodeClass</a>; AItemsInNonLeafNodes: boolean);</code></td>
</tr>
<tr><td colspan="2">
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Destroy"></a><code>destructor <b>Destroy</b>; override;</code></td>
</tr>
<tr><td colspan="2">
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="EnumerateCollidingOctreeItems"></a><code>procedure <b>EnumerateCollidingOctreeItems</b>( const Frustum: <a href="CastleFrustum.TFrustum.html">TFrustum</a>; EnumerateOctreeItemsFunc: <a href="CastleOctree.html#TEnumerateOctreeItemsFunc">TEnumerateOctreeItemsFunc</a>);</code></td>
</tr>
<tr><td colspan="2">
<p>
Traverse octree seeking for nodes that (possibly) collide with given Frustum. For every such item calls given EnumerateOctreeItemsFunc.
<p>Requires that ParentTree.ItemsInNonLeafNodes = true (checked by assertion here, so only if you have assertions on). May be implemented one day to work with ParentTree.ItemsInNonLeafNodes = false too, but it will be (usually) much slower on such tree.
<p>It gives to EnumerateOctreeItemsFunc an ItemIndex, an index to octrees items. This is just taken from ItemIndices array. May call EnumerateOctreeItemsFunc with the same ItemIndex multiple times.
<p>It also gives to EnumerateOctreeItemsFunc parameter CollidesForSure:
<p></p>
<ul class="paragraph_spacing">
<li><p>If CollidesForSure = true then octree node that had this item was found to be entirely in the frustum. This means that (assuming that octree item that is in some octree node always collides with Box of this node, and it should always be true) given octree item for sure collides with frustum.</p></li>
<li><p>If CollidesForSure = false then given octree item was found inside some octree leaf that may only partially (or not at all) collide with frustum. And this function doesn't check whether your <i>octree item</i> possibly collides with Frustum (since in this generic octree unit, <a class="normal" href="CastleOctree.html">CastleOctree</a>, we have no knowledge about geometry of your octree items). So you may want to check inside EnumerateOctreeItemsFunc handler your octree items versus Frustum, if you want to have greatest possibility of eliminating octree items that are not within your frustum (but beware that too many checks for visibility can also cost you too much time...).
<p>That why CollidesForSure may be useful: if it's true then you already know for sure that frustum collides with this octree item, so you don't have to waste your time on additional checks.</p></li>
</ul>
<p>
<p><i>Notes for implementing descendants of this class:</i> This method simply calls TreeRoot.EnumerateCollidingOctreeItems.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Statistics"></a><code>function <b>Statistics</b>: string;</code></td>
</tr>
<tr><td colspan="2">
<p>
Multi-line description of how the octree levels look like. Describes how many leaves / non-leaves we have, how many items in leaves we have and on each level and in summary.
<p>Every line, including the last one, is terminated by newline.
<p><i>Notes for implementing descendants of this class:</i> You can override <a class="normal" href="CastleOctree.TOctree.html#StatisticsBonus">StatisticsBonus</a>, it's appended to the result of this method.</p>
</td></tr>
</table>
<h3 class="detail">Properties</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><a name="InternalTreeRoot"></a><code>property <b>InternalTreeRoot</b>: <a href="CastleOctree.TOctreeNode.html">TOctreeNode</a> read FTreeRoot;</code></td>
</tr>
<tr><td colspan="2">
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="MaxDepth"></a><code>property <b>MaxDepth</b>: integer read FMaxDepth write FMaxDepth;</code></td>
</tr>
<tr><td colspan="2">
<p>
Maximum tree depth.
<p>Set this to zero to force RootNode to be a leaf (useful to test whether octree vs a flat list is actually useful).
<p>Currently, you should not change <code>MaxDepth</code> and <a class="normal" href="CastleOctree.TOctree.html#LeafCapacity">LeafCapacity</a> after creating the octree, as they will not rebuild the octree to obey the given limits.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="LeafCapacity"></a><code>property <b>LeafCapacity</b>: Integer
read FLeafCapacity write FLeafCapacity;</code></td>
</tr>
<tr><td colspan="2">
<p>
Maximum number of items inside a leaf, unless this leaf is already at maximum depth (<a class="normal" href="CastleOctree.TOctree.html#MaxDepth">MaxDepth</a>). When you add an item to a leaf, to keep <code>LeafCapacity</code> correct. Must be >= 1.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="ItemsInNonLeafNodes"></a><code>property <b>ItemsInNonLeafNodes</b>: boolean
read FItemsInNonLeafNodes;</code></td>
</tr>
<tr><td colspan="2">
<p>
Does this octree keep items also in internal nodes. Leaf nodes always store items (have ItemIndices).
<p>If you set this property to <code>True</code> when constructing this object then all created <a class="normal" href="CastleOctree.TOctreeNode.html">TOctreeNode</a> will have ItemIndices property that keeps the items inside.
<p>Advantages: e.g. consider frustum culling using octree. In some situations you know that some OctreeNode is completely inside frustum. Then you want to mark all items inside this OctreeNode as "visible". If you would have to traverse all children of this OctreeNode, you could have horribly slow algorithm (especially since one item is often stored in many leafs, since it collides with many leafs BoundingBoxes). So you can set <code>ItemsInNonLeafNodes</code> and simply use ItemIndices list of your OctreeNode. And you don't have to traverse children of this OctreeNode.
<p>Disadvantages: if you have many items in your octree (as is typical with e.g. <a class="normal" href="CastleTriangleOctree.TTriangleOctree.html">TTriangleOctree</a>) then this property can cost you a <i>lot</i> of memory.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="OctreeNodeFinalClass"></a><code>property <b>OctreeNodeFinalClass</b>: <a href="CastleOctree.html#TOctreeNodeClass">TOctreeNodeClass</a>
read FOctreeNodeFinalClass;</code></td>
</tr>
<tr><td colspan="2">
<p>
The actual (non-abstact) <a class="normal" href="CastleOctree.TOctreeNode.html">TOctreeNode</a> descendant class for this octree. Set when constructing this octree.
<p>This tells what class should have FTreeRoot. Since inside <a class="normal" href="CastleOctree.TOctreeNode.html">TOctreeNode</a>, each children node (in TreeSubNodes) always has the same class as it's parent, so class <code>OctreeNodeFinalClass</code> determines the <a class="normal" href="CastleOctree.TOctreeNode.html">TOctreeNode</a> descendant that will be used to construct your whole octree.</p>
</td></tr>
</table>
<!-- Piwik -->
<script type="text/javascript">
var _paq = _paq || [];
_paq.push(["trackPageView"]);
_paq.push(["enableLinkTracking"]);
(function() {
var u=(("https:" == document.location.protocol) ? "https" : "http") + "://michalis.ii.uni.wroc.pl/piwik-castle-engine/";
_paq.push(["setTrackerUrl", u+"piwik.php"]);
_paq.push(["setSiteId", "1"]);
var d=document, g=d.createElement("script"), s=d.getElementsByTagName("script")[0]; g.type="text/javascript";
g.defer=true; g.async=true; g.src=u+"piwik.js"; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Piwik Code -->
<noscript>
<!-- Piwik Image Tracker -->
<img src="http://michalis.ii.uni.wroc.pl/piwik-castle-engine/piwik.php?idsite=1&rec=1" style="border:0" alt="" />
<!-- End Piwik -->
</noscript>
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.13.0</a> on 2015-06-15 04:43:10</em>
</span>
</td></tr></table></body></html>
|