#include #include "Scene.h" #include "SkelNode.h" #include "Camera.h" #include "MeshNode.h" #include "Light.h" #include "Controller.h" #include "Material.h" //===================================================================================================================================== // Constructor = //===================================================================================================================================== Scene::Scene() { ambientCol = Vec3( 0.1, 0.05, 0.05 )*1; sunPos = Vec3( 0.0, 1.0, -1.0 ) * 50.0; phyWorld = new PhyWorld; } //===================================================================================================================================== // registerNode = //===================================================================================================================================== void Scene::registerNode( SceneNode* node ) { putBackNode( nodes, node ); switch( node->type ) { case SceneNode::NT_LIGHT: putBackNode( lights, static_cast(node) ); break; case SceneNode::NT_CAMERA: putBackNode( cameras, static_cast(node) ); break; case SceneNode::NT_MESH: putBackNode( meshNodes, static_cast(node) ); break; case SceneNode::NT_SKELETON: putBackNode( skelNodes, static_cast(node) ); break; case SceneNode::NT_SKEL_MODEL: // ToDo break; }; } //===================================================================================================================================== // unregisterNode = //===================================================================================================================================== void Scene::unregisterNode( SceneNode* node ) { eraseNode( nodes, node ); switch( node->type ) { case SceneNode::NT_LIGHT: eraseNode( lights, static_cast(node) ); break; case SceneNode::NT_CAMERA: eraseNode( cameras, static_cast(node) ); break; case SceneNode::NT_MESH: eraseNode( meshNodes, static_cast(node) ); break; case SceneNode::NT_SKELETON: eraseNode( skelNodes, static_cast(node) ); break; case SceneNode::NT_SKEL_MODEL: // ToDo break; }; } //===================================================================================================================================== // Register and Unregister controllers = //===================================================================================================================================== void Scene::registerController( Controller* controller ) { DEBUG_ERR( std::find( controllers.begin(), controllers.end(), controller ) != controllers.end() ); controllers.push_back( controller ); } void Scene::unregisterController( Controller* controller ) { Vec::iterator it = std::find( controllers.begin(), controllers.end(), controller ); DEBUG_ERR( it == controllers.end() ); controllers.erase( it ); } //===================================================================================================================================== // updateAllWorldStuff = //===================================================================================================================================== void Scene::updateAllWorldStuff() { DEBUG_ERR( nodes.size() > 1024 ); SceneNode* queue [1024]; uint head = 0, tail = 0; uint num = 0; // put the roots for( uint i=0; iparent == NULL ) queue[tail++] = nodes[i]; // queue push // loop while( head != tail ) // while queue not empty { SceneNode* obj = queue[head++]; // queue pop obj->updateWorldStuff(); ++num; for( uint i=0; ichilds.size(); i++ ) queue[tail++] = obj->childs[i]; } DEBUG_ERR( num != nodes.size() ); } //===================================================================================================================================== // updateAllControllers = //===================================================================================================================================== void Scene::updateAllControllers() { for( Vec::iterator it=controllers.begin(); it!=controllers.end(); it++ ) { (*it)->update( 0.0 ); } }