X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=blobdiff_plain;f=src%2Fsnode.cc;h=a1d41ae23075b498d95c644ebf81ac30257574a6;hp=101fe62994e3bbbdf5c31b10c31afbd2266e89b3;hb=e12a327cc0b4f1e59f4a66a80b170ec41ce97be6;hpb=873255c40ab793b8c569eca3728d918339686000 diff --git a/src/snode.cc b/src/snode.cc index 101fe62..a1d41ae 100644 --- a/src/snode.cc +++ b/src/snode.cc @@ -2,10 +2,13 @@ #include #include #include "snode.h" +#include "objmesh.h" +#include "dbg_gui.h" SceneNode::SceneNode() : scale(1, 1, 1) { + scene = 0; parent = 0; name = 0; } @@ -13,6 +16,7 @@ SceneNode::SceneNode() SceneNode::SceneNode(Object *obj) : scale(1, 1, 1) { + scene = 0; parent = 0; name = 0; add_object(obj); @@ -48,6 +52,7 @@ void SceneNode::add_child(SceneNode *node) children.push_back(node); node->parent = this; + node->scene = scene; } bool SceneNode::remove_child(SceneNode *node) @@ -58,6 +63,8 @@ bool SceneNode::remove_child(SceneNode *node) if(it != children.end()) { assert(node->parent == this); node->parent = 0; + node->scene = 0; + children.erase(it); return true; } return false; @@ -188,13 +195,53 @@ void SceneNode::update_node(float dt) void SceneNode::update(float dt) { + bool expanded = false; + + if(debug_gui) { + if(parent_expanded) { + int flags = children.empty() ? ImGuiTreeNodeFlags_Leaf : 0; + expanded = ImGui::TreeNodeEx(name ? name : "", flags); + } + } + update_node(dt); - for(size_t i=0; iupdate(dt); } + + if(debug_gui && expanded) { + ImGui::TreePop(); + } } +void SceneNode::apply_xform() +{ + update_node(); + + // apply post-order to make sure we don't affect the children xform by our reset + + int nchild = children.size(); + for(int i=0; iapply_xform(); + } + + int nobj = obj.size(); + for(int i=0; iget_type() == OBJ_MESH) { + ObjMesh *om = (ObjMesh*)obj[i]; + if(om->mesh) { + om->mesh->apply_xform(xform); + } + } + } + + pos = Vec3(0, 0, 0); + rot = Quat::identity; + scale = Vec3(1, 1, 1); +} bool SceneNode::intersect(const Ray &ray, HitPoint *hit) const {