Merge branch 'feature/safe_gobject' into feature/scripting

This commit is contained in:
2019-10-12 21:41:35 +07:00
8 changed files with 170 additions and 95 deletions

View File

@@ -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

View File

@@ -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());

View File

@@ -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;

View File

@@ -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_;
};
}