diff options
author | neodarz <neodarz@neodarz.net> | 2018-08-11 20:21:34 +0200 |
---|---|---|
committer | neodarz <neodarz@neodarz.net> | 2018-08-11 20:21:34 +0200 |
commit | 0ea5fc66924303d1bf73ba283a383e2aadee02f2 (patch) | |
tree | 2568e71a7ccc44ec23b8bb3f0ff97fb6bf2ed709 /docs/doxygen/nel/primitive__world__image_8cpp-source.html | |
download | nevrax-website-self-hostable-0ea5fc66924303d1bf73ba283a383e2aadee02f2.tar.xz nevrax-website-self-hostable-0ea5fc66924303d1bf73ba283a383e2aadee02f2.zip |
Initial commit
Diffstat (limited to 'docs/doxygen/nel/primitive__world__image_8cpp-source.html')
-rw-r--r-- | docs/doxygen/nel/primitive__world__image_8cpp-source.html | 1560 |
1 files changed, 1560 insertions, 0 deletions
diff --git a/docs/doxygen/nel/primitive__world__image_8cpp-source.html b/docs/doxygen/nel/primitive__world__image_8cpp-source.html new file mode 100644 index 00000000..9819f9e2 --- /dev/null +++ b/docs/doxygen/nel/primitive__world__image_8cpp-source.html @@ -0,0 +1,1560 @@ +<!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>primitive_world_image.cpp</h1><a href="primitive__world__image_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="hierarchical__timer_8h.html">nel/misc/hierarchical_timer.h</a>"</font> +00029 +00030 <font class="preprocessor">#include "<a class="code" href="primitive__world__image_8h.html">pacs/primitive_world_image.h</a>"</font> +00031 <font class="preprocessor">#include "<a class="code" href="move__primitive_8h.html">pacs/move_primitive.h</a>"</font> +00032 <font class="preprocessor">#include "<a class="code" href="move__element_8h.html">pacs/move_element.h</a>"</font> +00033 +00034 <font class="keyword">using</font> <font class="keyword">namespace </font>NLMISC; +00035 +00036 +00037 <font class="keyword">namespace </font>NLPACS +00038 { +00039 +00040 <font class="comment">// ***************************************************************************</font> +00041 +<a name="l00042"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a0">00042</a> CPrimitiveWorldImage::CPrimitiveWorldImage() +00043 { +00044 <font class="comment">// Set to NULL</font> +00045 <font class="keywordflow">for</font> (uint i=0; i<4; i++) +00046 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[i]=NULL; +00047 +00048 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o0">_DynamicFlags</a>=0; +00049 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o6">_BBXMin</a>=-FLT_MAX; +00050 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o8">_BBXMax</a>=-FLT_MAX; +00051 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o7">_BBYMin</a>=-FLT_MAX; +00052 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o9">_BBYMax</a>=-FLT_MAX; +00053 } +00054 +00055 <font class="comment">// ***************************************************************************</font> +00056 +<a name="l00057"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a1">00057</a> <font class="keywordtype">void</font> CPrimitiveWorldImage::deleteIt (CMoveContainer &container, uint8 worldImage) +00058 { +00059 <font class="comment">// Free the move elements </font> +00060 <font class="keywordflow">for</font> (uint i=0; i<4; i++) +00061 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[i]) +00062 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a22">removeMoveElement</a> (i, container, worldImage); +00063 } +00064 <font class="comment">// ***************************************************************************</font> +00065 +<a name="l00066"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a2">00066</a> <font class="keywordtype">void</font> CPrimitiveWorldImage::copy (<font class="keyword">const</font> CPrimitiveWorldImage& source) +00067 { +00068 <font class="comment">// Copy</font> +00069 this->operator=(source); +00070 +00071 <font class="comment">// Reset some flags</font> +00072 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o0">_DynamicFlags</a>&=~<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#u5u2">InModifiedListFlag</a>; +00073 +00074 <font class="comment">// Pointer into the 4 possibles sorted lists of movable primitives. Must be NULL</font> +00075 <font class="keywordflow">for</font> (uint i=0; i<4; i++) +00076 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[i]=NULL; +00077 } +00078 +00079 <font class="comment">// ***************************************************************************</font> +00080 +<a name="l00081"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a35">00081</a> <font class="keywordtype">bool</font> CPrimitiveWorldImage::evalCollision (CPrimitiveWorldImage& other, CCollisionDesc& desc, <font class="keywordtype">double</font> timeMin, <font class="keywordtype">double</font> timeMax, uint32 testTime, +00082 uint32 maxTestIteration, <font class="keywordtype">double</font> &firstContactTime, <font class="keywordtype">double</font> &lastContactTime, CMovePrimitive& primitive, +00083 CMovePrimitive& otherPrimitive) +00084 { +00085 <font class="comment">// H_AUTO(PACS_PWI_evalCollision_long);</font> +00086 +00087 <font class="comment">// Mask test</font> +00088 <font class="keywordflow">if</font> (( (primitive.getCollisionMaskInternal() & otherPrimitive.getOcclusionMaskInternal()) == 0) && +00089 ( (primitive.getOcclusionMaskInternal() & otherPrimitive.getCollisionMaskInternal()) == 0)) +00090 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00091 +00092 <font class="comment">// Test time</font> +00093 <font class="keywordflow">if</font> ( (!primitive.checkTestTime (testTime, maxTestIteration)) || (!otherPrimitive.checkTestTime (testTime, maxTestIteration)) ) +00094 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00095 +00096 <font class="comment">// Clear time min time max</font> +00097 firstContactTime=FLT_MAX; +00098 lastContactTime=-FLT_MAX; +00099 +00100 <font class="comment">// Switch the good test</font> +00101 <font class="keywordflow">switch</font> (primitive.getPrimitiveTypeInternal()) +00102 { +00103 +00104 <font class="comment">// Static box over...</font> +00105 <font class="keywordflow">case</font> UMovePrimitive::_2DOrientedBox: +00106 { +00107 <font class="comment">// Switch second type</font> +00108 <font class="keywordflow">switch</font> (otherPrimitive.getPrimitiveTypeInternal()) +00109 { +00110 +00111 <font class="comment">// Static box over movable box</font> +00112 <font class="keywordflow">case</font> UMovePrimitive::_2DOrientedBox: +00113 <font class="comment">// Make the test</font> +00114 <font class="keywordflow">return</font> <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a36">evalCollisionOBoverOB</a> (other, desc, timeMin, timeMax, firstContactTime, lastContactTime, primitive, otherPrimitive); +00115 +00116 <font class="comment">// Static box over movable cylinder</font> +00117 <font class="keywordflow">case</font> UMovePrimitive::_2DOrientedCylinder: +00118 <font class="comment">// Make the test</font> +00119 <font class="keywordflow">return</font> <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a37">evalCollisionOBoverOC</a> (other, desc, timeMin, timeMax, firstContactTime, lastContactTime, primitive, otherPrimitive); +00120 +00121 <font class="keywordflow">default</font>: +00122 <font class="comment">// Should not go here</font> +00123 <a class="code" href="debug_8h.html#a12">nlstop</a>; +00124 } +00125 } +00126 +00127 <font class="comment">// Static box over...</font> +00128 <font class="keywordflow">case</font> UMovePrimitive::_2DOrientedCylinder: +00129 { +00130 <font class="comment">// Switch second type</font> +00131 <font class="keywordflow">switch</font> (otherPrimitive.getPrimitiveTypeInternal()) +00132 { +00133 +00134 <font class="comment">// Static box over movable box</font> +00135 <font class="keywordflow">case</font> UMovePrimitive::_2DOrientedBox: +00136 { +00137 <font class="comment">// Make the test</font> +00138 <font class="keywordtype">bool</font> collid=other.evalCollisionOBoverOC (*<font class="keyword">this</font>, desc, timeMin, timeMax, firstContactTime, lastContactTime, otherPrimitive, +00139 primitive); +00140 <font class="keywordflow">if</font> (collid) +00141 desc.XChgContactNormals (); +00142 <font class="keywordflow">return</font> collid; +00143 } +00144 +00145 <font class="comment">// Static box over movable cylinder</font> +00146 <font class="keywordflow">case</font> UMovePrimitive::_2DOrientedCylinder: +00147 <font class="comment">// Make the test</font> +00148 <font class="keywordflow">return</font> <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a38">evalCollisionOCoverOC</a> (other, desc, timeMin, timeMax, firstContactTime, lastContactTime, primitive, otherPrimitive); +00149 +00150 <font class="keywordflow">default</font>: +00151 <font class="comment">// Should not go here</font> +00152 <a class="code" href="debug_8h.html#a12">nlstop</a>; +00153 } +00154 } +00155 +00156 <font class="keywordflow">default</font>: +00157 <font class="comment">// Should not go here</font> +00158 <a class="code" href="debug_8h.html#a12">nlstop</a>; +00159 } +00160 +00161 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00162 } +00163 +00164 <font class="comment">// ***************************************************************************</font> +00165 +<a name="l00166"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a42">00166</a> <font class="keyword">const</font> <a class="code" href="namespaceNLPACS.html#a0">TCollisionSurfaceDescVector</a> *CPrimitiveWorldImage::evalCollision (CGlobalRetriever &retriever, CCollisionSurfaceTemp& surfaceTemp, +00167 uint32 testTime, uint32 maxTestIteration, CMovePrimitive& primitive) +00168 { +00169 <font class="comment">// H_AUTO(PACS_PWI_evalCollision_short);</font> +00170 +00171 <font class="comment">// Test time</font> +00172 <font class="keywordflow">if</font> (!primitive.checkTestTime (testTime, maxTestIteration)) +00173 <font class="keywordflow">return</font> NULL; +00174 +00175 <font class="comment">// Switch the good test</font> +00176 <font class="keywordflow">if</font> (primitive.getPrimitiveTypeInternal()==UMovePrimitive::_2DOrientedBox) +00177 { +00178 <font class="comment">// Local I</font> +00179 CVector locI ((<font class="keywordtype">float</font>)(<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.EdgeDirectionX[0]*primitive.getLength(0)/2.0), (float)(<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.EdgeDirectionY[0]*primitive.getLength(1)/2.0), 0); +00180 +00181 <font class="comment">// Local J</font> +00182 CVector locJ ((<font class="keywordtype">float</font>)(<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.EdgeDirectionX[1]*primitive.getLength(0)/2.0), (float)(<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.EdgeDirectionY[1]*primitive.getLength(1)/2.0), 0); +00183 +00184 <font class="comment">// Test</font> +00185 <font class="keywordflow">return</font> retriever.testBBoxMove (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a2">getGlobalPos</a> (), <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o4">_DeltaPosition</a>, locI, locJ, surfaceTemp); +00186 } +00187 <font class="keywordflow">else</font> +00188 { +00189 <font class="comment">// Check</font> +00190 <a class="code" href="debug_8h.html#a6">nlassert</a> (primitive.getPrimitiveTypeInternal()==UMovePrimitive::_2DOrientedCylinder); +00191 +00192 <font class="comment">// Test</font> +00193 <font class="comment">//nlinfo ("1) %f %f %f\n", _DeltaPosition.x, _DeltaPosition.y, _DeltaPosition.z);</font> +00194 +00195 <font class="keywordflow">return</font> retriever.testCylinderMove (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a2">getGlobalPos</a> (), <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o4">_DeltaPosition</a>, primitive.getRadiusInternal(), surfaceTemp); +00196 } +00197 } +00198 +00199 <font class="comment">// ***************************************************************************</font> +00200 +<a name="l00201"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a43">00201</a> <font class="keywordtype">void</font> CPrimitiveWorldImage::doMove (CGlobalRetriever &retriever, CCollisionSurfaceTemp& surfaceTemp, <font class="keywordtype">double</font> originalMax, <font class="keywordtype">double</font> finalMax, <font class="keywordtype">bool</font> keepZ <font class="comment">/*= false*/</font>) +00202 { +00203 <font class="comment">// H_AUTO(PACS_PWI_doMove_long);</font> +00204 +00205 <font class="comment">// Time to avance</font> +00206 <font class="keywordtype">double</font> ratio; +00207 <font class="keywordflow">if</font> (finalMax!=originalMax) +00208 ratio=(finalMax-<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o2">_InitTime</a>)/(originalMax-<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o2">_InitTime</a>); +00209 <font class="keywordflow">else</font> +00210 ratio=1; +00211 +00212 <font class="comment">// Make the move</font> +00213 <font class="keywordflow">if</font> (!keepZ) +00214 { +00215 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a3">setGlobalPos</a> (retriever.doMove(<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a2">getGlobalPos</a>(), <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o4">_DeltaPosition</a>, (float)ratio, surfaceTemp, <font class="keyword">false</font>), retriever); +00216 } +00217 <font class="keywordflow">else</font> +00218 { +00219 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a4">setGlobalPosKeepZ</a>(retriever.doMove(<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a2">getGlobalPos</a>(), <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o4">_DeltaPosition</a>, (float)ratio, surfaceTemp, <font class="keyword">false</font>), retriever); +00220 } +00221 +00222 +00223 <font class="comment">// Final position</font> +00224 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o2">_InitTime</a>=finalMax; +00225 } +00226 +00227 <font class="comment">// ***************************************************************************</font> +00228 +<a name="l00229"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a44">00229</a> <font class="keywordtype">void</font> CPrimitiveWorldImage::doMove (<font class="keywordtype">double</font> timeMax) +00230 { +00231 <font class="comment">// H_AUTO(PACS_PWI_doMove_short);</font> +00232 +00233 <font class="comment">// Make the move</font> +00234 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a1">setPos</a> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a0">getPos</a> ()+<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>*(timeMax-<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o2">_InitTime</a>)); +00235 +00236 <font class="comment">// Final position</font> +00237 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o2">_InitTime</a>=timeMax; +00238 } +00239 +00240 <font class="comment">// ***************************************************************************</font> +00241 +<a name="l00242"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a36">00242</a> <font class="keywordtype">bool</font> CPrimitiveWorldImage::evalCollisionOBoverOB (CPrimitiveWorldImage& other, CCollisionDesc& desc, <font class="keywordtype">double</font> timeMin, <font class="keywordtype">double</font> timeMax, +00243 <font class="keywordtype">double</font> &firstContactTime, <font class="keywordtype">double</font> &lastContactTime, CMovePrimitive& primitive, +00244 CMovePrimitive& otherPrimitive) +00245 { +00246 <font class="comment">// Checks</font> +00247 <a class="code" href="debug_8h.html#a6">nlassert</a> (primitive.getPrimitiveTypeInternal()==UMovePrimitive::_2DOrientedBox); +00248 <a class="code" href="debug_8h.html#a6">nlassert</a> (otherPrimitive.getPrimitiveTypeInternal()==UMovePrimitive::_2DOrientedBox); +00249 +00250 <font class="comment">// Find a collision</font> +00251 <font class="keywordtype">bool</font> find=<font class="keyword">false</font>; +00252 +00253 <font class="comment">// Best time</font> +00254 desc.ContactTime=FLT_MAX; +00255 +00256 <font class="comment">// Timemin</font> +00257 <font class="keywordtype">double</font> _timeMax=-FLT_MAX; +00258 +00259 <font class="comment">// Check movable points over the edge</font> +00260 uint pt; +00261 uint seg; +00262 <font class="keywordflow">for</font> (pt=0; pt<4; pt++) +00263 <font class="keywordflow">for</font> (seg=0; seg<4; seg++) +00264 { +00265 <font class="comment">// Get collision time of the point over the segment</font> +00266 CCollisionDesc d; +00267 <font class="keywordflow">if</font> ( <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a39">evalCollisionPoverS</a> (other, d, pt, seg, primitive, otherPrimitive) ) +00268 { +00269 <font class="comment">// Find</font> +00270 find=<font class="keyword">true</font>; +00271 +00272 <font class="comment">// Best time ?</font> +00273 <font class="keywordflow">if</font> (d.ContactTime<desc.ContactTime) +00274 { +00275 <font class="comment">// This is the new descriptor</font> +00276 desc=d; +00277 } +00278 +00279 <font class="comment">// Best max time ?</font> +00280 <font class="keywordflow">if</font> (d.ContactTime>_timeMax) +00281 { +00282 <font class="comment">// This is the new max time</font> +00283 _timeMax=d.ContactTime; +00284 } +00285 } +00286 } +00287 +00288 <font class="comment">// Check static points over the movable box</font> +00289 <font class="keywordflow">for</font> (pt=0; pt<4; pt++) +00290 <font class="keywordflow">for</font> (seg=0; seg<4; seg++) +00291 { +00292 <font class="comment">// Get collision time of the point over the segment</font> +00293 CCollisionDesc d; +00294 <font class="keywordflow">if</font> (other.evalCollisionPoverS (*<font class="keyword">this</font>, d, pt, seg, primitive, otherPrimitive)) +00295 { +00296 <font class="comment">// Find</font> +00297 find=<font class="keyword">true</font>; +00298 +00299 <font class="comment">// Best time ?</font> +00300 <font class="keywordflow">if</font> (d.ContactTime<desc.ContactTime) +00301 { +00302 <font class="comment">// This is the new descriptor</font> +00303 desc=d; +00304 } +00305 +00306 <font class="comment">// Best max time ?</font> +00307 <font class="keywordflow">if</font> (d.ContactTime>_timeMax) +00308 { +00309 <font class="comment">// This is the new max time</font> +00310 _timeMax=d.ContactTime; +00311 } +00312 } +00313 } +00314 +00315 <font class="keywordflow">if</font> (find) +00316 { +00317 <font class="comment">// First last contact time</font> +00318 firstContactTime=desc.ContactTime; +00319 lastContactTime=_timeMax; +00320 +00321 <font class="comment">// Half time</font> +00322 <font class="comment">//double halfTime = (_timeMax+desc.ContactTime)/2.0;</font> +00323 +00324 <font class="comment">// Collision in the past ?</font> +00325 <font class="comment">//if (timeMin > halfTime)</font> +00326 <font class="keywordflow">if</font> (timeMin > _timeMax) +00327 <font class="comment">// yes, abort</font> +00328 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00329 +00330 <font class="comment">// Collision not in the future ?</font> +00331 <font class="keywordflow">if</font> (timeMax>desc.ContactTime) +00332 { +00333 <font class="comment">// Clamp time</font> +00334 <font class="keywordflow">if</font> (desc.ContactTime<timeMin) +00335 desc.ContactTime=timeMin; +00336 +00337 <font class="comment">// yes, found it</font> +00338 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00339 } +00340 } +00341 +00342 <font class="comment">// No collision found</font> +00343 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00344 } +00345 +00346 <font class="comment">// ***************************************************************************</font> +00347 +<a name="l00348"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a37">00348</a> <font class="keywordtype">bool</font> CPrimitiveWorldImage::evalCollisionOBoverOC (CPrimitiveWorldImage& other, CCollisionDesc& desc, <font class="keywordtype">double</font> timeMin, <font class="keywordtype">double</font> timeMax, +00349 <font class="keywordtype">double</font> &firstContactTime, <font class="keywordtype">double</font> &lastContactTime, CMovePrimitive& primitive, +00350 CMovePrimitive& otherPrimitive) +00351 { +00352 <font class="comment">// Checks</font> +00353 <a class="code" href="debug_8h.html#a6">nlassert</a> (primitive.getPrimitiveTypeInternal()==UMovePrimitive::_2DOrientedBox); +00354 <a class="code" href="debug_8h.html#a6">nlassert</a> (otherPrimitive.getPrimitiveTypeInternal()==UMovePrimitive::_2DOrientedCylinder); +00355 +00356 <font class="comment">// Find a collision</font> +00357 <font class="keywordtype">bool</font> find=<font class="keyword">false</font>; +00358 +00359 <font class="comment">// Best time</font> +00360 desc.ContactTime=FLT_MAX; +00361 +00362 <font class="comment">// time min clip</font> +00363 <font class="keywordtype">double</font> _timeMax = -FLT_MAX; +00364 +00365 <font class="comment">// Check movable points over the cylinder</font> +00366 uint pt; +00367 <font class="keywordflow">for</font> (pt=0; pt<4; pt++) +00368 { +00369 <font class="comment">// Get collision time of the point over the segment</font> +00370 CCollisionDesc d; +00371 <font class="keywordtype">double</font> firstContactTime; +00372 <font class="keywordtype">double</font> lastContactTime; +00373 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a40">evalCollisionPoverOC</a> (other, d, pt, firstContactTime, lastContactTime, primitive, otherPrimitive)) +00374 { +00375 <font class="comment">// Found</font> +00376 find=<font class="keyword">true</font>; +00377 +00378 <font class="comment">// Best time ?</font> +00379 <font class="keywordflow">if</font> (firstContactTime<desc.ContactTime) +00380 { +00381 <font class="comment">// This is the new descriptor</font> +00382 desc=d; +00383 } +00384 +00385 <font class="comment">// Best max time ?</font> +00386 <font class="keywordflow">if</font> (lastContactTime>_timeMax) +00387 { +00388 <font class="comment">// New max time</font> +00389 _timeMax=lastContactTime; +00390 } +00391 } +00392 } +00393 +00394 <font class="comment">// Check static points over the movable box</font> +00395 uint seg; +00396 <font class="keywordflow">for</font> (seg=0; seg<4; seg++) +00397 { +00398 <font class="comment">// Get collision time of the point over the segment</font> +00399 CCollisionDesc d; +00400 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a41">evalCollisionSoverOC</a> (other, d, seg, primitive, otherPrimitive)) +00401 { +00402 <font class="comment">// Found</font> +00403 find=<font class="keyword">true</font>; +00404 +00405 <font class="comment">// Best time ?</font> +00406 <font class="keywordflow">if</font> (d.ContactTime<desc.ContactTime) +00407 { +00408 <font class="comment">// This is the new descriptor</font> +00409 desc=d; +00410 } +00411 +00412 <font class="comment">// Best max time ?</font> +00413 <font class="keywordflow">if</font> (d.ContactTime>_timeMax) +00414 { +00415 <font class="comment">// New max time</font> +00416 _timeMax=d.ContactTime; +00417 } +00418 } +00419 } +00420 +00421 <font class="keywordflow">if</font> (find) +00422 { +00423 <font class="comment">// First last contact time</font> +00424 firstContactTime=desc.ContactTime; +00425 lastContactTime=_timeMax; +00426 +00427 <font class="comment">// Half time</font> +00428 <font class="comment">//double halfTime = (_timeMax+desc.ContactTime)/2.0;</font> +00429 +00430 <font class="comment">// Collision in the past ?</font> +00431 <font class="comment">//if (timeMin > halfTime)</font> +00432 <font class="keywordflow">if</font> (timeMin > _timeMax) +00433 <font class="comment">// yes, abort</font> +00434 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00435 +00436 <font class="comment">// Collision not in the future ?</font> +00437 <font class="keywordflow">if</font> (timeMax>desc.ContactTime) +00438 { +00439 <font class="comment">// Clamp time</font> +00440 <font class="keywordflow">if</font> (desc.ContactTime<timeMin) +00441 desc.ContactTime=timeMin; +00442 +00443 <font class="comment">// yes, found it</font> +00444 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00445 } +00446 } +00447 +00448 <font class="comment">// No collision found</font> +00449 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00450 } +00451 +00452 <font class="comment">// ***************************************************************************</font> +00453 +<a name="l00454"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a39">00454</a> <font class="keywordtype">bool</font> CPrimitiveWorldImage::evalCollisionPoverS (CPrimitiveWorldImage& other, CCollisionDesc& desc, uint numPoint, uint numSeg, +00455 CMovePrimitive& primitive, CMovePrimitive& otherPrimitive) +00456 { +00457 <font class="comment">// Checks</font> +00458 <a class="code" href="debug_8h.html#a6">nlassert</a> (primitive.getPrimitiveTypeInternal()==UMovePrimitive::_2DOrientedBox); +00459 <a class="code" href="debug_8h.html#a6">nlassert</a> (otherPrimitive.getPrimitiveTypeInternal()==UMovePrimitive::_2DOrientedBox); +00460 +00461 <font class="comment">// Some constants</font> +00462 <font class="keyword">const</font> <font class="keywordtype">double</font> normalSegX=other._OBData.EdgeDirectionY[numSeg]; +00463 <font class="keyword">const</font> <font class="keywordtype">double</font> normalSegY=-other._OBData.EdgeDirectionX[numSeg]; +00464 +00465 <font class="comment">// Relative speed</font> +00466 <font class="keyword">const</font> <font class="keywordtype">double</font> speedX=other._Speed.x-<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>; +00467 <font class="keyword">const</font> <font class="keywordtype">double</font> speedY=other._Speed.y-<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>; +00468 +00469 <font class="comment">// Dot product with the plan tangeante</font> +00470 <font class="keywordtype">double</font> dotProd= speedX*normalSegX + speedY*normalSegY; +00471 <font class="comment">//if ( dotProd > 0 )</font> +00472 <font class="keywordflow">if</font> ( dotProd != 0 ) +00473 { +00474 <font class="comment">// Time of the collision</font> +00475 <font class="keywordtype">double</font> time= (normalSegX*(<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[numPoint] - other._OBData.PointPosX[numSeg]) + +00476 normalSegY*(<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[numPoint] - other._OBData.PointPosY[numSeg])) / dotProd; +00477 +00478 <font class="comment">// Position of segment point at collision time</font> +00479 <font class="keyword">const</font> <font class="keywordtype">double</font> segPosX= other._OBData.PointPosX[numSeg] + other._Speed.x*time; +00480 <font class="keyword">const</font> <font class="keywordtype">double</font> segPosY= other._OBData.PointPosY[numSeg] + other._Speed.y*time; +00481 +00482 <font class="comment">// Position of the point at collision time</font> +00483 <font class="keyword">const</font> <font class="keywordtype">double</font> ptPosX= <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[numPoint] + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>*time; +00484 <font class="keyword">const</font> <font class="keywordtype">double</font> ptPosY= <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[numPoint] + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>*time; +00485 +00486 <font class="comment">// Direction of the collision on the segment</font> +00487 <font class="keyword">const</font> <font class="keywordtype">double</font> dirX= ptPosX - segPosX; +00488 <font class="keyword">const</font> <font class="keywordtype">double</font> dirY= ptPosY - segPosY; +00489 +00490 <font class="comment">// Length of this vector</font> +00491 <font class="keyword">const</font> <font class="keywordtype">double</font> length= dirY*normalSegX - dirX*normalSegY; +00492 +00493 <font class="comment">// Included ?</font> +00494 <font class="keywordflow">if</font> ( ( length >= 0 ) && ( length <= otherPrimitive.getLength(numSeg&1) ) ) +00495 { +00496 <font class="comment">// 2d Collid checked... Now check height</font> +00497 +00498 <font class="comment">// Pos Z</font> +00499 <font class="keyword">const</font> <font class="keywordtype">double</font> pointSegZ=other._3dInitPosition.z; +00500 <font class="keyword">const</font> <font class="keywordtype">double</font> segPosZ= pointSegZ + other._Speed.z*time; +00501 +00502 <font class="comment">// Some constants</font> +00503 <font class="keyword">const</font> <font class="keywordtype">double</font> pointZ=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m2">z</a>; +00504 <font class="keyword">const</font> <font class="keywordtype">double</font> ptPosZ= pointZ + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m2">z</a>*time; +00505 +00506 <font class="comment">// Included ?</font> +00507 <font class="keywordflow">if</font> ( (ptPosZ <= segPosZ + otherPrimitive.getHeightInternal()) && (ptPosZ + primitive.getHeightInternal() >= segPosZ) ) +00508 { +00509 <font class="comment">// Ok Collision, fill the result</font> +00510 +00511 <font class="comment">// Time</font> +00512 desc.ContactTime=time; +00513 +00514 <font class="comment">// Position</font> +00515 desc.ContactPosition.x=ptPosX; +00516 desc.ContactPosition.y=ptPosY; +00517 desc.ContactPosition.z=std::max (segPosZ, ptPosZ); +00518 +00519 <font class="comment">// Seg box normal</font> +00520 desc.ContactNormal1.x=normalSegX; +00521 desc.ContactNormal1.y=normalSegY; +00522 desc.ContactNormal1.z=0; +00523 desc.ContactNormal0.x=-desc.ContactNormal1.x; +00524 desc.ContactNormal0.y=-desc.ContactNormal1.y; +00525 desc.ContactNormal0.z=0; +00526 +00527 <font class="comment">// End</font> +00528 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00529 } +00530 } +00531 } +00532 +00533 <font class="comment">// No collision</font> +00534 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00535 } +00536 +00537 <font class="comment">// ***************************************************************************</font> +00538 +00539 <font class="keyword">inline</font> uint <a class="code" href="namespaceNLPACS.html#a29">secondDegree</a> (<font class="keywordtype">double</font> a, <font class="keywordtype">double</font> b, <font class="keywordtype">double</font> c, <font class="keywordtype">double</font>& s0, <font class="keywordtype">double</font>& s1) +00540 { +00541 <font class="keywordtype">double</font> d=b*b-4.f*a*c; +00542 <font class="keywordflow">if</font> (d>0) +00543 { +00544 <font class="comment">// sqrt d</font> +00545 d=(double)sqrt (d); +00546 +00547 <font class="comment">// 1 / 2a</font> +00548 a=0.5f/a; +00549 +00550 <font class="comment">// 2 solutions</font> +00551 s0 = (-b-d)*a; +00552 s1 = (-b+d)*a; +00553 +00554 <font class="keywordflow">return</font> 2; +00555 } +00556 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (d<0) +00557 { +00558 <font class="comment">// No solution</font> +00559 <font class="keywordflow">return</font> 0; +00560 } +00561 <font class="keywordflow">else</font> +00562 { +00563 <font class="comment">// 1 solution</font> +00564 s0 = -b/(2.f*a); +00565 +00566 <font class="keywordflow">return</font> 1; +00567 } +00568 } +00569 +00570 <font class="comment">// ***************************************************************************</font> +00571 +<a name="l00572"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a40">00572</a> <font class="keywordtype">bool</font> CPrimitiveWorldImage::evalCollisionPoverOC (CPrimitiveWorldImage& other, CCollisionDesc& desc, uint numPoint, +00573 <font class="keywordtype">double</font> &firstContactTime, <font class="keywordtype">double</font> &lastContactTime, CMovePrimitive& primitive, +00574 CMovePrimitive& otherPrimitive) +00575 { +00576 <font class="comment">// Checks</font> +00577 <a class="code" href="debug_8h.html#a6">nlassert</a> (primitive.getPrimitiveTypeInternal()==UMovePrimitive::_2DOrientedBox); +00578 <a class="code" href="debug_8h.html#a6">nlassert</a> (otherPrimitive.getPrimitiveTypeInternal()==UMovePrimitive::_2DOrientedCylinder); +00579 +00580 <font class="comment">/* Point Equ:</font> +00581 <font class="comment"> * p(t) = p0 + v0*(t - t0)</font> +00582 <font class="comment"> *</font> +00583 <font class="comment"> * Cylinder center Equ:</font> +00584 <font class="comment"> * p'(t) = p'0 + v'0*(t - t'0)</font> +00585 <font class="comment"> *</font> +00586 <font class="comment"> * Find t for this equation:</font> +00587 <font class="comment"> * R² = Norm² (p(t) - p'(t))</font> +00588 <font class="comment"> * R² = Norm² ( p0 + v0 ( t - t0 ) - p'0 - v'0 ( t - t'0 ) )</font> +00589 <font class="comment"> *</font> +00590 <font class="comment"> * A = p0 - v0*t0 - p'0 + v'0*t'0</font> +00591 <font class="comment"> * B = (v0 - v'0)</font> +00592 <font class="comment"> *</font> +00593 <font class="comment"> * Norm² (B)*t² + 2*(A.B)*t + Norm² (A) - R² = 0</font> +00594 <font class="comment"> *</font> +00595 <font class="comment"> * a = Norm² (B)</font> +00596 <font class="comment"> * b = 2*(A.B)</font> +00597 <font class="comment"> * c = Norm² (A) - R²</font> +00598 <font class="comment"> *</font> +00599 <font class="comment"> * a*t² + b*t + c = 0</font> +00600 <font class="comment"> */</font> +00601 +00602 <font class="comment">// Let's go</font> +00603 <font class="keyword">const</font> <font class="keywordtype">double</font> _Ax = <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[numPoint] - other._3dInitPosition.x; +00604 <font class="keyword">const</font> <font class="keywordtype">double</font> _Ay = <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[numPoint] - other._3dInitPosition.y; +00605 <font class="keyword">const</font> <font class="keywordtype">double</font> _Bx = <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a> - other._Speed.x; +00606 <font class="keyword">const</font> <font class="keywordtype">double</font> _By = <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a> - other._Speed.y; +00607 +00608 <font class="comment">// Eval system</font> +00609 <font class="keywordtype">double</font> s0, s1; +00610 <font class="keywordtype">double</font> squareRadius=otherPrimitive.getRadiusInternal()*otherPrimitive.getRadiusInternal(); +00611 uint numSolution=<a class="code" href="namespaceNLPACS.html#a29">secondDegree</a> (_Bx*_Bx+_By*_By, 2.f*(_Ax*_Bx+_Ay*_By), _Ax*_Ax+_Ay*_Ay-squareRadius, s0, s1); +00612 <font class="keywordflow">if</font> (numSolution!=0) +00613 { +00614 <font class="comment">// time</font> +00615 <font class="keywordtype">double</font> time; +00616 +00617 <font class="comment">// Collision time</font> +00618 <font class="keywordflow">if</font> (numSolution==1) +00619 { +00620 firstContactTime=s0; +00621 lastContactTime=s0; +00622 } +00623 <font class="keywordflow">else</font> +00624 { +00625 <font class="comment">// First and last time</font> +00626 <font class="keywordflow">if</font> (s0<s1) +00627 { +00628 firstContactTime=s0; +00629 lastContactTime=s1; +00630 } +00631 <font class="keywordflow">else</font> +00632 { +00633 firstContactTime=s1; +00634 lastContactTime=s0; +00635 } +00636 } +00637 time=firstContactTime; +00638 +00639 <font class="comment">// Pos Z</font> +00640 <font class="keyword">const</font> <font class="keywordtype">double</font> pointCylZ=other._3dInitPosition.z; +00641 <font class="keyword">const</font> <font class="keywordtype">double</font> cylPosZ= pointCylZ + other._Speed.z*time; +00642 +00643 <font class="comment">// Some constants</font> +00644 <font class="keyword">const</font> <font class="keywordtype">double</font> pointZ=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m2">z</a>; +00645 <font class="keyword">const</font> <font class="keywordtype">double</font> ptPosZ= pointZ + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m2">z</a>*time; +00646 +00647 <font class="comment">// Z Included ?</font> +00648 <font class="keywordflow">if</font> ( (ptPosZ <= cylPosZ + otherPrimitive.getHeightInternal()) && (ptPosZ + primitive.getHeightInternal() >= cylPosZ) ) +00649 { +00650 <font class="comment">// Ok Collision, fill the result</font> +00651 +00652 <font class="comment">// Time</font> +00653 desc.ContactTime=time; +00654 +00655 <font class="comment">// Point position</font> +00656 <font class="keyword">const</font> <font class="keywordtype">double</font> ptPosX= <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[numPoint] + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>*time; +00657 <font class="keyword">const</font> <font class="keywordtype">double</font> ptPosY= <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[numPoint] + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>*time; +00658 +00659 <font class="comment">// Cylinder position</font> +00660 <font class="keyword">const</font> <font class="keywordtype">double</font> cylPosX= other._3dInitPosition.x + other._Speed.x*time; +00661 <font class="keyword">const</font> <font class="keywordtype">double</font> cylPosY= other._3dInitPosition.y + other._Speed.y*time; +00662 +00663 <font class="comment">// Position</font> +00664 desc.ContactPosition.x=ptPosX; +00665 desc.ContactPosition.y=ptPosY; +00666 desc.ContactPosition.z=std::max (cylPosZ, ptPosZ); +00667 +00668 <font class="comment">// Cylinder normal</font> +00669 desc.ContactNormal1.x=ptPosX-cylPosX; +00670 desc.ContactNormal1.y=ptPosY-cylPosY; +00671 desc.ContactNormal1.z=0; +00672 desc.ContactNormal1.normalize (); +00673 desc.ContactNormal0.x=-desc.ContactNormal1.x; +00674 desc.ContactNormal0.y=-desc.ContactNormal1.y; +00675 desc.ContactNormal0.z=0; +00676 +00677 <font class="comment">// End</font> +00678 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00679 } +00680 } +00681 +00682 <font class="comment">// No collision</font> +00683 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00684 } +00685 +00686 <font class="comment">// ***************************************************************************</font> +00687 +<a name="l00688"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a41">00688</a> <font class="keywordtype">bool</font> CPrimitiveWorldImage::evalCollisionSoverOC (CPrimitiveWorldImage& other, CCollisionDesc& desc, uint numSeg, CMovePrimitive& primitive, +00689 CMovePrimitive& otherPrimitive) +00690 { +00691 <font class="comment">// Checks</font> +00692 <a class="code" href="debug_8h.html#a6">nlassert</a> (primitive.getPrimitiveTypeInternal()==UMovePrimitive::_2DOrientedBox); +00693 <a class="code" href="debug_8h.html#a6">nlassert</a> (otherPrimitive.getPrimitiveTypeInternal()==UMovePrimitive::_2DOrientedCylinder); +00694 +00695 <font class="comment">// Some constants</font> +00696 <font class="keyword">const</font> <font class="keywordtype">double</font> normalSegX=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.EdgeDirectionY[numSeg]; +00697 <font class="keyword">const</font> <font class="keywordtype">double</font> normalSegY=-<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.EdgeDirectionX[numSeg]; +00698 +00699 <font class="comment">// Relative speed</font> +00700 <font class="keyword">const</font> <font class="keywordtype">double</font> speedX=other._Speed.x-<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>; +00701 <font class="keyword">const</font> <font class="keywordtype">double</font> speedY=other._Speed.y-<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>; +00702 +00703 <font class="comment">// Dot product with the plan tangeante</font> +00704 <font class="keywordtype">double</font> dotProd= speedX*normalSegX + speedY*normalSegY; +00705 <font class="comment">//if ( dotProd < 0 )</font> +00706 <font class="keywordflow">if</font> ( dotProd !=0 ) +00707 { +00708 <font class="comment">// Time of the collision</font> +00709 <font class="keywordtype">double</font> time= (otherPrimitive.getRadiusInternal() + normalSegX*(<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[numSeg] - other._3dInitPosition.x ) + +00710 normalSegY*(<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[numSeg] - other._3dInitPosition.y ) ) / dotProd; +00711 +00712 <font class="comment">// Position of segment point at collision time</font> +00713 <font class="keyword">const</font> <font class="keywordtype">double</font> segPosX= <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[numSeg] + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>*time; +00714 <font class="keyword">const</font> <font class="keywordtype">double</font> segPosY= <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[numSeg] + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>*time; +00715 +00716 <font class="comment">// Position of the cylinder at collision time</font> +00717 <font class="keyword">const</font> <font class="keywordtype">double</font> cylPosX= other._3dInitPosition.x + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>*time; +00718 <font class="keyword">const</font> <font class="keywordtype">double</font> cylPosY= other._3dInitPosition.y + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>*time; +00719 +00720 <font class="comment">// Position de contact</font> +00721 <font class="keyword">const</font> <font class="keywordtype">double</font> contactX= cylPosX - normalSegX*otherPrimitive.getRadiusInternal(); +00722 <font class="keyword">const</font> <font class="keywordtype">double</font> contactY= cylPosY - normalSegY*otherPrimitive.getRadiusInternal(); +00723 +00724 <font class="comment">// Direction of the collision on the segment</font> +00725 <font class="keyword">const</font> <font class="keywordtype">double</font> dirX= contactX - segPosX; +00726 <font class="keyword">const</font> <font class="keywordtype">double</font> dirY= contactY - segPosY; +00727 +00728 <font class="comment">// Length of this vector</font> +00729 <font class="keyword">const</font> <font class="keywordtype">double</font> length= dirY*normalSegX - dirX*normalSegY; +00730 +00731 <font class="comment">// Included ?</font> +00732 <font class="keywordflow">if</font> ( ( length >= 0 ) && ( length <= primitive.getLength (numSeg&1) ) ) +00733 { +00734 <font class="comment">// 2d Collid checked... Now check height</font> +00735 +00736 <font class="comment">// Pos Z</font> +00737 <font class="keyword">const</font> <font class="keywordtype">double</font> segPosZ= <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m2">z</a> + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m2">z</a>*time; +00738 +00739 <font class="comment">// Some constants</font> +00740 <font class="keyword">const</font> <font class="keywordtype">double</font> cylPosZ= other._3dInitPosition.z + other._Speed.z*time; +00741 +00742 <font class="comment">// Included ?</font> +00743 <font class="keywordflow">if</font> ( (cylPosZ <= segPosZ + primitive.getHeightInternal() ) && (cylPosZ + otherPrimitive.getHeightInternal() >= segPosZ) ) +00744 { +00745 <font class="comment">// Ok Collision, fill the result</font> +00746 +00747 <font class="comment">// Time</font> +00748 desc.ContactTime=time; +00749 +00750 <font class="comment">// Position</font> +00751 desc.ContactPosition.x=contactX; +00752 desc.ContactPosition.y=contactY; +00753 desc.ContactPosition.z=std::max (segPosZ, cylPosZ); +00754 +00755 <font class="comment">// Segment normal</font> +00756 desc.ContactNormal0.x=normalSegX; +00757 desc.ContactNormal0.y=normalSegY; +00758 desc.ContactNormal0.z=0; +00759 +00760 <font class="comment">// Seg box normal</font> +00761 desc.ContactNormal1.x=contactX-cylPosX; +00762 desc.ContactNormal1.y=contactY-cylPosY; +00763 desc.ContactNormal1.z=0; +00764 desc.ContactNormal1.normalize (); +00765 +00766 <font class="comment">// End</font> +00767 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00768 } +00769 } +00770 } +00771 +00772 <font class="comment">// No collision</font> +00773 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00774 } +00775 +00776 +00777 <font class="comment">// ***************************************************************************</font> +00778 +<a name="l00779"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a38">00779</a> <font class="keywordtype">bool</font> CPrimitiveWorldImage::evalCollisionOCoverOC (CPrimitiveWorldImage& other, CCollisionDesc& desc, <font class="keywordtype">double</font> timeMin, <font class="keywordtype">double</font> timeMax, +00780 <font class="keywordtype">double</font> &firstContactTime, <font class="keywordtype">double</font> &lastContactTime, CMovePrimitive& primitive, +00781 CMovePrimitive& otherPrimitive) +00782 { +00783 <font class="comment">// Checks</font> +00784 <a class="code" href="debug_8h.html#a6">nlassert</a> (primitive.getPrimitiveTypeInternal()==UMovePrimitive::_2DOrientedCylinder); +00785 <a class="code" href="debug_8h.html#a6">nlassert</a> (otherPrimitive.getPrimitiveTypeInternal()==UMovePrimitive::_2DOrientedCylinder); +00786 +00787 +00788 <font class="comment">/* Cylinder0 center equ:</font> +00789 <font class="comment"> * p(t) = p0 + v0*(t - t0)</font> +00790 <font class="comment"> *</font> +00791 <font class="comment"> * Cylinder1 center equ:</font> +00792 <font class="comment"> * p'(t) = p'0 + v'0*(t - t'0)</font> +00793 <font class="comment"> *</font> +00794 <font class="comment"> * Find t for this equation:</font> +00795 <font class="comment"> * (R + R')² = Norm² (p(t) - p'(t))</font> +00796 <font class="comment"> * (R + R')² = Norm² ( p0 + v0 ( t - t0 ) - p'0 - v'0 ( t - t'0 ) )</font> +00797 <font class="comment"> *</font> +00798 <font class="comment"> * A = p0 - v0*t0 - p'0 + v'0*t'0</font> +00799 <font class="comment"> * B = (v0 - v'0)</font> +00800 <font class="comment"> *</font> +00801 <font class="comment"> * Norm² (B)*t² + 2*(A.B)*t + Norm² (A) - (R + R')² = 0</font> +00802 <font class="comment"> *</font> +00803 <font class="comment"> * a = Norm² (B)</font> +00804 <font class="comment"> * b = 2*(A.B)</font> +00805 <font class="comment"> * c = Norm² (A) - (R + R')²</font> +00806 <font class="comment"> *</font> +00807 <font class="comment"> * a*t² + b*t + c = 0</font> +00808 <font class="comment"> */</font> +00809 +00810 <font class="comment">// Let's go</font> +00811 <font class="keyword">const</font> <font class="keywordtype">double</font> _Ax = <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a> - other._3dInitPosition.x; +00812 <font class="keyword">const</font> <font class="keywordtype">double</font> _Ay = <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a> - other._3dInitPosition.y; +00813 <font class="keyword">const</font> <font class="keywordtype">double</font> _Bx = <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a> - other._Speed.x; +00814 <font class="keyword">const</font> <font class="keywordtype">double</font> _By = <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a> - other._Speed.y; +00815 +00816 <font class="comment">// Eval system</font> +00817 <font class="keywordtype">double</font> s0, s1; +00818 <font class="keywordtype">double</font> radiusSquare=primitive.getRadiusInternal()+otherPrimitive.getRadiusInternal(); +00819 radiusSquare*=radiusSquare; +00820 uint numSolution=<a class="code" href="namespaceNLPACS.html#a29">secondDegree</a> (_Bx*_Bx+_By*_By, 2.f*(_Ax*_Bx+_Ay*_By), _Ax*_Ax+_Ay*_Ay-radiusSquare, s0, s1); +00821 <font class="keywordflow">if</font> (numSolution!=0) +00822 { +00823 <font class="comment">// time</font> +00824 <font class="keywordtype">double</font> _timeMin, _timeMax; +00825 +00826 <font class="comment">// Collision time</font> +00827 <font class="keywordflow">if</font> (numSolution==1) +00828 { +00829 _timeMin=s0; +00830 _timeMax=s0; +00831 } +00832 <font class="keywordflow">else</font> +00833 { +00834 <font class="comment">// Time min and max</font> +00835 <font class="keywordflow">if</font> (s0>s1) +00836 { +00837 _timeMin=s1; +00838 _timeMax=s0; +00839 } +00840 <font class="keywordflow">else</font> +00841 { +00842 _timeMin=s0; +00843 _timeMax=s1; +00844 } +00845 } +00846 +00847 <font class="comment">// half time</font> +00848 <font class="comment">//const double halfTime=(_timeMin+_timeMax)/2.0;</font> +00849 +00850 <font class="comment">// Conatct time</font> +00851 firstContactTime=_timeMin; +00852 lastContactTime=_timeMax; +00853 +00854 <font class="comment">// Clip time</font> +00855 <font class="keywordflow">if</font> ((timeMin<_timeMax)&&(_timeMin<timeMax)) +00856 { +00857 <font class="comment">// Some constants</font> +00858 <font class="keyword">const</font> <font class="keywordtype">double</font> cyl0Time= _timeMin; +00859 <font class="keyword">const</font> <font class="keywordtype">double</font> pointCyl0Z=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m2">z</a>; +00860 <font class="keyword">const</font> <font class="keywordtype">double</font> cyl0PosZ= pointCyl0Z + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m2">z</a>*cyl0Time; +00861 +00862 <font class="comment">// Pos Z</font> +00863 <font class="keyword">const</font> <font class="keywordtype">double</font> cyl1Time= _timeMin; +00864 <font class="keyword">const</font> <font class="keywordtype">double</font> pointCyl1Z=other._3dInitPosition.z; +00865 <font class="keyword">const</font> <font class="keywordtype">double</font> cyl1PosZ= pointCyl1Z + other._Speed.z * cyl1Time; +00866 +00867 <font class="comment">// Z Included ?</font> +00868 <font class="keywordflow">if</font> ( (cyl0PosZ <= cyl1PosZ + otherPrimitive.getHeightInternal() ) && (cyl0PosZ + primitive.getHeightInternal() >= cyl1PosZ) ) +00869 { +00870 <font class="comment">// Ok Collision, fill the result</font> +00871 +00872 <font class="comment">// Time</font> +00873 desc.ContactTime=std::max (_timeMin, timeMin); +00874 +00875 <font class="comment">// Cylinder 0 position</font> +00876 <font class="keyword">const</font> <font class="keywordtype">double</font> cyl0PosX= <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a> + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>*cyl0Time; +00877 <font class="keyword">const</font> <font class="keywordtype">double</font> cyl0PosY= <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a> + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>*cyl0Time; +00878 +00879 <font class="comment">// Cylinder 1 position</font> +00880 <font class="keyword">const</font> <font class="keywordtype">double</font> cyl1PosX= other._3dInitPosition.x + other._Speed.x*cyl1Time; +00881 <font class="keyword">const</font> <font class="keywordtype">double</font> cyl1PosY= other._3dInitPosition.y + other._Speed.y*cyl1Time; +00882 +00883 <font class="comment">// First cylinder normal</font> +00884 desc.ContactNormal0.x= cyl1PosX - cyl0PosX; +00885 desc.ContactNormal0.y= cyl1PosY - cyl0PosY; +00886 desc.ContactNormal0.z= 0; +00887 desc.ContactNormal0.normalize (); +00888 +00889 <font class="comment">// Contact position</font> +00890 desc.ContactPosition.x= desc.ContactNormal0.x*primitive.getRadiusInternal() + cyl0PosX; +00891 desc.ContactPosition.y= desc.ContactNormal0.y*primitive.getRadiusInternal() + cyl0PosY; +00892 desc.ContactPosition.z= std::max (cyl0PosZ, cyl1PosZ); +00893 +00894 <font class="comment">// Second cylinder normal</font> +00895 desc.ContactNormal1.x= -desc.ContactNormal0.x; +00896 desc.ContactNormal1.y= -desc.ContactNormal0.y; +00897 desc.ContactNormal1.z= 0; +00898 +00899 <font class="comment">// End</font> +00900 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00901 } +00902 } +00903 } +00904 +00905 <font class="comment">// No collision</font> +00906 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00907 } +00908 +00909 <font class="comment">// ***************************************************************************</font> +00910 +<a name="l00911"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a32">00911</a> <font class="keywordtype">void</font> CPrimitiveWorldImage::precalcPos (CMovePrimitive &primitive) +00912 { +00913 <font class="comment">// Type of the primitive</font> +00914 uint <a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>=primitive.getPrimitiveTypeInternal(); +00915 +00916 <font class="comment">// Box ?</font> +00917 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>==UMovePrimitive::_2DOrientedBox) +00918 { +00919 <font class="comment">// Calc cosinus and sinus</font> +00920 <font class="keywordtype">double</font> cosinus=(double)cos(<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.Orientation); +00921 <font class="keywordtype">double</font> sinus=(double)sin(<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.Orientation); +00922 +00923 <font class="comment">// Size</font> +00924 <font class="keywordtype">double</font> halfWidth=primitive.getLength (0)/2; +00925 <font class="keywordtype">double</font> halfDepth=primitive.getLength (1)/2; +00926 +00927 <font class="comment">// First point</font> +00928 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[0]=cosinus*(-halfWidth)-sinus*(-halfDepth)+<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>; +00929 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[0]=sinus*(-halfWidth)+cosinus*(-halfDepth)+<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>; +00930 +00931 <font class="comment">// Second point</font> +00932 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[1]=cosinus*halfWidth-sinus*(-halfDepth)+<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>; +00933 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[1]=sinus*halfWidth+cosinus*(-halfDepth)+<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>; +00934 +00935 <font class="comment">// Third point</font> +00936 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[2]=cosinus*halfWidth-sinus*halfDepth+<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>; +00937 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[2]=sinus*halfWidth+cosinus*halfDepth+<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>; +00938 +00939 <font class="comment">// Fourth point</font> +00940 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[3]=cosinus*(-halfWidth)-sinus*halfDepth+<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>; +00941 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[3]=sinus*(-halfWidth)+cosinus*halfDepth+<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>; +00942 +00943 <font class="comment">// Direction</font> +00944 <font class="keywordtype">double</font> oneOverLength[2]= { 1 / primitive.getLength(0), 1 / primitive.getLength(1) }; +00945 +00946 <font class="comment">// Direction</font> +00947 uint i; +00948 <font class="keywordflow">for</font> (i=0; i<4; i++) +00949 { +00950 <font class="comment">// Next index</font> +00951 uint next=(i+1)&3; +00952 <font class="keywordtype">double</font> oneOver=oneOverLength[i&1]; +00953 +00954 <font class="comment">// New direction</font> +00955 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.EdgeDirectionX[i]=(<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[next] - <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[i])*oneOver; +00956 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.EdgeDirectionY[i]=(<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[next] - <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[i])*oneOver; +00957 } +00958 } +00959 <font class="keywordflow">else</font> +00960 { +00961 <font class="comment">// Should be a cylinder</font> +00962 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>==UMovePrimitive::_2DOrientedCylinder); +00963 } +00964 } +00965 +00966 <font class="comment">// ***************************************************************************</font> +00967 +<a name="l00968"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a34">00968</a> <font class="keywordtype">void</font> CPrimitiveWorldImage::precalcBB (<font class="keywordtype">double</font> beginTime, <font class="keywordtype">double</font> endTime, CMovePrimitive &primitive) +00969 { +00970 <font class="comment">// Type of the primitive</font> +00971 uint <a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>=primitive.getPrimitiveTypeInternal(); +00972 +00973 <font class="comment">// Box ?</font> +00974 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>==UMovePrimitive::_2DOrientedBox) +00975 { +00976 <font class="comment">// Orientation index</font> +00977 sint orient= (sint)(256.f*<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.Orientation/(2.f*NLMISC::Pi)); +00978 orient&=0xff; +00979 orient>>=6; +00980 <a class="code" href="debug_8h.html#a6">nlassert</a> (orient>=0); +00981 <a class="code" href="debug_8h.html#a6">nlassert</a> (orient<4); +00982 +00983 <font class="comment">// Compute coordinates</font> +00984 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o6">_BBXMin</a>=FLT_MAX; +00985 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o7">_BBYMin</a>=FLT_MAX; +00986 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o8">_BBXMax</a>=-FLT_MAX; +00987 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o9">_BBYMax</a>=-FLT_MAX; +00988 +00989 <font class="keywordflow">for</font> (uint i=0; i<4; i++) +00990 { +00991 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[i]<<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o6">_BBXMin</a>) +00992 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o6">_BBXMin</a>=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[i]; +00993 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[i]><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o8">_BBXMax</a>) +00994 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o8">_BBXMax</a>=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosX[i]; +00995 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[i]<<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o7">_BBYMin</a>) +00996 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o7">_BBYMin</a>=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[i]; +00997 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[i]><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o9">_BBYMax</a>) +00998 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o9">_BBYMax</a>=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o15">_OBData</a>.PointPosY[i]; +00999 } +01000 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o6">_BBXMin</a>=<a class="code" href="bit__set_8cpp.html#a0">std::min</a> (std::min (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o6">_BBXMin</a>, <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o6">_BBXMin</a>+endTime*<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>), <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o6">_BBXMin</a>+beginTime*<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>); +01001 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o8">_BBXMax</a>=std::max (std::max (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o8">_BBXMax</a>, <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o8">_BBXMax</a>+endTime*<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>), <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o8">_BBXMax</a>+beginTime*<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>); +01002 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o7">_BBYMin</a>=<a class="code" href="bit__set_8cpp.html#a0">std::min</a> (std::min (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o7">_BBYMin</a>, <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o7">_BBYMin</a>+endTime*<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>), <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o7">_BBYMin</a>+beginTime*<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>); +01003 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o9">_BBYMax</a>=std::max (std::max (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o9">_BBYMax</a>, <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o9">_BBYMax</a>+endTime*<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>), <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o9">_BBYMax</a>+beginTime*<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>); +01004 +01005 <font class="comment">/* </font> +01006 <font class="comment"> // This code is faster but buggy.. </font> +01007 <font class="comment"> _BBXMin= _OBData.PointPosX[minX[orient]] + _Speed.x*beginTime;</font> +01008 <font class="comment"> _BBXMin= std::min (_BBXMin, _OBData.PointPosX[minX[orient]] + _Speed.x*endTime);</font> +01009 <font class="comment"></font> +01010 <font class="comment"> _BBYMin= _OBData.PointPosY[minY[orient]] + _Speed.y*beginTime;</font> +01011 <font class="comment"> _BBYMin= std::min (_BBYMin, _OBData.PointPosY[minY[orient]] + _Speed.y*endTime);</font> +01012 <font class="comment"></font> +01013 <font class="comment"> _BBXMax= _OBData.PointPosX[maxX[orient]] + _Speed.x*beginTime;</font> +01014 <font class="comment"> _BBXMax= std::max (_BBXMax, _OBData.PointPosX[maxX[orient]] + _Speed.x*endTime);</font> +01015 <font class="comment"></font> +01016 <font class="comment"> _BBYMax= _OBData.PointPosY[maxY[orient]] + _Speed.y*beginTime;</font> +01017 <font class="comment"> _BBYMax= std::max (_BBYMax, _OBData.PointPosY[maxY[orient]] + _Speed.y*endTime);*/</font> +01018 } +01019 <font class="keywordflow">else</font> +01020 { +01021 <font class="comment">// Should be a cylinder</font> +01022 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>==UMovePrimitive::_2DOrientedCylinder); +01023 +01024 <font class="comment">// Compute X coordinates</font> +01025 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o6">_BBXMin</a>= <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a> + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>*beginTime; +01026 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o8">_BBXMax</a>= <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a> + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>*endTime; +01027 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o6">_BBXMin</a>><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o8">_BBXMax</a>) +01028 { +01029 <font class="keywordtype">double</font> tmp=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o6">_BBXMin</a>; +01030 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o6">_BBXMin</a>=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o8">_BBXMax</a>; +01031 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o8">_BBXMax</a>=tmp; +01032 } +01033 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o6">_BBXMin</a>-=primitive.getRadiusInternal(); +01034 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o8">_BBXMax</a>+=primitive.getRadiusInternal(); +01035 +01036 <font class="comment">// Compute Y coordinates</font> +01037 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o7">_BBYMin</a>= <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a> + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>*beginTime; +01038 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o9">_BBYMax</a>= <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a> + <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>*endTime; +01039 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o7">_BBYMin</a>><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o9">_BBYMax</a>) +01040 { +01041 <font class="keywordtype">double</font> tmp=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o7">_BBYMin</a>; +01042 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o7">_BBYMin</a>=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o9">_BBYMax</a>; +01043 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o9">_BBYMax</a>=tmp; +01044 } +01045 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o7">_BBYMin</a>-=primitive.getRadiusInternal(); +01046 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o9">_BBYMax</a>+=primitive.getRadiusInternal(); +01047 } +01048 +01049 <font class="comment">// Delta position</font> +01050 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o4">_DeltaPosition</a>=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>*(endTime-beginTime); +01051 } +01052 +01053 <font class="comment">// ***************************************************************************</font> +01054 +<a name="l01055"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a23">01055</a> <font class="keywordtype">void</font> CPrimitiveWorldImage::addMoveElement (CMoveCell& cell, 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>, <font class="keywordtype">double</font> centerX, <font class="keywordtype">double</font> centerY, CMovePrimitive *primitive, +01056 CMoveContainer &container, uint8 worldImage) +01057 { +01058 <font class="comment">// Find a free place</font> +01059 uint slot; +01060 <font class="keywordflow">for</font> (slot=0; slot<4; slot++) +01061 { +01062 <font class="comment">// Empty ?</font> +01063 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[slot]==NULL) +01064 { +01065 <font class="comment">// Primitive center</font> +01066 <font class="keywordtype">double</font> cx=(<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o6">_BBXMin</a>+<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o8">_BBXMax</a>)/2.f; +01067 +01068 <font class="comment">// Allocate move element</font> +01069 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[slot]=container.allocateMoveElement (); +01070 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[slot]->Primitive=primitive; +01071 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[slot]->X=<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>; +01072 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[slot]->Y=<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>; +01073 +01074 <font class="comment">// Insert in left or right ?</font> +01075 <font class="keywordflow">if</font> (cx<centerX) +01076 <font class="comment">// In the left</font> +01077 cell.linkFirstX (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[slot]); +01078 <font class="keywordflow">else</font> +01079 <font class="comment">// In the right</font> +01080 cell.linkLastX (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[slot]); +01081 +01082 <font class="comment">/*// Insert in left or right ?</font> +01083 <font class="comment"> if (cy<centerY)</font> +01084 <font class="comment"> // In the left</font> +01085 <font class="comment"> cell.linkFirstY (_MoveElement[slot]);</font> +01086 <font class="comment"> else</font> +01087 <font class="comment"> // In the right</font> +01088 <font class="comment"> cell.linkLastY (_MoveElement[slot]);*/</font> +01089 +01090 <font class="comment">// Move it</font> +01091 cell.updateSortedLists (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[slot], worldImage); +01092 +01093 <font class="comment">// End</font> +01094 <font class="keywordflow">break</font>; +01095 } +01096 } +01097 } +01098 +01099 <font class="comment">// ***************************************************************************</font> +01100 +01101 <font class="keywordtype">void</font> CPrimitiveWorldImage::addMoveElementendOfList (CMoveCell& cell, 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>, CMovePrimitive *primitive, +01102 CMoveContainer &container) +01103 { +01104 <font class="comment">// Find a free place</font> +01105 uint slot; +01106 <font class="keywordflow">for</font> (slot=0; slot<4; slot++) +01107 { +01108 <font class="comment">// Empty ?</font> +01109 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[slot]==NULL) +01110 { +01111 <font class="comment">// Allocate move element</font> +01112 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[slot]=container.allocateMoveElement (); +01113 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[slot]->Primitive=primitive; +01114 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[slot]->X=<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>; +01115 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[slot]->Y=<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>; +01116 +01117 <font class="comment">// In the right</font> +01118 cell.linkLastX (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[slot]); +01119 +01120 <font class="comment">// End</font> +01121 <font class="keywordflow">break</font>; +01122 } +01123 } +01124 } +01125 +01126 <font class="comment">// ***************************************************************************</font> +01127 +<a name="l01128"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a22">01128</a> <font class="keywordtype">void</font> CPrimitiveWorldImage::removeMoveElement (uint i, CMoveContainer &container, uint8 worldImage) +01129 { +01130 <font class="comment">// Check</font> +01131 <a class="code" href="debug_8h.html#a6">nlassert</a> ((i>=0)||(i<4)); +01132 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[i]!=NULL); +01133 +01134 <font class="comment">// Unlink the element</font> +01135 container.unlinkMoveElement (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[i], worldImage); +01136 +01137 <font class="comment">// Free the move element</font> +01138 container.freeMoveElement (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[i]); +01139 +01140 <font class="comment">// Set to NULL</font> +01141 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[i]=NULL; +01142 } +01143 +01144 <font class="comment">// ***************************************************************************</font> +01145 +<a name="l01146"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a26">01146</a> <font class="keywordtype">void</font> CPrimitiveWorldImage::checkSortedList (uint8 worldImage) +01147 { +01148 <font class="comment">// For the 4 elements</font> +01149 <font class="keywordflow">for</font> (uint i=0; i<4; i++) +01150 { +01151 <font class="comment">// element here ?</font> +01152 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[i]) +01153 { +01154 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[i]->PreviousX) +01155 <a class="code" href="debug_8h.html#a7">nlassertonce</a> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[i]->PreviousX->Primitive->getWorldImage(worldImage)->_BBXMin <= <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o6">_BBXMin</a>); +01156 <font class="keywordflow">if</font> (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o17">_MoveElement</a>[i]->NextX) +01157 <a class="code" href="debug_8h.html#a7">nlassertonce</a> (_BBXMin <= _MoveElement[i]->NextX->Primitive->getWorldImage(worldImage)->_BBXMin); +01158 } +01159 } +01160 } +01161 +01162 <font class="comment">// ***************************************************************************</font> +01163 +<a name="l01164"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a45">01164</a> <font class="keywordtype">void</font> CPrimitiveWorldImage::reaction (CPrimitiveWorldImage& second, <font class="keyword">const</font> CCollisionDesc& desc, CGlobalRetriever* retriever, +01165 CCollisionSurfaceTemp& surfaceTemp, <font class="keywordtype">bool</font> collision, CMovePrimitive &primitive, +01166 CMovePrimitive &otherPrimitive, CMoveContainer *container, uint8 worldImage, uint8 secondWorldImage, +01167 <font class="keywordtype">bool</font> secondConst) +01168 { +01169 <font class="comment">// H_AUTO(PACS_PWI_reaction_long);</font> +01170 +01171 <font class="comment">// TODO: reaction for no collision must be made on the full deltaTime not only to CollisionTime</font> +01172 +01173 <font class="comment">// Get the two reaction codes</font> +01174 UMovePrimitive::TReaction firstReaction=primitive.getReactionTypeInternal(); +01175 UMovePrimitive::TReaction secondReaction=otherPrimitive.getReactionTypeInternal(); +01176 +01177 <font class="comment">// Overide collsion </font> +01178 collision = collision && (primitive.isObstacle ()) && (otherPrimitive.isObstacle ()); +01179 +01180 <font class="comment">// Get the two mass</font> +01181 <font class="keywordtype">float</font> mass0 = primitive.getMass (); +01182 <font class="keywordtype">float</font> mass1 = otherPrimitive.getMass (); +01183 +01184 <font class="comment">// Energy sum</font> +01185 <font class="keywordtype">double</font> projSpeed0 = desc.ContactNormal1 * <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>; +01186 <font class="keywordtype">double</font> projSpeed1 = desc.ContactNormal0 * second._Speed; +01187 <font class="keywordtype">double</font> energySum = (- mass0 * projSpeed0 - mass1 * projSpeed1 ) / 2.0; +01188 +01189 <font class="comment">// Old position</font> +01190 CVectorD collisionPosition=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a>; +01191 collisionPosition+=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>*desc.ContactTime; +01192 +01193 <font class="comment">// Calc new speed</font> +01194 CVectorD newSpeed; +01195 +01196 <font class="comment">// Obstacle ?</font> +01197 <font class="keywordflow">if</font> ( (!collision) || (firstReaction==UMovePrimitive::DoNothing) ) +01198 newSpeed=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>; +01199 <font class="keywordflow">else</font> +01200 { +01201 <font class="keywordflow">switch</font> (firstReaction) +01202 { +01203 <font class="keywordflow">case</font> UMovePrimitive::Slide: +01204 <font class="comment">// Remove projected speed</font> +01205 newSpeed=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a> - projSpeed0 * desc.ContactNormal1; +01206 +01207 <font class="comment">// Reflexion speed</font> +01208 newSpeed+=( primitive.getAttenuation()*energySum / mass0 ) * desc.ContactNormal1; +01209 <font class="keywordflow">break</font>; +01210 <font class="keywordflow">case</font> UMovePrimitive::Reflexion: +01211 <font class="comment">// Remove projected speed</font> +01212 newSpeed=<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a> - projSpeed0 * desc.ContactNormal1; +01213 +01214 <font class="comment">// Reflexion speed</font> +01215 newSpeed+=( primitive.getAttenuation()*energySum / mass0 ) * desc.ContactNormal1; +01216 <font class="keywordflow">break</font>; +01217 <font class="keywordflow">case</font> UMovePrimitive::Stop: +01218 newSpeed.<a class="code" href="classNLMISC_1_1CVectorD.html#z346_0">set</a> (0,0,0); +01219 <font class="keywordflow">break</font>; +01220 <font class="keywordflow">default</font>: <font class="keywordflow">break</font>; +01221 } +01222 } +01223 +01224 <font class="comment">// Set new speed</font> +01225 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a8">setSpeed</a> (newSpeed, container, &primitive, worldImage); +01226 +01227 <font class="comment">// New position at t=0</font> +01228 <font class="keywordflow">if</font> (retriever) +01229 { +01230 <font class="comment">// Make a domove in the Ben data</font> +01231 <font class="keywordtype">double</font> deltaDist= <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o4">_DeltaPosition</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#z345_2">norm</a>(); +01232 <font class="keywordtype">double</font> deltaTime; +01233 <font class="keywordflow">if</font>(deltaDist<0.000001) +01234 deltaTime= 0; +01235 <font class="keywordflow">else</font> +01236 deltaTime=(collisionPosition-<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a0">getPos</a> ()).norm()/deltaDist; +01237 <a class="code" href="debug_8h.html#a6">nlassert</a> (deltaTime>=0); +01238 <a class="code" href="debug_8h.html#a6">nlassert</a> (deltaTime<=1); +01239 +01240 UGlobalPosition newPosition = retriever->doMove (<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a2">getGlobalPos</a> (), <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o4">_DeltaPosition</a>, +01241 (float)deltaTime, surfaceTemp, <font class="keyword">true</font>); +01242 +01243 <font class="comment">// Set the new position</font> +01244 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a3">setGlobalPos</a> (newPosition, *retriever); +01245 +01246 <font class="comment">// Position at t=0</font> +01247 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a> = <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a0">getPos</a>() - newSpeed * desc.ContactTime; +01248 +01249 <font class="comment">// New init time</font> +01250 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o2">_InitTime</a> = desc.ContactTime; +01251 } +01252 <font class="keywordflow">else</font> +01253 { +01254 <font class="comment">// No retriever used</font> +01255 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a1">setPos</a> (collisionPosition); +01256 +01257 <font class="comment">// Position at t=0</font> +01258 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a> = collisionPosition - newSpeed * desc.ContactTime; +01259 +01260 <font class="comment">// New init time</font> +01261 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o2">_InitTime</a> = desc.ContactTime; +01262 } +01263 +01264 <font class="comment">// Dirt pos</font> +01265 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a29">dirtPos</a> (container, &primitive, worldImage); +01266 +01267 <font class="comment">// ****** Second object</font> +01268 +01269 <font class="comment">// Is second object in a static world ?</font> +01270 <font class="keywordflow">if</font> (!secondConst) +01271 { +01272 <font class="comment">// Old position</font> +01273 collisionPosition=second._3dInitPosition; +01274 collisionPosition+=second._Speed * desc.ContactTime; +01275 +01276 <font class="comment">// Obstacle ?</font> +01277 <font class="keywordflow">if</font> ( (!collision) || (secondReaction==UMovePrimitive::DoNothing) ) +01278 newSpeed=second._Speed; +01279 <font class="keywordflow">else</font> +01280 { +01281 <font class="keywordflow">switch</font> (secondReaction) +01282 { +01283 <font class="keywordflow">case</font> UMovePrimitive::Slide: +01284 <font class="comment">// Remove projected speed</font> +01285 newSpeed=second._Speed - projSpeed1 * desc.ContactNormal0; +01286 +01287 <font class="comment">// Reflexion speed</font> +01288 newSpeed+=( otherPrimitive.getAttenuation()*energySum / mass1 ) * desc.ContactNormal1; +01289 <font class="keywordflow">break</font>; +01290 <font class="keywordflow">case</font> UMovePrimitive::Reflexion: +01291 <font class="comment">// Remove projected speed</font> +01292 newSpeed=second._Speed - projSpeed1 * desc.ContactNormal0; +01293 +01294 <font class="comment">// Reflexion speed</font> +01295 newSpeed+=( otherPrimitive.getAttenuation()*energySum / mass1 ) * desc.ContactNormal0; +01296 <font class="keywordflow">break</font>; +01297 <font class="keywordflow">case</font> UMovePrimitive::Stop: +01298 newSpeed.set (0,0,0); +01299 <font class="keywordflow">break</font>; +01300 <font class="keywordflow">default</font>: <font class="keywordflow">break</font>; +01301 } +01302 } +01303 +01304 <font class="comment">// Set new speed</font> +01305 second.setSpeed (newSpeed, container, &otherPrimitive, secondWorldImage); +01306 +01307 <font class="comment">// New position at t=0</font> +01308 <font class="keywordflow">if</font> (retriever) +01309 { +01310 <font class="comment">// Make a domove in the Ben data</font> +01311 <font class="keywordtype">double</font> deltaDist= second._DeltaPosition.norm(); +01312 <font class="keywordtype">double</font> deltaTime; +01313 <font class="keywordflow">if</font>(deltaDist==0) +01314 deltaTime= 0; +01315 <font class="keywordflow">else</font> +01316 deltaTime=(collisionPosition-second._Position.getPos ()).norm()/deltaDist; +01317 <a class="code" href="namespaceNLMISC.html#a215">clamp</a> (deltaTime, 0.0, 1.0); +01318 +01319 UGlobalPosition newPosition = retriever->doMove (second._Position.getGlobalPos (), second._DeltaPosition, +01320 (float)deltaTime, surfaceTemp, <font class="keyword">true</font>); +01321 +01322 <font class="comment">// Set the new position</font> +01323 second._Position.setGlobalPos (newPosition, *retriever); +01324 +01325 <font class="comment">// Position at t=0</font> +01326 second._3dInitPosition = second._Position.getPos() - newSpeed * desc.ContactTime; +01327 +01328 <font class="comment">// New init time</font> +01329 second._InitTime = desc.ContactTime; +01330 } +01331 <font class="keywordflow">else</font> +01332 { +01333 <font class="comment">// No retriever used</font> +01334 second._Position.setPos (collisionPosition); +01335 +01336 <font class="comment">// Position at t=0</font> +01337 second._3dInitPosition = collisionPosition - newSpeed * desc.ContactTime; +01338 +01339 <font class="comment">// New init time</font> +01340 second._InitTime = desc.ContactTime; +01341 } +01342 +01343 <font class="comment">// Dirt pos</font> +01344 second.dirtPos (container, &otherPrimitive, secondWorldImage); +01345 } +01346 } +01347 +01348 <font class="comment">// ***************************************************************************</font> +01349 +<a name="l01350"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a46">01350</a> <font class="keywordtype">void</font> CPrimitiveWorldImage::reaction (<font class="keyword">const</font> CCollisionSurfaceDesc& surfaceDesc, <font class="keyword">const</font> UGlobalPosition& globalPosition, +01351 CGlobalRetriever& retriever, <font class="keywordtype">double</font> ratio, <font class="keywordtype">double</font> dt, CMovePrimitive &primitive, CMoveContainer &container, +01352 uint8 worldImage) +01353 { +01354 <font class="comment">// H_AUTO(PACS_PWI_reaction_short);</font> +01355 +01356 <font class="comment">// Reaction type</font> +01357 uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>=primitive.getReactionTypeInternal(); +01358 +01359 <font class="comment">// Reaction to the collision: copy the CGlobalRetriever::CGlobalPosition</font> +01360 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a3">setGlobalPos</a> (globalPosition, retriever); +01361 +01362 <font class="comment">// Relfexion or slide ?</font> +01363 <font class="keywordflow">if</font> ((<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>==UMovePrimitive::Reflexion)||(<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>==UMovePrimitive::Slide)) +01364 { +01365 <font class="comment">// Slide ?</font> +01366 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>==UMovePrimitive::Slide) +01367 { +01368 <font class="comment">// Project last delta on plane of collision.</font> +01369 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>-= surfaceDesc.ContactNormal*(surfaceDesc.ContactNormal*<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>-<a class="code" href="move__primitive_8h.html#a0">NELPACS_DIST_BACK</a>/(dt-surfaceDesc.ContactTime)); +01370 } +01371 +01372 <font class="comment">// Reflexion ?</font> +01373 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>==UMovePrimitive::Reflexion) +01374 { +01375 <font class="comment">// Project last delta on plane of collision.</font> +01376 <font class="keywordtype">double</font> speedProj=surfaceDesc.ContactNormal*<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>; +01377 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>-=surfaceDesc.ContactNormal*(speedProj+speedProj*primitive.getAttenuation()-<a class="code" href="move__primitive_8h.html#a0">NELPACS_DIST_BACK</a>/(dt-surfaceDesc.ContactTime)); +01378 } +01379 } +01380 <font class="keywordflow">else</font> +01381 { +01382 <font class="comment">// Stop ?</font> +01383 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>==UMovePrimitive::Stop) +01384 { +01385 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>.<a class="code" href="classNLMISC_1_1CVectorD.html#z346_0">set</a> (0,0,0); +01386 } +01387 } +01388 +01389 <font class="comment">// Contact time</font> +01390 <font class="keywordtype">double</font> contactTime=surfaceDesc.ContactTime; +01391 +01392 <font class="comment">// Init position</font> +01393 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a> = <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a0">getPos</a>() - <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a> * contactTime; +01394 +01395 <font class="comment">// Set contactTime</font> +01396 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o2">_InitTime</a>=contactTime; +01397 +01398 <font class="comment">// Dirt pos</font> +01399 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a29">dirtPos</a> (&container, &primitive, worldImage); +01400 } +01401 +01402 <font class="comment">// ***************************************************************************</font> +01403 +<a name="l01404"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a3">01404</a> <font class="keywordtype">void</font> CPrimitiveWorldImage::setGlobalPosition (<font class="keyword">const</font> UGlobalPosition& pos, CMoveContainer& container, CMovePrimitive &primitive, uint8 worldImage) +01405 { +01406 <font class="comment">// Cast type</font> +01407 <a class="code" href="debug_8h.html#a6">nlassert</a> (dynamic_cast<const CMoveContainer*>(&container)); +01408 <font class="keyword">const</font> CMoveContainer *cont=(<font class="keyword">const</font> CMoveContainer*)&container; +01409 +01410 <font class="comment">// Use the global retriever ?</font> +01411 <a class="code" href="debug_8h.html#a6">nlassert</a> (cont->getGlobalRetriever()); +01412 +01413 <font class="comment">// Get the pos</font> +01414 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a3">setGlobalPos</a> (pos, *cont->getGlobalRetriever()); +01415 +01416 <font class="comment">// Precalc some values</font> +01417 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a> = <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a0">getPos</a> (); +01418 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o2">_InitTime</a> = 0; +01419 +01420 <font class="comment">// Speed NULL</font> +01421 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>=CVector::Null; +01422 +01423 <font class="comment">// Dirt BB</font> +01424 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a29">dirtPos</a> (&container, &primitive, worldImage); +01425 } +01426 +01427 <font class="comment">// ***************************************************************************</font> +01428 +<a name="l01429"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a4">01429</a> <font class="keywordtype">void</font> CPrimitiveWorldImage::setGlobalPosition (<font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVectorD.html">NLMISC::CVectorD</a>& pos, CMoveContainer& container, CMovePrimitive &primitive, uint8 worldImage, <font class="keywordtype">bool</font> keepZ <font class="comment">/*= false*/</font>) +01430 { +01431 <font class="comment">// Cast type</font> +01432 <a class="code" href="debug_8h.html#a6">nlassert</a> (dynamic_cast<const CMoveContainer*>(&container)); +01433 <font class="keyword">const</font> CMoveContainer *cont=(<font class="keyword">const</font> CMoveContainer*)&container; +01434 +01435 <font class="comment">// Get the retriever</font> +01436 CGlobalRetriever *retriever=cont->getGlobalRetriever(); +01437 +01438 <font class="comment">// Use a global retriever</font> +01439 <font class="keywordflow">if</font> (retriever) +01440 { +01441 <font class="comment">// Get a cvector</font> +01442 <font class="comment">// CVector vect=pos; // better with CVectorD</font> +01443 +01444 <font class="comment">// Get global position</font> +01445 UGlobalPosition globalPosition=retriever->retrievePosition (pos); +01446 +01447 <font class="keywordflow">if</font> (keepZ) +01448 { +01449 globalPosition.LocalPosition.Estimation.z = (float) pos.<a class="code" href="classNLMISC_1_1CVectorD.html#m2">z</a>; +01450 } +01451 <font class="comment">// Set global position</font> +01452 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a3">setGlobalPos</a> (globalPosition, *retriever); +01453 } +01454 <font class="keywordflow">else</font> +01455 { +01456 <font class="comment">// Set the position</font> +01457 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a1">setPos</a> (pos); +01458 } +01459 +01460 <font class="comment">// Precalc some values</font> +01461 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a> = <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a0">getPos</a> (); +01462 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o2">_InitTime</a> = 0; +01463 +01464 <font class="comment">// Speed NULL</font> +01465 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o5">_Speed</a>=CVector::Null; +01466 +01467 <font class="comment">// Dirt BB</font> +01468 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a29">dirtPos</a> (&container, &primitive, worldImage); +01469 } +01470 +01471 <font class="comment">// ***************************************************************************</font> +01472 +<a name="l01473"></a><a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a7">01473</a> <font class="keywordtype">void</font> CPrimitiveWorldImage::move (<font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVectorD.html">NLMISC::CVectorD</a>& speed, CMoveContainer& container, CMovePrimitive &primitive, uint8 worldImage) +01474 { +01475 <font class="comment">// New speed</font> +01476 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a8">setSpeed</a> (speed, &container, &primitive, worldImage); +01477 +01478 <font class="comment">// Set initial position</font> +01479 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o3">_3dInitPosition</a> = <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o1">_Position</a>.<a class="code" href="classNLPACS_1_1CPrimitiveWorldImage_1_1CPosition.html#a0">getPos</a> (); +01480 +01481 <font class="comment">// Set initial time</font> +01482 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#o2">_InitTime</a> = 0; +01483 +01484 <font class="comment">// Dirt BB</font> +01485 <a class="code" href="classNLPACS_1_1CPrimitiveWorldImage.html#a29">dirtPos</a> (&container, &primitive, worldImage); +01486 } +01487 +01488 <font class="comment">// ***************************************************************************</font> +01489 +01490 +01491 } <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> |