Posted March 30, 2024 by OYNAME
The object manager forms the foundation for managing objects in my 3D engine. Above in the text, we've already covered the structures. Here's a brief explanation of what each structure represents.
The ObjectManager class serves as the interface for creating, managing, and deleting surfaces, meshes, brushes, and shaders. It also allows adding and removing surfaces from meshes, meshes from brushes, and brushes from shaders.
Actually, the object manager could handle all rendering tasks right away. However, for better organization, it makes sense to divide tasks. The object manager already handles many tasks, so it's sensible to create a separate class that exclusively deals with rendering the primitives managed by it. This class, for example, named RenderManager, has the main task of rendering the objects managed by the object manager. This separation keeps the object manager specialized in managing objects, while the RenderManager focuses on rendering. This facilitates debugging, testing, and extending the software, as changes in one area should not affect the others as long as the interfaces between the classes are preserved.
Nevertheless, I must confess that I have opted for an approach that tightly integrates both classes. Through the friend class RenderManager; declaration in the ObjectManager class, I allow the RenderManager access to private and protected members of the ObjectManager class. This can be useful in certain situations, especially when the RenderManager requires special access to perform rendering operations or manage resources. By making this decision, I'm not necessarily reducing the dependency between both classes, but I believe it's justified in this case, particularly because both classes collaborate closely.
Der Objektmanager bildet die Grundlage für die Verwaltung von Objekten in meiner 3D-Engine. Oben im Text sind wir schon mal auf die Strukturen eingegangen. Hier noch mal eine kurze Erklärung, was jede Struktur repräsentiert.
Die ObjectManager-Klasse fungiert als Schnittstelle zur Erstellung, Verwaltung und Löschung von Oberflächen, Meshes, Brushes und Shadern. Sie ermöglicht auch das Hinzufügen und Entfernen von Oberflächen von Meshes, Meshes von Brushes und Brushes von Shadern.
Eigentlich könnte der Objektmanager auch alles gleich rendern. Doch im Interesse einer besseren Übersicht macht es Sinn, Aufgaben zu teilen. Der Objektmanager übernimmt bereits viele Aufgaben, daher ist es sinnvoll, eine separate Klasse zu erstellen, die sich ausschließlich um das Rendering der von ihm verwalteten Primitiven kümmert. Diese Klasse, beispielsweise als RenderManager bezeichnet, hat die Hauptaufgabe, die Objekte zu rendern, die vom Objektmanager verwaltet werden. Durch diese Trennung bleibt der Objektmanager auf die Verwaltung von Objekten spezialisiert, während der RenderManager sich auf das Rendering konzentriert. Dies erleichtert das Debuggen, Testen und Erweitern der Software, da Änderungen in einem Bereich die anderen nicht beeinflussen sollten, solange die Schnittstellen zwischen den Klassen erhalten bleiben.
Trotzdem muss ich gestehen, dass ich mich für einen Weg entschieden habe, der beide Klassen eng miteinander verbindet. Über die friend class RenderManager;-Deklaration in der ObjectManager-Klasse ermögliche ich dem RenderManager den Zugriff auf private und geschützte Mitglieder der ObjectManager-Klasse. Dies kann in bestimmten Situationen sinnvoll sein, insbesondere wenn der RenderManager spezielle Zugriffe benötigt, um beispielsweise Rendering-Operationen durchzuführen oder Ressourcen zu verwalten. Durch diese Entscheidung reduziere ich sicher nicht die Abhängigkeit beider Klassen, aber ich denke, dass es in diesem Fall gerechtfertigt ist, insbesondere weil beide Klassen eng zusammenarbeiten.