nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include "snode.h" nuclear@0: nuclear@0: SceneNode::SceneNode() nuclear@0: : scale(1, 1, 1) nuclear@0: { nuclear@0: parent = 0; nuclear@0: } nuclear@0: nuclear@0: SceneNode::SceneNode(Object *obj) nuclear@0: : scale(1, 1, 1) nuclear@0: { nuclear@0: parent = 0; nuclear@0: add_object(obj); nuclear@0: } nuclear@0: nuclear@0: void SceneNode::add_child(SceneNode *node) nuclear@0: { nuclear@0: if(node->parent) { nuclear@0: if(node->parent == this) { nuclear@0: return; nuclear@0: } nuclear@0: node->parent->remove_child(node); nuclear@0: } nuclear@0: nuclear@0: children.push_back(node); nuclear@0: node->parent = this; nuclear@0: } nuclear@0: nuclear@0: bool SceneNode::remove_child(SceneNode *node) nuclear@0: { nuclear@0: for(size_t i=0; iparent == this); nuclear@0: node->parent = 0; nuclear@0: return true; nuclear@0: } nuclear@0: } nuclear@0: return false; nuclear@0: } nuclear@0: nuclear@0: int SceneNode::get_num_children() const nuclear@0: { nuclear@0: return (int)children.size(); nuclear@0: } nuclear@0: nuclear@0: SceneNode *SceneNode::get_child(int idx) const nuclear@0: { nuclear@0: return children[idx]; nuclear@0: } nuclear@0: nuclear@0: SceneNode *SceneNode::get_parent() const nuclear@0: { nuclear@0: return parent; nuclear@0: } nuclear@0: nuclear@0: void SceneNode::add_object(Object *obj) nuclear@0: { nuclear@0: if(std::find(this->obj.begin(), this->obj.end(), obj) == this->obj.end()) { nuclear@0: this->obj.push_back(obj); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: int SceneNode::get_num_objects() const nuclear@0: { nuclear@0: return (int)obj.size(); nuclear@0: } nuclear@0: nuclear@0: Object *SceneNode::get_object(int idx) const nuclear@0: { nuclear@0: return obj[idx]; nuclear@0: } nuclear@0: nuclear@0: void SceneNode::set_position(const Vector3 &pos) nuclear@0: { nuclear@0: this->pos = pos; nuclear@0: } nuclear@0: nuclear@0: void SceneNode::set_rotation(const Quaternion &rot) nuclear@0: { nuclear@0: this->rot = rot; nuclear@0: } nuclear@0: nuclear@0: void SceneNode::set_scaling(const Vector3 &scale) nuclear@0: { nuclear@0: this->scale = scale; nuclear@0: } nuclear@0: nuclear@0: nuclear@0: const Vector3 &SceneNode::get_node_position() const nuclear@0: { nuclear@0: return pos; nuclear@0: } nuclear@0: nuclear@0: const Quaternion &SceneNode::get_node_rotation() const nuclear@0: { nuclear@0: return rot; nuclear@0: } nuclear@0: nuclear@0: const Vector3 &SceneNode::get_node_scaling() const nuclear@0: { nuclear@0: return scale; nuclear@0: } nuclear@0: nuclear@0: nuclear@0: Vector3 SceneNode::get_position() const nuclear@0: { nuclear@0: return Vector3(0, 0, 0).transformed(xform); nuclear@0: } nuclear@0: nuclear@0: Quaternion SceneNode::get_rotation() const nuclear@0: { nuclear@0: return rot; // TODO nuclear@0: } nuclear@0: nuclear@0: Vector3 SceneNode::get_scaling() const nuclear@0: { nuclear@0: return scale; // TODO nuclear@0: } nuclear@0: nuclear@0: const Matrix4x4 &SceneNode::get_matrix() const nuclear@0: { nuclear@0: return xform; nuclear@0: } nuclear@0: nuclear@0: const Matrix4x4 &SceneNode::get_inv_matrix() const nuclear@0: { nuclear@0: return inv_xform; nuclear@0: } nuclear@0: nuclear@0: nuclear@0: void SceneNode::update_node(long msec) nuclear@0: { nuclear@0: xform.reset_identity(); nuclear@0: xform.translate(pos); nuclear@0: xform.rotate(rot); nuclear@0: xform.scale(scale); nuclear@0: nuclear@0: if(parent) { nuclear@0: xform = parent->xform * xform; nuclear@0: } nuclear@0: inv_xform = xform.inverse(); nuclear@0: } nuclear@0: nuclear@0: void SceneNode::update(long msec) nuclear@0: { nuclear@0: update_node(msec); nuclear@0: nuclear@0: for(size_t i=0; iupdate(msec); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: nuclear@0: bool SceneNode::intersect(const Ray &ray, HitPoint *hit) const nuclear@0: { nuclear@0: Ray local_ray = ray.transformed(inv_xform); nuclear@0: nuclear@0: HitPoint nearest; nuclear@0: nearest.dist = FLT_MAX; nuclear@0: for(size_t i=0; iintersect(local_ray, hit)) { nuclear@0: if(!hit) return true; nuclear@0: if(hit->dist < nearest.dist) { nuclear@0: nearest = *hit; nuclear@0: nearest.node = this; nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: for(size_t i=0; iintersect(ray, hit)) { nuclear@0: if(!hit) return true; nuclear@0: if(hit->dist < nearest.dist) { nuclear@0: nearest = *hit; nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: if(nearest.dist < FLT_MAX) { nuclear@0: *hit = nearest; nuclear@0: hit->ray = ray; nuclear@0: return true; nuclear@0: } nuclear@0: return false; nuclear@0: }