#pragma once /// \file property_scope.h /// \author Folling #include #include #include #include /// \addtogroup object_scopes ObjectScopes /// @{ IKARUS_BEGIN_HEADER /// \brief Data for a property scope. This can either be a blueprint or an entity. union IkarusPropertyScopeData { /// \private \brief The blueprint the property is scoped to. IkarusBlueprint _blueprint; /// \private \brief The entity the property is scoped to. IkarusEntity _entity; }; /// \brief The type of a property scope. This can either be a blueprint or an entity. enum IkarusPropertyScopeType { /// \brief The property is scoped to a blueprint. IkarusPropertyScopeType_Blueprint, /// \brief The property is scoped to an entity. IkarusPropertyScopeType_Entity }; /// \brief The scope of a property struct IkarusPropertyScope { /// \private \brief Represents the type of the scope. IkarusPropertyScopeType _type; /// \private \brief Represents the data of the scope. IkarusPropertyScopeData _data; }; /// \brief Creates a property scope from a blueprint. /// \param blueprint The blueprint the property is scoped to. /// \return The created property scope. IKA_API IkarusPropertyScope ikarus_property_scope_create_blueprint(IkarusBlueprint blueprint); /// \brief Creates a property scope from a entity. /// \param entity The entity the property is scoped to. /// \return The created property scope. IKA_API IkarusPropertyScope ikarus_property_scope_create_entity(IkarusEntity entity); /// \brief Fetches the type of an property scope. /// \param scope The scope to fetch the type of. /// \return The type of the scope. IKA_API IkarusPropertyScopeType ikarus_property_scope_get_type(IkarusPropertyScope scope); /// \brief Visits a property scope, calling the appropriate function. /// \param scope The scope to to visit /// \param blueprint The function to call if the property is scoped to a blueprint. /// \param entity The function to call if the property is scoped to an entity. /// \param data Optional data to pass to the functions. void ikarus_property_scope_visit( IkarusPropertyScope scope, void (*blueprint)(IkarusBlueprint, void *), void (*entity)(IkarusEntity, void *), void * data ); IKARUS_END_HEADER // @}