13 SceneNode::SceneNode(Object *obj)
21 SceneNode::~SceneNode()
26 void SceneNode::set_name(const char *s)
29 name = new char[strlen(s) + 1];
33 const char *SceneNode::get_name() const
38 void SceneNode::add_child(SceneNode *node)
41 if(node->parent == this) {
44 node->parent->remove_child(node);
47 children.push_back(node);
51 bool SceneNode::remove_child(SceneNode *node)
53 auto it = std::find(children.begin(), children.end(), node);
54 if(it != children.end()) {
55 assert(node->parent == this);
62 int SceneNode::get_num_children() const
64 return (int)children.size();
67 SceneNode *SceneNode::get_child(int idx) const
72 SceneNode *SceneNode::get_parent() const
77 void SceneNode::add_object(Object *obj)
79 if(obj->node == this) return;
82 obj->node->remove_object(obj);
85 this->obj.push_back(obj);
89 bool SceneNode::remove_object(Object *o)
96 auto it = std::find(obj.begin(), obj.end(), o);
104 int SceneNode::get_num_objects() const
106 return (int)obj.size();
109 Object *SceneNode::get_object(int idx) const
114 void SceneNode::set_position(const Vec3 &pos)
119 void SceneNode::set_rotation(const Quat &rot)
124 void SceneNode::set_scaling(const Vec3 &scale)
130 const Vec3 &SceneNode::get_node_position() const
135 const Quat &SceneNode::get_node_rotation() const
140 const Vec3 &SceneNode::get_node_scaling() const
146 Vec3 SceneNode::get_position() const
148 return xform * Vec3(0, 0, 0);
151 Quat SceneNode::get_rotation() const
156 Vec3 SceneNode::get_scaling() const
158 return scale; // TODO
161 const Mat4 &SceneNode::get_matrix() const
166 const Mat4 &SceneNode::get_inv_matrix() const
172 void SceneNode::update_node(float dt)
174 xform = Mat4::identity;
175 xform.pre_translate(pos);
176 xform.pre_rotate(rot);
177 xform.pre_scale(scale);
180 xform = parent->xform * xform;
182 inv_xform = inverse(xform);
185 void SceneNode::update(float dt)
189 for(size_t i=0; i<children.size(); i++) {
190 children[i]->update(dt);
195 bool SceneNode::intersect(const Ray &ray, HitPoint *hit) const
197 Ray local_ray = inv_xform * ray;
200 nearest.dist = FLT_MAX;
201 for(size_t i=0; i<obj.size(); i++) {
202 if(obj[i]->intersect(local_ray, hit)) {
203 if(!hit) return true;
204 if(hit->dist < nearest.dist) {
206 nearest.data = (void*)this;
207 nearest.local_ray = local_ray;
212 for(size_t i=0; i<children.size(); i++) {
213 if(children[i]->intersect(ray, hit)) {
214 if(!hit) return true;
215 if(hit->dist < nearest.dist) {
221 if(nearest.dist < FLT_MAX) {