File: CastleOctree.TOctree.html

package info (click to toggle)
castle-game-engine 5.2.0-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 185,428 kB
  • sloc: pascal: 260,781; cpp: 1,363; objc: 713; makefile: 537; xml: 496; sh: 480; php: 4
file content (249 lines) | stat: -rw-r--r-- 17,424 bytes parent folder | download
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">
&nbsp;</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">
&nbsp;</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">
&nbsp;</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">
&nbsp;</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 &gt;= 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 &quot;visible&quot;. 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&amp;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>