[9] The Object Manager


The Object Manager

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.

  • SHADER: Contains information about vertex and pixel shaders, including the binary data bytecode. It also manages the input layout and contains a list of brushes that use this shader.
  • BRUSH: Describes the appearance of a mesh with properties such as gloss, transparency, and color. It manages textures and materials applied to the mesh. A pointer to a list of meshes using the same brush is also stored.
  • MESH: Represents a 3D object in space. It stores transformations like translation, rotation, and scaling, as well as 3D data in surfaces associated with the mesh. A pointer to the constant buffer for the mesh and its associated shader is also stored.
  • SURFACE: Represents a surface composed of a series of vertices and colors. This structure also manages the DirectX buffers for the positions, colors, and indices of the surface. A pointer to a shader used for rendering the surface is also stored.

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.

Who's going to render all this?

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 Objekt Manager

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.

  • SHADER: Enthält Informationen über Vertex- und Pixelshader, einschließlich des Binärdaten-Bytecodes. Es verwaltet auch das Input-Layout und enthält eine Liste von Brushes, die diesen Shader verwenden.
  • BRUSH: Beschreibt das Aussehen eines Meshes mit Eigenschaften wie Glanz, Transparenz und Farbe. Es verwaltet Texturen und Materialien, die auf das Mesh angewendet werden. Ein Pointer auf eine Liste von Meshes, die denselben Brush verwenden, wird ebenfalls gespeichert.
  • MESH: Repräsentiert ein 3D-Objekt im Raum. Es speichert Transformationen wie Translation, Rotation und Skalierung sowie 3D Daten in Surfaceter, die dem Mesh zugeordnet sind. Ein Pointer auf den konstanten Puffer für das Mesh und den zugehörigen Shader wird ebenfalls gespeichert.
  • SURFACE: Stellt eine Oberfläche dar, die aus einer Reihe von Vertices und Farben besteht. Diese Struktur verwaltet auch die DirectX-Buffer für die Positionen, Farben und Indizes der Oberfläche. Ein Pointer auf einen Shader, der für die Darstellung der Oberfläche verwendet wird, wird ebenfalls gespeichert.

 


 

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.

Wer soll das alles nur rendern?

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.


Leave a comment

Log in with itch.io to leave a comment.