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 "Texture/MayaTextureManager.h"
00027 #include "Texture/MayaTexture.h"
00028
00029 namespace LampForMaya{
00030
00031
00032 HashMap<String, MayaTexture*>* MayaTextureManager::database_ = NULL;
00033
00034 ArrayList<MayaTexture*>* MayaTextureManager::array_ = NULL;
00035
00036 int MayaTextureManager::referenceCount_ = 0;
00037
00038
00039
00040 void MayaTextureManager::addReference(){
00041 referenceCount_++;
00042 if(referenceCount_ == 1){ initialize(); }
00043 }
00044
00045
00046 void MayaTextureManager::removeReference(){
00047 referenceCount_--;
00048 Assert(referenceCount_ >= 0);
00049 if(referenceCount_ == 0){ finalize(); }
00050 }
00051
00052
00053 void MayaTextureManager::initialize(){
00054
00055 Assert(database_ == NULL);
00056 Assert(array_ == NULL);
00057 database_ = new HashMap<String, MayaTexture*>();
00058 array_ = new ArrayList<MayaTexture*>();
00059 }
00060
00061
00062 void MayaTextureManager::finalize(){
00063
00064 Assert(database_ != NULL);
00065 Assert(array_ != NULL);
00066 clearDatabase();
00067 SafeDelete(array_);
00068 SafeDelete(database_);
00069 }
00070
00071
00072 bool MayaTextureManager::bind(const MObject& textureNode){
00073 if(!textureNode.hasFn(MFn::kFileTexture)){ return false; }
00074 String nodeName = MayaNodeUtility::getName(textureNode);
00075
00076 MayaTexture* texture = database_->get(nodeName);
00077 if(texture == NULL){
00078
00079 texture = new MayaTexture(textureNode, nodeName);
00080
00081 addDatabase(texture);
00082 }
00083
00084 if(!texture->bind()){
00085 removeDatabase(texture);
00086 delete texture;
00087 return false;
00088 }
00089 return true;
00090 }
00091
00092
00093 void MayaTextureManager::addDatabase(MayaTexture* texture){
00094 database_->put(texture->getName(), texture);
00095 array_->add(texture);
00096 }
00097
00098
00099 void MayaTextureManager::removeDatabase(MayaTexture* texture){
00100 MayaTexture* removed = database_->remove(texture->getName());
00101 Assert(texture == removed);
00102 int result = array_->removeByValue(texture);
00103 Assert(result != -1);
00104 }
00105
00106
00107 void MayaTextureManager::clearDatabase(){
00108 if((array_ == NULL) && (database_ == NULL)){ return; }
00109 int count = array_->getCount();
00110 for(int i = 0; i < count; i++){ delete array_->get(i); }
00111 array_->clear();
00112 database_->clear();
00113 }
00114
00115
00116 void MayaTextureManager::renameCallback(MObject& node, void* data){
00117 MayaTexture* texture = (MayaTexture*)data;
00118 removeDatabase(texture);
00119 delete texture;
00120 }
00121
00122
00123 void MayaTextureManager::dirtyCallback(void* data){
00124 MayaTexture* texture = (MayaTexture*)data;
00125 removeDatabase(texture);
00126 delete texture;
00127 }
00128
00129 }
00130