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/Material/TranslationMaterialManager.h"
00027 #include "Translator/Material/TranslationBasicMaterial.h"
00028 #include "Material/Basic/LampBasicMaterial.h"
00029
00030 namespace LampForMaya{
00031
00032
00033
00034 TranslationMaterialManager::TranslationMaterialManager() :
00035 database_(256, 0.75f), array_(256){
00036 }
00037
00038
00039 TranslationMaterialManager::~TranslationMaterialManager(){
00040 Assert(database_.getCount() == 0);
00041 Assert(array_.getCount() == 0);
00042 if(getCount() != 0){ clear(); }
00043 }
00044
00045
00046 bool TranslationMaterialManager::collectMaterials(){
00047 MStatus result;
00048
00049
00050 MItDependencyNodes dependencyNodeIterator(MFn::kInvalid, &result);
00051 MayaStatusCheck(result);
00052 for( ; !dependencyNodeIterator.isDone(); dependencyNodeIterator.next()){
00053 MObject materialObject = dependencyNodeIterator.item(&result);
00054 MayaStatusCheck(result);
00055 if(!analysisMaterial(materialObject)){ return false; }
00056 }
00057 return true;
00058 }
00059
00060
00061 bool TranslationMaterialManager::analysisMaterial(const MObject& materialObject){
00062 MStatus result;
00063 MFnDependencyNode materialNode(materialObject, &result);
00064 MayaStatusCheck(result);
00065
00066 MTypeId typeID = materialNode.typeId(&result);
00067 MayaStatusCheck(result);
00068
00069 if(typeID != LampBasicMaterial::id){
00070 return true;
00071 }
00072
00073 String materialName = materialNode.name(&result).asChar();
00074 MayaStatusCheck(result);
00075 TranslationMaterial* exist = database_.get(materialName);
00076 if(exist != NULL){
00077 MayaErrorOut(String("TranslationMaterialManager::analysisMaterial() "
00078 "名前が重複しています ") + materialName);
00079 return false;
00080 }
00081
00082 TranslationMaterial* material = NULL;
00083 if(typeID == LampBasicMaterial::id){
00084 material = new TranslationBasicMaterial(materialObject, materialName);
00085 }
00086 if(!material->analyze()){
00087 delete material;
00088 return false;
00089 }
00090 database_.put(materialName, material);
00091 array_.add(material);
00092 return true;
00093 }
00094
00095
00096 bool TranslationMaterialManager::convertToLamp(Scene* scene) const{
00097 for(int i = 0; i < getCount(); i++){
00098 if(!get(i)->convertToLamp(scene)){ return false; }
00099 }
00100 return true;
00101 }
00102
00103
00104 int TranslationMaterialManager::clear(){
00105 int result = getCount();
00106
00107 for(int i = 0; i < result; i++){ delete array_.get(i); }
00108 array_.clear();
00109 database_.clear();
00110 return result;
00111 }
00112
00113 }
00114