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/Renderer/InformationRenderer.h"
00027 #include "Graphics/PrimitiveRenderer/PrimitiveRenderer.h"
00028 #include "Graphics/PrimitiveRenderer/PrimitiveDrawRequestBuilder.h"
00029 #include "Graphics/Scene/Scene.h"
00030 #include "Graphics/SceneNode/SceneNodeManager.h"
00031 #include "Graphics/Model/CharacterModel.h"
00032 #include "Graphics/Mesh/Mesh.h"
00033
00034 namespace Lamp{
00035
00036
00037 const Color4c InformationRenderer::meshBoundingColor_ = Color4c(0, 255, 0, 64);
00038
00039 const Color4c InformationRenderer::boneColor_ = Color4c(0, 255, 255, 255);
00040
00041
00042
00043
00044
00045 InformationRenderer::InformationRenderer() : scene_(NULL), camera_(NULL),
00046 isDrawnGrid_(false), isDrawnAxis_(false), isDrawnMeshBounding_(false),
00047 isDrawnBone_(false){
00048 renderer_ = new PrimitiveRenderer;
00049 }
00050
00051
00052 InformationRenderer::~InformationRenderer(){
00053 SafeDelete(renderer_);
00054 }
00055
00056
00057
00058
00059 void InformationRenderer::renderingSetup(Scene* scene){
00060 Assert(scene != NULL);
00061 scene_ = scene;
00062 camera_ = scene_->getCurrentCamera();
00063 Assert(camera_ != NULL);
00064
00065 if(isDrawnMeshBounding() || isDrawnBone()){
00066 scene_->getMeshList(&meshList_, camera_);
00067 }
00068
00069 if(isDrawnGrid()){ setupGrid(); }
00070
00071 if(isDrawnAxis()){ setupAxis(); }
00072
00073 if(isDrawnMeshBounding()){ setupMeshBounding(); }
00074
00075 if(isDrawnBone()){ setupBone(); }
00076
00077 meshList_.clear();
00078 }
00079
00080
00081 void InformationRenderer::setupGrid(){
00082 renderer_->requestGrid(Vector3(100.f, 100.f, 100.f),
00083 Vector3::zero, Vector3::zero, Color4c::white, true);
00084 }
00085
00086
00087 void InformationRenderer::setupAxis(){
00088 SceneNodeManager* sceneNodeManager = scene_->getSceneNodeManager();
00089 int sceneNodeCount = sceneNodeManager->getCount();
00090 for(int i = 0; i < sceneNodeCount; i++){
00091 SceneNode* sceneNode = sceneNodeManager->get(i);
00092 if(!sceneNode->isGlobalEnabled()){ continue; }
00093 renderer_->requestAxis(sceneNode->getWorldMatrix(),
00094 Color4c::white, false);
00095 }
00096 }
00097
00098
00099 void InformationRenderer::setupMeshBounding(){
00100 int meshCount = meshList_.getCount();
00101 for(int i = 0; i < meshCount; i++){
00102 Mesh* mesh = meshList_[i];
00103 const Sphere& boundingSphere = mesh->getWorldBoundingSphere();
00104 float radius = boundingSphere.getRadius();
00105 renderer_->requestSphere(Vector3(radius, radius, radius),
00106 Vector3::zero, boundingSphere.getCenter(), meshBoundingColor_);
00107 }
00108 }
00109
00110
00111 void InformationRenderer::setupBone(){
00112
00113 ArrayList<CharacterModel*> modelList_;
00114 int meshCount = meshList_.getCount();
00115 for(int i = 0; i < meshCount; i++){
00116
00117 CharacterModel* model = meshList_[i]->getParent()->castCharacterModel();
00118 if(model == NULL){ continue; }
00119
00120 int modelCount = modelList_.getCount();
00121 for(int j = 0; j < modelCount; j++){
00122 if(modelList_[j] == model){
00123 model = NULL;
00124 break;
00125 }
00126 }
00127 if(model == NULL){ continue; }
00128 modelList_.add(model);
00129 PrimitiveDrawRequest primitive;
00130 PrimitiveDrawRequestBuilder::buildBone(&primitive, model);
00131 renderer_->request(primitive, model->getParent()->getWorldMatrix(),
00132 boneColor_, false);
00133 }
00134 }
00135
00136
00137 void InformationRenderer::rendering(){
00138 Assert(scene_ != NULL);
00139 Assert(camera_ != NULL);
00140 renderer_->render(camera_);
00141 }
00142
00143 }
00144