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)
43 if(node->parent == this) {
46 node->parent->remove_child(node);
49 children.push_back(node);
53 bool SceneNode::remove_child(SceneNode *node)
55 if(!node) return false;
57 auto it = std::find(children.begin(), children.end(), node);
58 if(it != children.end()) {
59 assert(node->parent == this);
66 int SceneNode::get_num_children() const
68 return (int)children.size();
71 SceneNode *SceneNode::get_child(int idx) const
76 SceneNode *SceneNode::get_parent() const
81 void SceneNode::add_object(Object *obj)
83 if(obj->node == this) return;
86 obj->node->remove_object(obj);
89 this->obj.push_back(obj);
93 bool SceneNode::remove_object(Object *o)
100 auto it = std::find(obj.begin(), obj.end(), o);
101 if(it == obj.end()) {
108 int SceneNode::get_num_objects() const
110 return (int)obj.size();
113 Object *SceneNode::get_object(int idx) const
118 void SceneNode::set_position(const Vec3 &pos)
123 void SceneNode::set_rotation(const Quat &rot)
128 void SceneNode::set_scaling(const Vec3 &scale)
134 const Vec3 &SceneNode::get_node_position() const
139 const Quat &SceneNode::get_node_rotation() const
144 const Vec3 &SceneNode::get_node_scaling() const
150 Vec3 SceneNode::get_position() const
152 return xform * Vec3(0, 0, 0);
155 Quat SceneNode::get_rotation() const
160 Vec3 SceneNode::get_scaling() const
162 return scale; // TODO
165 const Mat4 &SceneNode::get_matrix() const
170 const Mat4 &SceneNode::get_inv_matrix() const
176 void SceneNode::update_node(float dt)
178 xform = Mat4::identity;
179 xform.pre_translate(pos);
180 xform.pre_rotate(rot);
181 xform.pre_scale(scale);
184 xform = xform * parent->xform;
186 inv_xform = inverse(xform);
189 void SceneNode::update(float dt)
193 for(size_t i=0; i<children.size(); i++) {
194 children[i]->update(dt);
199 bool SceneNode::intersect(const Ray &ray, HitPoint *hit) const
201 Ray local_ray = inv_xform * ray;
204 nearest.dist = FLT_MAX;
205 for(size_t i=0; i<obj.size(); i++) {
206 if(obj[i]->intersect(local_ray, hit)) {
207 if(!hit) return true;
208 if(hit->dist < nearest.dist) {
210 nearest.data = (void*)this;
211 nearest.local_ray = local_ray;
216 for(size_t i=0; i<children.size(); i++) {
217 if(children[i]->intersect(ray, hit)) {
218 if(!hit) return true;
219 if(hit->dist < nearest.dist) {
225 if(nearest.dist < FLT_MAX) {