CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
RendererObject.hpp
Go to the documentation of this file.
1//
2// CeresEngine - A game development framework
3//
4// Created by Rogiel Sulzbach.
5// Copyright (c) 2018-2022 Rogiel Sulzbach. All rights reserved.
6//
7
8#pragma once
9
11
14
17
18namespace CeresEngine {
19
23 template<typename T> struct RendererObjectTrait;
24
25#define CE_DECL_RENDERER_OBJECT(T) \
26 template<> struct RendererObjectTrait<T> { \
27 using Type = T; \
28 using Manager = T##Manager; \
29 }
30
32 template<typename T> using RendererObjectManagerType = typename RendererObjectTrait<T>::Manager;
33
36
40 template<typename, typename, typename> friend class TRendererObjectManager;
41
42 protected:
49
50 public:
53
56
57 public:
59 explicit RendererObject() = default;
60
63
66 virtual void destroy() = 0;
67
68 public:
71
72 private:
76 };
77
82 template<typename SelfType, typename BaseType = RendererObject> class TRendererObject : public BaseType {
85
86 protected:
89
90 public:
95 template<typename... Args> explicit TRendererObject(ManagerType& manager, Args&&... args) : BaseType(std::forward<Args>(args)...), mManager(manager) {}
96
98 void destroy() noexcept override { mManager.destroy(static_cast<SelfType&>(*this)); }
99
100 public:
103 };
104
107 protected:
110
111 public:
114 explicit RendererObjectManager(Renderer& renderer) noexcept;
115
118
119 public:
122
123 protected:
126 void notifyChangeID(RendererObject& object, const RendererObjectID newID) noexcept {
127 object.changeID(newID);
128 }
129 };
130
136 template<typename SelfType, typename ObjectType, typename BaseType = RendererObjectManager> class TRendererObjectManager : public BaseType {
139
140 private:
143
144 public:
149 template<typename... Args>
150 explicit TRendererObjectManager(Vector<UPtr<ObjectType>>& objects, Args&&... args) : BaseType(std::forward<Args>(args)...), mObjects(objects) {}
151
152 public:
159 template<typename... Args> ObjectType& create(Args&&... args) {
160 const RendererObjectID objectID = RendererObjectID(mObjects.size());
161
162 const UPtr<ObjectType>& object = mObjects.emplace_back(ce_unique_new<ObjectType>( //
163 static_cast<SelfType&>(*this), std::forward<Args>(args)...));
164 CE_ASSERT(object != nullptr);
165
166 // NOTE: Directly setting the ID as nothing should be
167 // subscribing to the ID change event yet.
168 object->mID = objectID;
169
170 return *object;
171 }
172
177 void destroy(ObjectType& object) {
178 const RendererObjectID objectID = object.mID;
179 std::swap(mObjects[objectID], mObjects.back());
180 mObjects[objectID]->changeID(objectID);
181
182 mObjects.pop_back();
183 }
184 };
185
186} // namespace CeresEngine
#define CE_ASSERT(...)
Definition Macros.hpp:323
The CeresEngine renderer.
Definition Renderer.hpp:35
A base class for all renderer objects.
Definition RendererObject.hpp:38
Event< void(RendererObjectID oldID)> didChangeID
An event called whenever the object changes it's ID.
Definition RendererObject.hpp:55
RendererObjectID getID() const noexcept
An identifier that uniquely identifies this object in the renderer.
Definition RendererObject.hpp:70
RendererObject()=default
Creates a new RendererObject instance.
virtual ~RendererObject() noexcept=default
Destroys an existing RendererObject instance.
RendererObjectID mID
An identifier that uniquely identifies this object in the renderer.
Definition RendererObject.hpp:48
virtual void destroy()=0
Destroys the RendererObject.
void changeID(RendererObjectID newID) noexcept
Method called whenever the RendererObject ID changes.
Event< void(RendererObjectID newID)> willChangeID
An event called whenever the object is about to change it's ID.
Definition RendererObject.hpp:52
A base class for all renderer object managers.
Definition RendererObject.hpp:106
virtual ~RendererObjectManager() noexcept=default
Destroys an existing instance of RendererObjectManager.
Renderer & mRenderer
The renderer that owns this manager instance.
Definition RendererObject.hpp:109
void notifyChangeID(RendererObject &object, const RendererObjectID newID) noexcept
Method called whenever the RendererObject ID changes.
Definition RendererObject.hpp:126
RendererObjectManager(Renderer &renderer) noexcept
Creates a new RendererObjectManager instance.
Renderer & getRenderer() const noexcept
The renderer that owns this manager instance.
Definition RendererObject.hpp:121
Base template for the event class.
Definition Event.hpp:27
Template class to help implement sub-classes of RendererObject.
Definition RendererObject.hpp:82
RendererObjectManagerType< SelfType > ManagerType
Definition RendererObject.hpp:83
friend ManagerType
Definition RendererObject.hpp:84
void destroy() noexcept override
Destroys the RendererObject.
Definition RendererObject.hpp:98
ManagerType & mManager
The owning object manager.
Definition RendererObject.hpp:88
TRendererObject(ManagerType &manager, Args &&... args)
Creates a new TRendererObject instance.
Definition RendererObject.hpp:95
ManagerType & getManager() const noexcept
The owning object manager.
Definition RendererObject.hpp:102
Template class to help implement sub-classes of RendererObjectManager.
Definition RendererObject.hpp:136
ObjectType & create(Args &&... args)
Creates a new renderer object by calling it's constructor.
Definition RendererObject.hpp:159
friend RendererObject
Definition RendererObject.hpp:138
friend ObjectType
Definition RendererObject.hpp:137
TRendererObjectManager(Vector< UPtr< ObjectType > > &objects, Args &&... args)
Creates a new TRendererObjectManager instance.
Definition RendererObject.hpp:150
void destroy(ObjectType &object)
Destroys an existing renderer object by calling it's destructor and releasing it's memory.
Definition RendererObject.hpp:177
Vector< UPtr< ObjectType > > & mObjects
A vector that owns all managed objects.
Definition RendererObject.hpp:142
Definition Application.hpp:19
std::unique_ptr< T, Deleter > UPtr
UPtr is a smart pointer that owns and manages another object through a pointer and disposes of that o...
Definition SmartPtr.hpp:28
std::vector< T, ScopedAllocatorAdaptor< StdAllocator< T, RawAllocator > > > Vector
Vector is a sequence container that encapsulates dynamic size arrays.
Definition Vector.hpp:17
typename RendererObjectTrait< T >::Manager RendererObjectManagerType
The manager type for the T object.
Definition RendererObject.hpp:32
std::uint32_t UInt32
Definition DataTypes.hpp:23
UInt32 RendererObjectID
A type-alias for a type that uniquely identifies a RendererObject.
Definition RendererObject.hpp:35
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25
Definition Span.hpp:668
A type trait object that associates a RendererObject and it's RendererObjectManager type.
Definition RendererObject.hpp:23