diff --git a/src/Game/GameObject.cpp b/src/Game/GameObject.cpp index 5cd4f2c..3c8550d 100644 --- a/src/Game/GameObject.cpp +++ b/src/Game/GameObject.cpp @@ -7,23 +7,23 @@ std::ostream& operator<<(std::ostream& s, Transform& t){ return s; } -GameObject::GameObject(Mono::Object managed_obj, GameObject *parent) - : object_handle(managed_obj), parent(parent) +GameObject::GameObject(Mono::Object managed_obj) + : object_handle(managed_obj) {} GameObject::GameObject(GameObject &&o) : - transform(o.transform), - components(std::move(o.components)), object_handle(std::move(o.object_handle)), - parent(o.parent) + parent(o.parent), + transform(o.transform), + components(std::move(o.components)) { } -GameObject &GameObject::operator=(GameObject &&o){ - transform = o.transform; - components = std::move(o.components); +GameObject& GameObject::operator=(GameObject &&o){ object_handle = std::move(o.object_handle); parent = o.parent; + transform = o.transform; + components = std::move(o.components); return *this; } diff --git a/src/Game/GameObject.hpp b/src/Game/GameObject.hpp index c815123..06077ed 100644 --- a/src/Game/GameObject.hpp +++ b/src/Game/GameObject.hpp @@ -26,12 +26,17 @@ std::ostream& operator<<(std::ostream& s, Transform& t); class GameObject { - Transform transform; - std::map components; Mono::ObjectHandle object_handle; GameObject* parent; + Transform transform; + std::map components; public: - GameObject(Mono::Object managed_obj, GameObject* parent); + /// @warning Do not use this to create objects. + /// This constructor creates null values for GameObject arrays + /// GameObject* array = new GameObject[10]; + /// array[0] = GameObject(initialized_mono_object_ptr) + GameObject() = default; + GameObject(Mono::Object managed_obj); GameObject(const GameObject& o) = delete; GameObject(GameObject&& o); diff --git a/src/Game/GameObjectPool.cpp b/src/Game/GameObjectPool.cpp index e97935f..af92b4e 100644 --- a/src/Game/GameObjectPool.cpp +++ b/src/Game/GameObjectPool.cpp @@ -7,7 +7,7 @@ GameObjectPool::GameObjectPool(u32 size) useful_assert(size % 64 == 0, "size of GameObjectPool must be a multiple of 64"); this->size = size; first_unused_index = 0; - buffer = new char[size*sizeof(GameObject)]; + buffer = new GameObject[size]; used_indices = new u64[size/64]; // std::memset(buffer, 0, size*sizeof(GameObject)); std::memset(used_indices, 0, size/8); @@ -15,13 +15,8 @@ GameObjectPool::GameObjectPool(u32 size) GameObjectPool::~GameObjectPool() { - // int i = 0; - for(auto&& p : *this){ - // std::cout<<"~GameObjectPool i="< GameObjectPool::emplace(GameObject&& new_obj) @@ -89,7 +84,9 @@ std::pair GameObjectPool::emplace(GameObject&& new_obj) u32 i = first_unused_index; if(i == u32(-1)) throw UsefulException("can't put new GameObject to GameObjectPool because it's full"); - GameObject& r = ( ((GameObject*)buffer)[i] = std::move(new_obj) ); + + buffer[i] = std::move(new_obj); + GameObject& r = buffer[i]; used_indices[i/64] |= u64(1)<<(i%64); // mark index bit as used first_unused_index = getNearestUnusedIndex(i+1); return std::pair(i, r); @@ -101,27 +98,29 @@ void GameObjectPool::erase(u32 index) throw UsefulException(format("index %i is out of size %i", index, size)); if(!isIndexUsed(index)) throw UsefulException(format("there is no object at index %i", index)); - ((GameObject*)buffer)[index].~GameObject(); + + buffer[index] = GameObject(); used_indices[index/64] &= ~(u64(1)<<(index%64)); // mark index bit as unused if(index < first_unused_index) first_unused_index = index; } -GameObjectPool::iterator::iterator(GameObjectPool* p, u32 index) - : p(p), index(index) +GameObjectPool::iterator::iterator(GameObjectPool* pool, u32 index) + : pool(pool), index(index) { } std::pair GameObjectPool::iterator::operator*() { - if(index >= p->size) + if(index >= pool->size) throw UsefulException("can't get value of end() iterator"); - GameObject& r = ((GameObject*)p->buffer)[index]; + + GameObject& r = pool->buffer[index]; return std::pair(index, r); } GameObjectPool::iterator& GameObjectPool::iterator::operator++() { - index = p->getNearestUsedIndex(index+1); + index = pool->getNearestUsedIndex(index+1); return *this; } \ No newline at end of file diff --git a/src/Game/GameObjectPool.hpp b/src/Game/GameObjectPool.hpp index fbd7aa5..ca557be 100644 --- a/src/Game/GameObjectPool.hpp +++ b/src/Game/GameObjectPool.hpp @@ -28,7 +28,7 @@ operation 'forward_list::iterate' took 2.0823 ms */ class GameObjectPool { - void* buffer; + GameObject* buffer; u64* used_indices; u32 size; u32 first_unused_index; @@ -45,17 +45,19 @@ public: std::pair emplace(GameObject&& new_obj); void erase(u32 index); + #pragma region iterator class class iterator { - GameObjectPool* p; + GameObjectPool* pool; u32 index = 0; public: - iterator(GameObjectPool* p, u32 index); + iterator(GameObjectPool* pool, u32 index); std::pair operator*(); iterator& operator++(); inline bool operator!=(const iterator& o) const { return index != o.index; }; inline bool operator==(const iterator& o) const { return index == o.index; }; }; + #pragma endregion inline iterator begin() { return iterator(this, 0); } inline iterator end() { return iterator(this, -1); } diff --git a/src/main.cpp b/src/main.cpp index 62d3cbc..91282c7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -45,7 +45,7 @@ int main(int argc, const char** argv){ MonoClass* gameObjectClass = a->getClass("Ougge", "GameObject"); MonoObject* exampleObjectManaged = mono_object_new(mono.getDomain(), gameObjectClass); u64 obj_id = 0; - auto pair = p.emplace(GameObject(exampleObjectManaged, nullptr)); + auto pair = p.emplace(GameObject(exampleObjectManaged)); auto gameObjectCtor = Mono::Method(gameObjectClass, ".ctor"); gameObjectCtor(exampleObjectManaged, obj_id++, pair.first);