diff options
author | neodarz <neodarz@neodarz.net> | 2018-08-11 20:21:34 +0200 |
---|---|---|
committer | neodarz <neodarz@neodarz.net> | 2018-08-11 20:21:34 +0200 |
commit | 0ea5fc66924303d1bf73ba283a383e2aadee02f2 (patch) | |
tree | 2568e71a7ccc44ec23b8bb3f0ff97fb6bf2ed709 /docs/doxygen/nel/local__retriever_8cpp-source.html | |
download | nevrax-website-self-hostable-0ea5fc66924303d1bf73ba283a383e2aadee02f2.tar.xz nevrax-website-self-hostable-0ea5fc66924303d1bf73ba283a383e2aadee02f2.zip |
Initial commit
Diffstat (limited to '')
-rw-r--r-- | docs/doxygen/nel/local__retriever_8cpp-source.html | 1704 |
1 files changed, 1704 insertions, 0 deletions
diff --git a/docs/doxygen/nel/local__retriever_8cpp-source.html b/docs/doxygen/nel/local__retriever_8cpp-source.html new file mode 100644 index 00000000..eb2cb470 --- /dev/null +++ b/docs/doxygen/nel/local__retriever_8cpp-source.html @@ -0,0 +1,1704 @@ +<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> +<HTML> +<HEAD> + <TITLE>nevrax.org : docs</TITLE> + <LINK REL=stylesheet TYPE="text/css" HREF="http://www.nevrax.org/inc/css/nevrax.css"> + <link href="doxygen.css" rel="stylesheet" type="text/css"> +</HEAD> +<BODY MARGINHEIGHT="0" MARGINWIDTH="0"> + +<!-- uplinks --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0> + <TR> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD WIDTH=140 BGCOLOR=#dddddd><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.org><b>Home</B></FONT></A> </TD> + <TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.com><b>nevrax.com</B></FONT></A> </TD> + </TR> +</TABLE> + +<!-- banner Nevrax --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%> + <TR><TD BGCOLOR="#000000" BACKGROUND="http://www.nevrax.org/inc/img/black_banner.jpg"><A HREF="http://www.nevrax.org"><IMG SRC="http://www.nevrax.org/inc/img/nevrax.gif" WIDTH="170" HEIGHT="45" BORDER=0 ALT="Nevrax" ></A></TD></TR> +</TABLE> + +<!-- main table --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 height=100%> + <TR> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="10" BORDER=0 ALT=""></TD> + <TD WIDTH=140 BGCOLOR=#dddddd VALIGN=TOP ALIGN=middle><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> + + <!------ Begin Box ------> + <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=black><TR><TD><TABLE border=0 cellspacing=2 cellpadding=0 width=120><tr><TD ALIGN=middle bgcolor=black> + <FONT COLOR=white FACE="sans-serif"><B>Nevrax.org</B></FONT></TD></TR><tr><td colspan=2 bgcolor=#FFFFFF> + <TABLE cellspacing=0 cellpadding=1 border=0> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/news/" TITLE="Rubrique news"><img width=13 height=15 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-news.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/news/" TITLE="News">News</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Rubrique mail"><img width=15 height=11 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-mail.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Mailing list archive">Mailing-list</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Rubrique docs"><img width=14 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-docs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Documentation">Documentation</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="Rubrique cvs"><img width=13 height=17 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-cvs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="CVS Web">CVS</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Rubrique bugs"><img width=20 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-bugs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Bugtracking">Bugs</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="Rubrique license"><img width=18 height=12 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-gpl.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="License">License</a></td></tr> + </TABLE> + </TD></TR></TABLE></TD></TR></TABLE> + <!------ End Box ------> + + </TD> + <TD WIDTH=15><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD ALIGN=left valign=top><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> + +<!-- title --> +<TABLE background="http://www.nevrax.org/inc/img/redline.gif" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td> +<A HREF="http://www.nevrax.org/docs/"><img src="http://www.nevrax.org/inc/img/t_docs.gif" ALT="Docs" HEIGHT=20 BORDER=0></A> +</td><td><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="1" HEIGHT="1" BORDER=0 ALT=""> +</td></tr></table> + + +<!-- block --> +<TABLE bgcolor="#dddddd" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td width=1% valign=middle><img width=6 height=14 hspace=2 vspace=2 src="http://www.nevrax.org/inc/img/reddots.gif"></TD> + <TD><B>Documentation</B></TD> + <TD ALIGN=RIGHT> </td> +</tr></table> +<!-- Generated by Doxygen 1.2.14 --> +<center> +<a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="namespacemembers.html">Namespace Members</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> <a class="qindex" href="pages.html">Related Pages</a> <a class="qindexRef" doxygen="_cgi:http://www.nevrax.org/cgi-bin/nel-search.cgi" href="http://www.nevrax.org/cgi-bin/nel-search.cgi">Search</a> </center> +<hr><h1>local_retriever.cpp</h1><a href="local__retriever_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 +00007 <font class="comment">/* Copyright, 2001 Nevrax Ltd.</font> +00008 <font class="comment"> *</font> +00009 <font class="comment"> * This file is part of NEVRAX NEL.</font> +00010 <font class="comment"> * NEVRAX NEL is free software; you can redistribute it and/or modify</font> +00011 <font class="comment"> * it under the terms of the GNU General Public License as published by</font> +00012 <font class="comment"> * the Free Software Foundation; either version 2, or (at your option)</font> +00013 <font class="comment"> * any later version.</font> +00014 <font class="comment"></font> +00015 <font class="comment"> * NEVRAX NEL is distributed in the hope that it will be useful, but</font> +00016 <font class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</font> +00017 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</font> +00018 <font class="comment"> * General Public License for more details.</font> +00019 <font class="comment"></font> +00020 <font class="comment"> * You should have received a copy of the GNU General Public License</font> +00021 <font class="comment"> * along with NEVRAX NEL; see the file COPYING. If not, write to the</font> +00022 <font class="comment"> * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,</font> +00023 <font class="comment"> * MA 02111-1307, USA.</font> +00024 <font class="comment"> */</font> +00025 +00026 <font class="preprocessor">#include "<a class="code" href="stdpacs_8h.html">stdpacs.h</a>"</font> +00027 +00028 <font class="preprocessor">#include "<a class="code" href="plane_8h.html">nel/misc/plane.h</a>"</font> +00029 +00030 <font class="preprocessor">#include "<a class="code" href="local__retriever_8h.html">pacs/local_retriever.h</a>"</font> +00031 <font class="preprocessor">#include "<a class="code" href="collision__desc_8h.html">pacs/collision_desc.h</a>"</font> +00032 <font class="preprocessor">#include "<a class="code" href="retriever__instance_8h.html">pacs/retriever_instance.h</a>"</font> +00033 +00034 <font class="preprocessor">#include "<a class="code" href="hierarchical__timer_8h.html">nel/misc/hierarchical_timer.h</a>"</font> +00035 +00036 <font class="keyword">using</font> <font class="keyword">namespace </font>std; +00037 <font class="keyword">using</font> <font class="keyword">namespace </font>NLMISC; +00038 +<a name="l00040"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#q0">00040</a> <font class="keyword">const</font> <font class="keywordtype">float</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#q0">NLPACS::CLocalRetriever::_TipThreshold</a> = 0.1f; +<a name="l00041"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#q1">00041</a> <font class="keyword">const</font> <font class="keywordtype">float</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#q1">NLPACS::CLocalRetriever::_EdgeTipThreshold</a> = 0.1f; +00042 +<a name="l00044"></a><a class="code" href="local__retriever_8cpp.html#a0">00044</a> <font class="keyword">const</font> <font class="keywordtype">float</font> <a class="code" href="local__retriever_8cpp.html#a0">InsurePositionThreshold</a> = 2.0e-2f; +00045 +00046 <font class="comment">//static float hybrid2dNorm(const CVector &v)</font> +00047 <font class="comment">//{</font> +00048 <font class="comment">// return (float)(sqrt(sqr(v.x)+sqr(v.y))+fabs(v.z)*0.1);</font> +00049 <font class="comment">//}</font> +00050 +00051 +00052 +00053 +00054 +<a name="l00055"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z943_0">00055</a> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z943_0">NLPACS::CLocalRetriever::CLocalRetriever</a>() +00056 { +00057 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n9">_Type</a> = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#s2s0">Landscape</a>; +00058 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_3">_FaceGrid</a>.clear(); +00059 } +00060 +00061 +00062 +<a name="l00063"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a6">00063</a> <font class="keyword">const</font> CVector &<a class="code" href="classNLPACS_1_1CLocalRetriever.html#a6">NLPACS::CLocalRetriever::getStartVector</a>(uint32 chain)<font class="keyword"> const</font> +00064 <font class="keyword"></font>{ +00065 <font class="keyword">const</font> COrderedChain3f &ochain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n1">_FullOrderedChains</a>[<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getSubChains().front()]; +00066 <font class="keywordflow">return</font> (ochain.isForward()) ? ochain.getVertices().front() : ochain.getVertices().back(); +00067 } +00068 +<a name="l00069"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a7">00069</a> <font class="keyword">const</font> CVector &<a class="code" href="classNLPACS_1_1CLocalRetriever.html#a7">NLPACS::CLocalRetriever::getStopVector</a>(uint32 chain)<font class="keyword"> const</font> +00070 <font class="keyword"></font>{ +00071 <font class="keyword">const</font> COrderedChain3f &ochain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n1">_FullOrderedChains</a>[<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getSubChains().back()]; +00072 <font class="keywordflow">return</font> (ochain.isForward()) ? ochain.getVertices().back() : ochain.getVertices().front(); +00073 } +00074 +00075 +00076 +00077 +<a name="l00078"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a8">00078</a> <font class="keyword">const</font> CVector &<a class="code" href="classNLPACS_1_1CLocalRetriever.html#a6">NLPACS::CLocalRetriever::getStartVector</a>(uint32 chain, sint32 surface)<font class="keyword"> const</font> +00079 <font class="keyword"></font>{ +00080 <font class="keywordtype">bool</font> onLeft = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getLeft() == surface; +00081 <font class="keyword">const</font> COrderedChain3f &ochain = onLeft ? <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n1">_FullOrderedChains</a>[<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getSubChains().front()] : +00082 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n1">_FullOrderedChains</a>[<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getSubChains().back()]; +00083 +00084 <font class="keywordflow">if</font> (ochain.isForward() && onLeft || !ochain.isForward() && !onLeft) +00085 <font class="keywordflow">return</font> ochain.getVertices().front(); +00086 <font class="keywordflow">else</font> +00087 <font class="keywordflow">return</font> ochain.getVertices().back(); +00088 } +00089 +<a name="l00090"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a9">00090</a> <font class="keyword">const</font> CVector &<a class="code" href="classNLPACS_1_1CLocalRetriever.html#a7">NLPACS::CLocalRetriever::getStopVector</a>(uint32 chain, sint32 surface)<font class="keyword"> const</font> +00091 <font class="keyword"></font>{ +00092 <font class="keywordtype">bool</font> onLeft = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getLeft() == surface; +00093 <font class="keyword">const</font> COrderedChain3f &ochain = onLeft ? <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n1">_FullOrderedChains</a>[<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getSubChains().back()] : +00094 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n1">_FullOrderedChains</a>[<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getSubChains().front()]; +00095 +00096 <font class="keywordflow">if</font> (ochain.isForward() && onLeft || !ochain.isForward() && !onLeft) +00097 <font class="keywordflow">return</font> ochain.getVertices().back(); +00098 <font class="keywordflow">else</font> +00099 <font class="keywordflow">return</font> ochain.getVertices().front(); +00100 } +00101 +00102 +00103 +00104 +<a name="l00105"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a10">00105</a> uint16 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a10">NLPACS::CLocalRetriever::getStartTip</a>(uint32 chain, sint32 surface)<font class="keyword"> const</font> +00106 <font class="keyword"></font>{ +00107 <font class="keywordflow">return</font> (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getLeft() == surface) ? <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getStartTip() : <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getStopTip(); +00108 } +00109 +<a name="l00110"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a11">00110</a> uint16 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a11">NLPACS::CLocalRetriever::getStopTip</a>(uint32 chain, sint32 surface)<font class="keyword"> const</font> +00111 <font class="keyword"></font>{ +00112 <font class="keywordflow">return</font> (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getLeft() == surface) ? <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getStopTip() : <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getStartTip(); +00113 } +00114 +00115 +00116 +00117 +00118 +<a name="l00119"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a12">00119</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a12">NLPACS::CLocalRetriever::setStartTip</a>(uint32 chain, sint32 surface, uint16 startTip) +00120 { +00121 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getLeft() == surface) +00122 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._StartTip = startTip; +00123 <font class="keywordflow">else</font> +00124 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._StopTip = startTip; +00125 } +00126 +<a name="l00127"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a13">00127</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a13">NLPACS::CLocalRetriever::setStopTip</a>(uint32 chain, sint32 surface, uint16 stopTip) +00128 { +00129 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getLeft() == surface) +00130 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._StopTip = stopTip; +00131 <font class="keywordflow">else</font> +00132 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._StartTip = stopTip; +00133 } +00134 +00135 +00136 +00137 +<a name="l00138"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a14">00138</a> uint32 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a14">NLPACS::CLocalRetriever::getPreviousChain</a>(uint32 chain, sint32 surface)<font class="keyword"> const</font> +00139 <font class="keyword"></font>{ +00140 uint loop; +00141 uint loopIndex; +00142 +00143 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getLeft() == surface) +00144 { +00145 loop = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._LeftLoop; +00146 loopIndex = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._LeftLoopIndex; +00147 } +00148 <font class="keywordflow">else</font> +00149 { +00150 loop = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._RightLoop; +00151 loopIndex = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._RightLoopIndex; +00152 } +00153 +00154 <font class="keyword">const</font> CRetrievableSurface &surf = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[surface]; +00155 <font class="keyword">const</font> CRetrievableSurface::TLoop &sLoop = surf._Loops[loop]; +00156 <font class="keywordflow">return</font> surf._Chains[sLoop[(loopIndex+sLoop.size()-1)%sLoop.size()]].Chain; +00157 } +00158 +<a name="l00159"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a15">00159</a> uint32 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a15">NLPACS::CLocalRetriever::getNextChain</a>(uint32 chain, sint32 surface)<font class="keyword"> const</font> +00160 <font class="keyword"></font>{ +00161 uint loop; +00162 uint loopIndex; +00163 +00164 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getLeft() == surface) +00165 { +00166 loop = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._LeftLoop; +00167 loopIndex = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._LeftLoopIndex; +00168 } +00169 <font class="keywordflow">else</font> +00170 { +00171 loop = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._RightLoop; +00172 loopIndex = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._RightLoopIndex; +00173 } +00174 +00175 <font class="keyword">const</font> CRetrievableSurface &surf = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[surface]; +00176 <font class="keyword">const</font> CRetrievableSurface::TLoop &sLoop = surf._Loops[loop]; +00177 <font class="keywordflow">return</font> surf._Chains[sLoop[(loopIndex+1)%sLoop.size()]].Chain; +00178 } +00179 +00180 +00181 +00182 +<a name="l00183"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a5">00183</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a5">NLPACS::CLocalRetriever::unify</a>() +00184 { +00185 uint i, j; +00186 +00187 <font class="keywordflow">for</font> (i=0; i<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>.size(); ++i) +00188 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[i].unify(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>); +00189 +00190 <font class="keywordflow">for</font> (i=0; i<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n5">_Tips</a>.size(); ++i) +00191 { +00192 <a class="code" href="classNLPACS_1_1CLocalRetriever_1_1CTip.html">NLPACS::CLocalRetriever::CTip</a> &tip = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n5">_Tips</a>[i]; +00193 CVector2s ptip = tip.<a class="code" href="classNLPACS_1_1CLocalRetriever_1_1CTip.html#m0">Point</a>; +00194 +00195 <font class="keywordflow">for</font> (j=0; j<tip.<a class="code" href="classNLPACS_1_1CLocalRetriever_1_1CTip.html#m1">Chains</a>.size(); ++j) +00196 { +00197 <font class="keywordflow">if</font> (tip.<a class="code" href="classNLPACS_1_1CLocalRetriever_1_1CTip.html#m1">Chains</a>[j].Start) +00198 { +00199 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[tip.<a class="code" href="classNLPACS_1_1CLocalRetriever_1_1CTip.html#m1">Chains</a>[j].Chain].getStartVector(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>) != ptip) +00200 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"chain %d is not stuck to tip %d"</font>, tip.<a class="code" href="classNLPACS_1_1CLocalRetriever_1_1CTip.html#m1">Chains</a>[j].Chain, i); +00201 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[tip.<a class="code" href="classNLPACS_1_1CLocalRetriever_1_1CTip.html#m1">Chains</a>[j].Chain].setStartVector(ptip, <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>); +00202 } +00203 <font class="keywordflow">else</font> +00204 { +00205 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[tip.<a class="code" href="classNLPACS_1_1CLocalRetriever_1_1CTip.html#m1">Chains</a>[j].Chain].getStopVector(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>) != ptip) +00206 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"chain %d is not stuck to tip %d"</font>, tip.<a class="code" href="classNLPACS_1_1CLocalRetriever_1_1CTip.html#m1">Chains</a>[j].Chain, i); +00207 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[tip.<a class="code" href="classNLPACS_1_1CLocalRetriever_1_1CTip.html#m1">Chains</a>[j].Chain].setStopVector(ptip, <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>); +00208 } +00209 } +00210 } +00211 +00212 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n1">_FullOrderedChains</a>.resize(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>.size()); +00213 <font class="keywordflow">for</font> (i=0; i<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>.size(); ++i) +00214 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n1">_FullOrderedChains</a>[i].unpack(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[i]); +00215 } +00216 +00217 +00218 +00219 +00220 +00221 +00222 +<a name="l00223"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a16">00223</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a16">NLPACS::CLocalRetriever::dumpSurface</a>(uint surf, <font class="keyword">const</font> CVector &vect)<font class="keyword"> const</font> +00224 <font class="keyword"></font>{ +00225 <font class="keyword">const</font> CRetrievableSurface &surface = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[surf]; +00226 +00227 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"dump surf %d"</font>, surf); +00228 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"%d chains, %d loops"</font>, surface._Chains.size(), surface._Loops.size()); +00229 +00230 uint i, j, k; +00231 +00232 <font class="keywordflow">for</font> (i=0; i<surface._Chains.size(); ++i) +00233 { +00234 uint chainId = surface._Chains[i].Chain; +00235 <font class="keyword">const</font> CChain &chain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chainId]; +00236 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"-- chain %d[%d]: %d sub left=%d right=%d start=%d stop=%d"</font>, i, chainId, chain.getSubChains().size(), chain.getLeft(), chain.getRight(), chain.getStartTip(), chain.getStopTip()); +00237 +00238 <font class="keywordflow">for</font> (j=0; j<chain.getSubChains().size(); ++j) +00239 { +00240 <font class="keyword">const</font> COrderedChain3f &ochain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n1">_FullOrderedChains</a>[chain.getSubChain(j)]; +00241 <font class="keyword">const</font> COrderedChain &ochains = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[chain.getSubChain(j)]; +00242 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">" subchain %d[%d]: fwd=%d parent=%d idx=%d"</font>, j, chain.getSubChain(j), ochain.isForward(), ochain.getParentId(), ochain.getIndexInParent()); +00243 <font class="keywordflow">for</font> (k=0; k<ochain.getVertices().size(); ++k) +00244 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">" v[%d]=(%.3f,%.3f,%.3f) (%d,%d)"</font>, k, ochain.getVertices()[k].x+vect.x, ochain.getVertices()[k].y+vect.y, ochain.getVertices()[k].z+vect.z, ochains.getVertices()[k].x, ochains.getVertices()[k].y); +00245 } +00246 +00247 } +00248 +00249 <font class="keywordflow">for</font> (i=0; i<surface._Loops.size(); ++i) +00250 { +00251 <font class="keyword">const</font> CRetrievableSurface::TLoop &loop = surface._Loops[i]; +00252 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"-- loop %d: %d chains length=%.2f"</font>, i, loop.size(), loop.Length); +00253 <font class="keyword">static</font> <font class="keywordtype">char</font> wbuffer[256]; +00254 <font class="keyword">static</font> <font class="keywordtype">char</font> buffer[10240]; +00255 sprintf(buffer, <font class="stringliteral">" chains:"</font>); +00256 <font class="keywordflow">for</font> (j=0; j<loop.size(); ++j) +00257 { +00258 sprintf(wbuffer, <font class="stringliteral">" %d[%d]"</font>, loop[j], surface._Chains[loop[j]].Chain); +00259 strcat(buffer, wbuffer); +00260 } +00261 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"%s"</font>, buffer); +00262 } +00263 } +00264 +00265 +<a name="l00266"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a17">00266</a> <font class="keywordtype">float</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a17">NLPACS::CLocalRetriever::distanceToBorder</a>(<font class="keyword">const</font> ULocalPosition &pos)<font class="keyword"> const</font> +00267 <font class="keyword"></font>{ +00268 <font class="keyword">const</font> CRetrievableSurface &surf = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[pos.Surface]; +00269 uint i, j; +00270 <font class="keywordtype">float</font> minDist = 1.0e10f, dist; +00271 +00272 <font class="keywordflow">for</font> (i=0; i<surf._Chains.size(); ++i) +00273 { +00274 <font class="keyword">const</font> CChain &chain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[surf._Chains[i].Chain]; +00275 <font class="keywordflow">for</font> (j=0; j<chain.getSubChains().size(); ++j) +00276 { +00277 dist = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[chain.getSubChain(j)].distance(pos.Estimation); +00278 <font class="keywordflow">if</font> (dist < minDist) +00279 { +00280 minDist = dist; +00281 } +00282 } +00283 } +00284 +00285 <font class="keywordflow">return</font> minDist; +00286 } +00287 +00288 +00289 +00290 +00291 +<a name="l00292"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_0">00292</a> sint32 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_0">NLPACS::CLocalRetriever::addSurface</a>(uint8 normalq, uint8 orientationq, +00293 uint8 mat, uint8 charact, uint8 <a class="code" href="driver__opengl__extension__def_8h.html#a387">level</a>, +00294 <font class="keywordtype">bool</font> isUnderWater, <font class="keywordtype">float</font> waterHeight, +00295 <font class="keyword">const</font> CVector &center, +00296 <font class="keyword">const</font> <a class="code" href="classNLPACS_1_1CSurfaceQuadTree.html">NLPACS::CSurfaceQuadTree</a> &quad) +00297 { +00298 <font class="comment">// creates a new surface...</font> +00299 sint32 newId = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size(); +00300 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.resize(newId+1); +00301 CRetrievableSurface &surf = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.back(); +00302 +00303 <font class="comment">// ... and fills it</font> +00304 surf._NormalQuanta = normalq; +00305 surf._OrientationQuanta = orientationq; +00306 surf._Material = mat; +00307 surf._Character = charact; +00308 surf._Level = <a class="code" href="driver__opengl__extension__def_8h.html#a387">level</a>; +00309 surf._Quad = quad; +00310 surf._Center = center; +00311 +00312 <font class="comment">// WARNING!! MODIFY THESE IF QUANTAS VALUES CHANGE !!</font> +00313 surf._IsFloor = (surf._NormalQuanta <= 1); +00314 surf._IsCeiling = (surf._NormalQuanta >= 3); +00315 +00316 surf._Flags = 0; +00317 surf._Flags |= (surf._IsFloor) ? (1<<CRetrievableSurface::IsFloorBit) : 0; +00318 surf._Flags |= (surf._IsCeiling) ? (1<<CRetrievableSurface::IsCeilingBit) : 0; +00319 surf._Flags |= (!surf._IsFloor && !surf._IsCeiling) ? (1<<CRetrievableSurface::IsSlantBit) : 0; +00320 +00321 surf._Flags |= (isUnderWater) ? (1<<CRetrievableSurface::IsUnderWaterBit) : 0; +00322 surf._WaterHeight = waterHeight; +00323 +00324 surf._Flags |= ((0xffffffff<<(CRetrievableSurface::NormalQuantasStartBit)) & CRetrievableSurface::NormalQuantasBitMask); +00325 +00326 <font class="keywordflow">return</font> newId; +00327 } +00328 +00329 sint32 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_1">NLPACS::CLocalRetriever::addChain</a>(<font class="keyword">const</font> vector<CVector> &verts, +00330 sint32 left, sint32 right) +00331 { +00332 vector<CVector> vertices = verts; +00333 uint i; +00334 +00335 <font class="keywordflow">if</font> (vertices.size() < 2) +00336 { +00337 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"in NLPACS::CLocalRetriever::addChain()"</font>); +00338 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"The chain has less than 2 vertices"</font>); +00339 <font class="keywordflow">return</font> -1; +00340 } +00341 +00342 <font class="comment">// Remove doubled vertices due to CVector2s snapping</font> +00343 vector<CVector2s> converts; +00344 +00345 <font class="keywordflow">for</font> (i=0; i<vertices.size(); ++i) +00346 converts.push_back(CVector2s(vertices[i])); +00347 +00348 vector<CVector2s>::iterator next2s = converts.begin(), it2s, prev2s; +00349 prev2s = next2s; ++next2s; +00350 it2s = next2s; ++next2s; +00351 +00352 vector<CVector>::iterator it3f = vertices.begin(); +00353 CVector prev3f = *it3f; +00354 ++it3f; +00355 +00356 +00357 <font class="keywordflow">for</font> (; it2s != converts.end() && next2s != converts.end(); ) +00358 { +00359 <font class="comment">// if the next point is equal to the previous</font> +00360 <font class="keywordflow">if</font> (*it2s == *prev2s || *it2s == *next2s) +00361 { +00362 <font class="comment">// then remove the next point</font> +00363 it2s = converts.erase(it2s); +00364 it3f = vertices.erase(it3f); +00365 +00366 prev2s = it2s; +00367 --prev2s; +00368 next2s = it2s; +00369 ++next2s; +00370 } +00371 <font class="keywordflow">else</font> +00372 { +00373 <font class="comment">// else remember the next point, and step to the next...</font> +00374 ++prev2s; +00375 ++it2s; +00376 ++next2s; +00377 ++it3f; +00378 prev3f = *it3f; +00379 } +00380 } +00381 +00382 <font class="keywordflow">if</font> (vertices.size() < 2) +00383 { +00384 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"in NLPACS::CLocalRetriever::addChain()"</font>); +00385 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"The chain was snapped to a single point"</font>); +00386 <font class="keywordflow">return</font> -1; +00387 } +00388 +00389 sint32 newId = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>.size(); +00390 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>.resize(newId+1); +00391 CChain &chain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>.back(); +00392 +00393 <font class="keywordflow">if</font> (left>(sint)<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size()) +00394 <a class="code" href="debug_8h.html#a3">nlerror</a> (<font class="stringliteral">"left surface id MUST be id<%d (id=%d)"</font>, <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size(), left); +00395 <font class="keywordflow">if</font> (right>(sint)<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size()) +00396 <a class="code" href="debug_8h.html#a3">nlerror</a> (<font class="stringliteral">"right surface id MUST be id<%d (id=%d)"</font>, <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size(), right); +00397 +00398 <font class="comment">// checks if we can build the chain.</font> +00399 <font class="keywordflow">if</font> (newId > 65535) +00400 <a class="code" href="debug_8h.html#a3">nlerror</a>(<font class="stringliteral">"in NLPACS::CLocalRetriever::addChain(): reached the maximum number of chains"</font>); +00401 +00402 CRetrievableSurface *leftSurface = (left>=0) ? &(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[left]) : NULL; +00403 CRetrievableSurface *rightSurface = (right>=0) ? &(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[right]) : NULL; +00404 +00405 <font class="comment">// adds the chain and the link to the surface links vector.</font> +00406 <font class="keywordflow">if</font> (leftSurface != NULL) +00407 leftSurface->_Chains.push_back(CRetrievableSurface::CSurfaceLink(newId, right)); +00408 <font class="keywordflow">if</font> (rightSurface != NULL) +00409 rightSurface->_Chains.push_back(CRetrievableSurface::CSurfaceLink(newId, left)); +00410 +00411 chain._StartTip = 0xffff; +00412 chain._StopTip = 0xffff; +00413 +00414 <font class="comment">// make the chain and its subchains.</font> +00415 chain.make(vertices, left, right, <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>, (uint16)newId, <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n1">_FullOrderedChains</a>); +00416 +00417 <font class="keywordflow">return</font> newId; +00418 } +00419 +00420 +00421 +00422 +<a name="l00423"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_11">00423</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_11">NLPACS::CLocalRetriever::computeLoopsAndTips</a>() +00424 { +00425 <font class="comment">// for each surface,</font> +00426 <font class="comment">// examine each chain tip to match another tip inside the surface tips</font> +00427 <font class="comment">// if there is no matching tip, then creates a new one</font> +00428 +00429 uint i, j; +00430 +00431 <font class="keywordflow">for</font> (i=0; i<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size(); ++i) +00432 { +00433 CRetrievableSurface &surface = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[i]; +00434 +00435 vector<bool> chainFlags; +00436 chainFlags.resize(surface._Chains.size()); +00437 <font class="keywordflow">for</font> (j=0; j<chainFlags.size(); ++j) +00438 chainFlags[j] = <font class="keyword">false</font>; +00439 +00440 uint totalAdded = 0; +00441 +00442 <font class="keywordflow">while</font> (true) +00443 { +00444 <font class="keywordflow">for</font> (j=0; j<chainFlags.size() && chainFlags[j]; ++j) +00445 ; +00446 +00447 <font class="keywordflow">if</font> (j == chainFlags.size()) +00448 <font class="keywordflow">break</font>; +00449 +00450 uint32 loopId = surface._Loops.size(); +00451 surface._Loops.push_back(CRetrievableSurface::TLoop()); +00452 CRetrievableSurface::TLoop &loop = surface._Loops.back(); +00453 +00454 CVector loopStart = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a6">getStartVector</a>(surface._Chains[j].Chain, i); +00455 CVector currentEnd = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a7">getStopVector</a>(surface._Chains[j].Chain, i); +00456 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[surface._Chains[j].Chain].setLoopIndexes(i, loopId, loop.size()); +00457 loop.push_back(j); +00458 chainFlags[j] = <font class="keyword">true</font>; +00459 +00460 <font class="keywordtype">float</font> loopCloseDistance; +00461 +00462 <font class="keywordflow">while</font> (true) +00463 { +00464 <font class="comment">// loopCloseDistance = hybrid2dNorm(loopStart-currentEnd);</font> +00465 loopCloseDistance = (loopStart-currentEnd).norm(); +00466 +00467 <font class="comment">// choose the best matching start vector</font> +00468 sint bestChain = -1; +00469 <font class="keywordtype">float</font> best = 1.0e10f; +00470 CVector thisStart; +00471 <font class="keywordflow">for</font> (j=0; j<chainFlags.size(); ++j) +00472 { +00473 <font class="keywordflow">if</font> (chainFlags[j]) +00474 <font class="keywordflow">continue</font>; +00475 thisStart = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a6">getStartVector</a>(surface._Chains[j].Chain, i); +00476 <font class="comment">// float d = hybrid2dNorm(thisStart-currentEnd);</font> +00477 <font class="keywordtype">float</font> d = (thisStart-currentEnd).norm(); +00478 <font class="keywordflow">if</font> (d < best) +00479 { +00480 best = d; +00481 bestChain = j; +00482 } +00483 } +00484 +00485 <font class="keywordflow">if</font> ((bestChain == -1 || best > 3.0e-2f)&& loopCloseDistance > 3.0e-2f) +00486 { +00487 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"in NLPACS::CLocalRetriever::computeTips()"</font>); +00488 +00489 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a16">dumpSurface</a>(i); +00490 +00491 <font class="keywordflow">for</font> (j=0; j<surface._Chains.size(); ++j) +00492 { +00493 CVector start = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a6">getStartVector</a>(surface._Chains[j].Chain, i); +00494 CVector end = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a7">getStopVector</a>(surface._Chains[j].Chain, i); +00495 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"surf=%d chain=%d"</font>, i, surface._Chains[j].Chain); +00496 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"start=(%f,%f,%f)"</font>, start.x, start.y, start.z); +00497 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"end=(%f,%f,%f)"</font>, end.x, end.y, end.z); +00498 } +00499 +00500 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"bestChain=%d best=%f"</font>, bestChain, best); +00501 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"loopCloseDistance=%f"</font>, loopCloseDistance); +00502 <a class="code" href="debug_8h.html#a3">nlerror</a>(<font class="stringliteral">"Couldn't close loop on surface=%d"</font>, i); +00503 } +00504 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (best > 1.0e0f && loopCloseDistance < 3.0e-2f || +00505 loopCloseDistance < 1.0e-3f) +00506 { +00507 <font class="keywordflow">break</font>; +00508 } +00509 +00510 currentEnd = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a7">getStopVector</a>(surface._Chains[bestChain].Chain, i); +00511 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[surface._Chains[bestChain].Chain].setLoopIndexes(i, loopId, loop.size()); +00512 loop.push_back(bestChain); +00513 chainFlags[bestChain] = <font class="keyword">true</font>; +00514 ++totalAdded; +00515 } +00516 } +00517 } +00518 +00519 <font class="keywordflow">for</font> (i=0; i<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>.size(); ++i) +00520 { +00521 <font class="comment">/* if (i == 431)</font> +00522 <font class="comment"> nlstop;</font> +00523 <font class="comment">*/</font> +00524 uint whichTip; +00525 <font class="comment">// for both tips (start and stop)</font> +00526 <font class="keywordflow">for</font> (whichTip=0; whichTip<=1; ++whichTip) +00527 { +00528 <font class="comment">// get the tip id</font> +00529 uint thisTip = (whichTip) ? <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[i].getStopTip() : <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[i].getStartTip(); +00530 +00531 <font class="keywordflow">if</font> (thisTip != 0xffff && thisTip >= <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n5">_Tips</a>.size()) +00532 { +00533 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"in NLPACS::CLocalRetriever::computeLoopsAndTips()"</font>); +00534 <a class="code" href="debug_8h.html#a3">nlerror</a>(<font class="stringliteral">"checked a tip that doesn't exist on chain %d (tipId=%d)"</font>, i, thisTip); +00535 } +00536 +00537 <font class="comment">// if it is unaffected yet creates an new tip and affect it to the common chains</font> +00538 <font class="keywordflow">if</font> (thisTip == 0xffff) +00539 { +00540 uint turn; +00541 uint tipId = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n5">_Tips</a>.size(); +00542 <font class="comment">/*</font> +00543 <font class="comment"> if (tipId == 310)</font> +00544 <font class="comment"> nlstop;</font> +00545 <font class="comment">*/</font> +00546 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n5">_Tips</a>.resize(tipId+1); +00547 CTip &tip = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n5">_Tips</a>[tipId]; +00548 tip.Point = (whichTip) ? <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a7">getStopVector</a>(i) : <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a6">getStartVector</a>(i); +00549 +00550 <font class="keywordflow">for</font> (turn=0; turn<=1; ++turn) +00551 { +00552 uint chain = i; +00553 +00554 <font class="comment">//</font> +00555 <font class="keywordflow">if</font> (whichTip) +00556 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._StopTip = tipId; +00557 <font class="keywordflow">else</font> +00558 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._StartTip = tipId; +00559 +00560 sint32 surf = (!turn && !whichTip || turn && whichTip) ? <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getLeft() : <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].getRight(); +00561 +00562 <font class="keywordflow">while</font> (surf >= 0) +00563 { +00564 +00565 CChain &nextChain = (turn) ? <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a15">getNextChain</a>(chain, surf)] : <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a14">getPreviousChain</a>(chain, surf)]; +00566 <font class="keywordtype">bool</font> isForward = (nextChain.getLeft() == surf); <font class="comment">// tells if the left surf is the current surf</font> +00567 <font class="keywordtype">bool</font> selectTip = isForward && !turn || !isForward && turn; +00568 uint16 &tipRef = selectTip ? nextChain._StopTip : nextChain._StartTip; +00569 surf = (isForward) ? nextChain.getRight() : nextChain.getLeft(); +00570 +00571 <font class="keywordflow">if</font> (tipRef != 0xffff && tipRef != tipId) +00572 { +00573 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"in NLPACS::CLocalRetriever::computeLoopsAndTips()"</font>); +00574 <a class="code" href="debug_8h.html#a3">nlerror</a>(<font class="stringliteral">"Trying to setup a already created tip (tipId=%d, previous=%d)"</font>, tipId, tipRef); +00575 } +00576 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (tipRef != 0xffff) +00577 { +00578 <font class="keywordflow">break</font>; +00579 } +00580 +00581 tipRef = tipId; +00582 } +00583 } +00584 } +00585 } +00586 } +00587 +00588 <font class="keywordflow">for</font> (i=0; i<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>.size(); ++i) +00589 { +00590 uint startTip = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[i].getStartTip(), +00591 stopTip = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[i].getStopTip(); +00592 +00593 <font class="comment">/*</font> +00594 <font class="comment"> if (_Chains[i].getEdge() >= 0 && startTip == stopTip)</font> +00595 <font class="comment"> {</font> +00596 <font class="comment"> nlwarning("NLPACS::CLocalRetriever::computeLoopsAndTips(): chain %d on edge %d has same StartTip and StopTip", i, _Chains[i].getEdge(), startTip, stopTip);</font> +00597 <font class="comment"> }</font> +00598 <font class="comment">*/</font> +00599 +00600 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n5">_Tips</a>[startTip].Chains.push_back(CTip::CChainTip(i, <font class="keyword">true</font>)); +00601 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n5">_Tips</a>[stopTip].Chains.push_back(CTip::CChainTip(i, <font class="keyword">false</font>)); +00602 } +00603 +00604 <font class="keywordflow">for</font> (i=0; i<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size(); ++i) +00605 { +00606 <font class="keywordflow">for</font> (j=0; j<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[i]._Loops.size(); ++j) +00607 { +00608 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[i]._Loops[j].Length = 0.0f; +00609 uint k; +00610 +00611 <font class="keywordflow">for</font> (k=0; k<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[i]._Loops[j].size(); ++k) +00612 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[i]._Loops[j].Length += <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[i]._Chains[<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[i]._Loops[j][k]].Chain].getLength(); +00613 } +00614 } +00615 } +00616 +00617 +00618 <font class="comment">//</font> +<a name="l00619"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z944_19">00619</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z944_19">NLPACS::CLocalRetriever::buildSurfacePolygons</a>(uint32 surface, list<CPolygon> &polygons)<font class="keyword"> const</font> +00620 <font class="keyword"></font>{ +00621 <font class="keyword">const</font> CRetrievableSurface &surf = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[surface]; +00622 +00623 uint i, j, k, <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>; +00624 +00625 <font class="keywordflow">for</font> (i=0; i<surf._Loops.size(); ++i) +00626 { +00627 polygons.push_back(); +00628 CPolygon &poly = polygons.back(); +00629 +00630 <font class="keywordflow">for</font> (j=0; j<surf._Loops[i].size(); ++j) +00631 { +00632 <font class="keyword">const</font> CChain &chain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[surf._Loops[i][j]]; +00633 <font class="keywordtype">bool</font> chainforward = ((uint32)chain._Left == surface); +00634 +00635 <font class="keywordflow">if</font> (chainforward) +00636 { +00637 <font class="keywordflow">for</font> (k=0; k<chain._SubChains.size(); ++k) +00638 { +00639 <font class="keyword">const</font> COrderedChain &ochain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[chain._SubChains[k]]; +00640 <font class="keywordtype">bool</font> ochainforward = ochain.isForward(); +00641 +00642 <font class="keywordflow">if</font> (ochainforward) +00643 { +00644 <font class="keywordflow">for</font> (<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>=0; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a><ochain.getVertices().size()-1; ++<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>) +00645 poly.Vertices.push_back(ochain[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>].unpack3f()); +00646 } +00647 <font class="keywordflow">else</font> +00648 { +00649 <font class="keywordflow">for</font> (<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>=ochain.getVertices().size()-1; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>>0; --<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>) +00650 poly.Vertices.push_back(ochain[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>].unpack3f()); +00651 } +00652 } +00653 } +00654 <font class="keywordflow">else</font> +00655 { +00656 <font class="keywordflow">for</font> (k=chain._SubChains.size(); (sint)k>0; --k) +00657 { +00658 <font class="keyword">const</font> COrderedChain &ochain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[chain._SubChains[k]]; +00659 <font class="keywordtype">bool</font> ochainforward = ochain.isForward(); +00660 +00661 <font class="keywordflow">if</font> (ochainforward) +00662 { +00663 <font class="keywordflow">for</font> (<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>=ochain.getVertices().size()-1; (sint)<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>>0; --<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>) +00664 poly.Vertices.push_back(ochain[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>].unpack3f()); +00665 } +00666 <font class="keywordflow">else</font> +00667 { +00668 <font class="keywordflow">for</font> (<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>=0; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a><ochain.getVertices().size()-1; ++<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>) +00669 poly.Vertices.push_back(ochain[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>].unpack3f()); +00670 } +00671 } +00672 } +00673 } +00674 } +00675 } +00676 +00677 +00678 <font class="comment">// not implemented...</font> +<a name="l00679"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_14">00679</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_14">NLPACS::CLocalRetriever::sortTips</a>() +00680 { +00681 } +00682 +00683 +00684 +00685 +<a name="l00686"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_12">00686</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_12">NLPACS::CLocalRetriever::findBorderChains</a>() +00687 { +00688 uint chain; +00689 +00690 <font class="comment">// for each chain, if it belongs to an edge of the</font> +00691 <font class="comment">// local retriever, then adds it to the _BorderChains.</font> +00692 <font class="keywordflow">for</font> (chain=0; chain<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>.size(); ++chain) +00693 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].isBorderChain()) +00694 { +00695 sint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n6">_BorderChains</a>.size(); +00696 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n6">_BorderChains</a>.push_back(chain); +00697 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain].setBorderChainIndex(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +00698 } +00699 } +00700 +<a name="l00701"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_13">00701</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_13">NLPACS::CLocalRetriever::updateChainIds</a>() +00702 { +00703 uint surf, link; +00704 +00705 <font class="keywordflow">for</font> (surf=0; surf<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size(); ++surf) +00706 { +00707 CRetrievableSurface &surface = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[surf]; +00708 +00709 <font class="keywordflow">for</font> (link=0; link<surface._Chains.size(); ++link) +00710 { +00711 sint32 chain = surface._Chains[link].Chain; +00712 +00713 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._Left == (sint32)surf) +00714 surface._Chains[link].Surface = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._Right; +00715 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._Right == (sint32)surf) +00716 surface._Chains[link].Surface = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain]._Left; +00717 <font class="keywordflow">else</font> +00718 { +00719 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"in NLPACS::CLocalRetriever::updateEdgesOnSurfaces()"</font>); +00720 <a class="code" href="debug_8h.html#a3">nlerror</a>(<font class="stringliteral">"Can't find back point to surface %d on chain %d"</font>, surf, chain); +00721 } +00722 } +00723 } +00724 } +00725 +<a name="l00726"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_10">00726</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_10">NLPACS::CLocalRetriever::computeTopologies</a>() +00727 { +00728 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"compute topologies"</font>); +00729 +00730 <font class="comment">// Find topologies out...</font> +00731 uint character; +00732 <font class="keywordflow">for</font> (character=0; character<<a class="code" href="namespaceNLPACS.html#a30a8">NumCreatureModels</a>; ++character) +00733 { +00734 <font class="comment">// for each type of creature, flood fill surfaces...</font> +00735 sint32 surface; +00736 uint topology = 0; +00737 +00738 <font class="keywordflow">for</font> (surface=0; surface<(sint)<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size(); ++surface) +00739 { +00740 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[surface]._Topologies[character] == -1 && +00741 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[surface]._Character == character) +00742 { +00743 vector<sint32> surfacesStack; +00744 surfacesStack.push_back(surface); +00745 +00746 <font class="keywordflow">while</font> (!surfacesStack.empty()) +00747 { +00748 CRetrievableSurface &current = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[surfacesStack.back()]; +00749 surfacesStack.pop_back(); +00750 current._Topologies[character] = topology; +00751 +00752 uint i; +00753 <font class="keywordflow">for</font> (i=0; i<current._Chains.size(); ++i) +00754 { +00755 CChain &chain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[current._Chains[i].Chain]; +00756 sint32 link = (chain.getLeft() == surface) ? chain.getRight() : chain.getLeft(); +00757 <font class="keywordflow">if</font> (link>=0 && link<(sint)<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size() && +00758 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[link]._Topologies[character] == -1 && +00759 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[link]._Character >= character) +00760 { +00761 surfacesStack.push_back(link); +00762 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[link]._Topologies[character] = topology; +00763 } +00764 } +00765 } +00766 +00767 ++topology; +00768 } +00769 } +00770 +00771 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n7">_Topologies</a>[character].resize(topology); +00772 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"generated %d topologies for character %d"</font>, topology, character); +00773 } +00774 +00775 uint surface; +00776 <font class="keywordflow">for</font> (surface=0; surface<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size(); ++surface) +00777 { +00778 CRetrievableSurface &current = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[surface]; +00779 +00780 <font class="keywordflow">for</font> (character=0; character<<a class="code" href="namespaceNLPACS.html#a30a8">NumCreatureModels</a>; ++character) +00781 <font class="keywordflow">if</font> (current._Topologies[character] >= 0) +00782 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n7">_Topologies</a>[character][current._Topologies[character]].push_back(surface); +00783 } +00784 } +00785 +<a name="l00786"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_15">00786</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_15">NLPACS::CLocalRetriever::translate</a>(<font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &translation) +00787 { +00788 uint i; +00789 <font class="keywordflow">for</font> (i=0; i<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>.size(); ++i) +00790 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[i].translate(translation); +00791 <font class="keywordflow">for</font> (i=0; i<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size(); ++i) +00792 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[i].translate(translation); +00793 <font class="keywordflow">for</font> (i=0; i<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n5">_Tips</a>.size(); ++i) +00794 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n5">_Tips</a>[i].translate(translation); +00795 } +00796 +<a name="l00797"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_17">00797</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_17">NLPACS::CLocalRetriever::serial</a>(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) +00798 { +00799 <font class="comment">/*</font> +00800 <font class="comment"> Version 0:</font> +00801 <font class="comment"> - base version (with collision info).</font> +00802 <font class="comment"> Version 1:</font> +00803 <font class="comment"> - interior vertices and faces, for interior ground snapping</font> +00804 <font class="comment"> Version 2:</font> +00805 <font class="comment"> - face grid added.</font> +00806 <font class="comment"> Version 3:</font> +00807 <font class="comment"> - identifier added.</font> +00808 <font class="comment"> */</font> +00809 sint ver= f.<a class="code" href="classNLMISC_1_1IStream.html#a29">serialVersion</a>(3); +00810 +00811 uint i; +00812 f.<a class="code" href="classNLMISC_1_1IStream.html#a7">serialCont</a>(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>); +00813 f.<a class="code" href="classNLMISC_1_1IStream.html#a7">serialCont</a>(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>); +00814 f.<a class="code" href="classNLMISC_1_1IStream.html#a7">serialCont</a>(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n1">_FullOrderedChains</a>); +00815 f.<a class="code" href="classNLMISC_1_1IStream.html#a7">serialCont</a>(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>); +00816 f.<a class="code" href="classNLMISC_1_1IStream.html#a7">serialCont</a>(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n5">_Tips</a>); +00817 f.<a class="code" href="classNLMISC_1_1IStream.html#a7">serialCont</a>(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n6">_BorderChains</a>); +00818 <font class="keywordflow">for</font> (i=0; i<<a class="code" href="namespaceNLPACS.html#a30a8">NumCreatureModels</a>; ++i) +00819 f.<a class="code" href="classNLMISC_1_1IStream.html#a7">serialCont</a>(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n7">_Topologies</a>[i]); +00820 f.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a>(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n8">_ChainQuad</a>); +00821 f.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a>(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n4">_BBox</a>); +00822 f.<a class="code" href="classNLMISC_1_1IStream.html#a6">serialEnum</a>(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n9">_Type</a>); +00823 f.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a>(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_0">_ExteriorMesh</a>); +00824 +00825 <font class="comment">// a fix for old versions (with wrong _Type value)</font> +00826 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n9">_Type</a> != CLocalRetriever::Interior) <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n9">_Type</a> = CLocalRetriever::Landscape; +00827 +00828 <font class="keywordflow">if</font> (ver >= 1) +00829 { +00830 f.<a class="code" href="classNLMISC_1_1IStream.html#a7">serialCont</a>(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_1">_InteriorVertices</a>); +00831 f.<a class="code" href="classNLMISC_1_1IStream.html#a7">serialCont</a>(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_2">_InteriorFaces</a>); +00832 +00833 } +00834 <font class="keywordflow">if</font> (ver >= 2) +00835 { +00836 f.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a>(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_3">_FaceGrid</a>); +00837 } +00838 <font class="keywordflow">if</font> (ver >= 3) +00839 { +00840 f.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a>(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_4">_Id</a>); +00841 } +00842 } +00843 +00844 +00845 +00846 +00847 +00848 +00849 +00850 +<a name="l00851"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a0">00851</a> <font class="keywordtype">bool</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a0">NLPACS::CLocalRetriever::insurePosition</a>(<a class="code" href="classNLPACS_1_1ULocalPosition.html">NLPACS::ULocalPosition</a> &local)<font class="keyword"> const</font> +00852 <font class="keyword"></font>{ +00853 <font class="keywordflow">if</font> (local.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m0">Surface</a> < 0 || local.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m0">Surface</a> >= (sint)<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size()) +00854 { +00855 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"PACS: can't insure position to inexistant surface %d"</font>, local.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m0">Surface</a>); +00856 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00857 } +00858 +00859 <font class="comment">// the surface</font> +00860 <font class="keyword">const</font> <a class="code" href="classNLPACS_1_1CRetrievableSurface.html">NLPACS::CRetrievableSurface</a> &surface = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[local.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m0">Surface</a>]; +00861 +00862 uint i, j, k; +00863 CVector2f M = CVector2f(local.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>); +00864 <font class="keywordtype">bool</font> moved = <font class="keyword">false</font>; +00865 +00866 <font class="comment">// for each chain and each subchain of the surface,</font> +00867 <font class="comment">// check if point is located on the good side of the border (and far enough to avoid accuracy issues)</font> +00868 <font class="keywordflow">for</font> (i=0; i<surface.<a class="code" href="classNLPACS_1_1CRetrievableSurface.html#a12">getChains</a>().size(); ++i) +00869 { +00870 uint ichain = surface.<a class="code" href="classNLPACS_1_1CRetrievableSurface.html#a13">getChain</a>(i).Chain; +00871 <font class="keyword">const</font> <a class="code" href="classNLPACS_1_1CChain.html">NLPACS::CChain</a> &chain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[ichain]; +00872 +00873 for (j=0; j<chain.getSubChains().size(); ++j) +00874 { +00875 uint iochain = chain.getSubChain(j); +00876 <font class="keyword">const</font> <a class="code" href="classNLPACS_1_1COrderedChain.html">NLPACS::COrderedChain</a> &ochain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[iochain]; +00877 +00878 uint isAtLeft = ((chain.getLeft() == local.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m0">Surface</a>) ? 1 : 0); +00879 uint isForward = (ochain.<a class="code" href="classNLPACS_1_1COrderedChain.html#a1">isForward</a>() ? 1 : 0); +00880 <font class="keywordtype">bool</font> shouldBeUpper = !((isAtLeft ^ isForward) != 0); <font class="comment">// shouldBeAtLeft for vertical segment</font> +00881 +00882 <font class="keywordflow">for</font> (k=0; (sint)k<(sint)(ochain.<a class="code" href="classNLPACS_1_1COrderedChain.html#a0">getVertices</a>().size()-1); ++k) +00883 { +00884 CVector2f A = ochain[k].unpack(); +00885 CVector2f B = ochain[k+1].unpack(); +00886 CVector2f AB = B-A; +00887 +00888 <font class="keywordtype">float</font> lambda = ((M-A)*AB)/AB.sqrnorm(); +00889 +00890 <font class="keywordflow">if</font> (lambda<0.0f || lambda>1.0f) +00891 <font class="keywordflow">continue</font>; +00892 +00893 CVector2f n = (shouldBeUpper ? CVector2f(-AB.y, AB.x) : CVector2f(AB.y, -AB.x)).normed(); +00894 <font class="keywordtype">float</font> d = (M-A)*n; +00895 +00896 <font class="comment">// if point is too close of the border or on the wrong side</font> +00897 <font class="comment">// move it far enough</font> +00898 <font class="keywordflow">if</font> (d < InsurePositionThreshold && d > -<a class="code" href="local__retriever_8cpp.html#a0">InsurePositionThreshold</a>) +00899 { +00900 M += (<a class="code" href="local__retriever_8cpp.html#a0">InsurePositionThreshold</a>*1.1f-d)*n; +00901 moved = <font class="keyword">true</font>; +00902 } +00903 } +00904 } +00905 } +00906 +00907 <a class="code" href="classNLPACS_1_1CRetrieverInstance.html#z955_0">NLPACS::CRetrieverInstance::snapVector</a>(M); +00908 +00909 local.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> = M.x; +00910 local.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> = M.y; +00911 +00912 { +00913 <font class="keywordtype">float</font> fx1024 = local.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> * 1024.0f; +00914 <font class="keywordtype">float</font> fy1024 = local.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> * 1024.0f; +00915 sint32 ix1024 = (sint32)floor(fx1024); +00916 sint32 iy1024 = (sint32)floor(fy1024); +00917 +00918 <a class="code" href="debug_8h.html#a6">nlassert</a> ((<font class="keywordtype">float</font>)ix1024 == fx1024); +00919 <a class="code" href="debug_8h.html#a6">nlassert</a> ((<font class="keywordtype">float</font>)iy1024 == fy1024); +00920 } +00921 +00922 <font class="keywordflow">return</font> moved; +00923 } +00924 +00925 +<a name="l00926"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a1">00926</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a1">NLPACS::CLocalRetriever::retrievePosition</a>(CVector estimated, <font class="comment">/*std::vector<uint8> &retrieveTable,*/</font> CCollisionSurfaceTemp &cst)<font class="keyword"> const</font> +00927 <font class="keyword"></font>{ +00928 CAABBox box; +00929 <font class="keyword">const</font> <font class="keywordtype">double</font> BorderThreshold = 2.0e-2f; +00930 box.setMinMax(CVector(estimated.x-(<font class="keywordtype">float</font>)BorderThreshold, <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n4">_BBox</a>.<a class="code" href="classNLMISC_1_1CAABBox.html#z264_0">getMin</a>().y, 0.0f), CVector(estimated.x+(<font class="keywordtype">float</font>)BorderThreshold, <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n4">_BBox</a>.<a class="code" href="classNLMISC_1_1CAABBox.html#z264_1">getMax</a>().y, 0.0f)); +00931 uint numEdges = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n8">_ChainQuad</a>.selectEdges(box, cst); +00932 +00933 uint ochain, i; +00934 CVector2s estim = CVector2s(estimated); +00935 +00936 cst.PossibleSurfaces.clear(); +00937 +00938 <font class="comment">// WARNING!!</font> +00939 <font class="comment">// cst.SurfaceLUT is assumed to be 0 filled !!</font> +00940 +00941 <font class="comment">// nldebug("estim=(%d,%d)", estim.x, estim.y);</font> +00942 +00943 <font class="comment">// for each ordered chain, checks if the estimated position is between the min and max.</font> +00944 <font class="keywordflow">for</font> (i=0; i<numEdges; ++i) +00945 { +00946 ochain = cst.EdgeChainEntries[i].OChainId; +00947 +00948 <font class="keyword">const</font> COrderedChain &sub = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[ochain]; +00949 <font class="keyword">const</font> CVector2s &<a class="code" href="bit__set_8cpp.html#a0">min</a> = sub.getMin(), +00950 &max = sub.getMax(); +00951 +00952 <font class="comment">// checks the position against the min and max of the chain</font> +00953 <font class="keywordflow">if</font> (estim.x < <a class="code" href="bit__set_8cpp.html#a0">min</a>.x || estim.x > max.x) +00954 <font class="keywordflow">continue</font>; +00955 +00956 <font class="keywordtype">bool</font> isUpper; +00957 <font class="keywordtype">bool</font> isOnBorder = <font class="keyword">false</font>; +00958 +00959 sint32 left = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[sub.getParentId()].getLeft(), +00960 right = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[sub.getParentId()].getRight(); +00961 +00962 <font class="keywordflow">if</font> (estim.y < <a class="code" href="bit__set_8cpp.html#a0">min</a>.y) +00963 { +00964 <font class="keywordflow">if</font> (estim.x == max.x) +00965 <font class="keywordflow">continue</font>; +00966 isUpper = <font class="keyword">false</font>; +00967 <font class="comment">// nlinfo("Box: min(%d,%d) max(%d,%d) forward=%d left=%d right=%d upper=false", min.x, min.y, max.x, max.y, sub.isForward(), left, right);</font> +00968 } +00969 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (estim.y > max.y) +00970 { +00971 <font class="keywordflow">if</font> (estim.x == max.x) +00972 <font class="keywordflow">continue</font>; +00973 isUpper = <font class="keyword">true</font>; +00974 <font class="comment">// nlinfo("Box: min(%d,%d) max(%d,%d) forward=%d left=%d right=%d upper=true", min.x, min.y, max.x, max.y, sub.isForward(), left, right);</font> +00975 } +00976 <font class="keywordflow">else</font> +00977 { +00978 <font class="keyword">const</font> vector<CVector2s> &vertices = sub.getVertices(); +00979 uint start = 0, stop = vertices.size()-1; +00980 +00982 +00983 <font class="comment">// then finds the smallest segment of the chain that includes the estimated position.</font> +00984 <font class="keywordflow">while</font> (stop-start > 1) +00985 { +00986 uint mid = (start+stop)/2; +00987 +00988 <font class="keywordflow">if</font> (vertices[mid].x > estim.x) +00989 stop = mid; +00990 <font class="keywordflow">else</font> +00991 start = mid; +00992 } +00993 +00994 <font class="comment">// if a vertical edge</font> +00995 <font class="keywordflow">if</font> (vertices[start].x == vertices[stop].x) +00996 { +00997 <font class="comment">// look for maximal bounds</font> +00998 <font class="keywordflow">while</font> (start > 0 && vertices[start].x == vertices[start-1].x) +00999 --start; +01000 +01001 <font class="keywordflow">while</font> (stop < vertices.size()-1 && vertices[stop].x == vertices[stop+1].x) +01002 ++stop; +01003 +01004 <font class="comment">// if upper or lower the bounds, do nothing</font> +01005 <font class="keywordflow">if</font> (estim.y > vertices[start].y && estim.y > vertices[stop].y || +01006 estim.y < vertices[start].y && estim.y < vertices[stop].y) +01007 <font class="keywordflow">continue</font>; +01008 +01009 isOnBorder = <font class="keyword">true</font>; +01010 cst.incSurface(left); +01011 cst.incSurface(right); +01012 <font class="keywordflow">if</font> (left >= 0) cst.SurfaceLUT[left].FoundCloseEdge = <font class="keyword">true</font>; +01013 <font class="keywordflow">if</font> (right >= 0) cst.SurfaceLUT[right].FoundCloseEdge = <font class="keyword">true</font>; +01014 <font class="keywordflow">continue</font>; +01015 <font class="comment">// nlinfo("Edge: start(%d,%d) stop(%d,%d) forward=%d left=%d right=%d border=true", vertices[start].x, vertices[start].y, vertices[stop].x, vertices[stop].y, sub.isForward(), left, right);</font> +01016 } +01017 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (vertices[stop].x == estim.x) +01018 { +01019 <font class="comment">// if </font> +01020 <font class="keywordflow">continue</font>; +01021 } +01022 +01023 <font class="comment">// and then checks if the estimated position is up or down the chain.</font> +01024 +01025 <font class="comment">// first trivial case (up both tips)</font> +01026 <font class="keywordflow">if</font> (estim.y > vertices[start].y && estim.y > vertices[stop].y) +01027 { +01028 isUpper = <font class="keyword">true</font>; +01029 <font class="comment">// nlinfo("Edge: start(%d,%d) stop(%d,%d) forward=%d left=%d right=%d upper=true", vertices[start].x, vertices[start].y, vertices[stop].x, vertices[stop].y, sub.isForward(), left, right);</font> +01030 } +01031 <font class="comment">// second trivial case (down both tips)</font> +01032 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (estim.y < vertices[start].y && estim.y < vertices[stop].y) +01033 { +01034 isUpper = <font class="keyword">false</font>; +01035 <font class="comment">// nlinfo("Edge: start(%d,%d) stop(%d,%d) forward=%d left=%d right=%d upper=false", vertices[start].x, vertices[start].y, vertices[stop].x, vertices[stop].y, sub.isForward(), left, right);</font> +01036 } +01037 <font class="comment">// full test...</font> +01038 <font class="keywordflow">else</font> +01039 { +01040 <font class="keyword">const</font> CVector2s &vstart = vertices[start], +01041 &vstop = vertices[stop]; +01042 +01043 sint16 intersect = vstart.y + (vstop.y-vstart.y)*(estim.x-vstart.x)/(vstop.x-vstart.x); +01044 +01045 isUpper = estim.y > intersect; +01046 isOnBorder = (fabs(estim.y - intersect)<BorderThreshold*<a class="code" href="namespaceNLPACS.html#a14">Vector2sAccuracy</a>); +01047 <font class="comment">// nlinfo("Edge: start(%d,%d) stop(%d,%d) forward=%d left=%d right=%d upper=%s border=%s", vertices[start].x, vertices[start].y, vertices[stop].x, vertices[stop].y, sub.isForward(), left, right, isUpper ? "true":"false", isOnBorder ? "true":"false");</font> +01048 } +01049 } +01050 +01051 <font class="keywordflow">if</font> (isOnBorder) +01052 { +01053 cst.incSurface(left); +01054 cst.incSurface(right); +01055 <font class="keywordflow">if</font> (left >= 0) cst.SurfaceLUT[left].FoundCloseEdge = <font class="keyword">true</font>; +01056 <font class="keywordflow">if</font> (right >= 0) cst.SurfaceLUT[right].FoundCloseEdge = <font class="keyword">true</font>; +01057 <font class="keywordflow">continue</font>; +01058 } +01059 +01060 <font class="comment">// Depending on the chain is forward, up the position, increase/decrease the surface table...</font> +01061 <font class="keywordflow">if</font> (sub.isForward()) +01062 { +01063 <font class="keywordflow">if</font> (isUpper) +01064 { +01065 cst.incSurface(left); +01066 cst.decSurface(right); +01067 } +01068 <font class="keywordflow">else</font> +01069 { +01070 cst.decSurface(left); +01071 cst.incSurface(right); +01072 } +01073 } +01074 <font class="keywordflow">else</font> +01075 { +01076 <font class="keywordflow">if</font> (isUpper) +01077 { +01078 cst.decSurface(left); +01079 cst.incSurface(right); +01080 } +01081 <font class="keywordflow">else</font> +01082 { +01083 cst.incSurface(left); +01084 cst.decSurface(right); +01085 } +01086 } +01087 } +01088 } +01089 +01090 +<a name="l01091"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_9">01091</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z945_9">NLPACS::CLocalRetriever::initFaceGrid</a>() +01092 { +01093 CFaceGrid::CFaceGridBuild fgb; +01094 fgb.init(64, 4.0f); +01095 +01096 uint i; +01097 <font class="keywordflow">for</font> (i=0; i<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_2">_InteriorFaces</a>.size(); ++i) +01098 { +01099 CAABBox box; +01100 CInteriorFace &f = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_2">_InteriorFaces</a>[i]; +01101 box.setCenter(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_1">_InteriorVertices</a>[f.Verts[0]]); +01102 box.extend(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_1">_InteriorVertices</a>[f.Verts[1]]); +01103 box.extend(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_1">_InteriorVertices</a>[f.Verts[2]]); +01104 +01105 fgb.insert(box.getMin(), box.getMax(), i); +01106 } +01107 +01108 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_3">_FaceGrid</a>.create(fgb); +01109 } +01110 +<a name="l01111"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a2">01111</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a2">NLPACS::CLocalRetriever::snapToInteriorGround</a>(<a class="code" href="classNLPACS_1_1ULocalPosition.html">NLPACS::ULocalPosition</a> &position, <font class="keywordtype">bool</font> &snapped)<font class="keyword"> const</font> +01112 <font class="keyword"></font>{ +01113 <font class="comment">// first preselect faces around the (x, y) position (CQuadGrid ?)</font> +01114 vector<uint32> selection; +01115 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_3">_FaceGrid</a>.select(position.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>, selection); +01116 +01117 <font class="comment">// from the preselect faces, look for the only face that belongs to the surface</font> +01118 <font class="comment">// and that contains the position</font> +01119 CVector pos = position.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>; +01120 CVector posh = pos+CVector(0.0f, 0.0f, 1.0f); +01121 CVector2f pos2d = position.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>; +01122 <font class="keywordtype">float</font> bestDist = 1.0e10f; +01123 CVector best; +01124 vector<uint32>::iterator it; +01125 snapped = <font class="keyword">false</font>; +01126 <font class="keywordflow">for</font> (it=selection.begin(); it!=selection.end(); ++it) +01127 { +01128 <font class="keyword">const</font> CInteriorFace &f = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_2">_InteriorFaces</a>[*it]; +01129 <font class="keywordflow">if</font> (f.Surface == (uint32)position.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m0">Surface</a>) +01130 { +01131 CVector <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[3]; +01132 <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0] = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_1">_InteriorVertices</a>[f.Verts[0]]; +01133 <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1] = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_1">_InteriorVertices</a>[f.Verts[1]]; +01134 <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2] = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_1">_InteriorVertices</a>[f.Verts[2]]; +01135 +01136 CVector2f n; +01137 <font class="keywordtype">float</font> c; <font class="comment">// 2D cartesian coefficients of line in plane X/Y.</font> +01138 <font class="comment">// Line p0-p1.</font> +01139 n = CVector2f(-(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1].<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>-<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0].<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>), (<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1].<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>-<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0].<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>)).normed(); +01140 c = -(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0].x*n.x + <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0].y*n.y); +01141 <font class="keywordflow">if</font> (n*pos2d + c < -1.0f/<a class="code" href="namespaceNLPACS.html#a14">Vector2sAccuracy</a>) <font class="keywordflow">continue</font>; +01142 <font class="comment">// Line p1-p2.</font> +01143 n = CVector2f(-(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2].<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>-<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1].<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>), (<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2].<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>-<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1].<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>)).normed(); +01144 c = -(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1].x*n.x + <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1].y*n.y); +01145 <font class="keywordflow">if</font> (n*pos2d + c < -1.0f/<a class="code" href="namespaceNLPACS.html#a14">Vector2sAccuracy</a>) <font class="keywordflow">continue</font>; +01146 <font class="comment">// Line p2-p0.</font> +01147 n = CVector2f(-(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0].<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>-<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2].<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>), (<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0].<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>-<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2].<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>)).normed(); +01148 c = -(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2].x*n.x + <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2].y*n.y); +01149 <font class="keywordflow">if</font> (n*pos2d + c < -1.0f/<a class="code" href="namespaceNLPACS.html#a14">Vector2sAccuracy</a>) <font class="keywordflow">continue</font>; +01150 +01151 CPlane p; +01152 p.make(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0], <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1], <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2]); +01153 +01154 CVector i = p.intersect(pos, posh); +01155 +01156 <font class="keywordtype">float</font> d = (float)fabs(pos.z-i.z); +01157 +01158 <font class="keywordflow">if</font> (d < bestDist) +01159 { +01160 bestDist = d; +01161 best = i; +01162 } +01163 } +01164 } +01165 +01166 <font class="comment">// and computes the real position on this face</font> +01167 <font class="keywordflow">if</font> (bestDist < 50.0f) +01168 { +01169 snapped = <font class="keyword">true</font>; +01170 position.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a> = best; +01171 } +01172 } +01173 +<a name="l01174"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#a3">01174</a> <font class="keywordtype">float</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a3">NLPACS::CLocalRetriever::getHeight</a>(<font class="keyword">const</font> <a class="code" href="classNLPACS_1_1ULocalPosition.html">NLPACS::ULocalPosition</a> &position)<font class="keyword"> const</font> +01175 <font class="keyword"></font>{ +01176 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n9">_Type</a> == <a class="code" href="classNLPACS_1_1CLocalRetriever.html#s2s1">Interior</a>) +01177 { +01178 <font class="comment">// first preselect faces around the (x, y) position (CQuadGrid ?)</font> +01179 vector<uint32> selection; +01180 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_3">_FaceGrid</a>.select(position.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>, selection); +01181 +01182 <font class="comment">// from the preselect faces, look for the only face that belongs to the surface</font> +01183 <font class="comment">// and that contains the position</font> +01184 CVector pos = position.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>; +01185 CVector posh = pos+CVector(0.0f, 0.0f, 1.0f); +01186 <font class="keywordtype">float</font> bestDist = 1.0e10f; +01187 CVector best; +01188 vector<uint32>::iterator it; +01189 <font class="keywordflow">for</font> (it=selection.begin(); it!=selection.end(); ++it) +01190 { +01191 <font class="keyword">const</font> CInteriorFace &f = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_2">_InteriorFaces</a>[*it]; +01192 <font class="keywordflow">if</font> (f.Surface == (uint32)position.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m0">Surface</a>) +01193 { +01194 CVector <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[3]; +01195 <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0] = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_1">_InteriorVertices</a>[f.Verts[0]]; +01196 <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1] = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_1">_InteriorVertices</a>[f.Verts[1]]; +01197 <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2] = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_1">_InteriorVertices</a>[f.Verts[2]]; +01198 +01199 <font class="keywordtype">float</font> a,b,c; <font class="comment">// 2D cartesian coefficients of line in plane X/Y.</font> +01200 <font class="comment">// Line p0-p1.</font> +01201 a = -(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1].y-<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0].y); +01202 b = (<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1].x-<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0].x); +01203 c = -(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0].x*a + <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0].y*b); +01204 <font class="keywordflow">if</font> (a*pos.x + b*pos.y + c < 0) <font class="keywordflow">continue</font>; +01205 <font class="comment">// Line p1-p2.</font> +01206 a = -(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2].y-<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1].y); +01207 b = (<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2].x-<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1].x); +01208 c = -(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1].x*a + <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1].y*b); +01209 <font class="keywordflow">if</font> (a*pos.x + b*pos.y + c < 0) <font class="keywordflow">continue</font>; +01210 <font class="comment">// Line p2-p0.</font> +01211 a = -(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0].y-<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2].y); +01212 b = (<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0].x-<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2].x); +01213 c = -(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2].x*a + <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2].y*b); +01214 <font class="keywordflow">if</font> (a*pos.x + b*pos.y + c < 0) <font class="keywordflow">continue</font>; +01215 +01216 CPlane p; +01217 p.make(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[0], <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[1], <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>[2]); +01218 +01219 CVector i = p.intersect(pos, posh); +01220 +01221 <font class="keywordtype">float</font> d = (float)fabs(pos.z-i.z); +01222 +01223 <font class="keywordflow">if</font> (d < bestDist) +01224 { +01225 bestDist = d; +01226 best = i; +01227 } +01228 } +01229 } +01230 +01231 <font class="comment">// and computes the real position on this face</font> +01232 <font class="keywordflow">return</font> (bestDist < 50.0f) ? best.z : position.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>.<a class="code" href="classNLMISC_1_1CVector.html#m2">z</a>; +01233 } +01234 <font class="keywordflow">else</font> +01235 { +01236 +01237 <font class="comment">// find quad leaf.</font> +01238 <font class="keyword">const</font> CQuadLeaf *leaf = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[position.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m0">Surface</a>].getQuadTree().getLeaf(position.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>); +01239 +01240 <font class="comment">// if there is no acceptable leaf, just give up</font> +01241 <font class="keywordflow">if</font> (leaf == NULL) +01242 { +01243 <font class="comment">//nlinfo("COL: quadtree: don't find the quadLeaf!");</font> +01244 <font class="keywordflow">return</font> position.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>.<a class="code" href="classNLMISC_1_1CVector.html#m2">z</a>; +01245 } +01246 <font class="keywordflow">else</font> +01247 { +01248 <font class="comment">// else return mean height.</font> +01249 <font class="keywordtype">float</font> meanHeight = (leaf->getMinHeight()+leaf->getMaxHeight())*0.5f; +01250 <font class="keywordflow">return</font> meanHeight; +01251 } +01252 +01253 <font class="comment">// return _Surfaces[position.Surface].getQuadTree().getInterpZ(position.Estimation);</font> +01254 } +01255 } +01256 +01257 +01258 +01259 <font class="preprocessor">#ifdef NL_OS_WINDOWS</font> +01260 <font class="preprocessor"></font><font class="preprocessor">#pragma optimize( "", off )</font> +01261 <font class="preprocessor"></font><font class="preprocessor">#endif // NL_OS_WINDOWS</font> +01262 <font class="preprocessor"></font> +01263 <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#a4">NLPACS::CLocalRetriever::findPath</a>(<font class="keyword">const</font> <a class="code" href="classNLPACS_1_1CLocalRetriever_1_1CLocalPosition.html">NLPACS::CLocalRetriever::CLocalPosition</a> &A, +01264 <font class="keyword">const</font> <a class="code" href="classNLPACS_1_1CLocalRetriever_1_1CLocalPosition.html">NLPACS::CLocalRetriever::CLocalPosition</a> &B, +01265 std::vector<NLPACS::CVector2s> &path, +01266 <a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html">NLPACS::CCollisionSurfaceTemp</a> &cst)<font class="keyword"> const</font> +01267 <font class="keyword"></font>{ +01268 <font class="keywordflow">if</font> (A.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m0">Surface</a> != B.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m0">Surface</a>) +01269 { +01270 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"in NLPACS::CLocalRetriever::findPath()"</font>); +01271 <a class="code" href="debug_8h.html#a3">nlerror</a>(<font class="stringliteral">"Try to find a path between 2 points that are not in the same surface (A=%d, B=%d)"</font>, A.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m0">Surface</a>, B.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m0">Surface</a>); +01272 } +01273 +01274 CVector a = A.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>, +01275 b = B.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>, +01276 n = CVector(a.y-b.y, b.x-a.x, 0.0f); +01277 +01278 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n8">_ChainQuad</a>.selectEdges(a, b, cst); +01279 +01281 vector<CIntersectionMarker> intersections; +01282 +01283 uint i, j; +01284 sint32 surfaceId = A.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m0">Surface</a>; +01285 <font class="keyword">const</font> CRetrievableSurface &surface = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>[surfaceId]; +01286 +01287 <font class="keywordflow">for</font> (i=0; i<cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m1">EdgeChainEntries</a>.size(); ++i) +01288 { +01289 CEdgeChainEntry &entry = cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m1">EdgeChainEntries</a>[i]; +01290 <font class="keyword">const</font> COrderedChain &chain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[entry.OChainId]; +01291 +01292 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain.getParentId()].getLeft() != surfaceId && +01293 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain.getParentId()].getRight() != surfaceId) +01294 <font class="keywordflow">continue</font>; +01295 +01296 <font class="keywordflow">for</font> (j=entry.EdgeStart; j<entry.EdgeEnd; ++j) +01297 { +01298 <font class="comment">// here the edge collision test</font> +01299 +01300 CVector p0 = chain[j].unpack3f(), +01301 p1 = chain[j+1].unpack3f(); +01302 +01303 <font class="keywordtype">float</font> vp0 = (p0-a)*n, +01304 vp1 = (p1-a)*n; +01305 +01306 <font class="keywordflow">if</font> (vp0*vp1 <= 0.0f) +01307 { +01308 CVector np = CVector(p0.y-p1.y, p1.x-p0.x, 0.0f); +01309 +01310 <font class="keywordtype">float</font> va = (a-p0)*np, +01311 vb = (b-p0)*np; +01312 +01313 <font class="comment">// here we have an intersection</font> +01314 <font class="keywordflow">if</font> (va*vb <= 0.0f) +01315 { +01316 <font class="keyword">const</font> CChain &parent = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[chain.getParentId()]; +01317 <font class="keywordtype">bool</font> isIn = (va-vb < 0.0f) ^ (parent.getLeft() == surfaceId) ^ chain.isForward(); +01318 +01319 intersections.push_back(CIntersectionMarker(va/(va-vb), entry.OChainId, j, isIn)); +01320 } +01321 } +01322 } +01323 } +01324 +01325 sort(intersections.begin(), intersections.end()); +01326 +01327 uint intersStart = 0; +01328 uint intersEnd = intersections.size(); +01329 +01330 <font class="keywordflow">if</font> (intersEnd > 0) +01331 { +01332 <font class="keywordflow">while</font> (intersStart < intersections.size() && +01333 intersections[intersStart].In && intersections[intersStart].Position < 1.0e-4f) +01334 ++intersStart; +01335 +01336 <font class="keywordflow">while</font> (intersStart < intersEnd && +01337 !intersections[intersEnd-1].In && intersections[intersEnd-1].Position > 1.0f-1.0e-4f) +01338 --intersEnd; +01339 +01340 <font class="comment">// Check intersections have a valid order</font> +01341 <font class="keywordflow">if</font> ((intersEnd-intersStart) & 1) +01342 { +01343 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"in NLPACS::CLocalRetriever::findPath()"</font>); +01344 <a class="code" href="debug_8h.html#a3">nlerror</a>(<font class="stringliteral">"Found an odd (%d) number of intersections"</font>, intersections.size()); +01345 } +01346 +01347 <font class="keywordflow">for</font> (i=intersStart; i<intersEnd; ) +01348 { +01349 uint exitLoop, enterLoop; +01350 +01351 <font class="keyword">const</font> CChain &exitChain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[intersections[i].OChain].getParentId()]; +01352 exitLoop = (exitChain.getLeft() == surfaceId) ? exitChain.getLeftLoop() : exitChain.getRightLoop(); +01353 +01354 <font class="keywordflow">if</font> (intersections[i++].In) +01355 { +01356 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"in NLPACS::CLocalRetriever::findPath()"</font>); +01357 <a class="code" href="debug_8h.html#a3">nlerror</a>(<font class="stringliteral">"Entered the surface before exited"</font>, intersections.size()); +01358 } +01359 +01360 <font class="keyword">const</font> CChain &enterChain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[intersections[i].OChain].getParentId()]; +01361 enterLoop = (enterChain.getLeft() == surfaceId) ? enterChain.getLeftLoop() : enterChain.getRightLoop(); +01362 +01363 <font class="keywordflow">if</font> (!intersections[i++].In) +01364 { +01365 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"in NLPACS::CLocalRetriever::findPath()"</font>); +01366 <a class="code" href="debug_8h.html#a3">nlerror</a>(<font class="stringliteral">"Exited twice the surface"</font>, intersections.size()); +01367 } +01368 +01369 <font class="keywordflow">if</font> (exitLoop != enterLoop) +01370 { +01371 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"in NLPACS::CLocalRetriever::findPath()"</font>); +01372 <a class="code" href="debug_8h.html#a3">nlerror</a>(<font class="stringliteral">"Exited and rentered by a different loop"</font>); +01373 } +01374 } +01375 } +01376 +01377 <font class="comment">// dumpSurface(surfaceId);</font> +01378 +01379 path.push_back(CVector2s(A.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>)); +01380 +01381 <font class="keywordflow">for</font> (i=intersStart; i<intersEnd; ) +01382 { +01383 uint exitChainId = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[intersections[i].OChain].getParentId(), +01384 enterChainId = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[intersections[i+1].OChain].getParentId(); +01385 <font class="keyword">const</font> CChain &exitChain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[exitChainId], +01386 &enterChain = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[enterChainId]; +01387 uint loopId, exitLoopIndex, enterLoopIndex; +01388 +01389 <font class="keywordflow">if</font> (exitChain.getLeft() == surfaceId) +01390 { +01391 loopId = exitChain.getLeftLoop(); +01392 exitLoopIndex = exitChain.getLeftLoopIndex(); +01393 } +01394 <font class="keywordflow">else</font> +01395 { +01396 loopId = exitChain.getRightLoop(); +01397 exitLoopIndex = exitChain.getRightLoopIndex(); +01398 } +01399 +01400 <font class="keyword">const</font> CRetrievableSurface::TLoop &loop = surface._Loops[loopId]; +01401 +01402 <font class="keywordflow">if</font> (enterChain.getLeft() == surfaceId) +01403 enterLoopIndex = enterChain.getLeftLoopIndex(); +01404 <font class="keywordflow">else</font> +01405 enterLoopIndex = enterChain.getRightLoopIndex(); +01406 +01407 <font class="keywordtype">float</font> forwardLength = (exitChain.getLength()+enterChain.getLength())*0.5f; +01408 +01409 sint loopIndex = exitLoopIndex; +01410 uint thisChainId = exitChainId; +01411 <font class="keywordtype">bool</font> thisChainForward = (enterChain.getLeft() == surfaceId); +01412 uint thisOChainId = intersections[i].OChain; +01413 sint thisOChainIndex = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[thisOChainId].getIndexInParent(); +01414 <font class="keywordtype">bool</font> forward; +01415 +01416 <font class="keywordflow">if</font> (exitChainId != enterChainId) +01417 { +01418 <font class="keywordflow">for</font> (j=(exitLoopIndex+1)%loop.size(); j!=enterLoopIndex; j=(j+1)%loop.size()) +01419 forwardLength += <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[surface._Chains[loop[j]].Chain].getLength(); +01420 forward = (forwardLength <= loop.Length-forwardLength); +01421 } +01422 <font class="keywordflow">else</font> +01423 { +01424 forward = !thisChainForward ^ (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[intersections[i].OChain].getIndexInParent() < <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[intersections[i+1].OChain].getIndexInParent()); +01425 } +01426 +01427 path.push_back(CVector2s(A.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>+intersections[i].Position*(B.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>-A.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>))); +01428 +01429 <font class="keywordflow">while</font> (true) +01430 { +01431 sint from = (thisOChainId == intersections[i].OChain) ? intersections[i].Edge : -1, +01432 to = (thisOChainId == intersections[i+1].OChain) ? intersections[i+1].Edge : -1; +01433 <font class="keywordtype">bool</font> oforward = thisChainForward ^ forward ^ <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[thisOChainId].isForward(); +01434 +01435 <font class="keywordflow">if</font> (from != -1 && to != -1) +01436 oforward = (intersections[i].Edge < intersections[i+1].Edge); +01437 +01438 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>[thisOChainId].traverse(from, to, oforward, path); +01439 +01440 <font class="keywordflow">if</font> (thisOChainId == intersections[i+1].OChain) +01441 <font class="keywordflow">break</font>; +01442 +01443 thisOChainIndex = (thisChainForward ^ forward) ? thisOChainIndex-1 : thisOChainIndex+1; +01444 +01445 <font class="keywordflow">if</font> (thisOChainIndex < 0 || thisOChainIndex >= (sint)<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[thisChainId]._SubChains.size()) +01446 { +01447 <font class="keywordflow">if</font> (forward) +01448 { +01449 loopIndex++; +01450 <font class="keywordflow">if</font> (loopIndex == (sint)loop.size()) +01451 loopIndex = 0; +01452 } +01453 <font class="keywordflow">else</font> +01454 { +01455 loopIndex--; +01456 <font class="keywordflow">if</font> (loopIndex < 0) +01457 loopIndex = loop.size()-1; +01458 } +01459 +01460 thisChainId = surface._Chains[loop[loopIndex]].Chain; +01461 thisChainForward = (<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[thisChainId].getLeft() == surfaceId); +01462 thisOChainIndex = (thisChainForward && forward || !thisChainForward && !forward) ? +01463 0 : <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[thisChainId]._SubChains.size()-1; +01464 } +01465 +01466 thisOChainId = <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n2">_Chains</a>[thisChainId]._SubChains[thisOChainIndex]; +01467 } +01468 +01469 path.push_back(CVector2s(A.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>+intersections[i+1].Position*(B.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>-A.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>))); +01470 i += 2; +01471 } +01472 +01473 path.push_back(CVector2s(B.<a class="code" href="classNLPACS_1_1ULocalPosition.html#m1">Estimation</a>)); +01474 } +01475 <font class="preprocessor">#ifdef NL_OS_WINDOWS</font> +01476 <font class="preprocessor"></font><font class="preprocessor">#pragma optimize( "", on ) </font> +01477 <font class="preprocessor"></font><font class="preprocessor">#endif // NL_OS_WINDOWS</font> +01478 <font class="preprocessor"></font> +01479 <font class="comment">// ***************************************************************************</font> +01480 <font class="comment">// ***************************************************************************</font> +01481 <font class="comment">// Collisions part.</font> +01482 <font class="comment">// ***************************************************************************</font> +01483 <font class="comment">// ***************************************************************************</font> +01484 +01485 +01486 <font class="comment">// ***************************************************************************</font> +<a name="l01487"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z946_0">01487</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z946_0">NLPACS::CLocalRetriever::computeCollisionChainQuad</a>() +01488 { +01489 <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n8">_ChainQuad</a>.build(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n0">_OrderedChains</a>); +01490 } +01491 +01492 +01493 <font class="comment">// ***************************************************************************</font> +<a name="l01494"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z946_1">01494</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z946_1">NLPACS::CLocalRetriever::testCollision</a>(CCollisionSurfaceTemp &cst, <font class="keyword">const</font> CAABBox &bboxMove, <font class="keyword">const</font> CVector2f &transBase)<font class="keyword"> const</font> +01495 <font class="keyword"></font>{ +01496 <font class="comment">// H_AUTO(PACS_LR_testCollision);</font> +01497 +01498 sint i; +01499 +01500 <font class="comment">// 0. select ordered chains in the chainquad.</font> +01501 <font class="comment">//=====================================</font> +01502 <font class="comment">// H_BEFORE(PACS_LR_testCol_selEdges);</font> +01503 sint nEce= <a class="code" href="classNLPACS_1_1CLocalRetriever.html#n8">_ChainQuad</a>.selectEdges(bboxMove, cst); +01504 <font class="comment">// H_AFTER(PACS_LR_testCol_selEdges);</font> +01505 <font class="comment">// NB: cst.OChainLUT is assured to be full of 0xFFFF after this call (if was right before).</font> +01506 +01507 +01508 <font class="comment">// 1. regroup them in chains. build cst.CollisionChains</font> +01509 <font class="comment">//=====================================</font> +01510 <font class="comment">// NB: use cst.OChainLUT to look if a Chain has been inserted before.</font> +01511 uint16 *chainLUT= cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m0">OChainLUT</a>; +01512 +01513 <font class="comment">// bkup where we begin to add chains.</font> +01514 uint firstChainAdded= cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m7">CollisionChains</a>.size(); +01515 +01516 <font class="comment">// For all edgechain entry.</font> +01517 <font class="keywordflow">for</font>(i=0;i<nEce;i++) +01518 { +01519 CEdgeChainEntry &ece= cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m1">EdgeChainEntries</a>[i]; +01520 <font class="comment">// this is the ordered chain in the retriever.</font> +01521 <font class="keyword">const</font> COrderedChain &oChain= this-><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z944_2">getOrderedChains</a>()[ece.OChainId]; +01522 <font class="comment">// this is the id of the chain is the local retriever.</font> +01523 uint16 chainId= oChain.getParentId(); +01524 +01525 +01526 <font class="comment">// add/retrieve the id in cst.CollisionChains.</font> +01527 <font class="comment">//=================================</font> +01528 uint ccId; +01529 <font class="comment">// if never added.</font> +01530 <font class="keywordflow">if</font>(chainLUT[chainId]==0xFFFF) +01531 { +01532 <font class="comment">// H_AUTO(PACS_LR_testCol_addToLUT);</font> +01533 <font class="comment">// add a new CCollisionChain.</font> +01534 ccId= cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m7">CollisionChains</a>.size(); +01535 cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m7">CollisionChains</a>.push_back(CCollisionChain()); +01536 <font class="comment">// Fill it with default.</font> +01537 cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m7">CollisionChains</a>[ccId].Tested= <font class="keyword">false</font>; +01538 cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m7">CollisionChains</a>[ccId].ExteriorEdge = <font class="keyword">false</font>; +01539 cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m7">CollisionChains</a>[ccId].FirstEdgeCollide= 0xFFFFFFFF; +01540 cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m7">CollisionChains</a>[ccId].ChainId= chainId; +01541 <font class="comment">// Fill Left right info.</font> +01542 cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m7">CollisionChains</a>[ccId].LeftSurface.SurfaceId= this-><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z944_6">getChains</a>()[chainId].getLeft(); +01543 cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m7">CollisionChains</a>[ccId].RightSurface.SurfaceId= this-><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z944_6">getChains</a>()[chainId].getRight(); +01544 <font class="comment">// NB: cst.CollisionChains[ccId].*Surface.RetrieverInstanceId is not filled here because we don't have</font> +01545 <font class="comment">// this info at this level.</font> +01546 +01547 <font class="comment">// store this Id in the LUT of chains.</font> +01548 chainLUT[chainId]= ccId; +01549 } +01550 <font class="keywordflow">else</font> +01551 { +01552 <font class="comment">// get the id of this collision chain.</font> +01553 ccId= chainLUT[chainId]; +01554 } +01555 +01556 <font class="comment">// add edge collide to the list.</font> +01557 <font class="comment">//=================================</font> +01558 <font class="comment">// H_BEFORE(PACS_LR_testCol_addToList);</font> +01559 CCollisionChain &colChain= cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m7">CollisionChains</a>[ccId]; +01560 <font class="keyword">const</font> std::vector<CVector2s> &oChainVertices= oChain.getVertices(); +01561 <font class="keywordflow">for</font>(sint edge=ece.EdgeStart; edge<ece.EdgeEnd; edge++) +01562 { +01563 CVector2f p0= oChainVertices[edge].unpack(); +01564 CVector2f p1= oChainVertices[edge+1].unpack(); +01565 +01566 <font class="comment">// alloc a new edgeCollide.</font> +01567 uint32 ecnId= cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#z930_1">allocEdgeCollideNode</a>(); +01568 CEdgeCollideNode &ecn= cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#z930_2">getEdgeCollideNode</a>(ecnId); +01569 +01570 <font class="comment">// append to the front of the list.</font> +01571 ecn.Next= colChain.FirstEdgeCollide; +01572 colChain.FirstEdgeCollide= ecnId; +01573 +01574 <font class="comment">// build this edge.</font> +01575 p0+= transBase; +01576 p1+= transBase; +01577 ecn.make(p0, p1); +01578 } +01579 <font class="comment">// H_AFTER(PACS_LR_testCol_addToList);</font> +01580 } +01581 +01582 +01583 +01584 <font class="comment">// 2. Reset LUT to 0xFFFF.</font> +01585 <font class="comment">//=====================================</font> +01586 +01587 <font class="comment">// H_BEFORE(PACS_LR_testCol_resetLUT);</font> +01588 <font class="comment">// for all collisions chains inserted (starting from firstChainAdded), reset LUT.</font> +01589 <font class="keywordflow">for</font>(i=firstChainAdded; i<(sint)cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m7">CollisionChains</a>.size(); i++) +01590 { +01591 uint ccId= cst.<a class="code" href="classNLPACS_1_1CCollisionSurfaceTemp.html#m7">CollisionChains</a>[i].ChainId; +01592 chainLUT[ccId]= 0xFFFF; +01593 } +01594 <font class="comment">// H_AFTER(PACS_LR_testCol_resetLUT);</font> +01595 } +01596 +01597 +01598 <font class="comment">// ***************************************************************************</font> +01599 <font class="comment">// ***************************************************************************</font> +01600 <font class="comment">// ***************************************************************************</font> +01601 <font class="comment">// ***************************************************************************</font> +01602 +01603 +01604 <font class="comment">// ***************************************************************************</font> +<a name="l01605"></a><a class="code" href="classNLPACS_1_1CLocalRetriever.html#z944_18">01605</a> <font class="keywordtype">void</font> <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z944_18">NLPACS::CLocalRetriever::buildInteriorSurfaceBBoxes</a>(std::vector<NLMISC::CAABBox> &surfaceBBoxes)<font class="keyword"> const</font> +01606 <font class="keyword"></font>{ +01607 <font class="comment">// resize dest, and init.</font> +01608 vector<bool> firstTriangle; +01609 surfaceBBoxes.clear(); +01610 surfaceBBoxes.resize(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size()); +01611 firstTriangle.resize(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size(), <font class="keyword">true</font>); +01612 +01613 <font class="comment">// For all _InteriorFaces.</font> +01614 <font class="keywordflow">for</font>(uint iIntFace=0; iIntFace<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_2">_InteriorFaces</a>.size(); iIntFace++) +01615 { +01616 <font class="keyword">const</font> CInteriorFace &intFace= <a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_2">_InteriorFaces</a>[iIntFace]; +01617 +01618 <font class="comment">// Extend the surface of this face with her 3 points.</font> +01619 +01620 <font class="comment">// check good id.</font> +01621 <font class="keywordflow">if</font>(intFace.Surface==(uint)-1) +01622 <font class="keywordflow">continue</font>; +01623 <a class="code" href="debug_8h.html#a6">nlassert</a>(intFace.Surface<<a class="code" href="classNLPACS_1_1CLocalRetriever.html#n3">_Surfaces</a>.size()); +01624 +01625 <font class="comment">// If first time we extend the bbox of this surface</font> +01626 <font class="keywordflow">if</font>(firstTriangle[intFace.Surface]) +01627 { +01628 surfaceBBoxes[intFace.Surface].setCenter(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_1">_InteriorVertices</a>[intFace.Verts[0]] ); +01629 firstTriangle[intFace.Surface]= <font class="keyword">false</font>; +01630 } +01631 <font class="keywordflow">else</font> +01632 surfaceBBoxes[intFace.Surface].extend(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_1">_InteriorVertices</a>[intFace.Verts[0]] ); +01633 +01634 <font class="comment">// extend with other 2 points</font> +01635 surfaceBBoxes[intFace.Surface].extend(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_1">_InteriorVertices</a>[intFace.Verts[1]] ); +01636 surfaceBBoxes[intFace.Surface].extend(<a class="code" href="classNLPACS_1_1CLocalRetriever.html#z942_1">_InteriorVertices</a>[intFace.Verts[2]] ); +01637 } +01638 +01639 } +</pre></div> + +<!-- footer --> +<BR><FONT Size=+5> </FONT> +</TD> +<TD WIDTH=15><IMG SRC=http://www.nevrax.org/inc/img/pixel.gif WIDTH=15 HEIGHT=15 BORDER=0 ALT=""></TD> +</TR> +</TABLE> +</BODY> +</HTML> |