From 68147e62030aff85be5972f9cf993df176c5461d Mon Sep 17 00:00:00 2001 From: turanszkij Date: Tue, 14 Apr 2020 21:49:42 +0100 Subject: [PATCH] editor, gui and sponza update --- Editor/Editor.cpp | 32 ++++++++++++ Editor/Editor.h | 4 ++ Editor/Editor.vcxproj | 4 ++ Editor/Editor.vcxproj.filters | 12 +++++ Editor/LayerWindow.cpp | 90 ++++++++++++++++++++++++++++++++++ Editor/LayerWindow.h | 29 +++++++++++ Editor/NameWindow.cpp | 70 ++++++++++++++++++++++++++ Editor/NameWindow.h | 29 +++++++++++ Editor/TransformWindow.cpp | 60 +++++++++++++++++++++-- Editor/TransformWindow.h | 2 + Editor/WeatherWindow.cpp | 18 +++---- WickedEngine/wiGUI.cpp | 10 ++-- WickedEngine/wiVersion.cpp | 2 +- models/Sponza/sponza.wiscene | Bin 12390256 -> 12408488 bytes 14 files changed, 342 insertions(+), 20 deletions(-) create mode 100644 Editor/LayerWindow.cpp create mode 100644 Editor/LayerWindow.h create mode 100644 Editor/NameWindow.cpp create mode 100644 Editor/NameWindow.h diff --git a/Editor/Editor.cpp b/Editor/Editor.cpp index 79a36eb56..5def632bd 100644 --- a/Editor/Editor.cpp +++ b/Editor/Editor.cpp @@ -20,6 +20,8 @@ #include "SpringWindow.h" #include "IKWindow.h" #include "TransformWindow.h" +#include "LayerWindow.h" +#include "NameWindow.h" #include "ModelImporter.h" #include "Translator.h" @@ -149,6 +151,8 @@ void EditorComponent::ChangeRenderPath(RENDERPATH path) springWnd = std::make_unique(this); ikWnd = std::make_unique(this); transformWnd = std::make_unique(this); + layerWnd = std::make_unique(this); + nameWnd = std::make_unique(this); ResizeBuffers(); } @@ -446,6 +450,28 @@ void EditorComponent::Load() }); GetGUI().AddWidget(transformWnd_Toggle); + wiButton* layerWnd_Toggle = new wiButton("Layer"); + layerWnd_Toggle->SetColor(option_color_idle, wiWidget::IDLE); + layerWnd_Toggle->SetColor(option_color_focus, wiWidget::FOCUS); + layerWnd_Toggle->SetTooltip("Layer Component"); + layerWnd_Toggle->SetPos(XMFLOAT2(x, y += step)); + layerWnd_Toggle->SetSize(option_size); + layerWnd_Toggle->OnClick([=](wiEventArgs args) { + layerWnd->window->SetVisible(!layerWnd->window->IsVisible()); + }); + GetGUI().AddWidget(layerWnd_Toggle); + + wiButton* nameWnd_Toggle = new wiButton("Name"); + nameWnd_Toggle->SetColor(option_color_idle, wiWidget::IDLE); + nameWnd_Toggle->SetColor(option_color_focus, wiWidget::FOCUS); + nameWnd_Toggle->SetTooltip("Name Component"); + nameWnd_Toggle->SetPos(XMFLOAT2(x, y += step)); + nameWnd_Toggle->SetSize(option_size); + nameWnd_Toggle->OnClick([=](wiEventArgs args) { + nameWnd->window->SetVisible(!nameWnd->window->IsVisible()); + }); + GetGUI().AddWidget(nameWnd_Toggle); + @@ -675,6 +701,8 @@ void EditorComponent::Load() springWnd->SetEntity(INVALID_ENTITY); ikWnd->SetEntity(INVALID_ENTITY); transformWnd->SetEntity(INVALID_ENTITY); + layerWnd->SetEntity(INVALID_ENTITY); + nameWnd->SetEntity(INVALID_ENTITY); }); GetGUI().AddWidget(clearButton); @@ -1521,6 +1549,8 @@ void EditorComponent::Update(float dt) springWnd->SetEntity(INVALID_ENTITY); ikWnd->SetEntity(INVALID_ENTITY); transformWnd->SetEntity(INVALID_ENTITY); + layerWnd->SetEntity(INVALID_ENTITY); + nameWnd->SetEntity(INVALID_ENTITY); } else { @@ -1550,6 +1580,8 @@ void EditorComponent::Update(float dt) springWnd->SetEntity(picked.entity); ikWnd->SetEntity(picked.entity); transformWnd->SetEntity(picked.entity); + layerWnd->SetEntity(picked.entity); + nameWnd->SetEntity(picked.entity); if (picked.subsetIndex >= 0) { diff --git a/Editor/Editor.h b/Editor/Editor.h index 27b13904e..2e61aa9f2 100644 --- a/Editor/Editor.h +++ b/Editor/Editor.h @@ -21,6 +21,8 @@ class PaintToolWindow; class SpringWindow; class IKWindow; class TransformWindow; +class LayerWindow; +class NameWindow; class EditorLoadingScreen : public LoadingScreen { @@ -58,6 +60,8 @@ public: std::unique_ptr springWnd; std::unique_ptr ikWnd; std::unique_ptr transformWnd; + std::unique_ptr layerWnd; + std::unique_ptr nameWnd; Editor* main = nullptr; diff --git a/Editor/Editor.vcxproj b/Editor/Editor.vcxproj index 199360831..4b28f7485 100644 --- a/Editor/Editor.vcxproj +++ b/Editor/Editor.vcxproj @@ -175,11 +175,13 @@ + + @@ -206,12 +208,14 @@ + + diff --git a/Editor/Editor.vcxproj.filters b/Editor/Editor.vcxproj.filters index c88a81494..9c1fc2aee 100644 --- a/Editor/Editor.vcxproj.filters +++ b/Editor/Editor.vcxproj.filters @@ -103,6 +103,12 @@ Code + + Code + + + Code + @@ -183,6 +189,12 @@ Code + + Code + + + Code + diff --git a/Editor/LayerWindow.cpp b/Editor/LayerWindow.cpp new file mode 100644 index 000000000..971384453 --- /dev/null +++ b/Editor/LayerWindow.cpp @@ -0,0 +1,90 @@ +#include "stdafx.h" +#include "LayerWindow.h" +#include "Editor.h" + +using namespace wiECS; +using namespace wiScene; + + +LayerWindow::LayerWindow(EditorComponent* editor) : GUI(&editor->GetGUI()) +{ + assert(GUI && "Invalid GUI!"); + + window = new wiWindow(GUI, "Layer Window"); + window->SetSize(XMFLOAT2(410, 160)); + GUI->AddWidget(window); + + float x = 30; + float y = 0; + float step = 25; + float siz = 20; + + for (uint32_t i = 0; i < 32; ++i) + { + layers[i] = new wiCheckBox(""); + layers[i]->SetText(std::to_string(i) + ": "); + layers[i]->SetPos(XMFLOAT2(x + (i % 8) * 50, y + (i / 8 + 1) * step)); + layers[i]->OnClick([=](wiEventArgs args) { + + LayerComponent* layer = wiScene::GetScene().layers.GetComponent(entity); + if (layer == nullptr) + { + layer = &wiScene::GetScene().layers.Create(entity); + } + + if (args.bValue) + { + layer->layerMask |= 1 << i; + } + else + { + layer->layerMask &= ~(1 << i); + } + + }); + window->AddWidget(layers[i]); + } + + window->Translate(XMFLOAT3((float)wiRenderer::GetDevice()->GetScreenWidth() - 450, 300, 0)); + window->SetVisible(false); + + SetEntity(INVALID_ENTITY); +} + + +LayerWindow::~LayerWindow() +{ + window->RemoveWidgets(true); + GUI->RemoveWidget(window); + delete window; +} + +void LayerWindow::SetEntity(Entity entity) +{ + this->entity = entity; + + if (entity != INVALID_ENTITY) + { + window->SetEnabled(true); + + LayerComponent* layer = wiScene::GetScene().layers.GetComponent(entity); + if (layer == nullptr) + { + for (uint32_t i = 0; i < 32; ++i) + { + layers[i]->SetCheck(true); + } + } + else + { + for (uint32_t i = 0; i < 32; ++i) + { + layers[i]->SetCheck(layer->GetLayerMask() & 1 << i); + } + } + } + else + { + window->SetEnabled(false); + } +} diff --git a/Editor/LayerWindow.h b/Editor/LayerWindow.h new file mode 100644 index 000000000..d6731ae1b --- /dev/null +++ b/Editor/LayerWindow.h @@ -0,0 +1,29 @@ +#pragma once + +class wiGUI; +class wiWindow; +class wiLabel; +class wiCheckBox; +class wiSlider; +class wiComboBox; +class wiColorPicker; +class wiTextInputField; + +class EditorComponent; + +class LayerWindow +{ +public: + LayerWindow(EditorComponent* editor); + ~LayerWindow(); + + wiECS::Entity entity; + void SetEntity(wiECS::Entity entity); + + wiGUI* GUI; + + wiWindow* window; + + wiCheckBox* layers[32]; +}; + diff --git a/Editor/NameWindow.cpp b/Editor/NameWindow.cpp new file mode 100644 index 000000000..64beb3214 --- /dev/null +++ b/Editor/NameWindow.cpp @@ -0,0 +1,70 @@ +#include "stdafx.h" +#include "NameWindow.h" +#include "Editor.h" + +using namespace wiECS; +using namespace wiScene; + + +NameWindow::NameWindow(EditorComponent* editor) : GUI(&editor->GetGUI()) +{ + assert(GUI && "Invalid GUI!"); + + window = new wiWindow(GUI, "Name Window"); + window->SetSize(XMFLOAT2(360, 80)); + GUI->AddWidget(window); + + float x = 60; + float y = 0; + float step = 25; + float siz = 280; + float hei = 20; + + nameInput = new wiTextInputField(""); + nameInput->SetDescription("Name: "); + nameInput->SetPos(XMFLOAT2(x, y += step)); + nameInput->SetSize(XMFLOAT2(siz, hei)); + nameInput->OnInputAccepted([&](wiEventArgs args) { + NameComponent* name = wiScene::GetScene().names.GetComponent(entity); + if (name == nullptr) + { + name = &wiScene::GetScene().names.Create(entity); + } + name->name = args.sValue; + }); + window->AddWidget(nameInput); + + window->Translate(XMFLOAT3((float)wiRenderer::GetDevice()->GetScreenWidth() - 450, 200, 0)); + window->SetVisible(false); + + SetEntity(INVALID_ENTITY); +} + + +NameWindow::~NameWindow() +{ + window->RemoveWidgets(true); + GUI->RemoveWidget(window); + delete window; +} + +void NameWindow::SetEntity(Entity entity) +{ + this->entity = entity; + + if (entity != INVALID_ENTITY) + { + window->SetEnabled(true); + + NameComponent* name = wiScene::GetScene().names.GetComponent(entity); + if (name != nullptr) + { + nameInput->SetValue(name->name); + } + } + else + { + window->SetEnabled(false); + nameInput->SetValue("Select entity to modify name..."); + } +} diff --git a/Editor/NameWindow.h b/Editor/NameWindow.h new file mode 100644 index 000000000..96551b69f --- /dev/null +++ b/Editor/NameWindow.h @@ -0,0 +1,29 @@ +#pragma once + +class wiGUI; +class wiWindow; +class wiLabel; +class wiCheckBox; +class wiSlider; +class wiComboBox; +class wiColorPicker; +class wiTextInputField; + +class EditorComponent; + +class NameWindow +{ +public: + NameWindow(EditorComponent* editor); + ~NameWindow(); + + wiECS::Entity entity; + void SetEntity(wiECS::Entity entity); + + wiGUI* GUI; + + wiWindow* window; + + wiTextInputField* nameInput; +}; + diff --git a/Editor/TransformWindow.cpp b/Editor/TransformWindow.cpp index 4501c0c68..af773b737 100644 --- a/Editor/TransformWindow.cpp +++ b/Editor/TransformWindow.cpp @@ -11,7 +11,7 @@ TransformWindow::TransformWindow(EditorComponent* editor) : GUI(&editor->GetGUI( assert(GUI && "Invalid GUI!"); window = new wiWindow(GUI, "Transform Window"); - window->SetSize(XMFLOAT2(460, 150)); + window->SetSize(XMFLOAT2(460, 170)); GUI->AddWidget(window); float x = 100; @@ -33,6 +33,35 @@ TransformWindow::TransformWindow(EditorComponent* editor) : GUI(&editor->GetGUI( }); window->AddWidget(createButton); + parentCombo = new wiComboBox("Parent: "); + parentCombo->SetSize(XMFLOAT2(330, hei)); + parentCombo->SetPos(XMFLOAT2(x, y += step)); + parentCombo->SetEnabled(false); + parentCombo->OnSelect([&](wiEventArgs args) { + Scene& scene = wiScene::GetScene(); + HierarchyComponent* hier = scene.hierarchy.GetComponent(entity); + + if (args.iValue == 0 && hier != nullptr) + { + scene.hierarchy.Remove_KeepSorted(entity); + } + else if(args.iValue != 0) + { + if (hier == nullptr) + { + hier = &scene.hierarchy.Create(entity); + } + hier->parentID = scene.transforms.GetEntity(args.iValue - 1); + if (hier->parentID == entity) + { + scene.hierarchy.Remove_KeepSorted(entity); + } + } + + }); + parentCombo->SetTooltip("Choose a parent entity for the transform"); + window->AddWidget(parentCombo); + txInput = new wiTextInputField(""); txInput->SetValue(0); txInput->SetDescription("Translation X: "); @@ -81,7 +110,7 @@ TransformWindow::TransformWindow(EditorComponent* editor) : GUI(&editor->GetGUI( x = 250; - y = step; + y = step * 2; rxInput = new wiTextInputField(""); @@ -148,7 +177,7 @@ TransformWindow::TransformWindow(EditorComponent* editor) : GUI(&editor->GetGUI( x = 400; - y = step; + y = step * 2; sxInput = new wiTextInputField(""); @@ -214,10 +243,33 @@ void TransformWindow::SetEntity(Entity entity) { this->entity = entity; - const TransformComponent* transform = wiScene::GetScene().transforms.GetComponent(entity); + Scene& scene = wiScene::GetScene(); + const TransformComponent* transform = scene.transforms.GetComponent(entity); if (transform != nullptr) { + parentCombo->ClearItems(); + parentCombo->AddItem("NO PARENT"); + + HierarchyComponent* hier = scene.hierarchy.GetComponent(entity); + for (size_t i = 0; i < scene.transforms.GetCount(); ++i) + { + Entity entity = scene.transforms.GetEntity(i); + std::string str; + const NameComponent* name = scene.names.GetComponent(entity); + if (name != nullptr) + { + str = name->name; + } + str = str + " (" + std::to_string(entity) + ")"; + parentCombo->AddItem(str); + + if (hier != nullptr && hier->parentID == entity) + { + parentCombo->SetSelected((int)i + 1); + } + } + txInput->SetValue(transform->translation_local.x); tyInput->SetValue(transform->translation_local.y); tzInput->SetValue(transform->translation_local.z); diff --git a/Editor/TransformWindow.h b/Editor/TransformWindow.h index 6b5aea7ca..c5f994f30 100644 --- a/Editor/TransformWindow.h +++ b/Editor/TransformWindow.h @@ -26,6 +26,8 @@ public: wiButton* createButton; + wiComboBox* parentCombo; + wiTextInputField* txInput; wiTextInputField* tyInput; wiTextInputField* tzInput; diff --git a/Editor/WeatherWindow.cpp b/Editor/WeatherWindow.cpp index 7d1a97d8d..092ec5a04 100644 --- a/Editor/WeatherWindow.cpp +++ b/Editor/WeatherWindow.cpp @@ -180,9 +180,9 @@ WeatherWindow::WeatherWindow(EditorComponent* editor) : GUI(&editor->GetGUI()) preset1Button->OnClick([=](wiEventArgs args) { auto& weather = GetWeather(); - weather.ambient = XMFLOAT3(0.1f, 0.1f, 0.1f); - weather.horizon = XMFLOAT3(0.3f, 0.3f, 0.4f); - weather.zenith = XMFLOAT3(37.0f / 255.0f, 61.0f / 255.0f, 142.0f / 255.0f); + weather.ambient = XMFLOAT3(33.0f / 255.0f, 47.0f / 255.0f, 127.0f / 255.0f); + weather.horizon = XMFLOAT3(101.0f / 255.0f, 101.0f / 255.0f, 227.0f / 255.0f); + weather.zenith = XMFLOAT3(99.0f / 255.0f, 133.0f / 255.0f, 255.0f / 255.0f); weather.cloudiness = 0.4f; weather.fogStart = 100; weather.fogEnd = 1000; @@ -200,9 +200,9 @@ WeatherWindow::WeatherWindow(EditorComponent* editor) : GUI(&editor->GetGUI()) preset2Button->OnClick([=](wiEventArgs args) { auto& weather = GetWeather(); - weather.ambient = XMFLOAT3(0.02f, 0.02f, 0.02f); - weather.horizon = XMFLOAT3(0.2f, 0.05f, 0.15f); - weather.zenith = XMFLOAT3(0.4f, 0.05f, 0.1f); + weather.ambient = XMFLOAT3(86.0f / 255.0f, 29.0f / 255.0f, 29.0f / 255.0f); + weather.horizon = XMFLOAT3(121.0f / 255.0f, 28.0f / 255.0f, 22.0f / 255.0f); + weather.zenith = XMFLOAT3(146.0f / 255.0f, 51.0f / 255.0f, 51.0f / 255.0f); weather.cloudiness = 0.36f; weather.fogStart = 50; weather.fogEnd = 600; @@ -240,9 +240,9 @@ WeatherWindow::WeatherWindow(EditorComponent* editor) : GUI(&editor->GetGUI()) preset4Button->OnClick([=](wiEventArgs args) { auto& weather = GetWeather(); - weather.ambient = XMFLOAT3(0.01f, 0.01f, 0.02f); - weather.horizon = XMFLOAT3(0.04f, 0.1f, 0.2f); - weather.zenith = XMFLOAT3(0.02f, 0.04f, 0.08f); + weather.ambient = XMFLOAT3(12.0f / 255.0f, 21.0f / 255.0f, 77.0f / 255.0f); + weather.horizon = XMFLOAT3(10.0f / 255.0f, 33.0f / 255.0f, 70.0f / 255.0f); + weather.zenith = XMFLOAT3(4.0f / 255.0f,20.0f / 255.0f, 51.0f / 255.0f); weather.cloudiness = 0.28f; weather.fogStart = 10; weather.fogEnd = 400; diff --git a/WickedEngine/wiGUI.cpp b/WickedEngine/wiGUI.cpp index 41cdfb097..fe5231c34 100644 --- a/WickedEngine/wiGUI.cpp +++ b/WickedEngine/wiGUI.cpp @@ -116,7 +116,7 @@ void wiGUI::Update(float dt) for (auto& widget : priorityChangeQueue) { - if (std::find(widgets.begin(), widgets.end(), widget) != widgets.end()) + if (std::find(widgets.begin(), widgets.end(), widget) != widgets.end()) // only add back to widgets if it's still there! { widgets.remove(widget); widgets.push_front(widget); @@ -191,11 +191,9 @@ wiWidget* wiGUI::GetWidget(const wiHashString& name) void wiGUI::ActivateWidget(wiWidget* widget) { - if (std::find(widgets.begin(), widgets.end(), widget) != widgets.end()) - { - widget->priority_change = false; - priorityChangeQueue.push_back(widget); - } + widget->priority_change = false; + priorityChangeQueue.push_back(widget); + if (activeWidget == nullptr) { activeWidget = widget; diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index ce202bb96..5645939a7 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates const int minor = 39; // minor bug fixes, alterations, refactors, updates - const int revision = 62; + const int revision = 63; long GetVersion() diff --git a/models/Sponza/sponza.wiscene b/models/Sponza/sponza.wiscene index 107539500cf44aeb782de379522d48bd34ea8b11..fc1c21f16825a66e2a4086438f1ddc922e3942b0 100644 GIT binary patch delta 47526 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

KblJy>)nUkA(1F zPfZHfjyoIvTFlefnx6@6$e#_vs5wy(8;&@{YW7uX5zXm0zAHqX|DT|AE8F;4MqT zHJT-@gL_HG9Xp&lVZ+~dn=&{2>aD%u@7`s$cF5F6SZPOUTf?IX|2MW3K_