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 "LampBasic.h"
00026 #include "Graphics/SceneFilter/SceneLogicCheckFilter/SceneLogicCheckFilter.h"
00027 #include "Core/Utility/StringTokenizer.h"
00028 #include "Graphics/SceneNode/SceneNodeManager.h"
00029 #include "Graphics/Model/ModelManager.h"
00030 #include "Graphics/Mesh/MeshManager.h"
00031 #include "Graphics/MeshData/MeshDataManager.h"
00032 #include "Graphics/Material/MaterialManager.h"
00033 #include "Graphics/Texture/TextureManager.h"
00034 #include "Graphics/Picture/PictureManager.h"
00035
00036 namespace Lamp{
00037
00038
00039
00040 SceneLogicCheckFilter::SceneLogicCheckFilter(Scene* scene) :
00041 SceneFilterInterface(scene){
00042 }
00043
00044
00045 SceneLogicCheckFilter::~SceneLogicCheckFilter(){
00046 }
00047
00048
00049 bool SceneLogicCheckFilter::filter(const String& command){
00050 StringTokenizer tokenizer_(command);
00051 if(!tokenizer_.hasMoreTokens()){
00052 ErrorOut("SceneLogicCheckFilter::filter() Not found filter name");
00053 return false;
00054 }
00055 String filterName = tokenizer_.getNextToken();
00056 if(filterName != "SceneLogicCheck"){
00057 ErrorOut("SceneLogicCheckFilter::filter() Invalid filter name %s",
00058 filterName.getBytes());
00059 return false;
00060 }
00061 return filterScene();
00062 }
00063
00064
00065 bool SceneLogicCheckFilter::filterScene(){
00066 if(!filterSceneNode()){ return false; }
00067 if(!filterModel()){ return false; }
00068 if(!filterMesh()){ return false; }
00069 if(!filterMeshData()){ return false; }
00070 if(!filterMaterial()){ return false; }
00071 if(!filterTexture()){ return false; }
00072 if(!filterPicture()){ return false; }
00073 return true;
00074 }
00075
00076
00077 bool SceneLogicCheckFilter::filterSceneNode(){
00078
00079 int count = sceneNodeManager_->getCount();
00080 if(count < 1){
00081 ErrorOut("SceneLogicCheckFilter::fiterSceneNode() "
00082 "ルートノードが存在しません %d", count);
00083 return false;
00084 }
00085
00086 SceneNode* rootNode = sceneNodeManager_->get(0);
00087 if(rootNode->getName() != "RootNode"){
00088 ErrorOut("SceneLogicCheckFilter::fiterSceneNode() "
00089 "ルートノードの名前が違います %s", rootNode->getName().getBytes());
00090 return false;
00091 }
00092
00093 for(int i = 1; i < count; i++){
00094 SceneNode* sceneNode = sceneNodeManager_->get(i);
00095
00096 if(sceneNode->getReferenceCount() < 1){
00097 ErrorOut("SceneLogicCheckFilter::fiterSceneNode() "
00098 "参照されていないシーンノードがあります %s %d",
00099 sceneNode->getName().getBytes(),
00100 sceneNode->getReferenceCount());
00101 return false;
00102 }
00103 }
00104 return true;
00105 }
00106
00107
00108 bool SceneLogicCheckFilter::filterModel(){
00109 int count = modelManager_->getCount();
00110
00111 for(int i = 0; i < count; i++){
00112 Model* model = modelManager_->get(i);
00113
00114 if(model->getReferenceCount() < 1){
00115 ErrorOut("SceneLogicCheckFilter::filterModel() "
00116 "参照されていないモデルがあります %s %d",
00117 model->getName().getBytes(), model->getReferenceCount());
00118 return false;
00119 }
00120
00121 if(model->getMeshCount() == 0){
00122 ErrorOut("SceneLogicCheckFilter::filterModel() "
00123 "メッシュを持たないモデルがあります %s",
00124 model->getName().getBytes());
00125 return false;
00126 }
00127 }
00128 return true;
00129 }
00130
00131
00132 bool SceneLogicCheckFilter::filterMesh(){
00133 int count = meshManager_->getCount();
00134
00135 for(int i = 0; i < count; i++){
00136 Mesh* mesh = meshManager_->get(i);
00137
00138 if(mesh->getReferenceCount() < 1){
00139 ErrorOut("SceneLogicCheckFilter::filterMesh() "
00140 "参照されていないメッシュがあります %s %d",
00141 mesh->getName().getBytes(), mesh->getReferenceCount());
00142 return false;
00143 }
00144
00145 if(mesh->getMeshData() == NULL){
00146 ErrorOut("SceneLogicCheckFilter::filterMesh() "
00147 "メッシュデータを持っていないメッシュがあります %s",
00148 mesh->getName().getBytes());
00149 return false;
00150 }
00151
00152 if(mesh->getMaterial() == NULL){
00153 ErrorOut("SceneLogicCheckFilter::filterMesh() "
00154 "マテリアルを持っていないメッシュがあります %s",
00155 mesh->getName().getBytes());
00156 return false;
00157 }
00158 }
00159 return true;
00160 }
00161
00162
00163 bool SceneLogicCheckFilter::filterMeshData(){
00164 int count = meshDataManager_->getCount();
00165
00166 for(int i = 0; i < count; i++){
00167 MeshData* meshData = meshDataManager_->get(i);
00168
00169 if(meshData->getReferenceCount() < 1){
00170 ErrorOut("SceneLogicCheckFilter::filterMeshData() "
00171 "参照されていないメッシュデータがあります %s %d",
00172 meshData->getName().getBytes(), meshData->getReferenceCount());
00173 return false;
00174 }
00175 }
00176 return true;
00177 }
00178
00179
00180 bool SceneLogicCheckFilter::filterMaterial(){
00181 int count = materialManager_->getCount();
00182
00183 for(int i = 0; i < count; i++){
00184 Material* material = materialManager_->get(i);
00185
00186 if(material->getReferenceCount() < 1){
00187 ErrorOut("SceneLogicCheckFilter::filterMaterial() "
00188 "参照されていないマテリアルがあります %s %d",
00189 material->getName().getBytes(), material->getReferenceCount());
00190 return false;
00191 }
00192 }
00193
00194 return true;
00195 }
00196
00197
00198 bool SceneLogicCheckFilter::filterTexture(){
00199 int count = textureManager_->getCount();
00200
00201 for(int i = 0; i < count; i++){
00202 Texture* texture = textureManager_->get(i);
00203
00204 if(texture->getReferenceCount() < 1){
00205 ErrorOut("SceneLogicCheckFilter::filterTexture() "
00206 "参照されていないテクスチャがあります %s %d",
00207 texture->getName().getBytes(), texture->getReferenceCount());
00208 return false;
00209 }
00210
00211 if(texture->getPictureCount() <= 0){
00212 ErrorOut("SceneLogicCheckFilter::filterTexture() "
00213 "ピクチャを持っていないテクスチャがあります %s",
00214 texture->getName().getBytes());
00215 return false;
00216 }
00217 }
00218 return true;
00219 }
00220
00221
00222 bool SceneLogicCheckFilter::filterPicture(){
00223 int count = pictureManager_->getCount();
00224
00225 for(int i = 0; i < count; i++){
00226 Picture* picture = pictureManager_->get(i);
00227
00228 if(picture->getReferenceCount() < 1){
00229 ErrorOut("SceneLogicCheckFilter::filterPicture() "
00230 "参照されていないピクチャがあります %s %d",
00231 picture->getName().getBytes(), picture->getReferenceCount());
00232 return false;
00233 }
00234
00235 DimensionI size = picture->getSize();
00236 if((!Math::checkPow2(size.width)) || (!Math::checkPow2(size.height))){
00237 ErrorOut("SceneLogicCheckFilter::filterPicture() "
00238 "サイズが2の累乗でないピクチャがあります %s %s",
00239 picture->getName().getBytes(), size.toString().getBytes());
00240 return false;
00241 }
00242 }
00243 return true;
00244 }
00245
00246 }
00247