nuclear@13: #ifndef SCENE_NODE_H_ nuclear@13: #define SCENE_NODE_H_ nuclear@13: nuclear@13: #include "vector.h" nuclear@13: #include "vmath.h" nuclear@13: #include "quat.h" nuclear@13: #include "vmathmat.h" nuclear@13: #include "vmathray.h" nuclear@13: nuclear@13: enum NodeType { nuclear@13: NODE_NULL, nuclear@13: NODE_OBJECT, nuclear@13: NODE_LIGHT, nuclear@13: NODE_CAMERA nuclear@13: }; nuclear@13: nuclear@13: class SceneNode { nuclear@13: protected: nuclear@13: char *name; nuclear@13: NodeType type; nuclear@13: nuclear@13: Vector3 pos; nuclear@13: Quat rot; nuclear@13: Vector3 scale; nuclear@13: Vector3 pivot; nuclear@13: nuclear@13: mutable Matrix4x4 xform, inv_xform; nuclear@13: mutable bool xform_valid, inv_xform_valid; nuclear@13: nuclear@13: vector children; nuclear@13: SceneNode *parent; nuclear@13: nuclear@13: SceneNode(const SceneNode &node) {} nuclear@13: SceneNode &operator =(const SceneNode &node) { return *this; } nuclear@13: nuclear@13: void invalidate() const; nuclear@13: virtual void calc_matrix() const; nuclear@13: virtual void calc_inv_matrix() const; nuclear@13: nuclear@14: virtual void pre_draw() const; nuclear@14: virtual void post_draw() const; nuclear@14: nuclear@13: public: nuclear@13: SceneNode(); nuclear@13: virtual ~SceneNode(); nuclear@13: nuclear@13: virtual void set_name(const char *name); nuclear@13: virtual const char *get_name() const; nuclear@13: nuclear@13: virtual NodeType get_type() const; nuclear@13: nuclear@13: virtual SceneNode *get_parent(); nuclear@13: virtual const SceneNode *get_parent() const; nuclear@13: nuclear@13: // children management nuclear@13: virtual void add_child(SceneNode *child); nuclear@13: virtual void remove_child(SceneNode *child); nuclear@13: nuclear@13: virtual int get_children_count() const; nuclear@13: virtual SceneNode *get_child(int idx); nuclear@13: virtual const SceneNode *get_child(int idx) const; nuclear@13: nuclear@13: virtual void set_position(const Vector3 &pos); nuclear@13: virtual Vector3 get_node_position() const; nuclear@13: nuclear@13: virtual void set_rotation(const Quat &quat); nuclear@13: virtual Quat get_node_rotation() const; nuclear@13: nuclear@13: virtual void set_scaling(const Vector3 &scale); nuclear@13: virtual Vector3 get_node_scaling() const; nuclear@13: nuclear@13: // these take hierarchy into account nuclear@13: virtual Vector3 get_position() const; nuclear@13: virtual Quat get_rotation() const; nuclear@13: virtual Vector3 get_scaling() const; nuclear@13: nuclear@13: virtual void set_pivot(const Vector3 &pivot); nuclear@13: virtual Vector3 get_pivot() const; nuclear@13: nuclear@13: virtual const Matrix4x4 &get_matrix() const; nuclear@13: virtual const Matrix4x4 &get_inv_matrix() const; nuclear@13: nuclear@14: virtual void draw(bool emph = false) const; nuclear@13: nuclear@13: virtual bool intersect(const Ray &ray, float *dist = 0) const; nuclear@13: }; nuclear@13: nuclear@13: #endif /* SCENE_NODE_H_ */