mirror of
https://github.com/enduro2d/enduro2d.git
synced 2025-12-14 16:09:06 +07:00
Merge branch 'feature/safe_gobject' into feature/scripting
This commit is contained in:
@@ -74,11 +74,6 @@ namespace e2d
|
||||
|
||||
class atlas;
|
||||
class flipbook;
|
||||
class gobject;
|
||||
template < typename T >
|
||||
class gcomponent;
|
||||
template < typename T >
|
||||
class const_gcomponent;
|
||||
class model;
|
||||
class node;
|
||||
class prefab;
|
||||
@@ -89,6 +84,12 @@ namespace e2d
|
||||
class luasol;
|
||||
class starter;
|
||||
class world;
|
||||
|
||||
class gobject;
|
||||
template < typename T >
|
||||
class gcomponent;
|
||||
template < typename T >
|
||||
class const_gcomponent;
|
||||
}
|
||||
|
||||
namespace sol
|
||||
|
||||
@@ -8,17 +8,6 @@
|
||||
|
||||
#include "_high.hpp"
|
||||
|
||||
namespace e2d
|
||||
{
|
||||
class gobject;
|
||||
|
||||
template < typename T >
|
||||
class gcomponent;
|
||||
|
||||
template < typename T >
|
||||
class const_gcomponent;
|
||||
}
|
||||
|
||||
namespace e2d
|
||||
{
|
||||
class gobject final {
|
||||
@@ -33,6 +22,8 @@ namespace e2d
|
||||
bool valid() const noexcept;
|
||||
explicit operator bool() const noexcept;
|
||||
|
||||
void destroy() noexcept;
|
||||
|
||||
template < typename T >
|
||||
gcomponent<T> component() noexcept;
|
||||
|
||||
@@ -110,31 +101,23 @@ namespace e2d
|
||||
|
||||
namespace e2d
|
||||
{
|
||||
class gobject_destroying_state_ilist_tag;
|
||||
using gobject_destroying_states = intrusive_list<
|
||||
gobject::state,
|
||||
gobject_destroying_state_ilist_tag>;
|
||||
|
||||
class gobject::state
|
||||
: private noncopyable
|
||||
, public ref_counter<state> {
|
||||
, public ref_counter<state>
|
||||
, public intrusive_list_hook<gobject_destroying_state_ilist_tag> {
|
||||
public:
|
||||
virtual ~state() noexcept {}
|
||||
virtual bool valid() const noexcept = 0;
|
||||
virtual void destroy() noexcept = 0;
|
||||
virtual bool invalided() const noexcept = 0;
|
||||
virtual ecs::entity raw_entity() noexcept = 0;
|
||||
virtual ecs::const_entity raw_entity() const noexcept = 0;
|
||||
};
|
||||
|
||||
inline const gobject::state_iptr& gobject::internal_state() const noexcept {
|
||||
return state_;
|
||||
}
|
||||
|
||||
inline gobject::gobject(state_iptr state)
|
||||
: state_(std::move(state)) {}
|
||||
|
||||
inline bool gobject::valid() const noexcept {
|
||||
return state_ && state_->valid();
|
||||
}
|
||||
|
||||
inline gobject::operator bool() const noexcept {
|
||||
return valid();
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
gcomponent<T> gobject::component() noexcept {
|
||||
return gcomponent<T>(*this);
|
||||
@@ -145,16 +128,6 @@ namespace e2d
|
||||
return const_gcomponent<T>(*this);
|
||||
}
|
||||
|
||||
inline ecs::entity gobject::raw_entity() noexcept {
|
||||
E2D_ASSERT(valid());
|
||||
return state_->raw_entity();
|
||||
}
|
||||
|
||||
inline ecs::const_entity gobject::raw_entity() const noexcept {
|
||||
E2D_ASSERT(valid());
|
||||
return state_->raw_entity();
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
ecs::component<T> gobject::raw_component() noexcept {
|
||||
E2D_ASSERT(valid());
|
||||
|
||||
@@ -42,6 +42,8 @@ namespace e2d
|
||||
static node_iptr create(gobject owner, const node_iptr& parent, const t3f& transform);
|
||||
|
||||
void owner(gobject owner) noexcept;
|
||||
|
||||
gobject& owner() noexcept;
|
||||
const gobject& owner() const noexcept;
|
||||
|
||||
void transform(const t3f& transform) noexcept;
|
||||
|
||||
@@ -51,12 +51,17 @@ namespace e2d
|
||||
gobject instantiate(const prefab& prefab, const gobject& parent, const t3f& transform);
|
||||
gobject instantiate(const prefab& prefab, const node_iptr& parent, const t3f& transform);
|
||||
|
||||
void destroy_instance(const gobject& inst) noexcept;
|
||||
void destroy_instance(gobject& inst) noexcept;
|
||||
void finalize_instances() noexcept;
|
||||
|
||||
gobject resolve(ecs::entity_id ent) const noexcept;
|
||||
gobject resolve(const ecs::const_entity& ent) const noexcept;
|
||||
private:
|
||||
void destroy_instances_() noexcept;
|
||||
void finalize_instance_(gobject& inst) noexcept;
|
||||
private:
|
||||
ecs::registry registry_;
|
||||
hash_map<ecs::entity_id, gobject> gobjects_;
|
||||
gobject_destroying_states destroying_states_;
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user