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/CalculateBoundingBoxFilter/\
00027 CalculateBoundingBoxFilter.h"
00028 #include "Core/Utility/StringTokenizer.h"
00029 #include "Graphics/Mesh/MeshManager.h"
00030
00031 namespace Lamp{
00032
00033
00034
00035 CalculateBoundingBoxFilter::CalculateBoundingBoxFilter(Scene* scene) :
00036 SceneFilterInterface(scene), characterScale_(1.f){
00037 }
00038
00039
00040 CalculateBoundingBoxFilter::~CalculateBoundingBoxFilter(){
00041 }
00042
00043
00044 bool CalculateBoundingBoxFilter::filter(const String& command){
00045 StringTokenizer tokenizer_(command);
00046 if(!tokenizer_.hasMoreTokens()){
00047 ErrorOut("CalculateBoundingBoxFilter::filter() Not found filter name");
00048 return false;
00049 }
00050 String filterName = tokenizer_.getNextToken();
00051 if(filterName != "CalculateBoundingBox"){
00052 ErrorOut("CalculateBoundingBoxFilter::filter() Invalid filter name %s",
00053 filterName.getBytes());
00054 return false;
00055 }
00056
00057 while(tokenizer_.hasMoreTokens()){
00058 String token = tokenizer_.getNextToken();
00059
00060 if(token == "characterScale"){
00061 if(!tokenizer_.hasMoreTokens()){
00062 ErrorOut("CalculateBoundingBoxFilter::filter() "
00063 "Not found characterScale value");
00064 return false;
00065 }
00066 String characterScaleString = tokenizer_.getNextToken();
00067 if(!characterScaleString.parseFloat(&characterScale_)){
00068 ErrorOut(String("CalculateBoundingBoxFilter::filter() "
00069 "Invalid characterScale value ") + characterScaleString);
00070 return false;
00071 }
00072 }else{
00073 ErrorOut(String("CalculateBoundingBoxFilter::filter() "
00074 "Unknown option ") + token);
00075 return false;
00076 }
00077 }
00078 return filterScene();
00079 }
00080
00081
00082 bool CalculateBoundingBoxFilter::filterScene(){
00083 if(!filterMesh()){ return false; }
00084 return true;
00085 }
00086
00087
00088 bool CalculateBoundingBoxFilter::filterMesh(){
00089 int count = meshManager_->getCount();
00090
00091 for(int i = 0; i < count; i++){
00092 if(!filterMesh(meshManager_->get(i))){ return false; }
00093 }
00094 return true;
00095 }
00096
00097
00098 bool CalculateBoundingBoxFilter::filterMesh(Mesh* mesh){
00099 int vertexCount = mesh->getVertexCount();
00100 if(vertexCount == 0){
00101 ErrorOut("CalculateBoundingBoxFilter::filterMesh() "
00102 "頂点を持たないメッシュデータがあります %s",
00103 mesh->getName().getBytes());
00104 return false;
00105 }
00106 AxisAlignedBox boundingBox(mesh->getPosition(0), mesh->getPosition(0));
00107 for(int i = 1; i < vertexCount; i++){
00108 boundingBox.merge(mesh->getPosition(i));
00109 }
00110
00111 if((characterScale_ != 1.f) && mesh->isCharacterMesh()){
00112 Vector3 minimum = boundingBox.getMinimum();
00113 Vector3 maximum = boundingBox.getMaximum();
00114 Vector3 center = boundingBox.getCenter();
00115 minimum = center + (minimum - center) * characterScale_;
00116 maximum = center + (maximum - center) * characterScale_;
00117 boundingBox.set(minimum, maximum);
00118 }
00119 mesh->setBoundingBox(boundingBox);
00120 return true;
00121 }
00122
00123 }
00124