goat3d

annotate src/node.cc @ 76:9785847d52d4

bounding boxes calculation (untested) and automatic camera placement in goatview
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 08 May 2014 13:43:45 +0300
parents 76dea247f75c
children
rev   line source
nuclear@54 1 /*
nuclear@54 2 goat3d - 3D scene, character, and animation file format library.
nuclear@54 3 Copyright (C) 2013-2014 John Tsiombikas <nuclear@member.fsf.org>
nuclear@54 4
nuclear@54 5 This program is free software: you can redistribute it and/or modify
nuclear@54 6 it under the terms of the GNU Lesser General Public License as published by
nuclear@54 7 the Free Software Foundation, either version 3 of the License, or
nuclear@54 8 (at your option) any later version.
nuclear@54 9
nuclear@54 10 This program is distributed in the hope that it will be useful,
nuclear@54 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
nuclear@54 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nuclear@54 13 GNU Lesser General Public License for more details.
nuclear@54 14
nuclear@54 15 You should have received a copy of the GNU Lesser General Public License
nuclear@54 16 along with this program. If not, see <http://www.gnu.org/licenses/>.
nuclear@54 17 */
nuclear@0 18 #include <algorithm>
nuclear@0 19 #include <string.h>
nuclear@0 20 #include "node.h"
nuclear@0 21
nuclear@47 22 using namespace g3dimpl;
nuclear@47 23
nuclear@0 24 Node::Node()
nuclear@0 25 {
nuclear@8 26 obj = 0;
nuclear@75 27 bbox_valid = false;
nuclear@0 28 }
nuclear@0 29
nuclear@8 30 void Node::set_object(Object *obj)
nuclear@0 31 {
nuclear@8 32 this->obj = obj;
nuclear@75 33 bbox_valid = false;
nuclear@0 34 }
nuclear@0 35
nuclear@8 36 Object *Node::get_object()
nuclear@0 37 {
nuclear@75 38 bbox_valid = false;
nuclear@8 39 return obj;
nuclear@0 40 }
nuclear@0 41
nuclear@8 42 const Object *Node::get_object() const
nuclear@0 43 {
nuclear@8 44 return obj;
nuclear@0 45 }
nuclear@0 46
nuclear@75 47 const AABox &Node::get_bounds() const
nuclear@75 48 {
nuclear@75 49 if(!bbox_valid) {
nuclear@76 50 Matrix4x4 xform;
nuclear@76 51 get_xform(0, &xform);
nuclear@76 52 bbox = obj ? obj->get_bounds(xform) : AABox();
nuclear@75 53
nuclear@75 54 for(int i=0; i<get_children_count(); i++) {
nuclear@75 55 bbox = aabox_union(bbox, ((Node*)get_child(i))->get_bounds());
nuclear@75 56 }
nuclear@75 57 bbox_valid = true;
nuclear@75 58 }
nuclear@75 59
nuclear@75 60 return bbox;
nuclear@75 61 }
nuclear@75 62
nuclear@47 63 void g3dimpl::delete_node_tree(Node *n)
nuclear@0 64 {
nuclear@56 65 if(!n) return;
nuclear@56 66
nuclear@8 67 for(int i=0; i<n->get_children_count(); i++) {
nuclear@8 68 delete_node_tree((Node*)n->get_child(i));
nuclear@0 69 }
nuclear@8 70 delete n;
nuclear@0 71 }