00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "System/stdafx.h"
00026 #include "Translator/SceneNode/TranslationSceneNodeManager.h"
00027
00028 namespace LampForMaya{
00029
00030
00031
00032 TranslationSceneNodeManager::TranslationSceneNodeManager() :
00033 database_(256, 0.75f), array_(256){
00034 }
00035
00036
00037 TranslationSceneNodeManager::~TranslationSceneNodeManager(){
00038 Assert(database_.getCount() == 0);
00039 Assert(array_.getCount() == 0);
00040 if(getCount() != 0){ clear(); }
00041 }
00042
00043
00044 bool TranslationSceneNodeManager::collectSceneNodes(){
00045 MStatus result;
00046 MItDag dagIterator(MItDag::kBreadthFirst, MFn::kInvalid, &result);
00047 MayaStatusCheck(result);
00048 MDagPath dagPath;
00049 for( ; !dagIterator.isDone(); dagIterator.next()){
00050 result = dagIterator.getPath(dagPath);
00051 MayaStatusCheck(result);
00052 MFnDagNode dagNode(dagPath, &result);
00053 MayaStatusCheck(result);
00054
00055 if(!checkValidDagNode(dagPath)){ continue; }
00056
00057 u_int instanceNumber = dagPath.instanceNumber(&result);
00058 MayaStatusCheck(result);
00059 if(instanceNumber > 0){ continue; }
00060
00061
00062 if(!dagPath.hasFn(MFn::kTransform)){ continue; }
00063
00064 MString dagName = dagNode.name(&result);
00065 MayaStatusCheck(result);
00066
00067 if(dagName == "groundPlane_transform"){ continue; }
00068
00069 if(!analysisSceneNode(dagPath)){ return false; }
00070 }
00071 return true;
00072 }
00073
00074
00075 bool TranslationSceneNodeManager::checkValidDagNode(const MDagPath& dagPath){
00076
00077
00078 MStatus result;
00079 MFnDagNode dagNode(dagPath, &result);
00080 MayaStatusCheck(result);
00081
00082 if(dagNode.isIntermediateObject()){ return false; }
00083
00084 if(dagPath.hasFn(MFn::kCamera)){ return false; }
00085
00086 if(dagPath.hasFn(MFn::kLocator)){ return false; }
00087
00088 if(dagPath.hasFn(MFn::kLookAt)){ return false; }
00089
00090 if(dagPath.hasFn(MFn::kJoint)){ return false; }
00091
00092 if(dagPath.hasFn(MFn::kIkEffector)){ return false; }
00093
00094 if(dagPath.hasFn(MFn::kIkHandle)){ return false; }
00095
00096 if(dagPath.hasFn(MFn::kNurbsSurface)){ return false; }
00097
00098 if(dagPath.hasFn(MFn::kNurbsCurve)){ return false; }
00099
00100 if(dagPath.hasFn(MFn::kSubdiv)){ return false; }
00101
00102 if(dagPath.hasFn(MFn::kParticle)){ return false; }
00103
00104 if(dagPath.hasFn(MFn::kLattice)){ return false; }
00105
00106 if(dagPath.hasFn(MFn::kFluid)){ return false; }
00107
00108 if(dagPath.hasFn(MFn::kField)){ return false; }
00109 return true;
00110 }
00111
00112
00113 bool TranslationSceneNodeManager::analysisSceneNode(MDagPath dagPath){
00114 MStatus result;
00115 MFnDagNode dagNode(dagPath, &result);
00116 MayaStatusCheck(result);
00117
00118 String sceneNodeName = dagNode.name(&result).asChar();
00119 MayaStatusCheck(result);
00120 TranslationSceneNode* exist = database_.get(sceneNodeName);
00121 if(exist != NULL){
00122 MayaErrorOut(String("TranslationSceneNodeManager::analysisSceneNode() "
00123 "名前が重複しています ") + sceneNodeName);
00124 return false;
00125 }
00126 TranslationSceneNode* sceneNode =
00127 new TranslationSceneNode(dagPath, sceneNodeName);
00128 if(!sceneNode->analyze()){
00129 delete sceneNode;
00130 return false;
00131 }
00132 database_.put(sceneNodeName, sceneNode);
00133 array_.add(sceneNode);
00134 return true;
00135 }
00136
00137
00138 bool TranslationSceneNodeManager::compilePivot(
00139 TranslationModelManager* modelManager){
00140
00141 for(int i = 0; i < getCount(); i++){
00142 if(!get(i)->compilePivot(this, modelManager)){ return false; }
00143 }
00144 return true;
00145 }
00146
00147
00148 bool TranslationSceneNodeManager::collectAnimations(){
00149 for(int i = 0; i < getCount(); i++){
00150 if(!get(i)->analyzeAnimation()){ return false; }
00151 }
00152 return true;
00153 }
00154
00155
00156 bool TranslationSceneNodeManager::convertToLamp(Scene* scene) const{
00157
00158 for(int i = 0; i < getCount(); i++){
00159 if(!get(i)->convertToLamp(scene)){ return false; }
00160 }
00161
00162 for(int i = 0; i < getCount(); i++){
00163 if(!get(i)->linkConnect(scene)){ return false; }
00164 }
00165 return true;
00166 }
00167
00168
00169 bool TranslationSceneNodeManager::convertAnimation(
00170 AnimationManager* animationManager, AnimationSet* animationSet){
00171 for(int i = 0; i < getCount(); i++){
00172 if(!get(i)->convertAnimation(animationManager, animationSet)){
00173 return false;
00174 }
00175 }
00176 return true;
00177 }
00178
00179
00180 int TranslationSceneNodeManager::clear(){
00181 int result = getCount();
00182
00183 for(int i = 0; i < result; i++){ delete array_.get(i); }
00184 array_.clear();
00185 database_.clear();
00186 return result;
00187 }
00188
00189 }
00190