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