diff --git a/Editor/TransformWindow.cpp b/Editor/TransformWindow.cpp index 4378934b9..5ea2a4567 100644 --- a/Editor/TransformWindow.cpp +++ b/Editor/TransformWindow.cpp @@ -47,9 +47,11 @@ void TransformWindow::Create(EditorComponent* editor) parentCombo.OnSelect([&](wi::gui::EventArgs args) { Scene& scene = wi::scene::GetScene(); - scene.Component_Detach(entity); - - if(args.iValue != 0) + if (args.iValue == 0) + { + scene.Component_Detach(entity); + } + else { scene.Component_Attach(entity, (Entity)args.userdata); } @@ -253,7 +255,7 @@ void TransformWindow::SetEntity(Entity entity) if (hier != nullptr && hier->parentID == entity) { - parentCombo.SetSelected((int)parentCombo.GetItemCount() - 1); + parentCombo.SetSelectedWithoutCallback((int)parentCombo.GetItemCount() - 1); } } diff --git a/WickedEngine/wiGUI.cpp b/WickedEngine/wiGUI.cpp index 2465422e3..508d64ddf 100644 --- a/WickedEngine/wiGUI.cpp +++ b/WickedEngine/wiGUI.cpp @@ -1620,7 +1620,7 @@ namespace wi::gui } void ComboBox::SetSelected(int index) { - selected = index; + SetSelectedWithoutCallback(index); if (onSelect != nullptr) { @@ -1631,6 +1631,10 @@ namespace wi::gui onSelect(args); } } + void ComboBox::SetSelectedWithoutCallback(int index) + { + selected = index; + } void ComboBox::SetSelectedByUserdata(uint64_t userdata) { for (int i = 0; i < GetItemCount(); ++i) @@ -1642,6 +1646,17 @@ namespace wi::gui } } } + void ComboBox::SetSelectedByUserdataWithoutCallback(uint64_t userdata) + { + for (int i = 0; i < GetItemCount(); ++i) + { + if (userdata == GetItemUserData(i)) + { + SetSelectedWithoutCallback(i); + return; + } + } + } std::string ComboBox::GetItemText(int index) const { if (index >= 0) diff --git a/WickedEngine/wiGUI.h b/WickedEngine/wiGUI.h index 1382ac159..01d9c058e 100644 --- a/WickedEngine/wiGUI.h +++ b/WickedEngine/wiGUI.h @@ -280,7 +280,9 @@ namespace wi::gui bool HasScrollbar() const; void SetSelected(int index); + void SetSelectedWithoutCallback(int index); // SetSelected() but the OnSelect callback will not be executed void SetSelectedByUserdata(uint64_t userdata); + void SetSelectedByUserdataWithoutCallback(uint64_t userdata); // SetSelectedByUserdata() but the OnSelect callback will not be executed int GetSelected() const; std::string GetItemText(int index) const; uint64_t GetItemUserData(int index) const; diff --git a/WickedEngine/wiGraphics.h b/WickedEngine/wiGraphics.h index 40ab7f0dc..a1e538c36 100644 --- a/WickedEngine/wiGraphics.h +++ b/WickedEngine/wiGraphics.h @@ -16,12 +16,9 @@ namespace wi::graphics enum class ValidationMode { - /// No validation is enabled. - Disabled, - /// Print warnings and errors - Enabled, - /// Enable GPU-based validation - GPU + Disabled, // No validation is enabled + Enabled, // CPU command validation + GPU // CPU and GPU-based validation }; enum class ShaderStage diff --git a/WickedEngine/wiScene_Decl.h b/WickedEngine/wiScene_Decl.h index 6616f8434..09ec07da1 100644 --- a/WickedEngine/wiScene_Decl.h +++ b/WickedEngine/wiScene_Decl.h @@ -5,7 +5,6 @@ namespace wi::scene struct NameComponent; struct LayerComponent; struct TransformComponent; - struct PreviousFrameTransformComponent; struct HierarchyComponent; struct MaterialComponent; struct MeshComponent; diff --git a/WickedEngine/wiSpinLock.h b/WickedEngine/wiSpinLock.h index 586f2137e..3ffbaaa3c 100644 --- a/WickedEngine/wiSpinLock.h +++ b/WickedEngine/wiSpinLock.h @@ -1,5 +1,6 @@ #pragma once #include +#include #include // _mm_pause() namespace wi @@ -11,9 +12,18 @@ namespace wi public: inline void lock() { + int spin = 0; while (!try_lock()) { - _mm_pause(); // SMT thread swap can occur here + if (spin < 10) + { + _mm_pause(); // SMT thread swap can occur here + } + else + { + std::this_thread::yield(); // OS thread swap can occur here. It is important to keep it as fallback, to avoid any chance of lockup by busy wait + } + spin++; } } inline bool try_lock() diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index e50de2a7a..6e85778f0 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 = 28; + const int revision = 29; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);