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/CalculateBoundingSphereFilter/\
00027 CalculateBoundingSphereFilter.h"
00028 #include "Core/Utility/StringTokenizer.h"
00029 #include "Graphics/Mesh/MeshManager.h"
00030
00031 namespace Lamp{
00032
00033
00034
00035 CalculateBoundingSphereFilter::CalculateBoundingSphereFilter(Scene* scene) :
00036 SceneFilterInterface(scene), characterScale_(1.f){
00037 }
00038
00039
00040 CalculateBoundingSphereFilter::~CalculateBoundingSphereFilter(){
00041 }
00042
00043
00044 bool CalculateBoundingSphereFilter::filter(const String& command){
00045 StringTokenizer tokenizer_(command);
00046 if(!tokenizer_.hasMoreTokens()){
00047 ErrorOut("CalculateBoundingSphereFilter::filter() "
00048 "Not found filter name");
00049 return false;
00050 }
00051 String filterName = tokenizer_.getNextToken();
00052 if(filterName != "CalculateBoundingSphere"){
00053 ErrorOut("CalculateBoundingSphereFilter::filter() "
00054 "Invalid filter name %s",
00055 filterName.getBytes());
00056 return false;
00057 }
00058
00059 while(tokenizer_.hasMoreTokens()){
00060 String token = tokenizer_.getNextToken();
00061
00062 if(token == "characterScale"){
00063 if(!tokenizer_.hasMoreTokens()){
00064 ErrorOut("CalculateBoundingBoxFilter::filter() "
00065 "Not found characterScale value");
00066 return false;
00067 }
00068 String characterScaleString = tokenizer_.getNextToken();
00069 if(!characterScaleString.parseFloat(&characterScale_)){
00070 ErrorOut(String("CalculateBoundingBoxFilter::filter() "
00071 "Invalid characterScale value ") + characterScaleString);
00072 return false;
00073 }
00074 }else{
00075 ErrorOut(String("CalculateBoundingBoxFilter::filter() "
00076 "Unknown option ") + token);
00077 return false;
00078 }
00079 }
00080 return filterScene();
00081 }
00082
00083
00084 bool CalculateBoundingSphereFilter::filterScene(){
00085 if(!filterMesh()){ return false; }
00086 return true;
00087 }
00088
00089
00090 bool CalculateBoundingSphereFilter::filterMesh(){
00091 int count = meshManager_->getCount();
00092
00093 for(int i = 0; i < count; i++){
00094 if(!filterMesh(meshManager_->get(i))){ return false; }
00095 }
00096 return true;
00097 }
00098
00099
00100 bool CalculateBoundingSphereFilter::filterMesh(Mesh* mesh){
00101
00102 Sphere boundingSphere(mesh->getBoundingBox().getCenter(), 0.f);
00103 int vertexCount = mesh->getVertexCount();
00104 for(int i = 0; i < vertexCount; i++){
00105 boundingSphere.append(mesh->getPosition(i));
00106 }
00107
00108 if((characterScale_ != 1.f) && mesh->isCharacterMesh()){
00109 boundingSphere.setRadius(boundingSphere.getRadius() * characterScale_);
00110 }
00111 mesh->setBoundingSphere(boundingSphere);
00112 return true;
00113 }
00114
00115 }
00116