// Copyright (c) 2022 Dominic Masters // // This software is released under the MIT License. // https://opensource.org/licenses/MIT #pragma once #include "SceneItemComponent.hpp" namespace Dawn { typedef int32_t sceneitemid_t; class Scene; class SceneItem : public std::enable_shared_from_this { private: std::vector> components; public: std::weak_ptr scene; sceneitemid_t id; /** * Constructor for a SceneItem. Scene Items should only be called and * initialized by the scene itself. * * @param scene Weak pointer to the Scene that this SceneItem belongs to. * @param id Scene Item ID that the Scene assigned this SceneItem. */ SceneItem(std::weak_ptr scene, sceneitemid_t id); /** * Called by the Scene the frame after we were constructed so we can begin * existing. */ void init(); /** * Adds a component to this scene item. Components will only have their * init methods invoked on the first frame we enter the scene. If you add * a component to this item after this time you will either need to try * manually invoking its' init method, or ensure the component is aware of * the entire SceneItem lifecycle and listen for added callbacks. * * @tparam T Type of component being added to this scene item. * @return A shared pointer to the newly added component. */ template std::shared_ptr addComponent() { auto component = std::make_shared(weak_from_this()); this->components.push_back(component); return component; } /** * Returns a component attached to this SceneItem. This method will return * either a shared pointer to the component, or nullptr if the item does * not have the queried component. * * @tparam T Type of component to be fetched. * @return A shared pointer to the component, or nullptr if not found. */ template std::shared_ptr getComponent() { auto it = this->components.begin(); while(it != this->components.end()) { auto castedAs = std::dynamic_pointer_cast(*it); if(castedAs != nullptr) return castedAs; ++it; } return nullptr; } /** * Destroy this SceneItem. */ ~SceneItem(); }; }