15 SceneNode::SceneNode(Object *obj)
24 SceneNode::~SceneNode()
29 void SceneNode::set_name(const char *s)
32 name = new char[strlen(s) + 1];
36 const char *SceneNode::get_name() const
41 void SceneNode::add_child(SceneNode *node)
46 if(node->parent == this) {
49 node->parent->remove_child(node);
52 children.push_back(node);
57 bool SceneNode::remove_child(SceneNode *node)
59 if(!node) return false;
61 auto it = std::find(children.begin(), children.end(), node);
62 if(it != children.end()) {
63 assert(node->parent == this);
72 int SceneNode::get_num_children() const
74 return (int)children.size();
77 SceneNode *SceneNode::get_child(int idx) const
82 SceneNode *SceneNode::get_parent() const
87 void SceneNode::add_object(Object *obj)
89 if(obj->node == this) return;
92 obj->node->remove_object(obj);
95 this->obj.push_back(obj);
99 bool SceneNode::remove_object(Object *o)
101 if(o->node != this) {
106 auto it = std::find(obj.begin(), obj.end(), o);
107 if(it == obj.end()) {
114 int SceneNode::get_num_objects() const
116 return (int)obj.size();
119 Object *SceneNode::get_object(int idx) const
124 void SceneNode::set_position(const Vec3 &pos)
129 void SceneNode::set_rotation(const Quat &rot)
134 void SceneNode::set_scaling(const Vec3 &scale)
140 const Vec3 &SceneNode::get_node_position() const
145 const Quat &SceneNode::get_node_rotation() const
150 const Vec3 &SceneNode::get_node_scaling() const
156 Vec3 SceneNode::get_position() const
158 return xform * Vec3(0, 0, 0);
161 Quat SceneNode::get_rotation() const
166 Vec3 SceneNode::get_scaling() const
168 return scale; // TODO
171 const Mat4 &SceneNode::get_matrix() const
176 const Mat4 &SceneNode::get_inv_matrix() const
182 void SceneNode::update_node(float dt)
184 xform = Mat4::identity;
185 xform.pre_translate(pos);
186 xform.pre_rotate(rot);
187 xform.pre_scale(scale);
190 xform = xform * parent->xform;
192 inv_xform = inverse(xform);
195 void SceneNode::update(float dt)
199 int num = children.size();
200 for(int i=0; i<num; i++) {
201 children[i]->update(dt);
205 void SceneNode::apply_xform()
209 // apply post-order to make sure we don't affect the children xform by our reset
211 int nchild = children.size();
212 for(int i=0; i<nchild; i++) {
213 children[i]->apply_xform();
216 int nobj = obj.size();
217 for(int i=0; i<nobj; i++) {
218 if(obj[i]->get_type() == OBJ_MESH) {
219 ObjMesh *om = (ObjMesh*)obj[i];
221 om->mesh->apply_xform(xform);
227 rot = Quat::identity;
228 scale = Vec3(1, 1, 1);
231 bool SceneNode::intersect(const Ray &ray, HitPoint *hit) const
233 Ray local_ray = inv_xform * ray;
236 nearest.dist = FLT_MAX;
237 for(size_t i=0; i<obj.size(); i++) {
238 if(obj[i]->intersect(local_ray, hit)) {
239 if(!hit) return true;
240 if(hit->dist < nearest.dist) {
242 nearest.data = (void*)this;
243 nearest.local_ray = local_ray;
248 for(size_t i=0; i<children.size(); i++) {
249 if(children[i]->intersect(ray, hit)) {
250 if(!hit) return true;
251 if(hit->dist < nearest.dist) {
257 if(nearest.dist < FLT_MAX) {