aboutsummaryrefslogtreecommitdiff
path: root/docs/doxygen/nel/particle__system_8cpp-source.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/doxygen/nel/particle__system_8cpp-source.html')
-rw-r--r--docs/doxygen/nel/particle__system_8cpp-source.html1046
1 files changed, 1046 insertions, 0 deletions
diff --git a/docs/doxygen/nel/particle__system_8cpp-source.html b/docs/doxygen/nel/particle__system_8cpp-source.html
new file mode 100644
index 00000000..e0b36fe4
--- /dev/null
+++ b/docs/doxygen/nel/particle__system_8cpp-source.html
@@ -0,0 +1,1046 @@
+<!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>&nbsp;<A CLASS=uplinks HREF=http://www.nevrax.org><b>Home</B></FONT></A>&nbsp;&nbsp;&nbsp;</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>&nbsp;<A CLASS=uplinks HREF=http://www.nevrax.com><b>nevrax.com</B></FONT></A>&nbsp;&nbsp;&nbsp;</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>
+&nbsp;
+
+<!-- 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>&nbsp;</td>
+</tr></table>
+<!-- Generated by Doxygen 1.2.14 -->
+<center>
+<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="namespaces.html">Namespace List</a> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="classes.html">Alphabetical List</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="namespacemembers.html">Namespace Members</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; <a class="qindex" href="globals.html">File Members</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; <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> &nbsp; </center>
+<hr><h1>particle_system.cpp</h1><a href="particle__system_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="particle__system_8h.html">3d/particle_system.h</a>"</font>
+00029 <font class="preprocessor">#include "<a class="code" href="ps__located_8h.html">3d/ps_located.h</a>"</font>
+00030 <font class="preprocessor">#include "<a class="code" href="driver_8h.html">3d/driver.h</a>"</font>
+00031 <font class="preprocessor">#include "<a class="code" href="vertex__buffer_8h.html">3d/vertex_buffer.h</a>"</font>
+00032 <font class="preprocessor">#include "<a class="code" href="material_8h.html">3d/material.h</a>"</font>
+00033 <font class="preprocessor">#include "<a class="code" href="3d_2primitive__block_8h.html">3d/primitive_block.h</a>"</font>
+00034 <font class="preprocessor">#include "<a class="code" href="nelu_8h.html">3d/nelu.h</a>"</font>
+00035 <font class="preprocessor">#include "<a class="code" href="ps__util_8h.html">3d/ps_util.h</a>"</font>
+00036 <font class="preprocessor">#include "<a class="code" href="ps__particle_8h.html">3d/ps_particle.h</a>"</font>
+00037 <font class="preprocessor">#include "<a class="code" href="ps__sound_8h.html">3d/ps_sound.h</a>"</font>
+00038 <font class="preprocessor">#include "<a class="code" href="particle__system__shape_8h.html">3d/particle_system_shape.h</a>"</font>
+00039 <font class="preprocessor">#include "<a class="code" href="aabbox_8h.html">nel/misc/aabbox.h</a>"</font>
+00040 <font class="preprocessor">#include "<a class="code" href="file_8h.html">nel/misc/file.h</a>"</font>
+00041 <font class="preprocessor">#include "<a class="code" href="stream_8h.html">nel/misc/stream.h</a>"</font>
+00042
+00043
+00044
+00045
+00046 <font class="keyword">namespace </font>NL3D
+00047 {
+00048
+<a name="l00049"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#p0">00049</a> uint32 CParticleSystem::NbParticlesDrawn = 0;
+<a name="l00050"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#r2">00050</a> UPSSoundServer * CParticleSystem::_SoundServer = NULL;
+<a name="l00051"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#r0">00051</a> CParticleSystem::TGlobalValuesMap CParticleSystem::_GlobalValuesMap;
+<a name="l00052"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#r1">00052</a> CParticleSystem::TGlobalVectorValuesMap CParticleSystem::_GlobalVectorValuesMap;
+00053
+00054
+00056 <font class="comment">// CPaticleSystem implementation //</font>
+00058 <font class="comment"></font>
+00059
+00061 <font class="keyword">const</font> <font class="keywordtype">float</font> <a class="code" href="namespaceNL3D.html#a164">PSDefaultMaxViewDist</a> = 300.f;
+00062
+00063 <font class="comment">/*</font>
+00064 <font class="comment"> * Constructor</font>
+00065 <font class="comment"> */</font>
+<a name="l00066"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z633_0">00066</a> CParticleSystem::CParticleSystem() : _Driver(NULL),
+00067 _FontGenerator(NULL),
+00068 _FontManager(NULL),
+00069 _Date(0),
+00070 _LastUpdateDate(-1),
+00071 _CurrEditedElementLocated(NULL),
+00072 _CurrEditedElementIndex(0),
+00073 _Scene(NULL),
+00074 _TimeThreshold(0.15f),
+00075 _SystemDate(0.f),
+00076 _MaxNbIntegrations(2),
+00077 _LODRatio(0.5f),
+00078 _OneMinusCurrentLODRatio(0),
+00079 _MaxViewDist(<a class="code" href="namespaceNL3D.html#a164">PSDefaultMaxViewDist</a>),
+00080 _InvMaxViewDist(1.f / <a class="code" href="namespaceNL3D.html#a164">PSDefaultMaxViewDist</a>),
+00081 _InvCurrentViewDist(1.f / <a class="code" href="namespaceNL3D.html#a164">PSDefaultMaxViewDist</a>),
+00082 _DieCondition(none),
+00083 _DelayBeforeDieTest(0.2f),
+00084 _MaxNumFacesWanted(0),
+00085 _AnimType(AnimInCluster),
+00086 _UserParamGlobalValue(NULL),
+00087 _BypassGlobalUserParam(0),
+00088 _PresetBehaviour(UserBehaviour),
+00089 _AutoLODStartDistPercent(0.3f),
+00090 _AutoLODDegradationExponent(1),
+00091 _ColorAttenuationScheme(NULL),
+00092 _GlobalColor(NLMISC::CRGBA::White),
+00093 _ComputeBBox(true),
+00094 _BBoxTouched(true),
+00095 _AccurateIntegration(true),
+00096 _CanSlowDown(true),
+00097 _DestroyModelWhenOutOfRange(false),
+00098 _DestroyWhenOutOfFrustum(false),
+00099 _Sharing(false),
+00100 _AutoLOD(false),
+00101 _KeepEllapsedTimeForLifeUpdate(false),
+00102 _AutoLODSkipParticles(false),
+00103 _EnableLoadBalancing(true),
+00104 _InverseEllapsedTime(0.f),
+00105 _CurrentDeltaPos(NLMISC::CVector::Null),
+00106 _DeltaPos(NLMISC::CVector::Null)
+00107
+00108 {
+00109 std::fill(<a class="code" href="classNL3D_1_1CParticleSystem.html#o31">_UserParam</a>, <a class="code" href="classNL3D_1_1CParticleSystem.html#o31">_UserParam</a> + <a class="code" href="namespaceNL3D.html#a165">MaxPSUserParam</a>, 0);
+00110 }
+00111
+00112
+<a name="l00115"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z649_0">00115</a> <font class="keywordtype">void</font> CParticleSystem::stopSound()
+00116 {
+00117 <font class="keywordflow">for</font> (uint k = 0; k &lt; this-&gt;<a class="code" href="classNL3D_1_1CParticleSystem.html#z639_5">getNbProcess</a>(); ++k)
+00118 {
+00119 CPSLocated *psl = dynamic_cast&lt;NL3D::CPSLocated *&gt;(this-&gt;<a class="code" href="classNL3D_1_1CParticleSystem.html#z639_6">getProcess</a>(k));
+00120 <font class="keywordflow">if</font> (psl)
+00121 {
+00122 <font class="keywordflow">for</font> (uint <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> = 0; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> &lt; psl-&gt;getNbBoundObjects(); ++<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>)
+00123 {
+00124 <font class="keywordflow">if</font> (psl-&gt;getBoundObject(l)-&gt;getType() == <a class="code" href="namespaceNL3D.html#a207">PSSound</a>)
+00125 {
+00126 static_cast&lt;CPSSound *&gt;(psl-&gt;getBoundObject(<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>))-&gt;stopSound();
+00127
+00128 }
+00129 }
+00130 }
+00131 }
+00132 }
+00133
+<a name="l00135"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z649_1">00135</a> <font class="keywordtype">void</font> CParticleSystem::reactivateSound()
+00136 {
+00137 <font class="keywordflow">for</font> (uint k = 0; k &lt; this-&gt;<a class="code" href="classNL3D_1_1CParticleSystem.html#z639_5">getNbProcess</a>(); ++k)
+00138 {
+00139 CPSLocated *psl = dynamic_cast&lt;NL3D::CPSLocated *&gt;(this-&gt;<a class="code" href="classNL3D_1_1CParticleSystem.html#z639_6">getProcess</a>(k));
+00140 <font class="keywordflow">if</font> (psl)
+00141 {
+00142 <font class="keywordflow">for</font> (uint <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> = 0; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> &lt; psl-&gt;getNbBoundObjects(); ++<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>)
+00143 {
+00144 <font class="keywordflow">if</font> (psl-&gt;getBoundObject(l)-&gt;getType() == NL3D::PSSound)
+00145 {
+00146 static_cast&lt;CPSSound *&gt;(psl-&gt;getBoundObject(<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>))-&gt;reactivateSound();
+00147 }
+00148 }
+00149 }
+00150 }
+00151 }
+00152
+00153
+<a name="l00155"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z646_4">00155</a> <font class="keywordtype">void</font> CParticleSystem::enableLoadBalancing(<font class="keywordtype">bool</font> enabled <font class="comment">/*=true*/</font>)
+00156 {
+00157 <font class="keywordflow">if</font> (enabled)
+00158 {
+00159 <a class="code" href="classNL3D_1_1CParticleSystem.html#z646_2">notifyMaxNumFacesChanged</a>();
+00160 }
+00161 <a class="code" href="classNL3D_1_1CParticleSystem.html#o50">_EnableLoadBalancing</a> = enabled;
+00162 }
+00163
+<a name="l00165"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z646_2">00165</a> <font class="keywordtype">void</font> CParticleSystem::notifyMaxNumFacesChanged(<font class="keywordtype">void</font>)
+00166 {
+00167 <font class="keywordflow">if</font> (!<a class="code" href="classNL3D_1_1CParticleSystem.html#o50">_EnableLoadBalancing</a>) <font class="keywordflow">return</font>;
+00168 <a class="code" href="classNL3D_1_1CParticleSystem.html#o29">_MaxNumFacesWanted</a> = 0;
+00169 <font class="keywordflow">for</font> (TProcessVect::iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.begin(); it != <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end(); ++it)
+00170 {
+00171 <a class="code" href="classNL3D_1_1CParticleSystem.html#o29">_MaxNumFacesWanted</a> += (*it)-&gt;querryMaxWantedNumFaces();
+00172 }
+00173 }
+00174
+00175
+<a name="l00177"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z646_0">00177</a> <font class="keywordtype">float</font> CParticleSystem::getWantedNumTris(<font class="keywordtype">float</font> dist)
+00178 {
+00179 <font class="keywordflow">if</font> (!<a class="code" href="classNL3D_1_1CParticleSystem.html#o50">_EnableLoadBalancing</a>) <font class="keywordflow">return</font> 0; <font class="comment">// no contribution to the load balancing</font>
+00180 <font class="keywordflow">if</font> (dist &gt; <a class="code" href="classNL3D_1_1CParticleSystem.html#o24">_MaxViewDist</a>) <font class="keywordflow">return</font> 0;
+00181 <font class="keywordtype">float</font> retValue = ((1.f - dist * <a class="code" href="classNL3D_1_1CParticleSystem.html#o25">_InvMaxViewDist</a>) * <a class="code" href="classNL3D_1_1CParticleSystem.html#o29">_MaxNumFacesWanted</a>);
+00183 <font class="keywordflow">return</font> retValue;
+00184 }
+00185
+00186
+<a name="l00188"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z646_1">00188</a> <font class="keywordtype">void</font> CParticleSystem::setNumTris(uint numFaces)
+00189 {
+00190 <font class="keywordflow">if</font> (_EnableLoadBalancing)
+00191 {
+00192 <font class="keywordtype">float</font> modelDist = (<a class="code" href="classNL3D_1_1CParticleSystem.html#o7">_SysMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z291_4">getPos</a>() - <a class="code" href="classNL3D_1_1CParticleSystem.html#o6">_InvertedViewMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z291_4">getPos</a>()).norm();
+00193 <font class="comment">/*uint numFaceWanted = (uint) getWantedNumTris(modelDist);*/</font>
+00194
+00195 <font class="keyword">const</font> <font class="keywordtype">float</font> epsilon = 10E-5f;
+00196
+00197
+00198 uint wantedNumTri = (uint) <a class="code" href="classNL3D_1_1CParticleSystem.html#z646_0">getWantedNumTris</a>(modelDist);
+00199 <font class="keywordflow">if</font> (numFaces &gt;= wantedNumTri || wantedNumTri == 0 || <a class="code" href="classNL3D_1_1CParticleSystem.html#o29">_MaxNumFacesWanted</a> == 0 || modelDist &lt; epsilon)
+00200 {
+00201 <a class="code" href="classNL3D_1_1CParticleSystem.html#o26">_InvCurrentViewDist</a> = <a class="code" href="classNL3D_1_1CParticleSystem.html#o25">_InvMaxViewDist</a>;
+00202 }
+00203 <font class="keywordflow">else</font>
+00204 {
+00205
+00206 <a class="code" href="classNL3D_1_1CParticleSystem.html#o26">_InvCurrentViewDist</a> = (<a class="code" href="classNL3D_1_1CParticleSystem.html#o29">_MaxNumFacesWanted</a> - numFaces) / ( <a class="code" href="classNL3D_1_1CParticleSystem.html#o29">_MaxNumFacesWanted</a> * modelDist);
+00207 }
+00208 }
+00209 <font class="keywordflow">else</font>
+00210 {
+00211 <font class="comment">// always take full detail when there's no load balancing</font>
+00212 <a class="code" href="classNL3D_1_1CParticleSystem.html#o26">_InvCurrentViewDist</a> = <a class="code" href="classNL3D_1_1CParticleSystem.html#o25">_InvMaxViewDist</a>;
+00213 }
+00214 }
+00215
+00216
+<a name="l00219"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z633_1">00219</a> CParticleSystem::~CParticleSystem()
+00220 {
+00221 <font class="keywordflow">for</font> (TProcessVect::iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.begin(); it != <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end(); ++it)
+00222 {
+00223 <font class="keyword">delete</font> *it;
+00224 }
+00225 <font class="keyword">delete</font> <a class="code" href="classNL3D_1_1CParticleSystem.html#o38">_ColorAttenuationScheme</a>;
+00226 <font class="keyword">delete</font> <a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a>;
+00227 }
+00228
+<a name="l00230"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z637_4">00230</a> <font class="keywordtype">void</font> CParticleSystem::setViewMat(<font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CMatrix.html">NLMISC::CMatrix</a> &amp;m)
+00231 {
+00232 <a class="code" href="classNL3D_1_1CParticleSystem.html#o5">_ViewMat</a> = m;
+00233 <a class="code" href="classNL3D_1_1CParticleSystem.html#o6">_InvertedViewMat</a> = m.<a class="code" href="classNLMISC_1_1CMatrix.html#z293_7">inverted</a>();
+00234 }
+00235
+<a name="l00237"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z648_11">00237</a> <font class="keywordtype">bool</font> CParticleSystem::hasEmitters(<font class="keywordtype">void</font>)<font class="keyword"> const</font>
+00238 <font class="keyword"></font>{
+00239 <font class="keywordflow">for</font> (TProcessVect::const_iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.begin(); it != <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end(); ++it)
+00240 {
+00241 <font class="keywordflow">if</font> ((*it)-&gt;hasEmitters()) <font class="keywordflow">return</font> <font class="keyword">true</font>;
+00242 }
+00243 <font class="keywordflow">return</font> <font class="keyword">false</font>;
+00244 }
+00245
+<a name="l00247"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z648_12">00247</a> <font class="keywordtype">bool</font> CParticleSystem::hasParticles(<font class="keywordtype">void</font>)<font class="keyword"> const</font>
+00248 <font class="keyword"></font>{
+00249 <font class="keywordflow">for</font> (TProcessVect::const_iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.begin(); it != <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end(); ++it)
+00250 {
+00251 <font class="keywordflow">if</font> ((*it)-&gt;hasParticles()) <font class="keywordflow">return</font> <font class="keyword">true</font>;
+00252 }
+00253 <font class="keywordflow">return</font> <font class="keyword">false</font>;
+00254 }
+00255
+<a name="l00257"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#c0">00257</a> <font class="keywordtype">void</font> CParticleSystem::stepLocated(<a class="code" href="namespaceNL3D.html#a484">TPSProcessPass</a> pass, <a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> et, <a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> realEt)
+00258 {
+00259 <font class="keywordflow">for</font> (TProcessVect::iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.begin(); it != <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end(); ++it)
+00260 {
+00261 (*it)-&gt;step(pass, et, realEt);
+00262 }
+00263 }
+00264
+00265
+<a name="l00267"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#c1">00267</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> CParticleSystem::updateLODRatio()
+00268 {
+00269 <font class="comment">// temp</font>
+00270 CVector sysPos = <a class="code" href="classNL3D_1_1CParticleSystem.html#o7">_SysMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z291_4">getPos</a>();
+00271 CVector obsPos = <a class="code" href="classNL3D_1_1CParticleSystem.html#o6">_InvertedViewMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z291_4">getPos</a>();
+00272 <font class="keyword">const</font> CVector d = <a class="code" href="classNL3D_1_1CParticleSystem.html#o7">_SysMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z291_4">getPos</a>() - <a class="code" href="classNL3D_1_1CParticleSystem.html#o6">_InvertedViewMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z291_4">getPos</a>();
+00273 <a class="code" href="classNL3D_1_1CParticleSystem.html#o23">_OneMinusCurrentLODRatio</a> = 1.f - (d.norm() * <a class="code" href="classNL3D_1_1CParticleSystem.html#o26">_InvCurrentViewDist</a>);
+00274 <a class="code" href="namespaceNLMISC.html#a215">NLMISC::clamp</a>(<a class="code" href="classNL3D_1_1CParticleSystem.html#o23">_OneMinusCurrentLODRatio</a>, 0.f, 1.f);
+00275 }
+00276
+<a name="l00278"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#c2">00278</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> CParticleSystem::updateColor()
+00279 {
+00280 <font class="keywordflow">if</font> (_ColorAttenuationScheme)
+00281 {
+00282 <font class="keywordtype">float</font> ratio = 1.00f - <a class="code" href="classNL3D_1_1CParticleSystem.html#o23">_OneMinusCurrentLODRatio</a>;
+00283 <a class="code" href="classNL3D_1_1CParticleSystem.html#o39">_GlobalColor</a> = <a class="code" href="classNL3D_1_1CParticleSystem.html#o38">_ColorAttenuationScheme</a>-&gt;get(ratio &gt; 0.f ? ratio : 0.f);
+00284 }
+00285 }
+00286
+00287
+00288 <font class="comment">/*</font>
+00289 <font class="comment">static void displaySysPos(IDriver *drv, const CVector &amp;pos, CRGBA col)</font>
+00290 <font class="comment">{</font>
+00291 <font class="comment"> if (!drv) return; </font>
+00292 <font class="comment"> drv-&gt;setupModelMatrix(CMatrix::Identity);</font>
+00293 <font class="comment"> CPSUtil::displayArrow(drv, pos, CVector::K, 1.f, CRGBA::White, col);</font>
+00294 <font class="comment">}</font>
+00295 <font class="comment">*/</font>
+00296
+<a name="l00298"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z638_0">00298</a> <font class="keywordtype">void</font> CParticleSystem::step(TPass pass, <a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> ellapsedTime)
+00299 {
+00300 <font class="keywordflow">switch</font> (pass)
+00301 {
+00302 <font class="keywordflow">case</font> <a class="code" href="classNL3D_1_1CParticleSystem.html#s18s1">SolidRender</a>:
+00304 <font class="keywordflow">if</font> (_Sharing)
+00305 {
+00306 <a class="code" href="classNL3D_1_1CParticleSystem.html#c1">updateLODRatio</a>();
+00307 }
+00308 <font class="comment">// update time</font>
+00309 ++<a class="code" href="classNL3D_1_1CParticleSystem.html#o12">_Date</a>;
+00310 <font class="comment">// update global color</font>
+00311 <a class="code" href="classNL3D_1_1CParticleSystem.html#c2">updateColor</a>();
+00312 <a class="code" href="classNL3D_1_1CParticleSystem.html#c0">stepLocated</a>(<a class="code" href="namespaceNL3D.html#a484a169">PSSolidRender</a>, ellapsedTime, ellapsedTime);
+00313
+00314 <font class="keywordflow">break</font>;
+00315 <font class="keywordflow">case</font> <a class="code" href="classNL3D_1_1CParticleSystem.html#s18s2">BlendRender</a>:
+00317 <font class="keywordflow">if</font> (_Sharing)
+00318 {
+00319 <a class="code" href="classNL3D_1_1CParticleSystem.html#c1">updateLODRatio</a>();
+00320 }
+00321 <font class="comment">// update time</font>
+00322 ++<a class="code" href="classNL3D_1_1CParticleSystem.html#o12">_Date</a>;
+00323 <font class="comment">// update global color</font>
+00324 <a class="code" href="classNL3D_1_1CParticleSystem.html#c2">updateColor</a>();
+00325 <a class="code" href="classNL3D_1_1CParticleSystem.html#c0">stepLocated</a>(<a class="code" href="namespaceNL3D.html#a484a170">PSBlendRender</a>, ellapsedTime, ellapsedTime);
+00326 <font class="keywordflow">break</font>;
+00327 <font class="keywordflow">case</font> <a class="code" href="classNL3D_1_1CParticleSystem.html#s18s3">ToolRender</a>:
+00328 <a class="code" href="classNL3D_1_1CParticleSystem.html#c0">stepLocated</a>(<a class="code" href="namespaceNL3D.html#a484a171">PSToolRender</a>, ellapsedTime, ellapsedTime);
+00329 <font class="keywordflow">break</font>;
+00330 <font class="keywordflow">case</font> <a class="code" href="classNL3D_1_1CParticleSystem.html#s18s0">Anim</a>:
+00331 {
+00332 <font class="comment">// update user param from global value if needed, unless this behaviour is bypassed has indicated by a flag in _BypassGlobalUserParam</font>
+00333 <font class="keywordflow">if</font> (_UserParamGlobalValue)
+00334 {
+00335 <a class="code" href="debug_8h.html#a16">nlctassert</a>(<a class="code" href="namespaceNL3D.html#a165">MaxPSUserParam</a> &lt; 8); <font class="comment">// there should be less than 8 parameters because of mask stored in a byte </font>
+00336 uint8 bypassMask = 1;
+00337 <font class="keywordflow">for</font>(uint k = 0; k &lt; <a class="code" href="namespaceNL3D.html#a165">MaxPSUserParam</a>; ++k)
+00338 {
+00339 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a>[k] &amp;&amp; !(<a class="code" href="classNL3D_1_1CParticleSystem.html#o33">_BypassGlobalUserParam</a> &amp; bypassMask)) <font class="comment">// if there is a global value for this param and if the update is not bypassed</font>
+00340 {
+00341 <a class="code" href="classNL3D_1_1CParticleSystem.html#o31">_UserParam</a>[k] = <a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a>[k]-&gt;second;
+00342 }
+00343 bypassMask &lt;&lt;= 1;
+00344 }
+00345 }
+00346 <font class="comment">//</font>
+00347 <a class="code" href="classNL3D_1_1CParticleSystem.html#o41">_BBoxTouched</a> = <font class="keyword">true</font>;
+00348 <a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> et = ellapsedTime;
+00349 uint nbPass = 1;
+00350 <font class="keywordflow">if</font> (_AccurateIntegration)
+00351 {
+00352 <font class="keywordflow">if</font> (et &gt; <a class="code" href="classNL3D_1_1CParticleSystem.html#o19">_TimeThreshold</a>)
+00353 {
+00354 nbPass = (uint32) ceilf(et / <a class="code" href="classNL3D_1_1CParticleSystem.html#o19">_TimeThreshold</a>);
+00355 <font class="keywordflow">if</font> (nbPass &gt; <a class="code" href="classNL3D_1_1CParticleSystem.html#o21">_MaxNbIntegrations</a>)
+00356 {
+00357 nbPass = <a class="code" href="classNL3D_1_1CParticleSystem.html#o21">_MaxNbIntegrations</a>;
+00358 <font class="keywordflow">if</font> (_CanSlowDown)
+00359 {
+00360 et = <a class="code" href="classNL3D_1_1CParticleSystem.html#o19">_TimeThreshold</a>;
+00361 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CParticleSystem.html#o19">_TimeThreshold</a> != 0);
+00362 <a class="code" href="classNL3D_1_1CParticleSystem.html#o51">_InverseEllapsedTime</a> = 1.f / (<a class="code" href="classNL3D_1_1CParticleSystem.html#o19">_TimeThreshold</a> * nbPass);
+00363 }
+00364 <font class="keywordflow">else</font>
+00365 {
+00366 et = ellapsedTime / nbPass;
+00367 <a class="code" href="classNL3D_1_1CParticleSystem.html#o51">_InverseEllapsedTime</a> = ellapsedTime != 0 ? 1.f / ellapsedTime : 0.f;
+00368 }
+00369 }
+00370 <font class="keywordflow">else</font>
+00371 {
+00372 et = ellapsedTime / nbPass;
+00373 <a class="code" href="classNL3D_1_1CParticleSystem.html#o51">_InverseEllapsedTime</a> = ellapsedTime != 0 ? 1.f / ellapsedTime : 0.f;
+00374 }
+00375 }
+00376 <font class="keywordflow">else</font>
+00377 {
+00378 <a class="code" href="classNL3D_1_1CParticleSystem.html#o51">_InverseEllapsedTime</a> = ellapsedTime != 0 ? 1.f / ellapsedTime : 0.f;
+00379 }
+00380 }
+00381 <font class="keywordflow">else</font>
+00382 {
+00383 <a class="code" href="classNL3D_1_1CParticleSystem.html#o51">_InverseEllapsedTime</a> = ellapsedTime != 0 ? 1.f / ellapsedTime : 0.f;
+00384 }
+00385 <a class="code" href="classNL3D_1_1CParticleSystem.html#c1">updateLODRatio</a>();
+00386
+00387 <font class="comment">// set start position. Used by emitters that emit from Local basis to world</font>
+00388 <a class="code" href="classNL3D_1_1CParticleSystem.html#o10">_CurrentDeltaPos</a> = -<a class="code" href="classNL3D_1_1CParticleSystem.html#o11">_DeltaPos</a>;
+00389 <font class="comment">//displaySysPos(_Driver, _CurrentDeltaPos + _OldSysMat.getPos(), CRGBA::Red);</font>
+00390 <font class="comment">// process passes</font>
+00391 <font class="keywordtype">float</font> realEt = <a class="code" href="classNL3D_1_1CParticleSystem.html#o48">_KeepEllapsedTimeForLifeUpdate</a> ? (ellapsedTime / nbPass)
+00392 : et;
+00393 <font class="keywordflow">do</font>
+00394 {
+00395 <font class="comment">// position of the system at the end of the integration</font>
+00396 <a class="code" href="classNL3D_1_1CParticleSystem.html#o10">_CurrentDeltaPos</a> += <a class="code" href="classNL3D_1_1CParticleSystem.html#o11">_DeltaPos</a> * (et * <a class="code" href="classNL3D_1_1CParticleSystem.html#o51">_InverseEllapsedTime</a>);
+00397 <font class="comment">//displaySysPos(_Driver, _CurrentDeltaPos + _OldSysMat.getPos(), CRGBA::Blue);</font>
+00398 <font class="comment">// the order of the following is important...</font>
+00399 <a class="code" href="classNL3D_1_1CParticleSystem.html#c0">stepLocated</a>(<a class="code" href="namespaceNL3D.html#a484a167">PSCollision</a>, et, realEt);
+00400 <font class="keywordflow">for</font> (TProcessVect::iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.begin(); it != <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end(); ++it)
+00401 {
+00402 (*it)-&gt;updateLife(realEt);
+00403 (*it)-&gt;step(<a class="code" href="namespaceNL3D.html#a484a168">PSMotion</a>, et, realEt);
+00404 }
+00405 <a class="code" href="classNL3D_1_1CParticleSystem.html#o20">_SystemDate</a> += realEt;
+00406 <a class="code" href="classNL3D_1_1CParticleSystem.html#c0">stepLocated</a>(<a class="code" href="namespaceNL3D.html#a484a166">PSEmit</a>, et, realEt);
+00407 }
+00408 <font class="keywordflow">while</font> (--nbPass);
+00409
+00410 <font class="comment">// perform parametric motion if present</font>
+00411 <font class="keywordflow">for</font> (TProcessVect::iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.begin(); it != <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end(); ++it)
+00412 {
+00413 <font class="keywordflow">if</font> ((*it)-&gt;isParametricMotionEnabled()) (*it)-&gt;performParametricMotion(<a class="code" href="classNL3D_1_1CParticleSystem.html#o20">_SystemDate</a>, ellapsedTime, realEt);
+00414 }
+00415
+00416 }
+00417 }
+00418 }
+00419
+00420
+00421
+<a name="l00423"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z633_2">00423</a> <font class="keywordtype">void</font> CParticleSystem::serial(<a class="code" href="classNLMISC_1_1IStream.html">NLMISC::IStream</a> &amp;f) <font class="keywordflow">throw</font>(NLMISC::EStream)
+00424 {
+00425 sint version = f.serialVersion(12);
+00426 <font class="comment">// version 12: global userParams</font>
+00427 <font class="comment">// version 11: enable load balancing flag </font>
+00428 <font class="comment">// version 9: Sharing flag added</font>
+00429 <font class="comment">// Auto-lod parameters</font>
+00430 <font class="comment">// New integration flag</font>
+00431 <font class="comment">// Global color attenuation</font>
+00432 <font class="comment">// version 8: Replaced the attribute '_PerformMotionWhenOutOfFrustum' by a _AnimType field which allow more precise control</font>
+00433
+00434 <font class="comment">//f.serial(_ViewMat);</font>
+00435 f.serial(_SysMat);
+00436 f.serial(_Date);
+00437 <font class="keywordflow">if</font> (f.isReading())
+00438 {
+00439 <font class="keyword">delete</font> _ColorAttenuationScheme;
+00440 <font class="comment">// delete previous multimap</font>
+00441 _LBMap.clear();
+00442 <font class="comment">// delete previously attached process</font>
+00443 <font class="keywordflow">for</font> (TProcessVect::iterator it = _ProcessVect.begin(); it != _ProcessVect.end(); ++it)
+00444 {
+00445 <font class="keyword">delete</font> (*it);
+00446 }
+00447
+00448 _ProcessVect.clear();
+00449
+00450 f.serialContPolyPtr(_ProcessVect);
+00451
+00452 _InvSysMat = _SysMat.inverted();
+00453 _FontGenerator = NULL;
+00454 _FontManager = NULL;
+00455 <font class="keyword">delete</font> _UserParamGlobalValue;
+00456 _UserParamGlobalValue = NULL;
+00457 _BypassGlobalUserParam = 0;
+00458 }
+00459 <font class="keywordflow">else</font>
+00460 {
+00461 f.serialContPolyPtr(_ProcessVect);
+00462 }
+00463
+00464 <font class="keywordflow">if</font> (version &gt; 1) <font class="comment">// name of the system</font>
+00465 {
+00466 f.serial(_Name);
+00467 }
+00468
+00469 <font class="keywordflow">if</font> (version &gt; 2) <font class="comment">// infos about integration, and LOD</font>
+00470 {
+00471 f.serial(_AccurateIntegration);
+00472 <font class="keywordflow">if</font> (_AccurateIntegration) f.serial(_CanSlowDown, _TimeThreshold, _MaxNbIntegrations);
+00473 f.serial(_InvMaxViewDist, _LODRatio);
+00474 _MaxViewDist = 1.f / _InvMaxViewDist;
+00475 _InvCurrentViewDist = _InvMaxViewDist;
+00476 }
+00477
+00478 <font class="keywordflow">if</font> (version &gt; 3) <font class="comment">// tell wether the system must compute his bbox, hold a precomputed bbox</font>
+00479 {
+00480 f.serial(_ComputeBBox);
+00481 <font class="keywordflow">if</font> (!_ComputeBBox)
+00482 {
+00483 f.serial(_PreComputedBBox);
+00484 }
+00485 }
+00486
+00487 <font class="keywordflow">if</font> (version &gt; 4) <font class="comment">// lifetime informations</font>
+00488 {
+00489 f.serial(_DestroyModelWhenOutOfRange);
+00490 f.serialEnum(_DieCondition);
+00491 <font class="keywordflow">if</font> (_DieCondition != none)
+00492 {
+00493 f.serial(_DelayBeforeDieTest);
+00494 }
+00495 }
+00496
+00497 <font class="keywordflow">if</font> (version &gt; 5)
+00498 {
+00499 f.serial(_DestroyWhenOutOfFrustum);
+00500 }
+00501
+00502 <font class="keywordflow">if</font> (version &gt; 6 &amp;&amp; version &lt; 8)
+00503 {
+00504 <font class="keywordtype">bool</font> performMotionWOOF;
+00505 <font class="keywordflow">if</font> (f.isReading())
+00506 {
+00507 f.serial(performMotionWOOF);
+00508 performMotionWhenOutOfFrustum(performMotionWOOF);
+00509 }
+00510 <font class="keywordflow">else</font>
+00511 {
+00512 performMotionWOOF = doesPerformMotionWhenOutOfFrustum();
+00513 f.serial(performMotionWOOF);
+00514 }
+00515 }
+00516
+00517 <font class="keywordflow">if</font> (version &gt; 7)
+00518 {
+00519 f.serialEnum(_AnimType);
+00520 f.serialEnum(_PresetBehaviour);
+00521 }
+00522
+00523 <font class="keywordflow">if</font> (version &gt; 8)
+00524 {
+00525 f.serial(_Sharing);
+00526 f.serial(_AutoLOD);
+00527 <font class="keywordflow">if</font> (_AutoLOD)
+00528 {
+00529 f.serial(_AutoLODStartDistPercent, _AutoLODDegradationExponent);
+00530 f.serial(_AutoLODSkipParticles);
+00531 }
+00532 f.serial(_KeepEllapsedTimeForLifeUpdate);
+00533 f.serialPolyPtr(_ColorAttenuationScheme);
+00534 }
+00535
+00536 <font class="keywordflow">if</font> (version &gt;= 11)
+00537 {
+00538 f.serial(_EnableLoadBalancing);
+00539 }
+00540
+00541 <font class="keywordflow">if</font> (version &gt;= 12)
+00542 {
+00543 <font class="comment">// serial infos about global user params</font>
+00544 <a class="code" href="debug_8h.html#a16">nlctassert</a>(<a class="code" href="namespaceNL3D.html#a165">MaxPSUserParam</a> &lt; 8); <font class="comment">// In this version mask of used global user params are stored in a byte.. </font>
+00545 <font class="keywordflow">if</font> (f.isReading())
+00546 {
+00547 uint8 mask;
+00548 f.serial(mask);
+00549 <font class="keywordflow">if</font> (mask)
+00550 {
+00551 std::string globalValueName;
+00552 uint8 testMask = 1;
+00553 <font class="keywordflow">for</font>(uint k = 0; k &lt; <a class="code" href="namespaceNL3D.html#a165">MaxPSUserParam</a>; ++k)
+00554 {
+00555 <font class="keywordflow">if</font> (mask &amp; testMask)
+00556 {
+00557 f.serial(globalValueName);
+00558 bindGlobalValueToUserParam(globalValueName.c_str(), k);
+00559 }
+00560 testMask &lt;&lt;= 1;
+00561 }
+00562 }
+00563 }
+00564 <font class="keywordflow">else</font>
+00565 {
+00566 uint8 mask = 0;
+00567 <font class="keywordflow">if</font> (_UserParamGlobalValue)
+00568 {
+00569 <font class="keywordflow">for</font>(uint k = 0; k &lt; <a class="code" href="namespaceNL3D.html#a165">MaxPSUserParam</a>; ++k)
+00570 {
+00571 <font class="keywordflow">if</font> (_UserParamGlobalValue[k]) mask |= (1 &lt;&lt; k);
+00572 }
+00573 }
+00574 f.serial(mask);
+00575 <font class="keywordflow">if</font> (_UserParamGlobalValue)
+00576 {
+00577 <font class="keywordflow">for</font>(uint k = 0; k &lt; <a class="code" href="namespaceNL3D.html#a165">MaxPSUserParam</a>; ++k)
+00578 {
+00579 <font class="keywordflow">if</font> (_UserParamGlobalValue[k])
+00580 {
+00581 std::string valueName = _UserParamGlobalValue[k]-&gt;first;
+00582 f.serial(valueName);
+00583 }
+00584 }
+00585 }
+00586 }
+00587 }
+00588
+00589 <font class="keywordflow">if</font> (f.isReading())
+00590 {
+00591 notifyMaxNumFacesChanged();
+00592 }
+00593 }
+00594
+00595
+<a name="l00597"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z639_0">00597</a> <font class="keywordtype">void</font> CParticleSystem::attach(CParticleSystemProcess *ptr)
+00598 {
+00599 <a class="code" href="debug_8h.html#a6">nlassert</a>(std::find(<a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.begin(), <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end(), ptr) == <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end() );
+00600 <font class="comment">//nlassert(ptr-&gt;getOwner() == NULL); // deja attache a un autre systeme</font>
+00601 <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.push_back(ptr);
+00602 ptr-&gt;setOwner(<font class="keyword">this</font>);
+00603 <a class="code" href="classNL3D_1_1CParticleSystem.html#z646_2">notifyMaxNumFacesChanged</a>();
+00604 }
+00605
+<a name="l00607"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z639_4">00607</a> <font class="keywordtype">void</font> CParticleSystem::remove(CParticleSystemProcess *ptr)
+00608 {
+00609 TProcessVect::iterator it = std::find(<a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.begin(), <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end(), ptr);
+00610 <a class="code" href="debug_8h.html#a6">nlassert</a>(it != <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end() );
+00611 <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.erase(it);
+00612 <font class="keyword">delete</font> ptr;
+00613 }
+00614
+<a name="l00616"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z647_0">00616</a> <font class="keywordtype">void</font> CParticleSystem::computeBBox(<a class="code" href="classNLMISC_1_1CAABBox.html">NLMISC::CAABBox</a> &amp;aabbox)
+00617 {
+00618 <font class="keywordflow">if</font> (!<a class="code" href="classNL3D_1_1CParticleSystem.html#o40">_ComputeBBox</a> || !<a class="code" href="classNL3D_1_1CParticleSystem.html#o41">_BBoxTouched</a>)
+00619 {
+00620 aabbox = <a class="code" href="classNL3D_1_1CParticleSystem.html#o0">_PreComputedBBox</a>;
+00621 <font class="keywordflow">return</font>;
+00622 }
+00623
+00624 <font class="keywordtype">bool</font> foundOne = <font class="keyword">false</font>;
+00625 <a class="code" href="classNLMISC_1_1CAABBox.html">NLMISC::CAABBox</a> tmpBox;
+00626 <font class="keywordflow">for</font> (TProcessVect::const_iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.begin(); it != <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end(); ++it)
+00627 {
+00628 <font class="keywordflow">if</font> ((*it)-&gt;computeBBox(tmpBox))
+00629 {
+00630 <font class="keywordflow">if</font> (!(*it)-&gt;isInSystemBasis())
+00631 {
+00632 <font class="comment">// rotate the aabbox so that it is in the correct basis</font>
+00633 tmpBox = <a class="code" href="classNLMISC_1_1CAABBox.html#z266_3">NLMISC::CAABBox::transformAABBox</a>(<a class="code" href="classNL3D_1_1CParticleSystem.html#o9">_InvSysMat</a>, tmpBox);
+00634 }
+00635 <font class="keywordflow">if</font> (foundOne)
+00636 {
+00637 aabbox = <a class="code" href="classNLMISC_1_1CAABBox.html#z266_2">NLMISC::CAABBox::computeAABBoxUnion</a>(aabbox, tmpBox);
+00638 }
+00639 <font class="keywordflow">else</font>
+00640 {
+00641 aabbox = tmpBox;
+00642 foundOne = <font class="keyword">true</font>;
+00643 }
+00644 }
+00645 }
+00646
+00647 <font class="keywordflow">if</font> (!foundOne)
+00648 {
+00649 aabbox.<a class="code" href="classNLMISC_1_1CAABBox.html#z263_0">setCenter</a>(<a class="code" href="classNLMISC_1_1CVector.html#p0">NLMISC::CVector::Null</a>);
+00650 aabbox.<a class="code" href="classNLMISC_1_1CAABBox.html#z263_1">setHalfSize</a>(<a class="code" href="classNLMISC_1_1CVector.html#p0">NLMISC::CVector::Null</a>);
+00651 }
+00652
+00653 <a class="code" href="classNL3D_1_1CParticleSystem.html#o41">_BBoxTouched</a> = <font class="keyword">false</font>;
+00654 <a class="code" href="classNL3D_1_1CParticleSystem.html#o0">_PreComputedBBox</a> = aabbox;
+00655 }
+00656
+<a name="l00658"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z637_0">00658</a> <font class="keywordtype">void</font> CParticleSystem::setSysMat(<font class="keyword">const</font> CMatrix &amp;m)
+00659 {
+00660 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CParticleSystem.html#o20">_SystemDate</a> != 0.f)
+00661 {
+00662 <a class="code" href="classNL3D_1_1CParticleSystem.html#o8">_OldSysMat</a> = <a class="code" href="classNL3D_1_1CParticleSystem.html#o7">_SysMat</a>; <font class="comment">// _sysMat is relevant if at least one call to setSysMat has been performed before</font>
+00663 <a class="code" href="classNL3D_1_1CParticleSystem.html#o11">_DeltaPos</a> = m.getPos() - <a class="code" href="classNL3D_1_1CParticleSystem.html#o8">_OldSysMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z291_4">getPos</a>();
+00664 }
+00665 <font class="keywordflow">else</font>
+00666 {
+00667 <a class="code" href="classNL3D_1_1CParticleSystem.html#o11">_DeltaPos</a> = <a class="code" href="classNLMISC_1_1CVector.html#p0">NLMISC::CVector::Null</a>;
+00668 <a class="code" href="classNL3D_1_1CParticleSystem.html#o8">_OldSysMat</a> = m;
+00669 }
+00670 <a class="code" href="classNL3D_1_1CParticleSystem.html#o7">_SysMat</a> = m;
+00671 <a class="code" href="classNL3D_1_1CParticleSystem.html#o9">_InvSysMat</a> = <a class="code" href="classNL3D_1_1CParticleSystem.html#o7">_SysMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z293_7">inverted</a>();
+00672 }
+00673
+<a name="l00675"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z643_0">00675</a> <font class="keywordtype">bool</font> CParticleSystem::hasOpaqueObjects(<font class="keywordtype">void</font>)<font class="keyword"> const</font>
+00676 <font class="keyword"></font>{
+00678 <font class="keywordflow">for</font> (TProcessVect::const_iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.begin(); it != <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end(); ++it)
+00679 {
+00680 <font class="keywordflow">if</font> (dynamic_cast&lt;CPSLocated *&gt;(*it))
+00681 {
+00682 <font class="keywordflow">for</font> (uint k = 0; k &lt; ((CPSLocated *) *it)-&gt;getNbBoundObjects(); ++k)
+00683 {
+00684 CPSLocatedBindable *lb = ((CPSLocated *) *it)-&gt;getBoundObject(k);
+00685 <font class="keywordflow">if</font> (lb-&gt;getType() == <a class="code" href="namespaceNL3D.html#a203">PSParticle</a>)
+00686 {
+00687 <font class="keywordflow">if</font> (((CPSParticle *) lb)-&gt;hasOpaqueFaces()) <font class="keywordflow">return</font> <font class="keyword">true</font>;
+00688 }
+00689 }
+00690 }
+00691 }
+00692 <font class="keywordflow">return</font> <font class="keyword">false</font>;
+00693 }
+00694
+<a name="l00696"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z643_1">00696</a> <font class="keywordtype">bool</font> CParticleSystem::hasTransparentObjects(<font class="keywordtype">void</font>)<font class="keyword"> const</font>
+00697 <font class="keyword"></font>{
+00699 <font class="keywordflow">for</font> (TProcessVect::const_iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.begin(); it != <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end(); ++it)
+00700 {
+00701 <font class="keywordflow">if</font> (dynamic_cast&lt;CPSLocated *&gt;(*it))
+00702 {
+00703 <font class="keywordflow">for</font> (uint k = 0; k &lt; ((CPSLocated *) *it)-&gt;getNbBoundObjects(); ++k)
+00704 {
+00705 CPSLocatedBindable *lb = ((CPSLocated *) *it)-&gt;getBoundObject(k);
+00706 <font class="keywordflow">if</font> (lb-&gt;getType() == <a class="code" href="namespaceNL3D.html#a203">PSParticle</a>)
+00707 {
+00708 <font class="keywordflow">if</font> (((CPSParticle *) lb)-&gt;hasTransparentFaces()) <font class="keywordflow">return</font> <font class="keyword">true</font>;
+00709 }
+00710 }
+00711 }
+00712 }
+00713 <font class="keywordflow">return</font> <font class="keyword">false</font>;
+00714 }
+00715
+<a name="l00717"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z645_4">00717</a> <font class="keywordtype">void</font> CParticleSystem::getLODVect(<a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &amp;<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>, <font class="keywordtype">float</font> &amp;<a class="code" href="driver__opengl__extension__def_8h.html#a378">offset</a>, <font class="keywordtype">bool</font> systemBasis)
+00718 {
+00719 <font class="keywordflow">if</font> (!systemBasis)
+00720 {
+00721 v = <a class="code" href="classNL3D_1_1CParticleSystem.html#o26">_InvCurrentViewDist</a> * <a class="code" href="classNL3D_1_1CParticleSystem.html#o6">_InvertedViewMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z291_8">getJ</a>();
+00722 <a class="code" href="driver__opengl__extension__def_8h.html#a378">offset</a> = - <a class="code" href="classNL3D_1_1CParticleSystem.html#o6">_InvertedViewMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z291_4">getPos</a>() * v;
+00723 }
+00724 <font class="keywordflow">else</font>
+00725 {
+00726 <font class="keyword">const</font> CVector tv = <a class="code" href="classNL3D_1_1CParticleSystem.html#o9">_InvSysMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z294_0">mulVector</a>(<a class="code" href="classNL3D_1_1CParticleSystem.html#o6">_InvertedViewMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z291_8">getJ</a>());
+00727 <font class="keyword">const</font> CVector org = <a class="code" href="classNL3D_1_1CParticleSystem.html#o9">_InvSysMat</a> * <a class="code" href="classNL3D_1_1CParticleSystem.html#o6">_InvertedViewMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z291_4">getPos</a>();
+00728 v = <a class="code" href="classNL3D_1_1CParticleSystem.html#o26">_InvCurrentViewDist</a> * tv;
+00729 <a class="code" href="driver__opengl__extension__def_8h.html#a378">offset</a> = - org * v;
+00730 }
+00731 }
+00732
+<a name="l00734"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z645_5">00734</a> <a class="code" href="namespaceNL3D.html#a485">TPSLod</a> CParticleSystem::getLOD(<font class="keywordtype">void</font>)<font class="keyword"> const</font>
+00735 <font class="keyword"></font>{
+00736 <font class="keyword">const</font> <font class="keywordtype">float</font> dist = fabsf(<a class="code" href="classNL3D_1_1CParticleSystem.html#o26">_InvCurrentViewDist</a> * (<a class="code" href="classNL3D_1_1CParticleSystem.html#o7">_SysMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z291_4">getPos</a>() - <a class="code" href="classNL3D_1_1CParticleSystem.html#o6">_InvertedViewMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z291_4">getPos</a>()) * <a class="code" href="classNL3D_1_1CParticleSystem.html#o6">_InvertedViewMat</a>.<a class="code" href="classNLMISC_1_1CMatrix.html#z291_8">getJ</a>());
+00737 <font class="keywordflow">return</font> dist &gt; <a class="code" href="classNL3D_1_1CParticleSystem.html#o22">_LODRatio</a> ? <a class="code" href="namespaceNL3D.html#a485a210">PSLod2</a> : <a class="code" href="namespaceNL3D.html#a485a209">PSLod1</a>;
+00738 }
+00739
+00740
+<a name="l00742"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z650_0">00742</a> <font class="keywordtype">void</font> CParticleSystem::registerLocatedBindableExternID(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>, CPSLocatedBindable *lb)
+00743 {
+00744 <a class="code" href="debug_8h.html#a6">nlassert</a>(lb);
+00745 <a class="code" href="debug_8h.html#a6">nlassert</a>(lb-&gt;getOwner() &amp;&amp; lb-&gt;getOwner()-&gt;getOwner() == <font class="keyword">this</font>); <font class="comment">// the located bindable must belong to that system</font>
+00746 <font class="preprocessor"> #ifdef NL_DEBUG </font>
+00747 <font class="preprocessor"></font> <font class="comment">// check that this lb hasn't been inserted yet</font>
+00748 TLBMap::iterator lbd = <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.lower_bound(<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>), ubd = <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.upper_bound(<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>);
+00749 <a class="code" href="debug_8h.html#a6">nlassert</a>(std::find(lbd, ubd, TLBMap::value_type (<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>, lb)) == ubd);
+00750 <a class="code" href="debug_8h.html#a6">nlassert</a>(std::find(lbd, ubd, TLBMap::value_type (<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>, lb)) == ubd );
+00751
+00752 <font class="preprocessor"> #endif</font>
+00753 <font class="preprocessor"></font> <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.insert(TLBMap::value_type (<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>, lb) );
+00754 }
+00755
+<a name="l00757"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z650_1">00757</a> <font class="keywordtype">void</font> CParticleSystem::unregisterLocatedBindableExternID(CPSLocatedBindable *lb)
+00758 {
+00759 <a class="code" href="debug_8h.html#a6">nlassert</a>(lb);
+00760 <a class="code" href="debug_8h.html#a6">nlassert</a>(lb-&gt;getOwner() &amp;&amp; lb-&gt;getOwner()-&gt;getOwner() == <font class="keyword">this</font>); <font class="comment">// the located bindable must belong to that system</font>
+00761 uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a> = lb-&gt;getExternID();
+00762 <font class="keywordflow">if</font> (!<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>) <font class="keywordflow">return</font>;
+00763 TLBMap::iterator lbd = <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.lower_bound(<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>), ubd = <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.upper_bound(<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>);
+00764 TLBMap::iterator el = std::find(lbd, ubd, TLBMap::value_type (<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>, lb));
+00765 <a class="code" href="debug_8h.html#a6">nlassert</a>(el != ubd);
+00766 <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.erase(el);
+00767 }
+00768
+<a name="l00770"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z651_0">00770</a> uint CParticleSystem::getNumLocatedBindableByExternID(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>)<font class="keyword"> const</font>
+00771 <font class="keyword"></font>{
+00772 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.count(<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>);
+00773 }
+00774
+<a name="l00776"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z651_1">00776</a> CPSLocatedBindable *CParticleSystem::getLocatedBindableByExternID(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>, uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>)
+00777 {
+00778 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> &gt;= <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.count(<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>))
+00779 {
+00780 <font class="keywordflow">return</font> NULL;
+00781 }
+00782 TLBMap::const_iterator el = <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.lower_bound(<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>);
+00783 uint left = <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>;
+00784 <font class="keywordflow">while</font> (left--) ++el;
+00785 <font class="keywordflow">return</font> el-&gt;second;
+00786
+00787 }
+00788
+<a name="l00790"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z651_2">00790</a> <font class="keyword">const</font> CPSLocatedBindable *CParticleSystem::getLocatedBindableByExternID(uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>, uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>)<font class="keyword"> const</font>
+00791 <font class="keyword"></font>{
+00792 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> &gt;= <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.count(<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>))
+00793 {
+00794 <font class="keywordflow">return</font> NULL;
+00795 }
+00796 TLBMap::const_iterator el = <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.lower_bound(<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>);
+00797 uint left = <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>;
+00798 <font class="keywordflow">while</font> (left--) ++el;
+00799 <font class="keywordflow">return</font> el-&gt;second;
+00800 }
+00801
+<a name="l00803"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z633_3">00803</a> <font class="keywordtype">void</font> CParticleSystem::merge(CParticleSystemShape *pss)
+00804 {
+00805 <a class="code" href="debug_8h.html#a6">nlassert</a>(pss);
+00806 <a class="code" href="classNL3D_1_1CParticleSystem.html#z633_0">CParticleSystem</a> *duplicate = pss-&gt;instanciatePS(*this-&gt;_Scene); <font class="comment">// duplicate the p.s. to merge</font>
+00807 <font class="comment">// now we transfer the located of the duplicated ps to this object...</font>
+00808 <font class="keywordflow">for</font> (TProcessVect::iterator it = duplicate-&gt;_ProcessVect.begin(); it != duplicate-&gt;_ProcessVect.end(); ++it)
+00809 {
+00810 <a class="code" href="classNL3D_1_1CParticleSystem.html#z639_0">attach</a>(*it);
+00811 }
+00812 duplicate-&gt;_ProcessVect.clear();
+00813 <font class="keyword">delete</font> duplicate;
+00814 }
+00815
+<a name="l00817"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z648_17">00817</a> <font class="keywordtype">void</font> CParticleSystem::activatePresetBehaviour(TPresetBehaviour behaviour)
+00818 {
+00819
+00820 <font class="keywordflow">switch</font>(behaviour)
+00821 {
+00822 <font class="keywordflow">case</font> <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_2s11">EnvironmentFX</a>:
+00823 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_3">setDestroyModelWhenOutOfRange</a>(<font class="keyword">false</font>);
+00824 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_5">setDestroyCondition</a>(<a class="code" href="classNL3D_1_1CParticleSystem.html#z648_0s4">none</a>);
+00825 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_9">destroyWhenOutOfFrustum</a>(<font class="keyword">false</font>);
+00826 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_15">setAnimType</a>(<a class="code" href="classNL3D_1_1CParticleSystem.html#z648_1s7">AnimVisible</a>);
+00827 <font class="keywordflow">break</font>;
+00828 <font class="keywordflow">case</font> <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_2s12">RunningEnvironmentFX</a>:
+00829 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_3">setDestroyModelWhenOutOfRange</a>(<font class="keyword">false</font>);
+00830 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_5">setDestroyCondition</a>(<a class="code" href="classNL3D_1_1CParticleSystem.html#z648_0s4">none</a>);
+00831 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_9">destroyWhenOutOfFrustum</a>(<font class="keyword">false</font>);
+00832 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_15">setAnimType</a>(<a class="code" href="classNL3D_1_1CParticleSystem.html#z648_1s8">AnimInCluster</a>);
+00833 <font class="keywordflow">break</font>;
+00834 <font class="keywordflow">case</font> <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_2s13">SpellFX</a>:
+00835 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_3">setDestroyModelWhenOutOfRange</a>(<font class="keyword">true</font>);
+00836 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_5">setDestroyCondition</a>(<a class="code" href="classNL3D_1_1CParticleSystem.html#z648_0s5">noMoreParticles</a>);
+00837 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_9">destroyWhenOutOfFrustum</a>(<font class="keyword">false</font>);
+00838 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_15">setAnimType</a>(<a class="code" href="classNL3D_1_1CParticleSystem.html#z648_1s9">AnimAlways</a>);
+00839 <font class="keywordflow">break</font>;
+00840 <font class="keywordflow">case</font> <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_2s14">LoopingSpellFX</a>:
+00841 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_3">setDestroyModelWhenOutOfRange</a>(<font class="keyword">true</font>);
+00842 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_5">setDestroyCondition</a>(<a class="code" href="classNL3D_1_1CParticleSystem.html#z648_0s5">noMoreParticles</a>);
+00843 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_9">destroyWhenOutOfFrustum</a>(<font class="keyword">false</font>);
+00844 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_15">setAnimType</a>(<a class="code" href="classNL3D_1_1CParticleSystem.html#z648_1s8">AnimInCluster</a>);
+00845 <font class="keywordflow">break</font>;
+00846 <font class="keywordflow">case</font> <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_2s15">MinorFX</a>:
+00847 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_3">setDestroyModelWhenOutOfRange</a>(<font class="keyword">true</font>);
+00848 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_5">setDestroyCondition</a>(<a class="code" href="classNL3D_1_1CParticleSystem.html#z648_0s5">noMoreParticles</a>);
+00849 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_9">destroyWhenOutOfFrustum</a>(<font class="keyword">true</font>);
+00850 <a class="code" href="classNL3D_1_1CParticleSystem.html#z648_15">setAnimType</a>(<a class="code" href="classNL3D_1_1CParticleSystem.html#z648_1s7">AnimVisible</a>);
+00851 <font class="keywordflow">break</font>;
+00852 <font class="keywordflow">default</font>: <font class="keywordflow">break</font>;
+00853 }
+00854 <a class="code" href="classNL3D_1_1CParticleSystem.html#o34">_PresetBehaviour</a> = behaviour;
+00855 }
+00856
+00857
+<a name="l00859"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z639_1">00859</a> CParticleSystemProcess *CParticleSystem::detach(uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>)
+00860 {
+00861 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> &lt; <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.size());
+00862 CParticleSystemProcess *proc = <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>];
+00863 <font class="comment">// release references other process may have to this system</font>
+00864 <font class="keywordflow">for</font>(TProcessVect::iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.begin(); it != <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end(); ++it)
+00865 {
+00866 (*it)-&gt;releaseRefTo(proc);
+00867 }
+00868 <font class="comment">// erase from the vector</font>
+00869 <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.erase(<a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.begin() + <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>);
+00870 proc-&gt;setOwner(NULL);
+00871 <font class="comment">// not part of this system any more </font>
+00872 <font class="keywordflow">return</font> proc;
+00873 }
+00874
+<a name="l00876"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z639_2">00876</a> <font class="keywordtype">bool</font> CParticleSystem::isProcess(CParticleSystemProcess *process)<font class="keyword"> const</font>
+00877 <font class="keyword"></font>{
+00878 <font class="keywordflow">for</font>(TProcessVect::const_iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.begin(); it != <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.end(); ++it)
+00879 {
+00880 <font class="keywordflow">if</font> (*it == process) <font class="keywordflow">return</font> <font class="keyword">true</font>;
+00881 }
+00882 <font class="keywordflow">return</font> <font class="keyword">false</font>;
+00883 }
+00884
+<a name="l00886"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z639_3">00886</a> uint CParticleSystem::getIndexOf(<font class="keyword">const</font> CParticleSystemProcess *process)<font class="keyword"> const</font>
+00887 <font class="keyword"></font>{
+00888 <font class="keywordflow">for</font>(uint k = 0; k &lt; <a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>.size(); ++k)
+00889 {
+00890 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CParticleSystem.html#o2">_ProcessVect</a>[k] == process) <font class="keywordflow">return</font> k;
+00891 }
+00892 <a class="code" href="debug_8h.html#a6">nlassert</a>(0); <font class="comment">// not a process of this system</font>
+00893 <font class="keywordflow">return</font> 0; <font class="comment">// for warning</font>
+00894 }
+00895
+<a name="l00897"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z651_3">00897</a> uint CParticleSystem::getNumID()<font class="keyword"> const</font>
+00898 <font class="keyword"></font>{
+00899 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.size();
+00900 }
+00901
+<a name="l00903"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z651_4">00903</a> uint32 CParticleSystem::getID(uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>)<font class="keyword"> const</font>
+00904 <font class="keyword"></font>{
+00905 TLBMap::const_iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.begin();
+00906 <font class="keywordflow">for</font>(uint k = 0; k &lt; <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>; ++k)
+00907 {
+00908 <font class="keywordflow">if</font> (it == <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.end()) <font class="keywordflow">return</font> 0;
+00909 ++it;
+00910 }
+00911 <font class="keywordflow">return</font> it-&gt;first;
+00912 }
+00913
+<a name="l00915"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z651_5">00915</a> <font class="keywordtype">void</font> CParticleSystem::getIDs(std::vector&lt;uint32&gt; &amp;dest)<font class="keyword"> const</font>
+00916 <font class="keyword"></font>{
+00917 dest.resize(<a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.size());
+00918 uint k = 0;
+00919 <font class="keywordflow">for</font>(TLBMap::const_iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.begin(); it != <a class="code" href="classNL3D_1_1CParticleSystem.html#o35">_LBMap</a>.end(); ++it)
+00920 {
+00921 dest[k] = it-&gt;first;
+00922 ++k;
+00923 }
+00924 }
+00925
+<a name="l00927"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#a2">00927</a> <font class="keywordtype">void</font> CParticleSystem::interpolatePosDelta(<a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &amp;dest,<a class="code" href="namespaceNL3D.html#a1">TAnimationTime</a> deltaT)
+00928 {
+00929 dest = <a class="code" href="classNL3D_1_1CParticleSystem.html#o10">_CurrentDeltaPos</a> - (deltaT * <a class="code" href="classNL3D_1_1CParticleSystem.html#o51">_InverseEllapsedTime</a>) * <a class="code" href="classNL3D_1_1CParticleSystem.html#o11">_DeltaPos</a>;
+00930 }
+00931
+<a name="l00933"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z641_2">00933</a> <font class="keywordtype">void</font> CParticleSystem::bindGlobalValueToUserParam(<font class="keyword">const</font> std::string &amp;globalValueName, uint userParamIndex)
+00934 {
+00935 <a class="code" href="debug_8h.html#a6">nlassert</a>(userParamIndex &lt; <a class="code" href="namespaceNL3D.html#a165">MaxPSUserParam</a>);
+00936 <font class="keywordflow">if</font> (globalValueName.empty()) <font class="comment">// disable a user param global value</font>
+00937 {
+00938 <font class="keywordflow">if</font> (!<a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a>) <font class="keywordflow">return</font>;
+00939 <a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a>[userParamIndex] = NULL;
+00940 <font class="keywordflow">for</font>(uint k = 0; k &lt; <a class="code" href="namespaceNL3D.html#a165">MaxPSUserParam</a>; ++k)
+00941 {
+00942 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a>[k] != NULL) <font class="keywordflow">return</font>;
+00943 }
+00944 <font class="comment">// no more entry used</font>
+00945 <font class="keyword">delete</font> <a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a>;
+00946 <a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a> = NULL;
+00947 }
+00948 <font class="keywordflow">else</font> <font class="comment">// enable a user param global value</font>
+00949 {
+00950 <font class="keywordflow">if</font> (!<a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a>)
+00951 {
+00952 <font class="comment">// no table has been allocated yet, so create one</font>
+00953 <a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a> = <font class="keyword">new</font> <font class="keyword">const</font> TGlobalValuesMap::value_type *[<a class="code" href="namespaceNL3D.html#a165">MaxPSUserParam</a>];
+00954 std::fill(<a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a>, <a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a> + <a class="code" href="namespaceNL3D.html#a165">MaxPSUserParam</a>, (TGlobalValuesMap::value_type *) NULL);
+00955 }
+00956 <font class="comment">// has the global value be created yet ?</font>
+00957 TGlobalValuesMap::const_iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#r0">_GlobalValuesMap</a>.find(globalValueName);
+00958 <font class="keywordflow">if</font> (it != <a class="code" href="classNL3D_1_1CParticleSystem.html#r0">_GlobalValuesMap</a>.end())
+00959 {
+00960 <font class="comment">// yes, make a reference on it</font>
+00961 <a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a>[userParamIndex] = &amp;(*it);
+00962 }
+00963 <font class="keywordflow">else</font>
+00964 {
+00965 <font class="comment">// create a new entry</font>
+00966 std::pair&lt;TGlobalValuesMap::iterator, bool&gt; itPair = <a class="code" href="classNL3D_1_1CParticleSystem.html#r0">_GlobalValuesMap</a>.insert(TGlobalValuesMap::value_type(globalValueName, 0.f));
+00967 <a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a>[userParamIndex] = &amp;(*(itPair.first));
+00968 }
+00969 }
+00970 }
+00971
+<a name="l00973"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z641_4">00973</a> <font class="keywordtype">void</font> CParticleSystem::setGlobalValue(<font class="keyword">const</font> std::string &amp;name, <font class="keywordtype">float</font> <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>)
+00974 {
+00975 <a class="code" href="debug_8h.html#a6">nlassert</a>(!name.empty());
+00976 <a class="code" href="namespaceNLMISC.html#a215">NLMISC::clamp</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>, 0.f, 1.f);
+00977 <a class="code" href="classNL3D_1_1CParticleSystem.html#r0">_GlobalValuesMap</a>[name] = <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>;
+00978 }
+00979
+<a name="l00981"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z641_5">00981</a> <font class="keywordtype">float</font> CParticleSystem::getGlobalValue(<font class="keyword">const</font> std::string &amp;name)
+00982 {
+00983 TGlobalValuesMap::const_iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#r0">_GlobalValuesMap</a>.find(name);
+00984 <font class="keywordflow">if</font> (it != <a class="code" href="classNL3D_1_1CParticleSystem.html#r0">_GlobalValuesMap</a>.end()) <font class="keywordflow">return</font> it-&gt;second;
+00985 <font class="keywordflow">return</font> 0.f; <font class="comment">// not a known value</font>
+00986 }
+00987
+<a name="l00989"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z641_3">00989</a> std::string CParticleSystem::getGlobalValueName(uint userParamIndex)<font class="keyword"> const</font>
+00990 <font class="keyword"></font>{
+00991 <a class="code" href="debug_8h.html#a6">nlassert</a>(userParamIndex &lt; <a class="code" href="namespaceNL3D.html#a165">MaxPSUserParam</a>);
+00992 <font class="keywordflow">if</font> (!<a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a>) <font class="keywordflow">return</font> <font class="stringliteral">""</font>;
+00993 <font class="keywordflow">if</font> (!<a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a>[userParamIndex]) <font class="keywordflow">return</font> <font class="stringliteral">""</font>;
+00994 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CParticleSystem.html#o32">_UserParamGlobalValue</a>[userParamIndex]-&gt;first;
+00995 }
+00996
+<a name="l00998"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z641_6">00998</a> <font class="keywordtype">void</font> CParticleSystem::setGlobalVectorValue(<font class="keyword">const</font> std::string &amp;name, <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &amp;<a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>)
+00999 {
+01000 <a class="code" href="debug_8h.html#a6">nlassert</a>(!name.empty());
+01001 <a class="code" href="classNL3D_1_1CParticleSystem.html#r1">_GlobalVectorValuesMap</a>[name] = value;
+01002 }
+01003
+01004
+<a name="l01006"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z641_7">01006</a> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> CParticleSystem::getGlobalVectorValue(<font class="keyword">const</font> std::string &amp;name)
+01007 {
+01008 <a class="code" href="debug_8h.html#a6">nlassert</a>(!name.empty());
+01009 TGlobalVectorValuesMap::const_iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#r1">_GlobalVectorValuesMap</a>.find(name);
+01010 <font class="keywordflow">if</font> (it != <a class="code" href="classNL3D_1_1CParticleSystem.html#r1">_GlobalVectorValuesMap</a>.end()) <font class="keywordflow">return</font> it-&gt;second;
+01011 <font class="keywordflow">return</font> <a class="code" href="classNLMISC_1_1CVector.html#p0">NLMISC::CVector::Null</a>; <font class="comment">// not a known value </font>
+01012 }
+01013
+<a name="l01015"></a><a class="code" href="classNL3D_1_1CParticleSystem.html#z641_8">01015</a> CParticleSystem::CGlobalVectorValueHandle CParticleSystem::getGlobalVectorValueHandle(<font class="keyword">const</font> std::string &amp;name)
+01016 {
+01017 <a class="code" href="debug_8h.html#a6">nlassert</a>(!name.empty());
+01018 TGlobalVectorValuesMap::iterator it = <a class="code" href="classNL3D_1_1CParticleSystem.html#r1">_GlobalVectorValuesMap</a>.find(name);
+01019 <font class="keywordflow">if</font> (it == <a class="code" href="classNL3D_1_1CParticleSystem.html#r1">_GlobalVectorValuesMap</a>.end())
+01020 {
+01021 it = <a class="code" href="classNL3D_1_1CParticleSystem.html#r1">_GlobalVectorValuesMap</a>.insert(TGlobalVectorValuesMap::value_type(name, <a class="code" href="classNLMISC_1_1CVector.html#p0">NLMISC::CVector::Null</a>)).first;
+01022 }
+01023 CGlobalVectorValueHandle handle;
+01024 handle._Value = &amp;it-&gt;second;
+01025 handle._Name = &amp;it-&gt;first;
+01026 <font class="keywordflow">return</font> handle;
+01027 }
+01028
+01029
+01030
+01031 } <font class="comment">// NL3D</font>
+</pre></div>
+
+<!-- footer -->
+<BR><FONT Size=+5>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </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>