Cogs.Core
MaterialEditor.cpp
1#include "MaterialEditor.h"
2
3#include "imgui.h"
4
5#include "Renderer/InspectorGui/InspectorGuiHelper.h"
6
7#include "Resources/MaterialManager.h"
8
9#include "Commands/FieldCommands.h"
10#include "Commands/ResourceCommands.h"
11
12void Cogs::Core::MaterialEditor::showMaterialProperties(MaterialInstanceHandle& materialInstanceHandle)
13{
14 MaterialInstance* material = materialInstanceHandle.resolve();
15
16 for (auto& prop : material->material->constantBuffers.variables) {
17
18 switch (prop.type) {
19
20 case MaterialDataType::Float:
21 {
22 float value = {};
23 material->getProperty(prop.key, &value, sizeof(value));
24 if (ImGui::DragFloat(prop.name.c_str(), &value)) {
25 editor->apply<SetMaterialPropertyCommand<float>>(materialInstanceHandle, prop.name, value);
26 }
27 }
28 break;
29
30 case MaterialDataType::Float2:
31 {
32 glm::vec2 value = {};
33 material->getProperty(prop.key, &value, sizeof(value));
34 if (ImGui::DragFloat2(prop.name.c_str(), glm::value_ptr(value))) {
35 editor->apply<SetMaterialPropertyCommand<glm::vec2>>(materialInstanceHandle, prop.name, value);
36 }
37 }
38 break;
39
40 case MaterialDataType::Float3:
41 {
42 glm::vec3 value = {};
43 material->getProperty(prop.key, &value, sizeof(value));
45 if (ImGui::ColorEdit3(prop.name.c_str(), glm::value_ptr(value))) {
46 editor->apply<SetMaterialPropertyCommand<glm::vec3>>(materialInstanceHandle, prop.name, value);
47 }
48 }
49 else {
50 if (ImGui::DragFloat3(prop.name.c_str(), glm::value_ptr(value))) {
51 editor->apply<SetMaterialPropertyCommand<glm::vec3>>(materialInstanceHandle, prop.name, value);
52 }
53 }
54 }
55 break;
56
57 case MaterialDataType::Float4:
58 {
59 glm::vec4 value = {};
60 material->getProperty(prop.key, &value, sizeof(value));
62 if (ImGui::ColorEdit4(prop.name.c_str(), glm::value_ptr(value))) {
63 editor->apply<SetMaterialPropertyCommand<glm::vec4>>(materialInstanceHandle, prop.name, value);
64 }
65 }
66 else {
67 if (ImGui::DragFloat4(prop.name.c_str(), glm::value_ptr(value))) {
68 editor->apply<SetMaterialPropertyCommand<glm::vec4>>(materialInstanceHandle, prop.name, value);
69 }
70 }
71 }
72 break;
73
74
75 case MaterialDataType::Float4x4:
76 {
77 glm::mat4 value = {};
78 material->getProperty(prop.key, &value, sizeof(value));
79 if (showMatrix(prop.name, value)) {
80 editor->apply<SetMaterialPropertyCommand<glm::mat4>>(materialInstanceHandle, prop.name, value);
81 }
82 }
83 break;
84
85 case MaterialDataType::Int:
86 {
87 int32_t value = {};
88 material->getProperty(prop.key, &value, sizeof(value));
89 if (ImGui::DragInt(prop.name.c_str(), &value, 1.0f, 0, 100)) {
90 editor->apply<SetMaterialPropertyCommand<int32_t>>(materialInstanceHandle, prop.name, value);
91 }
92 break;
93 }
94
95 case MaterialDataType::UInt:
96 {
97 int32_t value = {};
98 material->getProperty(prop.key, &value, sizeof(value));
99 if (ImGui::DragInt(prop.name.c_str(), &value, 1.0f, 0, 100)) {
100 editor->apply<SetMaterialPropertyCommand<uint32_t>>(materialInstanceHandle, prop.name, (uint32_t)value);
101 }
102 }
103 break;
104
105 case MaterialDataType::Bool:
106 {
107 bool value = {};
108 material->getProperty(prop.key, &value, sizeof(value));
109 if (ImGui::Checkbox(prop.name.c_str(), &value)) {
110 editor->apply<SetMaterialPropertyCommand<bool>>(materialInstanceHandle, prop.name, value);
111 }
112 }
113 break;
114
115 default:
116 editor->showText("Unsupported: %d", static_cast<int>(prop.type));
117 break;
118 }
119 }
120}
121
122bool Cogs::Core::MaterialEditor::showMaterialInstance(FieldInfo & fieldInfo, MaterialInstanceHandle & materialInstanceHandle)
123{
124 auto state = editor->getState();
125
126 if (!materialInstanceHandle) {
127 if (editor->imageButton(Icon::New, 26, 2)) {
128 auto material = context->materialManager->getMaterial("StandardMaterial");
129 auto materialInstance = context->materialInstanceManager->createMaterialInstance(material);
130
131 editor->apply<SetFieldCommand<MaterialInstanceHandle>>(state->selected, fieldInfo, materialInstance);
132
133 return true;
134 }
135 } else {
136 if (materialInstanceHandle->material->getName() == "StandardMaterial") {
137 MaterialInstance* material = materialInstanceHandle.resolve();
138
139 for (auto & texVar : material->textureVariables) {
140 auto & name = texVar.property->name;
141
142 TextureHandle& value = texVar.texture.handle;
143
144 ImGui::PushID(&texVar.texture.handle);
145
146 if (editor->showTexture(name, value)) {
147 editor->apply<SetTexturePropertyCommand>(materialInstanceHandle, name, value);
148
149 if (name == "albedoMap") {
150 material->setVariant("AlbedoMap", true);
151 } else if (name == "normalMap") {
152 material->setVariant("NormalMap", true);
153 } else if (name == "specularMap") {
154 material->setVariant("SpecularMap", true);
155 } else if (name == "roughnessMap") {
156 material->setVariant("RoughnessMap", true);
157 } else if (name == "metallicMap") {
158 material->setVariant("MetallicMap", true);
159 } else if (name == "opacityMap") {
160 material->setVariant("OpacityMap", true);
161 }
162
163 material->setVariant("Textured", true);
164 material->setChanged();
165 }
166
167 ImGui::PopID();
168 }
169 }
170
171 auto material = materialInstanceHandle.resolve();
172
173 std::string flags;
174 flags += material->isBackdrop() ? "Backdrop " : "";
175 flags += material->hasTransparency() ? "Transparent " : "";
176 flags += material->isDefaultMaterial() ? "Default " : "";
177 flags = flags.size() ? "Flags: " + flags : "Flags: None";
178
179 editor->showText("%s", flags.c_str());
180
181 int permutationIndex = static_cast<int>(material->permutationIndex);
182 std::vector<const char*> permutations;
183
184 for (auto& permutation : material->material->definition.permutations) {
185 permutations.push_back(permutation.permutationName.c_str());
186 }
187
188 if (ImGui::Combo("Permutation", &permutationIndex, permutations.data(), static_cast<int>(permutations.size()))) {
189 material->setPermutation(permutations[permutationIndex]);
190 }
191
192 Cogs::Core::showMaterialVariants(material);
193
194 Cogs::Core::showMaterialOptions(context, &material->options, "Options");
195
196 Cogs::Core::MaterialEditor::showMaterialProperties(materialInstanceHandle);
197 }
198
199 return false;
200}
void showText(const char *format,...) const
Show the same type of label as ImGui::Text, but with the added ability to highlight and copy text....
Definition: Editor.cpp:1831
@ sRGB
Value is a color and is subject to gamma correction.