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 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
|
<!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: CastleFrustum: Object TFrustum</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="TFrustum"></a><h1 class="cio">Object TFrustum</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><a class="section" href="#PasDoc-Fields">Fields</a></td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td>Properties</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="CastleFrustum.html">CastleFrustum</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TFrustum = object(TObject)</code></p>
<h2 class="description">Description</h2>
<p>
Viewing frustum, defined as 6 plane equations. Calculating and operating on such frustum. Frustums with far plane in infinity (typically used in conjunction with shadow volumes) are fully supported by all methods (we just have 5 frustum planes then).
<p>We define this using ObjectPascal old-style "object", to have comfort and low-overhead at the same time.</p>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TObject</li>
<li class="thisitem">TFrustum</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Fields"></a><h3 class="summary">Fields</h3>
<table class="summary 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"><code><b><a href="CastleFrustum.TFrustum.html#Planes">Planes</a></b>: array [<a href="CastleFrustum.html#TFrustumPlane">TFrustumPlane</a>] of <a href="CastleVectors.html#TVector4Single">TVector4Single</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><b><a href="CastleFrustum.TFrustum.html#ZFarInfinity">ZFarInfinity</a></b>: boolean;</code></td>
</tr>
</table>
<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="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>constructor <b><a href="CastleFrustum.TFrustum.html#Init">Init</a></b>(const Matrix: <a href="CastleVectors.html#TMatrix4Single">TMatrix4Single</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>constructor <b><a href="CastleFrustum.TFrustum.html#Init">Init</a></b>(const ProjectionMatrix, ModelviewMatrix: <a href="CastleVectors.html#TMatrix4Single">TMatrix4Single</a>);</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="CastleFrustum.TFrustum.html#CalculatePoints">CalculatePoints</a></b>(out FrustumPoints: <a href="CastleFrustum.html#TFrustumPointsSingle">TFrustumPointsSingle</a>); overload;</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>procedure <b><a href="CastleFrustum.TFrustum.html#CalculatePoints">CalculatePoints</a></b>(out FrustumPoints: <a href="CastleFrustum.html#TFrustumPointsDouble">TFrustumPointsDouble</a>); overload;</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>function <b><a href="CastleFrustum.TFrustum.html#SphereCollisionPossible">SphereCollisionPossible</a></b>( const SphereCenter: <a href="CastleVectors.html#TVector3Single">TVector3Single</a>; const SphereRadiusSqr: Single): <a href="CastleFrustum.html#TFrustumCollisionPossible">TFrustumCollisionPossible</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="CastleFrustum.TFrustum.html#SphereCollisionPossibleSimple">SphereCollisionPossibleSimple</a></b>( const SphereCenter: <a href="CastleVectors.html#TVector3Single">TVector3Single</a>; const SphereRadiusSqr: Single): 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>function <b><a href="CastleFrustum.TFrustum.html#Box3DCollisionPossible">Box3DCollisionPossible</a></b>( const Box: <a href="CastleBoxes.TBox3D.html">TBox3D</a>): <a href="CastleFrustum.html#TFrustumCollisionPossible">TFrustumCollisionPossible</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="CastleFrustum.TFrustum.html#Box3DCollisionPossibleSimple">Box3DCollisionPossibleSimple</a></b>( const Box: <a href="CastleBoxes.TBox3D.html">TBox3D</a>): 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>function <b><a href="CastleFrustum.TFrustum.html#Move">Move</a></b>(const M: <a href="CastleVectors.html#TVector3Single">TVector3Single</a>): <a href="CastleFrustum.TFrustum.html">TFrustum</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>procedure <b><a href="CastleFrustum.TFrustum.html#MoveTo1st">MoveTo1st</a></b>(const M: <a href="CastleVectors.html#TVector3Single">TVector3Single</a>);</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>function <b><a href="CastleFrustum.TFrustum.html#DirectionInside">DirectionInside</a></b>(const Direction: <a href="CastleVectors.html#TVector3Single">TVector3Single</a>): 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>function <b><a href="CastleFrustum.TFrustum.html#Transform">Transform</a></b>(const M: <a href="CastleVectors.html#TMatrix4Single">TMatrix4Single</a>): <a href="CastleFrustum.TFrustum.html">TFrustum</a>;</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>function <b><a href="CastleFrustum.TFrustum.html#ToNiceStr">ToNiceStr</a></b>(const Indent: string): string;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Fields</h3>
<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="Planes"></a><code><b>Planes</b>: array [<a href="CastleFrustum.html#TFrustumPlane">TFrustumPlane</a>] of <a href="CastleVectors.html#TVector4Single">TVector4Single</a>;</code></td>
</tr>
<tr><td colspan="2">
<p>
Six planes defining the frustum. Direction vectors of these planes must point to the inside of the frustum. Currently, they are always normalized.
<p>Note that if projection has far plane in infinity (indicated by <a class="normal" href="CastleFrustum.TFrustum.html#ZFarInfinity">ZFarInfinity</a>) then the far plane will be invalid — first three values of it's equation will be 0.</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="ZFarInfinity"></a><code><b>ZFarInfinity</b>: boolean;</code></td>
</tr>
<tr><td colspan="2">
</td></tr>
</table>
<h3 class="detail">Methods</h3>
<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="Init"></a><code>constructor <b>Init</b>(const Matrix: <a href="CastleVectors.html#TMatrix4Single">TMatrix4Single</a>);</code></td>
</tr>
<tr><td colspan="2">
<p>
Calculate frustum, knowing the combined matrix (modelview * projection).</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="Init"></a><code>constructor <b>Init</b>(const ProjectionMatrix, ModelviewMatrix: <a href="CastleVectors.html#TMatrix4Single">TMatrix4Single</a>);</code></td>
</tr>
<tr><td colspan="2">
<p>
Calculate frustum, knowing projection and modelview matrices. This is equivalent to 1-parameter Init with Matrix = ModelviewMatrix * <a class="normal" href="CastleGLUtils.html#ProjectionMatrix">ProjectionMatrix</a>. This way you can get from OpenGL your two matrices (modelview and projection) (or you can calculate them using routines in this unit like <a class="normal" href="CastleVectors.html#FrustumProjMatrix">FrustumProjMatrix</a>), then pass them to this routine and you get your current viewing frustum.</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="CalculatePoints"></a><code>procedure <b>CalculatePoints</b>(out FrustumPoints: <a href="CastleFrustum.html#TFrustumPointsSingle">TFrustumPointsSingle</a>); overload;</code></td>
</tr>
<tr><td colspan="2">
<p>
Calculate 8 points of frustum. These points are simply calculated doing <a class="normal" href="CastleVectors.html#ThreePlanesIntersectionPoint">ThreePlanesIntersectionPoint</a> on appropriate planes.
<p>Using these points you can easily draw given frustum on screen. Use <a class="normal" href="CastleFrustum.html#FrustumPointsQuadsIndexes">FrustumPointsQuadsIndexes</a> to obtain indexes to FrustumPoints. E.g. using OpenGL use code like this:
<p></p>
<pre class="longcode">
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(<span class="pascal_numeric">4</span>, GL_FLOAT / GL_DOUBLE, <span class="pascal_numeric">0</span>, @FrustumPoints);
glDrawElements(GL_QUADS,
SizeOf(FrustumPointsQuadsIndexes) <span class="pascal_keyword">div</span> SizeOf(LongWord),
GL_UNSIGNED_INT, @FrustumPointsQuadsIndexes);
<span class="pascal_comment">// or</span>
glDrawElements(GL_LINES,
SizeOf(FrustumPointsLinesIndexes) <span class="pascal_keyword">div</span> SizeOf(LongWord),
GL_UNSIGNED_INT, @FrustumPointsLinesIndexes);
glDisableClientState(GL_VERTEX_ARRAY);
</pre>
<p>
<p>This example rendering code will even work Ok with far plane in infinity. Then the 4 points of the far plane will be "in infinity", that is will have 4th component set to zero. Or, equivalently, they will be directions. Homogeneous coordinates allow us for this, and in fact you can just render such points without any problems in OpenGL.
<p>For good precision, always use <a class="normal" href="CastleFrustum.html#TFrustumPointsDouble">TFrustumPointsDouble</a>. Tests show that, while storing the plane equations with Single precision is sufficient, calculating FrustumPoints using Single precision is *not* sufficient.
<p>(Testcase that the Double precision is needed: run <code>view3dscene demo_models/vrml_2/cones.wrl</code>. Jump to viewpoint named "Frustum needs double-precision". Turn "Show viewing frustum" on. When view3dscene.lpr uses Single precision with <a class="normal" href="CastleFrustum.TFrustum.html#CalculatePoints">CalculatePoints</a> (use <a class="normal" href="CastleFrustum.html#TFrustumPointsSingle">TFrustumPointsSingle</a>, and GL_FLOAT at glVertexPointer) the result is incorrect, near and far quads are visibly asymetrical.)
<p>
<p></p>
<h6 class="description_section">Exceptions raised</h6>
<dl class="exceptions_raised">
<dt><a class="normal" href="CastleVectors.EPlanesParallel.html">EPlanesParallel</a></dt>
<dd>If Frustum doesn't have planes of any valid frustum.</dd>
</dl>
</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="CalculatePoints"></a><code>procedure <b>CalculatePoints</b>(out FrustumPoints: <a href="CastleFrustum.html#TFrustumPointsDouble">TFrustumPointsDouble</a>); overload;</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="SphereCollisionPossible"></a><code>function <b>SphereCollisionPossible</b>( const SphereCenter: <a href="CastleVectors.html#TVector3Single">TVector3Single</a>; const SphereRadiusSqr: Single): <a href="CastleFrustum.html#TFrustumCollisionPossible">TFrustumCollisionPossible</a>;</code></td>
</tr>
<tr><td colspan="2">
<p>
Checks for collision between frustum and sphere.
<p>Check is done fast, but is not accurate, that's why this function's name contains "CollisionPossible". It returns:
<p>fcNoCollision when it's sure that there no collision,
<p>fcSomeCollisionPossible when some collision is possible, but nothing is sure. There *probably* is some collision, but it's not difficult to find some special situations where there is no collision but this function answers fcSomeCollisionPossible. There actually may be either no collision, or only part of sphere may be inside frustum.
<p>Note that it's guaranteed that if the whole sphere (or the whole box in case of <a class="normal" href="CastleFrustum.TFrustum.html#Box3DCollisionPossible">Box3DCollisionPossible</a>) is inside the frustum that fcInsideFrustum will be returned, not fcSomeCollisionPossible.
<p>fcInsideFrustum if sphere is for sure inside the frustum.
<p>So this function usually cannot be used for some precise collision detection, but it can be used for e.g. optimizing your graphic engine by doing frustum culling. Note that fcInsideFrustum result is often useful when you're comparing your frustum with bounding volume of some tree (e.g. octree) node: fcInsideFrustum tells you that not only this node collides with frustum, but also all it's children nodes collide for sure with frustum. This allows you to save some time instead of doing useless recursion down the tree.
<p>Many useful optimization ideas used in implementing this function were found at [<a href="http://www.flipcode.com/articles/article_frustumculling.shtml">http://www.flipcode.com/articles/article_frustumculling.shtml</a>].
<p></p>
<h6 class="description_section">See also</h6>
<dl class="see_also">
<dt><a class="normal" href="CastleFrustum.TFrustum.html#Box3DCollisionPossible">TFrustum.Box3DCollisionPossible</a></dt>
<dd>Checks for collision between frustum and box.</dd>
</dl>
</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="SphereCollisionPossibleSimple"></a><code>function <b>SphereCollisionPossibleSimple</b>( const SphereCenter: <a href="CastleVectors.html#TVector3Single">TVector3Single</a>; const SphereRadiusSqr: Single): boolean;</code></td>
</tr>
<tr><td colspan="2">
<p>
Checks for collision between frustum and sphere, faster. Like <a class="normal" href="CastleFrustum.TFrustum.html#SphereCollisionPossible">TFrustum.SphereCollisionPossible</a>, but this only returns true (when <a class="normal" href="CastleFrustum.TFrustum.html#SphereCollisionPossible">TFrustum.SphereCollisionPossible</a> would return fcSomeCollisionPossible or fcInsideFrustum) or false (when <a class="normal" href="CastleFrustum.TFrustum.html#SphereCollisionPossible">TFrustum.SphereCollisionPossible</a> would return fcNoCollision).
<p>Consequently, it runs (very slightly) faster. Use this if you don't need to differentiate between fcSomeCollisionPossible or fcInsideFrustum cases.</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="Box3DCollisionPossible"></a><code>function <b>Box3DCollisionPossible</b>( const Box: <a href="CastleBoxes.TBox3D.html">TBox3D</a>): <a href="CastleFrustum.html#TFrustumCollisionPossible">TFrustumCollisionPossible</a>;</code></td>
</tr>
<tr><td colspan="2">
<p>
Checks for collision between frustum and box. Meaning of return value like <a class="normal" href="CastleFrustum.TFrustum.html#SphereCollisionPossible">SphereCollisionPossible</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="Box3DCollisionPossibleSimple"></a><code>function <b>Box3DCollisionPossibleSimple</b>( const Box: <a href="CastleBoxes.TBox3D.html">TBox3D</a>): boolean;</code></td>
</tr>
<tr><td colspan="2">
<p>
Checks for collision between frustum and box, faster. Meaning of return value like <a class="normal" href="CastleFrustum.TFrustum.html#SphereCollisionPossibleSimple">SphereCollisionPossibleSimple</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="Move"></a><code>function <b>Move</b>(const M: <a href="CastleVectors.html#TVector3Single">TVector3Single</a>): <a href="CastleFrustum.TFrustum.html">TFrustum</a>;</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="MoveTo1st"></a><code>procedure <b>MoveTo1st</b>(const M: <a href="CastleVectors.html#TVector3Single">TVector3Single</a>);</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="DirectionInside"></a><code>function <b>DirectionInside</b>(const Direction: <a href="CastleVectors.html#TVector3Single">TVector3Single</a>): boolean;</code></td>
</tr>
<tr><td colspan="2">
<p>
Is Direction within a frustum. You can think of direction it as a "point infinitely away in given Direction", like the direction to the sun. Note that this ignores near/far planes of the frustum, only checking the 4 side planes.</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="Transform"></a><code>function <b>Transform</b>(const M: <a href="CastleVectors.html#TMatrix4Single">TMatrix4Single</a>): <a href="CastleFrustum.TFrustum.html">TFrustum</a>;</code></td>
</tr>
<tr><td colspan="2">
<p>
Transform frustum by a matrix.
<p>
<p></p>
<h6 class="description_section">Parameters</h6>
<dl class="parameters">
<dt>M</dt>
<dd>Transformation matrix. This matrix must be "sane": it must transform homogeneous positions into homogeneous positions, and homogeneous directions into homogeneous directions. Also, it must not invert or do other weird stuff (like shear) with directions. To be safe just make sure it's a matrix composed only from translations, rotations, and scale (with all scale parameters being > 0).</dd>
</dl>
<h6 class="description_section">Exceptions raised</h6>
<dl class="exceptions_raised">
<dt><a class="normal" href="CastleVectors.ETransformedResultInvalid.html">ETransformedResultInvalid</a></dt>
<dd>In some cases when matrix is not sane.</dd>
</dl>
</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="ToNiceStr"></a><code>function <b>ToNiceStr</b>(const Indent: string): string;</code></td>
</tr>
<tr><td colspan="2">
</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:09</em>
</span>
</td></tr></table></body></html>
|