diff options
Diffstat (limited to 'docs/doxygen/nel/channel__mixer_8cpp-source.html')
-rw-r--r-- | docs/doxygen/nel/channel__mixer_8cpp-source.html | 769 |
1 files changed, 769 insertions, 0 deletions
diff --git a/docs/doxygen/nel/channel__mixer_8cpp-source.html b/docs/doxygen/nel/channel__mixer_8cpp-source.html new file mode 100644 index 00000000..fddf125e --- /dev/null +++ b/docs/doxygen/nel/channel__mixer_8cpp-source.html @@ -0,0 +1,769 @@ +<!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>channel_mixer.cpp</h1><a href="channel__mixer_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="channel__mixer_8h.html">3d/channel_mixer.h</a>"</font> +00029 <font class="preprocessor">#include "<a class="code" href="track_8h.html">3d/track.h</a>"</font> +00030 <font class="preprocessor">#include "<a class="code" href="animatable_8h.html">3d/animatable.h</a>"</font> +00031 <font class="preprocessor">#include "<a class="code" href="skeleton__weight_8h.html">3d/skeleton_weight.h</a>"</font> +00032 <font class="preprocessor">#include "<a class="code" href="debug_8h.html">nel/misc/debug.h</a>"</font> +00033 <font class="preprocessor">#include "<a class="code" href="common_8h.html">nel/misc/common.h</a>"</font> +00034 +00035 <font class="keyword">using</font> <font class="keyword">namespace </font>NLMISC; +00036 <font class="keyword">using</font> <font class="keyword">namespace </font>std; +00037 +00038 <font class="keyword">namespace </font>NL3D +00039 { +00040 +00041 <font class="comment">// ***************************************************************************</font> +00042 +<a name="l00043"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a0">00043</a> CChannelMixer::CChannelMixer() +00044 { +00045 <font class="comment">// No channel in the list</font> +00046 <a class="code" href="classNL3D_1_1CChannelMixer.html#o3">_FirstChannelGlobal</a>=NULL; +00047 <a class="code" href="classNL3D_1_1CChannelMixer.html#o4">_FirstChannelDetail</a>=NULL; +00048 +00049 <font class="comment">// No animation set</font> +00050 <a class="code" href="classNL3D_1_1CChannelMixer.html#o1">_AnimationSet</a>=NULL; +00051 +00052 <font class="comment">// Mixer no dirty</font> +00053 <a class="code" href="classNL3D_1_1CChannelMixer.html#o6">_Dirt</a>=<font class="keyword">false</font>; +00054 <a class="code" href="classNL3D_1_1CChannelMixer.html#o7">_ListToEvalDirt</a>= <font class="keyword">false</font>; +00055 +00056 <font class="comment">// never evaluated.</font> +00057 <a class="code" href="classNL3D_1_1CChannelMixer.html#o5">_LastEvalDetailDate</a>= -1; +00058 } +00059 +00060 <font class="comment">// ***************************************************************************</font> +00061 +<a name="l00062"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a1">00062</a> <font class="keywordtype">void</font> CChannelMixer::setAnimationSet (<font class="keyword">const</font> CAnimationSet* animationSet) +00063 { +00064 <font class="comment">// Set the animationSet Pointer</font> +00065 <a class="code" href="classNL3D_1_1CChannelMixer.html#o1">_AnimationSet</a>=animationSet; +00066 +00067 <font class="comment">// clear the channels.</font> +00068 <a class="code" href="classNL3D_1_1CChannelMixer.html#a5">resetChannels</a>(); +00069 } +00070 +00071 <font class="comment">// ***************************************************************************</font> +00072 +<a name="l00073"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a2">00073</a> <font class="keyword">const</font> CAnimationSet* CChannelMixer::getAnimationSet ()<font class="keyword"> const</font> +00074 <font class="keyword"></font>{ +00075 <font class="comment">// Return the animationSet Pointer</font> +00076 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CChannelMixer.html#o1">_AnimationSet</a>; +00077 } +00078 +00079 <font class="comment">// ***************************************************************************</font> +00080 +<a name="l00081"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a3">00081</a> <font class="keywordtype">void</font> CChannelMixer::eval (<font class="keywordtype">bool</font> detail, uint64 evalDetailDate) +00082 { +00083 <font class="comment">// Setup an array of animation that are not empty and stay</font> +00084 uint numActive=0; +00085 uint activeSlot[<a class="code" href="classNL3D_1_1CChannelMixer.html#s1s0">NumAnimationSlot</a>]; +00086 +00087 <font class="keywordflow">if</font>(detail && (sint64)evalDetailDate== <a class="code" href="classNL3D_1_1CChannelMixer.html#o5">_LastEvalDetailDate</a>) +00088 <font class="keywordflow">return</font>; +00089 +00090 <font class="comment">// clean list according to anim setup</font> +00091 <font class="keywordflow">if</font>(_Dirt) +00092 { +00093 <a class="code" href="classNL3D_1_1CChannelMixer.html#c2">refreshList</a>(); +00094 <a class="code" href="classNL3D_1_1CChannelMixer.html#c0">cleanAll</a>(); +00095 } +00096 +00097 <font class="comment">// clean eval list, according to channels enabled.</font> +00098 <font class="keywordflow">if</font>(_ListToEvalDirt) +00099 { +00100 <a class="code" href="classNL3D_1_1CChannelMixer.html#c3">refreshListToEval</a>(); +00101 <a class="code" href="debug_8h.html#a6">nlassert</a>(!<a class="code" href="classNL3D_1_1CChannelMixer.html#o7">_ListToEvalDirt</a>); +00102 } +00103 +00104 <font class="comment">// Setup it up</font> +00105 <font class="keywordflow">for</font> (uint <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a><<a class="code" href="classNL3D_1_1CChannelMixer.html#s1s0">NumAnimationSlot</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>++) +00106 { +00107 <font class="comment">// Dirt, not empty and has an influence? (add)</font> +00108 <font class="keywordflow">if</font> (!<a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>].isEmpty() && <a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>]._Weight>0) +00109 <font class="comment">// Add a dirt slot</font> +00110 activeSlot[numActive++]=<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>; +00111 } +00112 +00113 <font class="comment">// no slot enabled at all?? skip</font> +00114 <font class="keywordflow">if</font>(numActive==0) +00115 <font class="keywordflow">return</font>; +00116 +00117 <font class="comment">// For each selected channel</font> +00118 CChannel **channelArrayPtr = 0; +00119 uint numChans; +00120 <font class="keywordflow">if</font>(detail) +00121 { +00122 numChans= <a class="code" href="classNL3D_1_1CChannelMixer.html#o9">_DetailListToEval</a>.size(); +00123 <font class="keywordflow">if</font>(numChans) +00124 channelArrayPtr= &<a class="code" href="classNL3D_1_1CChannelMixer.html#o9">_DetailListToEval</a>[0]; +00125 <font class="comment">// eval the animation only one time per scene traversal.</font> +00126 <a class="code" href="classNL3D_1_1CChannelMixer.html#o5">_LastEvalDetailDate</a>= evalDetailDate; +00127 } +00128 <font class="keywordflow">else</font> +00129 { +00130 numChans= <a class="code" href="classNL3D_1_1CChannelMixer.html#o8">_GlobalListToEval</a>.size(); +00131 <font class="keywordflow">if</font>(numChans) +00132 channelArrayPtr= &<a class="code" href="classNL3D_1_1CChannelMixer.html#o8">_GlobalListToEval</a>[0]; +00133 } +00134 +00135 +00136 <font class="keywordflow">for</font>(;numChans>0; numChans--, channelArrayPtr++) +00137 { +00138 CChannel *pChannel= *channelArrayPtr; +00139 +00140 <font class="comment">// For Quat animated value only.</font> +00141 CQuat firstQuat; +00142 +00143 <font class="comment">// First slot found</font> +00144 <font class="keywordtype">bool</font> bFirst=<font class="keyword">true</font>; +00145 +00146 <font class="comment">// Last blend factor</font> +00147 <font class="keywordtype">float</font> lastBlend=0.0; +00148 +00149 <font class="comment">// Eval each slot</font> +00150 <font class="keywordflow">for</font> (uint a=0; a<numActive; a++) +00151 { +00152 <font class="comment">// Slot number</font> +00153 uint slot=activeSlot[a]; +00154 +00155 <font class="comment">// Current blend factor</font> +00156 <font class="keywordtype">float</font> <a class="code" href="namespaceNLMISC.html#a286">blend</a>=pChannel->_Weights[slot]*<a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot].<a class="code" href="classNL3D_1_1CChannelMixer_1_1CSlot.html#o4">_Weight</a>; +00157 +00158 <font class="keywordflow">if</font>(<a class="code" href="namespaceNLMISC.html#a286">blend</a>!=0.0f) +00159 { +00160 <font class="comment">// Eval the track at this time</font> +00161 ((ITrack*)pChannel->_Tracks[slot])->eval (<a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot]._Time); +00162 +00163 <font class="comment">// First track to be eval ?</font> +00164 <font class="keywordflow">if</font> (bFirst) +00165 { +00166 <font class="comment">// If channel is a Quaternion animated Value, must store the first Quat.</font> +00167 <font class="keywordflow">if</font> (pChannel->_IsQuat) +00168 { +00169 CAnimatedValueBlendable<NLMISC::CQuat> *pQuatValue=(CAnimatedValueBlendable<NLMISC::CQuat>*)&pChannel->_Tracks[slot]->getValue(); +00170 firstQuat=pQuatValue->Value; +00171 } +00172 +00173 <font class="comment">// Copy the interpolated value</font> +00174 pChannel->_Value->affect (pChannel->_Tracks[slot]->getValue()); +00175 +00176 <font class="comment">// First blend factor</font> +00177 lastBlend=<a class="code" href="namespaceNLMISC.html#a286">blend</a>; +00178 +00179 <font class="comment">// Not first anymore</font> +00180 bFirst=<font class="keyword">false</font>; +00181 } +00182 <font class="keywordflow">else</font> +00183 { +00184 <font class="comment">// If channel is a Quaternion animated Value, must makeClosest the ith result of the track, from firstQuat.</font> +00185 <font class="keywordflow">if</font> (pChannel->_IsQuat) +00186 { +00187 CAnimatedValueBlendable<NLMISC::CQuat> *pQuatValue=(CAnimatedValueBlendable<NLMISC::CQuat>*)&pChannel->_Tracks[slot]->getValue(); +00188 pQuatValue->Value.makeClosest (firstQuat); +00189 } +00190 +00191 <font class="comment">// Blend with this value and the previous sum</font> +00192 pChannel->_Value->blend (pChannel->_Tracks[slot]->getValue(), lastBlend/(lastBlend+<a class="code" href="namespaceNLMISC.html#a286">blend</a>)); +00193 +00194 <font class="comment">// last blend update</font> +00195 lastBlend+=<a class="code" href="namespaceNLMISC.html#a286">blend</a>; +00196 } +00197 } +00198 +00199 <font class="comment">// NB: if all weights are 0, the AnimatedValue is not modified...</font> +00200 } +00201 +00202 <font class="comment">// Touch the animated value and its owner to recompute them later.</font> +00203 pChannel->_Object->touch (pChannel->_ValueId, pChannel->_OwnerValueId); +00204 } +00205 } +00206 +00207 <font class="comment">// ***************************************************************************</font> +00208 +00209 sint CChannelMixer::addChannel (<font class="keyword">const</font> string& channelName, IAnimatable* animatable, IAnimatedValue* <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>, ITrack* defaultValue, uint32 valueId, uint32 ownerValueId, <font class="keywordtype">bool</font> detail) +00210 { +00211 <font class="comment">// Check the animationSet has been set</font> +00212 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="classNL3D_1_1CChannelMixer.html#o1">_AnimationSet</a>); +00213 +00214 <font class="comment">// Check args</font> +00215 <a class="code" href="debug_8h.html#a6">nlassert</a> (animatable); +00216 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>); +00217 <a class="code" href="debug_8h.html#a6">nlassert</a> (defaultValue); +00218 +00219 <font class="comment">// Get the channel Id having the same name than the tracks in this animation set.</font> +00220 uint iDInAnimationSet=<a class="code" href="classNL3D_1_1CChannelMixer.html#o1">_AnimationSet</a>->getChannelIdByName (channelName); +00221 +00222 <font class="comment">// Tracks exist in this animation set?</font> +00223 <font class="keywordflow">if</font> (iDInAnimationSet!=CAnimationSet::NotFound) +00224 { +00225 <font class="comment">// The channel entry</font> +00226 CChannel entry; +00227 +00228 <font class="comment">// Set the channel name</font> +00229 entry._ChannelName=channelName; +00230 +00231 <font class="comment">// Set the object pointer</font> +00232 entry._Object=animatable; +00233 +00234 <font class="comment">// Set the pointer on the value in the object</font> +00235 entry._Value=<a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>; +00236 +00237 <font class="comment">// Is this a CQuat animated value???</font> +00238 entry._IsQuat= (<font class="keyword">typeid</font> (*(entry._Value))==<font class="keyword">typeid</font> (CAnimatedValueBlendable<NLMISC::CQuat>))!=0; +00239 +00240 +00241 <font class="comment">// Set the default track pointer</font> +00242 entry._DefaultTracks=defaultValue; +00243 +00244 <font class="comment">// Set the value ID in the object</font> +00245 entry._ValueId=valueId; +00246 +00247 <font class="comment">// Set the First value ID in the object</font> +00248 entry._OwnerValueId=ownerValueId; +00249 +00250 <font class="comment">// in what mode is the channel?</font> +00251 entry._Detail= detail; +00252 +00253 <font class="comment">// All weights default to 1. All Tracks default to defaultTrack.</font> +00254 <font class="keywordflow">for</font>(sint <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>=0;<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a><<a class="code" href="classNL3D_1_1CChannelMixer.html#s1s0">NumAnimationSlot</a>;<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>++) +00255 { +00256 entry._Weights[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>]= 1.0f; +00257 entry._Tracks[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>]= entry._DefaultTracks; +00258 } +00259 +00260 <font class="comment">// add (if not already done) the entry in the map.</font> +00261 <a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>[iDInAnimationSet]= entry; +00262 +00263 <font class="comment">// Dirt all the slots</font> +00264 <a class="code" href="classNL3D_1_1CChannelMixer.html#c1">dirtAll</a> (); +00265 +00266 <font class="comment">// Affect the default value in the animated value</font> +00267 entry._Value->affect (entry._DefaultTracks->getValue()); +00268 +00269 <font class="comment">// Touch the animated value and its owner to recompute them later.</font> +00270 entry._Object->touch (entry._ValueId, entry._OwnerValueId); +00271 +00272 <font class="comment">// return the id.</font> +00273 <font class="keywordflow">return</font> iDInAnimationSet; +00274 } +00275 <font class="keywordflow">else</font> +00276 { +00277 <font class="comment">// return Not found.</font> +00278 <font class="keywordflow">return</font> -1; +00279 } +00280 } +00281 +00282 <font class="comment">// ***************************************************************************</font> +00283 +<a name="l00284"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a5">00284</a> <font class="keywordtype">void</font> CChannelMixer::resetChannels () +00285 { +00286 <a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.clear(); +00287 <a class="code" href="classNL3D_1_1CChannelMixer.html#c1">dirtAll</a> (); +00288 } +00289 +00290 +00291 <font class="comment">// ***************************************************************************</font> +<a name="l00292"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a6">00292</a> <font class="keywordtype">void</font> CChannelMixer::enableChannel (uint channelId, <font class="keywordtype">bool</font> enable) +00293 { +00294 std::map<uint, CChannel>::iterator it= <a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.find(channelId); +00295 <font class="keywordflow">if</font>(it!=<a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.end()) +00296 { +00297 it->second._EnableFlags &= ~CChannel::EnableUserFlag; +00298 <font class="keywordflow">if</font>(enable) +00299 it->second._EnableFlags |= CChannel::EnableUserFlag; +00300 +00301 <font class="comment">// Must recompute the channels to animate.</font> +00302 <a class="code" href="classNL3D_1_1CChannelMixer.html#o7">_ListToEvalDirt</a>= <font class="keyword">true</font>; +00303 } +00304 } +00305 +00306 +00307 <font class="comment">// ***************************************************************************</font> +<a name="l00308"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a7">00308</a> <font class="keywordtype">bool</font> CChannelMixer::isChannelEnabled (uint channelId)<font class="keyword"> const</font> +00309 <font class="keyword"></font>{ +00310 std::map<uint, CChannel>::const_iterator it= <a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.find(channelId); +00311 <font class="keywordflow">if</font>(it!=<a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.end()) +00312 { +00313 <font class="keywordflow">return</font> (it->second._EnableFlags & CChannel::EnableUserFlag) != 0; +00314 } +00315 <font class="keywordflow">else</font> +00316 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00317 } +00318 +00319 +00320 <font class="comment">// ***************************************************************************</font> +<a name="l00321"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a8">00321</a> <font class="keywordtype">void</font> CChannelMixer::lodEnableChannel (uint channelId, <font class="keywordtype">bool</font> enable) +00322 { +00323 std::map<uint, CChannel>::iterator it= <a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.find(channelId); +00324 <font class="keywordflow">if</font>(it!=<a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.end()) +00325 { +00326 it->second._EnableFlags &= ~CChannel::EnableLodFlag; +00327 <font class="keywordflow">if</font>(enable) +00328 it->second._EnableFlags |= CChannel::EnableLodFlag; +00329 +00330 <font class="comment">// Must recompute the channels to animate.</font> +00331 <a class="code" href="classNL3D_1_1CChannelMixer.html#o7">_ListToEvalDirt</a>= <font class="keyword">true</font>; +00332 } +00333 } +00334 +00335 +00336 <font class="comment">// ***************************************************************************</font> +<a name="l00337"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a9">00337</a> <font class="keywordtype">bool</font> CChannelMixer::isChannelLodEnabled (uint channelId)<font class="keyword"> const</font> +00338 <font class="keyword"></font>{ +00339 std::map<uint, CChannel>::const_iterator it= <a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.find(channelId); +00340 <font class="keywordflow">if</font>(it!=<a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.end()) +00341 { +00342 <font class="keywordflow">return</font> (it->second._EnableFlags & CChannel::EnableLodFlag) != 0; +00343 } +00344 <font class="keywordflow">else</font> +00345 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00346 } +00347 +00348 +00349 +00350 <font class="comment">// ***************************************************************************</font> +00351 +<a name="l00352"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a10">00352</a> <font class="keywordtype">void</font> CChannelMixer::setSlotAnimation (uint slot, uint animation) +00353 { +00354 <font class="comment">// Check alot arg</font> +00355 <a class="code" href="debug_8h.html#a6">nlassert</a> (slot<<a class="code" href="classNL3D_1_1CChannelMixer.html#s1s0">NumAnimationSlot</a>); +00356 +00357 <font class="comment">// Check an animationSet as been set.</font> +00358 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="classNL3D_1_1CChannelMixer.html#o1">_AnimationSet</a>); +00359 +00360 <font class="comment">// Find the animation pointer for this animation</font> +00361 <font class="keyword">const</font> CAnimation* pAnimation=<a class="code" href="classNL3D_1_1CChannelMixer.html#o1">_AnimationSet</a>->getAnimation (animation); +00362 +00363 <font class="comment">// Does this animation change ?</font> +00364 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot].<a class="code" href="classNL3D_1_1CChannelMixer_1_1CSlot.html#o0">_Animation</a>!=pAnimation) +00365 { +00366 <font class="comment">// Change it</font> +00367 <a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot].<a class="code" href="classNL3D_1_1CChannelMixer_1_1CSlot.html#o0">_Animation</a>=pAnimation; +00368 +00369 <font class="comment">// Dirt it</font> +00370 <a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot].<a class="code" href="classNL3D_1_1CChannelMixer_1_1CSlot.html#o5">_Dirt</a>=<font class="keyword">true</font>; +00371 +00372 <font class="comment">// Dirt the mixer</font> +00373 <a class="code" href="classNL3D_1_1CChannelMixer.html#o6">_Dirt</a>=<font class="keyword">true</font>; +00374 } +00375 } +00376 +00377 <font class="comment">// ***************************************************************************</font> +00378 +<a name="l00379"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a11">00379</a> <font class="keyword">const</font> CAnimation *CChannelMixer::getSlotAnimation(uint slot)<font class="keyword"> const</font> +00380 <font class="keyword"></font>{ +00381 <a class="code" href="debug_8h.html#a6">nlassert</a>(slot < <a class="code" href="classNL3D_1_1CChannelMixer.html#s1s0">NumAnimationSlot</a>); +00382 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot].<a class="code" href="classNL3D_1_1CChannelMixer_1_1CSlot.html#o0">_Animation</a>; +00383 } +00384 +00385 +00386 <font class="comment">// ***************************************************************************</font> +00387 +<a name="l00388"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a14">00388</a> <font class="keywordtype">void</font> CChannelMixer::emptySlot (uint slot) +00389 { +00390 <font class="comment">// Check alot arg</font> +00391 <a class="code" href="debug_8h.html#a6">nlassert</a> (slot<<a class="code" href="classNL3D_1_1CChannelMixer.html#s1s0">NumAnimationSlot</a>); +00392 +00393 <font class="comment">// Does this animation already empty ?</font> +00394 <font class="keywordflow">if</font> (!<a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot].<a class="code" href="classNL3D_1_1CChannelMixer_1_1CSlot.html#c2">isEmpty</a> ()) +00395 { +00396 <font class="comment">// Change it</font> +00397 <a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot].<a class="code" href="classNL3D_1_1CChannelMixer_1_1CSlot.html#c1">empty</a> (); +00398 +00399 <font class="comment">// Dirt it</font> +00400 <a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot].<a class="code" href="classNL3D_1_1CChannelMixer_1_1CSlot.html#o5">_Dirt</a>=<font class="keyword">true</font>; +00401 +00402 <font class="comment">// Dirt the mixer</font> +00403 <a class="code" href="classNL3D_1_1CChannelMixer.html#o6">_Dirt</a>=<font class="keyword">true</font>; +00404 } +00405 } +00406 +00407 <font class="comment">// ***************************************************************************</font> +00408 +<a name="l00409"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a15">00409</a> <font class="keywordtype">void</font> CChannelMixer::resetSlots () +00410 { +00411 <font class="comment">// Empty all slots</font> +00412 <font class="keywordflow">for</font> (uint <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a><<a class="code" href="classNL3D_1_1CChannelMixer.html#s1s0">NumAnimationSlot</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>++) +00413 <font class="comment">// Empty it</font> +00414 <a class="code" href="classNL3D_1_1CChannelMixer.html#a14">emptySlot</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>); +00415 } +00416 +00417 <font class="comment">// ***************************************************************************</font> +00418 +<a name="l00419"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a16">00419</a> <font class="keywordtype">void</font> CChannelMixer::applySkeletonWeight (uint slot, uint skeleton, <font class="keywordtype">bool</font> invert) +00420 { +00421 <font class="comment">// Check alot arg</font> +00422 <a class="code" href="debug_8h.html#a6">nlassert</a> (slot<<a class="code" href="classNL3D_1_1CChannelMixer.html#s1s0">NumAnimationSlot</a>); +00423 +00424 <font class="comment">// Check the animationSet has been set</font> +00425 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="classNL3D_1_1CChannelMixer.html#o1">_AnimationSet</a>); +00426 +00427 <font class="comment">// Get the skeleton weight</font> +00428 <font class="keyword">const</font> CSkeletonWeight *pSkeleton=<a class="code" href="classNL3D_1_1CChannelMixer.html#o1">_AnimationSet</a>->getSkeletonWeight (skeleton); +00429 +00430 <font class="comment">// Something to change ?</font> +00431 <font class="keywordflow">if</font> ((pSkeleton!=<a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot].<a class="code" href="classNL3D_1_1CChannelMixer_1_1CSlot.html#o1">_SkeletonWeight</a>)||(invert!=<a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot].<a class="code" href="classNL3D_1_1CChannelMixer_1_1CSlot.html#o2">_InvertedSkeletonWeight</a>)) +00432 { +00433 <font class="comment">// Set the current skeleton</font> +00434 <a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot].<a class="code" href="classNL3D_1_1CChannelMixer_1_1CSlot.html#o1">_SkeletonWeight</a>=pSkeleton; +00435 <a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot].<a class="code" href="classNL3D_1_1CChannelMixer_1_1CSlot.html#o2">_InvertedSkeletonWeight</a>=invert; +00436 +00437 <font class="comment">// Get number of node in the skeleton weight</font> +00438 uint sizeSkel=pSkeleton->getNumNode (); +00439 +00440 <font class="comment">// For each entry of the skeleton weight</font> +00441 <font class="keywordflow">for</font> (uint n=0; n<sizeSkel; n++) +00442 { +00443 <font class="comment">// Get the name of the channel for this node</font> +00444 <font class="keyword">const</font> string& channelName=pSkeleton->getNodeName (n); +00445 +00446 <font class="comment">// Get the channel Id having the same name than the tracks in this animation set.</font> +00447 uint channelId=<a class="code" href="classNL3D_1_1CChannelMixer.html#o1">_AnimationSet</a>->getChannelIdByName (channelName); +00448 +00449 <font class="comment">// Tracks exist in this animation set?</font> +00450 <font class="keywordflow">if</font> (channelId!=CAnimationSet::NotFound) +00451 { +00452 <font class="comment">// Get the weight of the channel for this node</font> +00453 <font class="keywordtype">float</font> weight=pSkeleton->getNodeWeight (n); +00454 +00455 <font class="comment">// Set the weight of this channel for this slot (only if channel setuped!!)</font> +00456 std::map<uint, CChannel>::iterator ite=<a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.find(channelId); +00457 <font class="keywordflow">if</font> (ite!=<a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.end()) +00458 ite->second._Weights[slot]=invert?1.f-weight:weight; +00459 } +00460 } +00461 } +00462 } +00463 +00464 <font class="comment">// ***************************************************************************</font> +00465 +<a name="l00466"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a17">00466</a> <font class="keywordtype">void</font> CChannelMixer::resetSkeletonWeight (uint slot) +00467 { +00468 <font class="comment">// Check alot arg</font> +00469 <a class="code" href="debug_8h.html#a6">nlassert</a> (slot<<a class="code" href="classNL3D_1_1CChannelMixer.html#s1s0">NumAnimationSlot</a>); +00470 +00471 <font class="comment">// Something to change ?</font> +00472 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot].<a class="code" href="classNL3D_1_1CChannelMixer_1_1CSlot.html#o1">_SkeletonWeight</a>!=NULL) +00473 { +00474 <font class="comment">// Set skeleton</font> +00475 <a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot].<a class="code" href="classNL3D_1_1CChannelMixer_1_1CSlot.html#o1">_SkeletonWeight</a>=NULL; +00476 <a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[slot].<a class="code" href="classNL3D_1_1CChannelMixer_1_1CSlot.html#o2">_InvertedSkeletonWeight</a>=<font class="keyword">false</font>; +00477 +00478 <font class="comment">// For each channels</font> +00479 map<uint, CChannel>::iterator itChannel; +00480 <font class="keywordflow">for</font>(itChannel= <a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.begin(); itChannel!=<a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.end();itChannel++) +00481 { +00482 <font class="comment">// Reset</font> +00483 (*itChannel).second._Weights[slot]=1.f; +00484 } +00485 } +00486 } +00487 +00488 <font class="comment">// ***************************************************************************</font> +00489 +<a name="l00490"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#c0">00490</a> <font class="keywordtype">void</font> CChannelMixer::cleanAll () +00491 { +00492 <font class="comment">// For each slot</font> +00493 <font class="keywordflow">for</font> (uint <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a><<a class="code" href="classNL3D_1_1CChannelMixer.html#s1s0">NumAnimationSlot</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>++) +00494 { +00495 <font class="comment">// Clean it</font> +00496 <a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>]._Dirt=<font class="keyword">false</font>; +00497 } +00498 +00499 <font class="comment">// Clean the mixer</font> +00500 <a class="code" href="classNL3D_1_1CChannelMixer.html#o6">_Dirt</a>=<font class="keyword">false</font>; +00501 } +00502 +00503 <font class="comment">// ***************************************************************************</font> +00504 +<a name="l00505"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#c1">00505</a> <font class="keywordtype">void</font> CChannelMixer::dirtAll () +00506 { +00507 <font class="comment">// For each slot</font> +00508 <font class="keywordflow">for</font> (uint <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a><<a class="code" href="classNL3D_1_1CChannelMixer.html#s1s0">NumAnimationSlot</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>++) +00509 { +00510 <font class="comment">// Dirt</font> +00511 <font class="keywordflow">if</font> (!<a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>].isEmpty()) +00512 { +00513 <font class="comment">// Dirt it</font> +00514 <a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>]._Dirt=<font class="keyword">true</font>; +00515 +00516 <font class="comment">// Dirt the mixer</font> +00517 <a class="code" href="classNL3D_1_1CChannelMixer.html#o6">_Dirt</a>=<font class="keyword">true</font>; +00518 } +00519 } +00520 } +00521 +00522 <font class="comment">// ***************************************************************************</font> +00523 +<a name="l00524"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#c2">00524</a> <font class="keywordtype">void</font> CChannelMixer::refreshList () +00525 { +00526 <font class="comment">// Setup an array of animation to add</font> +00527 uint numAdd=0; +00528 uint addSlot[<a class="code" href="classNL3D_1_1CChannelMixer.html#s1s0">NumAnimationSlot</a>]; +00529 +00530 <font class="comment">// Setup an array of animation that are not empty and stay</font> +00531 uint numStay=0; +00532 uint staySlot[<a class="code" href="classNL3D_1_1CChannelMixer.html#s1s0">NumAnimationSlot</a>]; +00533 +00534 <font class="comment">// Setup it up</font> +00535 uint <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>; +00536 <font class="keywordflow">for</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a><<a class="code" href="classNL3D_1_1CChannelMixer.html#s1s0">NumAnimationSlot</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>++) +00537 { +00538 <font class="comment">// Dirt and not empty ? (add)</font> +00539 <font class="keywordflow">if</font> ((<a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>]._Dirt)&&(!<a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>].isEmpty())) +00540 <font class="comment">// Add a dirt slot</font> +00541 addSlot[numAdd++]=<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>; +00542 +00543 <font class="comment">// Not empty and not dirt ? (stay)</font> +00544 <font class="keywordflow">if</font> ((!<a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>]._Dirt)&&(!<a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>].isEmpty())) +00545 <font class="comment">// Add a dirt slot</font> +00546 staySlot[numStay++]=<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>; +00547 } +00548 +00549 <font class="comment">// Last channel pointer</font> +00550 CChannel **lastPointerGlobal=&<a class="code" href="classNL3D_1_1CChannelMixer.html#o3">_FirstChannelGlobal</a>; +00551 CChannel **lastPointerDetail=&<a class="code" href="classNL3D_1_1CChannelMixer.html#o4">_FirstChannelDetail</a>; +00552 +00553 +00554 <font class="comment">// Now scan each channel</font> +00555 map<uint, CChannel>::iterator itChannel; +00556 <font class="keywordflow">for</font>(itChannel= <a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.begin(); itChannel!=<a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.end();itChannel++) +00557 { +00558 CChannel &channel= (*itChannel).second; +00559 +00560 <font class="comment">// Add this channel to the list if true</font> +00561 <font class="keywordtype">bool</font> add=<font class="keyword">false</font>; +00562 +00563 <font class="comment">// For each slot to add</font> +00564 <font class="keywordflow">for</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a><numAdd; <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>++) +00565 { +00566 <font class="comment">// Find the index of the channel track in the animation set</font> +00567 uint iDTrack=<a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[addSlot[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>]]._Animation->getIdTrackByName (channel._ChannelName); +00568 +00569 <font class="comment">// If this track exist</font> +00570 <font class="keywordflow">if</font> (iDTrack!=CAnimation::NotFound) +00571 { +00572 <font class="comment">// Set the track</font> +00573 channel._Tracks[addSlot[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>]]=<a class="code" href="classNL3D_1_1CChannelMixer.html#o0">_SlotArray</a>[addSlot[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>]]._Animation->getTrack (iDTrack); +00574 +00575 <font class="comment">// Add this channel to the list</font> +00576 add=<font class="keyword">true</font>; +00577 } +00578 <font class="keywordflow">else</font> +00579 { +00580 <font class="comment">// Set the default track</font> +00581 channel._Tracks[addSlot[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>]]=channel._DefaultTracks; +00582 } +00583 } +00584 +00585 <font class="comment">// Add this channel to the list ?</font> +00586 <font class="keywordflow">if</font> (!add) +00587 { +00588 <font class="comment">// Was it in the list ?</font> +00589 <font class="keywordflow">if</font> (channel._InTheList) +00590 { +00591 <font class="comment">// Check if this channel is still in use</font> +00592 +00593 <font class="comment">// For each slot in the stay list</font> +00594 <font class="keywordflow">for</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a><numStay; <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>++) +00595 { +00596 <font class="comment">// Use anything interesting ?</font> +00597 <font class="keywordflow">if</font> (channel._Tracks[staySlot[<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>]]!=channel._DefaultTracks) +00598 { +00599 <font class="comment">// Ok, add it to the list</font> +00600 add=<font class="keyword">true</font>; +00601 +00602 <font class="comment">// Stop</font> +00603 <font class="keywordflow">break</font>; +00604 } +00605 } +00606 +00607 <font class="comment">// Still in use?</font> +00608 <font class="keywordflow">if</font> (!add) +00609 { +00610 <font class="comment">// Set it's value to default and touch it's object</font> +00611 channel._Value->affect (channel._DefaultTracks->getValue()); +00612 channel._Object->touch (channel._ValueId, channel._OwnerValueId); +00613 } +00614 } +00615 } +00616 +00617 <font class="comment">// Do i have to add the channel to the list</font> +00618 <font class="keywordflow">if</font> (add) +00619 { +00620 <font class="comment">// It is in the list</font> +00621 channel._InTheList=<font class="keyword">true</font>; +00622 +00623 <font class="keywordflow">if</font>(channel._Detail) +00624 { +00625 <font class="comment">// Set the last pointer value</font> +00626 *lastPointerDetail=&channel; +00627 <font class="comment">// Change last pointer</font> +00628 lastPointerDetail=&channel._Next; +00629 } +00630 <font class="keywordflow">else</font> +00631 { +00632 <font class="comment">// Set the last pointer value</font> +00633 *lastPointerGlobal=&channel; +00634 <font class="comment">// Change last pointer</font> +00635 lastPointerGlobal=&channel._Next; +00636 } +00637 +00638 } +00639 <font class="keywordflow">else</font> +00640 { +00641 <font class="comment">// It is not in the list</font> +00642 channel._InTheList=<font class="keyword">false</font>; +00643 } +00644 } +00645 +00646 <font class="comment">// End of the list</font> +00647 *lastPointerGlobal=NULL; +00648 *lastPointerDetail=NULL; +00649 +00650 <font class="comment">// Must recompute the channels to animate.</font> +00651 <a class="code" href="classNL3D_1_1CChannelMixer.html#o7">_ListToEvalDirt</a>= <font class="keyword">true</font>; +00652 } +00653 +00654 +00655 <font class="comment">// ***************************************************************************</font> +<a name="l00656"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#c3">00656</a> <font class="keywordtype">void</font> CChannelMixer::refreshListToEval () +00657 { +00658 CChannel* pChannel; +00659 +00660 <font class="comment">/* NB: this save if(), especially when Used with Skeleton, and CLod mode</font> +00661 <font class="comment"> */</font> +00662 +00663 <font class="comment">// Global list.</font> +00664 <a class="code" href="classNL3D_1_1CChannelMixer.html#o8">_GlobalListToEval</a>.clear(); +00665 <a class="code" href="classNL3D_1_1CChannelMixer.html#o8">_GlobalListToEval</a>.reserve(<a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.size()); +00666 pChannel=<a class="code" href="classNL3D_1_1CChannelMixer.html#o3">_FirstChannelGlobal</a>; +00667 <font class="keywordflow">while</font>(pChannel) +00668 { +00669 <font class="comment">// if the channel is enabled (both user and lod), must eval all active slot.</font> +00670 <font class="keywordflow">if</font>(pChannel->_EnableFlags == CChannel::EnableAllFlag) +00671 <a class="code" href="classNL3D_1_1CChannelMixer.html#o8">_GlobalListToEval</a>.push_back(pChannel); +00672 <font class="comment">// next</font> +00673 pChannel= pChannel->_Next; +00674 } +00675 +00676 <font class="comment">// Global list.</font> +00677 <a class="code" href="classNL3D_1_1CChannelMixer.html#o9">_DetailListToEval</a>.clear(); +00678 <a class="code" href="classNL3D_1_1CChannelMixer.html#o9">_DetailListToEval</a>.reserve(<a class="code" href="classNL3D_1_1CChannelMixer.html#o2">_Channels</a>.size()); +00679 pChannel=<a class="code" href="classNL3D_1_1CChannelMixer.html#o4">_FirstChannelDetail</a>; +00680 <font class="keywordflow">while</font>(pChannel) +00681 { +00682 <font class="comment">// if the channel is enabled (both user and lod), must eval all active slot.</font> +00683 <font class="keywordflow">if</font>(pChannel->_EnableFlags == CChannel::EnableAllFlag) +00684 <a class="code" href="classNL3D_1_1CChannelMixer.html#o9">_DetailListToEval</a>.push_back(pChannel); +00685 <font class="comment">// next</font> +00686 pChannel= pChannel->_Next; +00687 } +00688 +00689 <font class="comment">// done</font> +00690 <a class="code" href="classNL3D_1_1CChannelMixer.html#o7">_ListToEvalDirt</a>= <font class="keyword">false</font>; +00691 } +00692 +00693 <font class="comment">// ***************************************************************************</font> +<a name="l00694"></a><a class="code" href="classNL3D_1_1CChannelMixer.html#a18">00694</a> <font class="keywordtype">void</font> CChannelMixer::resetEvalDetailDate() +00695 { +00696 <a class="code" href="classNL3D_1_1CChannelMixer.html#o5">_LastEvalDetailDate</a>= -1; +00697 } +00698 +00699 +00700 } <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> |