aboutsummaryrefslogtreecommitdiff
path: root/docs/doxygen/nel/mot_h-source.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/doxygen/nel/mot_h-source.html')
-rw-r--r--docs/doxygen/nel/mot_h-source.html470
1 files changed, 470 insertions, 0 deletions
diff --git a/docs/doxygen/nel/mot_h-source.html b/docs/doxygen/nel/mot_h-source.html
new file mode 100644
index 00000000..c084845c
--- /dev/null
+++ b/docs/doxygen/nel/mot_h-source.html
@@ -0,0 +1,470 @@
+<!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.2 on Wed May 30 22:01:14 2001 -->
+<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>mot.h</h1><a href="mot_h.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001
+00007 <font class="comment">/* Copyright, 2000 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">#ifndef NL_MOT_H
+</font>00027 <font class="preprocessor"></font><font class="preprocessor">#define NL_MOT_H
+</font>00028 <font class="preprocessor"></font>
+00029
+00030 <font class="preprocessor">#include "<a class="code" href="types_nl_h.html">nel/misc/types_nl.h</a>"</font>
+00031 <font class="preprocessor">#include "<a class="code" href="smart_ptr_h.html">nel/misc/smart_ptr.h</a>"</font>
+00032 <font class="preprocessor">#include "<a class="code" href="bit_set_h.html">nel/misc/bit_set.h</a>"</font>
+00033 <font class="preprocessor">#include "<a class="code" href="class_id_h.html">nel/misc/class_id.h</a>"</font>
+00034 <font class="preprocessor">#include &lt;vector&gt;</font>
+00035 <font class="preprocessor">#include &lt;set&gt;</font>
+00036 <font class="preprocessor">#include &lt;map&gt;</font>
+00037
+00038
+00039
+00040 <font class="keyword">namespace</font> NLMISC
+00041 {
+00042 <font class="keyword">class </font>IStream;
+00043 }
+00044
+00045
+00046 <font class="keyword">namespace</font> NL3D
+00047 {
+00048
+00049 <font class="comment">/*
+</font>00050 <font class="comment"> // THIS IS NOT TRADUCED BECAUSE NOT FIXED YET.
+</font>00051 <font class="comment">
+</font>00052 <font class="comment"> IDEES / TODO:
+</font>00053 <font class="comment">
+</font>00054 <font class="comment"> - Pour la recherche de texture/mesh sur le disque, il faudrait implémenter un objet CPath, qui représente
+</font>00055 <font class="comment"> un simili PATH, avec des méthodes add() / del() / get(i), et une méthode open(TFile) ou TFile est un objet fichier
+</font>00056 <font class="comment"> avec une fonction "bool open(string )".
+</font>00057 <font class="comment"> - Imaginons que l'on veuille implémenter un système de cache avancé: un fichier peut se trouver en mémoire, sur disque,
+</font>00058 <font class="comment"> ou sur le réseau. On pourrait faire cela en utilisant simplement CPath, et en utilisant un CMetaFile, classe qui
+</font>00059 <font class="comment"> ouvrir un type de stream suivant le nom de la string ouverte (CMemoryStream, CFile, CMessage ...).
+</font>00060 <font class="comment">
+</font>00061 <font class="comment"> - On pourrait implémenter un Observer de clip qui clip par matériau aussi, en faisant une sorte de
+</font>00062 <font class="comment"> batch culling: On stocke par matériau un "plan directeur" et un delta d'erreur accepté (à préciser...)
+</font>00063 <font class="comment">
+</font>00064 <font class="comment">*/</font>
+00065
+00066
+00067
+00068 <font class="comment">/*
+</font>00069 <font class="comment"> // THIS IS NOT TRADUCED BECAUSE NOT FIXED YET.
+</font>00070 <font class="comment">
+</font>00071 <font class="comment"> Le moteur est basé sur un modèle Model / Observer / Traversal. (MOT).
+</font>00072 <font class="comment">
+</font>00073 <font class="comment"> Graph de classe Model / Observer / Traversal (Model, Obs, Trav)
+</font>00074 <font class="comment">
+</font>00075 <font class="comment"> CMOT contient N traversals de type différents. Typiquement, les 4 traversals de base sont:
+</font>00076 <font class="comment">
+</font>00077 <font class="comment">CHandleTrav: la hierarchie d'objet. Le graph est un arbre. Le Traverser donne toutes les WorldMatrix des objets,
+</font>00078 <font class="comment"> necessaire aux autres traversals.
+</font>00079 <font class="comment">CCullTrav: le graph de visibilité. Ce traversal affecte directement CRenderTrav, en ajoutant les objets visibles.
+</font>00080 <font class="comment">CLightTrav: le graph de dépendance Light/Objet. Ce graph est aussi un arbre. Il indique quels objets sont illuminés par
+</font>00081 <font class="comment"> quelle source lumineuse. Le traversal déduit par noeud une liste des lights qui l'ilumine.
+</font>00082 <font class="comment">CRenderTrav: la liste triée en Z des objets à rendre.
+</font>00083 <font class="comment">
+</font>00084 <font class="comment">
+</font>00085 <font class="comment"> On a un SceneGraph en organisant les observers. ie, on a des graph d' observer (on a un graph par Traversal). Les models
+</font>00086 <font class="comment"> n'ont pas forcément un observer dans chaque graph. Typiquement, ni un cluster ni une light ne se render.
+</font>00087 <font class="comment">
+</font>00088 <font class="comment">
+</font>00089 <font class="comment"> Exemple de models
+</font>00090 <font class="comment">
+</font>00091 <font class="comment">CLight: light. Pass: NODE &amp; CULL &amp; LIGHT.
+</font>00092 <font class="comment">CInstance: instance d'un mesh quelconque. Pass: NODE &amp; CULL &amp; LIGHT &amp; RENDER
+</font>00093 <font class="comment">CCluster: Un cluster représente un partitionnement du monde. NODE &amp; CULL
+</font>00094 <font class="comment">CPortal: un portal est un lien entre 2 clusters. NODE &amp; CULL
+</font>00095 <font class="comment">
+</font>00096 <font class="comment">
+</font>00097 <font class="comment">
+</font>00098 <font class="comment">Le client n'utilise QUE ITrav et IModel.
+</font>00099 <font class="comment">Il ne peut accéder à ses Observeurs. Un observeur ici est juste un objet "algorithm" qui travaille sur des modeles, pour un
+</font>00100 <font class="comment">traversal. AUCUN setup ne doit donc lui être appliqué. A la question "oui mais j'ai envie de donner des hints pour le calcul
+</font>00101 <font class="comment">de la radiosité", la réponse est: Il faut dériver du Model à étendre, pour lui rajouter ces fameux hints, puis implémenter
+</font>00102 <font class="comment">l'observeur qui va prendre en compte ces hints. Un nouveau model est crée, et c'est donc celui là que le client devra utiliser
+</font>00103 <font class="comment">pour setter ses hints pour le traversal de radiosité. De cette facon, on garde l'encapsulation Model/Traversal.
+</font>00104 <font class="comment">
+</font>00105 <font class="comment">
+</font>00106 <font class="comment">Le deriver peut créer des Traversals, de nouveaux models (soit totalement nouveaux, soit par héritage)
+</font>00107 <font class="comment">et implémente les IObs, et doit les registerer dans CMOT.
+</font>00108 <font class="comment">
+</font>00109 <font class="comment">
+</font>00110 <font class="comment">Fonctionnement du Système d'instance (Shapes). Ce modèle ne s'occupe pas des instances, mais il faut donner une ligne de
+</font>00111 <font class="comment">conduite pour une utilisation correcte. En fait, les règles Model/Observer ne doivent pas être transgressées: le model est
+</font>00112 <font class="comment">la structure, l'observeur est l'algorithm pour le traversal donné. Cela veut dire que la fonction render() doit être
+</font>00113 <font class="comment">implémentée dans l'observeur, et non dans le shape. En procédant de cette façon, on est sur que l'observeur pourra accéder
+</font>00114 <font class="comment">à toutes les infos dont il a besoin (comme la WorldMatrix de l'observeur Handle par exemple). Cela veut dire aussi qu'il
+</font>00115 <font class="comment">faudra que l'interface du shape soit bien définie vis à vis de l'observeur. Faire un nouveau shape demandera donc parfois
+</font>00116 <font class="comment">de créer un nouveau model (un CInstance particulier, qui n'a pas forcément de nouvelles méthodes), ainsi qu'un nouvel
+</font>00117 <font class="comment">observeur qui suportera ce shape.
+</font>00118 <font class="comment">
+</font>00119 <font class="comment">
+</font>00120 <font class="comment">NOTE: le fait de bien séparer Models/Observers n'interdit pas le stockage de données particulières à l'observeur dans Model.
+</font>00121 <font class="comment">Ceci est particulièrement vrai pour Shape, qui gardera les liste de vertices pré-computées pour render() etc...
+</font>00122 <font class="comment">
+</font>00123 <font class="comment">
+</font>00124 <font class="comment">PROBLEME: interaction entre les traversals (clip / cull). ClipObs et RenderObs doit demander le résultat de HandleObs.
+</font>00125 <font class="comment">ClipObs doit linker les RenderObs dans le RenderTrav. =&gt; pitet obligé, en partie, de fournir une interface de base IObs,
+</font>00126 <font class="comment">par Traversal (CBaseRenderObs, CBaseCullObs, ...) pour ainsi fournir une même interface pour les autrres observeurs (eg:
+</font>00127 <font class="comment">l'observeur de Cull récupère la WorlMatrix de l'observeur de base Handle). Ceci est à spécifier par Traversal.
+</font>00128 <font class="comment">
+</font>00129 <font class="comment">
+</font>00130 <font class="comment">
+</font>00131 <font class="comment">Le core du moteur (ie nous :) ) a le droit de changer modèles, Traversals et observeurs, à la condition de garder
+</font>00132 <font class="comment">une compatibilité ascendante, pour que les modèles/observeurs/traversals écrit par les Deriver marchent encore, bien qu'il
+</font>00133 <font class="comment">soit alors nécessaire de recompiler.
+</font>00134 <font class="comment">
+</font>00135 <font class="comment">*/</font>
+00136
+00137
+00138
+00139 <font class="keyword">class </font>IModel;
+00140 <font class="keyword">class </font>IObs;
+00141 <font class="keyword">class </font>ITrav;
+00142
+00143
+00144 <font class="comment">// ***************************************************************************
+</font><a name="l00159"></a><a class="code" href="class_NL3D__CMOT.html">00159</a> <font class="comment"></font><font class="keyword">class </font>CMOT
+00160 {
+00161 <font class="keyword">public</font>:
+00162 <font class="comment">// Ctor.</font>
+00163 CMOT();
+00164 <font class="comment">// Dtor.</font>
+00165 ~CMOT();
+00166
+00168
+00169
+00176 <font class="keyword">static</font> <font class="keywordtype">void</font> registerModel(<font class="keyword">const</font> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> &amp;idModel, <font class="keyword">const</font> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> &amp;idModelBase, IModel* (*creator)());
+00184 <font class="keyword">static</font> <font class="keywordtype">void</font> registerObs(<font class="keyword">const</font> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> &amp;idTrav, <font class="keyword">const</font> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> &amp;idModel, IObs* (*creator)());
+00186
+00187
+00188 <font class="keyword">public</font>:
+00190
+00191
+00198 <font class="keywordtype">void</font> addTrav(ITrav *v);
+00204 ITrav *getTrav(<font class="keyword">const</font> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> &amp;idTrav) <font class="keyword">const</font>;
+00206
+00207
+00208 <font class="keyword">public</font>:
+00210
+00211
+00228 IModel *createModel(<font class="keyword">const</font> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> &amp;idModel);
+00229
+00236 <font class="keywordtype">void</font> deleteModel(IModel *model);
+00237
+00241 <font class="keywordtype">void</font> validateModels();
+00242
+00244
+00245
+00249 <font class="keywordtype">void</font> release();
+00250
+00251
+00252 <font class="comment">// ******************</font>
+00253 <font class="keyword">private</font>:
+<a name="l00254"></a><a class="code" href="class_NL3D__CMOT__CModelEntry.html">00254</a> <font class="keyword">struct </font>CModelEntry
+00255 {
+<a name="l00256"></a><a class="code" href="class_NL3D__CMOT__CModelEntry.html#m0">00256</a> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> ModelId, BaseModelId;
+00257 IModel* (*Creator)();
+<a name="l00258"></a><a class="code" href="class_NL3D__CMOT__CModelEntry.html#a0">00258</a> <font class="keywordtype">bool</font> operator&lt;(<font class="keyword">const</font> CModelEntry&amp; o)<font class="keyword"> const </font>{<font class="keywordflow">return</font> ModelId&lt;o.ModelId;}
+<a name="l00259"></a><a class="code" href="class_NL3D__CMOT__CModelEntry.html#a1">00259</a> <font class="keywordtype">bool</font> operator==(<font class="keyword">const</font> CModelEntry&amp; o)<font class="keyword"> const </font>{<font class="keywordflow">return</font> ModelId==o.ModelId;}
+<a name="l00260"></a><a class="code" href="class_NL3D__CMOT__CModelEntry.html#a2">00260</a> <font class="keywordtype">bool</font> operator!=(<font class="keyword">const</font> CModelEntry&amp; o)<font class="keyword"> const </font>{<font class="keywordflow">return</font> !(*<font class="keyword">this</font>==o);}
+00261 };
+00262
+<a name="l00263"></a><a class="code" href="class_NL3D__CMOT__CObsEntry.html">00263</a> <font class="keyword">struct </font>CObsEntry
+00264 {
+<a name="l00265"></a><a class="code" href="class_NL3D__CMOT__CObsEntry.html#m0">00265</a> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> TravId, ModelId;
+00266 IObs* (*Creator)();
+<a name="l00267"></a><a class="code" href="class_NL3D__CMOT__CObsEntry.html#a0">00267</a> <font class="keywordtype">bool</font> operator&lt;(<font class="keyword">const</font> CObsEntry&amp; o)<font class="keyword"> const
+</font>00268 <font class="keyword"> </font>{
+00269 <font class="keywordflow">if</font>(TravId!=o.TravId)
+00270 <font class="keywordflow">return</font> TravId&lt;o.TravId;
+00271 <font class="keywordflow">else</font>
+00272 <font class="keywordflow">return</font> ModelId&lt;o.ModelId;
+00273 }
+<a name="l00274"></a><a class="code" href="class_NL3D__CMOT__CObsEntry.html#a1">00274</a> <font class="keywordtype">bool</font> operator==(<font class="keyword">const</font> CObsEntry&amp; o)<font class="keyword"> const
+</font>00275 <font class="keyword"> </font>{
+00276 <font class="keywordflow">return</font> ModelId==o.ModelId &amp;&amp; TravId==o.TravId;
+00277 }
+<a name="l00278"></a><a class="code" href="class_NL3D__CMOT__CObsEntry.html#a2">00278</a> <font class="keywordtype">bool</font> operator!=(<font class="keyword">const</font> CObsEntry&amp; o)<font class="keyword"> const </font>{<font class="keywordflow">return</font> !(*<font class="keyword">this</font>==o);}
+00279 };
+00280
+<a name="l00281"></a><a class="code" href="class_NL3D__CMOT__CTravEntry.html">00281</a> <font class="keyword">struct </font>CTravEntry
+00282 {
+<a name="l00283"></a><a class="code" href="class_NL3D__CMOT__CTravEntry.html#m0">00283</a> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> TravId;
+<a name="l00284"></a><a class="code" href="class_NL3D__CMOT__CTravEntry.html#m1">00284</a> ITrav *Trav;
+00285 };
+00286
+00287 <font class="keyword">private</font>:
+<a name="l00288"></a><a class="code" href="class_NL3D__CMOT.html#o0">00288</a> std::vector&lt;CTravEntry&gt; Traversals;
+<a name="l00289"></a><a class="code" href="class_NL3D__CMOT.html#o1">00289</a> std::set&lt;IModel*&gt; Models;
+00290 <font class="keyword">static</font> std::set&lt;CModelEntry&gt; RegModels;
+00291 <font class="keyword">static</font> std::set&lt;CObsEntry&gt; RegObservers;
+00292
+00293 <font class="keyword">private</font>:
+00294 <font class="comment">// Create an observer, obeying the hierachy/observer system explained in createModel().</font>
+00295 IObs *createObs(<font class="keyword">const</font> ITrav *trav, <font class="keyword">const</font> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> &amp;idModel) <font class="keyword">const</font>;
+00296
+00297 <font class="keyword">protected</font>:
+00298 <font class="comment">// For hertied class, to access observer result of a model.</font>
+00299 IObs *getModelObs(IModel *m, <font class="keyword">const</font> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> &amp;idTrav) <font class="keyword">const</font>;
+00300 };
+00301
+00302
+00303 <font class="comment">// ***************************************************************************
+</font><a name="l00328"></a><a class="code" href="class_NL3D__IModel.html">00328</a> <font class="comment"></font><font class="keyword">class </font>IModel : <font class="keyword">public</font> NLMISC::CRefCount
+00329 {
+00330 <font class="keyword">protected</font>:
+00339 IModel();
+00340
+00347 <font class="keyword">virtual</font> ~IModel();
+00348
+00349 <font class="keyword">public</font>:
+00350
+00352
+00353
+<a name="l00357"></a><a class="code" href="class_NL3D__IModel.html#s2">00357</a> <font class="keyword">enum</font> TDirty
+00358 {
+00359 Dirty=0, <font class="comment">// First bit, to say that the Model is dirty.</font>
+00360 Last
+00361 };
+<a name="l00363"></a><a class="code" href="class_NL3D__IModel.html#m0">00363</a> <a class="code" href="class_NLMISC__CBitSet.html">NLMISC::CBitSet</a> TouchObs;
+<a name="l00365"></a><a class="code" href="class_NL3D__IModel.html#a0">00365</a> <font class="keywordtype">void</font> foul(uint flag)<font class="keyword"> </font>{ TouchObs.<a class="code" href="class_NLMISC__CBitSet.html#a9">set</a>(Dirty); TouchObs.<a class="code" href="class_NLMISC__CBitSet.html#a9">set</a>(flag); }
+00366
+00368 <font class="keywordtype">void</font> validate();
+00369
+00371
+00372
+00373 <font class="keyword">protected</font>:
+00374 <font class="comment">// Observers created and linked by CMOT::createModel()</font>
+<a name="l00375"></a><a class="code" href="class_NL3D__IModel.html#l0">00375</a> <font class="keyword">friend</font> <font class="keyword">class </font>CMOT;
+<a name="l00376"></a><a class="code" href="class_NL3D__IModel.html#l1">00376</a> <font class="keyword">friend</font> <font class="keyword">class </font>IObs;
+<a name="l00377"></a><a class="code" href="class_NL3D__IModel.html#l2">00377</a> <font class="keyword">friend</font> <font class="keyword">class </font>ITrav;
+<a name="l00378"></a><a class="code" href="class_NL3D__IModel.html#t0">00378</a> <font class="keyword">typedef</font> std::map&lt;NLMISC::CClassId, IObs*&gt; CObsMap;
+<a name="l00379"></a><a class="code" href="class_NL3D__IModel.html#n0">00379</a> CObsMap Observers;
+00380
+00381 <font class="comment">// Cache the last observer acceded through getObs().</font>
+<a name="l00382"></a><a class="code" href="class_NL3D__IModel.html#n1">00382</a> <font class="keyword">mutable</font> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> LastClassId;
+<a name="l00383"></a><a class="code" href="class_NL3D__IModel.html#n2">00383</a> <font class="keyword">mutable</font> IObs *LastObs;
+00385 IObs *getObs(<font class="keyword">const</font> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> &amp;idTrav) <font class="keyword">const</font>;
+00386
+00387
+00388 <font class="keyword">protected</font>:
+00389
+00390
+00392
+00393
+<a name="l00405"></a><a class="code" href="class_NL3D__IModel.html#b3">00405</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> update()<font class="keyword">
+</font>00406 <font class="keyword"> </font>{
+00407 }
+00408
+<a name="l00421"></a><a class="code" href="class_NL3D__IModel.html#b4">00421</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> cleanTouch()<font class="keyword">
+</font>00422 <font class="keyword"> </font>{
+00423 TouchObs.<a class="code" href="class_NLMISC__CBitSet.html#a15">clearAll</a>();
+00424 }
+00426
+00427 };
+00428
+00429
+00430 <font class="comment">// ***************************************************************************
+</font><a name="l00453"></a><a class="code" href="class_NL3D__IObs.html">00453</a> <font class="comment"></font><font class="keyword">class </font>IObs : <font class="keyword">public</font> NLMISC::CRefCount
+00454 {
+00455 <font class="keyword">public</font>:
+<a name="l00456"></a><a class="code" href="class_NL3D__IObs.html#m0">00456</a> IModel *Model; <font class="comment">// The model for this observer.</font>
+<a name="l00457"></a><a class="code" href="class_NL3D__IObs.html#m1">00457</a> ITrav *Trav; <font class="comment">// The traversal for this observer.</font>
+00458
+00459 <font class="keyword">public</font>:
+00460 IObs();
+00462 <font class="keyword">virtual</font> ~IObs();
+<a name="l00466"></a><a class="code" href="class_NL3D__IObs.html#a2">00466</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="nel_3dsmax_shared_cpp.html#a2">init</a>()<font class="keyword"> </font>{}
+00467
+00468
+00489
+<a name="l00490"></a><a class="code" href="class_NL3D__IObs.html#a3">00490</a> <font class="keyword">virtual</font> <font class="keywordtype">bool</font> isTreeNode()<font class="keyword"> </font>{<font class="keywordflow">return</font> <font class="keyword">true</font>;}
+00492 <font class="keyword">virtual</font> <font class="keywordtype">void</font> addChild(IObs *son);
+00494 <font class="keyword">virtual</font> <font class="keywordtype">void</font> delChild(IObs *son);
+00499 <font class="keyword">virtual</font> <font class="keywordtype">void</font> addParent(IObs *father);
+00501 <font class="keyword">virtual</font> <font class="keywordtype">void</font> delParent(IObs *father);
+00502
+00504 <font class="keyword">virtual</font> sint getNumChildren() <font class="keyword">const</font>;
+00506 <font class="keyword">virtual</font> IObs *getFirstChild() <font class="keyword">const</font>;
+00508 <font class="keyword">virtual</font> IObs *getNextChild() <font class="keyword">const</font>;
+00509
+00511 <font class="keyword">virtual</font> sint getNumParents() <font class="keyword">const</font>;
+00513 <font class="keyword">virtual</font> IObs *getFirstParent() <font class="keyword">const</font>;
+00515 <font class="keyword">virtual</font> IObs *getNextParent() <font class="keyword">const</font>;
+00517
+00518
+00520
+00521
+00528 <font class="keyword">virtual</font> <font class="keywordtype">void</font> traverse(IObs *caller)=0;
+00530
+00531
+00533
+00534
+<a name="l00541"></a><a class="code" href="class_NL3D__IObs.html#a15">00541</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> update()<font class="keyword">
+</font>00542 <font class="keyword"> </font>{
+00543 }
+00545
+00546
+00548
+00549
+<a name="l00550"></a><a class="code" href="class_NL3D__IObs.html#a16">00550</a> <font class="keywordtype">void</font> traverseSons()<font class="keyword">
+</font>00551 <font class="keyword"> </font>{
+00552 <font class="keywordflow">for</font>(IObs *c= getFirstChild(); c!=NULL; c= getNextChild())
+00553 {
+00554 c-&gt;traverse(<font class="keyword">this</font>);
+00555 }
+00556 }
+00558 IObs *getObs(<font class="keyword">const</font> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> &amp;idTrav) <font class="keyword">const</font>;
+00560
+00561
+00562 <font class="keyword">protected</font>:
+<a name="l00563"></a><a class="code" href="class_NL3D__IObs.html#n0">00563</a> std::set&lt;IObs*&gt; Sons;
+<a name="l00564"></a><a class="code" href="class_NL3D__IObs.html#n1">00564</a> std::set&lt;IObs*&gt; Fathers;
+00565
+<a name="l00566"></a><a class="code" href="class_NL3D__IObs.html#n2">00566</a> <font class="keyword">mutable</font> std::set&lt;IObs*&gt;::const_iterator SonIt;
+<a name="l00567"></a><a class="code" href="class_NL3D__IObs.html#n3">00567</a> <font class="keyword">mutable</font> std::set&lt;IObs*&gt;::const_iterator FatherIt;
+00568
+00569 };
+00570
+00571
+00572
+00573 <font class="comment">// ***************************************************************************
+</font><a name="l00595"></a><a class="code" href="class_NL3D__ITrav.html">00595</a> <font class="comment"></font><font class="keyword">class </font>ITrav : <font class="keyword">public</font> NLMISC::CRefCount
+00596 {
+00597 <font class="keyword">public</font>:
+00598
+00600
+00601
+<a name="l00602"></a><a class="code" href="class_NL3D__ITrav.html#a0">00602</a> ITrav()<font class="keyword"> </font>{Root=NULL;}
+<a name="l00604"></a><a class="code" href="class_NL3D__ITrav.html#a1">00604</a> <font class="keyword">virtual</font> ~ITrav()<font class="keyword"> </font>{Root= NULL;}
+00606
+00608
+00609
+00613 <font class="keyword">virtual</font> IObs *createDefaultObs() <font class="keyword">const</font> =0;
+00615 <font class="keyword">virtual</font> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> getClassId() <font class="keyword">const</font> =0;
+00617
+00618
+00620
+00621
+00629 <font class="keywordtype">void</font> setRoot(IModel *root);
+00631 IModel *<a class="code" href="export_skinning_cpp.html#a2">getRoot</a>() <font class="keyword">const</font>;
+00638 <font class="keywordtype">void</font> link(IModel *m1, IModel *m2) <font class="keyword">const</font>;
+00644 <font class="keywordtype">void</font> unlink(IModel *m1, IModel *m2) <font class="keyword">const</font>;
+00646 <font class="keywordtype">void</font> moveChildren(IModel *parentFrom, IModel *parentTo) <font class="keyword">const</font>;
+00648 <font class="keywordtype">void</font> copyChildren(IModel *parentFrom, IModel *parentTo) <font class="keyword">const</font>;
+00649
+00650
+00652 sint getNumChildren(IModel *m) <font class="keyword">const</font>;
+00654 IModel *getFirstChild(IModel *m) <font class="keyword">const</font>;
+00656 IModel *getNextChild(IModel *m) <font class="keyword">const</font>;
+00657
+00659 sint getNumParents(IModel *m) <font class="keyword">const</font>;
+00661 IModel *getFirstParent(IModel *m) <font class="keyword">const</font>;
+00663 IModel *getNextParent(IModel *m) <font class="keyword">const</font>;
+00664
+00666
+00667
+00668 <font class="keyword">protected</font>:
+00669 <font class="comment">// The root observer.</font>
+<a name="l00670"></a><a class="code" href="class_NL3D__ITrav.html#n0">00670</a> <a class="code" href="class_NLMISC__CRefPtr.html">NLMISC::CRefPtr&lt;IObs&gt;</a> Root;
+00671
+00672 };
+00673
+00674
+00675
+00676
+00677 }
+00678
+00679
+00680 <font class="preprocessor">#endif // NL_MOT_H
+</font>00681 <font class="preprocessor"></font>
+00682 <font class="comment">/* End of mot.h */</font>
+00683
+</div></pre>
+
+<!-- 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>