00001 #include "SimpleX3DGLScene.h" 00002 #include "DefaultLoader.h" 00003 #include "BboxUpdater.h" 00004 #include "GLConverter.h" 00005 #include "GLUpdater.h" 00006 #include "GLRenderer.h" 00007 #include "MemReleaser.h" 00008 #include "Scene.h" 00009 #include "GLScene.h" 00010 #include "Bbox.h" 00011 00012 #include <iostream> 00013 #include <time.h> 00014 00015 using namespace std; 00016 using namespace X3DTK; 00017 00018 SimpleX3DGLScene::SimpleX3DGLScene() 00019 : s(0), gs(0) 00020 { 00021 _loader = new DefaultLoader(); 00022 _bboxupdater = new BboxUpdater(); 00023 _converter = new GLConverter(); 00024 _renderer = new GLRenderer(); 00025 _releaser = new MemReleaser(); 00026 } 00027 00028 SimpleX3DGLScene::~SimpleX3DGLScene() 00029 { 00030 _releaser->release(s); 00031 _releaser->release(gs); 00032 s = 0; 00033 gs = 0; 00034 00035 delete _loader; 00036 delete _bboxupdater; 00037 delete _converter; 00038 delete _renderer; 00039 delete _releaser; 00040 } 00041 00042 void SimpleX3DGLScene::setLoader(X3DLoader *loader) 00043 { 00044 _loader = loader; 00045 } 00046 00047 void SimpleX3DGLScene::setBboxUpdater(X3DBboxUpdater *bboxUpdater) 00048 { 00049 _bboxupdater = bboxUpdater; 00050 } 00051 00052 void SimpleX3DGLScene::setGLCreator(X3DGLCreator *creator) 00053 { 00054 _converter->setGLCreator(creator); 00055 } 00056 00057 void SimpleX3DGLScene::setGLUpdater(X3DGLUpdater *updater) 00058 { 00059 _converter->setGLUpdater(updater); 00060 } 00061 00062 void SimpleX3DGLScene::setGLRenderer(X3DGLRenderer *renderer) 00063 { 00064 _renderer = renderer; 00065 } 00066 00067 void SimpleX3DGLScene::setMemReleaser(X3DMemReleaser *memReleaser) 00068 { 00069 _releaser = memReleaser; 00070 } 00071 00072 void SimpleX3DGLScene::load(const char *file) 00073 { 00074 _releaser->release(s); 00075 _releaser->release(gs); 00076 00077 cout << "loading..." << endl; 00078 clock_t begin = clock(); 00079 00080 s = _loader->load(file); 00081 00082 clock_t end = clock(); 00083 cout << "loaded in " << (end - begin)/1000 << endl; 00084 00085 _bboxupdater->update(s, true); 00086 00087 if (s != 0) 00088 { 00089 SFVec3f center = s->getBboxCenter(); 00090 SFVec3f size = s->getBboxSize(); 00091 00092 SFVec3f A = center + 0.5f*size; 00093 SFVec3f B = center - 0.5f*size; 00094 00095 if (A.x < B.x) 00096 { 00097 min.x = A.x; 00098 max.x = B.x; 00099 } 00100 else 00101 { 00102 min.x = B.x; 00103 max.x = A.x; 00104 } 00105 00106 if (A.y < B.y) 00107 { 00108 min.y = A.y; 00109 max.y = B.y; 00110 } 00111 else 00112 { 00113 min.y = B.y; 00114 max.y = A.y; 00115 } 00116 00117 if (A.z < B.z) 00118 { 00119 min.z = A.z; 00120 max.z = B.z; 00121 } 00122 else 00123 { 00124 min.z = B.z; 00125 max.z = A.z; 00126 } 00127 00128 gs = _converter->convert(s); 00129 } 00130 } 00131 00132 void SimpleX3DGLScene::draw() 00133 { 00134 _renderer->render(gs); 00135 } 00136 00137 void SimpleX3DGLScene::release() 00138 { 00139 _releaser->release(s); 00140 _releaser->release(gs); 00141 s = 0; 00142 gs = 0; 00143 }