nuclear@1: #include nuclear@1: #include nuclear@1: #include "snode.h" nuclear@1: nuclear@1: void SceneNode::add_child(SceneNode *node) nuclear@1: { nuclear@1: if(node->parent) { nuclear@1: if(node->parent == this) { nuclear@1: return; nuclear@1: } nuclear@1: node->parent->remove_child(node); nuclear@1: } nuclear@1: nuclear@1: children.push_back(node); nuclear@1: node->parent = this; nuclear@1: } nuclear@1: nuclear@1: bool SceneNode::remove_child(SceneNode *node) nuclear@1: { nuclear@1: auto it = std::find(children.begin(), children.end(), node); nuclear@1: if(it != children.end()) { nuclear@1: assert(node->parent == this); nuclear@1: node->parent = 0; nuclear@1: } nuclear@1: } nuclear@1: nuclear@1: int SceneNode::get_num_children() const nuclear@1: { nuclear@1: return (int)children.size(); nuclear@1: } nuclear@1: nuclear@1: SceneNode *SceneNode::get_child(int idx) const nuclear@1: { nuclear@1: return children[idx]; nuclear@1: } nuclear@1: nuclear@1: void SceneNode::set_position(const Vector3 &pos) nuclear@1: { nuclear@1: this->pos = pos; nuclear@1: } nuclear@1: nuclear@1: void SceneNode::set_rotation(const Quaternion &rot) nuclear@1: { nuclear@1: this->rot = rot; nuclear@1: } nuclear@1: nuclear@1: void SceneNode::set_scaling(const Vector3 &scale) nuclear@1: { nuclear@1: this->scale = scale; nuclear@1: } nuclear@1: nuclear@1: nuclear@1: const Vector3 &SceneNode::get_node_position() const nuclear@1: { nuclear@1: return pos; nuclear@1: } nuclear@1: nuclear@1: const Quaternion &SceneNode::get_node_rotation() const nuclear@1: { nuclear@1: return rot; nuclear@1: } nuclear@1: nuclear@1: const Vector3 &SceneNode::get_node_scaling() const nuclear@1: { nuclear@1: return scale; nuclear@1: } nuclear@1: nuclear@1: nuclear@1: Vector3 SceneNode::get_position() const nuclear@1: { nuclear@1: return Vector3{0, 0, 0}.transformed(xform); nuclear@1: } nuclear@1: nuclear@1: Quaternion SceneNode::get_rotation() const nuclear@1: { nuclear@1: return rot; // TODO nuclear@1: } nuclear@1: nuclear@1: Vector3 SceneNode::get_scaling() const nuclear@1: { nuclear@1: return scale; // TODO nuclear@1: } nuclear@1: nuclear@1: nuclear@1: void SceneNode::update_node(long msec) nuclear@1: { nuclear@3: xform.reset_identity(); nuclear@3: xform.translate(pos); nuclear@3: xform.rotate(rot); nuclear@3: xform.scale(scale); nuclear@1: nuclear@3: if(parent) { nuclear@3: xform = parent->xform * xform; nuclear@3: } nuclear@3: inv_xform = xform.inverse(); nuclear@1: } nuclear@1: nuclear@1: void SceneNode::update(long msec) nuclear@1: { nuclear@1: update_node(msec); nuclear@1: nuclear@1: for(size_t i=0; iupdate(msec); nuclear@1: } nuclear@1: } nuclear@1: nuclear@1: nuclear@1: bool SceneNode::intersect(const Ray &ray, RayHit *hit) const nuclear@1: { nuclear@3: Ray local_ray = ray.transformed(inv_xform); nuclear@1: }