// // Lol Engine // // Copyright © 2010—2018 Sam Hocevar // // Lol Engine is free software. It comes without any warranty, to // the extent permitted by applicable law. You can redistribute it // and/or modify it under the terms of the Do What the Fuck You Want // to Public License, Version 2, as published by the WTFPL Task Force. // See http://www.wtfpl.net/ for more details. // #pragma once // // The Entity class // ---------------- // Entities are objects that can be ticked by the game loop and/or the render // loop. Entities are implemented as one or several linked lists. See the // Ticker class for the ticking logic and the linked list implementation. // #include namespace lol { struct InitState { enum Value { Unknown, Error, NeedInitDraw, NeedInitGame, Ready, } m_value; inline InitState(Value v) : m_value(v) {} inline operator Value() { return m_value; } }; class Entity { friend class Scene; friend class Ticker; friend class TickerData; friend class Dict; friend class Emcee; public: virtual std::string GetName() const; inline bool IsTicked() { return !!m_ref && !m_autorelease; } protected: Entity(); virtual ~Entity(); inline int IsDestroying() { return m_destroy; } virtual void InitGame(); virtual void InitDraw(); virtual void tick_game(float seconds); virtual void tick_draw(float seconds, class Scene &scene); enum { GAMEGROUP_BEGIN = 0, // must be the first element GAMEGROUP_INPUT, // input should be polled before everything else GAMEGROUP_IMGUI, // debug update needs to be called before the rest for init purposes GAMEGROUP_APP, // main application update GAMEGROUP_ENTITY, // default entity update // ----------------- // split entity update: GAMEGROUP_PLAYER, // player updates before AI to ensure player actions is prevalent GAMEGROUP_AI, // AI update GAMEGROUP_OTHER_0, // other misc updates here GAMEGROUP_OTHER_1, // (same) GAMEGROUP_OTHER_2, // (same) GAMEGROUP_OTHER_3, // (same) // ----------------- // primitives updates GAMEGROUP_MESH, // update Mesh/Animation to ensure correct sync with PLY/AI GAMEGROUP_FX, // update FX/other to ensure correct sync with WorldPos and Meshes GAMEGROUP_LIGHT, // update after FX because it could some GAMEGROUP_CAMERA, // update camera at the end of the frame, once everything is settled GAMEGROUP_STATS, // stats update GAMEGROUP_END // must be the last element } m_gamegroup; enum { DRAWGROUP_BEGIN = GAMEGROUP_END, DRAWGROUP_CAMERA, // update camera first for rendering DRAWGROUP_TEXTURE, // texture DRAWGROUP_LIGHT, // DRAWGROUP_WORLD, // other misc updates here DRAWGROUP_ENTITY, // DRAWGROUP_FX, // DRAWGROUP_OTHER_0, // other misc updates here DRAWGROUP_OTHER_1, // (same) DRAWGROUP_OTHER_2, // (same) DRAWGROUP_OTHER_3, // (same) DRAWGROUP_APP, // main application Draw DRAWGROUP_HUD, DRAWGROUP_IMGUI, DRAWGROUP_CAPTURE, DRAWGROUP_END, // must be the next-to-last element DRAWGROUP_NONE, // this group is for non draw-ticked } m_drawgroup; static int const ALLGROUP_END = DRAWGROUP_END; /* The initialisation state */ InitState m_initstate; #if !LOL_BUILD_RELEASE enum { STATE_IDLE = 0, STATE_PRETICK_GAME, STATE_POSTTICK_GAME, STATE_PRETICK_DRAW, STATE_POSTTICK_DRAW, } m_tickstate; #endif // Emcee begin private: void SetState(uint32_t newstate); void SetStateWhenMatch(uint32_t newstate, Entity *other_entity, uint32_t other_state); virtual uint32_t OnStateChanged(uint32_t newstate) { return LOLm_state = newstate; } uint32_t LOLm_state; // Emcee end private: int m_ref, m_autorelease, m_destroy; uint64_t m_scene_mask = 0; }; } /* namespace lol */