diff options
Diffstat (limited to 'docs/doxygen/nel/move__container_8cpp-source.html')
-rw-r--r-- | docs/doxygen/nel/move__container_8cpp-source.html | 2001 |
1 files changed, 2001 insertions, 0 deletions
diff --git a/docs/doxygen/nel/move__container_8cpp-source.html b/docs/doxygen/nel/move__container_8cpp-source.html new file mode 100644 index 00000000..45922319 --- /dev/null +++ b/docs/doxygen/nel/move__container_8cpp-source.html @@ -0,0 +1,2001 @@ +<!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>move_container.cpp</h1><a href="move__container_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="move__primitive_8h.html">pacs/move_primitive.h</a>"</font> +00029 <font class="preprocessor">#include "<a class="code" href="move__element_8h.html">pacs/move_element.h</a>"</font> +00030 <font class="preprocessor">#include "<a class="code" href="pacs_2primitive__block_8h.html">pacs/primitive_block.h</a>"</font> +00031 +00032 <font class="preprocessor">#include "<a class="code" href="hierarchical__timer_8h.html">nel/misc/hierarchical_timer.h</a>"</font> +00033 +00034 <font class="preprocessor">#include "<a class="code" href="i__xml_8h.html">nel/misc/i_xml.h</a>"</font> +00035 <font class="preprocessor">#include <math.h></font> +00036 <font class="preprocessor">#include <float.h></font> +00037 +00038 <font class="keyword">using</font> <font class="keyword">namespace </font>NLMISC; +00039 +<a name="l00040"></a><a class="code" href="move__container_8cpp.html#a0">00040</a> <font class="preprocessor">#define NELPACS_ALLOC_DYNAMIC_INFO 100</font> +<a name="l00041"></a><a class="code" href="move__container_8cpp.html#a1">00041</a> <font class="preprocessor"></font><font class="preprocessor">#define NELPACS_ALLOC_STATIC_INFO 100</font> +00042 <font class="preprocessor"></font> +00043 <font class="keyword">namespace </font>NLPACS +00044 { +00045 +00046 <font class="comment">// ***************************************************************************</font> +00047 +<a name="l00048"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a2">00048</a> CMoveContainer::~CMoveContainer () +00049 { +00050 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c0">clear</a> (); +00051 } +00052 +00053 <font class="comment">// ***************************************************************************</font> +00054 +<a name="l00055"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c0">00055</a> <font class="keywordtype">void</font> CMoveContainer::clear () +00056 { +00057 <font class="comment">// Clear all primitives</font> +00058 std::set<CMovePrimitive*>::iterator ite=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o2">_PrimitiveSet</a>.begin(); +00059 <font class="keywordflow">while</font> (ite!=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o2">_PrimitiveSet</a>.end ()) +00060 { +00061 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c20">freePrimitive</a> (*ite); +00062 ite++; +00063 } +00064 +00065 <font class="comment">// Clear primitive set</font> +00066 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o2">_PrimitiveSet</a>.clear (); +00067 +00068 <font class="comment">// Clear root changed</font> +00069 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o3">_ChangedRoot</a>.clear (); +00070 +00071 <font class="comment">// Clear static world image set</font> +00072 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o4">_StaticWorldImage</a>.clear (); +00073 +00074 <font class="comment">// Clear cell array</font> +00075 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o18">_VectorCell</a>.clear (); +00076 +00077 <font class="comment">// Clear time ot</font> +00078 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>.clear (); +00079 } +00080 +00081 <font class="comment">// ***************************************************************************</font> +00082 +<a name="l00083"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a3">00083</a> <font class="keywordtype">void</font> CMoveContainer::init (<font class="keywordtype">double</font> xmin, <font class="keywordtype">double</font> ymin, <font class="keywordtype">double</font> xmax, <font class="keywordtype">double</font> ymax, uint widthCellCount, uint heightCellCount, +00084 <font class="keywordtype">double</font> primitiveMaxSize, uint8 numWorldImage, uint maxIteration, uint otSize) +00085 { +00086 <font class="comment">// Clear arrays</font> +00087 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c0">clear</a> (); +00088 +00089 <font class="comment">// Create world images</font> +00090 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o3">_ChangedRoot</a>.resize (numWorldImage); +00091 <font class="keywordflow">for</font> (uint i=0; i<numWorldImage; i++) +00092 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o3">_ChangedRoot</a>[i]=NULL; +00093 +00094 <font class="comment">// Not in test mode</font> +00095 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o19">_Retriever</a>=NULL; +00096 +00097 <font class="comment">// Element size</font> +00098 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o9">_PrimitiveMaxSize</a>=primitiveMaxSize; +00099 +00100 <font class="comment">// BB</font> +00101 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o10">_Xmin</a>=xmin; +00102 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o11">_Ymin</a>=ymin; +00103 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o12">_Xmax</a>=xmax; +00104 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o13">_Ymax</a>=ymax; +00105 +00106 <font class="comment">// Cells count</font> +00107 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o16">_CellCountWidth</a>=widthCellCount; +00108 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o17">_CellCountHeight</a>=heightCellCount; +00109 +00110 <font class="comment">// Cells size</font> +00111 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o14">_CellWidth</a>=(<a class="code" href="classNLPACS_1_1CMoveContainer.html#o12">_Xmax</a> - <a class="code" href="classNLPACS_1_1CMoveContainer.html#o10">_Xmin</a>)/(double)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o16">_CellCountWidth</a>; +00112 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o15">_CellHeight</a>=(<a class="code" href="classNLPACS_1_1CMoveContainer.html#o13">_Ymax</a> - <a class="code" href="classNLPACS_1_1CMoveContainer.html#o11">_Ymin</a>)/(double)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o17">_CellCountHeight</a>; +00113 +00114 <font class="comment">// Cell array</font> +00115 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o18">_VectorCell</a>.resize (numWorldImage); +00116 <font class="keywordflow">for</font> (uint j=0; j<numWorldImage; j++) +00117 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o18">_VectorCell</a>[j].resize (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o16">_CellCountWidth</a> * <a class="code" href="classNLPACS_1_1CMoveContainer.html#o17">_CellCountHeight</a>); +00118 +00119 <font class="comment">// resize OT</font> +00120 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o5">_OtSize</a>=otSize; +00121 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>.resize (otSize); +00122 +00123 <font class="comment">// Clear the OT</font> +00124 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c4">clearOT</a> (); +00125 +00126 <font class="comment">// Clear test time</font> +00127 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o0">_TestTime</a>=0xffffffff; +00128 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o1">_MaxTestIteration</a>=maxIteration; +00129 +00130 <font class="comment">// Resize trigger array</font> +00131 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o21">_Triggers</a>.resize (<a class="code" href="move__container_8h.html#a0">NELPACS_CONTAINER_TRIGGER_DEFAULT_SIZE</a>); +00132 } +00133 +00134 <font class="comment">// ***************************************************************************</font> +00135 +<a name="l00136"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a4">00136</a> <font class="keywordtype">void</font> CMoveContainer::init (CGlobalRetriever* retriever, uint widthCellCount, uint heightCellCount, <font class="keywordtype">double</font> primitiveMaxSize, +00137 uint8 numWorldImage, uint maxIteration, uint otSize) +00138 { +00139 <font class="comment">// Get min max of the global retriever BB</font> +00140 CVector <a class="code" href="bit__set_8cpp.html#a0">min</a>=retriever->getBBox().getMin(); +00141 CVector max=retriever->getBBox().getMax(); +00142 +00143 <font class="comment">// Setup min max</font> +00144 <font class="keywordtype">double</font> xmin=<a class="code" href="bit__set_8cpp.html#a0">min</a>.x; +00145 <font class="keywordtype">double</font> ymin=<a class="code" href="bit__set_8cpp.html#a0">min</a>.y; +00146 <font class="keywordtype">double</font> xmax=max.x; +00147 <font class="keywordtype">double</font> ymax=max.y; +00148 +00149 <font class="comment">// Init</font> +00150 <a class="code" href="classNLPACS_1_1CMoveContainer.html#a3">init</a> (xmin, ymin, xmax, ymax, widthCellCount, heightCellCount, primitiveMaxSize, numWorldImage, maxIteration, otSize); +00151 +00152 <font class="comment">// Init the retriever</font> +00153 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o19">_Retriever</a>=retriever; +00154 } +00155 +00156 <font class="comment">// ***************************************************************************</font> +00157 +<a name="l00158"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a12">00158</a> <font class="keywordtype">void</font> CMoveContainer::evalCollision (<font class="keywordtype">double</font> deltaTime, uint8 worldImage) +00159 { +00160 NL_ALLOC_CONTEXT( Pacs ) +00161 +00162 <font class="comment">// H_AUTO(PACS_MC_evalCollision);</font> +00163 +00164 <font class="comment">// New test time</font> +00165 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o0">_TestTime</a>++; +00166 +00167 <font class="comment">// Delta time</font> +00168 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>=deltaTime; +00169 +00170 <font class="comment">// Clear triggers</font> +00171 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o21">_Triggers</a>.clear (); +00172 +00173 <font class="comment">// Update the bounding box and position of modified primitives</font> +00174 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c1">updatePrimitives</a> (0.f, worldImage); +00175 +00176 <font class="preprocessor">#ifdef NL_DEBUG</font> +00177 <font class="preprocessor"></font> <font class="comment">// Check list integrity</font> +00178 <font class="comment">//checkSortedList ();</font> +00179 <font class="preprocessor">#endif // NL_DEBUG</font> +00180 <font class="preprocessor"></font> +00181 <font class="comment">// Get first collision</font> +00182 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o7">_PreviousCollisionNode</a> = &<a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>[0]; +00183 +00184 <font class="comment">// Eval all collisions</font> +00185 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c9">evalAllCollisions</a> (0.f, worldImage); +00186 +00187 <font class="comment">// Clear modified list</font> +00188 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c13">clearModifiedList</a> (worldImage); +00189 +00190 <font class="comment">// Modified list is empty at this point</font> +00191 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o3">_ChangedRoot</a>[worldImage]==NULL); +00192 +00193 <font class="comment">// Previous node is a 'hard' OT node</font> +00194 <a class="code" href="debug_8h.html#a6">nlassert</a> (!<a class="code" href="classNLPACS_1_1CMoveContainer.html#o7">_PreviousCollisionNode</a>->isInfo()); +00195 +00196 <font class="comment">// Get next collision</font> +00197 CCollisionOTInfo *nextCollision=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o7">_PreviousCollisionNode</a>->getNextInfo (); +00198 +00199 <font class="comment">// Collision ?</font> +00200 <font class="keywordflow">while</font> (nextCollision) +00201 { +00202 <font class="comment">// Get new previous OT hard node</font> +00203 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o7">_PreviousCollisionNode</a>=nextCollision->getPrevious (); +00204 +00205 <font class="comment">// Previous node is a 'hard' OT node</font> +00206 <a class="code" href="debug_8h.html#a6">nlassert</a> (!<a class="code" href="classNLPACS_1_1CMoveContainer.html#o7">_PreviousCollisionNode</a>->isInfo()); +00207 +00208 <font class="comment">// Keep this collision</font> +00209 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c29">reaction</a> (*nextCollision); +00210 +00211 <font class="comment">// Last time</font> +00212 <font class="keywordtype">double</font> newTime=nextCollision->getCollisionTime (); +00213 +00214 <font class="comment">// Remove modified objects from the OT</font> +00215 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c14">removeModifiedFromOT</a> (worldImage); +00216 +00217 <font class="comment">// Must have been removed</font> +00218 <a class="code" href="debug_8h.html#a6">nlassert</a> (nextCollision->getPrevious ()==NULL); +00219 <a class="code" href="debug_8h.html#a6">nlassert</a> (nextCollision->CCollisionOT::getNext ()==NULL); +00220 +00221 <font class="comment">// Update the bounding box and position of modified primitives</font> +00222 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c1">updatePrimitives</a> (newTime, worldImage); +00223 +00224 <font class="comment">// Eval all collisions of modified objects for the new delta t</font> +00225 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c9">evalAllCollisions</a> (newTime, worldImage); +00226 +00227 <font class="comment">// Clear modified list</font> +00228 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c13">clearModifiedList</a> (worldImage); +00229 +00230 <font class="comment">// Get next collision</font> +00231 nextCollision=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o7">_PreviousCollisionNode</a>->getNextInfo (); +00232 } +00233 +00234 <font class="preprocessor">#ifdef NL_DEBUG</font> +00235 <font class="preprocessor"></font> <font class="comment">// OT must be cleared</font> +00236 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c5">checkOT</a> (); +00237 <font class="preprocessor">#endif // NL_DEBUG</font> +00238 <font class="preprocessor"></font> +00239 <font class="comment">// Free ordered table info</font> +00240 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c18">freeAllOTInfo</a> (); +00241 +00242 <font class="comment">// Some init</font> +00243 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o7">_PreviousCollisionNode</a>=NULL; +00244 } +00245 +00246 <font class="comment">// ***************************************************************************</font> +00247 +<a name="l00248"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a14">00248</a> <font class="keywordtype">bool</font> CMoveContainer::testMove (UMovePrimitive* primitive, <font class="keyword">const</font> CVectorD& speed, <font class="keywordtype">double</font> deltaTime, uint8 worldImage, CVectorD *contactNormal) +00249 { +00250 NL_ALLOC_CONTEXT( Pacs ) +00251 +00252 <font class="comment">// H_AUTO(PACS_MC_testMove);</font> +00253 +00254 <font class="keywordflow">if</font> (contactNormal) +00255 *contactNormal = CVectorD::Null; +00256 +00257 <font class="comment">// Cast</font> +00258 <a class="code" href="debug_8h.html#a6">nlassert</a> (dynamic_cast<CMovePrimitive*>(primitive)); +00259 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a>* prim=static_cast<CMovePrimitive*>(primitive); +00260 +00261 <font class="comment">// New test time</font> +00262 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o0">_TestTime</a>++; +00263 +00264 <font class="comment">// Delta time</font> +00265 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>=deltaTime; +00266 +00267 <font class="comment">// Get the world image primitive</font> +00268 uint8 primitiveWorldImage; +00269 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI; +00270 <font class="keywordflow">if</font> (prim->isNonCollisionable ()) +00271 { +00272 wI=prim->getWorldImage (0); +00273 primitiveWorldImage=worldImage; +00274 } +00275 <font class="keywordflow">else</font> +00276 { +00277 wI=prim->getWorldImage (worldImage); +00278 primitiveWorldImage=worldImage; +00279 } +00280 +00281 <font class="comment">// Backup speed</font> +00282 CVectorD oldSpeed=wI->getSpeed (); +00283 +00284 <font class="comment">// Set speed</font> +00285 wI->move (speed, *<font class="keyword">this</font>, *prim, primitiveWorldImage); +00286 +00287 <font class="comment">// Update the bounding box and position of the primitive</font> +00288 wI->update (0, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>, *prim); +00289 +00290 <font class="comment">// Compute cells overlaped by the primitive</font> +00291 <font class="keywordflow">if</font> (!prim->isNonCollisionable ()) +00292 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c2">updateCells</a> (prim, worldImage); +00293 +00294 <font class="preprocessor">#ifdef NL_DEBUG</font> +00295 <font class="preprocessor"></font> <font class="comment">// Check list integrity</font> +00296 <font class="comment">// checkSortedList ();</font> +00297 <font class="preprocessor">#endif // NL_DEBUG</font> +00298 <font class="preprocessor"></font> +00299 <font class="comment">// Result</font> +00300 <font class="keywordtype">bool</font> result=<font class="keyword">false</font>; +00301 <font class="keywordtype">bool</font> testMoveValid; +00302 +00303 <font class="comment">// Eval first each static world images</font> +00304 result=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c6">evalOneTerrainCollision</a> (0, prim, primitiveWorldImage, <font class="keyword">true</font>, testMoveValid, NULL, contactNormal); +00305 +00306 <font class="comment">// Eval first each static world images</font> +00307 <font class="keywordflow">if</font> (!result) +00308 { +00309 std::set<uint8>::iterator ite=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o4">_StaticWorldImage</a>.begin(); +00310 <font class="keywordflow">while</font> (ite!=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o4">_StaticWorldImage</a>.end()) +00311 { +00312 +00313 <font class="comment">// Eval in this world image</font> +00314 result=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c7">evalOnePrimitiveCollision</a> (0, prim, *ite, primitiveWorldImage, <font class="keyword">true</font>, <font class="keyword">true</font>, testMoveValid, NULL, contactNormal); +00315 +00316 <font class="comment">// If found, abort</font> +00317 <font class="keywordflow">if</font> (result) +00318 <font class="keywordflow">break</font>; +00319 +00320 <font class="comment">// Next world image</font> +00321 ite++; +00322 } +00323 } +00324 +00325 <font class="comment">// Eval collisions if not found and not tested</font> +00326 <font class="keywordflow">if</font> ((!result) && (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o4">_StaticWorldImage</a>.find (worldImage)==<a class="code" href="classNLPACS_1_1CMoveContainer.html#o4">_StaticWorldImage</a>.end())) +00327 result=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c7">evalOnePrimitiveCollision</a> (0, prim, worldImage, primitiveWorldImage, <font class="keyword">true</font>, <font class="keyword">false</font>, testMoveValid, NULL, contactNormal); +00328 +00329 <font class="comment">// Backup speed only if the primitive is inserted in the world image</font> +00330 <font class="keywordflow">if</font> (prim->isInserted (primitiveWorldImage)) +00331 wI->move (oldSpeed, *<font class="keyword">this</font>, *prim, primitiveWorldImage); +00332 +00333 <font class="preprocessor">#ifdef NL_DEBUG</font> +00334 <font class="preprocessor"></font> <font class="comment">// OT must be cleared</font> +00335 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c5">checkOT</a> (); +00336 <font class="preprocessor">#endif // NL_DEBUG</font> +00337 <font class="preprocessor"></font> +00338 <font class="comment">// Free ordered table info</font> +00339 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c18">freeAllOTInfo</a> (); +00340 +00341 <font class="comment">// Some init</font> +00342 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o7">_PreviousCollisionNode</a>=NULL; +00343 +00344 <font class="comment">// Return result</font> +00345 <font class="keywordflow">return</font> !result; +00346 } +00347 +00348 <font class="comment">// ***************************************************************************</font> +00349 +<a name="l00350"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c1">00350</a> <font class="keywordtype">void</font> CMoveContainer::updatePrimitives (<font class="keywordtype">double</font> beginTime, uint8 worldImage) +00351 { +00352 <font class="comment">// H_AUTO(PACS_MC_updatePrimitives);</font> +00353 +00354 <font class="comment">// For each changed primitives</font> +00355 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a> *<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o3">_ChangedRoot</a>[worldImage]; +00356 <font class="keywordflow">while</font> (changed) +00357 { +00358 <font class="comment">// Get the primitive world image</font> +00359 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI; +00360 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>->isNonCollisionable()) +00361 wI=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>->getWorldImage (0); +00362 <font class="keywordflow">else</font> +00363 wI=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>->getWorldImage (worldImage); +00364 +00365 <font class="comment">// Force the build of the bounding box</font> +00366 wI->update (beginTime, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>, *<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>); +00367 +00368 <font class="comment">// Is inserted in this world image ?</font> +00369 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>->isInserted (worldImage)) +00370 { +00371 +00372 <font class="comment">// Compute cells overlaped by the primitive</font> +00373 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c2">updateCells</a> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>, worldImage); +00374 } +00375 +00376 <font class="comment">// Next primitive</font> +00377 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>=wI->getNextModified (); +00378 } +00379 } +00380 +00381 <font class="comment">// ***************************************************************************</font> +00382 +<a name="l00383"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c2">00383</a> <font class="keywordtype">void</font> CMoveContainer::updateCells (CMovePrimitive *primitive, uint8 worldImage) +00384 { +00385 <font class="comment">// H_AUTO(PACS_MC_updateCells);</font> +00386 +00387 <font class="comment">// Get the primitive world image</font> +00388 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI=primitive->getWorldImage (worldImage); +00389 +00390 <font class="comment">// Check BB width not too large</font> +00391 <font class="keywordflow">if</font> (wI->getBBXMax() - wI->getBBXMin() > <a class="code" href="classNLPACS_1_1CMoveContainer.html#o14">_CellWidth</a>) +00392 { +00393 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"Primitives have moved more than a cell."</font>); +00394 } +00395 +00396 <font class="comment">// Check BB height not too large</font> +00397 <font class="keywordflow">if</font> (wI->getBBYMax() - wI->getBBYMin() > <a class="code" href="classNLPACS_1_1CMoveContainer.html#o15">_CellHeight</a>) +00398 { +00399 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"Primitives have moved more than a cell."</font>); +00400 } +00401 +00402 <font class="comment">// Get coordinate in the cell array</font> +00403 sint minx=(int)floor ((wI->getBBXMin() - <a class="code" href="classNLPACS_1_1CMoveContainer.html#o10">_Xmin</a>) / <a class="code" href="classNLPACS_1_1CMoveContainer.html#o14">_CellWidth</a>); +00404 sint miny=(int)floor ((wI->getBBYMin() - <a class="code" href="classNLPACS_1_1CMoveContainer.html#o11">_Ymin</a>) / <a class="code" href="classNLPACS_1_1CMoveContainer.html#o15">_CellHeight</a>); +00405 sint maxx=(int)floor ((wI->getBBXMax() - <a class="code" href="classNLPACS_1_1CMoveContainer.html#o10">_Xmin</a>) / <a class="code" href="classNLPACS_1_1CMoveContainer.html#o14">_CellWidth</a>); +00406 sint maxy=(int)floor ((wI->getBBYMax() - <a class="code" href="classNLPACS_1_1CMoveContainer.html#o11">_Ymin</a>) / <a class="code" href="classNLPACS_1_1CMoveContainer.html#o15">_CellHeight</a>); +00407 +00408 <font class="comment">// Born</font> +00409 <font class="keywordflow">if</font> (minx<0) +00410 minx=0; +00411 <font class="keywordflow">if</font> (miny<0) +00412 miny=0; +00413 <font class="keywordflow">if</font> (maxx>=(int)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o16">_CellCountWidth</a>) +00414 maxx=(int)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o16">_CellCountWidth</a>-1; +00415 <font class="keywordflow">if</font> (maxy>=(int)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o17">_CellCountHeight</a>) +00416 maxy=(int)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o17">_CellCountHeight</a>-1; +00417 +00418 maxx=<a class="code" href="bit__set_8cpp.html#a0">std::min</a> (minx+1, maxx); +00419 maxy=<a class="code" href="bit__set_8cpp.html#a0">std::min</a> (miny+1, maxy); +00420 +00421 <font class="comment">// flags founded</font> +00422 <font class="keywordtype">bool</font> found[4]={<font class="keyword">false</font>, <font class="keyword">false</font>, <font class="keyword">false</font>, <font class="keyword">false</font>}; +00423 +00424 <font class="comment">// For each old cells</font> +00425 uint i; +00426 <font class="keywordflow">for</font> (i=0; i<4; i++) +00427 { +00428 <font class="comment">// Element</font> +00429 CMoveElement *elm = wI->getMoveElement (i); +00430 +00431 <font class="comment">// Old element in this cell ?</font> +00432 <font class="keywordflow">if</font> ( elm ) +00433 { +00434 <font class="comment">// Check</font> +00435 <a class="code" href="debug_8h.html#a6">nlassert</a> (elm->X<<a class="code" href="classNLPACS_1_1CMoveContainer.html#o16">_CellCountWidth</a>); +00436 <a class="code" href="debug_8h.html#a6">nlassert</a> (elm->Y<<a class="code" href="classNLPACS_1_1CMoveContainer.html#o17">_CellCountHeight</a>); +00437 +00438 <font class="comment">// Must remove it ?</font> +00439 <font class="keywordflow">if</font> ( (elm->X < minx) || (elm->X > maxx) || (elm->Y < miny) || (elm->Y > maxy) ) +00440 { +00441 <font class="comment">// Yes remove it</font> +00442 wI->removeMoveElement (i, *<font class="keyword">this</font>, worldImage); +00443 } +00444 <font class="keywordflow">else</font> +00445 { +00446 <font class="comment">// Checks</font> +00447 <a class="code" href="debug_8h.html#a6">nlassert</a> (((elm->X - minx)==0)||((elm->X - minx)==1)); +00448 <a class="code" href="debug_8h.html#a6">nlassert</a> (((elm->Y - miny)==0)||((elm->Y - miny)==1)); +00449 +00450 <font class="comment">// Update position</font> +00451 <font class="preprocessor">#ifndef TEST_CELL</font> +00452 <font class="preprocessor"></font> <a class="code" href="classNLPACS_1_1CMoveContainer.html#o18">_VectorCell</a>[worldImage][elm->X+elm->Y*<a class="code" href="classNLPACS_1_1CMoveContainer.html#o16">_CellCountWidth</a>].updateSortedLists (elm, worldImage); +00453 <font class="preprocessor">#endif</font> +00454 <font class="preprocessor"></font> +00455 <font class="comment">// Check found cells</font> +00456 found[ elm->X - minx + ((elm->Y - miny) << (maxx-minx)) ]=<font class="keyword">true</font>; +00457 } +00458 } +00459 } +00460 +00461 <font class="comment">// For each case selected</font> +00462 <font class="keywordtype">int</font> <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>; +00463 i=0; +00464 <font class="keywordflow">for</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=miny; <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a><=(int)maxy; <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>++) +00465 <font class="keywordflow">for</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=minx; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a><=(int)maxx; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>++) +00466 { +00467 <font class="comment">// Check the formula</font> +00468 <a class="code" href="debug_8h.html#a6">nlassert</a> ((<font class="keywordtype">int</font>)i == (<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a> - minx + ((<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a> - miny) << (maxx-minx)) )); +00469 +00470 <font class="comment">// If the cell is not found</font> +00471 <font class="keywordflow">if</font> (!found[i]) +00472 { +00473 <font class="comment">// Center of the cell</font> +00474 <font class="keywordtype">double</font> cx=((double)<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>+0.5f)*<a class="code" href="classNLPACS_1_1CMoveContainer.html#o14">_CellWidth</a>+<a class="code" href="classNLPACS_1_1CMoveContainer.html#o10">_Xmin</a>; +00475 <font class="keywordtype">double</font> cy=((double)<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>+0.5f)*<a class="code" href="classNLPACS_1_1CMoveContainer.html#o15">_CellHeight</a>+<a class="code" href="classNLPACS_1_1CMoveContainer.html#o11">_Ymin</a>; +00476 +00477 <font class="comment">// Add it in the list</font> +00478 wI->addMoveElement (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o18">_VectorCell</a>[worldImage][<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>+<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>*<a class="code" href="classNLPACS_1_1CMoveContainer.html#o16">_CellCountWidth</a>], (uint16)<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, (uint16)<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, cx, cy, primitive, *<font class="keyword">this</font>, worldImage); +00479 } +00480 +00481 <font class="comment">// Next cell</font> +00482 i++; +00483 } +00484 } +00485 +00486 <font class="comment">// ***************************************************************************</font> +00487 +<a name="l00488"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c3">00488</a> <font class="keywordtype">void</font> CMoveContainer::getCells (CMovePrimitive *primitive, uint8 worldImage, uint8 primitiveWorldImage, CMoveElement **elementArray) +00489 { +00490 <font class="comment">// H_AUTO(PACS_MC_getCells);</font> +00491 +00492 <font class="comment">// Get the primitive world image</font> +00493 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI; +00494 <font class="keywordflow">if</font> (primitive->isNonCollisionable()) +00495 wI=primitive->getWorldImage (0); +00496 <font class="keywordflow">else</font> +00497 wI=primitive->getWorldImage (primitiveWorldImage); +00498 +00499 <font class="comment">// Check BB width not too large</font> +00500 <font class="keywordflow">if</font> (wI->getBBXMax() - wI->getBBXMin() > <a class="code" href="classNLPACS_1_1CMoveContainer.html#o14">_CellWidth</a>) +00501 { +00502 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"Primitives have moved more than a cell."</font>); +00503 } +00504 +00505 <font class="comment">// Check BB height not too large</font> +00506 <font class="keywordflow">if</font> (wI->getBBYMax() - wI->getBBYMin() > <a class="code" href="classNLPACS_1_1CMoveContainer.html#o15">_CellHeight</a>) +00507 { +00508 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"Primitives have moved more than a cell."</font>); +00509 } +00510 +00511 <font class="comment">// Get coordinate in the cell array</font> +00512 <font class="keywordtype">int</font> minx=(int)floor ((wI->getBBXMin() - <a class="code" href="classNLPACS_1_1CMoveContainer.html#o10">_Xmin</a>) / <a class="code" href="classNLPACS_1_1CMoveContainer.html#o14">_CellWidth</a>); +00513 <font class="keywordtype">int</font> miny=(int)floor ((wI->getBBYMin() - <a class="code" href="classNLPACS_1_1CMoveContainer.html#o11">_Ymin</a>) / <a class="code" href="classNLPACS_1_1CMoveContainer.html#o15">_CellHeight</a>); +00514 <font class="keywordtype">int</font> maxx=(int)floor ((wI->getBBXMax() - <a class="code" href="classNLPACS_1_1CMoveContainer.html#o10">_Xmin</a>) / <a class="code" href="classNLPACS_1_1CMoveContainer.html#o14">_CellWidth</a>); +00515 <font class="keywordtype">int</font> maxy=(int)floor ((wI->getBBYMax() - <a class="code" href="classNLPACS_1_1CMoveContainer.html#o11">_Ymin</a>) / <a class="code" href="classNLPACS_1_1CMoveContainer.html#o15">_CellHeight</a>); +00516 +00517 <font class="comment">// Born</font> +00518 <font class="keywordflow">if</font> (minx<0) +00519 minx=0; +00520 <font class="keywordflow">if</font> (miny<0) +00521 miny=0; +00522 <font class="keywordflow">if</font> (maxx>=(int)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o16">_CellCountWidth</a>) +00523 maxx=(int)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o16">_CellCountWidth</a>-1; +00524 <font class="keywordflow">if</font> (maxy>=(int)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o17">_CellCountHeight</a>) +00525 maxy=(int)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o17">_CellCountHeight</a>-1; +00526 +00527 maxx=<a class="code" href="bit__set_8cpp.html#a0">std::min</a> (minx+1, maxx); +00528 maxy=<a class="code" href="bit__set_8cpp.html#a0">std::min</a> (miny+1, maxy); +00529 +00530 <font class="comment">// For each case selected</font> +00531 <font class="keywordtype">int</font> <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>; +00532 <font class="keywordtype">int</font> i=0; +00533 <font class="keywordflow">for</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=miny; <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a><=(int)maxy; <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>++) +00534 <font class="keywordflow">for</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=minx; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a><=(int)maxx; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>++) +00535 { +00536 <font class="comment">// Check the formula</font> +00537 <a class="code" href="debug_8h.html#a6">nlassert</a> ((<font class="keywordtype">int</font>)i == (<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a> - minx + ((<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a> - miny) << (maxx-minx)) )); +00538 +00539 <font class="comment">// Center of the cell</font> +00540 <font class="keywordtype">double</font> cx=((double)<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>+0.5f)*<a class="code" href="classNLPACS_1_1CMoveContainer.html#o14">_CellWidth</a>+<a class="code" href="classNLPACS_1_1CMoveContainer.html#o10">_Xmin</a>; +00541 +00542 <font class="comment">// Primitive center</font> +00543 <font class="keywordtype">double</font> pcx=(wI->getBBXMin()+wI->getBBXMax())/2.f; +00544 +00545 elementArray[i]->Primitive=primitive; +00546 elementArray[i]->X=<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>; +00547 elementArray[i]->Y=<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>; +00548 <font class="comment">// Insert in left or right ?</font> +00549 <font class="keywordflow">if</font> (pcx<cx) +00550 { +00551 <font class="comment">// In the left</font> +00552 elementArray[i]->NextX=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o18">_VectorCell</a>[worldImage][<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>+<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>*<a class="code" href="classNLPACS_1_1CMoveContainer.html#o16">_CellCountWidth</a>].getFirstX (); +00553 elementArray[i]->PreviousX=NULL; +00554 } +00555 <font class="keywordflow">else</font> +00556 { +00557 <font class="comment">// In the right</font> +00558 elementArray[i]->PreviousX=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o18">_VectorCell</a>[worldImage][<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>+<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>*<a class="code" href="classNLPACS_1_1CMoveContainer.html#o16">_CellCountWidth</a>].getLastX (); +00559 elementArray[i]->NextX=NULL; +00560 } +00561 +00562 <font class="comment">// Next cell</font> +00563 i++; +00564 } +00565 +00566 <font class="comment">// Erase last array element</font> +00567 <font class="keywordflow">for</font> (; i<4; i++) +00568 { +00569 elementArray[i]=NULL; +00570 } +00571 } +00572 +00573 <font class="comment">// ***************************************************************************</font> +00574 +<a name="l00575"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c13">00575</a> <font class="keywordtype">void</font> CMoveContainer::clearModifiedList (uint8 worldImage) +00576 { +00577 <font class="comment">// For each changed primitives</font> +00578 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a> *<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o3">_ChangedRoot</a>[worldImage]; +00579 <font class="keywordflow">while</font> (changed) +00580 { +00581 <font class="comment">// Get the world image primitive</font> +00582 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI; +00583 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>->isNonCollisionable()) +00584 wI=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>->getWorldImage (0); +00585 <font class="keywordflow">else</font> +00586 wI=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>->getWorldImage (worldImage); +00587 +00588 <font class="comment">// Next primitive</font> +00589 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>=wI->getNextModified (); +00590 +00591 <font class="comment">// Remove it from the list</font> +00592 wI->setInModifiedListFlag (<font class="keyword">false</font>); +00593 } +00594 +00595 <font class="comment">// Empty list</font> +00596 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o3">_ChangedRoot</a>[worldImage]=NULL; +00597 } +00598 +00599 <font class="comment">// ***************************************************************************</font> +00600 +<a name="l00601"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c15">00601</a> <font class="keywordtype">void</font> CMoveContainer::checkSortedList () +00602 { +00603 <font class="comment">// Check each primitives in the set</font> +00604 std::set<CMovePrimitive*>::iterator ite=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o2">_PrimitiveSet</a>.begin(); +00605 <font class="keywordflow">while</font> (ite!=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o2">_PrimitiveSet</a>.end()) +00606 { +00607 <font class="comment">// Check</font> +00608 (*ite)->checkSortedList (); +00609 +00610 ite++; +00611 } +00612 } +00613 +00614 <font class="comment">// ***************************************************************************</font> +00615 +<a name="l00616"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c6">00616</a> <font class="keywordtype">bool</font> CMoveContainer::evalOneTerrainCollision (<font class="keywordtype">double</font> beginTime, CMovePrimitive *primitive, uint8 primitiveWorldImage, +00617 <font class="keywordtype">bool</font> testMove, <font class="keywordtype">bool</font> &testMoveValid, CCollisionOTStaticInfo *staticColInfo, CVectorD *contactNormal) +00618 { +00619 <font class="comment">// H_AUTO(PACS_MC_evalOneCollision);</font> +00620 +00621 <font class="comment">// Find its collisions</font> +00622 <font class="keywordtype">bool</font> found=<font class="keyword">false</font>; +00623 +00624 <font class="comment">// Get the primitive world image</font> +00625 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI; +00626 <font class="keywordflow">if</font> (primitive->isNonCollisionable()) +00627 wI=primitive->getWorldImage (0); +00628 <font class="keywordflow">else</font> +00629 wI=primitive->getWorldImage (primitiveWorldImage); +00630 +00631 <font class="comment">// Begin time must be the same as beginTime</font> +00632 <a class="code" href="debug_8h.html#a6">nlassert</a> (wI->getInitTime()==beginTime); +00633 +00634 <font class="comment">// Test its static collision</font> +00635 <font class="keywordflow">if</font> (_Retriever) +00636 { +00637 <font class="comment">// Delta pos..</font> +00638 <font class="comment">// Test retriever with the primitive</font> +00639 <font class="keyword">const</font> <a class="code" href="namespaceNLPACS.html#a0">TCollisionSurfaceDescVector</a> *result=wI->evalCollision (*<a class="code" href="classNLPACS_1_1CMoveContainer.html#o19">_Retriever</a>, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o20">_SurfaceTemp</a>, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o0">_TestTime</a>, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o1">_MaxTestIteration</a>, *primitive); +00640 <font class="keywordflow">if</font> (result) +00641 { +00642 <font class="comment">// TEST MOVE MUST BE OK !!</font> +00643 testMoveValid=<font class="keyword">true</font>; +00644 +00645 <font class="comment">// Size of the array</font> +00646 uint size=result->size(); +00647 +00648 <font class="comment">// For each detected collisions</font> +00649 <font class="keywordflow">for</font> (uint c=0; c<size; c++) +00650 { +00651 <font class="comment">// Ref on the collision</font> +00652 CCollisionSurfaceDesc desc=(*result)[c]; +00653 <font class="keywordtype">double</font> contactTime = (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>-beginTime)*desc.ContactTime+beginTime; +00654 +00655 <font class="comment">/*</font> +00656 <font class="comment"> * If beginTime is 0.999999999 and desc.ContactTime<1.0, contactTime will be 1.0.</font> +00657 <font class="comment"> * In this case, we force contactTime to be beginTime to avoid collision at time == 1.0.</font> +00658 <font class="comment"> **/</font> +00659 <font class="keywordflow">if</font> ((contactTime >= 1.0) && (beginTime < 1.0) && (desc.ContactTime < 1.0)) +00660 contactTime = beginTime; +00661 +00662 <font class="comment">// Set the container's time space contact time</font> +00663 desc.ContactTime = contactTime; +00664 +00665 <font class="comment">// ptr on the surface</font> +00666 <font class="keyword">const</font> CRetrievableSurface *surf= <a class="code" href="classNLPACS_1_1CMoveContainer.html#o19">_Retriever</a>->getSurfaceById (desc.ContactSurface); +00667 +00668 <font class="comment">// TODO: check surface flags against primitive flags HERE:</font> +00669 <font class="comment">// Is a wall ?</font> +00670 <font class="keywordtype">bool</font> isWall; +00671 <font class="keywordflow">if</font>(!surf) +00672 isWall= <font class="keyword">true</font>; +00673 <font class="keywordflow">else</font> +00674 isWall= !(surf->isFloor() || surf->isCeiling()); +00675 +00676 <font class="comment">// stop on a wall.</font> +00677 <font class="keywordflow">if</font>(isWall) +00678 { +00679 <font class="comment">// Test move ?</font> +00680 <font class="keywordflow">if</font> (testMove) +00681 { +00682 <font class="comment">// return contact normal only when testmove and vector provided</font> +00683 <font class="keywordflow">if</font> (contactNormal) +00684 *contactNormal = desc.ContactNormal; +00685 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00686 } +00687 <font class="keywordflow">else</font> +00688 { +00689 <font class="comment">// OK, collision if we are a collisionable primitive</font> +00690 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c10">newCollision</a> (primitive, desc, primitiveWorldImage, beginTime, staticColInfo); +00691 +00692 <font class="comment">// One collision found</font> +00693 found=<font class="keyword">true</font>; +00694 <font class="keywordflow">break</font>; +00695 } +00696 } +00697 } +00698 } +00699 <font class="keywordflow">else</font> +00700 <font class="comment">// More than maxtest made, exit</font> +00701 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00702 } +00703 <font class="keywordflow">return</font> found; +00704 } +00705 +00706 <font class="comment">// ***************************************************************************</font> +00707 +<a name="l00708"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c7">00708</a> <font class="keywordtype">bool</font> CMoveContainer::evalOnePrimitiveCollision (<font class="keywordtype">double</font> beginTime, CMovePrimitive *primitive, uint8 worldImage, uint8 primitiveWorldImage, +00709 <font class="keywordtype">bool</font> testMove, <font class="keywordtype">bool</font> secondIsStatic, <font class="keywordtype">bool</font> &testMoveValid, CCollisionOTDynamicInfo *dynamicColInfo, +00710 CVectorD *contactNormal) +00711 { +00712 <font class="comment">// H_AUTO(PACS_MC_evalOneCollision);</font> +00713 +00714 <font class="comment">// Find its collisions</font> +00715 <font class="keywordtype">bool</font> found=<font class="keyword">false</font>; +00716 +00717 <font class="comment">// Get the primitive world image</font> +00718 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI; +00719 <font class="keywordflow">if</font> (primitive->isNonCollisionable()) +00720 wI=primitive->getWorldImage (0); +00721 <font class="keywordflow">else</font> +00722 wI=primitive->getWorldImage (primitiveWorldImage); +00723 +00724 <font class="comment">// Begin time must be the same as beginTime</font> +00725 <a class="code" href="debug_8h.html#a6">nlassert</a> (wI->getInitTime()==beginTime); +00726 +00727 <font class="comment">// Element table</font> +00728 CMoveElement tableNotInserted[4]; +00729 CMoveElement *table[4]; +00730 +00731 <font class="comment">// Single test ?</font> +00732 <font class="keywordtype">bool</font> singleTest=<a class="code" href="classNLPACS_1_1CMoveContainer.html#a14">testMove</a>; +00733 +00734 <font class="comment">// Is in world image</font> +00735 <font class="keywordflow">if</font> ((worldImage==primitiveWorldImage) && wI->isInWorldImageFlag()) +00736 { +00737 <font class="comment">// Get move element table from the primitive</font> +00738 table[0]=wI->getMoveElement (0); +00739 table[1]=wI->getMoveElement (1); +00740 table[2]=wI->getMoveElement (2); +00741 table[3]=wI->getMoveElement (3); +00742 } +00743 <font class="keywordflow">else</font> +00744 { +00745 <font class="comment">// Set table pointers</font> +00746 table[0]=tableNotInserted+0; +00747 table[1]=tableNotInserted+1; +00748 table[2]=tableNotInserted+2; +00749 table[3]=tableNotInserted+3; +00750 +00751 <font class="comment">// Get cells</font> +00752 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c3">getCells</a> (primitive, worldImage, primitiveWorldImage, table); +00753 +00754 <font class="comment">// Force the test</font> +00755 singleTest=<font class="keyword">true</font>; +00756 } +00757 +00758 <font class="comment">// For each move element</font> +00759 <font class="keywordflow">for</font> (uint i=0; i<4; i++) +00760 { +00761 <font class="comment">// Get the element</font> +00762 CMoveElement *elm=table[i]; +00763 +00764 <font class="comment">// Element valid ?</font> +00765 <font class="keywordflow">if</font> (elm) +00766 { +00767 <font class="comment">// Check</font> +00768 <a class="code" href="debug_8h.html#a6">nlassert</a> (elm->Primitive==primitive); +00769 <font class="comment">// Primitive to the left</font> +00770 +00771 <font class="comment">// Lookup in X sorted list on the left</font> +00772 CMoveElement *other=elm->PreviousX; +00773 <a class="code" href="debug_8h.html#a6">nlassert</a> (other!=elm); +00774 +00775 <font class="keywordflow">while</font> (other && (wI->getBBXMin() - other->Primitive->getWorldImage(worldImage)->getBBXMin() < <a class="code" href="classNLPACS_1_1CMoveContainer.html#o9">_PrimitiveMaxSize</a>) ) +00776 { +00777 <font class="comment">// Other primitive</font> +00778 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a> *otherPrimitive=other->Primitive; +00779 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *otherWI=otherPrimitive->getWorldImage (worldImage); +00780 <a class="code" href="debug_8h.html#a6">nlassert</a> (otherPrimitive!=primitive); +00781 +00782 <font class="comment">// Continue the check if the other primitive is not int the modified list or if its pointer is higher than primitive</font> +00783 <font class="keywordflow">if</font> ( singleTest || ( (!otherWI->isInModifiedListFlag ()) || (primitive<otherPrimitive) ) ) +00784 { +00785 <font class="comment">// Look if valid in X</font> +00786 <font class="keywordflow">if</font> (wI->getBBXMin() < otherWI->getBBXMax()) +00787 { +00788 <font class="comment">// Look if valid in Y</font> +00789 <font class="keywordflow">if</font> ( (wI->getBBYMin() < otherWI->getBBYMax()) && (otherWI->getBBYMin() < wI->getBBYMax()) ) +00790 { +00791 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#c8">evalPrimAgainstPrimCollision</a> (beginTime, primitive, otherPrimitive, wI, otherWI, <a class="code" href="classNLPACS_1_1CMoveContainer.html#a14">testMove</a>, +00792 primitiveWorldImage, worldImage, secondIsStatic, dynamicColInfo, contactNormal)) +00793 { +00794 <font class="keywordflow">if</font> (testMove) +00795 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00796 found=<font class="keyword">true</font>; +00797 } +00798 } +00799 } +00800 } +00801 +00802 <font class="comment">// Next primitive to the left</font> +00803 other = other->PreviousX; +00804 } +00805 +00806 <font class="comment">// Lookup in X sorted list on the right</font> +00807 other=elm->NextX; +00808 +00809 <font class="comment">// Primitive to the right</font> +00810 <font class="keywordflow">while</font> (other && (other->Primitive->getWorldImage(worldImage)->getBBXMin() < wI->getBBXMax()) ) +00811 { +00812 <font class="comment">// Other primitive</font> +00813 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a> *otherPrimitive=other->Primitive; +00814 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *otherWI=otherPrimitive->getWorldImage (worldImage); +00815 <a class="code" href="debug_8h.html#a6">nlassert</a> (otherPrimitive!=primitive); +00816 +00817 <font class="comment">// Continue the check if the other primitive is not in the modified list or if its pointer is higher than primitive</font> +00818 <font class="keywordflow">if</font> ( singleTest || ( (!otherWI->isInModifiedListFlag ()) || (primitive<otherPrimitive) ) ) +00819 { +00820 <font class="comment">// Look if valid in Y</font> +00821 <font class="keywordflow">if</font> ( (wI->getBBYMin() < otherWI->getBBYMax()) && (otherWI->getBBYMin() < wI->getBBYMax()) ) +00822 { +00823 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#c8">evalPrimAgainstPrimCollision</a> (beginTime, primitive, otherPrimitive, wI, otherWI, <a class="code" href="classNLPACS_1_1CMoveContainer.html#a14">testMove</a>, +00824 primitiveWorldImage, worldImage, secondIsStatic, dynamicColInfo, contactNormal)) +00825 { +00826 <font class="keywordflow">if</font> (testMove) +00827 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00828 found=<font class="keyword">true</font>; +00829 } +00830 } +00831 } +00832 +00833 <font class="comment">// Next primitive to the left</font> +00834 other = other->NextX; +00835 } +00836 } +00837 } +00838 +00839 <font class="keywordflow">return</font> found; +00840 } +00841 +00842 <font class="comment">// ***************************************************************************</font> +00843 +<a name="l00844"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c8">00844</a> <font class="keywordtype">bool</font> CMoveContainer::evalPrimAgainstPrimCollision (<font class="keywordtype">double</font> beginTime, CMovePrimitive *primitive, CMovePrimitive *otherPrimitive, +00845 CPrimitiveWorldImage *wI, CPrimitiveWorldImage *otherWI, <font class="keywordtype">bool</font> testMove, +00846 uint8 firstWorldImage, uint8 secondWorldImage, <font class="keywordtype">bool</font> secondIsStatic, CCollisionOTDynamicInfo *dynamicColInfo, +00847 CVectorD *contactNormal) +00848 { +00849 <font class="comment">// H_AUTO(PACS_MC_evalPrimAgainstPrimCollision);</font> +00850 +00851 <font class="comment">// Test the primitive</font> +00852 <font class="keywordtype">double</font> firstTime, lastTime; +00853 +00854 <font class="comment">// Collision</font> +00855 CCollisionDesc desc; +00856 <font class="keywordflow">if</font> (wI->evalCollision (*otherWI, desc, beginTime, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o0">_TestTime</a>, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o1">_MaxTestIteration</a>, +00857 firstTime, lastTime, *primitive, *otherPrimitive)) +00858 { +00859 <font class="comment">// Enter or exit</font> +00860 <font class="keywordtype">bool</font> enter = (beginTime<=firstTime) && (firstTime<<a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>); +00861 <font class="keywordtype">bool</font> exit = (beginTime<=lastTime) && (lastTime<<a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>); +00862 <font class="keywordtype">bool</font> overlap = (firstTime<=beginTime) && (lastTime><a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>); +00863 <font class="keywordtype">bool</font> collision = ( beginTime<=((firstTime+lastTime)/2) ) && (firstTime<=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>); +00864 +00865 <font class="comment">// Return collision time</font> +00866 +00867 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#a14">testMove</a> && collision) +00868 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00869 <font class="keywordflow">else</font> +00870 { +00871 <font class="comment">// TODO: make new collision when collision==false to raise triggers</font> +00872 +00881 <font class="keywordflow">if</font> (primitive->isNonCollisionable () && (enter || exit || overlap)) +00882 { +00883 <font class="keywordflow">if</font> (primitive->isTriggered (*otherPrimitive, enter, exit)) +00884 { +00885 <font class="comment">// Add a trigger</font> +00886 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c12">newTrigger</a> (primitive, otherPrimitive, desc, enter ? UTriggerInfo::In : exit ? UTriggerInfo::Out : UTriggerInfo::Inside); +00887 } +00888 +00889 <font class="comment">// If the other primitive is not an obstacle, skip it because it will re-generate collisions.</font> +00890 <font class="keywordflow">if</font> (!otherPrimitive->isObstacle ()) +00891 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00892 } +00893 +00894 <font class="comment">// OK, collision</font> +00895 <font class="keywordflow">if</font> (collision) +00896 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c10">newCollision</a> (primitive, otherPrimitive, desc, collision, enter, exit, firstWorldImage, secondWorldImage, secondIsStatic, +00897 dynamicColInfo); +00898 +00899 <font class="comment">// Collision</font> +00900 <font class="keywordflow">return</font> collision; +00901 } +00902 } +00903 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00904 } +00905 +00906 <font class="comment">// ***************************************************************************</font> +00907 +<a name="l00908"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c9">00908</a> <font class="keywordtype">void</font> CMoveContainer::evalAllCollisions (<font class="keywordtype">double</font> beginTime, uint8 worldImage) +00909 { +00910 <font class="comment">// H_AUTO(PACS_MC_evalAllCollisions);</font> +00911 +00912 <font class="comment">// First primitive</font> +00913 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a> *primitive=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o3">_ChangedRoot</a>[worldImage]; +00914 +00915 <font class="comment">// For each modified primitive</font> +00916 <font class="keywordflow">while</font> (primitive) +00917 { +00918 <font class="comment">// Get the primitive world image</font> +00919 uint8 primitiveWorldImage; +00920 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI; +00921 <font class="keywordflow">if</font> (primitive->isNonCollisionable ()) +00922 { +00923 wI=primitive->getWorldImage (0); +00924 primitiveWorldImage=worldImage; +00925 } +00926 <font class="keywordflow">else</font> +00927 { +00928 wI=primitive->getWorldImage (worldImage); +00929 primitiveWorldImage=worldImage; +00930 } +00931 +00932 CVectorD d0=wI->getDeltaPosition(); +00933 +00934 <font class="comment">// Find a collision</font> +00935 <font class="keywordtype">bool</font> found=<font class="keyword">false</font>; +00936 <font class="keywordtype">bool</font> testMoveValid=<font class="keyword">false</font>; +00937 +00938 <font class="comment">// Eval collision on the terrain</font> +00939 found|=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c6">evalOneTerrainCollision</a> (beginTime, primitive, primitiveWorldImage, <font class="keyword">false</font>, testMoveValid, NULL, NULL); +00940 +00941 <font class="comment">// Eval collision in each static world image</font> +00942 std::set<uint8>::iterator ite=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o4">_StaticWorldImage</a>.begin(); +00943 <font class="keywordflow">while</font> (ite!=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o4">_StaticWorldImage</a>.end()) +00944 { +00945 <font class="comment">// Eval in this world image</font> +00946 found|=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c7">evalOnePrimitiveCollision</a> (beginTime, primitive, *ite, primitiveWorldImage, <font class="keyword">false</font>, <font class="keyword">true</font>, testMoveValid, NULL, NULL); +00947 +00948 <font class="comment">// Next world image</font> +00949 ite++; +00950 } +00951 +00952 CVectorD d1=wI->getDeltaPosition(); +00953 +00954 <font class="comment">// Eval collision in the world image if not already tested</font> +00955 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o4">_StaticWorldImage</a>.find (worldImage)==<a class="code" href="classNLPACS_1_1CMoveContainer.html#o4">_StaticWorldImage</a>.end()) +00956 found|=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c7">evalOnePrimitiveCollision</a> (beginTime, primitive, worldImage, primitiveWorldImage, <font class="keyword">false</font>, <font class="keyword">false</font>, testMoveValid, NULL, NULL); +00957 +00958 CVectorD d2=wI->getDeltaPosition(); +00959 +00960 <font class="comment">// No collision ?</font> +00961 <font class="keywordflow">if</font> (!found) +00962 { +00963 <a class="code" href="debug_8h.html#a6">nlassert</a> ((d0==d1)&&(d0==d2)); +00964 <font class="comment">// nlassert (f1==f2);</font> +00965 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o19">_Retriever</a>&&testMoveValid) +00966 { +00967 <font class="comment">// Do move</font> +00968 wI->doMove (*<a class="code" href="classNLPACS_1_1CMoveContainer.html#o19">_Retriever</a>, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o20">_SurfaceTemp</a>, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>, primitive->getDontSnapToGround()); +00969 } +00970 <font class="keywordflow">else</font> +00971 { +00972 <font class="comment">// Do move</font> +00973 wI->doMove (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>); +00974 } +00975 } +00976 +00977 <font class="comment">// Next primitive</font> +00978 primitive=wI->getNextModified (); +00979 } +00980 } +00981 +00982 <font class="comment">// ***************************************************************************</font> +00983 +<a name="l00984"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c10">00984</a> <font class="keywordtype">void</font> CMoveContainer::newCollision (CMovePrimitive* first, CMovePrimitive* second, <font class="keyword">const</font> CCollisionDesc& desc, <font class="keywordtype">bool</font> collision, <font class="keywordtype">bool</font> enter, <font class="keywordtype">bool</font> exit, +00985 uint firstWorldImage, uint secondWorldImage, <font class="keywordtype">bool</font> secondIsStatic, CCollisionOTDynamicInfo *dynamicColInfo) +00986 { +00987 <font class="comment">// H_AUTO(PACS_MC_newCollision_short);</font> +00988 +00989 <a class="code" href="debug_8h.html#a6">nlassert</a> ((dynamicColInfo && first->isNonCollisionable ()) || (!dynamicColInfo && first->isCollisionable ())); +00990 +00991 <font class="keywordflow">if</font> (dynamicColInfo) +00992 { +00993 dynamicColInfo->init (first, second, desc, collision, enter, exit, firstWorldImage, secondWorldImage, secondIsStatic); +00994 } +00995 <font class="keywordflow">else</font> +00996 { +00997 <font class="comment">// Get an ordered time index. Always round to the future.</font> +00998 <font class="keywordtype">int</font> <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>=(int)(ceil (desc.ContactTime*(<font class="keywordtype">double</font>)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o5">_OtSize</a>/<a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>) ); +00999 +01000 <font class="comment">// Clamp left.</font> +01001 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a><0) +01002 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>=0; +01003 +01004 <font class="comment">// If in time</font> +01005 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a><(int)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o5">_OtSize</a>) +01006 { +01007 <font class="comment">// Build info</font> +01008 CCollisionOTDynamicInfo *info = <a class="code" href="classNLPACS_1_1CMoveContainer.html#c16">allocateOTDynamicInfo</a> (); +01009 info->init (first, second, desc, collision, enter, exit, firstWorldImage, secondWorldImage, secondIsStatic); +01010 +01011 <font class="comment">// Add in the primitive list</font> +01012 first->addCollisionOTInfo (info); +01013 second->addCollisionOTInfo (info); +01014 +01015 <font class="comment">// Insert in the time ordered table</font> +01016 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a><(<font class="keywordtype">int</font>)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>.size()); +01017 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].link (info); +01018 +01019 <font class="comment">// Check it is after the last hard collision</font> +01020 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o7">_PreviousCollisionNode</a><=&<a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>]); +01021 } +01022 } +01023 } +01024 +01025 <font class="comment">// ***************************************************************************</font> +01026 +<a name="l01027"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c11">01027</a> <font class="keywordtype">void</font> CMoveContainer::newCollision (CMovePrimitive* first, <font class="keyword">const</font> CCollisionSurfaceDesc& desc, uint8 worldImage, <font class="keywordtype">double</font> beginTime, CCollisionOTStaticInfo *staticColInfo) +01028 { +01029 <font class="comment">// H_AUTO(PACS_MC_newCollision_long);</font> +01030 +01031 <font class="comment">// Check</font> +01032 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o19">_Retriever</a>); +01033 <a class="code" href="debug_8h.html#a6">nlassert</a> ((staticColInfo && first->isNonCollisionable ()) || (!staticColInfo && first->isCollisionable ())); +01034 +01035 <font class="comment">// Get the world image</font> +01036 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI; +01037 <font class="keywordflow">if</font> (first->isNonCollisionable()) +01038 wI=first->getWorldImage (0); +01039 <font class="keywordflow">else</font> +01040 wI=first->getWorldImage (worldImage); +01041 +01042 <font class="comment">// Time</font> +01043 <font class="keywordtype">double</font> time=desc.ContactTime; +01044 <font class="comment">/*</font> +01045 <font class="comment"> if (time == _DeltaTime)</font> +01046 <font class="comment"> time -= _DeltaTime*FLT_EPSILON;</font> +01047 <font class="comment">*/</font> +01048 +01049 <font class="comment">// Check time interval</font> +01050 <a class="code" href="debug_8h.html#a8">nlassertex</a> (beginTime<=time, (<font class="stringliteral">"beginTime=%f, time=%f"</font>, beginTime, time)); +01051 <a class="code" href="debug_8h.html#a8">nlassertex</a> (time<<a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>, (<font class="stringliteral">"time=%f, _DeltaTime=%f"</font>, time, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>)); +01052 +01053 <font class="comment">// Time of the collision.</font> +01054 time-=<a class="code" href="move__primitive_8h.html#a0">NELPACS_DIST_BACK</a>/wI->getSpeed().norm(); +01055 time=std::max(time, beginTime); +01056 <font class="keywordtype">double</font> ratio=(time-beginTime)/(<a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>-beginTime); +01057 <a class="code" href="debug_8h.html#a6">nlassert</a> (ratio>=0); +01058 <a class="code" href="debug_8h.html#a6">nlassert</a> (ratio<=1); +01059 +01060 <font class="keywordflow">if</font> (staticColInfo) +01061 { +01062 <font class="comment">// Make a new globalposition</font> +01063 UGlobalPosition endPosition=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o19">_Retriever</a>->doMove (wI->getGlobalPosition(), wI->getDeltaPosition(), +01064 (float)ratio, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o20">_SurfaceTemp</a>, <font class="keyword">false</font>); +01065 +01066 <font class="comment">// Init the info descriptor</font> +01067 staticColInfo->init (first, desc, endPosition, ratio, worldImage); +01068 } +01069 <font class="keywordflow">else</font> +01070 { +01071 <font class="comment">// Get an ordered time index. Always round to the future.</font> +01072 <font class="keywordtype">int</font> <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>=(int)(ceil (time*(<font class="keywordtype">double</font>)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o5">_OtSize</a>/<a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>) ); +01073 +01074 <font class="comment">// Clamp left.</font> +01075 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a><0) +01076 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>=0; +01077 +01078 <font class="comment">// If in time</font> +01079 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a><(int)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o5">_OtSize</a>) +01080 { +01081 <font class="comment">// Build info</font> +01082 CCollisionOTStaticInfo *info = <a class="code" href="classNLPACS_1_1CMoveContainer.html#c17">allocateOTStaticInfo</a> (); +01083 +01084 <font class="comment">// Make a new globalposition</font> +01085 UGlobalPosition endPosition=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o19">_Retriever</a>->doMove (wI->getGlobalPosition(), wI->getDeltaPosition(), +01086 (float)ratio, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o20">_SurfaceTemp</a>, <font class="keyword">false</font>); +01087 +01088 <font class="comment">// Init the info descriptor</font> +01089 info->init (first, desc, endPosition, ratio, worldImage); +01090 +01091 <font class="comment">// Add in the primitive list</font> +01092 first->addCollisionOTInfo (info); +01093 +01094 <font class="comment">// Insert in the time ordered table</font> +01095 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a><(<font class="keywordtype">int</font>)<a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>.size()); +01096 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].link (info); +01097 +01098 <font class="comment">// Check it is after the last hard collision</font> +01099 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o7">_PreviousCollisionNode</a><=&<a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>]); +01100 } +01101 } +01102 } +01103 +01104 <font class="comment">// ***************************************************************************</font> +01105 +<a name="l01106"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c12">01106</a> <font class="keywordtype">void</font> CMoveContainer::newTrigger (CMovePrimitive* first, CMovePrimitive* second, <font class="keyword">const</font> CCollisionDesc& desc, uint triggerType) +01107 { +01108 <font class="comment">// Element index</font> +01109 uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o21">_Triggers</a>.size(); +01110 +01111 <font class="comment">// Add one element</font> +01112 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o21">_Triggers</a>.resize (<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>+1); +01113 +01114 <font class="comment">// Fill info</font> +01115 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o21">_Triggers</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].Object0=first->UserData; +01116 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o21">_Triggers</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].Object1=second->UserData; +01117 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o21">_Triggers</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].CollisionDesc=desc; +01118 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o21">_Triggers</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].CollisionType = triggerType; +01119 } +01120 +01121 <font class="comment">// ***************************************************************************</font> +01122 +<a name="l01123"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c5">01123</a> <font class="keywordtype">void</font> CMoveContainer::checkOT () +01124 { +01125 <font class="comment">// Check</font> +01126 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o5">_OtSize</a>==<a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>.size()); +01127 +01128 <font class="comment">// Check linked list</font> +01129 <font class="keywordflow">for</font> (uint i=0; i<<a class="code" href="classNLPACS_1_1CMoveContainer.html#o5">_OtSize</a>-1; i++) +01130 { +01131 <font class="comment">// Check link</font> +01132 <a class="code" href="debug_8h.html#a6">nlassert</a> ( <a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>[i].getNext() == (&(<a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>[i+1])) ); +01133 <a class="code" href="debug_8h.html#a6">nlassert</a> ( <a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>[i+1].getPrevious() == (&(<a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>[i])) ); +01134 } +01135 +01136 <font class="comment">// Check first and last</font> +01137 <a class="code" href="debug_8h.html#a6">nlassert</a> ( <a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>[0].getPrevious() == NULL ); +01138 <a class="code" href="debug_8h.html#a6">nlassert</a> ( <a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>[<a class="code" href="classNLPACS_1_1CMoveContainer.html#o5">_OtSize</a>-1].getNext() == NULL ); +01139 } +01140 +01141 <font class="comment">// ***************************************************************************</font> +01142 +<a name="l01143"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c4">01143</a> <font class="keywordtype">void</font> CMoveContainer::clearOT () +01144 { +01145 <font class="comment">// Check</font> +01146 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o5">_OtSize</a>==<a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>.size()); +01147 +01148 <font class="comment">// clear the list</font> +01149 uint i; +01150 <font class="keywordflow">for</font> (i=0; i<<a class="code" href="classNLPACS_1_1CMoveContainer.html#o5">_OtSize</a>; i++) +01151 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>[i].clear (); +01152 +01153 <font class="comment">// Relink the list</font> +01154 <font class="keywordflow">for</font> (i=0; i<<a class="code" href="classNLPACS_1_1CMoveContainer.html#o5">_OtSize</a>-1; i++) +01155 <font class="comment">// Link the two cells</font> +01156 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>[i].link (&(<a class="code" href="classNLPACS_1_1CMoveContainer.html#o6">_TimeOT</a>[i+1])); +01157 } +01158 +01159 <font class="comment">// ***************************************************************************</font> +01160 +<a name="l01161"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c14">01161</a> <font class="keywordtype">void</font> CMoveContainer::removeModifiedFromOT (uint8 worldImage) +01162 { +01163 <font class="comment">// For each changed primitives</font> +01164 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a> *<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o3">_ChangedRoot</a>[worldImage]; +01165 <font class="keywordflow">while</font> (changed) +01166 { +01167 <font class="comment">// Remove from ot list</font> +01168 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>->removeCollisionOTInfo (); +01169 +01170 <font class="comment">// Get the primitive world image</font> +01171 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI; +01172 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>->isNonCollisionable()) +01173 wI=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>->getWorldImage (0); +01174 <font class="keywordflow">else</font> +01175 wI=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>->getWorldImage (worldImage); +01176 +01177 <font class="comment">// Next primitive</font> +01178 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>=wI->getNextModified (); +01179 } +01180 } +01181 +01182 <font class="comment">// ***************************************************************************</font> +01183 +<a name="l01184"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c16">01184</a> CCollisionOTDynamicInfo *CMoveContainer::allocateOTDynamicInfo () +01185 { +01186 <font class="keywordflow">return</font> <a class="code" href="classNLPACS_1_1CMoveContainer.html#o22">_AllocOTDynamicInfo</a>.<a class="code" href="classNLMISC_1_1CPoolMemory.html#a1">allocate</a> (); +01187 } +01188 +01189 <font class="comment">// ***************************************************************************</font> +01190 +<a name="l01191"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c17">01191</a> CCollisionOTStaticInfo *CMoveContainer::allocateOTStaticInfo () +01192 { +01193 <font class="keywordflow">return</font> <a class="code" href="classNLPACS_1_1CMoveContainer.html#o23">_AllocOTStaticInfo</a>.<a class="code" href="classNLMISC_1_1CPoolMemory.html#a1">allocate</a> (); +01194 } +01195 +01196 <font class="comment">// ***************************************************************************</font> +01197 +01198 <font class="comment">// Free all ordered table info</font> +<a name="l01199"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c18">01199</a> <font class="keywordtype">void</font> CMoveContainer::freeAllOTInfo () +01200 { +01201 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o22">_AllocOTDynamicInfo</a>.<a class="code" href="classNLMISC_1_1CPoolMemory.html#a2">free</a> (); +01202 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o23">_AllocOTStaticInfo</a>.<a class="code" href="classNLMISC_1_1CPoolMemory.html#a2">free</a> (); +01203 } +01204 +01205 <font class="comment">// ***************************************************************************</font> +01206 +<a name="l01207"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c19">01207</a> CMovePrimitive *CMoveContainer::allocatePrimitive (uint8 firstWorldImage, uint8 numWorldImage) +01208 { +01209 <font class="comment">// Simply allocate</font> +01210 <font class="keywordflow">return</font> <font class="keyword">new</font> <a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a> (<font class="keyword">this</font>, firstWorldImage, numWorldImage); +01211 } +01212 +01213 <font class="comment">// ***************************************************************************</font> +01214 +<a name="l01215"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c20">01215</a> <font class="keywordtype">void</font> CMoveContainer::freePrimitive (CMovePrimitive *primitive) +01216 { +01217 <font class="comment">// Simply deallocate</font> +01218 <font class="keyword">delete</font> primitive; +01219 } +01220 +01221 <font class="comment">// ***************************************************************************</font> +01222 +<a name="l01223"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c21">01223</a> CPrimitiveWorldImage **CMoveContainer::allocateWorldImagesPtrs (uint numPtrs) +01224 { +01225 <font class="keywordflow">return</font> <font class="keyword">new</font> <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a>*[numPtrs]; +01226 } +01227 +01228 <font class="comment">// ***************************************************************************</font> +01229 +<a name="l01230"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c22">01230</a> <font class="keywordtype">void</font> CMoveContainer::freeWorldImagesPtrs (CPrimitiveWorldImage **ptrs) +01231 { +01232 <font class="keyword">delete</font> [] ptrs; +01233 } +01234 +01235 <font class="comment">// ***************************************************************************</font> +01236 +<a name="l01237"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c23">01237</a> CPrimitiveWorldImage *CMoveContainer::allocateWorldImage () +01238 { +01239 <font class="keywordflow">return</font> <font class="keyword">new</font> <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a>; +01240 } +01241 +01242 <font class="comment">// ***************************************************************************</font> +01243 +<a name="l01244"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c24">01244</a> <font class="keywordtype">void</font> CMoveContainer::freeWorldImage (CPrimitiveWorldImage *worldImage) +01245 { +01246 <font class="keyword">delete</font> worldImage; +01247 } +01248 +01249 <font class="comment">// ***************************************************************************</font> +01250 +<a name="l01251"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a15">01251</a> CMoveElement *CMoveContainer::allocateMoveElement () +01252 { +01253 <font class="comment">// Simply allocate</font> +01254 <font class="keywordflow">return</font> <font class="keyword">new</font> CMoveElement; +01255 } +01256 +01257 <font class="comment">// ***************************************************************************</font> +01258 +<a name="l01259"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a16">01259</a> <font class="keywordtype">void</font> CMoveContainer::freeMoveElement (CMoveElement *element) +01260 { +01261 <font class="comment">// Simply deallocate</font> +01262 <font class="keyword">delete</font> element; +01263 } +01264 +01265 <font class="comment">// ***************************************************************************</font> +01266 +<a name="l01267"></a><a class="code" href="classNLPACS_1_1UMoveContainer.html#d2">01267</a> <font class="keywordtype">void</font> UMoveContainer::deleteMoveContainer (UMoveContainer *container) +01268 { +01269 <font class="keyword">delete</font> (CMoveContainer*)container; +01270 } +01271 +01272 <font class="comment">// ***************************************************************************</font> +01273 +<a name="l01274"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a5">01274</a> UMovePrimitive *CMoveContainer::addCollisionablePrimitive (uint8 firstWorldImage, uint8 numWorldImage, <font class="keyword">const</font> UMovePrimitive *copyFrom) +01275 { +01276 NL_ALLOC_CONTEXT( Pacs ) +01277 +01278 <font class="comment">// Allocate primitive</font> +01279 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a> *primitive=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c19">allocatePrimitive</a> (firstWorldImage, numWorldImage); +01280 +01281 <font class="comment">// Add into the set</font> +01282 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o2">_PrimitiveSet</a>.insert (primitive); +01283 +01284 <font class="comment">// if copy from primitive is not null, copy attributes</font> +01285 <font class="keywordflow">if</font> (copyFrom != NULL) +01286 { +01287 primitive->setPrimitiveType(copyFrom->getPrimitiveType()); +01288 primitive->setReactionType(copyFrom->getReactionType()); +01289 primitive->setTriggerType(copyFrom->getTriggerType()); +01290 primitive->setCollisionMask(copyFrom->getCollisionMask()); +01291 primitive->setOcclusionMask(copyFrom->getOcclusionMask()); +01292 primitive->setObstacle(copyFrom->getObstacle()); +01293 primitive->setAbsorbtion(copyFrom->getAbsorbtion()); +01294 primitive->setHeight(copyFrom->getHeight()); +01295 <font class="keywordflow">if</font> (primitive->getPrimitiveType() == UMovePrimitive::_2DOrientedBox) +01296 { +01297 <font class="keywordtype">float</font> <a class="code" href="driver__opengl__extension__def_8h.html#a389">width</a>=0.0f, <a class="code" href="driver__opengl__extension__def_8h.html#a390">height</a>=0.0f; +01298 copyFrom->getSize(<a class="code" href="driver__opengl__extension__def_8h.html#a389">width</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a390">height</a>); +01299 primitive->setSize(<a class="code" href="driver__opengl__extension__def_8h.html#a389">width</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a390">height</a>); +01300 } +01301 <font class="keywordflow">else</font> +01302 { +01303 primitive->setRadius(copyFrom->getRadius()); +01304 } +01305 } +01306 +01307 <font class="comment">// Return it</font> +01308 <font class="keywordflow">return</font> primitive; +01309 } +01310 +01311 <font class="comment">// ***************************************************************************</font> +01312 +<a name="l01313"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a6">01313</a> UMovePrimitive *CMoveContainer::addNonCollisionablePrimitive (<font class="keyword">const</font> UMovePrimitive *copyFrom) +01314 { +01315 NL_ALLOC_CONTEXT( Pacs ) +01316 +01317 <font class="comment">// Allocate primitive</font> +01318 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a> *primitive=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c19">allocatePrimitive</a> (0, 1); +01319 +01320 <font class="comment">// Set as noncollisionable</font> +01321 primitive->setNonCollisionable (<font class="keyword">true</font>); +01322 +01323 <font class="comment">// Add into the set</font> +01324 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o2">_PrimitiveSet</a>.insert (primitive); +01325 +01326 <font class="comment">// if copy from primitive is not null, copy attributes</font> +01327 <font class="keywordflow">if</font> (copyFrom != NULL) +01328 { +01329 primitive->setPrimitiveType(copyFrom->getPrimitiveType()); +01330 primitive->setReactionType(copyFrom->getReactionType()); +01331 primitive->setTriggerType(copyFrom->getTriggerType()); +01332 primitive->setCollisionMask(copyFrom->getCollisionMask()); +01333 primitive->setOcclusionMask(copyFrom->getOcclusionMask()); +01334 primitive->setObstacle(copyFrom->getObstacle()); +01335 primitive->setAbsorbtion(copyFrom->getAbsorbtion()); +01336 primitive->setHeight(copyFrom->getHeight()); +01337 <font class="keywordflow">if</font> (primitive->getPrimitiveType() == UMovePrimitive::_2DOrientedBox) +01338 { +01339 <font class="keywordtype">float</font> <a class="code" href="driver__opengl__extension__def_8h.html#a389">width</a>=0.0f, <a class="code" href="driver__opengl__extension__def_8h.html#a390">height</a>=0.0f; +01340 copyFrom->getSize(<a class="code" href="driver__opengl__extension__def_8h.html#a389">width</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a390">height</a>); +01341 primitive->setSize(<a class="code" href="driver__opengl__extension__def_8h.html#a389">width</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a390">height</a>); +01342 } +01343 <font class="keywordflow">else</font> +01344 { +01345 primitive->setRadius(copyFrom->getRadius()); +01346 } +01347 } +01348 +01349 <font class="comment">// Return it</font> +01350 <font class="keywordflow">return</font> primitive; +01351 } +01352 +01353 <font class="comment">// ***************************************************************************</font> +01354 +<a name="l01355"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a11">01355</a> <font class="keywordtype">void</font> CMoveContainer::removePrimitive (UMovePrimitive* primitive) +01356 { +01357 NL_ALLOC_CONTEXT( Pacs ) +01358 +01359 <font class="comment">// CMovePrimitive pointer</font> +01360 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a> *prim=(<a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a>*)primitive; +01361 +01362 <font class="comment">// Get the primitive world image</font> +01363 <font class="keywordflow">for</font> (uint8 i=0; i<prim->getNumWorldImage (); i++) +01364 { +01365 <font class="comment">// World image</font> +01366 uint8 worldImage=prim->getFirstWorldImage ()+i; +01367 +01368 <font class="comment">// Get primitive world image</font> +01369 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI=prim->getWorldImage (worldImage); +01370 +01371 <font class="comment">// In modified list ?</font> +01372 <font class="keywordflow">if</font> (wI->isInModifiedListFlag ()) +01373 { +01374 <font class="comment">// Non collisionable primitive ?</font> +01375 <font class="keywordflow">if</font> (prim->isNonCollisionable()) +01376 { +01377 <font class="comment">// Remove from all world image</font> +01378 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c27">removeNCFromModifiedList</a> (prim, worldImage); +01379 } +01380 <font class="keywordflow">else</font> +01381 { +01382 <font class="comment">// Remove from modified list</font> +01383 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c26">removeFromModifiedList</a> (prim, worldImage); +01384 } +01385 } +01386 } +01387 +01388 <font class="comment">// Remove from the set</font> +01389 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o2">_PrimitiveSet</a>.erase (prim); +01390 +01391 <font class="comment">// Erase it</font> +01392 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c20">freePrimitive</a> (prim); +01393 } +01394 +01395 <font class="comment">// ***************************************************************************</font> +01396 +<a name="l01397"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c27">01397</a> <font class="keywordtype">void</font> CMoveContainer::removeNCFromModifiedList (CMovePrimitive* primitive, uint8 worldImage) +01398 { +01399 <font class="comment">// For each world image</font> +01400 uint i; +01401 uint worldImageCount = <a class="code" href="classNLPACS_1_1CMoveContainer.html#o3">_ChangedRoot</a>.size(); +01402 <font class="keywordflow">for</font> (i=0; i<worldImageCount; i++) +01403 { +01404 <font class="comment">// For each changed primitives</font> +01405 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a> *<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o3">_ChangedRoot</a>[i]; +01406 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *previous=NULL; +01407 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI=primitive->getWorldImage (worldImage); +01408 +01409 <font class="keywordflow">while</font> (changed) +01410 { +01411 <font class="comment">// Get the primitive world image</font> +01412 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *changedWI=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>->getWorldImage (worldImage); +01413 +01414 <font class="comment">// Remove from ot list</font> +01415 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>==primitive) +01416 { +01417 <font class="comment">// There is a previous primitive ?</font> +01418 <font class="keywordflow">if</font> (previous) +01419 previous->linkInModifiedList (wI->getNextModified ()); +01420 <font class="keywordflow">else</font> +01421 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o3">_ChangedRoot</a>[i]=wI->getNextModified (); +01422 +01423 <font class="comment">// Unlink</font> +01424 wI->linkInModifiedList (NULL); +01425 wI->setInModifiedListFlag (<font class="keyword">false</font>); +01426 <font class="keywordflow">break</font>; +01427 } +01428 +01429 <font class="comment">// Next primitive</font> +01430 previous=changedWI; +01431 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>=changedWI->getNextModified (); +01432 } +01433 +01434 <font class="comment">// Breaked ?</font> +01435 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>==primitive) +01436 <font class="keywordflow">break</font>; +01437 } +01438 } +01439 +01440 <font class="comment">// ***************************************************************************</font> +01441 +<a name="l01442"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c26">01442</a> <font class="keywordtype">void</font> CMoveContainer::removeFromModifiedList (CMovePrimitive* primitive, uint8 worldImage) +01443 { +01444 <font class="comment">// For each changed primitives</font> +01445 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a> *<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o3">_ChangedRoot</a>[worldImage]; +01446 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *previous=NULL; +01447 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI=primitive->getWorldImage (worldImage); +01448 +01449 <font class="keywordflow">while</font> (changed) +01450 { +01451 <font class="comment">// Get the primitive world image</font> +01452 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *changedWI=<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>->getWorldImage (worldImage); +01453 +01454 <font class="comment">// Remove from ot list</font> +01455 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>==primitive) +01456 { +01457 <font class="comment">// There is a previous primitive ?</font> +01458 <font class="keywordflow">if</font> (previous) +01459 previous->linkInModifiedList (wI->getNextModified ()); +01460 <font class="keywordflow">else</font> +01461 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o3">_ChangedRoot</a>[worldImage]=wI->getNextModified (); +01462 +01463 <font class="comment">// Unlink</font> +01464 wI->linkInModifiedList (NULL); +01465 wI->setInModifiedListFlag (<font class="keyword">false</font>); +01466 <font class="keywordflow">break</font>; +01467 } +01468 +01469 <font class="comment">// Next primitive</font> +01470 previous=changedWI; +01471 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c25">changed</a>=changedWI->getNextModified (); +01472 } +01473 } +01474 +01475 <font class="comment">// ***************************************************************************</font> +01476 +<a name="l01477"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c28">01477</a> <font class="keywordtype">void</font> CMoveContainer::unlinkMoveElement (CMoveElement *element, uint8 worldImage) +01478 { +01479 <font class="comment">// Some checks</font> +01480 <a class="code" href="debug_8h.html#a6">nlassert</a> (element->X<<a class="code" href="classNLPACS_1_1CMoveContainer.html#o16">_CellCountWidth</a>); +01481 <a class="code" href="debug_8h.html#a6">nlassert</a> (element->Y<<a class="code" href="classNLPACS_1_1CMoveContainer.html#o17">_CellCountHeight</a>); +01482 +01483 <font class="comment">// Unlink it</font> +01484 CMoveCell &cell=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o18">_VectorCell</a>[worldImage][element->X+element->Y*<a class="code" href="classNLPACS_1_1CMoveContainer.html#o16">_CellCountWidth</a>]; +01485 cell.unlinkX (element); +01486 <font class="comment">//cell.unlinkY (element);</font> +01487 } +01488 +01489 <font class="comment">// ***************************************************************************</font> +01490 +<a name="l01491"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#c29">01491</a> <font class="keywordtype">void</font> CMoveContainer::reaction (<font class="keyword">const</font> CCollisionOTInfo& first) +01492 { +01493 <font class="comment">// H_AUTO(PACS_MC_reaction);</font> +01494 +01495 <font class="comment">// Static collision ?</font> +01496 <font class="keywordflow">if</font> (first.isCollisionAgainstStatic()) +01497 { +01498 <font class="comment">// Check mode</font> +01499 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o19">_Retriever</a>); +01500 +01501 <font class="comment">// Cast</font> +01502 <font class="keyword">const</font> CCollisionOTStaticInfo *staticInfo=safe_cast<const CCollisionOTStaticInfo*> (&first); +01503 +01504 <font class="comment">// Get the primitive world image</font> +01505 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a> *movePrimitive=staticInfo->getPrimitive (); +01506 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI; +01507 <font class="keywordflow">if</font> (movePrimitive->isNonCollisionable ()) +01508 wI=movePrimitive->getWorldImage (0); +01509 <font class="keywordflow">else</font> +01510 wI=movePrimitive->getWorldImage (staticInfo->getWorldImage()); +01511 +01512 <font class="comment">// Dynamic collision</font> +01513 wI->reaction ( staticInfo->getCollisionDesc (), staticInfo->getGlobalPosition (), +01514 *<a class="code" href="classNLPACS_1_1CMoveContainer.html#o19">_Retriever</a>, staticInfo->getDeltaTime(), <a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>, *staticInfo->getPrimitive (), *<font class="keyword">this</font>, staticInfo->getWorldImage()); +01515 } +01516 <font class="keywordflow">else</font> +01517 { +01518 <font class="comment">// Cast</font> +01519 <font class="keyword">const</font> CCollisionOTDynamicInfo *dynInfo=safe_cast<const CCollisionOTDynamicInfo*> (&first); +01520 +01521 <font class="comment">// Get the primitives world image</font> +01522 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *firstWI; +01523 <font class="keywordflow">if</font> (dynInfo->getFirstPrimitive ()->isNonCollisionable ()) +01524 firstWI=dynInfo->getFirstPrimitive ()->getWorldImage (0); +01525 <font class="keywordflow">else</font> +01526 firstWI=dynInfo->getFirstPrimitive ()->getWorldImage (dynInfo->getFirstWorldImage()); +01527 +01528 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *secondWI; +01529 <font class="keywordflow">if</font> (dynInfo->getSecondPrimitive ()->isNonCollisionable ()) +01530 secondWI=dynInfo->getSecondPrimitive ()->getWorldImage (0); +01531 <font class="keywordflow">else</font> +01532 secondWI=dynInfo->getSecondPrimitive ()->getWorldImage (dynInfo->getSecondWorldImage()); +01533 +01534 <font class="comment">// Dynamic collision</font> +01535 firstWI->reaction ( *secondWI, dynInfo->getCollisionDesc (), <a class="code" href="classNLPACS_1_1CMoveContainer.html#o19">_Retriever</a>, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o20">_SurfaceTemp</a>, dynInfo->isCollision(), +01536 *dynInfo->getFirstPrimitive (), *dynInfo->getSecondPrimitive (), <font class="keyword">this</font>, dynInfo->getFirstWorldImage(), +01537 dynInfo->getSecondWorldImage(), dynInfo->isSecondStatic()); +01538 +01547 <font class="keywordflow">if</font> (dynInfo->getFirstPrimitive ()->isCollisionable ()) +01548 { +01549 <font class="keywordflow">if</font> (dynInfo->getFirstPrimitive ()->isTriggered (*dynInfo->getSecondPrimitive (), dynInfo->isEnter(), dynInfo->isExit())) +01550 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c12">newTrigger</a> (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), +01551 dynInfo->isEnter() ? UTriggerInfo::In : dynInfo->isExit() ? UTriggerInfo::Out : UTriggerInfo::Inside); +01552 } +01553 } +01554 } +01555 +01556 <font class="comment">// ***************************************************************************</font> +01557 +<a name="l01558"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a9">01558</a> <font class="keywordtype">void</font> CMoveContainer::setAsStatic (uint8 worldImage) +01559 { +01560 NL_ALLOC_CONTEXT( Pacs ) +01561 +01562 <font class="comment">// Add this world image in the static set of world image</font> +01563 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o4">_StaticWorldImage</a>.insert (worldImage); +01564 } +01565 +01566 <font class="comment">// ***************************************************************************</font> +01567 +<a name="l01568"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a10">01568</a> <font class="keywordtype">void</font> CMoveContainer::duplicateWorldImage (uint8 source, uint8 dest) +01569 { +01570 NL_ALLOC_CONTEXT( Pacs ) +01571 +01572 <font class="comment">// Cell count</font> +01573 uint cellCount=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o16">_CellCountWidth</a>*<a class="code" href="classNLPACS_1_1CMoveContainer.html#o17">_CellCountHeight</a>; +01574 +01575 <font class="comment">// Clear dest modified list</font> +01576 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c13">clearModifiedList</a> (dest); +01577 +01578 <font class="comment">// Clear destination cells</font> +01579 uint i; +01580 <font class="keywordflow">for</font> (i=0; i<cellCount; i++) +01581 { +01582 <font class="comment">// Get first X</font> +01583 CMoveElement *elm; +01584 <font class="keywordflow">while</font> ((elm=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o18">_VectorCell</a>[dest][i].getFirstX ())) +01585 { +01586 <font class="comment">// Get primitive world image</font> +01587 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI=elm->Primitive->getWorldImage (dest); +01588 +01589 <font class="comment">// Remove the primitive</font> +01590 <font class="keywordtype">int</font> i; +01591 <font class="keywordflow">for</font> (i=0; i<4; i++) +01592 { +01593 <font class="keywordflow">if</font> (wI->getMoveElement(i)) +01594 wI->removeMoveElement (i, *<font class="keyword">this</font>, dest); +01595 } +01596 } +01597 } +01598 +01599 <font class="comment">// Duplicate destination cells</font> +01600 <font class="keywordflow">for</font> (i=0; i<cellCount; i++) +01601 { +01602 <font class="comment">// Get first X</font> +01603 CMoveElement *elm=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o18">_VectorCell</a>[source][i].getFirstX (); +01604 <font class="keywordflow">while</font> (elm) +01605 { +01606 <font class="comment">// Get primitive world image</font> +01607 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wISource=elm->Primitive->getWorldImage (source); +01608 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wIDest=elm->Primitive->getWorldImage (dest); +01609 +01610 <font class="comment">// First time the primitive is visited ?</font> +01611 <font class="keywordflow">if</font> (wIDest->getMoveElement (0)==NULL) +01612 { +01613 wIDest->copy (*wISource); +01614 } +01615 +01616 <font class="comment">// Add at the end of the list</font> +01617 wIDest->addMoveElementendOfList (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o18">_VectorCell</a>[dest][i], elm->X, elm->Y, elm->Primitive, *<font class="keyword">this</font>); +01618 +01619 <font class="comment">// Added ?</font> +01620 <a class="code" href="debug_8h.html#a6">nlassert</a> (wIDest->getMoveElement (0)!=NULL); +01621 +01622 <font class="comment">// Next primitive</font> +01623 elm=elm->NextX; +01624 } +01625 } +01626 } +01627 +01628 <font class="comment">// ***************************************************************************</font> +01629 +<a name="l01630"></a><a class="code" href="classNLPACS_1_1UMoveContainer.html#d0">01630</a> UMoveContainer *UMoveContainer::createMoveContainer (<font class="keywordtype">double</font> xmin, <font class="keywordtype">double</font> ymin, <font class="keywordtype">double</font> xmax, <font class="keywordtype">double</font> ymax, +01631 uint widthCellCount, uint heightCellCount, <font class="keywordtype">double</font> primitiveMaxSize, uint8 numWorldImage, +01632 uint maxIteration, uint otSize) +01633 { +01634 NL_ALLOC_CONTEXT( Pacs ) +01635 +01636 <font class="comment">// Create a CMoveContainer</font> +01637 <font class="keywordflow">return</font> <font class="keyword">new</font> CMoveContainer (xmin, ymin, xmax, ymax, widthCellCount, heightCellCount, primitiveMaxSize, numWorldImage, maxIteration, otSize); +01638 } +01639 +01640 <font class="comment">// ***************************************************************************</font> +01641 +<a name="l01642"></a><a class="code" href="classNLPACS_1_1UMoveContainer.html#d1">01642</a> UMoveContainer *UMoveContainer::createMoveContainer (UGlobalRetriever* retriever, uint widthCellCount, +01643 uint heightCellCount, <font class="keywordtype">double</font> primitiveMaxSize, uint8 numWorldImage, uint maxIteration, uint otSize) +01644 { +01645 NL_ALLOC_CONTEXT( Pacs ) +01646 +01647 <font class="comment">// Cast</font> +01648 <a class="code" href="debug_8h.html#a6">nlassert</a> (dynamic_cast<CGlobalRetriever*>(retriever)); +01649 CGlobalRetriever* <a class="code" href="driver__opengl__extension__def_8h.html#a385">r</a>=static_cast<CGlobalRetriever*>(retriever); +01650 +01651 <font class="comment">// Create a CMoveContainer</font> +01652 <font class="keywordflow">return</font> <font class="keyword">new</font> CMoveContainer (<a class="code" href="driver__opengl__extension__def_8h.html#a385">r</a>, widthCellCount, heightCellCount, primitiveMaxSize, numWorldImage, maxIteration, otSize); +01653 } +01654 +01655 <font class="comment">// ***************************************************************************</font> +01656 +<a name="l01657"></a><a class="code" href="classNLPACS_1_1UCollisionDesc.html#a0">01657</a> <font class="keywordtype">void</font> UCollisionDesc::serial (<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a>& stream) +01658 { +01659 stream.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a> (<a class="code" href="classNLPACS_1_1UCollisionDesc.html#m0">ContactPosition</a>); +01660 stream.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a> (<a class="code" href="classNLPACS_1_1UCollisionDesc.html#m1">ContactNormal0</a>); +01661 stream.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a> (<a class="code" href="classNLPACS_1_1UCollisionDesc.html#m2">ContactNormal1</a>); +01662 stream.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a> (<a class="code" href="classNLPACS_1_1UCollisionDesc.html#m3">ContactTime</a>); +01663 }; +01664 +01665 <font class="comment">// ***************************************************************************</font> +01666 +<a name="l01667"></a><a class="code" href="classNLPACS_1_1UTriggerInfo.html#a0">01667</a> <font class="keywordtype">void</font> UTriggerInfo::serial (<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a>& stream) +01668 { +01669 stream.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a> (<a class="code" href="classNLPACS_1_1UTriggerInfo.html#m0">Object0</a>); +01670 stream.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a> (<a class="code" href="classNLPACS_1_1UTriggerInfo.html#m1">Object1</a>); +01671 stream.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a> (<a class="code" href="classNLPACS_1_1UTriggerInfo.html#m2">CollisionDesc</a>); +01672 } +01673 +01674 +01675 +01676 <font class="comment">// ***************************************************************************</font> +<a name="l01677"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a8">01677</a> <font class="keywordtype">void</font> CMoveContainer::addCollisionnablePrimitiveBlock(UPrimitiveBlock *pb,uint8 firstWorldImage,uint8 numWorldImage,std::vector<UMovePrimitive*> *primitives,<font class="keywordtype">float</font> orientation,<font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &position, <font class="keywordtype">bool</font> dontSnapToGround <font class="comment">/* = false*/</font>) +01678 { +01679 NL_ALLOC_CONTEXT( Pacs ) +01680 +01681 CPrimitiveBlock *block = NLMISC::safe_cast<CPrimitiveBlock *>(pb); +01682 <font class="comment">// Reserve the pointer array</font> +01683 <font class="keywordflow">if</font> (primitives) +01684 primitives->reserve (block->Primitives.size()); +01685 +01686 <font class="comment">// For each primitive</font> +01687 uint prim; +01688 <font class="keywordflow">for</font> (prim=0; prim<block->Primitives.size(); prim++) +01689 { +01690 <font class="comment">// Create a collisionable primitive</font> +01691 UMovePrimitive *primitive = <a class="code" href="classNLPACS_1_1CMoveContainer.html#a5">addCollisionablePrimitive</a> (firstWorldImage, numWorldImage); +01692 +01693 <font class="comment">// Ref on the block descriptor</font> +01694 CPrimitiveDesc &desc = block->Primitives[prim]; +01695 +01696 <font class="comment">// Set its properties</font> +01697 primitive->setPrimitiveType (desc.Type); +01698 primitive->setReactionType (desc.Reaction); +01699 primitive->setTriggerType (desc.Trigger); +01700 primitive->setCollisionMask (desc.CollisionMask); +01701 primitive->setOcclusionMask (desc.OcclusionMask); +01702 primitive->setObstacle (desc.Obstacle); +01703 primitive->setAbsorbtion (desc.Attenuation); +01704 primitive->setDontSnapToGround(dontSnapToGround); +01705 <font class="keywordflow">if</font> (desc.Type == UMovePrimitive::_2DOrientedBox) +01706 { +01707 primitive->setSize (desc.Length[0], desc.Length[1]); +01708 } +01709 <font class="keywordflow">else</font> +01710 { +01711 <a class="code" href="debug_8h.html#a6">nlassert</a> (desc.Type == UMovePrimitive::_2DOrientedCylinder); +01712 primitive->setRadius (desc.Length[0]); +01713 } +01714 primitive->setHeight (desc.Height); +01715 +01716 <font class="comment">// Insert the primitives</font> +01717 +01718 <font class="comment">// For each world image</font> +01719 uint wI; +01720 <font class="keywordflow">for</font> (wI=firstWorldImage; wI<(uint)(firstWorldImage+numWorldImage); wI++) +01721 { +01722 <font class="comment">// Insert the primitive</font> +01723 primitive->insertInWorldImage (wI); +01724 +01725 <font class="comment">// Final position</font> +01726 <font class="keywordtype">float</font> cosa = (float) cos (orientation); +01727 <font class="keywordtype">float</font> sina = (float) sin (orientation); +01728 CVector finalPos; +01729 finalPos.x = cosa * desc.Position.x - sina * desc.Position.y + position.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>; +01730 finalPos.y = sina * desc.Position.y + cosa * desc.Position.y + position.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>; +01731 finalPos.z = desc.Position.z + position.<a class="code" href="classNLMISC_1_1CVector.html#m2">z</a>; +01732 +01733 <font class="comment">// Set the primtive orientation</font> +01734 <font class="keywordflow">if</font> (desc.Type == UMovePrimitive::_2DOrientedBox) +01735 primitive->setOrientation ((<font class="keywordtype">float</font>)fmod (desc.Orientation + orientation, 2*<a class="code" href="namespaceNLMISC.html#a7">Pi</a>), wI); +01736 +01737 <font class="comment">// Set the primitive global position</font> +01738 primitive->setGlobalPosition (finalPos, wI); +01739 } +01740 +01741 <font class="comment">// Feedback asked ?</font> +01742 <font class="keywordflow">if</font> (primitives) +01743 { +01744 <font class="comment">// Add the pointer</font> +01745 primitives->push_back (primitive); +01746 } +01747 } +01748 } +01749 +01750 +01751 <font class="comment">// ***************************************************************************</font> +01752 +<a name="l01753"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a7">01753</a> <font class="keywordtype">bool</font> CMoveContainer::loadCollisionablePrimitiveBlock (<font class="keyword">const</font> <font class="keywordtype">char</font> *filename, uint8 firstWorldImage, uint8 numWorldImage, std::vector<UMovePrimitive*> *primitives, <font class="keywordtype">float</font> orientation, <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &position, <font class="keywordtype">bool</font> dontSnapToGround <font class="comment">/*= false*/</font>) +01754 { +01755 NL_ALLOC_CONTEXT( Pacs ) +01756 +01757 <font class="comment">// Check world image</font> +01758 <font class="keywordflow">if</font> ( (uint)(firstWorldImage+numWorldImage) > <a class="code" href="classNLPACS_1_1CMoveContainer.html#o3">_ChangedRoot</a>.size() ) +01759 { +01760 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"Invalid world image number."</font>); +01761 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01762 } +01763 +01764 <font class="comment">// Try to load the file</font> +01765 CIFile <a class="code" href="cf__lexical_8cpp.html#a95">file</a>; +01766 <font class="keywordflow">if</font> (<a class="code" href="cf__lexical_8cpp.html#a95">file</a>.open (filename)) +01767 { +01768 <font class="comment">// Create the XML stream</font> +01769 CIXml input; +01770 +01771 <font class="comment">// Init</font> +01772 <font class="keywordflow">if</font> (input.init (<a class="code" href="cf__lexical_8cpp.html#a95">file</a>)) +01773 { +01774 <font class="comment">// The primitive block</font> +01775 CPrimitiveBlock block; +01776 +01777 <font class="comment">// Serial it</font> +01778 <a class="code" href="cf__lexical_8cpp.html#a95">file</a>.serial (block); +01779 +01780 <font class="comment">// add primitives</font> +01781 <a class="code" href="classNLPACS_1_1CMoveContainer.html#a8">addCollisionnablePrimitiveBlock</a>(&block, firstWorldImage, numWorldImage, primitives, orientation, position, dontSnapToGround); +01782 +01783 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01784 } +01785 <font class="keywordflow">else</font> +01786 { +01787 <font class="comment">// Warning</font> +01788 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"Can't init XML stream with file %s."</font>, filename); +01789 +01790 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01791 } +01792 } +01793 <font class="keywordflow">else</font> +01794 { +01795 <font class="comment">// Warning</font> +01796 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"Can't load primitive block %s."</font>, filename); +01797 +01798 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01799 } +01800 } +01801 +01802 +01803 <font class="comment">// ***************************************************************************</font> +<a name="l01804"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a20">01804</a> <font class="keywordtype">void</font> CMoveContainer::getPrimitives(std::vector<const UMovePrimitive *> &dest)<font class="keyword"> const</font> +01805 <font class="keyword"></font>{ +01806 NL_ALLOC_CONTEXT( Pacs ) +01807 +01808 dest.resize(<a class="code" href="classNLPACS_1_1CMoveContainer.html#o2">_PrimitiveSet</a>.size()); +01809 std::copy(<a class="code" href="classNLPACS_1_1CMoveContainer.html#o2">_PrimitiveSet</a>.begin(), <a class="code" href="classNLPACS_1_1CMoveContainer.html#o2">_PrimitiveSet</a>.end(), dest.begin()); +01810 } +01811 +01812 +01813 <font class="comment">// ***************************************************************************</font> +<a name="l01814"></a><a class="code" href="classNLPACS_1_1UMoveContainer.html#d3">01814</a> <font class="keywordtype">void</font> UMoveContainer::getPACSCoordsFromMatrix(<a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &pos,<font class="keywordtype">float</font> &angle,<font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CMatrix.html">NLMISC::CMatrix</a> &mat) +01815 { +01816 pos = mat.<a class="code" href="classNLMISC_1_1CMatrix.html#z291_4">getPos</a>(); +01817 CVector orient = mat.<a class="code" href="classNLMISC_1_1CMatrix.html#z294_0">mulVector</a>(<a class="code" href="classNLMISC_1_1CVector.html#p1">NLMISC::CVector::I</a>); +01818 orient.z = 0.f; +01819 orient.normalize(); +01820 angle = orient.y >= 0.f ? ::acosf(orient.x) +01821 : 2.f * (float) NLMISC::Pi - ::acosf(orient.x); +01822 +01823 } +01824 +01825 <font class="comment">// ***************************************************************************</font> +<a name="l01826"></a><a class="code" href="classNLPACS_1_1CMoveContainer.html#a13">01826</a> <font class="keywordtype">bool</font> CMoveContainer::evalNCPrimitiveCollision (<font class="keywordtype">double</font> deltaTime, UMovePrimitive *primitive, uint8 worldImage) +01827 { +01828 NL_ALLOC_CONTEXT( Pacs ) +01829 +01830 <font class="comment">// New test time</font> +01831 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o0">_TestTime</a>++; +01832 +01833 <font class="comment">// Clear triggers</font> +01834 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o21">_Triggers</a>.clear (); +01835 +01836 <font class="comment">// Only non-collisionable primitives</font> +01837 <font class="keywordflow">if</font> (!primitive->isCollisionable()) +01838 { +01839 <font class="comment">// Delta time</font> +01840 <a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>=deltaTime; +01841 +01842 <font class="comment">// Begin of the time slice to compute</font> +01843 <font class="keywordtype">double</font> beginTime = 0; +01844 <font class="keywordtype">double</font> collisionTime = deltaTime; +01845 +01846 <font class="comment">// Get the world image</font> +01847 <a class="code" href="classNLPACS_1_1CMoveContainer.html#l1">CPrimitiveWorldImage</a> *wI = ((<a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a>*)primitive)->getWorldImage (0); +01848 +01849 CCollisionOTInfo *firstCollision = NULL; +01850 <font class="keywordflow">do</font> +01851 { +01852 +01853 <a class="code" href="debug_8h.html#a6">nlassert</a> (beginTime < 1.0); +01854 +01855 <font class="comment">// Update the primitive</font> +01856 wI->update (beginTime, deltaTime, *(<a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a>*)primitive); +01857 +01858 CVectorD d0=wI->getDeltaPosition(); +01859 +01860 <font class="comment">// Eval collision again the terrain</font> +01861 <font class="keywordtype">bool</font> testMoveValid = <font class="keyword">false</font>; +01862 CCollisionOTStaticInfo staticColInfo; +01863 CCollisionOTDynamicInfo dynamicColInfoWI0; +01864 CCollisionOTDynamicInfo dynamicColInfoWI; +01865 +01866 firstCollision = NULL; +01867 +01868 <font class="comment">// If collision found, note it is on the landscape</font> +01869 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#c6">evalOneTerrainCollision</a> (beginTime, (<a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a>*)primitive, worldImage, <font class="keyword">false</font>, testMoveValid, &staticColInfo, NULL)) +01870 { +01871 firstCollision = &staticColInfo; +01872 } +01873 +01874 <font class="comment">// Eval collision again the static primitives</font> +01875 std::set<uint8>::iterator ite=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o4">_StaticWorldImage</a>.begin(); +01876 <font class="keywordflow">while</font> (ite!=<a class="code" href="classNLPACS_1_1CMoveContainer.html#o4">_StaticWorldImage</a>.end()) +01877 { +01878 <font class="comment">// Eval in this world image</font> +01879 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#c7">evalOnePrimitiveCollision</a> (beginTime, (<a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a>*)primitive, *ite, worldImage, <font class="keyword">false</font>, <font class="keyword">true</font>, testMoveValid, &dynamicColInfoWI0, NULL)) +01880 { +01881 <font class="comment">// First collision..</font> +01882 <font class="keywordflow">if</font> (!firstCollision || (firstCollision->getCollisionTime () > dynamicColInfoWI0.getCollisionTime ())) +01883 { +01884 firstCollision = &dynamicColInfoWI0; +01885 } +01886 } +01887 +01888 <font class="comment">// Next world image</font> +01889 ite++; +01890 } +01891 +01892 <font class="comment">// Checks</font> +01893 CVectorD d1=wI->getDeltaPosition(); +01894 +01895 <font class="comment">// Eval collision again the world image</font> +01896 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o4">_StaticWorldImage</a>.find (worldImage)==<a class="code" href="classNLPACS_1_1CMoveContainer.html#o4">_StaticWorldImage</a>.end()) +01897 { +01898 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#c7">evalOnePrimitiveCollision</a> (beginTime, (<a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a>*)primitive, worldImage, worldImage, <font class="keyword">false</font>, <font class="keyword">false</font>, testMoveValid, &dynamicColInfoWI, NULL)) +01899 { +01900 <font class="comment">// First collision..</font> +01901 <font class="keywordflow">if</font> (!firstCollision || (firstCollision->getCollisionTime () > dynamicColInfoWI.getCollisionTime ())) +01902 { +01903 firstCollision = &dynamicColInfoWI; +01904 } +01905 } +01906 } +01907 +01908 <font class="comment">// Checks</font> +01909 CVectorD d2=wI->getDeltaPosition(); +01910 <a class="code" href="debug_8h.html#a6">nlassert</a> ((d0==d1)&&(d0==d2)); +01911 +01912 <font class="comment">// if (found)</font> +01913 <font class="comment">// nlstop;</font> +01914 +01915 <font class="comment">// Reaction</font> +01916 <font class="keywordflow">if</font> (firstCollision) +01917 { +01918 collisionTime = firstCollision->getCollisionTime (); +01919 <a class="code" href="classNLPACS_1_1CMoveContainer.html#c29">reaction</a> (*firstCollision); +01920 <a class="code" href="debug_8h.html#a6">nlassert</a> (collisionTime != 1); +01921 } +01922 <font class="keywordflow">else</font> +01923 { +01924 <font class="comment">// Retriever mode ?</font> +01925 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o19">_Retriever</a>&&testMoveValid) +01926 { +01927 <font class="comment">// Do move</font> +01928 wI->doMove (*<a class="code" href="classNLPACS_1_1CMoveContainer.html#o19">_Retriever</a>, <a class="code" href="classNLPACS_1_1CMoveContainer.html#o20">_SurfaceTemp</a>, deltaTime, collisionTime, ((<a class="code" href="classNLPACS_1_1CMoveContainer.html#l0">CMovePrimitive</a>*)primitive)->getDontSnapToGround()); +01929 } +01930 <font class="keywordflow">else</font> +01931 { +01932 <font class="comment">// Do move</font> +01933 wI->doMove (<a class="code" href="classNLPACS_1_1CMoveContainer.html#o8">_DeltaTime</a>); +01934 } +01935 } +01936 +01937 beginTime = collisionTime; +01938 } +01939 <font class="keywordflow">while</font> (firstCollision); +01940 } +01941 <font class="keywordflow">else</font> +01942 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01943 +01944 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01945 } +01946 +01947 +01948 } <font class="comment">// NLPACS</font> +</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> |