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
|
<!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: CastleTriangulate</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">
<h1 class="unit">Unit CastleTriangulate</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Uses">Uses</a></td><td>Classes, Interfaces, Objects and Records</td><td><a class="section" href="#PasDoc-FuncsProcs">Functions and Procedures</a></td><td><a class="section" href="#PasDoc-Types">Types</a></td><td>Constants</td><td><a class="section" href="#PasDoc-Variables">Variables</a></td></tr></table>
<a name="PasDoc-Description"></a><h2 class="description">Description</h2>
<p>
Triangulating a polygon.</p>
<a name="PasDoc-Uses"></a><h2 class="uses">Uses</h2>
<ul class="useslist"><li>SysUtils</li><li><a href="CastleVectors.html">CastleVectors</a></li><li><a href="CastleUtils.html">CastleUtils</a></li><li><a href="CastleTriangles.html">CastleTriangles</a></li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-FuncsProcs"></a><h3 class="summary">Functions and Procedures</h3>
<table class="summary wide_list">
<tr class="list">
<td class="itemcode"><code>procedure <b><a href="CastleTriangulate.html#TriangulateFace">TriangulateFace</a></b>( FaceIndices: <a href="CastleUtils.html#PArray_LongInt">PArray_Longint</a>; Count: Integer; Vertices: <a href="CastleVectors.html#PVector3Single">PVector3Single</a>; VerticesCount: Integer; TriangulatorProc: <a href="CastleTriangulate.html#TTriangulatorProc">TTriangulatorProc</a>; AddToIndices: Longint); overload;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code>procedure <b><a href="CastleTriangulate.html#TriangulateFace">TriangulateFace</a></b>( FaceIndices: <a href="CastleUtils.html#PArray_LongInt">PArray_Longint</a>; Count: Integer; Vertices: <a href="CastleVectors.html#TGetVertexFromIndexFunc">TGetVertexFromIndexFunc</a>; TriangulatorProc: <a href="CastleTriangulate.html#TTriangulatorProc">TTriangulatorProc</a>; AddToIndices: Longint); overload;</code></td>
</tr>
<tr class="list">
<td class="itemcode"><code>procedure <b><a href="CastleTriangulate.html#TriangulateConvexFace">TriangulateConvexFace</a></b>(Count: Integer; TriangulatorProc: <a href="CastleTriangulate.html#TTriangulatorProc">TTriangulatorProc</a>; AddToIndices: Longint);</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code>function <b><a href="CastleTriangulate.html#IndexedPolygonNormal">IndexedPolygonNormal</a></b>( Indices: <a href="CastleUtils.html#PArray_LongInt">PArray_Longint</a>; IndicesCount: Integer; Vertices: <a href="CastleVectors.html#PVector3Single">PVector3Single</a>; const VerticesCount: Integer; const ResultForIncorrectPoly: <a href="CastleVectors.html#TVector3Single">TVector3Single</a>; const Convex: boolean): <a href="CastleVectors.html#TVector3Single">TVector3Single</a>;</code></td>
</tr>
</table>
<a name="PasDoc-Types"></a><h3 class="summary">Types</h3>
<table class="summary wide_list">
<tr class="list">
<td class="itemcode"><code><b><a href="CastleTriangulate.html#TTriangulatorProc">TTriangulatorProc</a></b> = procedure (const Tri: <a href="CastleVectors.html#TVector3Longint">TVector3Longint</a>) of object;</code></td>
</tr>
</table>
<a name="PasDoc-Variables"></a><h3 class="summary">Variables</h3>
<table class="summary wide_list">
<tr class="list">
<td class="itemcode"><code><b><a href="CastleTriangulate.html#LogTriangulation">LogTriangulation</a></b>: boolean;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Functions and Procedures</h3>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TriangulateFace"></a><code>procedure <b>TriangulateFace</b>( FaceIndices: <a href="CastleUtils.html#PArray_LongInt">PArray_Longint</a>; Count: Integer; Vertices: <a href="CastleVectors.html#PVector3Single">PVector3Single</a>; VerticesCount: Integer; TriangulatorProc: <a href="CastleTriangulate.html#TTriangulatorProc">TTriangulatorProc</a>; AddToIndices: Longint); overload;</code></td>
</tr>
<tr><td colspan="1">
<p>
Triangulate potentially non-convex face.
<p>FaceIndices[0]..FaceIndices[Count - 1] are indices to the Vertices array. They describe the outline of the polygon (face). You can pass FaceIndices = <code>Nil</code>, this is understood that indices are just 0..Count - 1 (in other words, it's equivalent to setting FaceIndices[0] = 0, FaceIndices[1] = 1 etc.).
<p>For each resulting triangle we will call TriangulatorProc with Tri (first param of TriangulatorProc) containing indices to FaceIndices[] array. We return indices to FaceIndices (not ready vectors from Vertices, not even indices to Vertices[] array) to allow the caller to obtain all information about the triangle. In the simple case, you can just use Vertices[FaceIndices[Tri[0..2]]] to obtain your triangle, in the more sophisticated cases you have other options to e.g. extract other vertex information from whatever data you have (see e.g. VRML/X3D IndexedFaceSet renderer).
<p>Generated triangles have the same orientation (normal from ccw etc.) as original polygon. This also means that if you're sure that your polygon is planar (and it should be — although we handle gracefully small deviations from planar, this procedure doesn't actually handle arbitrary (dis)located 3D data) then normal vector of all your triangles is the same.
<p>Note that you generally shouldn't use this procedure if you <i>know</i> that your polygon is convex. Then using this is a waste of time, after all convex polygons can be triangulated much easier. You can use <a class="normal" href="CastleTriangulate.html#TriangulateConvexFace">TriangulateConvexFace</a> in this case, which has deliberately very similar interface to this procedure.
<p>
<p>
<p>
<p></p>
<h6 class="description_section">Parameters</h6>
<dl class="parameters">
<dt>TriangulatorProcData</dt>
<dd>Is just passed unmodified to every TriangulatorProc call (as the second parameter). This is standard method to pass whatever data to your callback.</dd>
<dt>AddToIndices</dt>
<dd>Indexes returned in Tri[0..2] are all incremented by AddToIndices (which may also be negative), this is useful if your FaceIndices is actually a pointer to the middle of some larger indexes array. Just pass 0 if you don't want this.</dd>
</dl>
<h6 class="description_section">See also</h6>
<dl class="see_also">
<dt><a class="normal" href="CastleTriangulate.html#TriangulateConvexFace">TriangulateConvexFace</a></dt>
<dd>Triangulate convex polygon.</dd>
</dl>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TriangulateFace"></a><code>procedure <b>TriangulateFace</b>( FaceIndices: <a href="CastleUtils.html#PArray_LongInt">PArray_Longint</a>; Count: Integer; Vertices: <a href="CastleVectors.html#TGetVertexFromIndexFunc">TGetVertexFromIndexFunc</a>; TriangulatorProc: <a href="CastleTriangulate.html#TTriangulatorProc">TTriangulatorProc</a>; AddToIndices: Longint); overload;</code></td>
</tr>
<tr><td colspan="1">
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TriangulateConvexFace"></a><code>procedure <b>TriangulateConvexFace</b>(Count: Integer; TriangulatorProc: <a href="CastleTriangulate.html#TTriangulatorProc">TTriangulatorProc</a>; AddToIndices: Longint);</code></td>
</tr>
<tr><td colspan="1">
<p>
Triangulate convex polygon.
<p>This performs very easy triangulation. It has deliberately similar interface to <a class="normal" href="CastleTriangulate.html#TriangulateFace">TriangulateFace</a>, so it can be used as drop-in replacement for <a class="normal" href="CastleTriangulate.html#TriangulateFace">TriangulateFace</a>, when you know that your face is convex.
<p>Note that it doesn't even need to know FaceIndices or Vertices, it's enough to know Count.
<p>This also guarantees consequent triangles orientation, like <a class="normal" href="CastleTriangulate.html#TriangulateFace">TriangulateFace</a>.
<p></p>
<h6 class="description_section">See also</h6>
<dl class="see_also">
<dt><a class="normal" href="CastleTriangulate.html#TriangulateFace">TriangulateFace</a></dt>
<dd></dd>
</dl>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="IndexedPolygonNormal"></a><code>function <b>IndexedPolygonNormal</b>( Indices: <a href="CastleUtils.html#PArray_LongInt">PArray_Longint</a>; IndicesCount: Integer; Vertices: <a href="CastleVectors.html#PVector3Single">PVector3Single</a>; const VerticesCount: Integer; const ResultForIncorrectPoly: <a href="CastleVectors.html#TVector3Single">TVector3Single</a>; const Convex: boolean): <a href="CastleVectors.html#TVector3Single">TVector3Single</a>;</code></td>
</tr>
<tr><td colspan="1">
<p>
Calculate normal vector of possibly concave polygon.</p>
</td></tr>
</table>
<h3 class="detail">Types</h3>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TTriangulatorProc"></a><code><b>TTriangulatorProc</b> = procedure (const Tri: <a href="CastleVectors.html#TVector3Longint">TVector3Longint</a>) of object;</code></td>
</tr>
<tr><td colspan="1">
</td></tr>
</table>
<h3 class="detail">Variables</h3>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="LogTriangulation"></a><code><b>LogTriangulation</b>: boolean;</code></td>
</tr>
<tr><td colspan="1">
<p>
Write to Log a <i>lot</i> of comments how the triangulation goes. Useful for examples/visualize_triangulation/ .</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:12</em>
</span>
</td></tr></table></body></html>
|