#include "SimpleMeshGLScene.h" #include #include #include #include #include #include using namespace std; namespace X3DTK { SimpleMeshGLScene::SimpleMeshGLScene() : scene(0), meshScene(0) { _loader = Singleton::getInstance(); _bboxupdater = Singleton::getInstance(); _builder = Singleton::getInstance(); _drawer = Singleton::getInstance(); _normalUpdater = Singleton::getInstance(); _releaser = Singleton::getInstance(); } SimpleMeshGLScene::~SimpleMeshGLScene() { _releaser->release(scene); _releaser->release(meshScene); scene = 0; meshScene = 0; } void SimpleMeshGLScene::load(const char *file) { loadFile(file); computeBBox(); buildMeshScene(); } void SimpleMeshGLScene::drawMesh(bool selection) { _drawer->drawMesh(meshScene, selection); } void SimpleMeshGLScene::drawSelected() { _drawer->drawSelected(); } void SimpleMeshGLScene::release() { _releaser->release(scene); _releaser->release(meshScene); scene = 0; meshScene = 0; } void SimpleMeshGLScene::loadFile(const char *file) { _releaser->release(scene); _releaser->release(meshScene); scene = 0; meshScene = 0; scene = _loader->load(file, true); } void SimpleMeshGLScene::computeBBox() { _bboxupdater->update(scene, true); if (scene != 0) { SFVec3f center = scene->getBBoxCenter(); SFVec3f size = scene->getBBoxSize(); SFVec3f A = center + 0.5f*size; SFVec3f B = center - 0.5f*size; if (A.x < B.x) { min.x = A.x; max.x = B.x; } else { min.x = B.x; max.x = A.x; } if (A.y < B.y) { min.y = A.y; max.y = B.y; } else { min.y = B.y; max.y = A.y; } if (A.z < B.z) { min.z = A.z; max.z = B.z; } else { min.z = B.z; max.z = A.z; } } } void SimpleMeshGLScene::buildMeshScene() { meshScene = _builder->build(scene); _normalUpdater->updateNormals(meshScene); } }