diff options
Diffstat (limited to 'docs/doxygen/nel/ps__force_8cpp-source.html')
-rw-r--r-- | docs/doxygen/nel/ps__force_8cpp-source.html | 1448 |
1 files changed, 1448 insertions, 0 deletions
diff --git a/docs/doxygen/nel/ps__force_8cpp-source.html b/docs/doxygen/nel/ps__force_8cpp-source.html new file mode 100644 index 00000000..d7bbb256 --- /dev/null +++ b/docs/doxygen/nel/ps__force_8cpp-source.html @@ -0,0 +1,1448 @@ +<!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_force.cpp</h1><a href="ps__force_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__force_8h.html">3d/ps_force.h</a>"</font> +00029 <font class="preprocessor">#include "<a class="code" href="driver_8h.html">3d/driver.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="vertex__buffer_8h.html">3d/vertex_buffer.h</a>"</font> +00033 <font class="preprocessor">#include "<a class="code" href="computed__string_8h.html">3d/computed_string.h</a>"</font> +00034 <font class="preprocessor">#include "<a class="code" href="font__manager_8h.html">3d/font_manager.h</a>"</font> +00035 <font class="preprocessor">#include "<a class="code" href="particle__system_8h.html">3d/particle_system.h</a>"</font> +00036 <font class="preprocessor">#include "<a class="code" href="common_8h.html">nel/misc/common.h</a>"</font> +00037 <font class="preprocessor">#include "<a class="code" href="ps__util_8h.html">3d/ps_util.h</a>"</font> +00038 <font class="preprocessor">#include "<a class="code" href="ps__misc_8h.html">3d/ps_misc.h</a>"</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_1CPSForce.html#a0">00046</a> CPSForce::CPSForce() +00047 { +00048 } +00049 +00050 +00051 +<a name="l00052"></a><a class="code" href="classNL3D_1_1CPSForce.html#a7">00052</a> <font class="keywordtype">void</font> CPSForce::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +00053 { +00054 +00055 f.serialVersion(1); +00056 CPSTargetLocatedBindable::serial(f); +00057 CPSLocatedBindable::serial(f); +00058 +00059 } +00060 +00061 +<a name="l00062"></a><a class="code" href="classNL3D_1_1CPSForce.html#b0">00062</a> <font class="keywordtype">void</font> CPSForce::registerToTargets(<font class="keywordtype">void</font>) +00063 { +00064 <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) +00065 { +00066 <font class="keywordflow">if</font> (this-><a class="code" href="classNL3D_1_1CPSForce.html#a8">isIntegrable</a>()) +00067 { +00068 (*it)->registerIntegrableForce(<font class="keyword">this</font>); +00069 } +00070 <font class="keywordflow">else</font> +00071 { +00072 (*it)->addNonIntegrableForceRef(); +00073 } +00074 } +00075 } +00076 +00077 +<a name="l00078"></a><a class="code" href="classNL3D_1_1CPSForce.html#a4">00078</a> <font class="keywordtype">void</font> CPSForce::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> realEllapsedTime) +00079 { +00080 <font class="keywordflow">switch</font>(pass) +00081 { +00082 <font class="keywordflow">case</font> <a class="code" href="namespaceNL3D.html#a484a168">PSMotion</a>: +00083 <a class="code" href="classNL3D_1_1CPSForce.html#a5">performDynamic</a>(ellapsedTime); +00084 <font class="keywordflow">break</font>; +00085 <font class="keywordflow">case</font> <a class="code" href="namespaceNL3D.html#a484a171">PSToolRender</a>: +00086 <a class="code" href="classNL3D_1_1CPSForce.html#a6">show</a>(ellapsedTime); +00087 <font class="keywordflow">break</font>; +00088 <font class="keywordflow">default</font>: <font class="keywordflow">break</font>; +00089 } +00090 } +00091 +00092 +00093 +<a name="l00094"></a><a class="code" href="classNL3D_1_1CPSForce.html#a9">00094</a> <font class="keywordtype">void</font> CPSForce::attachTarget(CPSLocated *ptr) +00095 { +00096 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>); +00097 CPSTargetLocatedBindable::attachTarget(ptr); +00098 <font class="comment">// check wether we are integrable, and if so, add us to the list</font> +00099 <font class="keywordflow">if</font> (this-><a class="code" href="classNL3D_1_1CPSForce.html#a8">isIntegrable</a>()) +00100 { +00101 ptr->registerIntegrableForce(<font class="keyword">this</font>); +00102 } +00103 <font class="keywordflow">else</font> +00104 { +00105 ptr->addNonIntegrableForceRef(); +00106 } +00107 } +00108 +<a name="l00109"></a><a class="code" href="classNL3D_1_1CPSForce.html#a10">00109</a> <font class="keywordtype">void</font> CPSForce::releaseTargetRsc(CPSLocated *target) +00110 { +00111 <font class="keywordflow">if</font> (this-><a class="code" href="classNL3D_1_1CPSForce.html#a8">isIntegrable</a>()) +00112 { +00113 target->unregisterIntegrableForce(<font class="keyword">this</font>); +00114 } +00115 <font class="keywordflow">else</font> +00116 { +00117 target->releaseNonIntegrableForceRef(); +00118 } +00119 } +00120 +00121 +00122 +<a name="l00123"></a><a class="code" href="classNL3D_1_1CPSForce.html#b3">00123</a> <font class="keywordtype">void</font> CPSForce::basisChanged(<font class="keywordtype">bool</font> systemBasis) +00124 { +00125 <font class="keywordflow">if</font> (!this-><a class="code" href="classNL3D_1_1CPSForce.html#a8">isIntegrable</a>()) <font class="keywordflow">return</font>; +00126 <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) +00127 { +00128 (*it)->integrableForceBasisChanged(systemBasis); +00129 } +00130 } +00131 +00132 +<a name="l00133"></a><a class="code" href="classNL3D_1_1CPSForce.html#b1">00133</a> <font class="keywordtype">void</font> CPSForce::cancelIntegrable(<font class="keywordtype">void</font>) +00134 { +00135 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>); +00136 <font class="keywordtype">bool</font> useSystemBasis = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->isInSystemBasis(); +00137 <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) +00138 { +00139 <font class="keywordflow">if</font> ((*it)->isInSystemBasis() == useSystemBasis) +00140 { +00141 (*it)->unregisterIntegrableForce(<font class="keyword">this</font>); +00142 (*it)->addNonIntegrableForceRef(); +00143 } +00144 } +00145 } +00146 +00147 +<a name="l00148"></a><a class="code" href="classNL3D_1_1CPSForce.html#b2">00148</a> <font class="keywordtype">void</font> CPSForce::renewIntegrable(<font class="keywordtype">void</font>) +00149 { +00150 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>); +00151 <font class="keywordtype">bool</font> useSystemBasis = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->isInSystemBasis(); +00152 <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) +00153 { +00154 <font class="keywordflow">if</font> ((*it)->isInSystemBasis() == useSystemBasis) +00155 { +00156 (*it)->registerIntegrableForce(<font class="keyword">this</font>); +00157 (*it)->releaseNonIntegrableForceRef(); +00158 } +00159 } +00160 } +00161 +00162 +00163 +00165 <font class="comment">// CPSForceIntensity implementation //</font> +00167 <font class="comment"></font> +<a name="l00168"></a><a class="code" href="classNL3D_1_1CPSForceIntensity.html#a3">00168</a> <font class="keywordtype">void</font> CPSForceIntensity::setIntensity(<font class="keywordtype">float</font> <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>) +00169 { +00170 <font class="keywordflow">if</font> (_IntensityScheme) +00171 { +00172 <font class="keyword">delete</font> <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a>; +00173 <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a> = NULL; +00174 } +00175 <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> = <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>; +00176 +00177 } +00178 +<a name="l00179"></a><a class="code" href="classNL3D_1_1CPSForceIntensity.html#a1">00179</a> CPSForceIntensity::~CPSForceIntensity() +00180 { +00181 <font class="keyword">delete</font> <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a>; +00182 } +00183 +<a name="l00184"></a><a class="code" href="classNL3D_1_1CPSForceIntensity.html#a4">00184</a> <font class="keywordtype">void</font> CPSForceIntensity::setIntensityScheme(CPSAttribMaker<float> *scheme) +00185 { +00186 <a class="code" href="debug_8h.html#a6">nlassert</a>(scheme); +00187 <font class="keyword">delete</font> <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a>; +00188 <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a> = scheme; +00189 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CPSForceIntensity.html#b0">getForceIntensityOwner</a>() && scheme->hasMemory()) scheme->resize(<a class="code" href="classNL3D_1_1CPSForceIntensity.html#b0">getForceIntensityOwner</a>()->getMaxSize(), <a class="code" href="classNL3D_1_1CPSForceIntensity.html#b0">getForceIntensityOwner</a>()->getSize()); +00190 } +00191 +<a name="l00192"></a><a class="code" href="classNL3D_1_1CPSForceIntensity.html#a8">00192</a> <font class="keywordtype">void</font> CPSForceIntensity::serialForceIntensity(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +00193 { +00194 f.serialVersion(1); +00195 <font class="keywordflow">if</font> (!f.isReading()) +00196 { +00197 <font class="keywordflow">if</font> (_IntensityScheme) +00198 { +00199 <font class="keywordtype">bool</font> bFalse = <font class="keyword">false</font>; +00200 f.serial(bFalse); +00201 f.serialPolyPtr(_IntensityScheme); +00202 } +00203 <font class="keywordflow">else</font> +00204 { +00205 <font class="keywordtype">bool</font> bTrue = <font class="keyword">true</font>; +00206 f.serial(bTrue); +00207 f.serial(_K); +00208 } +00209 } +00210 <font class="keywordflow">else</font> +00211 { +00212 <font class="keywordtype">bool</font> constantIntensity; +00213 f.serial(constantIntensity); +00214 <font class="keywordflow">if</font> (constantIntensity) +00215 { +00216 f.serial(_K); +00217 } +00218 <font class="keywordflow">else</font> +00219 { +00220 f.serialPolyPtr(_IntensityScheme); +00221 } +00222 } +00223 } +00224 +00225 +00227 <font class="comment">// CPSForceIntensityHelper //</font> +00229 <font class="comment"></font> +00230 +<a name="l00231"></a><a class="code" href="classNL3D_1_1CPSForceIntensityHelper.html#a0">00231</a> <font class="keywordtype">void</font> CPSForceIntensityHelper::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +00232 { +00233 f.serialVersion(1); +00234 CPSForce::serial(f); +00235 serialForceIntensity(f); +00236 <font class="keywordflow">if</font> (f.isReading()) +00237 { +00238 registerToTargets(); +00239 } +00240 } +00241 +00242 +00243 +00245 <font class="comment">// CPSDirectionalForce implementation //</font> +00247 <font class="comment"></font> +00248 +<a name="l00249"></a><a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#a0">00249</a> <font class="keywordtype">void</font> CPSDirectionnalForce::performDynamic(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00250 { +00251 <font class="comment">// perform the operation on each target</font> +00252 CVector toAdd; +00253 <font class="keywordflow">for</font> (uint32 k = 0; k < <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getSize(); ++k) +00254 { +00255 CVector toAddLocal; +00256 CVector dir; +00257 +00258 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#n1">_GlobalValueHandle</a>.isValid()) <font class="comment">// is direction a global variable ?</font> +00259 { +00260 dir = <a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#n1">_GlobalValueHandle</a>.get(); <font class="comment">// takes direction from global variable instead </font> +00261 } +00262 <font class="keywordflow">else</font> +00263 { +00264 dir = <a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#n0">_Dir</a>; +00265 } +00266 +00267 toAddLocal = ellapsedTime * (<a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a> ? <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a>->get(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>, k) : <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> ) * dir; +00268 <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) +00269 { +00270 +00271 toAdd = CPSLocated::getConversionMatrix(*it, this->_Owner).mulVector(toAddLocal); <font class="comment">// express this in the target basis</font> +00272 TPSAttribVector::iterator it2 = (*it)->getSpeed().begin(), it2end = (*it)->getSpeed().end(); +00273 <font class="comment">// 1st case : non-constant mass</font> +00274 <font class="keywordflow">if</font> ((*it)->getMassScheme()) +00275 { +00276 TPSAttribFloat::const_iterator invMassIt = (*it)->getInvMass().begin(); +00277 <font class="keywordflow">for</font> (; it2 != it2end; ++it2, ++invMassIt) +00278 { +00279 (*it2) += *invMassIt * toAdd; +00280 +00281 } +00282 } +00283 <font class="keywordflow">else</font> +00284 { +00285 <font class="comment">// the mass is constant</font> +00286 toAdd /= (*it)->getInitialMass(); +00287 <font class="keywordflow">for</font> (; it2 != it2end; ++it2) +00288 { +00289 (*it2) += toAdd; +00290 } +00291 } +00292 } +00293 } +00294 } +00295 +00296 +<a name="l00297"></a><a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#a1">00297</a> <font class="keywordtype">void</font> CPSDirectionnalForce::show(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00298 { +00299 <a class="code" href="classNL3D_1_1CPSForce.html#l0">CPSLocated</a> *loc; +00300 uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>; +00301 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#z720_0">CPSLocatedBindable</a> *lb; +00302 <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); +00303 +00304 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a21">setupDriverModelMatrix</a>(); +00305 +00306 CVector dir; +00307 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#n1">_GlobalValueHandle</a>.isValid()) <font class="comment">// is direction a global variable ?</font> +00308 { +00309 dir = <a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#n1">_GlobalValueHandle</a>.get(); <font class="comment">// takes direction from global variable instead </font> +00310 } +00311 <font class="keywordflow">else</font> +00312 { +00313 dir = <a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#n0">_Dir</a>; +00314 } +00315 +00316 <font class="comment">// for each element, see if it is the selected element, and if yes, display in red</font> +00317 <font class="keywordflow">for</font> (uint k = 0; k < <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getSize(); ++k) +00318 { +00319 <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)); +00320 CPSUtil::displayArrow(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a10">getDriver</a>(), <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[k], dir, 1.f, col, CRGBA(80, 80, 0)); +00321 } +00322 } +00323 +<a name="l00324"></a><a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#a3">00324</a> <font class="keywordtype">void</font> CPSDirectionnalForce::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +00325 { +00326 <font class="comment">// Version 2 : added link to a global vector value</font> +00327 <font class="comment">//</font> +00328 sint ver = f.serialVersion(2); +00329 CPSForceIntensityHelper::serial(f); +00330 <font class="keywordflow">if</font> (ver == 1) +00331 { +00332 f.serial(_Dir); +00333 _GlobalValueHandle.reset(); +00334 } +00335 <font class="keywordflow">else</font> +00336 { +00337 <font class="keywordtype">bool</font> useHandle = _GlobalValueHandle.isValid(); +00338 f.serial(useHandle); +00339 <font class="keywordflow">if</font> (useHandle) +00340 { +00341 <font class="comment">// a global value is used</font> +00342 <font class="keywordflow">if</font> (f.isReading()) +00343 { +00344 std::string handleName; +00345 f.serial(handleName); +00346 <font class="comment">// retrieve a handle to the global value from the particle system</font> +00347 _GlobalValueHandle = CParticleSystem::getGlobalVectorValueHandle(handleName); +00348 } +00349 <font class="keywordflow">else</font> +00350 { +00351 std::string handleName = _GlobalValueHandle.getName(); +00352 f.serial(handleName); +00353 } +00354 } +00355 <font class="keywordflow">else</font> +00356 { +00357 f.serial(_Dir); +00358 } +00359 } +00360 } +00361 +<a name="l00362"></a><a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#z719_3">00362</a> <font class="keywordtype">void</font> CPSDirectionnalForce::enableGlobalVectorValue(<font class="keyword">const</font> std::string &name) +00363 { +00364 <font class="keywordflow">if</font> (name.empty()) +00365 { +00366 <a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#n1">_GlobalValueHandle</a>.reset(); +00367 <font class="keywordflow">return</font>; +00368 } +00369 <a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#n1">_GlobalValueHandle</a> = CParticleSystem::getGlobalVectorValueHandle(name); +00370 } +00371 +<a name="l00372"></a><a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#z719_4">00372</a> std::string CPSDirectionnalForce::getGlobalVectorValueName()<font class="keyword"> const</font> +00373 <font class="keyword"></font>{ +00374 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#n1">_GlobalValueHandle</a>.isValid() ? <a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#n1">_GlobalValueHandle</a>.getName() : <font class="stringliteral">""</font>; +00375 } +00376 +00378 <font class="comment">// gravity implementation //</font> +00380 <font class="comment"></font> +00381 +<a name="l00382"></a><a class="code" href="classNL3D_1_1CPSGravity.html#a0">00382</a> <font class="keywordtype">void</font> CPSGravity::performDynamic(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00383 { +00384 +00385 <font class="comment">// perform the operation on each target</font> +00386 CVector toAdd; +00387 <font class="keywordflow">for</font> (uint32 k = 0; k < <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getSize(); ++k) +00388 { +00389 CVector toAddLocal = ellapsedTime * CVector(0, 0, <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a> ? - <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a>->get(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>, k) : - <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a>); +00390 <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) +00391 { +00392 toAdd = CPSLocated::getConversionMatrix(*it, this->_Owner).mulVector(toAddLocal); <font class="comment">// express this in the target basis</font> +00393 TPSAttribVector::iterator it2 = (*it)->getSpeed().begin(), it2end = (*it)->getSpeed().end(); +00394 +00395 <font class="keywordflow">if</font> (toAdd.x && toAdd.y) +00396 { +00397 <font class="keywordflow">for</font> (; it2 != it2end; ++it2) +00398 { +00399 (*it2) += toAdd; +00400 +00401 } +00402 } +00403 <font class="keywordflow">else</font> <font class="comment">// only the z component is not null, which should be the majority of cases ...</font> +00404 { +00405 <font class="keywordflow">for</font> (; it2 != it2end; ++it2) +00406 { +00407 it2->z += toAdd.z; +00408 +00409 } +00410 } +00411 } +00412 } +00413 } +00414 +<a name="l00415"></a><a class="code" href="classNL3D_1_1CPSGravity.html#a1">00415</a> <font class="keywordtype">void</font> CPSGravity::show(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00416 { +00417 CVector I = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a22">computeI</a>(); +00418 CVector K = CVector(0,0,1); +00419 +00420 <font class="comment">// this is not designed for efficiency (target : edition code)</font> +00421 CPrimitiveBlock pb; +00422 CVertexBuffer vb; +00423 CMaterial material; +00424 IDriver *driver = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a10">getDriver</a>(); +00425 <font class="keyword">const</font> <font class="keywordtype">float</font> toolSize = 0.2f; +00426 +00427 vb.setVertexFormat(CVertexBuffer::PositionFlag); +00428 vb.setNumVertices(6); +00429 vb.setVertexCoord(0, -toolSize * I); +00430 vb.setVertexCoord(1, toolSize * I); +00431 vb.setVertexCoord(2, CVector(0, 0, 0)); +00432 vb.setVertexCoord(3, -6.0f * toolSize * K); +00433 vb.setVertexCoord(4, -toolSize * I - 5.0f * toolSize * K); +00434 vb.setVertexCoord(5, toolSize * I - 5.0f * toolSize * K); +00435 +00436 pb.reserveLine(4); +00437 pb.addLine(0, 1); +00438 pb.addLine(2, 3); +00439 pb.addLine(4, 3); +00440 pb.addLine(3, 5); +00441 +00442 material.setColor(CRGBA(127, 127, 127)); +00443 material.setLighting(<font class="keyword">false</font>); +00444 material.setBlendFunc(CMaterial::one, CMaterial::one); +00445 material.setZWrite(<font class="keyword">false</font>); +00446 material.setBlend(<font class="keyword">true</font>); +00447 +00448 +00449 CMatrix mat; +00450 +00451 <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) +00452 { +00453 mat.identity(); +00454 mat.translate(*it); +00455 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->isInSystemBasis()) +00456 { +00457 mat = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a15">getSysMat</a>() * mat; +00458 } +00459 +00460 driver->setupModelMatrix(mat); +00461 driver->activeVertexBuffer(vb); +00462 driver->render(pb, material); +00463 +00464 +00465 +00466 <font class="comment">// affiche un g a cote de la force</font> +00467 +00468 CVector pos = *it + CVector(1.5f * toolSize, 0, -1.2f * toolSize); +00469 +00470 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->isInSystemBasis()) +00471 { +00472 pos = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a15">getSysMat</a>() * pos; +00473 } +00474 +00475 <font class="comment">// must have set this</font> +00476 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a11">getFontGenerator</a>() && <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a11">getFontGenerator</a>()); +00477 +00478 CPSUtil::print(driver, std::string(<font class="stringliteral">"G"</font>) +00479 , *<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a11">getFontGenerator</a>() +00480 , *<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a13">getFontManager</a>() +00481 , pos +00482 , 80.0f * toolSize ); +00483 } +00484 +00485 +00486 } +00487 +<a name="l00488"></a><a class="code" href="classNL3D_1_1CPSGravity.html#a3">00488</a> <font class="keywordtype">void</font> CPSGravity::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +00489 { +00490 f.serialVersion(1); +00491 CPSForceIntensityHelper::serial(f); +00492 } +00493 +00494 +<a name="l00495"></a><a class="code" href="classNL3D_1_1CPSGravity.html#a5">00495</a> <font class="keywordtype">bool</font> CPSGravity::isIntegrable(<font class="keywordtype">void</font>)<font class="keyword"> const</font> +00496 <font class="keyword"></font>{ +00497 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a> == NULL; +00498 } +00499 +<a name="l00500"></a><a class="code" href="classNL3D_1_1CPSGravity.html#a6">00500</a> <font class="keywordtype">void</font> CPSGravity::integrate(<font class="keywordtype">float</font> date, CPSLocated *<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>, uint32 startIndex, uint32 numObjects, <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *destPos, <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *destSpeed, +00501 <font class="keywordtype">bool</font> accumulate, +00502 uint posStride, uint speedStride +00503 ) +00504 { +00505 <font class="preprocessor"> #define NEXT_SPEED destSpeed = (NLMISC::CVector *) ((uint8 *) destSpeed + speedStride);</font> +00506 <font class="preprocessor"></font><font class="preprocessor"> #define NEXT_POS destPos = (NLMISC::CVector *) ((uint8 *) destPos + posStride);</font> +00507 <font class="preprocessor"></font> +00508 <font class="keywordtype">float</font> deltaT; +00509 +00510 <font class="keywordflow">if</font> (!destPos && !destSpeed) <font class="keywordflow">return</font>; +00511 +00512 CPSLocated::TPSAttribParametricInfo::const_iterator it = <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>->_PInfo.begin() + startIndex, +00513 endIt = <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>->_PInfo.begin() + startIndex + numObjects; +00514 <font class="keywordflow">if</font> (!accumulate) <font class="comment">// compute coords from initial condition, and applying this force</font> +00515 { +00516 <font class="keywordflow">if</font> (destPos && !destSpeed) <font class="comment">// fills dest pos only</font> +00517 { +00518 <font class="keywordflow">while</font> (it != endIt) +00519 { +00520 deltaT = date - it->Date; +00521 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> = it->Pos.x + deltaT * it->Speed.x; +00522 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> = it->Pos.y + deltaT * it->Speed.y; +00523 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> = it->Pos.z + deltaT * it->Speed.z - 0.5f * deltaT * deltaT * <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a>; +00524 ++it; +00525 NEXT_POS; +00526 } +00527 } +00528 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (!destPos && destSpeed) <font class="comment">// fills dest speed only</font> +00529 { +00530 <font class="keywordflow">while</font> (it != endIt) +00531 { +00532 deltaT = date - it->Date; +00533 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> = it->Speed.x; +00534 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> = it->Speed.y; +00535 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> = it->Speed.z - deltaT * <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a>; +00536 ++it; +00537 NEXT_SPEED; +00538 } +00539 } +00540 <font class="keywordflow">else</font> <font class="comment">// fills both speed and pos</font> +00541 { +00542 <font class="keywordflow">while</font> (it != endIt) +00543 { +00544 deltaT = date - it->Date; +00545 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> = it->Pos.x + deltaT * it->Speed.x; +00546 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> = it->Pos.y + deltaT * it->Speed.y; +00547 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> = it->Pos.z + deltaT * it->Speed.z - 0.5f * deltaT * deltaT * <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a>; +00548 +00549 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> = it->Speed.x; +00550 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> = it->Speed.y; +00551 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> = it->Speed.z - deltaT * <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a>; +00552 +00553 ++it; +00554 NEXT_POS; +00555 NEXT_SPEED; +00556 } +00557 } +00558 } +00559 <font class="keywordflow">else</font> <font class="comment">// accumulate datas</font> +00560 { +00561 <font class="keywordflow">if</font> (destPos && !destSpeed) <font class="comment">// fills dest pos only</font> +00562 { +00563 <font class="keywordflow">while</font> (it != endIt) +00564 { +00565 deltaT = date - it->Date; +00566 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> -= 0.5f * deltaT * deltaT * <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a>; +00567 ++it; +00568 NEXT_POS; +00569 } +00570 } +00571 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (!destPos && destSpeed) <font class="comment">// fills dest speed only</font> +00572 { +00573 <font class="keywordflow">while</font> (it != endIt) +00574 { +00575 deltaT = date - it->Date; +00576 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> -= deltaT * <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a>; +00577 ++it; +00578 NEXT_SPEED; +00579 } +00580 } +00581 <font class="keywordflow">else</font> <font class="comment">// fills both speed and pos</font> +00582 { +00583 <font class="keywordflow">while</font> (it != endIt) +00584 { +00585 deltaT = date - it->Date; +00586 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> -= 0.5f * deltaT * deltaT * <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a>; +00587 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> -= deltaT * <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a>; +00588 ++it; +00589 NEXT_POS; +00590 NEXT_SPEED; +00591 } +00592 } +00593 } +00594 +00595 } +00596 +00597 +00598 +<a name="l00599"></a><a class="code" href="classNL3D_1_1CPSGravity.html#a7">00599</a> <font class="keywordtype">void</font> CPSGravity::integrateSingle(<font class="keywordtype">float</font> startDate, <font class="keywordtype">float</font> deltaT, uint numStep, +00600 CPSLocated *<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>, uint32 indexInLocated, +00601 <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *destPos, +00602 <font class="keywordtype">bool</font> accumulate <font class="comment">/*= false*/</font>, +00603 uint <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a><font class="comment">/* = sizeof(NLMISC::CVector)*/</font>) +00604 { +00605 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>->isParametricMotionEnabled()); +00606 <a class="code" href="debug_8h.html#a6">nlassert</a>(deltaT > 0); +00607 <a class="code" href="debug_8h.html#a6">nlassert</a>(numStep > 0); +00608 <font class="preprocessor"> #ifdef NL_DEBUG</font> +00609 <font class="preprocessor"></font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *endPos = (<a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *) ( (uint8 *) destPos + <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a> * numStep); +00610 <font class="preprocessor"> #endif</font> +00611 <font class="preprocessor"></font> <font class="keyword">const</font> CPSLocated::CParametricInfo &pi = <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>->_PInfo[indexInLocated]; +00612 <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &startPos = pi.Pos; +00613 <font class="keywordflow">if</font> (numStep != 0) +00614 { +00615 <font class="keywordflow">if</font> (!accumulate) +00616 { +00617 destPos = <a class="code" href="namespaceNL3D.html#a436">FillBufUsingSubdiv</a>(startPos, pi.Date, startDate, deltaT, numStep, destPos, <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>); +00618 <font class="keywordflow">if</font> (numStep != 0) +00619 { +00620 <font class="keywordtype">float</font> currDate = startDate - pi.Date; +00621 <a class="code" href="debug_8h.html#a6">nlassert</a>(currDate >= 0); +00622 <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &startSpeed = pi.Speed; +00623 <font class="keywordflow">do</font> +00624 { +00625 <font class="preprocessor"> #ifdef NL_DEBUG</font> +00626 <font class="preprocessor"></font> <a class="code" href="debug_8h.html#a6">nlassert</a>(destPos < endPos); +00627 <font class="preprocessor"> #endif</font> +00628 <font class="preprocessor"></font> <font class="keywordtype">float</font> halfTimeSquare = 0.5f * currDate * currDate; +00629 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> = startPos.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> + currDate * startSpeed.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>; +00630 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> = startPos.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> + currDate * startSpeed.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>; +00631 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> = startPos.<a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> + currDate * startSpeed.<a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> - <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * halfTimeSquare; +00632 currDate += deltaT; +00633 destPos = (<a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *) ( (uint8 *) destPos + <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>); +00634 } +00635 <font class="keywordflow">while</font> (--numStep); +00636 } +00637 } +00638 <font class="keywordflow">else</font> +00639 { +00640 uint numToSkip = <a class="code" href="namespaceNL3D.html#a435">ScaleFloatGE</a>(startDate, deltaT, pi.Date, numStep); +00641 <font class="keywordflow">if</font> (numToSkip < numStep) +00642 { +00643 numStep -= numToSkip; +00644 <font class="keywordtype">float</font> currDate = startDate + deltaT * numToSkip - pi.Date; +00645 <font class="keywordflow">do</font> +00646 { +00647 <font class="preprocessor"> #ifdef NL_DEBUG</font> +00648 <font class="preprocessor"></font> <a class="code" href="debug_8h.html#a6">nlassert</a>(destPos < endPos); +00649 <font class="preprocessor"> #endif</font> +00650 <font class="preprocessor"></font> <font class="keywordtype">float</font> halfTimeSquare = 0.5f * currDate * currDate; +00651 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> -= <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * halfTimeSquare; +00652 currDate += deltaT; +00653 destPos = (<a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *) ( (uint8 *) destPos + <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>); +00654 } +00655 <font class="keywordflow">while</font> (--numStep); +00656 } +00657 } +00658 } +00659 } +00660 +00661 +<a name="l00662"></a><a class="code" href="classNL3D_1_1CPSGravity.html#b0">00662</a> <font class="keywordtype">void</font> CPSGravity::setIntensity(<font class="keywordtype">float</font> <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>) +00663 { +00664 <font class="keywordflow">if</font> (_IntensityScheme) +00665 { +00666 CPSForceIntensityHelper::setIntensity(<a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>); +00667 <a class="code" href="classNL3D_1_1CPSForce.html#b2">renewIntegrable</a>(); <font class="comment">// integrable again</font> +00668 } +00669 <font class="keywordflow">else</font> +00670 { +00671 CPSForceIntensityHelper::setIntensity(<a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>); +00672 } +00673 } +00674 +<a name="l00675"></a><a class="code" href="classNL3D_1_1CPSGravity.html#b1">00675</a> <font class="keywordtype">void</font> CPSGravity::setIntensityScheme(CPSAttribMaker<float> *scheme) +00676 { +00677 <font class="keywordflow">if</font> (!<a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a>) +00678 { +00679 <a class="code" href="classNL3D_1_1CPSForce.html#b1">cancelIntegrable</a>(); <font class="comment">// not integrable anymore</font> +00680 } +00681 CPSForceIntensityHelper::setIntensityScheme(scheme); +00682 } +00683 +00684 +00686 <font class="comment">// CPSCentralGravity implementation //</font> +00688 <font class="comment"></font> +00689 +<a name="l00690"></a><a class="code" href="classNL3D_1_1CPSCentralGravity.html#a0">00690</a> <font class="keywordtype">void</font> CPSCentralGravity::performDynamic(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00691 { +00692 <font class="comment">// for each central gravity, and each target, we check if they are in the same basis</font> +00693 <font class="comment">// if not, we need to transform the central gravity attachment pos into the target basis</font> +00694 +00695 +00696 uint32 size = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getSize(); +00697 +00698 <font class="comment">// a vector that goes from the gravity to the object</font> +00699 CVector centerToObj; +00700 <font class="keywordtype">float</font> dist; +00701 +00702 <font class="keywordflow">for</font> (uint32 k = 0; k < size; ++k) +00703 { +00704 <font class="keyword">const</font> <font class="keywordtype">float</font> ellapsedTimexK = ellapsedTime * (<a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a> ? <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a>->get(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>, k) : <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a>); +00705 +00706 <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) +00707 { +00708 <font class="keyword">const</font> CMatrix &m = CPSLocated::getConversionMatrix(*it, this->_Owner); +00709 <font class="keyword">const</font> CVector center = m * (<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[k]); +00710 +00711 TPSAttribVector::iterator it2 = (*it)->getSpeed().begin(), it2End = (*it)->getSpeed().end(); +00712 TPSAttribFloat::const_iterator invMassIt = (*it)->getInvMass().begin(); +00713 TPSAttribVector::const_iterator posIt = (*it)->getPos().begin(); +00714 +00715 <font class="keywordflow">for</font> (; it2 != it2End; ++it2, ++invMassIt, ++posIt) +00716 { +00717 <font class="comment">// our equation does 1 / r attenuation, which is not realistic, but fast ...</font> +00718 centerToObj = center - *posIt; +00719 +00720 dist = centerToObj * centerToObj; +00721 <font class="keywordflow">if</font> (dist > 10E-6f) +00722 { +00723 (*it2) += (*invMassIt) * ellapsedTimexK * (1.f / dist) * centerToObj; +00724 } +00725 } +00726 } +00727 } +00728 +00729 } +00730 +<a name="l00731"></a><a class="code" href="classNL3D_1_1CPSCentralGravity.html#a1">00731</a> <font class="keywordtype">void</font> CPSCentralGravity::show(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00732 { +00733 CVector I = CVector::I; +00734 CVector J = CVector::J; +00735 +00736 <font class="keyword">const</font> CVector tab[] = { -I - J, I - J +00737 ,-I + J, I + J +00738 , I - J, I + J +00739 , -I - J, -I + J +00740 , I + J, -I - J +00741 , I - J, J - I +00742 }; +00743 <font class="keyword">const</font> uint tabSize = <font class="keyword">sizeof</font>(tab) / (2 * <font class="keyword">sizeof</font>(CVector)); +00744 +00745 <font class="keyword">const</font> <font class="keywordtype">float</font> sSize = 0.08f; +00746 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#b4">displayIcon2d</a>(tab, tabSize, sSize); +00747 } +00748 +<a name="l00749"></a><a class="code" href="classNL3D_1_1CPSCentralGravity.html#a3">00749</a> <font class="keywordtype">void</font> CPSCentralGravity::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +00750 { +00751 f.serialVersion(1); +00752 CPSForceIntensityHelper::serial(f); +00753 } +00754 +00755 +00757 <font class="comment">// CPSSpring implementation //</font> +00759 <font class="comment"></font> +00760 +00761 +<a name="l00762"></a><a class="code" href="classNL3D_1_1CPSSpring.html#a2">00762</a> <font class="keywordtype">void</font> CPSSpring::performDynamic(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00763 { +00764 <font class="comment">// for each spring, and each target, we check if they are in the same basis</font> +00765 <font class="comment">// if not, we need to transform the spring attachment pos into the target basis</font> +00766 +00767 +00768 uint32 size = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getSize(); +00769 +00770 +00771 <font class="keywordflow">for</font> (uint32 k = 0; k < size; ++k) +00772 { +00773 <font class="keyword">const</font> <font class="keywordtype">float</font> ellapsedTimexK = ellapsedTime * (<a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a> ? <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a>->get(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>, k) : <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a>); +00774 +00775 <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) +00776 { +00777 <font class="keyword">const</font> CMatrix &m = CPSLocated::getConversionMatrix(*it, this->_Owner); +00778 <font class="keyword">const</font> CVector center = m * (<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[k]); +00779 +00780 TPSAttribVector::iterator it2 = (*it)->getSpeed().begin(), it2End = (*it)->getSpeed().end(); +00781 TPSAttribFloat::const_iterator invMassIt = (*it)->getInvMass().begin(); +00782 TPSAttribVector::const_iterator posIt = (*it)->getPos().begin(); +00783 +00784 <font class="keywordflow">for</font> (; it2 != it2End; ++it2, ++invMassIt, ++posIt) +00785 { +00786 <font class="comment">// apply the spring equation</font> +00787 (*it2) += (*invMassIt) * ellapsedTimexK * (center - *posIt); +00788 } +00789 } +00790 } +00791 } +00792 +00793 +<a name="l00794"></a><a class="code" href="classNL3D_1_1CPSSpring.html#a1">00794</a> <font class="keywordtype">void</font> CPSSpring::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +00795 { +00796 f.serialVersion(1); +00797 CPSForceIntensityHelper::serial(f); +00798 } +00799 +00800 +00801 +<a name="l00802"></a><a class="code" href="classNL3D_1_1CPSSpring.html#a3">00802</a> <font class="keywordtype">void</font> CPSSpring::show(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00803 { +00804 CVector I = CVector::I; +00805 CVector J = CVector::J; +00806 <font class="keyword">static</font> <font class="keyword">const</font> CVector tab[] = +00807 { +00808 -I + 2 * J, +00809 I + 2 * J, +00810 I + 2 * J, -I + J, +00811 -I + J, I + J, +00812 I + J, -I, +00813 -I, I, +00814 I, -I - J, +00815 -I - J, I - J, +00816 I - J, +00817 - I - 2 * J, +00818 - I - 2 * J, +00819 I - 2 * J +00820 }; +00821 <font class="keyword">const</font> uint tabSize = <font class="keyword">sizeof</font>(tab) / (2 * <font class="keyword">sizeof</font>(CVector)); +00822 <font class="keyword">const</font> <font class="keywordtype">float</font> sSize = 0.08f; +00823 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#b4">displayIcon2d</a>(tab, tabSize, sSize); +00824 } +00825 +00826 +00828 <font class="comment">// CPSCylindricVortex implementation //</font> +00830 <font class="comment"></font> +<a name="l00831"></a><a class="code" href="classNL3D_1_1CPSCylindricVortex.html#a0">00831</a> <font class="keywordtype">void</font> CPSCylindricVortex::performDynamic(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00832 { +00833 uint32 size = <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getSize(); +00834 +00835 <font class="keywordflow">for</font> (uint32 k = 0; k < size; ++k) <font class="comment">// for each vortex</font> +00836 { +00837 +00838 <font class="keyword">const</font> <font class="keywordtype">float</font> invR = 1.f / <a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n1">_Radius</a>[k]; +00839 <font class="keyword">const</font> <font class="keywordtype">float</font> radius2 = <a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n1">_Radius</a>[k] * <a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n1">_Radius</a>[k]; +00840 +00841 <font class="comment">// intensity for this vortex</font> +00842 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>); +00843 <font class="keywordtype">float</font> intensity = (<a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a> ? <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a>->get(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>, k) : <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a>); +00844 +00845 <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) +00846 { +00847 <font class="comment">// express the vortex position and plane normal in the located basis</font> +00848 <font class="keyword">const</font> CMatrix &m = CPSLocated::getConversionMatrix(*it, this->_Owner); +00849 <font class="keyword">const</font> CVector center = m * (<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[k]); +00850 <font class="keyword">const</font> CVector n = m.mulVector(<a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n0">_Normal</a>[k]); +00851 +00852 TPSAttribVector::iterator speedIt = (*it)->getSpeed().begin(), speedItEnd = (*it)->getSpeed().end(); +00853 TPSAttribFloat::const_iterator invMassIt = (*it)->getInvMass().begin(); +00854 TPSAttribVector::const_iterator posIt = (*it)->getPos().begin(); +00855 +00856 +00857 <font class="comment">// projection of the current located pos on the vortex axis</font> +00858 CVector p; +00859 <font class="comment">// a vector that go from the vortex center to the point we're dealing with</font> +00860 CVector v2p; +00861 +00862 <font class="comment">// the square of the dist of the projected pos</font> +00863 <font class="keywordtype">float</font> d2 , d; +00864 +00865 CVector realTangentialSpeed; +00866 CVector tangentialSpeed; +00867 +00868 +00869 CVector radialSpeed; +00870 +00871 +00872 <font class="keywordflow">for</font> (; speedIt != speedItEnd; ++speedIt, ++invMassIt, ++posIt) +00873 { +00874 v2p = *posIt - center; +00875 p = v2p - (v2p * n) * n; +00876 +00877 d2 = p * p; +00878 +00879 +00880 +00881 <font class="keywordflow">if</font> (d2 < radius2) <font class="comment">// not out of range ?</font> +00882 { +00883 <font class="keywordflow">if</font> (d2 > 10E-6) +00884 { +00885 d = sqrtf(d2); +00886 +00887 p *= 1.f / d; +00888 <font class="comment">// compute the speed vect that we should have (normalized) </font> +00889 realTangentialSpeed = n ^ p; +00890 +00891 tangentialSpeed = (*speedIt * realTangentialSpeed) * realTangentialSpeed; +00892 radialSpeed = (p * *speedIt) * p; +00893 +00894 <font class="comment">// update radial speed;</font> +00895 *speedIt -= <a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n2">_RadialViscosity</a> * ellapsedTime * radialSpeed; +00896 +00897 <font class="comment">// update tangential speed </font> +00898 *speedIt -= <a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n3">_TangentialViscosity</a> * intensity * ellapsedTime * (tangentialSpeed - (1.f - d * invR) * realTangentialSpeed); +00899 } +00900 } +00901 } +00902 } +00903 } +00904 } +00905 +00906 +<a name="l00907"></a><a class="code" href="classNL3D_1_1CPSCylindricVortex.html#a1">00907</a> <font class="keywordtype">void</font> CPSCylindricVortex::show(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00908 { +00909 +00910 <a class="code" href="classNL3D_1_1CPSForce.html#l0">CPSLocated</a> *loc; +00911 uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>; +00912 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#z720_0">CPSLocatedBindable</a> *lb; +00913 <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); +00914 +00915 +00916 <font class="comment">// must have set this</font> +00917 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a11">getFontGenerator</a>() && <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a11">getFontGenerator</a>()); +00918 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a21">setupDriverModelMatrix</a>(); +00919 +00920 <font class="keywordflow">for</font> (uint k = 0; k < <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getSize(); ++k) +00921 { +00922 <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)); +00923 CMatrix m; +00924 CPSUtil::buildSchmidtBasis(<a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n0">_Normal</a>[k], m); +00925 CPSUtil::displayDisc(*<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a10">getDriver</a>(), <a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n1">_Radius</a>[k], <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[k], m, 32, col); +00926 CPSUtil::displayArrow(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a10">getDriver</a>(), <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[k], <a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n0">_Normal</a>[k], 1.f, col, CRGBA(200, 0, 200)); +00927 <font class="comment">// display a V letter at the center</font> +00928 CPSUtil::print(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a10">getDriver</a>(), std::string(<font class="stringliteral">"v"</font>), *<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a11">getFontGenerator</a>(), *<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#a13">getFontManager</a>(), <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getPos()[k], 80.f); +00929 } +00930 +00931 } +00932 +<a name="l00933"></a><a class="code" href="classNL3D_1_1CPSCylindricVortex.html#a10">00933</a> <font class="keywordtype">void</font> CPSCylindricVortex::setMatrix(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <font class="keyword">const</font> CMatrix &m) +00934 { +00935 <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_1CPSCylindricVortex.html#n0">_Normal</a>.getSize()); +00936 <a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n0">_Normal</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>] = m.getK(); +00937 <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(); +00938 } +00939 +<a name="l00940"></a><a class="code" href="classNL3D_1_1CPSCylindricVortex.html#a11">00940</a> CMatrix CPSCylindricVortex::getMatrix(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>)<font class="keyword"> const</font> +00941 <font class="keyword"></font>{ +00942 CMatrix m; +00943 CPSUtil::buildSchmidtBasis(<a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n0">_Normal</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>], m); +00944 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>] ); +00945 <font class="keywordflow">return</font> m; +00946 } +00947 +00948 +<a name="l00949"></a><a class="code" href="classNL3D_1_1CPSCylindricVortex.html#a17">00949</a> <font class="keywordtype">void</font> CPSCylindricVortex::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +00950 { +00951 f.serialVersion(1); +00952 CPSForceIntensityHelper::serial(f); +00953 f.serial(_Normal); +00954 f.serial(_Radius); +00955 f.serial(_RadialViscosity); +00956 f.serial(_TangentialViscosity); +00957 } +00958 +<a name="l00959"></a><a class="code" href="classNL3D_1_1CPSCylindricVortex.html#b1">00959</a> <font class="keywordtype">void</font> CPSCylindricVortex::newElement(CPSLocated *emitterLocated, uint32 emitterIndex) +00960 { +00961 CPSForceIntensityHelper::newElement(emitterLocated, emitterIndex); +00962 <a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n0">_Normal</a>.insert(CVector::K); +00963 <a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n1">_Radius</a>.insert(1.f); +00964 } +<a name="l00965"></a><a class="code" href="classNL3D_1_1CPSCylindricVortex.html#b2">00965</a> <font class="keywordtype">void</font> CPSCylindricVortex::deleteElement(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>) +00966 { +00967 CPSForceIntensityHelper::deleteElement(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +00968 <a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n0">_Normal</a>.remove(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +00969 <a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n1">_Radius</a>.remove(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +00970 } +<a name="l00971"></a><a class="code" href="classNL3D_1_1CPSCylindricVortex.html#b3">00971</a> <font class="keywordtype">void</font> CPSCylindricVortex::resize(uint32 size) +00972 { +00973 <a class="code" href="debug_8h.html#a6">nlassert</a>(size < (1 << 16)); +00974 CPSForceIntensityHelper::resize(size); +00975 <a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n0">_Normal</a>.resize(size); +00976 <a class="code" href="classNL3D_1_1CPSCylindricVortex.html#n1">_Radius</a>.resize(size); +00977 } +00978 +00979 +<a name="l00984"></a><a class="code" href="classNL3D_1_1CPSMagneticForce.html#a2">00984</a> <font class="keywordtype">void</font> CPSMagneticForce::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +00985 { +00986 f.serialVersion(1); +00987 CPSDirectionnalForce::serial(f); +00988 } +00989 +<a name="l00990"></a><a class="code" href="classNL3D_1_1CPSMagneticForce.html#a1">00990</a> <font class="keywordtype">void</font> CPSMagneticForce::performDynamic(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +00991 { +00992 <font class="comment">// perform the operation on each target</font> +00993 <font class="keywordflow">for</font> (uint32 k = 0; k < <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getSize(); ++k) +00994 { +00995 <font class="keywordtype">float</font> intensity = ellapsedTime * (<a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a> ? <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a>->get(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>, k) : <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a>); +00996 <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) +00997 { +00998 +00999 <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> toAdd = CPSLocated::getConversionMatrix(*it, this->_Owner).mulVector(<a class="code" href="classNL3D_1_1CPSDirectionnalForce.html#n0">_Dir</a>); <font class="comment">// express this in the target basis </font> +01000 +01001 TPSAttribVector::iterator it2 = (*it)->getSpeed().begin(), it2end = (*it)->getSpeed().end(); +01002 +01003 <font class="comment">// 1st case : non-constant mass</font> +01004 <font class="keywordflow">if</font> ((*it)->getMassScheme()) +01005 { +01006 TPSAttribFloat::const_iterator invMassIt = (*it)->getInvMass().begin(); +01007 <font class="keywordflow">for</font> (; it2 != it2end; ++it2, ++invMassIt) +01008 { +01009 (*it2) += intensity * *invMassIt * (*it2 ^ toAdd); +01010 +01011 } +01012 } +01013 <font class="keywordflow">else</font> +01014 { +01015 <font class="keywordtype">float</font> i = intensity / (*it)->getInitialMass(); +01016 <font class="keywordflow">for</font> (; it2 != it2end; ++it2) +01017 { +01018 (*it2) += i * (*it2 ^ toAdd); +01019 } +01020 } +01021 } +01022 } +01023 } +01024 +01025 +01030 <font class="keyword">const</font> uint <a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a> = 8192; <font class="comment">// should be a power of 2</font> +01031 <font class="keyword">const</font> uint <a class="code" href="namespaceNL3D.html#a193">BFPredefinedNumInterp</a> = 256; +01035 <font class="keyword">const</font> uint <a class="code" href="namespaceNL3D.html#a194">BFNumPrecomputedImpulsions</a> = 1024; +01036 +<a name="l01037"></a><a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">01037</a> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> CPSBrownianForce::PrecomputedPos[<a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a>]; <font class="comment">// after the sequence we must be back to the start position</font> +<a name="l01038"></a><a class="code" href="classNL3D_1_1CPSBrownianForce.html#q1">01038</a> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> CPSBrownianForce::PrecomputedSpeed[<a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a>]; +<a name="l01039"></a><a class="code" href="classNL3D_1_1CPSBrownianForce.html#q2">01039</a> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> CPSBrownianForce::PrecomputedImpulsions[<a class="code" href="namespaceNL3D.html#a194">BFNumPrecomputedImpulsions</a>]; +01040 +<a name="l01042"></a><a class="code" href="classNL3D_1_1CPSBrownianForce.html#a0">01042</a> CPSBrownianForce::CPSBrownianForce(<font class="keywordtype">float</font> intensity <font class="comment">/* = 1.f*/</font>) : _ParametricFactor(1.f) +01043 { +01044 <a class="code" href="classNL3D_1_1CPSBrownianForce.html#a5">setIntensity</a>(intensity); +01045 <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n3">_Name</a> = std::string(<font class="stringliteral">"BrownianForce"</font>); +01046 +01047 } +01048 +<a name="l01050"></a><a class="code" href="classNL3D_1_1CPSBrownianForce.html#a2">01050</a> <font class="keywordtype">bool</font> CPSBrownianForce::isIntegrable(<font class="keywordtype">void</font>)<font class="keyword"> const</font> +01051 <font class="keyword"></font>{ +01052 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a> == NULL; +01053 } +01054 +01055 +<a name="l01057"></a><a class="code" href="classNL3D_1_1CPSBrownianForce.html#a3">01057</a> <font class="keywordtype">void</font> CPSBrownianForce::integrate(<font class="keywordtype">float</font> date, CPSLocated *<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>, +01058 uint32 startIndex, +01059 uint32 numObjects, +01060 <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *destPos, +01061 <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *destSpeed, +01062 <font class="keywordtype">bool</font> accumulate, +01063 uint posStride, uint speedStride +01064 ) +01065 { +01067 <font class="keywordtype">float</font> deltaT; +01068 <font class="keywordflow">if</font> (!destPos && !destSpeed) <font class="keywordflow">return</font>; +01069 CPSLocated::TPSAttribParametricInfo::const_iterator it = <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>->_PInfo.begin() + startIndex, +01070 endIt = <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>->_PInfo.begin() + startIndex + numObjects; +01071 <font class="keywordtype">float</font> lookUpFactor = <a class="code" href="classNL3D_1_1CPSBrownianForce.html#n0">_ParametricFactor</a> * <a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a>; +01072 <font class="keywordtype">float</font> speedFactor = <a class="code" href="classNL3D_1_1CPSBrownianForce.html#n0">_ParametricFactor</a> * <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a>; +01073 <font class="keywordflow">if</font> (!accumulate) <font class="comment">// compute coords from initial condition, and applying this force</font> +01074 { +01075 <font class="keywordflow">if</font> (destPos && !destSpeed) <font class="comment">// fills dest pos only</font> +01076 { +01077 <font class="keywordflow">while</font> (it != endIt) +01078 { +01079 <font class="keywordtype">float</font> deltaT = date - it->Date; +01080 uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> = (uint) (lookUpFactor * deltaT) & (<a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a> - 1); +01081 destPos-><a class="code" href="classNLMISC_1_1CVector.html#z332_0">set</a>(it->Pos.x + deltaT * it->Speed.x + <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].x, +01082 it->Pos.y + deltaT * it->Speed.y + <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].y, +01083 it->Pos.z + deltaT * it->Speed.z + <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].z ); +01084 ++it; +01085 NEXT_POS; +01086 } +01087 } +01088 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (!destPos && destSpeed) <font class="comment">// fills dest speed only</font> +01089 { +01090 <font class="keywordflow">while</font> (it != endIt) +01091 { +01092 deltaT = date - it->Date; +01093 uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> = (uint) (lookUpFactor * deltaT) & (<a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a> - 1); +01094 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> = it->Speed.x + speedFactor * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q1">PrecomputedSpeed</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].x; +01095 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> = it->Speed.y + speedFactor * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q1">PrecomputedSpeed</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].y; +01096 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> = it->Speed.z + speedFactor * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q1">PrecomputedSpeed</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].z; +01097 ++it; +01098 NEXT_SPEED; +01099 } +01100 } +01101 <font class="keywordflow">else</font> <font class="comment">// fills both speed and pos</font> +01102 { +01103 <font class="keywordflow">while</font> (it != endIt) +01104 { +01105 deltaT = date - it->Date; +01106 uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> = (uint) (lookUpFactor * deltaT) & (<a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a> - 1); +01107 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> = it->Pos.x + deltaT * it->Speed.x + <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].x; +01108 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> = it->Pos.y + deltaT * it->Speed.y + <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].y; +01109 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> = it->Pos.z + deltaT * it->Speed.z + <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].z; +01110 +01111 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> = it->Speed.x + speedFactor * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q1">PrecomputedSpeed</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].x; +01112 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> = it->Speed.y + speedFactor * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q1">PrecomputedSpeed</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].y; +01113 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> = it->Speed.z + speedFactor * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q1">PrecomputedSpeed</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].z; +01114 +01115 ++it; +01116 NEXT_POS; +01117 NEXT_SPEED; +01118 } +01119 } +01120 } +01121 <font class="keywordflow">else</font> <font class="comment">// accumulate datas</font> +01122 { +01123 <font class="keywordflow">if</font> (destPos && !destSpeed) <font class="comment">// fills dest pos only</font> +01124 { +01125 <font class="keywordflow">while</font> (it != endIt) +01126 { +01127 deltaT = date - it->Date; +01128 uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> = (uint) (lookUpFactor * deltaT) & (<a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a> - 1); +01129 destPos-><a class="code" href="classNLMISC_1_1CVector.html#z332_0">set</a>(destPos-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> + <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].x, +01130 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> + <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].y, +01131 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> + <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].z); +01132 ++it; +01133 NEXT_POS; +01134 } +01135 } +01136 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (!destPos && destSpeed) <font class="comment">// fills dest speed only</font> +01137 { +01138 <font class="keywordflow">while</font> (it != endIt) +01139 { +01140 deltaT = date - it->Date; +01141 uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> = (uint) (lookUpFactor * deltaT) & (<a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a> - 1); +01142 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#z332_0">set</a>(destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> + speedFactor * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q1">PrecomputedSpeed</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].x, +01143 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> + speedFactor * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q1">PrecomputedSpeed</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].y, +01144 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> + speedFactor * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q1">PrecomputedSpeed</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].z); +01145 ++it; +01146 NEXT_SPEED; +01147 } +01148 } +01149 <font class="keywordflow">else</font> <font class="comment">// fills both speed and pos</font> +01150 { +01151 <font class="keywordflow">while</font> (it != endIt) +01152 { +01153 deltaT = date - it->Date; +01154 uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> = (uint) (lookUpFactor * deltaT) & (<a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a> - 1); +01155 destPos-><a class="code" href="classNLMISC_1_1CVector.html#z332_0">set</a>(destPos-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> + <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].x, +01156 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> + <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].y, +01157 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> + <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].z); +01158 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#z332_0">set</a>(destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> + speedFactor * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q1">PrecomputedSpeed</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].x, +01159 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> + speedFactor * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q1">PrecomputedSpeed</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].y, +01160 destSpeed-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> + speedFactor * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q1">PrecomputedSpeed</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].z); +01161 ++it; +01162 NEXT_POS; +01163 NEXT_SPEED; +01164 } +01165 } +01166 } +01167 } +01168 +01169 +<a name="l01171"></a><a class="code" href="classNL3D_1_1CPSBrownianForce.html#a4">01171</a> <font class="keywordtype">void</font> CPSBrownianForce::integrateSingle(<font class="keywordtype">float</font> startDate, <font class="keywordtype">float</font> deltaT, uint numStep, +01172 CPSLocated *<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>, uint32 indexInLocated, +01173 <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *destPos, +01174 <font class="keywordtype">bool</font> accumulate, +01175 uint <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>) +01176 { +01177 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>->isParametricMotionEnabled()); +01178 <a class="code" href="debug_8h.html#a6">nlassert</a>(deltaT > 0); +01179 <a class="code" href="debug_8h.html#a6">nlassert</a>(numStep > 0); +01180 <font class="preprocessor"> #ifdef NL_DEBUG</font> +01181 <font class="preprocessor"></font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *endPos = (<a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *) ( (uint8 *) destPos + <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a> * numStep); +01182 <font class="preprocessor"> #endif</font> +01183 <font class="preprocessor"></font> <font class="keyword">const</font> CPSLocated::CParametricInfo &pi = <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>->_PInfo[indexInLocated]; +01184 <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &startPos = pi.Pos; +01185 <font class="keywordflow">if</font> (numStep != 0) +01186 { +01187 <font class="keywordtype">float</font> lookUpFactor = <a class="code" href="classNL3D_1_1CPSBrownianForce.html#n0">_ParametricFactor</a> * <a class="code" href="namespaceNL3D.html#a193">BFPredefinedNumInterp</a>; +01188 <font class="keywordflow">if</font> (!accumulate) +01189 { +01191 destPos = <a class="code" href="namespaceNL3D.html#a436">FillBufUsingSubdiv</a>(startPos, pi.Date, startDate, deltaT, numStep, destPos, <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>); +01192 <font class="keywordflow">if</font> (numStep != 0) +01193 { +01194 <font class="keywordtype">float</font> currDate = startDate - pi.Date; +01195 <a class="code" href="debug_8h.html#a6">nlassert</a>(currDate >= 0); +01196 <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &startSpeed = pi.Speed; +01197 <font class="keywordflow">do</font> +01198 { +01199 <font class="preprocessor"> #ifdef NL_DEBUG</font> +01200 <font class="preprocessor"></font> <a class="code" href="debug_8h.html#a6">nlassert</a>(destPos < endPos); +01201 <font class="preprocessor"> #endif</font> +01202 <font class="preprocessor"></font> uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> = (uint) (lookUpFactor * currDate) & (<a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a> - 1); +01203 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> = startPos.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> + currDate * startSpeed.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> + <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].x; +01204 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> = startPos.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> + currDate * startSpeed.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> + <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].y; +01205 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> = startPos.<a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> + currDate * startSpeed.<a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> + <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].z; +01206 currDate += deltaT; +01207 destPos = (<a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *) ( (uint8 *) destPos + <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>); +01208 } +01209 <font class="keywordflow">while</font> (--numStep); +01210 } +01211 } +01212 <font class="keywordflow">else</font> +01213 { +01214 uint numToSkip = <a class="code" href="namespaceNL3D.html#a435">ScaleFloatGE</a>(startDate, deltaT, pi.Date, numStep); +01215 <font class="keywordflow">if</font> (numToSkip < numStep) +01216 { +01217 numStep -= numToSkip; +01218 <font class="keywordtype">float</font> currDate = startDate + deltaT * numToSkip - pi.Date; +01219 <font class="keywordflow">do</font> +01220 { +01221 <font class="preprocessor"> #ifdef NL_DEBUG</font> +01222 <font class="preprocessor"></font> <a class="code" href="debug_8h.html#a6">nlassert</a>(destPos < endPos); +01223 <font class="preprocessor"> #endif</font> +01224 <font class="preprocessor"></font> uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> = (uint) (lookUpFactor * currDate) & (<a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a> - 1); +01225 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> += <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].x; +01226 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> += <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].y; +01227 destPos-><a class="code" href="classNLMISC_1_1CVector.html#m2">z</a> += <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a> * <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>].z; +01228 currDate += deltaT; +01229 destPos = (<a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *) ( (uint8 *) destPos + <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>); +01230 } +01231 <font class="keywordflow">while</font> (--numStep); +01232 } +01233 } +01234 } +01235 } +01236 +01237 +<a name="l01239"></a><a class="code" href="classNL3D_1_1CPSBrownianForce.html#d0">01239</a> <font class="keywordtype">void</font> CPSBrownianForce::initPrecalc() +01240 { +01242 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a> % <a class="code" href="namespaceNL3D.html#a193">BFPredefinedNumInterp</a> == 0); +01243 +01244 <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> p0(0, 0, 0), p1; +01245 <font class="keyword">const</font> uint numStep = <a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a> / <a class="code" href="namespaceNL3D.html#a193">BFPredefinedNumInterp</a>; +01246 <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *dest = <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q0">PrecomputedPos</a>; +01247 uint k, <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>; +01248 <font class="keywordflow">for</font> (k = 0; k < numStep; ++k) +01249 { +01250 <font class="keywordflow">if</font> (k != numStep - 1) +01251 { +01252 p1.<a class="code" href="classNLMISC_1_1CVector.html#z332_0">set</a>(2.f * (NLMISC::frand(1.f) - 0.5f), +01253 2.f * (NLMISC::frand(1.f) - 0.5f), +01254 2.f * (NLMISC::frand(1.f) - 0.5f)); +01255 } +01256 <font class="keywordflow">else</font> +01257 { +01258 p1.<a class="code" href="classNLMISC_1_1CVector.html#z332_0">set</a>(0, 0, 0); +01259 } +01260 <font class="keywordtype">float</font> lambda = 0.f; +01261 <font class="keywordtype">float</font> lambdaStep = 1.f / <a class="code" href="namespaceNL3D.html#a193">BFPredefinedNumInterp</a>; +01262 <font class="keywordflow">for</font> (<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> = 0; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> < <a class="code" href="namespaceNL3D.html#a193">BFPredefinedNumInterp</a>; ++<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>) +01263 { +01264 *dest++ = lambda * p1 + (1.f - lambda) * p0; +01265 lambda += lambdaStep; +01266 } +01267 p0 = p1; +01268 } +01269 +01270 <font class="comment">// now, filter the table several time to get something more smooth</font> +01271 <font class="keywordflow">for</font> (k = 0; k < (<a class="code" href="namespaceNL3D.html#a193">BFPredefinedNumInterp</a> << 2) ; ++k) +01272 { +01273 <font class="keywordflow">for</font> (<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> = 1; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> < (<a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a> - 1); ++<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>) +01274 { +01275 PrecomputedPos[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] = 0.5f * (PrecomputedPos[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> - 1] + PrecomputedPos[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> + 1]); +01276 } +01277 } +01278 +01279 +01280 <font class="comment">// compute the table of speeds, by using on a step of 1.s</font> +01281 <font class="keywordflow">for</font> (<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> = 1; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> < (<a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a> - 1); ++<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>) +01282 { +01283 <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q1">PrecomputedSpeed</a>[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] = 0.5f * (PrecomputedPos[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> + 1] - PrecomputedPos[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> - 1]); +01284 } +01285 <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q1">PrecomputedSpeed</a>[<a class="code" href="namespaceNL3D.html#a192">BFNumPredefinedPos</a> - 1] = <a class="code" href="classNLMISC_1_1CVector.html#p0">NLMISC::CVector::Null</a>; +01286 +01287 <font class="comment">// compute the table of impulsion</font> +01288 <font class="keywordflow">for</font> (k = 0; k < <a class="code" href="namespaceNL3D.html#a194">BFNumPrecomputedImpulsions</a>; ++k) +01289 { +01290 <font class="keyword">static</font> <font class="keywordtype">double</font> divRand = (2.f / RAND_MAX); +01291 <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q2">PrecomputedImpulsions</a>[k].<a class="code" href="classNLMISC_1_1CVector.html#z332_0">set</a>( (<font class="keywordtype">float</font>) (rand() * divRand - 1), +01292 (<font class="keywordtype">float</font>) (rand() * divRand - 1), +01293 (<font class="keywordtype">float</font>) (rand() * divRand - 1) +01294 ); +01295 } +01296 } +01297 +<a name="l01299"></a><a class="code" href="classNL3D_1_1CPSBrownianForce.html#a5">01299</a> <font class="keywordtype">void</font> CPSBrownianForce::setIntensity(<font class="keywordtype">float</font> <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>) +01300 { +01301 <font class="keywordflow">if</font> (_IntensityScheme) +01302 { +01303 CPSForceIntensity::setIntensity(<a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>); +01304 <a class="code" href="classNL3D_1_1CPSForce.html#b2">renewIntegrable</a>(); <font class="comment">// integrable again</font> +01305 } +01306 <font class="keywordflow">else</font> +01307 { +01308 CPSForceIntensity::setIntensity(<a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>); +01309 } +01310 } +01311 +01312 +<a name="l01314"></a><a class="code" href="classNL3D_1_1CPSBrownianForce.html#a6">01314</a> <font class="keywordtype">void</font> CPSBrownianForce::setIntensityScheme(CPSAttribMaker<float> *scheme) +01315 { +01316 <font class="keywordflow">if</font> (!<a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a>) +01317 { +01318 <a class="code" href="classNL3D_1_1CPSForce.html#b1">cancelIntegrable</a>(); <font class="comment">// not integrable anymore</font> +01319 } +01320 CPSForceIntensity::setIntensityScheme(scheme); +01321 } +01322 +<a name="l01324"></a><a class="code" href="classNL3D_1_1CPSBrownianForce.html#a7">01324</a> <font class="keywordtype">void</font> CPSBrownianForce::performDynamic(<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime) +01325 { +01326 <font class="comment">// perform the operation on each target </font> +01327 <font class="keywordflow">for</font> (uint32 k = 0; k < <a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>->getSize(); ++k) +01328 { +01329 <font class="keywordtype">float</font> intensity = <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a> ? <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n1">_IntensityScheme</a>->get(<a class="code" href="classNL3D_1_1CPSLocatedBindable.html#n0">_Owner</a>, k) : <a class="code" href="classNL3D_1_1CPSForceIntensity.html#n0">_K</a>; +01330 <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) +01331 { +01332 uint32 size = (*it)->getSize(); +01333 +01334 <font class="keywordflow">if</font> (!size) <font class="keywordflow">continue</font>; +01335 +01336 TPSAttribVector::iterator it2 = (*it)->getSpeed().begin(), it2End; +01338 uint startPos = (uint) ::rand() % <a class="code" href="namespaceNL3D.html#a194">BFNumPrecomputedImpulsions</a>; +01339 <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> *imp = <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q2">PrecomputedImpulsions</a> + startPos; +01340 +01341 <font class="keywordflow">if</font> ((*it)->getMassScheme()) +01342 { +01343 <font class="keywordtype">float</font> intensityXtime = intensity * ellapsedTime; +01344 TPSAttribFloat::const_iterator invMassIt = (*it)->getInvMass().begin(); +01345 <font class="keywordflow">do</font> +01346 { +01347 uint toProcess = <a class="code" href="bit__set_8cpp.html#a0">std::min</a>((uint) (<a class="code" href="namespaceNL3D.html#a194">BFNumPrecomputedImpulsions</a> - startPos), (uint) size); +01348 it2End = it2 + toProcess; +01349 <font class="keywordflow">do</font> +01350 { +01351 <font class="keywordtype">float</font> factor = intensityXtime * *invMassIt; +01352 it2->set(it2->x + factor * imp-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>, +01353 it2->y + factor * imp-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>, +01354 it2->z + factor * imp-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>); +01355 ++invMassIt; +01356 ++imp; +01357 ++it2; +01358 } +01359 <font class="keywordflow">while</font> (it2 != it2End); +01360 startPos = 0; +01361 imp = <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q2">PrecomputedImpulsions</a>; +01362 size -= toProcess; +01363 } +01364 <font class="keywordflow">while</font> (size != 0); +01365 } +01366 <font class="keywordflow">else</font> +01367 { +01368 <font class="keywordflow">do</font> +01369 { +01370 uint toProcess = <a class="code" href="bit__set_8cpp.html#a0">std::min</a>((uint) (<a class="code" href="namespaceNL3D.html#a194">BFNumPrecomputedImpulsions</a> - startPos) , (uint) size); +01371 it2End = it2 + toProcess; +01372 <font class="keywordtype">float</font> factor = intensity * ellapsedTime / (*it)->getInitialMass(); +01373 <font class="keywordflow">do</font> +01374 { +01375 it2->set(it2->x + factor * imp-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>, +01376 it2->y + factor * imp-><a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>, +01377 it2->z + factor * imp-><a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>); +01378 ++imp; +01379 ++it2; +01380 } +01381 <font class="keywordflow">while</font> (it2 != it2End); +01382 startPos = 0; +01383 imp = <a class="code" href="classNL3D_1_1CPSBrownianForce.html#q2">PrecomputedImpulsions</a>; +01384 size -= toProcess; +01385 } +01386 <font class="keywordflow">while</font> (size != 0); +01387 } +01388 } +01389 } +01390 } +01391 +<a name="l01393"></a><a class="code" href="classNL3D_1_1CPSBrownianForce.html#a1">01393</a> <font class="keywordtype">void</font> CPSBrownianForce::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &f) <font class="keywordflow">throw</font>(NLMISC::EStream) +01394 { +01395 sint ver = f.serialVersion(3); +01396 <font class="keywordflow">if</font> (ver <= 2) +01397 { +01398 uint8 dummy; +01399 f.serial(dummy); <font class="comment">// old data in version 2 not used anymore </font> +01400 CPSForce::serial(f); +01401 f.serial(dummy); <font class="comment">// old data in version 2 not used anymore </font> +01402 serialForceIntensity(f); +01403 <font class="keywordflow">if</font> (f.isReading()) +01404 { +01405 registerToTargets(); +01406 } +01407 } +01408 +01409 <font class="keywordflow">if</font> (ver >= 2) +01410 { +01411 CPSForceIntensityHelper::serial(f); +01412 f.serial(_ParametricFactor); +01413 } +01414 } +01415 +01416 +01417 } <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> |