How to create/build/install a system plugin
Let's write some code
To start create two files system_example_plugin.hpp and system_example_plugin.cpp
#include <shiva/entt/entt.hpp>
#include <shiva/ecs/system.hpp>
namespace my_game::plugins
{
//! Depending on the system_type, the inheritance can be different.
class system_example final : public shiva::ecs::post_update_system<system_example>
{
public:
//! Destructor
~system_example() noexcept final = default;
/* Only this constructor is allowed in plugins */
//! Constructor
system_example(shiva::entt::dispatcher &dispatcher,
shiva::entt::entity_registry ®istry,
const float &fixed_delta_time) noexcept;
//! The creator function (entry point of your plugins)
//! Return should always be a unique_ptr on base_system in plugins
static std::unique_ptr<shiva::ecs::base_system> system_creator(entt::dispatcher &dispatcher,
entt::entity_registry ®istry,
const float &fixed_delta_time) noexcept;
//! override from base_system
//! The logic of the system will be inside this function
void update() noexcept final;
//! Reflection (mandatory by a type_traits)
reflect_class(render_system)
static constexpr auto reflected_functions() noexcept;
static constexpr auto reflected_members() noexcept;
private:
//! You can have additional data here
}
}How to share data between plugins (without the dispatcher)
We assume here that you have set the user_data as shown in the example above
In the example you see above which is directly derived from the shiva code for the shiva-sfml module, I needed to share the SFML window in several different modules, for input and rendering, for example. through functions like set_user_data && get_user_data, I'm able to transfer data that only concerns plugins.
How to subscribe/emit event from a system plugin (or header-only)
Here's an example of how you could do it
CMake
Here are two examples of CMake possible for the implementation of a plugin with shiva, one in the project directly if you are contributors, one externally if you make plugins for shiva in another repository
Inside shiva project
You can find a more concrete example here.
Outside shiva project
Additional hints
If some things seem complicated, or parts not included in this tutorial, you will find more information on the following pages:
Last updated