diff options
Diffstat (limited to 'docs/doxygen/nel/ps__zone_8cpp-source.html')
-rw-r--r-- | docs/doxygen/nel/ps__zone_8cpp-source.html | 1526 |
1 files changed, 1526 insertions, 0 deletions
diff --git a/docs/doxygen/nel/ps__zone_8cpp-source.html b/docs/doxygen/nel/ps__zone_8cpp-source.html new file mode 100644 index 00000000..c4b5f654 --- /dev/null +++ b/docs/doxygen/nel/ps__zone_8cpp-source.html @@ -0,0 +1,1526 @@ +<!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>ps_zone.cpp</h1><a href="ps__zone_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="std3d_8h.html">std3d.h</a>"</font> +00027 +00028 <font class="preprocessor">#include "<a class="code" href="ps__zone_8h.html">3d/ps_zone.h</a>"</font> +00029 <font class="preprocessor">#include "<a class="code" href="vertex__buffer_8h.html">3d/vertex_buffer.h</a>"</font> +00030 <font class="preprocessor">#include "<a class="code" href="3d_2primitive__block_8h.html">3d/primitive_block.h</a>"</font> +00031 <font class="preprocessor">#include "<a class="code" href="material_8h.html">3d/material.h</a>"</font> +00032 <font class="preprocessor">#include "<a class="code" href="ps__util_8h.html">3d/ps_util.h</a>"</font> +00033 <font class="preprocessor">#include "<a class="code" href="dru_8h.html">3d/dru.h</a>"</font> +00034 <font class="preprocessor">#include "<a class="code" href="particle__system_8h.html">3d/particle_system.h</a>"</font> +00035 <font class="preprocessor">#include "<a class="code" href="plane_8h.html">nel/misc/plane.h</a>"</font> +00036 +00037 <font class="preprocessor">#include <math.h></font> +00038 <font class="preprocessor">#include <limits></font> +00039 +00040 <font class="keyword">namespace </font>NL3D { +00041 +00042 +00043 <font class="comment">/*</font> +00044 <font class="comment"> * Constructor</font> +00045 <font class="comment"> */</font> +<a name="l00046"></a><a class="code" href="classNL3D_1_1CPSZone.html#a0">00046</a> CPSZone::CPSZone() : _BounceFactor(1.f), _CollisionBehaviour(bounce) +00047 { +00048 } +00049 +<a name="l00050"></a><a class="code" href="classNL3D_1_1CPSZone.html#a7">00050</a> <font class="keywordtype">void</font> CPSZone::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +00051 { +00052 f.serialVersion(1); +00053 CPSTargetLocatedBindable::serial(f); +00054 f.serialEnum(_CollisionBehaviour); +00055 f.serial(_BounceFactor); +00056 <font class="keywordflow">if</font> (f.isReading()) +00057 { +00058 <font class="keywordflow">for</font> (TTargetCont::iterator it = _Targets.begin(); it != _Targets.end(); ++it) +00059 { +00060 <font class="comment">// though this is not a force, this prevent parametric motion</font> +00061 (*it)->addNonIntegrableForceRef(); +00062 } +00063 } +00064 } +00065 +<a name="l00069"></a><a class="code" href="classNL3D_1_1CPSZone.html#a6">00069</a> <font class="keywordtype">void</font> CPSZone::attachTarget(CPSLocated *ptr) +00070 { +00071 +00072 CPSTargetLocatedBindable::attachTarget(ptr); +00073 ptr->queryCollisionInfo(); +00074 ptr->addNonIntegrableForceRef(); +00075 } +00076 +00077 +00078 +00079 +00080 +<a name="l00082"></a><a class="code" href="classNL3D_1_1CPSZone.html#a8">00082</a> <font class="keywordtype">void</font> CPSZone::releaseTargetRsc(CPSLocated *target) +00083 { +00084 <font class="comment">// tell the target that we were using collision infos and that we won't use them anymore</font> +00085 target->releaseCollisionInfo(); +00086 target->releaseNonIntegrableForceRef(); +00087 } +00088 +00089 +00090 +<a name="l00091"></a><a class="code" href="classNL3D_1_1CPSZone.html#a3">00091</a> <font class="keywordtype">void</font> CPSZone::step(<a class="code" href="namespaceNL3D.html#a484">TPSProcessPass</a> pass, <a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime, <a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> realEt) +00092 { +00093 <font class="comment">// for zone, the PSCollision pass and the PSToolRenderPass are processed</font> +00094 <font class="keywordflow">switch</font>(pass) +00095 { +00096 <font class="keywordflow">case</font> <a class="code" href="namespaceNL3D.html#a484a167">PSCollision</a>: +00097 <a class="code" href="classNL3D_1_1CPSZone.html#a4">performMotion</a>(ellapsedTime); +00098 <font class="keywordflow">break</font>; +00099 <font class="keywordflow">case</font> <a class="code" href="namespaceNL3D.html#a484a171">PSToolRender</a>: +00100 <a class="code" href="classNL3D_1_1CPSZone.html#a5">show</a>(ellapsedTime); +00101 <font class="keywordflow">break</font>; +00102 <font class="keywordflow">default</font>: <font class="keywordflow">break</font>; +00103 } +00104 } +00105 +00106 +00107 <font class="comment">// build a basis with K = the normal of the plane</font> +<a name="l00108"></a><a class="code" href="classNL3D_1_1CPSZonePlane.html#b0">00108</a> CMatrix CPSZonePlane::buildBasis(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>)<font class="keyword"> const</font> +00109 <font class="keyword"></font>{ +00110 CMatrix m; +00111 m.setPos(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>]); +00112 CPSUtil::buildSchmidtBasis(<a class="code" href="classNL3D_1_1CPSZonePlane.html#n0">_Normal</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>], m); +00113 <font class="keywordflow">return</font> m; +00114 } +00115 +00116 +00119 <font class="comment">/*void CPSZone::bounce(uint32 locatedIndex, const CVector &bouncePoint, const CVector &surfNormal, float elasticity, TAnimationTime ellapsedTime)</font> +00120 <font class="comment">{</font> +00121 <font class="comment"> CVector &speed = _Owner->getSpeed()[locatedIndex];</font> +00122 <font class="comment"> const CVector &pos = _Owner->getPos()[locatedIndex];</font> +00123 <font class="comment"> CVector &bounceVect = elasticity * (speed - 2.0f * (speed * surfNormal) * surfNormal); // speed vector after collision</font> +00124 <font class="comment"> // now check where the located will be after integration</font> +00125 <font class="comment"> CVector d = bouncePoint - pos;</font> +00126 <font class="comment"> TAnimationTime collideDelay = speed.norm() / d.norm();</font> +00127 <font class="comment"> CVector finalPos = bouncePoint + (ellapsedTime - collideDelay) * bounceVect;</font> +00128 <font class="comment"> // now, we must have pos + ellapsedTime * newSpeed = finalPos </font> +00129 <font class="comment"> // newSpeed = alpha * (finalPos - pos)</font> +00130 <font class="comment"> // so alpha = 1 / ellapsedTime</font> +00131 <font class="comment"></font> +00132 <font class="comment"> speed = (1.0f / ellapsedTime) * (finalPos - pos); </font> +00133 <font class="comment">}*/</font> +00134 +00135 +<a name="l00136"></a><a class="code" href="classNL3D_1_1CPSZonePlane.html#a1">00136</a> <font class="keywordtype">void</font> CPSZonePlane::show(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a>) +00137 { +00138 <font class="keyword">const</font> <font class="keywordtype">float</font> planeSize = 2.0f; +00139 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a21">setupDriverModelMatrix</a>(); +00140 +00141 IDriver *driver = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a10">getDriver</a>(); +00142 uint k = 0; +00143 +00144 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a21">setupDriverModelMatrix</a>(); +00145 +00146 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#l0">CPSLocated</a> *loc; +00147 uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>; +00148 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#z720_0">CPSLocatedBindable</a> *lb; +00149 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getOwner()->getCurrentEditedElement(loc, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, lb); +00150 +00151 +00152 +00153 +00154 +00155 <font class="keywordflow">for</font> (TPSAttribVector::const_iterator it = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().begin(); it != <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().end(); ++it, ++k) +00156 { +00157 <font class="keyword">const</font> CRGBA col = ((lb == NULL || <font class="keyword">this</font> == lb) && loc == <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a> && <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> == k ? CRGBA::Red : CRGBA(127, 127, 127)); +00158 CMatrix mat = <a class="code" href="classNL3D_1_1CPSZonePlane.html#b0">buildBasis</a>(k); +00159 +00160 CPSUtil::displayBasis(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a10">getDriver</a>(), <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a17">getLocatedMat</a>(), mat, 1.f, *<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a11">getFontGenerator</a>(), *<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a13">getFontManager</a>()); +00161 +00162 +00163 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a21">setupDriverModelMatrix</a>(); +00164 +00165 CDRU::drawLine(*it + (planeSize + 3) * mat.getI() + planeSize * mat.getJ() +00166 , *it - (planeSize + 3) * mat.getI() + planeSize * mat.getJ() +00167 , col +00168 , *driver); +00169 +00170 CDRU::drawLine(*it + (planeSize + 3) * mat.getI() - planeSize * mat.getJ() +00171 , *it - (planeSize + 3) * mat.getI() - planeSize * mat.getJ() +00172 , col +00173 , *driver); +00174 +00175 CDRU::drawLine(*it + planeSize * mat.getI() + (planeSize + 3) * mat.getJ() +00176 , *it + planeSize * mat.getI() - (planeSize + 3) * mat.getJ() +00177 , col +00178 , *driver); +00179 CDRU::drawLine(*it - planeSize * mat.getI() + (planeSize + 3) * mat.getJ() +00180 , *it - planeSize * mat.getI() - (planeSize + 3) * mat.getJ() +00181 , col +00182 , *driver); +00183 } +00184 +00185 +00186 } +00187 +00188 +00189 +<a name="l00190"></a><a class="code" href="classNL3D_1_1CPSZonePlane.html#b1">00190</a> <font class="keywordtype">void</font> CPSZonePlane::resize(uint32 size) +00191 { +00192 <a class="code" href="debug_8h.html#a6">nlassert</a>(size < (1 << 16)); +00193 <a class="code" href="classNL3D_1_1CPSZonePlane.html#n0">_Normal</a>.resize(size); +00194 } +00195 +00196 +<a name="l00197"></a><a class="code" href="classNL3D_1_1CPSZonePlane.html#b2">00197</a> <font class="keywordtype">void</font> CPSZonePlane::newElement(CPSLocated *emitterLocated, uint32 emitterIndex) +00198 { +00199 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPSZonePlane.html#n0">_Normal</a>.getSize() != <a class="code" href="classNL3D_1_1CPSZonePlane.html#n0">_Normal</a>.getMaxSize()); +00200 <a class="code" href="classNL3D_1_1CPSZonePlane.html#n0">_Normal</a>.insert(CVector(0, 0, 1)); +00201 } +00202 +00203 +<a name="l00204"></a><a class="code" href="classNL3D_1_1CPSZonePlane.html#b3">00204</a> <font class="keywordtype">void</font> CPSZonePlane::deleteElement(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>) +00205 { +00206 <a class="code" href="classNL3D_1_1CPSZonePlane.html#n0">_Normal</a>.remove(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +00207 } +00208 +00209 +00210 +<a name="l00211"></a><a class="code" href="classNL3D_1_1CPSZonePlane.html#a0">00211</a> <font class="keywordtype">void</font> CPSZonePlane::performMotion(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00212 { +00213 <font class="comment">// for each target, we must check wether they are going through the plane</font> +00214 <font class="comment">// if so they must bounce</font> +00215 TPSAttribVector::const_iterator planePosIt, planePosEnd, normalIt, targetPosIt, targetPosEnd; +00216 CVector dest; +00217 CPSCollisionInfo ci; +00218 CVector startEnd; +00219 uint32 k; +00220 <font class="keyword">const</font> <a class="code" href="namespaceNL3D.html#a180">TPSAttribVector</a> *speedAttr; +00221 <font class="keywordtype">float</font> posSide, negSide; +00222 +00223 <font class="comment">// alpha is the ratio that gives the percent of endPos - startPos that hit the plane</font> +00224 <font class="keywordtype">float</font> <a class="code" href="driver__opengl__extension__def_8h.html#a420">alpha</a>; +00225 +00226 <font class="keywordflow">for</font> (TTargetCont::iterator it = <a class="code" href="classNL3D_1_1CPSTargetLocatedBindable.html#n0">_Targets</a>.begin(); it != <a class="code" href="classNL3D_1_1CPSTargetLocatedBindable.html#n0">_Targets</a>.end(); ++it) +00227 { +00228 +00229 speedAttr = &((*it)->getSpeed()); +00230 <font class="comment">// cycle through the planes</font> +00231 +00232 planePosEnd = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().end(); +00233 <font class="keywordflow">for</font> (planePosIt = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().begin(), normalIt = <a class="code" href="classNL3D_1_1CPSZonePlane.html#n0">_Normal</a>.begin(); planePosIt != planePosEnd +00234 ; ++planePosIt, ++normalIt) +00235 { +00236 +00237 <font class="comment">// we must setup the plane in the good basis</font> +00238 +00239 <font class="keyword">const</font> CMatrix &m = CPSLocated::getConversionMatrix(*it, this->_Owner); +00240 <font class="keyword">const</font> <font class="keywordtype">float</font> epsilon = 0.5f * <a class="code" href="namespaceNL3D.html#a221">PSCollideEpsilon</a>; +00241 +00242 +00243 <a class="code" href="classNLMISC_1_1CPlane.html">NLMISC::CPlane</a> p; +00244 p.<a class="code" href="classNLMISC_1_1CPlane.html#z305_0">make</a>(m.mulVector(*normalIt), m * (*planePosIt)); +00245 +00246 <font class="comment">// deals with each particle</font> +00247 +00248 targetPosEnd = (*it)->getPos().end(); +00249 TPSAttribCollisionInfo::const_iterator ciIt = (*it)->getCollisionInfo().begin(); +00250 <font class="keywordflow">for</font> (targetPosIt = (*it)->getPos().begin(), k = 0; targetPosIt != targetPosEnd; ++targetPosIt, ++k, ++ciIt) +00251 { +00252 <font class="keyword">const</font> CVector &speed = (*speedAttr)[k]; +00253 <font class="comment">// check whether the located is going through the plane</font> +00254 dest = *targetPosIt + ellapsedTime * speed * ciIt->TimeSliceRatio; +00255 +00256 +00257 posSide = p * *targetPosIt; +00258 negSide = p * dest; +00259 +00260 <font class="keywordflow">if</font> (posSide >= - epsilon && negSide <= epsilon) +00261 { +00262 <font class="keywordflow">if</font> (fabsf(posSide - negSide) > <a class="code" href="bit__set_8cpp.html#a0">std::numeric_limits<float>::min</a>()) +00263 { +00264 <a class="code" href="driver__opengl__extension__def_8h.html#a420">alpha</a> = posSide / (posSide - negSide); +00265 } +00266 <font class="keywordflow">else</font> +00267 { +00268 <a class="code" href="driver__opengl__extension__def_8h.html#a420">alpha</a> = 0.f; +00269 } +00270 startEnd = <a class="code" href="driver__opengl__extension__def_8h.html#a420">alpha</a> * (dest - *targetPosIt); +00271 ci.dist = startEnd.norm(); +00272 <font class="comment">// we translate the particle from an epsilon so that it won't get hooked to the plane</font> +00273 ci.newPos = *targetPosIt + startEnd + <a class="code" href="namespaceNL3D.html#a221">PSCollideEpsilon</a> * p.<a class="code" href="classNLMISC_1_1CPlane.html#z305_2">getNormal</a>(); +00274 ci.newSpeed = <a class="code" href="classNL3D_1_1CPSZone.html#n0">_BounceFactor</a> * (speed - 2.0f * (speed * p.<a class="code" href="classNLMISC_1_1CPlane.html#z305_2">getNormal</a>()) * p.<a class="code" href="classNLMISC_1_1CPlane.html#z305_2">getNormal</a>()); +00275 ci.collisionZone = <font class="keyword">this</font>; +00276 (*it)->collisionUpdate(ci, k); +00277 } +00278 } +00279 } +00280 } +00281 } +00282 +<a name="l00283"></a><a class="code" href="classNL3D_1_1CPSZonePlane.html#a3">00283</a> <font class="keywordtype">void</font> CPSZonePlane::setMatrix(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <font class="keyword">const</font> CMatrix &m) +00284 { +00285 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> < <a class="code" href="classNL3D_1_1CPSZonePlane.html#n0">_Normal</a>.getSize()); +00286 <a class="code" href="classNL3D_1_1CPSZonePlane.html#n0">_Normal</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>] = m.getK(); +00287 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>] = m.getPos(); +00288 } +00289 +<a name="l00290"></a><a class="code" href="classNL3D_1_1CPSZonePlane.html#a4">00290</a> CMatrix CPSZonePlane::getMatrix(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>)<font class="keyword"> const</font> +00291 <font class="keyword"></font>{ +00292 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CPSZonePlane.html#b0">buildBasis</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +00293 } +00294 +00295 +<a name="l00296"></a><a class="code" href="classNL3D_1_1CPSZonePlane.html#a6">00296</a> CVector CPSZonePlane::getNormal(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>) +00297 { +00298 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CPSZonePlane.html#n0">_Normal</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>]; +00299 } +<a name="l00300"></a><a class="code" href="classNL3D_1_1CPSZonePlane.html#a7">00300</a> <font class="keywordtype">void</font> CPSZonePlane::setNormal(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, CVector n) +00301 { +00302 <a class="code" href="classNL3D_1_1CPSZonePlane.html#n0">_Normal</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>] = n; +00303 } +00304 +00305 +00306 +00307 +<a name="l00308"></a><a class="code" href="classNL3D_1_1CPSZonePlane.html#a8">00308</a> <font class="keywordtype">void</font> CPSZonePlane::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +00309 { +00310 f.serialVersion(1); +00311 CPSZone::serial(f); +00312 f.serial(_Normal); +00313 } +00314 +00315 +00316 +00318 <font class="comment">// sphere implementation //</font> +00320 <font class="comment"></font> +00321 +00322 +00323 +<a name="l00324"></a><a class="code" href="classNL3D_1_1CPSZoneSphere.html#a0">00324</a> <font class="keywordtype">void</font> CPSZoneSphere::performMotion(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00325 { +00326 <font class="comment">// for each target, we must check wether they are going through the plane</font> +00327 <font class="comment">// if so they must bounce</font> +00328 +00329 TPSAttribRadiusPair::const_iterator radiusIt = <a class="code" href="classNL3D_1_1CPSZoneSphere.html#n0">_Radius</a>.begin(); +00330 TPSAttribVector::const_iterator spherePosIt, spherePosEnd, targetPosIt, targetPosEnd; +00331 CVector dest; +00332 CPSCollisionInfo ci; +00333 uint32 k; +00334 <font class="keyword">const</font> <a class="code" href="namespaceNL3D.html#a180">TPSAttribVector</a> *speedAttr; +00335 +00336 +00337 <font class="keywordtype">float</font> rOut, rIn; +00338 +00339 +00340 <font class="keywordflow">for</font> (TTargetCont::iterator it = <a class="code" href="classNL3D_1_1CPSTargetLocatedBindable.html#n0">_Targets</a>.begin(); it != <a class="code" href="classNL3D_1_1CPSTargetLocatedBindable.html#n0">_Targets</a>.end(); ++it) +00341 { +00342 +00343 speedAttr = &((*it)->getSpeed()); +00344 +00345 +00346 <font class="comment">// cycle through the spheres</font> +00347 +00348 spherePosEnd = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().end(); +00349 <font class="keywordflow">for</font> (spherePosIt = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().begin(), radiusIt = <a class="code" href="classNL3D_1_1CPSZoneSphere.html#n0">_Radius</a>.begin(); spherePosIt != spherePosEnd +00350 ; ++spherePosIt, ++radiusIt) +00351 { +00352 +00353 <font class="comment">// we must setup the sphere in the good basis</font> +00354 +00355 <font class="keyword">const</font> CMatrix &m = CPSLocated::getConversionMatrix(*it, this->_Owner); +00356 +00357 +00358 +00359 CVector center = m * *spherePosIt; +00360 +00361 <font class="comment">// deals with each particle</font> +00362 +00363 +00364 targetPosEnd = (*it)->getPos().end(); +00365 TPSAttribCollisionInfo::const_iterator ciIt = (*it)->getCollisionInfo().begin(); +00366 <font class="keywordflow">for</font> (targetPosIt = (*it)->getPos().begin(), k = 0; targetPosIt != targetPosEnd; ++targetPosIt, ++k, ++ciIt) +00367 { +00368 <font class="keyword">const</font> CVector &speed = (*speedAttr)[k]; +00369 <font class="keyword">const</font> CVector &pos = *targetPosIt; +00370 <font class="comment">// check whether the located is going through the sphere</font> +00371 +00372 <font class="comment">// we don't use raytracing for now because it is too slow ...</font> +00373 +00374 +00375 rOut = (pos - center) * (pos - center); +00376 +00377 <font class="comment">// initial position outside the sphere ?</font> +00378 <font class="keywordflow">if</font> (rOut > radiusIt->R2) +00379 { +00380 dest = pos + ellapsedTime * speed * ciIt->TimeSliceRatio; +00381 rIn = (dest - center) * (dest - center); +00382 +00383 <font class="keyword">const</font> CVector D = dest - pos; +00384 +00385 <font class="comment">// final position inside the sphere ?</font> +00386 +00387 <font class="keywordflow">if</font> ( rIn <= radiusIt->R2) +00388 { +00389 <font class="comment">// discriminant of the intersection equation</font> +00390 <font class="keyword">const</font> <font class="keywordtype">float</font> b = 2.f * (pos * D - D * center), a = D * D +00391 , c = (pos * pos) + (center * center) - 2.f * (pos * center) - radiusIt->R2; +00392 <font class="keywordtype">float</font> d = b * b - 4 * a * c; +00393 +00394 +00395 <font class="keywordflow">if</font> (d <= 0.f) <font class="keywordflow">continue</font>; <font class="comment">// should never happen, but we never know ...</font> +00396 +00397 +00398 d = sqrtf(d); +00399 +00400 <font class="comment">// roots of the equation, we take the smallest </font> +00401 +00402 +00403 <font class="keyword">const</font> <font class="keywordtype">float</font> r1 = .5f * (-b + 2.f * d) * a +00404 , r2 = .5f * (-b - 2.f * d) * a; +00405 +00406 <font class="keyword">const</font> <font class="keywordtype">float</font> <a class="code" href="driver__opengl__extension__def_8h.html#a385">r</a> = <a class="code" href="bit__set_8cpp.html#a0">std::min</a>(r1, r2); +00407 +00408 <font class="comment">// collision point </font> +00409 +00410 <font class="keyword">const</font> CVector C = pos + <a class="code" href="driver__opengl__extension__def_8h.html#a385">r</a> * D; +00411 +00412 +00413 +00414 +00415 +00416 +00417 <font class="keyword">const</font> <font class="keywordtype">float</font> <a class="code" href="driver__opengl__extension__def_8h.html#a420">alpha</a> = ((C - pos) * D) * a; +00418 +00419 <font class="keyword">const</font> CVector startEnd = <a class="code" href="driver__opengl__extension__def_8h.html#a420">alpha</a> * (dest - pos); +00420 +00421 CVector normal = C - center; +00422 normal = normal * (1.f / radiusIt->R); +00423 +00424 +00425 ci.dist = startEnd.norm(); +00426 <font class="comment">// we translate the particle from an epsilon so that it won't get hooked to the sphere</font> +00427 ci.newPos = pos + startEnd + <a class="code" href="namespaceNL3D.html#a221">PSCollideEpsilon</a> * normal; +00428 ci.newSpeed = <a class="code" href="classNL3D_1_1CPSZone.html#n0">_BounceFactor</a> * (speed - 2.0f * (speed * normal) * normal); +00429 +00430 ci.collisionZone = <font class="keyword">this</font>; +00431 (*it)->collisionUpdate(ci, k); +00432 +00433 } +00434 } +00435 } +00436 } +00437 } +00438 } +00439 +00440 +00441 +<a name="l00442"></a><a class="code" href="classNL3D_1_1CPSZoneSphere.html#a1">00442</a> <font class="keywordtype">void</font> CPSZoneSphere::show(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00443 { +00444 +00445 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#l0">CPSLocated</a> *loc; +00446 uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>; +00447 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#z720_0">CPSLocatedBindable</a> *lb; +00448 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getOwner()->getCurrentEditedElement(loc, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, lb); +00449 +00450 +00451 TPSAttribRadiusPair::const_iterator radiusIt = <a class="code" href="classNL3D_1_1CPSZoneSphere.html#n0">_Radius</a>.begin(); +00452 TPSAttribVector::const_iterator posIt = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().begin(), endPosIt = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().end(); +00453 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a21">setupDriverModelMatrix</a>(); +00454 <font class="keywordflow">for</font> (uint k = 0; posIt != endPosIt; ++posIt, ++radiusIt, ++k) +00455 { +00456 <font class="keyword">const</font> CRGBA col = ((lb == NULL || <font class="keyword">this</font> == lb) && loc == <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a> && <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> == k ? CRGBA::Red : CRGBA(127, 127, 127)); +00457 CPSUtil::displaySphere(*<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a10">getDriver</a>(), radiusIt->R, *posIt, 5, col); +00458 } +00459 } +00460 +<a name="l00461"></a><a class="code" href="classNL3D_1_1CPSZoneSphere.html#a6">00461</a> <font class="keywordtype">void</font> CPSZoneSphere::setMatrix(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <font class="keyword">const</font> CMatrix &m) +00462 { +00463 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> < <a class="code" href="classNL3D_1_1CPSZoneSphere.html#n0">_Radius</a>.getSize()); +00464 +00465 <font class="comment">// compute new pos</font> +00466 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>] = m.getPos(); +00467 +00468 } +00469 +00470 +<a name="l00471"></a><a class="code" href="classNL3D_1_1CPSZoneSphere.html#a7">00471</a> CMatrix CPSZoneSphere::getMatrix(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>)<font class="keyword"> const</font> +00472 <font class="keyword"></font>{ +00473 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> < <a class="code" href="classNL3D_1_1CPSZoneSphere.html#n0">_Radius</a>.getSize()); +00474 CMatrix m; +00475 m.identity(); +00476 m.translate(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>]); +00477 <font class="keywordflow">return</font> m; +00478 } +00479 +<a name="l00480"></a><a class="code" href="classNL3D_1_1CPSZoneSphere.html#a8">00480</a> <font class="keywordtype">void</font> CPSZoneSphere::setScale(uint32 k, <font class="keywordtype">float</font> scale) +00481 { +00482 <a class="code" href="classNL3D_1_1CPSZoneSphere.html#n0">_Radius</a>[k].R = scale; +00483 <a class="code" href="classNL3D_1_1CPSZoneSphere.html#n0">_Radius</a>[k].R2 = scale * scale; +00484 } +<a name="l00485"></a><a class="code" href="classNL3D_1_1CPSZoneSphere.html#a9">00485</a> CVector CPSZoneSphere::getScale(uint32 k)<font class="keyword"> const</font> +00486 <font class="keyword"></font>{ +00487 <font class="keywordflow">return</font> CVector(<a class="code" href="classNL3D_1_1CPSZoneSphere.html#n0">_Radius</a>[k].R, <a class="code" href="classNL3D_1_1CPSZoneSphere.html#n0">_Radius</a>[k].R, <a class="code" href="classNL3D_1_1CPSZoneSphere.html#n0">_Radius</a>[k].R); +00488 } +00489 +00490 +<a name="l00491"></a><a class="code" href="classNL3D_1_1CPSZoneSphere.html#a4">00491</a> <font class="keywordtype">void</font> CPSZoneSphere::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +00492 { +00493 f.serialVersion(1); +00494 CPSZone::serial(f); +00495 f.serial(_Radius); +00496 } +00497 +00498 +00499 +00500 +00501 +00502 +<a name="l00503"></a><a class="code" href="classNL3D_1_1CPSZoneSphere.html#b1">00503</a> <font class="keywordtype">void</font> CPSZoneSphere::resize(uint32 size) +00504 { +00505 <a class="code" href="debug_8h.html#a6">nlassert</a>(size < (1 << 16)); +00506 <a class="code" href="classNL3D_1_1CPSZoneSphere.html#n0">_Radius</a>.resize(size); +00507 } +00508 +<a name="l00509"></a><a class="code" href="classNL3D_1_1CPSZoneSphere.html#b2">00509</a> <font class="keywordtype">void</font> CPSZoneSphere::newElement(CPSLocated *emitterLocated, uint32 emitterIndex) +00510 { +00511 CRadiusPair rp; +00512 rp.R = rp.R2 = 1.f; +00513 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPSZoneSphere.html#n0">_Radius</a>.getSize() != <a class="code" href="classNL3D_1_1CPSZoneSphere.html#n0">_Radius</a>.getMaxSize()); +00514 <a class="code" href="classNL3D_1_1CPSZoneSphere.html#n0">_Radius</a>.insert(rp); +00515 } +00516 +<a name="l00517"></a><a class="code" href="classNL3D_1_1CPSZoneSphere.html#b3">00517</a> <font class="keywordtype">void</font> CPSZoneSphere::deleteElement(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>) +00518 { +00519 <a class="code" href="classNL3D_1_1CPSZoneSphere.html#n0">_Radius</a>.remove(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +00520 } +00521 +00522 +00524 <font class="comment">// CPSZoneDisc implementation //</font> +00526 <font class="comment"></font> +<a name="l00527"></a><a class="code" href="classNL3D_1_1CPSZoneDisc.html#a0">00527</a> <font class="keywordtype">void</font> CPSZoneDisc::performMotion(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00528 { +00529 <font class="comment">// for each target, we must check wether they are going through the disc</font> +00530 <font class="comment">// if so they must bounce</font> +00531 TPSAttribVector::const_iterator discPosIt, discPosEnd, normalIt, targetPosIt, targetPosEnd; +00532 TPSAttribRadiusPair::const_iterator radiusIt; +00533 CVector dest; +00534 CPSCollisionInfo ci; +00535 CVector startEnd; +00536 uint32 k; +00537 <font class="keyword">const</font> <a class="code" href="namespaceNL3D.html#a180">TPSAttribVector</a> *speedAttr; +00538 <font class="keywordtype">float</font> posSide, negSide; +00539 +00540 <font class="comment">// the square of radius at the hit point</font> +00541 <font class="keywordtype">float</font> hitRadius2; +00542 +00543 <font class="comment">// alpha is the ratio that gives the percent of endPos - startPos that hit the disc</font> +00544 <font class="keywordtype">float</font> <a class="code" href="driver__opengl__extension__def_8h.html#a420">alpha</a>; +00545 +00546 CVector center; +00547 +00548 <font class="keywordflow">for</font> (TTargetCont::iterator it = <a class="code" href="classNL3D_1_1CPSTargetLocatedBindable.html#n0">_Targets</a>.begin(); it != <a class="code" href="classNL3D_1_1CPSTargetLocatedBindable.html#n0">_Targets</a>.end(); ++it) +00549 { +00550 +00551 speedAttr = &((*it)->getSpeed()); +00552 <font class="comment">// cycle through the disc</font> +00553 +00554 discPosEnd = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().end(); +00555 <font class="keywordflow">for</font> (discPosIt = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().begin(), radiusIt = <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n1">_Radius</a>.begin(), normalIt = <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n0">_Normal</a>.begin(); discPosIt != discPosEnd +00556 ; ++discPosIt, ++normalIt, ++radiusIt) +00557 { +00558 +00559 <font class="comment">// we must setup the disc in the good basis</font> +00560 +00561 <font class="keyword">const</font> CMatrix &m = CPSLocated::getConversionMatrix(*it, this->_Owner); +00562 +00563 +00564 +00565 <a class="code" href="classNLMISC_1_1CPlane.html">NLMISC::CPlane</a> p; +00566 center = m * (*discPosIt); +00567 p.<a class="code" href="classNLMISC_1_1CPlane.html#z305_0">make</a>(m.mulVector(*normalIt), center); +00568 +00569 <font class="comment">// deals with each particle</font> +00570 +00571 <font class="keyword">const</font> <font class="keywordtype">float</font> epsilon = 0.5f * <a class="code" href="namespaceNL3D.html#a221">PSCollideEpsilon</a>; +00572 +00573 targetPosEnd = (*it)->getPos().end(); +00574 TPSAttribCollisionInfo::const_iterator ciIt = (*it)->getCollisionInfo().begin(); +00575 <font class="keywordflow">for</font> (targetPosIt = (*it)->getPos().begin(), k = 0; targetPosIt != targetPosEnd; ++targetPosIt, ++k, ++ciIt) +00576 { +00577 <font class="keyword">const</font> CVector &speed = (*speedAttr)[k]; +00578 <font class="comment">// check whether the located is going through the disc</font> +00579 dest = *targetPosIt + ellapsedTime * speed * ciIt->TimeSliceRatio; +00580 +00581 +00582 posSide = p * *targetPosIt; +00583 negSide = p * dest; +00584 +00585 <font class="keywordflow">if</font> (posSide >= - epsilon && negSide <= epsilon) +00586 { +00587 <font class="keywordflow">if</font> (fabsf(posSide - negSide) > <a class="code" href="bit__set_8cpp.html#a0">std::numeric_limits<float>::min</a>()) +00588 { +00589 <a class="code" href="driver__opengl__extension__def_8h.html#a420">alpha</a> = posSide / (posSide - negSide); +00590 } +00591 <font class="keywordflow">else</font> +00592 { +00593 <a class="code" href="driver__opengl__extension__def_8h.html#a420">alpha</a> = 0.f; +00594 } +00595 startEnd = <a class="code" href="driver__opengl__extension__def_8h.html#a420">alpha</a> * (dest - *targetPosIt); +00596 ci.dist = startEnd.norm(); +00597 <font class="comment">// we translate the particle from an epsilon so that it won't get hooked to the disc</font> +00598 ci.newPos = *targetPosIt + startEnd + <a class="code" href="namespaceNL3D.html#a221">PSCollideEpsilon</a> * p.<a class="code" href="classNLMISC_1_1CPlane.html#z305_2">getNormal</a>(); +00599 +00600 +00601 <font class="comment">// now, check the collision pos against radius</font> +00602 +00603 hitRadius2 = (ci.newPos - center) * (ci.newPos - center); +00604 +00605 <font class="keywordflow">if</font> (hitRadius2 < radiusIt->R2) <font class="comment">// check collision against disc</font> +00606 { +00607 ci.newSpeed = <a class="code" href="classNL3D_1_1CPSZone.html#n0">_BounceFactor</a> * (speed - 2.0f * (speed * p.<a class="code" href="classNLMISC_1_1CPlane.html#z305_2">getNormal</a>()) * p.<a class="code" href="classNLMISC_1_1CPlane.html#z305_2">getNormal</a>()); +00608 ci.collisionZone = <font class="keyword">this</font>; +00609 (*it)->collisionUpdate(ci, k); +00610 } +00611 +00612 } +00613 } +00614 } +00615 } +00616 } +00617 +<a name="l00618"></a><a class="code" href="classNL3D_1_1CPSZoneDisc.html#a1">00618</a> <font class="keywordtype">void</font> CPSZoneDisc::show(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00619 { +00620 TPSAttribRadiusPair::const_iterator radiusIt = <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n1">_Radius</a>.begin(); +00621 TPSAttribVector::const_iterator posIt = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().begin(), endPosIt = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().end() +00622 , normalIt = <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n0">_Normal</a>.begin(); +00623 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a21">setupDriverModelMatrix</a>(); +00624 CMatrix mat; +00625 +00626 +00627 +00628 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#l0">CPSLocated</a> *loc; +00629 uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>; +00630 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#z720_0">CPSLocatedBindable</a> *lb; +00631 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getOwner()->getCurrentEditedElement(loc, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, lb); +00632 +00633 +00634 +00635 <font class="keywordflow">for</font> (uint k = 0; posIt != endPosIt; ++posIt, ++radiusIt, ++normalIt, ++k) +00636 { +00637 <font class="keyword">const</font> CRGBA col = ((lb == NULL || <font class="keyword">this</font> == lb) && loc == <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a> && <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> == k ? CRGBA::Red : CRGBA(127, 127, 127)); +00638 CPSUtil::buildSchmidtBasis(*normalIt, mat); +00639 CPSUtil::displayDisc(*<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a10">getDriver</a>(), radiusIt->R, *posIt, mat, 32, col); +00640 +00641 mat.setPos(*posIt); +00642 CPSUtil::displayBasis(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a10">getDriver</a>() ,<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a17">getLocatedMat</a>(), mat, 1.f, *<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a11">getFontGenerator</a>(), *<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a13">getFontManager</a>()); +00643 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a21">setupDriverModelMatrix</a>(); +00644 } +00645 } +00646 +00647 +00648 +00649 +00650 +00651 +<a name="l00652"></a><a class="code" href="classNL3D_1_1CPSZoneDisc.html#a5">00652</a> <font class="keywordtype">void</font> CPSZoneDisc::setMatrix(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <font class="keyword">const</font> CMatrix &m) +00653 { +00654 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> < <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n1">_Radius</a>.getSize()); +00655 <font class="comment">// compute new pos</font> +00656 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>] = m.getPos(); +00657 <font class="comment">// compute new normal</font> +00658 <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n0">_Normal</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>] = m.getK(); +00659 } +00660 +<a name="l00661"></a><a class="code" href="classNL3D_1_1CPSZoneDisc.html#a6">00661</a> CMatrix CPSZoneDisc::getMatrix(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>)<font class="keyword"> const</font> +00662 <font class="keyword"></font>{ +00663 CMatrix m, b; +00664 m.translate(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>]); +00665 CPSUtil::buildSchmidtBasis(<a class="code" href="classNL3D_1_1CPSZoneDisc.html#n0">_Normal</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>], b); +00666 m = m * b; +00667 <font class="keywordflow">return</font> m; +00668 } +00669 +<a name="l00670"></a><a class="code" href="classNL3D_1_1CPSZoneDisc.html#a10">00670</a> CVector CPSZoneDisc::getNormal(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>) +00671 { +00672 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n0">_Normal</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>]; +00673 } +<a name="l00674"></a><a class="code" href="classNL3D_1_1CPSZoneDisc.html#a11">00674</a> <font class="keywordtype">void</font> CPSZoneDisc::setNormal(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, CVector n) +00675 { +00676 <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n0">_Normal</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>] = n; +00677 } +00678 +<a name="l00679"></a><a class="code" href="classNL3D_1_1CPSZoneDisc.html#a7">00679</a> <font class="keywordtype">void</font> CPSZoneDisc::setScale(uint32 k, <font class="keywordtype">float</font> scale) +00680 { +00681 <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n1">_Radius</a>[k].R = scale; +00682 <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n1">_Radius</a>[k].R2 = scale * scale; +00683 } +00684 +<a name="l00685"></a><a class="code" href="classNL3D_1_1CPSZoneDisc.html#a8">00685</a> CVector CPSZoneDisc::getScale(uint32 k)<font class="keyword"> const</font> +00686 <font class="keyword"></font>{ +00687 <font class="keywordflow">return</font> CVector(<a class="code" href="classNL3D_1_1CPSZoneDisc.html#n1">_Radius</a>[k].R, <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n1">_Radius</a>[k].R, <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n1">_Radius</a>[k].R); +00688 } +00689 +00690 +<a name="l00691"></a><a class="code" href="classNL3D_1_1CPSZoneDisc.html#a12">00691</a> <font class="keywordtype">void</font> CPSZoneDisc::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +00692 { +00693 f.serialVersion(1); +00694 CPSZone::serial(f); +00695 f.serial(_Normal); +00696 f.serial(_Radius); +00697 } +00698 +<a name="l00699"></a><a class="code" href="classNL3D_1_1CPSZoneDisc.html#b1">00699</a> <font class="keywordtype">void</font> CPSZoneDisc::resize(uint32 size) +00700 { +00701 <a class="code" href="debug_8h.html#a6">nlassert</a>(size < (1 << 16)); +00702 <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n1">_Radius</a>.resize(size); +00703 <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n0">_Normal</a>.resize(size); +00704 } +00705 +<a name="l00706"></a><a class="code" href="classNL3D_1_1CPSZoneDisc.html#b2">00706</a> <font class="keywordtype">void</font> CPSZoneDisc::newElement(CPSLocated *emitterLocated, uint32 emitterIndex) +00707 { +00708 CRadiusPair rp; +00709 rp.R = rp.R2 = 1.f; +00710 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPSZoneDisc.html#n1">_Radius</a>.getSize() != <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n1">_Radius</a>.getMaxSize()); +00711 <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n1">_Radius</a>.insert(rp); +00712 <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n0">_Normal</a>.insert(CVector::K); +00713 } +00714 +<a name="l00715"></a><a class="code" href="classNL3D_1_1CPSZoneDisc.html#b3">00715</a> <font class="keywordtype">void</font> CPSZoneDisc::deleteElement(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>) +00716 { +00717 <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n1">_Radius</a>.remove(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +00718 <a class="code" href="classNL3D_1_1CPSZoneDisc.html#n0">_Normal</a>.remove(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +00719 } +00720 +00721 +00723 <font class="comment">// CPSZoneCylinder implementation //</font> +00725 <font class="comment"></font> +00726 +00727 <font class="comment">/*</font> +00728 <font class="comment">void CPSZoneCylinder::performMotion(TAnimationTime ellapsedTime)</font> +00729 <font class="comment">{</font> +00730 <font class="comment"> TPSAttribVector::const_iterator dimIt = _Dim.begin();</font> +00731 <font class="comment"> CPSAttrib<CPlaneBasis>::const_iterator basisIt = _Basis.begin();</font> +00732 <font class="comment"> TPSAttribVector::const_iterator cylinderPosIt, cylinderPosEnd, targetPosIt, targetPosEnd;</font> +00733 <font class="comment"> CVector dest;</font> +00734 <font class="comment"> CPSCollisionInfo ci;</font> +00735 <font class="comment"> CVector startEnd;</font> +00736 <font class="comment"> uint32 k;</font> +00737 <font class="comment"> const TPSAttribVector *speedAttr;</font> +00738 <font class="comment"></font> +00739 <font class="comment"></font> +00740 <font class="comment"></font> +00741 <font class="comment"> for (TTargetCont::iterator it = _Targets.begin(); it != _Targets.end(); ++it)</font> +00742 <font class="comment"> {</font> +00743 <font class="comment"></font> +00744 <font class="comment"> speedAttr = &((*it)->getSpeed());</font> +00745 <font class="comment"></font> +00746 <font class="comment"></font> +00747 <font class="comment"> // cycle through the cylinders</font> +00748 <font class="comment"></font> +00749 <font class="comment"> cylinderPosEnd = _Owner->getPos().end();</font> +00750 <font class="comment"> for (cylinderPosIt = _Owner->getPos().begin(); cylinderPosIt != cylinderPosEnd</font> +00751 <font class="comment"> ; ++cylinderPosIt, ++dimIt, ++basisIt)</font> +00752 <font class="comment"> {</font> +00753 <font class="comment"> </font> +00754 <font class="comment"> // we must setup the cylinder in the good basis</font> +00755 <font class="comment"></font> +00756 <font class="comment"> const CMatrix &m = CPSLocated::getConversionMatrix(*it, this->_Owner);</font> +00757 <font class="comment"></font> +00758 <font class="comment"> </font> +00759 <font class="comment"></font> +00760 <font class="comment"> // compute the new center pos</font> +00761 <font class="comment"> CVector center = m * *cylinderPosIt;</font> +00762 <font class="comment"></font> +00763 <font class="comment"> // compute a basis for the cylinder</font> +00764 <font class="comment"> CVector I = m.mulVector(basisIt->X);</font> +00765 <font class="comment"> CVector J = m.mulVector(basisIt->Y);</font> +00766 <font class="comment"> CVector K = m.mulVector(basisIt->X ^ basisIt->Y);</font> +00767 <font class="comment"></font> +00768 <font class="comment"> </font> +00769 <font class="comment"> // the pos projected (and scale) over the plane basis of the cylinder, the pos minus the center</font> +00770 <font class="comment"> CVector projectedPos, tPos;</font> +00771 <font class="comment"></font> +00772 <font class="comment"> // the same, but with the final position</font> +00773 <font class="comment"> CVector destProjectedPos, destTPos;</font> +00774 <font class="comment"></font> +00775 <font class="comment"></font> +00776 <font class="comment"> // deals with each particle</font> +00777 <font class="comment"> targetPosEnd = (*it)->getPos().end();</font> +00778 <font class="comment"> for (targetPosIt = (*it)->getPos().begin(), k = 0; targetPosIt != targetPosEnd; ++targetPosIt, ++k)</font> +00779 <font class="comment"> { </font> +00780 <font class="comment"> const CVector &speed = (*speedAttr)[k];</font> +00781 <font class="comment"> const CVector &pos = *targetPosIt;</font> +00782 <font class="comment"></font> +00783 <font class="comment"> </font> +00784 <font class="comment"> </font> +00785 <font class="comment"> // check wether current pos was outside the cylinder</font> +00786 <font class="comment"></font> +00787 <font class="comment"></font> +00788 <font class="comment"> tPos = pos - center;</font> +00789 <font class="comment"> projectedPos = (1 / dimIt->x) * (I * tPos) * I + (1 / dimIt->y) * (J * tPos) * J;</font> +00790 <font class="comment"> </font> +00791 <font class="comment"> if (!</font> +00792 <font class="comment"> (</font> +00793 <font class="comment"> ((tPos * K) < dimIt->z)</font> +00794 <font class="comment"> && ((tPos * K) > -dimIt->z)</font> +00795 <font class="comment"> && (projectedPos * projectedPos < 1.f) </font> +00796 <font class="comment"> )</font> +00797 <font class="comment"> )</font> +00798 <font class="comment"> {</font> +00799 <font class="comment"> dest = pos + ellapsedTime * speed;</font> +00800 <font class="comment"> destTPos = dest - center;</font> +00801 <font class="comment"> destProjectedPos = (1.f / dimIt->x) * (I * tPos) * I + (1.f / dimIt->y) * (J * tPos) * J;</font> +00802 <font class="comment"></font> +00803 <font class="comment"> // test wether the new position is inside the cylinder</font> +00804 <font class="comment"></font> +00805 <font class="comment"> </font> +00806 <font class="comment"> if (!</font> +00807 <font class="comment"> (</font> +00808 <font class="comment"> ((destTPos * K) < dimIt->z)</font> +00809 <font class="comment"> && ((destTPos * K) > -dimIt->z)</font> +00810 <font class="comment"> && (destProjectedPos * destProjectedPos < 1.f) </font> +00811 <font class="comment"> )</font> +00812 <font class="comment"> )</font> +00813 <font class="comment"> {</font> +00814 <font class="comment"> // now, detect the closest hit point (the smallest alpha, with alpha, the percent of the move vector</font> +00815 <font class="comment"> // to reach the hit point)</font> +00816 <font class="comment"></font> +00817 <font class="comment"> const float epsilon = 10E-6f;</font> +00818 <font class="comment"></font> +00819 <font class="comment"> float alphaTop, alphaBottom, alphaCyl;</font> +00820 <font class="comment"></font> +00821 <font class="comment"> const float denum = (dest - pos) * K;</font> +00822 <font class="comment"></font> +00823 <font class="comment"> // top plane</font> +00824 <font class="comment"></font> +00825 <font class="comment"> if (fabs(denum) < epsilon)</font> +00826 <font class="comment"> {</font> +00827 <font class="comment"> alphaTop = (dimIt->z - (tPos * K)) / denum;</font> +00828 <font class="comment"> if (alphaTop < 0.f) alphaTop = 1.f;</font> +00829 <font class="comment"> }</font> +00830 <font class="comment"> else</font> +00831 <font class="comment"> {</font> +00832 <font class="comment"> alphaTop = 1.f;</font> +00833 <font class="comment"> }</font> +00834 <font class="comment"></font> +00835 <font class="comment"> // bottom plane</font> +00836 <font class="comment"></font> +00837 <font class="comment"> if (fabs(denum) < epsilon)</font> +00838 <font class="comment"> {</font> +00839 <font class="comment"> alphaBottom = (- dimIt->z - (tPos * K)) / denum;</font> +00840 <font class="comment"> if (alphaBottom < 0.f) alphaBottom = 1.f;</font> +00841 <font class="comment"> }</font> +00842 <font class="comment"> else</font> +00843 <font class="comment"> {</font> +00844 <font class="comment"> alphaBottom = 1.f;</font> +00845 <font class="comment"> }</font> +00846 <font class="comment"></font> +00847 <font class="comment"> // cylinder</font> +00848 <font class="comment"></font> +00849 <font class="comment"> //expressed the src and dest positions in the cylinder basis</font> +00850 <font class="comment"></font> +00851 <font class="comment"> const float ox = tPos * I, oy = tPos * J, dx = (destTPos - tPos) * I, dy = (destTPos - tPos) * J;</font> +00852 <font class="comment"></font> +00853 <font class="comment"> // coefficients of the equation : a * alpha ^ 2 + b * alpha + c = 0</font> +00854 <font class="comment"> const float a = (dx * dx) / (dimIt->x * dimIt->x)</font> +00855 <font class="comment"> + (dy * dy) / (dimIt->y * dimIt->y);</font> +00856 <font class="comment"> const float b = 2.f * (ox * dx) / (dimIt->x * dimIt->x)</font> +00857 <font class="comment"> + (oy * dy) / (dimIt->y * dimIt->y);</font> +00858 <font class="comment"> const float c = ox * ox + oy * oy - 1;</font> +00859 <font class="comment"></font> +00860 <font class="comment"> // discriminant</font> +00861 <font class="comment"> const float delta = b * b - 4.f * a * c;</font> +00862 <font class="comment"></font> +00863 <font class="comment"> if (delta < epsilon)</font> +00864 <font class="comment"> {</font> +00865 <font class="comment"> alphaCyl = 1.f;</font> +00866 <font class="comment"> }</font> +00867 <font class="comment"> else</font> +00868 <font class="comment"> {</font> +00869 <font class="comment"> const float deltaRoot = sqrtf(delta);</font> +00870 <font class="comment"> const float r1 = (- b - deltaRoot) / (2.f / a);</font> +00871 <font class="comment"> const float r2 = (- b - deltaRoot) / (2.f / a);</font> +00872 <font class="comment"></font> +00873 <font class="comment"> if (r1 < 0.f) alphaCyl = r2;</font> +00874 <font class="comment"> else if (r2 < 0.f) alphaCyl = r1;</font> +00875 <font class="comment"> else alphaCyl = r1 < r2 ? r1 : r2;</font> +00876 <font class="comment"> }</font> +00877 <font class="comment"></font> +00878 <font class="comment"></font> +00879 <font class="comment"> // now, choose the minimum positive dist</font> +00880 <font class="comment"> </font> +00881 <font class="comment"> if (alphaTop < alphaBottom && alphaTop < alphaCyl)</font> +00882 <font class="comment"> {</font> +00883 <font class="comment"> // collision with the top plane</font> +00884 <font class="comment"> CVector startEnd = alphaTop * (dest - pos);</font> +00885 <font class="comment"> ci.newPos = pos + startEnd + PSCollideEpsilon * K;</font> +00886 <font class="comment"> ci.dist = startEnd.norm();</font> +00887 <font class="comment"> ci.newSpeed = (-2.f * (speed * K)) * K + speed;</font> +00888 <font class="comment"> ci.collisionZone = this;</font> +00889 <font class="comment"> </font> +00890 <font class="comment"> (*it)->collisionUpdate(ci, k);</font> +00891 <font class="comment"> }</font> +00892 <font class="comment"> else</font> +00893 <font class="comment"> if (alphaBottom < alphaCyl)</font> +00894 <font class="comment"> { </font> +00895 <font class="comment"> // collision with the bottom plane</font> +00896 <font class="comment"> CVector startEnd = alphaBottom * (dest - pos);</font> +00897 <font class="comment"> ci.newPos = pos + startEnd - PSCollideEpsilon * K;</font> +00898 <font class="comment"> ci.dist = startEnd.norm();</font> +00899 <font class="comment"> ci.newSpeed = (-2.f * (speed * K)) * K + speed;</font> +00900 <font class="comment"> ci.collisionZone = this;</font> +00901 <font class="comment"> </font> +00902 <font class="comment"> </font> +00903 <font class="comment"> (*it)->collisionUpdate(ci, k);</font> +00904 <font class="comment"> }</font> +00905 <font class="comment"> else</font> +00906 <font class="comment"> {</font> +00907 <font class="comment"> // collision with the cylinder</font> +00908 <font class="comment"></font> +00909 <font class="comment"> CVector startEnd = alphaCyl * (dest - pos);</font> +00910 <font class="comment"></font> +00911 <font class="comment"> // normal at the hit point. It is the gradient of the implicit equation x^2 / a^2 + y^2 / b^2 - R^ 2= 0</font> +00912 <font class="comment"> // so we got unormalized n = (2 x / a ^ 2, 2 y / b ^ 2, 0) in the basis of the cylinder</font> +00913 <font class="comment"> // As we'll normalize it, we don't need the 2 factor</font> +00914 <font class="comment"> </font> +00915 <font class="comment"> float px = ox + alphaCyl * dx;</font> +00916 <font class="comment"> float py = oy + alphaCyl * dy;</font> +00917 <font class="comment"></font> +00918 <font class="comment"> CVector normal = px / (dimIt->x * dimIt->x) * I + py / (dimIt->y * dimIt->y) * J;</font> +00919 <font class="comment"> normal.normalize();</font> +00920 <font class="comment"></font> +00921 <font class="comment"> ci.newPos = pos + startEnd - PSCollideEpsilon * normal;</font> +00922 <font class="comment"> ci.dist = startEnd.norm();</font> +00923 <font class="comment"> ci.newSpeed = (-2.f * (speed * normal)) * normal + speed;</font> +00924 <font class="comment"> ci.collisionZone = this;</font> +00925 <font class="comment"></font> +00926 <font class="comment"> (*it)->collisionUpdate(ci, k);</font> +00927 <font class="comment"> } </font> +00928 <font class="comment"></font> +00929 <font class="comment"> }</font> +00930 <font class="comment"> } </font> +00931 <font class="comment"> }</font> +00932 <font class="comment"> }</font> +00933 <font class="comment"> }</font> +00934 <font class="comment">}</font> +00935 <font class="comment">*/</font> +00936 +00937 +00938 +<a name="l00939"></a><a class="code" href="classNL3D_1_1CPSZoneCylinder.html#a0">00939</a> <font class="keywordtype">void</font> CPSZoneCylinder::performMotion(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00940 { +00941 TPSAttribVector::const_iterator dimIt; +00942 CPSAttrib<CPlaneBasis>::const_iterator basisIt; +00943 TPSAttribVector::const_iterator cylinderPosIt, cylinderPosEnd, targetPosIt, targetPosEnd; +00944 CVector dest; +00945 CPSCollisionInfo ci; +00946 uint32 k; +00947 <font class="keyword">const</font> <a class="code" href="namespaceNL3D.html#a180">TPSAttribVector</a> *speedAttr; +00948 +00949 +00950 +00951 <font class="keywordflow">for</font> (TTargetCont::iterator it = <a class="code" href="classNL3D_1_1CPSTargetLocatedBindable.html#n0">_Targets</a>.begin(); it != <a class="code" href="classNL3D_1_1CPSTargetLocatedBindable.html#n0">_Targets</a>.end(); ++it) +00952 { +00953 +00954 speedAttr = &((*it)->getSpeed()); +00955 +00956 +00957 <font class="comment">// cycle through the cylinders</font> +00958 +00959 cylinderPosEnd = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().end(); +00960 <font class="keywordflow">for</font> (cylinderPosIt = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().begin(), basisIt = <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n0">_Basis</a>.begin(), dimIt = <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n1">_Dim</a>.begin() +00961 ; cylinderPosIt != cylinderPosEnd +00962 ; ++cylinderPosIt, ++dimIt, ++basisIt) +00963 { +00964 +00965 <font class="comment">// we must setup the cylinder in the good basis</font> +00966 +00967 <font class="keyword">const</font> CMatrix &m = CPSLocated::getConversionMatrix(*it, this->_Owner); +00968 +00969 +00970 +00971 <font class="comment">// compute the new center pos</font> +00972 CVector center = m * *cylinderPosIt; +00973 +00974 <font class="comment">// compute a basis for the cylinder</font> +00975 CVector I = m.mulVector(basisIt->X); +00976 CVector J = m.mulVector(basisIt->Y); +00977 CVector K = m.mulVector(basisIt->X ^ basisIt->Y); +00978 +00979 +00980 <font class="comment">// the pos projected (and scale) over the plane basis of the cylinder, the pos minus the center</font> +00981 CVector projectedPos, tPos; +00982 +00983 <font class="comment">// the same, but with the final position</font> +00984 CVector destProjectedPos, destTPos; +00985 +00986 +00987 <font class="comment">// deals with each particle</font> +00988 targetPosEnd = (*it)->getPos().end(); +00989 TPSAttribCollisionInfo::const_iterator ciIt = (*it)->getCollisionInfo().begin(); +00990 <font class="keywordflow">for</font> (targetPosIt = (*it)->getPos().begin(), k = 0; targetPosIt != targetPosEnd; ++targetPosIt, ++k, ++ciIt) +00991 { +00992 <font class="keyword">const</font> CVector &speed = (*speedAttr)[k]; +00993 <font class="keyword">const</font> CVector &pos = *targetPosIt; +00994 +00995 +00996 +00997 <font class="comment">// check wether current pos was outside the cylinder</font> +00998 +00999 +01000 tPos = pos - center; +01001 projectedPos = (1 / dimIt->x) * (I * tPos) * I + (1 / dimIt->y) * (J * tPos) * J; +01002 +01003 <font class="keywordflow">if</font> (! +01004 ( +01005 ((tPos * K) < dimIt->z) +01006 && ((tPos * K) > -dimIt->z) +01007 && (projectedPos * projectedPos < 1.f) +01008 ) +01009 ) +01010 { +01011 dest = pos + ellapsedTime * speed * ciIt->TimeSliceRatio; +01012 destTPos = dest - center; +01013 destProjectedPos = (1.f / dimIt->x) * (I * destTPos) * I + (1.f / dimIt->y) * (J * destTPos) * J; +01014 +01015 <font class="comment">// test wether the new position is inside the cylinder</font> +01016 +01017 +01018 <font class="keywordflow">if</font> ( +01019 ( +01020 ((destTPos * K) < dimIt->z) +01021 && ((destTPos * K) > -dimIt->z) +01022 && (destProjectedPos * destProjectedPos < 1.f) +01023 ) +01024 ) +01025 { +01026 <font class="comment">// now, detect the closest hit point (the smallest alpha, with alpha, the percent of the move vector</font> +01027 <font class="comment">// to reach the hit point)</font> +01028 +01029 <font class="keyword">const</font> <font class="keywordtype">float</font> epsilon = 10E-3f; +01030 +01031 <font class="keywordtype">float</font> alphaTop, alphaBottom, alphaCyl; +01032 +01033 <font class="keyword">const</font> <font class="keywordtype">float</font> denum = (dest - pos) * K; +01034 +01035 <font class="comment">// top plane</font> +01036 +01037 <font class="keywordflow">if</font> (fabs(denum) < epsilon) +01038 { +01039 alphaTop = (dimIt->z - (tPos * K)) / denum; +01040 <font class="keywordflow">if</font> (alphaTop < 0.f) alphaTop = 1.f; +01041 } +01042 <font class="keywordflow">else</font> +01043 { +01044 alphaTop = 1.f; +01045 } +01046 +01047 <font class="comment">// bottom plane</font> +01048 +01049 <font class="keywordflow">if</font> (fabs(denum) < epsilon) +01050 { +01051 alphaBottom = (- dimIt->z - (tPos * K)) / denum; +01052 <font class="keywordflow">if</font> (alphaBottom < 0.f) alphaBottom = 1.f; +01053 } +01054 <font class="keywordflow">else</font> +01055 { +01056 alphaBottom = 1.f; +01057 } +01058 +01059 <font class="comment">// cylinder</font> +01060 +01061 <font class="comment">//expressed the src and dest positions in the cylinder basis</font> +01062 +01063 <font class="keyword">const</font> <font class="keywordtype">float</font> ox = tPos * I, oy = tPos * J, dx = (destTPos - tPos) * I, dy = (destTPos - tPos) * J; +01064 +01065 <font class="comment">// coefficients of the equation : a * alpha ^ 2 + b * alpha + c = 0</font> +01066 <font class="keyword">const</font> <font class="keywordtype">float</font> a = (dx * dx) / (dimIt->x * dimIt->x) +01067 + (dy * dy) / (dimIt->y * dimIt->y); +01068 <font class="keyword">const</font> <font class="keywordtype">float</font> b = 2.f * ((ox * dx) / (dimIt->x * dimIt->x) +01069 + (oy * dy) / (dimIt->y * dimIt->y)); +01070 <font class="keyword">const</font> <font class="keywordtype">float</font> c = (ox * ox) / (dimIt->x * dimIt->x) + (oy * oy) / (dimIt->y * dimIt->y) - 1; +01071 +01072 <font class="comment">// discriminant</font> +01073 <font class="keyword">const</font> <font class="keywordtype">float</font> delta = b * b - 4.f * a * c; +01074 +01075 <font class="keywordflow">if</font> (delta < epsilon) +01076 { +01077 alphaCyl = 1.f; +01078 } +01079 <font class="keywordflow">else</font> +01080 { +01081 <font class="keyword">const</font> <font class="keywordtype">float</font> deltaRoot = sqrtf(delta); +01082 <font class="keyword">const</font> <font class="keywordtype">float</font> r1 = (- b + 2.f * deltaRoot) / (2.f * a); +01083 <font class="keyword">const</font> <font class="keywordtype">float</font> r2 = (- b - 2.f * deltaRoot) / (2.f * a); +01084 +01085 <font class="keywordflow">if</font> (r1 < 0.f) alphaCyl = r2; +01086 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (r2 < 0.f) alphaCyl = r1; +01087 <font class="keywordflow">else</font> alphaCyl = r1 < r2 ? r1 : r2; +01088 +01089 <font class="keywordflow">if</font> (alphaCyl < 0.f) alphaCyl = 1.f; +01090 } +01091 +01092 +01093 <font class="comment">// now, choose the minimum positive dist</font> +01094 +01095 +01096 +01097 <font class="keywordflow">if</font> (alphaTop < alphaBottom && alphaTop < alphaCyl) +01098 { +01099 <font class="comment">// collision with the top plane</font> +01100 CVector startEnd = alphaTop * (dest - pos); +01101 ci.newPos = pos + startEnd + <a class="code" href="namespaceNL3D.html#a221">PSCollideEpsilon</a> * K; +01102 ci.dist = startEnd.norm(); +01103 ci.newSpeed = (-2.f * (speed * K)) * K + speed; +01104 ci.collisionZone = <font class="keyword">this</font>; +01105 +01106 (*it)->collisionUpdate(ci, k); +01107 } +01108 <font class="keywordflow">else</font> +01109 <font class="keywordflow">if</font> (alphaBottom < alphaCyl) +01110 { +01111 <font class="comment">// collision with the bottom plane</font> +01112 CVector startEnd = alphaBottom * (dest - pos); +01113 ci.newPos = pos + startEnd - <a class="code" href="namespaceNL3D.html#a221">PSCollideEpsilon</a> * K; +01114 ci.dist = startEnd.norm(); +01115 ci.newSpeed = (-2.f * (speed * K)) * K + speed; +01116 ci.collisionZone = <font class="keyword">this</font>; +01117 +01118 +01119 (*it)->collisionUpdate(ci, k); +01120 } +01121 <font class="keywordflow">else</font> +01122 { +01123 <font class="comment">// collision with the cylinder</font> +01124 +01125 CVector startEnd = alphaCyl * (dest - pos); +01126 +01127 <font class="comment">// normal at the hit point. It is the gradient of the implicit equation x^2 / a^2 + y^2 / b^2 - R^ 2= 0</font> +01128 <font class="comment">// so we got unormalized n = (2 x / a ^ 2, 2 y / b ^ 2, 0) in the basis of the cylinder</font> +01129 <font class="comment">// As we'll normalize it, we don't need the 2 factor</font> +01130 +01131 <font class="keywordtype">float</font> px = ox + alphaCyl * dx; +01132 <font class="keywordtype">float</font> py = oy + alphaCyl * dy; +01133 +01134 CVector normal = px / (dimIt->x * dimIt->x) * I + py / (dimIt->y * dimIt->y) * J; +01135 normal.normalize(); +01136 +01137 ci.newPos = pos + startEnd + <a class="code" href="namespaceNL3D.html#a221">PSCollideEpsilon</a> * normal; +01138 ci.dist = startEnd.norm(); +01139 ci.newSpeed = (-2.f * (speed * normal)) * normal + speed; +01140 ci.collisionZone = <font class="keyword">this</font>; +01141 +01142 (*it)->collisionUpdate(ci, k); +01143 } +01144 +01145 } +01146 } +01147 } +01148 } +01149 } +01150 } +01151 +<a name="l01152"></a><a class="code" href="classNL3D_1_1CPSZoneCylinder.html#a1">01152</a> <font class="keywordtype">void</font> CPSZoneCylinder::show(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +01153 { +01154 TPSAttribVector::const_iterator dimIt = <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n1">_Dim</a>.begin() +01155 ,posIt = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().begin() +01156 , endPosIt = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().end(); +01157 +01158 CPSAttrib<CPlaneBasis>::const_iterator basisIt = <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n0">_Basis</a>.begin(); +01159 +01160 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a21">setupDriverModelMatrix</a>(); +01161 CMatrix mat; +01162 +01163 +01164 +01165 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#l0">CPSLocated</a> *loc; +01166 uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>; +01167 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#z720_0">CPSLocatedBindable</a> *lb; +01168 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getOwner()->getCurrentEditedElement(loc, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, lb); +01169 +01170 +01171 <font class="keywordflow">for</font> (uint32 k = 0; posIt != endPosIt; ++posIt, ++dimIt, ++basisIt, ++k) +01172 { +01173 mat.setRot(basisIt->X, basisIt->Y, basisIt->X ^ basisIt->Y); +01174 mat.setPos(CVector::Null); +01175 +01176 <font class="keyword">const</font> CRGBA col = ((lb == NULL || <font class="keyword">this</font> == lb) && loc == <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a> && <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> == k ? CRGBA::Red : CRGBA(127, 127, 127)); +01177 +01178 +01179 CPSUtil::displayCylinder(*<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a10">getDriver</a>(), *posIt, mat, *dimIt, 32, col); +01180 +01181 mat.setPos(*posIt); +01182 CPSUtil::displayBasis(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a10">getDriver</a>() ,<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a17">getLocatedMat</a>(), mat, 1.f, *<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a11">getFontGenerator</a>(), *<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a13">getFontManager</a>()); +01183 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a21">setupDriverModelMatrix</a>(); +01184 +01185 } +01186 } +01187 +01188 +01189 +<a name="l01190"></a><a class="code" href="classNL3D_1_1CPSZoneCylinder.html#a6">01190</a> <font class="keywordtype">void</font> CPSZoneCylinder::setMatrix(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <font class="keyword">const</font> CMatrix &m) +01191 { +01192 <font class="comment">// transform the basis </font> +01193 <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n0">_Basis</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].X = m.getI(); +01194 <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n0">_Basis</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].Y = m.getJ(); +01195 +01196 <font class="comment">// compute new pos</font> +01197 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>] = m.getPos(); +01198 +01199 +01200 } +01201 +01202 +01203 +<a name="l01204"></a><a class="code" href="classNL3D_1_1CPSZoneCylinder.html#a7">01204</a> CMatrix CPSZoneCylinder::getMatrix(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>)<font class="keyword"> const</font> +01205 <font class="keyword"></font>{ +01206 CMatrix m; +01207 m.setRot(<a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n0">_Basis</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].X, <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n0">_Basis</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].Y, <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n0">_Basis</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].X ^<a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n0">_Basis</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].Y); +01208 m.setPos(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>]); +01209 <font class="keywordflow">return</font> m; +01210 } +01211 +01212 +<a name="l01213"></a><a class="code" href="classNL3D_1_1CPSZoneCylinder.html#a8">01213</a> <font class="keywordtype">void</font> CPSZoneCylinder::setScale(uint32 k, <font class="keywordtype">float</font> scale) +01214 { +01215 <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n1">_Dim</a>[k] = CVector(scale, scale, scale); +01216 } +01217 +<a name="l01218"></a><a class="code" href="classNL3D_1_1CPSZoneCylinder.html#a10">01218</a> CVector CPSZoneCylinder::getScale(uint32 k)<font class="keyword"> const</font> +01219 <font class="keyword"></font>{ +01220 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n1">_Dim</a>[k]; +01221 } +01222 +<a name="l01223"></a><a class="code" href="classNL3D_1_1CPSZoneCylinder.html#a9">01223</a> <font class="keywordtype">void</font> CPSZoneCylinder::setScale(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <font class="keyword">const</font> CVector &<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>) +01224 { +01225 <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n1">_Dim</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>] = <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>; +01226 } +01227 +01228 +<a name="l01229"></a><a class="code" href="classNL3D_1_1CPSZoneCylinder.html#a11">01229</a> <font class="keywordtype">void</font> CPSZoneCylinder::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +01230 { +01231 f.serialVersion(1); +01232 CPSZone::serial(f); +01233 f.serial(_Basis); +01234 f.serial(_Dim); +01235 } +01236 +01237 +01238 +<a name="l01239"></a><a class="code" href="classNL3D_1_1CPSZoneCylinder.html#b1">01239</a> <font class="keywordtype">void</font> CPSZoneCylinder::resize(uint32 size) +01240 { +01241 <a class="code" href="debug_8h.html#a6">nlassert</a>(size < (1 << 16)); +01242 <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n0">_Basis</a>.resize(size); +01243 <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n1">_Dim</a>.resize(size); +01244 } +01245 +<a name="l01246"></a><a class="code" href="classNL3D_1_1CPSZoneCylinder.html#b2">01246</a> <font class="keywordtype">void</font> CPSZoneCylinder::newElement(CPSLocated *emitterLocated, uint32 emitterIndex) +01247 { +01248 <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n0">_Basis</a>.insert(CPlaneBasis(CVector::K)); +01249 <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n1">_Dim</a>.insert(CVector(1, 1, 1)); +01250 } +01251 +<a name="l01252"></a><a class="code" href="classNL3D_1_1CPSZoneCylinder.html#b3">01252</a> <font class="keywordtype">void</font> CPSZoneCylinder::deleteElement(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>) +01253 { +01254 <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n0">_Basis</a>.remove(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +01255 <a class="code" href="classNL3D_1_1CPSZoneCylinder.html#n1">_Dim</a>.remove(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +01256 } +01257 +01258 +01260 <font class="comment">// implementation of CPSZoneRectangle //</font> +01262 <font class="comment"></font> +01263 +01264 +01265 +01266 +<a name="l01267"></a><a class="code" href="classNL3D_1_1CPSZoneRectangle.html#a0">01267</a> <font class="keywordtype">void</font> CPSZoneRectangle::performMotion(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +01268 { +01269 +01270 <font class="comment">// for each target, we must check wether they are going through the rectangle</font> +01271 <font class="comment">// if so they must bounce</font> +01272 TPSAttribVector::const_iterator rectanglePosIt, rectanglePosEnd, targetPosIt, targetPosEnd; +01273 CPSAttrib<CPlaneBasis>::const_iterator basisIt; +01274 TPSAttribFloat::const_iterator widthIt, heightIt; +01275 +01276 CVector dest; +01277 CPSCollisionInfo ci; +01278 CVector startEnd; +01279 uint32 k; +01280 <font class="keyword">const</font> <a class="code" href="namespaceNL3D.html#a180">TPSAttribVector</a> *speedAttr; +01281 <font class="keywordtype">float</font> posSide, negSide; +01282 +01283 <font class="comment">// alpha is the ratio that gives the percent of endPos - startPos that hit the rectangle</font> +01284 <font class="keywordtype">float</font> <a class="code" href="driver__opengl__extension__def_8h.html#a420">alpha</a>; +01285 +01286 CVector center; +01287 +01288 <font class="keywordflow">for</font> (TTargetCont::iterator it = <a class="code" href="classNL3D_1_1CPSTargetLocatedBindable.html#n0">_Targets</a>.begin(); it != <a class="code" href="classNL3D_1_1CPSTargetLocatedBindable.html#n0">_Targets</a>.end(); ++it) +01289 { +01290 +01291 basisIt = <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n0">_Basis</a>.begin(); +01292 heightIt = <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n2">_Height</a>.begin(); +01293 widthIt = <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n1">_Width</a>.begin(); +01294 +01295 speedAttr = &((*it)->getSpeed()); +01296 <font class="comment">// cycle through the rectangle</font> +01297 +01298 rectanglePosEnd = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().end(); +01299 <font class="keywordflow">for</font> (rectanglePosIt = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos().begin(); rectanglePosIt != rectanglePosEnd +01300 ; ++rectanglePosIt, ++basisIt, ++widthIt, ++heightIt) +01301 { +01302 +01303 <font class="comment">// we must setup the rectangle in the good basis</font> +01304 +01305 <font class="keyword">const</font> CMatrix &m = CPSLocated::getConversionMatrix(*it, this->_Owner); +01306 +01307 +01308 +01309 <a class="code" href="classNLMISC_1_1CPlane.html">NLMISC::CPlane</a> p; +01310 center = m * (*rectanglePosIt); +01311 +01312 <font class="keyword">const</font> CVector X = m.mulVector(basisIt->X); +01313 <font class="keyword">const</font> CVector Y = m.mulVector(basisIt->Y); +01314 +01315 p.<a class="code" href="classNLMISC_1_1CPlane.html#z305_0">make</a>(X ^ Y, center); +01316 +01317 <font class="comment">// deals with each particle</font> +01318 +01319 <font class="keyword">const</font> <font class="keywordtype">float</font> epsilon = 0.5f * <a class="code" href="namespaceNL3D.html#a221">PSCollideEpsilon</a>; +01320 +01321 targetPosEnd = (*it)->getPos().end(); +01322 TPSAttribCollisionInfo::const_iterator ciIt = (*it)->getCollisionInfo().begin(); +01323 <font class="keywordflow">for</font> (targetPosIt = (*it)->getPos().begin(), k = 0; targetPosIt != targetPosEnd; ++targetPosIt, ++k, ++ciIt) +01324 { +01325 <font class="keyword">const</font> CVector &pos = *targetPosIt; +01326 <font class="keyword">const</font> CVector &speed = (*speedAttr)[k]; +01327 <font class="comment">// check whether the located is going through the rectangle</font> +01328 dest = pos + ellapsedTime * speed * ciIt->TimeSliceRatio; +01329 +01330 +01331 posSide = p * pos; +01332 negSide = p * dest; +01333 +01334 <font class="keywordflow">if</font> (posSide >= - epsilon && negSide <= epsilon) +01335 { +01336 <font class="keywordflow">if</font> (fabsf(posSide - negSide) > <a class="code" href="bit__set_8cpp.html#a0">std::numeric_limits<float>::min</a>()) +01337 { +01338 <a class="code" href="driver__opengl__extension__def_8h.html#a420">alpha</a> = posSide / (posSide - negSide); +01339 } +01340 <font class="keywordflow">else</font> +01341 { +01342 <a class="code" href="driver__opengl__extension__def_8h.html#a420">alpha</a> = 0.f; +01343 } +01344 startEnd = <a class="code" href="driver__opengl__extension__def_8h.html#a420">alpha</a> * (dest - pos); +01345 ci.dist = startEnd.norm(); +01346 <font class="comment">// we translate the particle from an epsilon so that it won't get hooked to the rectangle</font> +01347 ci.newPos = pos + startEnd; +01348 +01349 +01350 +01351 +01352 <font class="keywordflow">if</font> ( fabs( (pos - center) * X ) < *widthIt && fabs( (pos - center) * Y ) < *heightIt) <font class="comment">// check collision against rectangle</font> +01353 { +01354 ci.newPos += <a class="code" href="namespaceNL3D.html#a221">PSCollideEpsilon</a> * p.<a class="code" href="classNLMISC_1_1CPlane.html#z305_2">getNormal</a>(); +01355 ci.newSpeed = <a class="code" href="classNL3D_1_1CPSZone.html#n0">_BounceFactor</a> * (speed - 2.0f * (speed * p.<a class="code" href="classNLMISC_1_1CPlane.html#z305_2">getNormal</a>()) * p.<a class="code" href="classNLMISC_1_1CPlane.html#z305_2">getNormal</a>()); +01356 ci.collisionZone = <font class="keyword">this</font>; +01357 (*it)->collisionUpdate(ci, k); +01358 } +01359 +01360 } +01361 } +01362 } +01363 } +01364 } +01365 +01366 +<a name="l01367"></a><a class="code" href="classNL3D_1_1CPSZoneRectangle.html#a1">01367</a> <font class="keywordtype">void</font> CPSZoneRectangle::show(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +01368 { +01369 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>); +01370 <font class="keyword">const</font> uint size = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getSize(); +01371 <font class="keywordflow">if</font> (!size) <font class="keywordflow">return</font>; +01372 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a21">setupDriverModelMatrix</a>(); +01373 CMatrix mat; +01374 +01375 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#l0">CPSLocated</a> *loc; +01376 uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>; +01377 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#z720_0">CPSLocatedBindable</a> *lb; +01378 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getOwner()->getCurrentEditedElement(loc, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, lb); +01379 +01380 <font class="keywordflow">for</font> (uint k = 0; k < size; ++k) +01381 { +01382 <font class="keyword">const</font> CVector &I = <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n0">_Basis</a>[k].X; +01383 <font class="keyword">const</font> CVector &J = <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n0">_Basis</a>[k].Y; +01384 mat.setRot(I, J , I ^J); +01385 mat.setPos(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[k]); +01386 CPSUtil::displayBasis(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a10">getDriver</a>() ,<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a17">getLocatedMat</a>(), mat, 1.f, *<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a11">getFontGenerator</a>(), *<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a13">getFontManager</a>()); +01387 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a21">setupDriverModelMatrix</a>(); +01388 +01389 <font class="keyword">const</font> CRGBA col = ((lb == NULL || <font class="keyword">this</font> == lb) && loc == <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a> && <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> == k ? CRGBA::Red : CRGBA(127, 127, 127)); +01390 +01391 +01392 +01393 <font class="keyword">const</font> CVector &pos = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[k]; +01394 CPSUtil::display3DQuad(*<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a10">getDriver</a>(), pos + I * <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n1">_Width</a>[k] + J * <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n2">_Height</a>[k] +01395 , pos + I * <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n1">_Width</a>[k] - J * <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n2">_Height</a>[k] +01396 , pos - I * <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n1">_Width</a>[k] - J * <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n2">_Height</a>[k] +01397 , pos - I * <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n1">_Width</a>[k] + J * <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n2">_Height</a>[k], col); +01398 } +01399 } +01400 +<a name="l01401"></a><a class="code" href="classNL3D_1_1CPSZoneRectangle.html#a7">01401</a> <font class="keywordtype">void</font> CPSZoneRectangle::setMatrix(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <font class="keyword">const</font> CMatrix &m) +01402 { +01403 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>); +01404 +01405 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>] = m.getPos(); +01406 <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n0">_Basis</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].X = m.getI(); +01407 <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n0">_Basis</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].Y = m.getJ(); +01408 } +01409 +01410 +<a name="l01411"></a><a class="code" href="classNL3D_1_1CPSZoneRectangle.html#a8">01411</a> CMatrix CPSZoneRectangle::getMatrix(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>)<font class="keyword"> const</font> +01412 <font class="keyword"></font>{ +01413 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>); +01414 CMatrix m; +01415 m.setRot(<a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n0">_Basis</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].X, <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n0">_Basis</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].Y, <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n0">_Basis</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].X ^ <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n0">_Basis</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].Y); +01416 m.setPos(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>]); +01417 <font class="keywordflow">return</font> m; +01418 } +01419 +<a name="l01420"></a><a class="code" href="classNL3D_1_1CPSZoneRectangle.html#a9">01420</a> <font class="keywordtype">void</font> CPSZoneRectangle::setScale(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <font class="keywordtype">float</font> scale) +01421 { +01422 <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n1">_Width</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>] = scale; +01423 <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n2">_Height</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>] = scale; +01424 } +<a name="l01425"></a><a class="code" href="classNL3D_1_1CPSZoneRectangle.html#a10">01425</a> <font class="keywordtype">void</font> CPSZoneRectangle::setScale(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <font class="keyword">const</font> CVector &<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>) +01426 { +01427 <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n1">_Width</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>] = <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>.x; +01428 <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n2">_Height</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>] = <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>.y; +01429 } +<a name="l01430"></a><a class="code" href="classNL3D_1_1CPSZoneRectangle.html#a11">01430</a> CVector CPSZoneRectangle::getScale(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>)<font class="keyword"> const</font> +01431 <font class="keyword"></font>{ +01432 <font class="keywordflow">return</font> CVector(<a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n1">_Width</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>], <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n2">_Height</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>], 1.f); +01433 } +01434 +01435 +01436 +<a name="l01437"></a><a class="code" href="classNL3D_1_1CPSZoneRectangle.html#a4">01437</a> <font class="keywordtype">void</font> CPSZoneRectangle::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +01438 { +01439 f.serialVersion(1); +01440 CPSZone::serial(f); +01441 f.serial(_Basis); +01442 f.serial(_Width); +01443 f.serial(_Height); +01444 } +01445 +01446 +<a name="l01447"></a><a class="code" href="classNL3D_1_1CPSZoneRectangle.html#b1">01447</a> <font class="keywordtype">void</font> CPSZoneRectangle::resize(uint32 size) +01448 { +01449 <a class="code" href="debug_8h.html#a6">nlassert</a>(size < (1 << 16)); +01450 <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n0">_Basis</a>.resize(size); +01451 <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n1">_Width</a>.resize(size); +01452 <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n2">_Height</a>.resize(size); +01453 } +01454 +<a name="l01455"></a><a class="code" href="classNL3D_1_1CPSZoneRectangle.html#b2">01455</a> <font class="keywordtype">void</font> CPSZoneRectangle::newElement(CPSLocated *emitterLocated, uint32 emitterIndex) +01456 { +01457 <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n0">_Basis</a>.insert(CPlaneBasis(CVector::K)); +01458 <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n1">_Width</a>.insert(1.f); +01459 <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n2">_Height</a>.insert(1.f); +01460 } +01461 +<a name="l01462"></a><a class="code" href="classNL3D_1_1CPSZoneRectangle.html#b3">01462</a> <font class="keywordtype">void</font> CPSZoneRectangle::deleteElement(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>) +01463 { +01464 <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n0">_Basis</a>.remove(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +01465 <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n1">_Width</a>.remove(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +01466 <a class="code" href="classNL3D_1_1CPSZoneRectangle.html#n2">_Height</a>.remove(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +01467 } +01468 +01469 +01470 +01471 } <font class="comment">// NL3D</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> |