Rendering Engine 0.2.9
Modular Graphics Rendering Engine | v0.2.9
material_cache.cpp
Go to the documentation of this file.
1#include "material_cache.hpp"
2#include "i_renderer.hpp"
3#include "material.hpp"
5#include "logger.hpp"
6#include <chrono>
7
8namespace rendering_engine
9{
10
12 :
13 mRenderer(renderer)
14{
15 LOG_DEBUG("MaterialCache created.");
17}
18
20{
21 LOG_DEBUG("MaterialCache destroyed.");
23}
24
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" };
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" };
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}
98
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}
118
119Material* MaterialCache::GetMaterial(std::string materialName)
120{
121 if (auto search = mMaterials.find(materialName); search == mMaterials.end())
122 {
123 return nullptr;
124 }
125
126 return mMaterials.at(materialName).get();
127}
128
129void MaterialCache::RemoveMaterial(std::string materialName)
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}
138
140{
141 LOG_INFO("Releasing all materials.");
143}
144
146{
147 for (auto& material : mMaterials)
148 {
149 material.second->ReleaseRenderResources();
150 }
151}
152
154{
155 for (auto& material : mMaterials)
156 {
157 material.second->InitializeRenderResources();
158 }
159}
160
161}
Defines an abstract interface for rendering backends.
Definition: i_renderer.hpp:29
virtual void RegisterObserver(IRendererObserver *notifier)=0
Registers an observer for rendering events.
virtual void UnregisterObserver(IRendererObserver *notifier)=0
Unregisters a previously registered observer.
void OnRenderResourcesRebuild() override
Renderer callback: re-upload or recreate all GPU resources (used after device reset/rebuild).
Material * GetMaterial(std::string materialName)
Retrieves a pointer to a Material instance by name.
void CreateBuildInMaterials()
Creates built-in materials for testing or demonstration.
void RemoveMaterial(std::string materialName)
Removes a material from the cache.
MaterialCache(IRenderer *renderer)
Constructs a MaterialCache and registers it as a renderer observer.
void AddMaterial(MaterialSettings matSettings)
Adds a new Material instance using the provided settings.
std::unordered_map< std::string, std::shared_ptr< Material > > mMaterials
~MaterialCache()
Destructor. Automatically unregisters from the renderer.
void OnRenderResourcesRelease() override
Renderer callback: release all GPU resources (used during device loss/reset).
void ReleaseAll()
Releases all GPU resources associated with cached materials.
Represents a material instance with parameter values, texture bindings, and rendering configuration.
Definition: material.hpp:30
void InitializeRenderResources()
Initializes backend-specific GPU resources associated with this material.
Definition: material.cpp:26
void SetVec4(const std::string &name, glm::vec4 value)
Sets a vec4 parameter for the material.
Definition: material.cpp:107
void AddTexture(const std::string &textureName)
Adds a texture name to the material's list of used textures.
Definition: material.cpp:112
Engine-wide logging system for runtime diagnostics and performance tracking.
#define LOG_WARNING(msg)
Definition: logger.hpp:40
#define LOG_DEBUG(msg)
Definition: logger.hpp:38
#define LOG_ERROR(msg)
Definition: logger.hpp:41
#define LOG_INFO(msg)
Definition: logger.hpp:39
static const std::vector< MaterialParameterLayoutEntry > Rectangle2DLayout
Settings required to define a material instance.
const std::vector< MaterialParameterLayoutEntry > * parameterLayout