rayzor

diff src/scene.cc @ 12:d94a69933a71

lots of stuff, can't remember
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 12 Apr 2014 23:28:24 +0300
parents a68dbf80d547
children a9a948809c6f
line diff
     1.1 --- a/src/scene.cc	Thu Apr 10 08:42:33 2014 +0300
     1.2 +++ b/src/scene.cc	Sat Apr 12 23:28:24 2014 +0300
     1.3 @@ -1,5 +1,6 @@
     1.4  #include <string.h>
     1.5  #include "scene.h"
     1.6 +#include "min3d.h"
     1.7  
     1.8  Scene::Scene()
     1.9  {
    1.10 @@ -40,22 +41,35 @@
    1.11  	return name ? name : "<unknown>";
    1.12  }
    1.13  
    1.14 -void Scene::add_object(Object *obj)
    1.15 +void Scene::add(SceneNode *node)
    1.16  {
    1.17 -	objects.push_back(obj);
    1.18 +	nodes.push_back(node);
    1.19 +
    1.20 +	switch(node->get_type()) {
    1.21 +	case NODE_OBJECT:
    1.22 +		objects.push_back((Object*)node);
    1.23 +		break;
    1.24 +
    1.25 +	case NODE_LIGHT:
    1.26 +		lights.push_back((Light*)node);
    1.27 +		break;
    1.28 +
    1.29 +	case NODE_CAMERA:
    1.30 +		cameras.push_back((Camera*)node);
    1.31 +		break;
    1.32 +
    1.33 +	default:
    1.34 +		break;
    1.35 +	}
    1.36 +
    1.37 +	sel.clear();
    1.38  }
    1.39  
    1.40 -void Scene::add_light(Light *lt)
    1.41 +int Scene::get_node_count() const
    1.42  {
    1.43 -	lights.push_back(lt);
    1.44 +	return (int)nodes.size();
    1.45  }
    1.46  
    1.47 -void Scene::add_camera(Camera *cam)
    1.48 -{
    1.49 -	cameras.push_back(cam);
    1.50 -}
    1.51 -
    1.52 -
    1.53  int Scene::get_object_count() const
    1.54  {
    1.55  	return (int)objects.size();
    1.56 @@ -71,6 +85,15 @@
    1.57  	return (int)cameras.size();
    1.58  }
    1.59  
    1.60 +SceneNode *Scene::get_node(int idx)
    1.61 +{
    1.62 +	return nodes[idx];
    1.63 +}
    1.64 +
    1.65 +const SceneNode *Scene::get_node(int idx) const
    1.66 +{
    1.67 +	return nodes[idx];
    1.68 +}
    1.69  
    1.70  Object *Scene::get_object(int idx)
    1.71  {
    1.72 @@ -108,8 +131,43 @@
    1.73  		// TODO
    1.74  	}
    1.75  
    1.76 -	int nobj = get_object_count();
    1.77 -	for(int i=0; i<nobj; i++) {
    1.78 -		objects[i]->draw();
    1.79 +	int num_nodes = get_node_count();
    1.80 +	for(int i=0; i<num_nodes; i++) {
    1.81 +		bool selected = false;
    1.82 +
    1.83 +		for(size_t j=0; j<sel.size(); j++) {
    1.84 +			if(sel[j] == i) {
    1.85 +				selected = true;
    1.86 +				break;
    1.87 +			}
    1.88 +		}
    1.89 +
    1.90 +		m3d_color(1, 1, selected ? 0.25 : 1);
    1.91 +		nodes[i]->draw();
    1.92  	}
    1.93  }
    1.94 +
    1.95 +void Scene::select(int s)
    1.96 +{
    1.97 +	for(size_t i=0; i<sel.size(); i++) {
    1.98 +		if(sel[i] == s) {
    1.99 +			return;
   1.100 +		}
   1.101 +	}
   1.102 +	sel.push_back(s);
   1.103 +}
   1.104 +
   1.105 +void Scene::clear_selection()
   1.106 +{
   1.107 +	sel.clear();
   1.108 +}
   1.109 +
   1.110 +int Scene::get_selection_count() const
   1.111 +{
   1.112 +	return (int)sel.size();
   1.113 +}
   1.114 +
   1.115 +int Scene::get_selection(int idx) const
   1.116 +{
   1.117 +	return idx >= 0 && idx < (int)sel.size() ? sel[idx] : -1;
   1.118 +}