From 91c385ab9d3aeb493e4e5e87b06f91afd48188f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Sun, 22 May 2022 13:20:19 +0200 Subject: [PATCH] Pain Tool Brush textures (#448) * added brush textures to paint tool * logo * fix --- Content/logo_small.png | Bin 42716 -> 29822 bytes Editor/PaintToolWindow.cpp | 112 ++++++++++++++++-- Editor/PaintToolWindow.h | 5 + WickedEngine/shaders/ShaderInterop_Renderer.h | 3 +- WickedEngine/shaders/paint_textureCS.hlsl | 26 +++- WickedEngine/wiFont.cpp | 3 +- WickedEngine/wiGUI.cpp | 10 +- WickedEngine/wiGUI.h | 3 + WickedEngine/wiVersion.cpp | 2 +- 9 files changed, 143 insertions(+), 21 deletions(-) diff --git a/Content/logo_small.png b/Content/logo_small.png index 9f69ce0564d26d1fb6e37da4914933f33438bd93..d495bdade9b0cc3dbf8f648bf7745929aca1ac5a 100644 GIT binary patch literal 29822 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 bpb%Do@0I^Iy${X|h3IM;YJ5_&dj5X^4KX$f literal 42716 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 HizogM%zNoq diff --git a/Editor/PaintToolWindow.cpp b/Editor/PaintToolWindow.cpp index 5435a48a2..804500565 100644 --- a/Editor/PaintToolWindow.cpp +++ b/Editor/PaintToolWindow.cpp @@ -16,7 +16,7 @@ void PaintToolWindow::Create(EditorComponent* editor) wi::gui::Window::Create("Paint Tool Window"); SetSize(XMFLOAT2(410, 610)); - float x = 100; + float x = 105; float y = 0; float hei = 20; float step = hei + 4; @@ -38,8 +38,6 @@ void PaintToolWindow::Create(EditorComponent* editor) modeComboBox.AddItem("Wind weight (Alpha)"); modeComboBox.SetSelected(0); modeComboBox.OnSelect([&](wi::gui::EventArgs args) { - textureSlotComboBox.SetEnabled(false); - saveTextureButton.SetEnabled(false); switch (args.iValue) { case MODE_DISABLED: @@ -47,8 +45,6 @@ void PaintToolWindow::Create(EditorComponent* editor) break; case MODE_TEXTURE: infoLabel.SetText("In texture paint mode, you can paint on textures. Brush will be applied in texture space.\nREMEMBER to save texture when finished to save texture file!\nREMEMBER to save scene to retain new texture bindings on materials!"); - textureSlotComboBox.SetEnabled(true); - saveTextureButton.SetEnabled(true); break; case MODE_VERTEXCOLOR: infoLabel.SetText("In vertex color mode, you can paint colors on selected geometry (per vertex). \"Use vertex colors\" will be automatically enabled for the selected material, or all materials if the whole object is selected. If there is no vertexcolors vertex buffer, one will be created with white as default for every vertex."); @@ -135,6 +131,12 @@ void PaintToolWindow::Create(EditorComponent* editor) pressureCheckBox.SetCheck(false); AddWidget(&pressureCheckBox); + colorPicker.Create("Color", false); + colorPicker.SetPos(XMFLOAT2(10, y += step)); + AddWidget(&colorPicker); + + y += colorPicker.GetScale().y; + textureSlotComboBox.Create("Texture Slot: "); textureSlotComboBox.SetTooltip("Choose texture slot of the selected material to paint (texture paint mode only)"); textureSlotComboBox.SetPos(XMFLOAT2(x, y += step)); @@ -152,14 +154,12 @@ void PaintToolWindow::Create(EditorComponent* editor) textureSlotComboBox.AddItem("ClearcoatRoughMap (R)", MaterialComponent::CLEARCOATROUGHNESSMAP); textureSlotComboBox.AddItem("ClearcoatNormMap (R)", MaterialComponent::CLEARCOATNORMALMAP); textureSlotComboBox.SetSelected(0); - textureSlotComboBox.SetEnabled(false); AddWidget(&textureSlotComboBox); saveTextureButton.Create("Save Texture"); saveTextureButton.SetTooltip("Save edited texture."); saveTextureButton.SetSize(XMFLOAT2(200, hei)); saveTextureButton.SetPos(XMFLOAT2(x, y += step)); - saveTextureButton.SetEnabled(false); saveTextureButton.OnClick([this] (wi::gui::EventArgs args) { Scene& scene = wi::scene::GetScene(); @@ -192,9 +192,67 @@ void PaintToolWindow::Create(EditorComponent* editor) }); AddWidget(&saveTextureButton); - colorPicker.Create("Color", false); - colorPicker.SetPos(XMFLOAT2(10, y += step)); - AddWidget(&colorPicker); + brushTextureButton.Create(""); + brushTextureButton.SetDescription("Brush tex: "); + brushTextureButton.SetTooltip("Open an image to use as brush texture (splatting mode).\nSplat mode means that the texture will be relative to the brush position"); + brushTextureButton.SetSize(XMFLOAT2(hei*2, hei*2)); + brushTextureButton.SetPos(XMFLOAT2(x, y += step)); + brushTextureButton.sprites[wi::gui::IDLE].params.color = wi::Color::White(); + brushTextureButton.sprites[wi::gui::FOCUS].params.color = wi::Color::Gray(); + brushTextureButton.sprites[wi::gui::ACTIVE].params.color = wi::Color::White(); + brushTextureButton.sprites[wi::gui::DEACTIVATING].params.color = wi::Color::Gray(); + brushTextureButton.OnClick([this](wi::gui::EventArgs args) { + if (brushTex.IsValid()) + { + brushTex = {}; + brushTextureButton.SetImage({}); + } + else + { + wi::helper::FileDialogParams params; + params.type = wi::helper::FileDialogParams::OPEN; + params.description = "Texture"; + params.extensions = wi::resourcemanager::GetSupportedImageExtensions(); + wi::helper::FileDialog(params, [this](std::string fileName) { + wi::eventhandler::Subscribe_Once(wi::eventhandler::EVENT_THREAD_SAFE_POINT, [=](uint64_t userdata) { + brushTex = wi::resourcemanager::Load(fileName); + brushTextureButton.SetImage(brushTex); + }); + }); + } + }); + AddWidget(&brushTextureButton); + + revealTextureButton.Create(""); + revealTextureButton.SetDescription("Reveal tex: "); + revealTextureButton.SetTooltip("Open an image to use as reveal mode texture.\nReveal mode means that the texture will use the UV of the mesh. It will be multiplied by brush tex."); + revealTextureButton.SetSize(XMFLOAT2(hei * 2, hei * 2)); + revealTextureButton.SetPos(XMFLOAT2(x + 150, y)); + revealTextureButton.sprites[wi::gui::IDLE].params.color = wi::Color::White(); + revealTextureButton.sprites[wi::gui::FOCUS].params.color = wi::Color::Gray(); + revealTextureButton.sprites[wi::gui::ACTIVE].params.color = wi::Color::White(); + revealTextureButton.sprites[wi::gui::DEACTIVATING].params.color = wi::Color::Gray(); + revealTextureButton.OnClick([this](wi::gui::EventArgs args) { + if (revealTex.IsValid()) + { + revealTex = {}; + revealTextureButton.SetImage({}); + } + else + { + wi::helper::FileDialogParams params; + params.type = wi::helper::FileDialogParams::OPEN; + params.description = "Texture"; + params.extensions = wi::resourcemanager::GetSupportedImageExtensions(); + wi::helper::FileDialog(params, [this](std::string fileName) { + wi::eventhandler::Subscribe_Once(wi::eventhandler::EVENT_THREAD_SAFE_POINT, [=](uint64_t userdata) { + revealTex = wi::resourcemanager::Load(fileName); + revealTextureButton.SetImage(revealTex); + }); + }); + } + }); + AddWidget(&revealTextureButton); Translate(XMFLOAT3((float)editor->GetLogicalWidth() - 550, 50, 0)); SetVisible(false); @@ -204,6 +262,21 @@ void PaintToolWindow::Update(float dt) { RecordHistory(false); + if (GetMode() == MODE_TEXTURE) + { + textureSlotComboBox.SetVisible(true); + saveTextureButton.SetVisible(true); + brushTextureButton.SetVisible(true); + revealTextureButton.SetVisible(true); + } + else + { + textureSlotComboBox.SetVisible(false); + saveTextureButton.SetVisible(false); + brushTextureButton.SetVisible(false); + revealTextureButton.SetVisible(false); + } + rot -= dt; // by default, paint tool is on center of screen, this makes it easy to tweak radius with GUI: XMFLOAT2 posNew; @@ -308,7 +381,22 @@ void PaintToolWindow::Update(float dt) device->BindComputeShader(wi::renderer::GetShader(wi::enums::CSTYPE_PAINT_TEXTURE), cmd); - device->BindResource(wi::texturehelper::getWhite(), 0, cmd); + if (brushTex.IsValid()) + { + device->BindResource(&brushTex.GetTexture(), 0, cmd); + } + else + { + device->BindResource(wi::texturehelper::getWhite(), 0, cmd); + } + if (revealTex.IsValid()) + { + device->BindResource(&revealTex.GetTexture(), 1, cmd); + } + else + { + device->BindResource(wi::texturehelper::getWhite(), 1, cmd); + } device->BindUAV(&editTexture, 0, cmd); PaintTextureCB cb; @@ -317,6 +405,7 @@ void PaintToolWindow::Update(float dt) cb.xPaintBrushAmount = amount; cb.xPaintBrushFalloff = falloff; cb.xPaintBrushColor = color.rgba; + cb.xPaintReveal = revealTex.IsValid() ? 1 : 0; device->PushConstants(&cb, sizeof(cb), cmd); const uint diameter = cb.xPaintBrushRadius * 2; @@ -992,6 +1081,7 @@ void PaintToolWindow::RecordHistory(bool start, CommandList cmd) Texture newTex; TextureDesc desc = editTexture.GetDesc(); desc.format = Format::R8G8B8A8_UNORM; // force format to one that is writable by GPU + desc.bind_flags |= BindFlag::SHADER_RESOURCE | BindFlag::UNORDERED_ACCESS; device->CreateTexture(&desc, nullptr, &newTex); for (uint32_t i = 0; i < newTex.GetDesc().mip_levels; ++i) { diff --git a/Editor/PaintToolWindow.h b/Editor/PaintToolWindow.h index 0f47d4318..857539a9d 100644 --- a/Editor/PaintToolWindow.h +++ b/Editor/PaintToolWindow.h @@ -22,6 +22,9 @@ class PaintToolWindow : public wi::gui::Window wi::vector sculpting_indices; XMFLOAT3 sculpting_normal = XMFLOAT3(0, 0, 0); + wi::Resource brushTex; + wi::Resource revealTex; + public: void Create(EditorComponent* editor); @@ -41,6 +44,8 @@ public: wi::gui::ColorPicker colorPicker; wi::gui::ComboBox textureSlotComboBox; wi::gui::Button saveTextureButton; + wi::gui::Button brushTextureButton; + wi::gui::Button revealTextureButton; void Update(float dt); void DrawBrush() const; diff --git a/WickedEngine/shaders/ShaderInterop_Renderer.h b/WickedEngine/shaders/ShaderInterop_Renderer.h index 532823a97..91c983375 100644 --- a/WickedEngine/shaders/ShaderInterop_Renderer.h +++ b/WickedEngine/shaders/ShaderInterop_Renderer.h @@ -779,7 +779,8 @@ struct PaintTextureCB float xPaintBrushFalloff; uint xPaintBrushColor; - uint2 padding0; + uint xPaintReveal; + uint padding0; }; CBUFFER(PaintRadiusCB, CBSLOT_RENDERER_MISC) diff --git a/WickedEngine/shaders/paint_textureCS.hlsl b/WickedEngine/shaders/paint_textureCS.hlsl index eda31bbb7..9e9b29b38 100644 --- a/WickedEngine/shaders/paint_textureCS.hlsl +++ b/WickedEngine/shaders/paint_textureCS.hlsl @@ -4,6 +4,7 @@ PUSHCONSTANT(push, PaintTextureCB); Texture2D texture_brush : register(t0); +Texture2D texture_reveal : register(t1); RWTexture2D output : register(u0); @@ -11,12 +12,31 @@ RWTexture2D output : register(u0); void main( uint3 DTid : SV_DispatchThreadID ) { const uint2 pixel = push.xPaintBrushCenter + DTid.xy - push.xPaintBrushRadius.xx; - const float2 uv = (DTid.xy + 0.5f) / push.xPaintBrushRadius.xx; - const float4 color = texture_brush.SampleLevel(sampler_linear_clamp, uv, 0) * unpack_rgba(push.xPaintBrushColor); + + const float2 brush_uv = (DTid.xy + 0.5) / (push.xPaintBrushRadius.xx * 2); + const float2 brush_uv_quad_x = QuadReadAcrossX(brush_uv); + const float2 brush_uv_quad_y = QuadReadAcrossY(brush_uv); + const float2 brush_uv_dx = brush_uv - brush_uv_quad_x; + const float2 brush_uv_dy = brush_uv - brush_uv_quad_y; + float4 brush_color = texture_brush.SampleGrad(sampler_linear_clamp, brush_uv, brush_uv_dx, brush_uv_dy) * unpack_rgba(push.xPaintBrushColor); + + float2 dim; + output.GetDimensions(dim.x, dim.y); + const float2 reveal_uv = (pixel + 0.5) / dim; + const float2 reveal_uv_quad_x = QuadReadAcrossX(reveal_uv); + const float2 reveal_uv_quad_y = QuadReadAcrossY(reveal_uv); + const float2 reveal_uv_dx = reveal_uv - reveal_uv_quad_x; + const float2 reveal_uv_dy = reveal_uv - reveal_uv_quad_y; + float4 reveal_color = texture_reveal.SampleGrad(sampler_linear_clamp, reveal_uv, reveal_uv_dx, reveal_uv_dy); + const float dist = distance((float2)pixel, (float2)push.xPaintBrushCenter); const float affection = push.xPaintBrushAmount * pow(1 - saturate(dist / (float)push.xPaintBrushRadius), push.xPaintBrushFalloff); if (affection > 0 && dist < (float)push.xPaintBrushRadius) { - output[pixel] = lerp(output[pixel], color, affection); + if (push.xPaintReveal) + { + brush_color *= reveal_color; + } + output[pixel] = lerp(output[pixel], brush_color, affection); } } diff --git a/WickedEngine/wiFont.cpp b/WickedEngine/wiFont.cpp index fb20b9572..096bb972d 100644 --- a/WickedEngine/wiFont.cpp +++ b/WickedEngine/wiFont.cpp @@ -134,7 +134,6 @@ namespace wi::font } }; - cursor.size.y = LINEBREAK_SIZE; int code_prev = 0; for (size_t i = 0; i < text_length; ++i) { @@ -213,7 +212,7 @@ namespace wi::font } cursor.size.x = std::max(cursor.size.x, cursor.pos.x); - cursor.size.y = std::max(cursor.size.y, cursor.pos.y); + cursor.size.y = std::max(cursor.size.y, cursor.pos.y + LINEBREAK_SIZE); } word_wrap(); diff --git a/WickedEngine/wiGUI.cpp b/WickedEngine/wiGUI.cpp index 8daf657aa..7b6cd6ba8 100644 --- a/WickedEngine/wiGUI.cpp +++ b/WickedEngine/wiGUI.cpp @@ -560,6 +560,9 @@ namespace wi::gui font.params.h_align = wi::font::WIFALIGN_CENTER; font.params.v_align = wi::font::WIFALIGN_CENTER; + + font_description.params = font.params; + font_description.params.h_align = wi::font::WIFALIGN_RIGHT; } void Button::Update(const wi::Canvas& canvas, float dt) { @@ -679,6 +682,9 @@ namespace wi::gui font.params.posY = translation.y + scale.y * 0.5f; break; } + + font_description.params.posX = translation.x - 2; + font_description.params.posY = translation.y + scale.y * 0.5f; } void Button::Render(const wi::Canvas& canvas, CommandList cmd) const { @@ -687,7 +693,7 @@ namespace wi::gui return; } - wi::Color color = GetColor(); + font_description.Draw(cmd); ApplyScissor(canvas, scissorRect, cmd); @@ -1118,8 +1124,6 @@ namespace wi::gui return; } - wi::Color color = GetColor(); - font_description.Draw(cmd); ApplyScissor(canvas, scissorRect, cmd); diff --git a/WickedEngine/wiGUI.h b/WickedEngine/wiGUI.h index d67967927..10a4d40f1 100644 --- a/WickedEngine/wiGUI.h +++ b/WickedEngine/wiGUI.h @@ -143,6 +143,9 @@ namespace wi::gui public: void Create(const std::string& name); + wi::SpriteFont font_description; + void SetDescription(const std::string& desc) { font_description.SetText(desc); } + void Update(const wi::Canvas& canvas, float dt) override; void Render(const wi::Canvas& canvas, wi::graphics::CommandList cmd) const override; diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index fa11f9f19..36871e139 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 60; // minor bug fixes, alterations, refactors, updates - const int revision = 72; + const int revision = 73; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);