Rendering Engine 0.2.9
Modular Graphics Rendering Engine | v0.2.9
rendering_engine::MaterialCache Class Reference

Manages creation, storage, and lifecycle of Material objects within the rendering engine. More...

#include <material_cache.hpp>

Inherits rendering_engine::IRendererObserver.

Public Member Functions

 MaterialCache (IRenderer *renderer)
 Constructs a MaterialCache and registers it as a renderer observer. More...
 
 ~MaterialCache ()
 Destructor. Automatically unregisters from the renderer. More...
 
void CreateBuildInMaterials ()
 Creates built-in materials for testing or demonstration. More...
 
void AddMaterial (MaterialSettings matSettings)
 Adds a new Material instance using the provided settings. More...
 
MaterialGetMaterial (std::string materialName)
 Retrieves a pointer to a Material instance by name. More...
 
void RemoveMaterial (std::string materialName)
 Removes a material from the cache. More...
 
void ReleaseAll ()
 Releases all GPU resources associated with cached materials. More...
 
- Public Member Functions inherited from rendering_engine::IRendererObserver
virtual void OnRenderResourcesRelease ()=0
 Renderer callback: release all GPU resources (used during device loss/reset). More...
 
virtual void OnRenderResourcesRebuild ()=0
 Renderer callback: re-upload or recreate all GPU resources (used after device reset/rebuild). More...
 
virtual ~IRendererObserver ()=default
 Virtual destructor. More...
 

Protected Member Functions

void OnRenderResourcesRelease () override
 Renderer callback: release all GPU resources (used during device loss/reset). More...
 
void OnRenderResourcesRebuild () override
 Renderer callback: re-upload or recreate all GPU resources (used after device reset/rebuild). More...
 

Protected Attributes

IRenderermRenderer
 
std::unordered_map< std::string, std::shared_ptr< Material > > mMaterials
 

Detailed Description

Manages creation, storage, and lifecycle of Material objects within the rendering engine.

MaterialCache serves as a centralized system to instantiate, store, and retrieve materials used in the engine. It supports both manually added materials and, in the future, loading materials from JSON definitions.

See also
Jira EPIC: MAT-101 - Node-Based Material Editor

It observes renderer events (such as swapchain recreation) to reinitialize or release GPU resources tied to materials.

Definition at line 29 of file material_cache.hpp.

Constructor & Destructor Documentation

◆ MaterialCache()

rendering_engine::MaterialCache::MaterialCache ( IRenderer renderer)

Constructs a MaterialCache and registers it as a renderer observer.

Parameters
rendererPointer to the renderer interface used for creating GPU resources.

Definition at line 11 of file material_cache.cpp.

12 :
13 mRenderer(renderer)
14{
15 LOG_DEBUG("MaterialCache created.");
17}
virtual void RegisterObserver(IRendererObserver *notifier)=0
Registers an observer for rendering events.
#define LOG_DEBUG(msg)
Definition: logger.hpp:38

◆ ~MaterialCache()

rendering_engine::MaterialCache::~MaterialCache ( )

Destructor. Automatically unregisters from the renderer.

Definition at line 19 of file material_cache.cpp.

20{
21 LOG_DEBUG("MaterialCache destroyed.");
23}
virtual void UnregisterObserver(IRendererObserver *notifier)=0
Unregisters a previously registered observer.

Member Function Documentation

◆ AddMaterial()

void rendering_engine::MaterialCache::AddMaterial ( MaterialSettings  matSettings)

Adds a new Material instance using the provided settings.

Parameters
matSettingsMaterialSettings struct containing metadata and configuration for the new material.

If a material with the same name already exists, it will be replaced.

Definition at line 99 of file material_cache.cpp.

100{
101 if (matSettings.materialName.empty())
102 {
103 LOG_ERROR("Attempted to add material with empty name.");
104 return;
105 }
106
107 auto it = mMaterials.find(matSettings.materialName);
108 if (it != mMaterials.end() && it->second)
109 {
110 LOG_WARNING("Replacing existing material: " + matSettings.materialName);
111 it->second->ReleaseRenderResources();
112 }
113
114 mMaterials[matSettings.materialName] =
115 std::make_shared<Material>(mRenderer, matSettings);
116 LOG_DEBUG("Material added: " + matSettings.materialName);
117}
std::unordered_map< std::string, std::shared_ptr< Material > > mMaterials
#define LOG_WARNING(msg)
Definition: logger.hpp:40
#define LOG_ERROR(msg)
Definition: logger.hpp:41

◆ CreateBuildInMaterials()

void rendering_engine::MaterialCache::CreateBuildInMaterials ( )

Creates built-in materials for testing or demonstration.

This is a temporary function to manually define materials in code. In the future, materials will be created by parsing JSON files from a materials folder.

Definition at line 25 of file material_cache.cpp.

26{
27 LOG_INFO("Creating built-in materials...");
28 auto start = std::chrono::steady_clock::now();
29 // BasicTexture3D material
30 MaterialSettings setBasicTexture3D;
31 setBasicTexture3D.materialName = std::string{ "BasicTexture3D" };
32 setBasicTexture3D.materialDomain = MaterialDomain::Surface3D;
33 setBasicTexture3D.shadingModel = ShadingModel::Unlit;
34 setBasicTexture3D.blendMode = BlendMode::Opaque;
35
36 AddMaterial(setBasicTexture3D);
37 Material* basicTexture3DMat = GetMaterial(setBasicTexture3D.materialName);
38 if (basicTexture3DMat)
39 {
40 basicTexture3DMat->AddTexture("test_cube_color");
41 //basicTexture3DMat->AddTexture("PNG_transparency_demonstration_1");
42 }
43 LOG_DEBUG("Creating material: BasicTexture3D");
44 basicTexture3DMat->InitializeRenderResources();
45
46 // FlatColorFiltering material
47 MaterialSettings setFlatColorFiltering;
48 setFlatColorFiltering.materialName = std::string{ "FlatColorFiltering" };
49 setFlatColorFiltering.materialDomain = MaterialDomain::Surface3D;
50 setFlatColorFiltering.shadingModel = ShadingModel::Unlit;
51 setFlatColorFiltering.blendMode = BlendMode::Opaque;
52
53 AddMaterial(setFlatColorFiltering);
54 Material* flatColorFilteringMat = GetMaterial(setFlatColorFiltering.materialName);
55 if (flatColorFilteringMat)
56 {
57 flatColorFilteringMat->AddTexture("D4FontTextureSegoeScript");
58 }
59 LOG_DEBUG("Creating material: FlatColorFiltering");
60 flatColorFilteringMat->InitializeRenderResources();
61
62 // Test sprite 2d
63 MaterialSettings setTestSprite2d;
64 setTestSprite2d.materialName = std::string{ "Quad2D" };
65 setTestSprite2d.materialDomain = MaterialDomain::Sprite2D;
66 setTestSprite2d.shadingModel = ShadingModel::Unlit;
67 setTestSprite2d.blendMode = BlendMode::Opaque;
68
69 AddMaterial(setTestSprite2d);
70 Material* testSprite2dMat = GetMaterial(setTestSprite2d.materialName);
71 if (testSprite2dMat)
72 {
73 testSprite2dMat->AddTexture("PNG_transparency_demonstration_1");
74 }
75 LOG_DEBUG("Creating material: Quad2D");
76 testSprite2dMat->InitializeRenderResources();
77
78 MaterialSettings rectangle2D;
79 rectangle2D.materialName = std::string{ "Rectangle2D" };
80 rectangle2D.materialDomain = MaterialDomain::Sprite2D;
81 rectangle2D.shadingModel = ShadingModel::Unlit;
82 rectangle2D.blendMode = BlendMode::Translucent;
83 rectangle2D.parameterLayout = &Rectangle2DLayout;
84
85 AddMaterial(rectangle2D);
86 Material* rectangle2DMat = GetMaterial(rectangle2D.materialName);
87 rectangle2DMat->SetVec4("Color", glm::vec4(1.0f, 1.0f, 1.0f, 1.0f));
88 LOG_DEBUG("Creating material: Rectangle2D");
89 rectangle2DMat->InitializeRenderResources();
90
91 auto end = std::chrono::steady_clock::now();
92 float totalMs =
93 std::chrono::duration<float, std::milli>(end - start).count();
94
95 LOG_INFO("Built-in materials created in " +
96 std::to_string(totalMs) + " ms.");
97}
Material * GetMaterial(std::string materialName)
Retrieves a pointer to a Material instance by name.
void AddMaterial(MaterialSettings matSettings)
Adds a new Material instance using the provided settings.
#define LOG_INFO(msg)
Definition: logger.hpp:39
static const std::vector< MaterialParameterLayoutEntry > Rectangle2DLayout

◆ GetMaterial()

Material * rendering_engine::MaterialCache::GetMaterial ( std::string  materialName)

Retrieves a pointer to a Material instance by name.

Parameters
materialNameName of the material to retrieve.
Returns
Pointer to the Material instance, or nullptr if not found.

Definition at line 119 of file material_cache.cpp.

120{
121 if (auto search = mMaterials.find(materialName); search == mMaterials.end())
122 {
123 return nullptr;
124 }
125
126 return mMaterials.at(materialName).get();
127}

◆ OnRenderResourcesRebuild()

void rendering_engine::MaterialCache::OnRenderResourcesRebuild ( )
overrideprotectedvirtual

Renderer callback: re-upload or recreate all GPU resources (used after device reset/rebuild).

This method will be called after the device or swapchain is recreated, allowing the observer to re-upload or recreate all necessary resources for rendering.

Implements rendering_engine::IRendererObserver.

Definition at line 153 of file material_cache.cpp.

154{
155 for (auto& material : mMaterials)
156 {
157 material.second->InitializeRenderResources();
158 }
159}

◆ OnRenderResourcesRelease()

void rendering_engine::MaterialCache::OnRenderResourcesRelease ( )
overrideprotectedvirtual

Renderer callback: release all GPU resources (used during device loss/reset).

This method will be called before any device or swapchain is destroyed, allowing the observer to safely release all handles and deallocate any GPU memory.

Implements rendering_engine::IRendererObserver.

Definition at line 145 of file material_cache.cpp.

146{
147 for (auto& material : mMaterials)
148 {
149 material.second->ReleaseRenderResources();
150 }
151}

◆ ReleaseAll()

void rendering_engine::MaterialCache::ReleaseAll ( )

Releases all GPU resources associated with cached materials.

Iterates through every material in the cache and calls their resource release routines, freeing descriptor set layouts, pipelines, and any other backend allocations. Unlike RemoveMaterial, this does not erase the material records themselves from the cache, only their GPU-side resources.

  • Use when unloading a scene or before destroying the renderer to ensure all GPU resources are released in a controlled manner.
  • After calling this, materials remain in the cache but are not renderable until OnRenderResourcesRebuild (or per-material reinitialization) is performed.
  • Safe to call multiple times; redundant calls will have no effect once resources are released.
See also
RemoveMaterial()
OnRenderResourcesRelease()
OnRenderResourcesRebuild()

Definition at line 139 of file material_cache.cpp.

140{
141 LOG_INFO("Releasing all materials.");
143}
void OnRenderResourcesRelease() override
Renderer callback: release all GPU resources (used during device loss/reset).

◆ RemoveMaterial()

void rendering_engine::MaterialCache::RemoveMaterial ( std::string  materialName)

Removes a material from the cache.

Parameters
materialNameName of the material to remove.

Definition at line 129 of file material_cache.cpp.

130{
131 if (auto it = mMaterials.find(materialName); it != mMaterials.end())
132 {
133 LOG_INFO("Removing material: " + materialName);
134 it->second->ReleaseRenderResources();
135 mMaterials.erase(it);
136 }
137}

Member Data Documentation

◆ mMaterials

std::unordered_map<std::string, std::shared_ptr<Material> > rendering_engine::MaterialCache::mMaterials
protected

Definition at line 106 of file material_cache.hpp.

◆ mRenderer

IRenderer* rendering_engine::MaterialCache::mRenderer
protected

Definition at line 105 of file material_cache.hpp.


The documentation for this class was generated from the following files: