#ifndef ENTITY_H #define ENTITY_H #include #include "geom.h" class Entity; class Object; class Camera; class Light; class Model; class Mirror; class Listener; class MeshModel; class MD2Model; class Entity { public: Entity(); Entity(const Entity &e); virtual ~Entity(); virtual Entity *clone() = 0; //ugly casts! virtual Object *getObject() { return nullptr; } virtual Camera *getCamera() { return nullptr; } virtual Light *getLight() { return nullptr; } virtual Model *getModel() { return nullptr; } virtual Mirror *getMirror() { return nullptr; } virtual Listener *getListener() { return nullptr; } void SetName(const std::string &t); std::string getName()const { return m_name; } void SetParent(Entity *parent); Entity *getParent()const { return m_parent; } void SetVisible(bool vis); bool IsVisible()const { return m_isVisible; } void EnumerateVisible(std::list &out); void SetEnabled(bool ena); bool IsEnabled()const { return m_isEnabled; } void EnumerateEnabled(std::list &out); void SetLocalPosition(const Vector &v); const Vector &GetLocalPosition()const; void SetLocalScale(const Vector & v); const Vector &GetLocalScale()const; void SetLocalRotation(const Quat &q); const Quat &GetLocalRotation()const; void SetLocalTransform(const Transform &t); const Transform &GetLocalTransform()const; void SetWorldPosition(const Vector &v); const Vector &GetWorldPosition()const; void SetWorldScale(const Vector &v); const Vector &GetWorldScale()const; void SetWorldRotation(const Quat &q); const Quat &GetWorldRotation()const; void SetWorldTransform(const Transform &t); const Transform &GetWorldTransform()const; Entity* GetChildren()const { return m_children; } Entity* GetSuccessor()const { return m_listNext; } static Entity* GetEntityOrphans() { return _orphans; } private: Entity *m_listNext, *m_listPrev, *m_parent, *m_children, *m_last_child; static Entity *_orphans, *_last_orphan; bool m_isVisible, m_isEnabled; std::string m_name; mutable int invalid; Quat m_localRotation; Vector m_localPosition, m_localScale; mutable Transform m_localTransform; mutable Quat m_worldRotation; mutable Vector m_worldPosition, m_worldScale; mutable Transform m_worldTransform; void InsertChildToParent(); void RemoveParent(); void invalidateLocal(); void InvalidateWorldTransform(); }; #endif