1#include "MaterialEditor.h"
5#include "Renderer/InspectorGui/InspectorGuiHelper.h"
7#include "Resources/MaterialManager.h"
9#include "Commands/FieldCommands.h"
10#include "Commands/ResourceCommands.h"
12void Cogs::Core::MaterialEditor::showMaterialProperties(MaterialInstanceHandle& materialInstanceHandle)
14 MaterialInstance* material = materialInstanceHandle.resolve();
16 for (
auto& prop : material->material->constantBuffers.variables) {
20 case MaterialDataType::Float:
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);
30 case MaterialDataType::Float2:
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);
40 case MaterialDataType::Float3:
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);
50 if (ImGui::DragFloat3(prop.name.c_str(), glm::value_ptr(value))) {
51 editor->apply<SetMaterialPropertyCommand<glm::vec3>>(materialInstanceHandle, prop.name, value);
57 case MaterialDataType::Float4:
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);
67 if (ImGui::DragFloat4(prop.name.c_str(), glm::value_ptr(value))) {
68 editor->apply<SetMaterialPropertyCommand<glm::vec4>>(materialInstanceHandle, prop.name, value);
75 case MaterialDataType::Float4x4:
78 material->getProperty(prop.key, &value,
sizeof(value));
79 if (showMatrix(prop.name, value)) {
80 editor->apply<SetMaterialPropertyCommand<glm::mat4>>(materialInstanceHandle, prop.name, value);
85 case MaterialDataType::Int:
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);
95 case MaterialDataType::UInt:
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);
105 case MaterialDataType::Bool:
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);
116 editor->
showText(
"Unsupported: %d",
static_cast<int>(prop.type));
122bool Cogs::Core::MaterialEditor::showMaterialInstance(FieldInfo & fieldInfo, MaterialInstanceHandle & materialInstanceHandle)
124 auto state = editor->getState();
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);
131 editor->apply<SetFieldCommand<MaterialInstanceHandle>>(state->selected, fieldInfo, materialInstance);
136 if (materialInstanceHandle->material->getName() ==
"StandardMaterial") {
137 MaterialInstance* material = materialInstanceHandle.resolve();
139 for (
auto & texVar : material->textureVariables) {
140 auto & name = texVar.property->name;
142 TextureHandle& value = texVar.texture.handle;
144 ImGui::PushID(&texVar.texture.handle);
146 if (editor->showTexture(name, value)) {
147 editor->apply<SetTexturePropertyCommand>(materialInstanceHandle, name, value);
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);
163 material->setVariant(
"Textured",
true);
164 material->setChanged();
171 auto material = materialInstanceHandle.resolve();
174 flags += material->isBackdrop() ?
"Backdrop " :
"";
175 flags += material->hasTransparency() ?
"Transparent " :
"";
176 flags += material->isDefaultMaterial() ?
"Default " :
"";
177 flags = flags.size() ?
"Flags: " + flags :
"Flags: None";
179 editor->showText(
"%s", flags.c_str());
181 int permutationIndex =
static_cast<int>(material->permutationIndex);
182 std::vector<const char*> permutations;
184 for (
auto& permutation : material->material->definition.permutations) {
185 permutations.push_back(permutation.permutationName.c_str());
188 if (ImGui::Combo(
"Permutation", &permutationIndex, permutations.data(),
static_cast<int>(permutations.size()))) {
189 material->setPermutation(permutations[permutationIndex]);
192 Cogs::Core::showMaterialVariants(material);
194 Cogs::Core::showMaterialOptions(context, &material->options,
"Options");
196 Cogs::Core::MaterialEditor::showMaterialProperties(materialInstanceHandle);
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....
@ sRGB
Value is a color and is subject to gamma correction.