nuclear@0: #ifndef OBJECT_H_ nuclear@0: #define OBJECT_H_ nuclear@0: nuclear@0: #include nuclear@0: #include "vmath/ray.h" nuclear@0: nuclear@0: class Object; nuclear@0: nuclear@0: struct RayHit { nuclear@0: float dist; nuclear@0: const Ray world_ray, local_ray; nuclear@0: nuclear@0: const Object *obj, *subobj; nuclear@0: }; nuclear@0: nuclear@0: enum class ObjType { null, geom, camera }; nuclear@0: nuclear@0: class Object { nuclear@0: private: nuclear@0: std::string name; nuclear@0: Matrix4x4 xform; nuclear@0: mutable Matrix4x4 inv_xform; nuclear@0: mutable bool inv_xform_valid; nuclear@0: nuclear@0: public: nuclear@0: Object(); nuclear@0: virtual ~Object() = default; nuclear@0: nuclear@0: virtual ObjType get_type() const; nuclear@0: nuclear@0: virtual void set_name(const char *name); nuclear@0: virtual const char *get_name() const; nuclear@0: nuclear@0: virtual void set_xform(const Matrix4x4 &mat); nuclear@0: virtual void set_xform(const Matrix4x4 &mat, const Matrix4x4 &inv_mat); nuclear@0: nuclear@0: virtual Matrix4x4 &get_xform(); // invalidates inv_xform nuclear@0: virtual const Matrix4x4 &get_xform() const; nuclear@0: virtual const Matrix4x4 &get_inv_xform() const; nuclear@0: nuclear@0: virtual bool intersect(const Ray &ray, RayHit *hit = 0) const; nuclear@0: }; nuclear@0: nuclear@0: #endif // OBJECT_H_