00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "std3d.h"
00027
00028 #include "3d/anim_detail_trav.h"
00029 #include "3d/hrc_trav.h"
00030 #include "3d/transform.h"
00031 #include "3d/skeleton_model.h"
00032 #include "nel/misc/hierarchical_timer.h"
00033 #include "nel/misc/debug.h"
00034
00035
00036 using namespace NLMISC;
00037
00038
00039 namespace NL3D
00040 {
00041
00042
00043
00044 IObs *CAnimDetailTrav::createDefaultObs() const
00045 {
00046 return new CDefaultAnimDetailObs;
00047 }
00048
00049
00050 CAnimDetailTrav::CAnimDetailTrav()
00051 {
00052 CurrentDate=0;
00053
00054 _VisibleList.reserve(1024);
00055 }
00056
00057
00058 void CAnimDetailTrav::clearVisibleList()
00059 {
00060 _VisibleList.clear();
00061 }
00062
00063
00064 void CAnimDetailTrav::addVisibleObs(CTransformAnimDetailObs *obs)
00065 {
00066 _VisibleList.push_back(obs);
00067 }
00068
00069
00070
00071 void CAnimDetailTrav::traverse()
00072 {
00073 H_AUTO( NL3D_TravAnimDetail );
00074
00075
00076 CurrentDate++;
00077
00078
00079 uint nObs= _VisibleList.size();
00080 for(uint i=0; i<nObs; i++)
00081 {
00082 CTransformAnimDetailObs *detailObs= _VisibleList[i];
00083
00084 CTransformHrcObs *hrcObs= safe_cast<CTransformHrcObs*>(detailObs->HrcObs);
00085 if(hrcObs->_AncestorSkeletonModel)
00086 {
00087
00088
00089 continue;
00090 }
00091 else
00092 {
00093
00094 CTransform *model= safe_cast<CTransform*>(detailObs->Model);
00095
00096
00097
00098 if( model->isSkeleton() )
00099 {
00100
00101 traverseHrcRecurs(detailObs);
00102 }
00103 else
00104 {
00105
00106 detailObs->traverse(NULL);
00107 }
00108 }
00109 }
00110 }
00111
00112
00113
00114 void CAnimDetailTrav::traverseHrcRecurs(IBaseAnimDetailObs *adObs)
00115 {
00116
00117 adObs->traverse(NULL);
00118
00119
00120
00121
00122 IBaseHrcObs *hrcObs= adObs->HrcObs;
00123
00124 IBaseHrcObs *sonHrcObs= static_cast<IBaseHrcObs*>(hrcObs->getFirstChild());
00125 while( sonHrcObs )
00126 {
00127
00128 traverseHrcRecurs(sonHrcObs->AnimDetailObs);
00129
00130
00131 sonHrcObs= static_cast<IBaseHrcObs*>(hrcObs->getNextChild());
00132 }
00133 }
00134
00135
00136 }