diff options
Diffstat (limited to 'docs/doxygen/nel/mot_h-source.html')
-rw-r--r-- | docs/doxygen/nel/mot_h-source.html | 470 |
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> <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.2 on Wed May 30 22:01:14 2001 --> +<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>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 <vector></font> +00035 <font class="preprocessor">#include <set></font> +00036 <font class="preprocessor">#include <map></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 & CULL & LIGHT. +</font>00092 <font class="comment">CInstance: instance d'un mesh quelconque. Pass: NODE & CULL & LIGHT & RENDER +</font>00093 <font class="comment">CCluster: Un cluster représente un partitionnement du monde. NODE & CULL +</font>00094 <font class="comment">CPortal: un portal est un lien entre 2 clusters. NODE & 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. => 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> &idModel, <font class="keyword">const</font> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> &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> &idTrav, <font class="keyword">const</font> <a class="code" href="class_NLMISC__CClassId.html">NLMISC::CClassId</a> &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> &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> &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<(<font class="keyword">const</font> CModelEntry& o)<font class="keyword"> const </font>{<font class="keywordflow">return</font> ModelId<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& 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& 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<(<font class="keyword">const</font> CObsEntry& 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<o.TravId; +00271 <font class="keywordflow">else</font> +00272 <font class="keywordflow">return</font> ModelId<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& o)<font class="keyword"> const +</font>00275 <font class="keyword"> </font>{ +00276 <font class="keywordflow">return</font> ModelId==o.ModelId && 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& 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<CTravEntry> Traversals; +<a name="l00289"></a><a class="code" href="class_NL3D__CMOT.html#o1">00289</a> std::set<IModel*> Models; +00290 <font class="keyword">static</font> std::set<CModelEntry> RegModels; +00291 <font class="keyword">static</font> std::set<CObsEntry> 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> &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> &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<NLMISC::CClassId, IObs*> 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> &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->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> &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<IObs*> Sons; +<a name="l00564"></a><a class="code" href="class_NL3D__IObs.html#n1">00564</a> std::set<IObs*> Fathers; +00565 +<a name="l00566"></a><a class="code" href="class_NL3D__IObs.html#n2">00566</a> <font class="keyword">mutable</font> std::set<IObs*>::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<IObs*>::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<IObs></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> </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> |