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