| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- #include <algorithm>
- #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<Light*>(node) );
- break;
- case SceneNode::NT_CAMERA:
- putBackNode( cameras, static_cast<Camera*>(node) );
- break;
- case SceneNode::NT_MESH:
- putBackNode( meshNodes, static_cast<MeshNode*>(node) );
- break;
- case SceneNode::NT_SKELETON:
- putBackNode( skelNodes, static_cast<SkelNode*>(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<Light*>(node) );
- break;
- case SceneNode::NT_CAMERA:
- eraseNode( cameras, static_cast<Camera*>(node) );
- break;
- case SceneNode::NT_MESH:
- eraseNode( meshNodes, static_cast<MeshNode*>(node) );
- break;
- case SceneNode::NT_SKELETON:
- eraseNode( skelNodes, static_cast<SkelNode*>(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<Controller*>::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; i<nodes.size(); i++ )
- if( nodes[i]->parent == 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; i<obj->childs.size(); i++ )
- queue[tail++] = obj->childs[i];
- }
- DEBUG_ERR( num != nodes.size() );
- }
- //=====================================================================================================================================
- // updateAllControllers =
- //=====================================================================================================================================
- void Scene::updateAllControllers()
- {
- for( Vec<Controller*>::iterator it=controllers.begin(); it!=controllers.end(); it++ )
- {
- (*it)->update( 0.0 );
- }
- }
|