Initial pass of ViewportUiSwitcher.

This commit is contained in:
hasareej
2021-04-16 10:27:13 +01:00
parent 9f88698c3a
commit 969f94ffb5
17 changed files with 413 additions and 3 deletions
@@ -440,6 +440,13 @@ namespace AzToolsFramework
&ViewportUi::ViewportUiRequestBus::Events::RemoveCluster,
clusterId);
}
static void RemoveTestSwitcher(const ViewportUi::ClusterId clusterId)
{
ViewportUi::ViewportUiRequestBus::Event(
ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::RemoveCluster,
clusterId);
}
static void SetViewportUiClusterVisible(ViewportUi::ClusterId clusterId, bool visible)
{
@@ -468,6 +475,18 @@ namespace AzToolsFramework
return buttonId;
}
static ViewportUi::ButtonId RegisterSwitcherButton(
ViewportUi::ClusterId clusterId, const char* iconName, const char* buttonName)
{
ViewportUi::ButtonId buttonId;
ViewportUi::ViewportUiRequestBus::EventResult(
buttonId, ViewportUi::DefaultViewportId,
&ViewportUi::ViewportUiRequestBus::Events::CreateSwitcherButton, clusterId,
AZStd::string::format("Editor/Icons/Switcher/%s.svg", iconName), buttonName);
return buttonId;
}
// return either center or entity pivot
static AZ::Vector3 CalculatePivotTranslation(
const AZ::EntityId entityId, const EditorTransformComponentSelectionRequests::Pivot pivot)
@@ -1028,6 +1047,8 @@ namespace AzToolsFramework
RegisterActions();
SetupBoxSelect();
RefreshSelectedEntityIdsAndRegenerateManipulators();
CreateTestSwitcher();
}
EditorTransformComponentSelection::~EditorTransformComponentSelection()
@@ -1038,6 +1059,8 @@ namespace AzToolsFramework
DestroyTransformModeSelectionCluster(m_transformModeClusterId);
UnregisterActions();
RemoveTestSwitcher(m_testSwitcherId);
m_pivotOverrideFrame.Reset();
EditorManipulatorCommandUndoRedoRequestBus::Handler::BusDisconnect();
@@ -2561,6 +2584,50 @@ namespace AzToolsFramework
m_transformModeSelectionHandler);
}
void EditorTransformComponentSelection::CreateTestSwitcher()
{
// Create test switcher
// & Set Current Active Mode
ViewportUi::ViewportUiRequestBus::EventResult(
m_testSwitcherId, ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::CreateSwitcher,
ViewportUi::ButtonId(1));
// create and register the buttons
m_boxShapeButtonId = RegisterSwitcherButton(m_testSwitcherId, "BoxShape", "Box Shape");
m_physxColliderButtonId = RegisterSwitcherButton(m_testSwitcherId, "PhysXCollider", "PhysX Collider");
m_transformButtonId = RegisterSwitcherButton(m_testSwitcherId, "Transform", "Transform");
// Change current active button for now
const auto onButtonClicked = [this](ViewportUi::ButtonId buttonId) {
if (buttonId == m_boxShapeButtonId)
{
ViewportUi::ViewportUiRequestBus::Event(
ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::SetSwitcherActiveButton, m_testSwitcherId,
m_boxShapeButtonId);
AZ_Printf("ViewportUi", "Box Shape");
}
else if (buttonId == m_physxColliderButtonId)
{
ViewportUi::ViewportUiRequestBus::Event(
ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::SetSwitcherActiveButton, m_testSwitcherId,
m_physxColliderButtonId);
AZ_Printf("ViewportUi", "PhysXCollider");
}
else if (buttonId == m_transformButtonId)
{
ViewportUi::ViewportUiRequestBus::Event(
ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::SetSwitcherActiveButton, m_testSwitcherId,
m_transformButtonId);
AZ_Printf("ViewportUi", "Transform");
}
};
m_testSwitcherHandler = AZ::Event<ViewportUi::ButtonId>::Handler(onButtonClicked);
ViewportUi::ViewportUiRequestBus::Event(
ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::RegisterClusterEventHandler, m_testSwitcherId,
m_testSwitcherHandler);
}
EditorTransformComponentSelectionRequests::Mode EditorTransformComponentSelection::GetTransformMode()
{
return m_mode;
@@ -281,6 +281,15 @@ namespace AzToolsFramework
ViewportUi::ButtonId m_rotateButtonId; ///< Id of the Viewport UI button for rotate mode.
ViewportUi::ButtonId m_scaleButtonId; ///< Id of the Viewport UI button for scale mode.
AZ::Event<ViewportUi::ButtonId>::Handler m_transformModeSelectionHandler; ///< Event handler for the Viewport UI cluster.
//! Create the Viewport UI Switcher. TEST
void CreateTestSwitcher();
ViewportUi::ClusterId m_testSwitcherId;
ViewportUi::ButtonId m_boxShapeButtonId;
ViewportUi::ButtonId m_physxColliderButtonId;
ViewportUi::ButtonId m_transformButtonId;
AZ::Event<ViewportUi::ButtonId>::Handler m_testSwitcherHandler;
};
/// The ETCS (EntityTransformComponentSelection) namespace contains functions and data used exclusively by
@@ -22,4 +22,11 @@ namespace AzToolsFramework::ViewportUi::Internal
, m_buttonId(buttonId)
{
}
Button::Button(AZStd::string icon, AZStd::string name, ButtonId buttonId)
: m_icon(AZStd::move(icon))
, m_name(AZStd::move(name))
, m_buttonId(buttonId)
{
}
} // namespace AzToolsFramework::ViewportUi::Internal
@@ -28,9 +28,11 @@ namespace AzToolsFramework::ViewportUi::Internal
};
explicit Button(AZStd::string icon, ButtonId buttonId);
Button(AZStd::string icon, AZStd::string name, ButtonId buttonId);
~Button() = default;
AZStd::string m_icon; //!< The icon for this button, string path to an image.
AZStd::string m_name; //!< The icon for this button, string path to an image.
State m_state = State::Deselected;
ButtonId m_buttonId;
};
@@ -13,6 +13,9 @@
#include <AzToolsFramework/ViewportUi/Button.h>
#include <AzToolsFramework/ViewportUi/Cluster.h>
#pragma optimize("", off)
#pragma inline_depth(0)
namespace AzToolsFramework::ViewportUi::Internal
{
Cluster::Cluster()
@@ -53,11 +56,18 @@ namespace AzToolsFramework::ViewportUi::Internal
}
}
ButtonId Cluster::AddButton(const AZStd::string& icon)
ButtonId Cluster::AddButton(const AZStd::string& icon, const AZStd::string& name)
{
auto buttonId = ButtonId(m_buttons.size() + 1);
m_buttons.insert({buttonId, AZStd::make_unique<Button>(icon, buttonId)});
if (name == AZStd::string())
{
m_buttons.insert({buttonId, AZStd::make_unique<Button>(icon, buttonId)});
}
else
{
m_buttons.insert({buttonId, AZStd::make_unique<Button>(icon, name, buttonId)});
}
return buttonId;
}
@@ -34,7 +34,7 @@ namespace AzToolsFramework::ViewportUi::Internal
void SetClusterId(ClusterId id);
ClusterId GetClusterId() const;
ButtonId AddButton(const AZStd::string& icon);
ButtonId AddButton(const AZStd::string& icon, const AZStd::string& name = AZStd::string());
Button* GetButton(ButtonId buttonId);
AZStd::vector<Button*> GetButtons();
@@ -18,6 +18,7 @@
#include <AzToolsFramework/ViewportSelection/EditorSelectionUtil.h>
#include <AzToolsFramework/ViewportUi/ViewportUiDisplay.h>
#include <AzToolsFramework/ViewportUi/ViewportUiCluster.h>
#include <AzToolsFramework/ViewportUi/ViewportUiSwitcher.h>
#include <AzToolsFramework/ViewportUi/ViewportUiTextField.h>
#include <QWidget>
@@ -93,6 +94,51 @@ namespace AzToolsFramework::ViewportUi::Internal
}
}
void ViewportUiDisplay::AddSwitcher(AZStd::shared_ptr<Cluster> cluster, ButtonId currMode)
{
if (!cluster.get())
{
return;
}
auto viewportUiSwitcher = AZStd::make_shared<ViewportUiSwitcher>(cluster, currMode);
auto id = AddViewportUiElement(viewportUiSwitcher);
cluster->SetViewportUiElementId(id);
PositionViewportUiElementAnchored(id, Qt::AlignTop | Qt::AlignLeft);
}
void ViewportUiDisplay::AddSwitcherButton(const ViewportUiElementId clusterId, Button* button)
{
if (auto viewportUiSwitcher = qobject_cast<ViewportUiSwitcher*>(GetViewportUiElement(clusterId).get()))
{
viewportUiSwitcher->AddButton(button);
}
}
void ViewportUiDisplay::RemoveSwitcherButton(ViewportUiElementId clusterId, ButtonId buttonId)
{
if (auto cluster = qobject_cast<ViewportUiSwitcher*>(GetViewportUiElement(clusterId).get()))
{
cluster->RemoveButton(buttonId);
}
}
void ViewportUiDisplay::UpdateSwitcher(ViewportUiElementId clusterId)
{
if (auto cluster = qobject_cast<ViewportUiSwitcher*>(GetViewportUiElement(clusterId).get()))
{
cluster->Update();
}
}
void ViewportUiDisplay::SetSwitcherActiveMode(ViewportUiElementId clusterId, ButtonId buttonId)
{
if (auto viewportUiSwitcher = qobject_cast<ViewportUiSwitcher*>(GetViewportUiElement(clusterId).get()))
{
viewportUiSwitcher->SetActiveMode(buttonId);
}
}
void ViewportUiDisplay::AddTextField(AZStd::shared_ptr<TextField> textField)
{
if (!textField.get())
@@ -61,6 +61,12 @@ namespace AzToolsFramework::ViewportUi::Internal
void RemoveClusterButton(ViewportUiElementId clusterId, ButtonId buttonId);
void UpdateCluster(const ViewportUiElementId clusterId);
void AddSwitcher(AZStd::shared_ptr<Cluster> cluster, ButtonId currMode);
void AddSwitcherButton(ViewportUiElementId clusterId, Button* button);
void RemoveSwitcherButton(ViewportUiElementId clusterId, ButtonId buttonId);
void UpdateSwitcher(const ViewportUiElementId clusterId);
void SetSwitcherActiveMode(ViewportUiElementId clusterId, ButtonId buttonId);
void AddTextField(AZStd::shared_ptr<TextField> textField);
void UpdateTextField(ViewportUiElementId textFieldId);
@@ -38,6 +38,14 @@ namespace AzToolsFramework::ViewportUi
return RegisterNewCluster(cluster);
}
const ClusterId ViewportUiManager::CreateSwitcher(ButtonId currMode)
{
auto cluster = AZStd::make_shared<Internal::Cluster>();
m_viewportUi->AddSwitcher(cluster, currMode);
return RegisterNewCluster(cluster);
}
void ViewportUiManager::SetClusterActiveButton(const ClusterId clusterId, const ButtonId buttonId)
{
if (auto clusterEntry = m_clusters.find(clusterId); clusterEntry != m_clusters.end())
@@ -48,6 +56,17 @@ namespace AzToolsFramework::ViewportUi
}
}
void ViewportUiManager::SetSwitcherActiveButton(const ClusterId clusterId, const ButtonId buttonId)
{
if (auto clusterEntry = m_clusters.find(clusterId); clusterEntry != m_clusters.end())
{
auto cluster = clusterEntry->second;
cluster->SetHighlightedButton(buttonId);
m_viewportUi->SetSwitcherActiveMode(cluster->GetViewportUiElementId(), buttonId);
UpdateSwitcherUi(cluster.get());
}
}
void ViewportUiManager::RegisterClusterEventHandler(const ClusterId clusterId, AZ::Event<ButtonId>::Handler& handler)
{
if (auto clusterEntry = m_clusters.find(clusterId); clusterEntry != m_clusters.end())
@@ -71,6 +90,20 @@ namespace AzToolsFramework::ViewportUi
return ButtonId(0);
}
const ButtonId ViewportUiManager::CreateSwitcherButton(const ClusterId clusterId, const AZStd::string& icon, const AZStd::string& name)
{
if (auto clusterEntry = m_clusters.find(clusterId); clusterEntry != m_clusters.end())
{
auto cluster = clusterEntry->second;
auto newId = cluster->AddButton(icon, name);
m_viewportUi->AddSwitcherButton(cluster->GetViewportUiElementId(), cluster->GetButton(newId));
return newId;
}
return ButtonId(0);
}
void ViewportUiManager::RemoveCluster(const ClusterId clusterId)
{
if (auto clusterEntry = m_clusters.find(clusterId); clusterEntry != m_clusters.end())
@@ -229,6 +262,11 @@ namespace AzToolsFramework::ViewportUi
m_viewportUi->UpdateCluster(cluster->GetViewportUiElementId());
}
void ViewportUiManager::UpdateSwitcherUi(Internal::Cluster* cluster)
{
m_viewportUi->UpdateSwitcher(cluster->GetViewportUiElementId());
}
void ViewportUiManager::UpdateTextFieldUi(Internal::TextField* textField)
{
m_viewportUi->UpdateTextField(textField->m_viewportId);
@@ -32,8 +32,11 @@ namespace AzToolsFramework::ViewportUi
// ViewportUiRequestBus ...
const ClusterId CreateCluster() override;
const ClusterId CreateSwitcher(ButtonId currMode) override;
void SetClusterActiveButton(ClusterId clusterId, ButtonId buttonId) override;
void SetSwitcherActiveButton(ClusterId clusterId, ButtonId buttonId) override;
const ButtonId CreateClusterButton(ClusterId clusterId, const AZStd::string& icon) override;
const ButtonId CreateSwitcherButton(ClusterId clusterId, const AZStd::string& icon, const AZStd::string& name = AZStd::string()) override;
void RegisterClusterEventHandler(ClusterId clusterId, AZ::Event<ButtonId>::Handler& handler) override;
void RemoveCluster(ClusterId clusterId) override;
void SetClusterVisible(ClusterId clusterId, bool visible);
@@ -71,6 +74,8 @@ namespace AzToolsFramework::ViewportUi
TextFieldId RegisterNewTextField(AZStd::shared_ptr<Internal::TextField>& textField);
//! Update the corresponding ui element for the given cluster.
void UpdateClusterUi(Internal::Cluster* cluster);
//! Update the corresponding ui element for the given cluster.
void UpdateSwitcherUi(Internal::Cluster* cluster);
//! Update the corresponding ui element for the given text field.
void UpdateTextFieldUi(Internal::TextField* textField);
};
@@ -46,10 +46,17 @@ namespace AzToolsFramework::ViewportUi
public:
//! Creates and registers a cluster with the Viewport UI system.
virtual const ClusterId CreateCluster() = 0;
//! Creates and registers a switcher with the Viewport UI system.
virtual const ClusterId CreateSwitcher(ButtonId currMode) = 0;
//! Sets the active button of the cluster. This is the button which will display as highlighted.
virtual void SetClusterActiveButton(ClusterId clusterId, ButtonId buttonId) = 0;
//! Sets the active button of the switcher. This is the button which will display as highlighted.
//! Maybe update this comment
virtual void SetSwitcherActiveButton(ClusterId clusterId, ButtonId buttonId) = 0;
//! Registers a new button onto a cluster.
virtual const ButtonId CreateClusterButton(const ClusterId clusterId, const AZStd::string& icon) = 0;
//! Registers a new button onto a switcher.
virtual const ButtonId CreateSwitcherButton(const ClusterId clusterId, const AZStd::string& icon, const AZStd::string& name = AZStd::string()) = 0;
//! Registers an event handler to handle events from the cluster.
virtual void RegisterClusterEventHandler(ClusterId clusterId, AZ::Event<ButtonId>::Handler& handler) = 0;
//! Removes a cluster from the Viewport UI system.
@@ -0,0 +1,125 @@
#include <AzToolsFramework/ViewportUi/Cluster.h>
#include <AzToolsFramework/ViewportUi/ViewportUiSwitcher.h>
namespace AzToolsFramework::ViewportUi::Internal
{
ViewportUiSwitcher::ViewportUiSwitcher(AZStd::shared_ptr<Cluster> switcher, ButtonId currentMode)
: m_switcher(switcher)
, m_currentMode(currentMode)
{
setOrientation(Qt::Orientation::Horizontal);
setStyleSheet(QString("QToolBar {background-color: none; border: none; spacing: 3px;}"
"QToolButton {background-color: #464646; border: outset; border-color: white; border-radius: 7px; "
"border-width: 2px; padding: 7px; color: white;}"));
const AZStd::vector<Button*> buttons = switcher->GetButtons();
for (auto button : buttons)
{
// add all the other buttons after
if (button->m_buttonId)
{
AddButton(button);
}
}
}
ViewportUiSwitcher::~ViewportUiSwitcher()
{
}
void ViewportUiSwitcher::AddButton(Button* button)
{
QAction* action = new QAction();
action->setCheckable(true);
action->setIcon(QIcon(QString(button->m_icon.c_str())));
if (!action)
{
return;
}
// set hover to true by default
action->setProperty("IconHasHoverEffect", true);
// if its the first button added to the switcher add it as a button instead of action
if (button->m_buttonId == m_currentMode)
{
QString buttonName = (button->m_name).c_str();
QIcon buttonIcon = QString((button->m_icon).c_str());
m_activeButton = new QToolButton();
m_activeButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
m_activeButton->setIcon(buttonIcon);
m_activeButton->setText(buttonName);
addWidget(m_activeButton);
}
else
{
// add the action
addAction(action);
}
// resize to fit new action with minimum extra space
resize(minimumSizeHint());
const AZStd::function<void()>&callback = [this, button]() { m_switcher->PressButton(button->m_buttonId); };
const AZStd::function<void(QAction*)>& updateCallback = [button](QAction* action) {
action->setChecked(button->m_state == Button::State::Selected);
};
// connect the callback if provided
if (callback)
{
QObject::connect(action, &QAction::triggered, action, callback);
}
// register the action
m_widgetCallbacks.AddWidget(action, [updateCallback](QPointer<QObject> object)
{
updateCallback(static_cast<QAction*>(object.data()));
});
m_buttonActionMap.insert({button->m_buttonId, action});
}
void ViewportUiSwitcher::RemoveButton(ButtonId buttonId)
{
ButtonId deleteLater = buttonId;
}
void ViewportUiSwitcher::Update()
{
}
void ViewportUiSwitcher::SetActiveMode(ButtonId buttonId)
{
// Change the toolbutton's name and icon to that button
const AZStd::vector<Button*> buttons = m_switcher->GetButtons();
for (auto button : buttons)
{
if (button->m_buttonId == buttonId)
{
QString buttonName = (button->m_name).c_str();
QIcon buttonIcon = QString((button->m_icon).c_str());
m_activeButton->setIcon(buttonIcon);
m_activeButton->setText(buttonName);
}
}
// look up button ID in map then remove it from its current position
auto itr = m_buttonActionMap.find(buttonId);
QAction* action = itr->second;
removeAction(action); // call remove button?
// add the last action removed
if (m_currentMode != buttonId)
{
itr = m_buttonActionMap.find(m_currentMode);
action = itr->second;
addAction(action);
}
m_currentMode = buttonId;
}
} // namespace AzToolsFramework::ViewportUi::Internal
@@ -0,0 +1,41 @@
#pragma once
#include <AzToolsFramework/ViewportUi/Button.h>
#include <AzCore/std/containers/unordered_map.h>
#include <AzCore/std/smart_ptr/shared_ptr.h>
#include <AzToolsFramework/ViewportUi/ViewportUiWidgetCallbacks.h>
#include <functional>
#include <QPointer>
#include <QToolBar>
#include <QToolButton>
class Cluster;
namespace AzToolsFramework::ViewportUi::Internal
{
//! Helper class to make switchers (toolbars) for display in Viewport UI.
class ViewportUiSwitcher : public QToolBar
{
Q_OBJECT
public:
ViewportUiSwitcher(AZStd::shared_ptr<Cluster> switcher, ButtonId currentMode);
~ViewportUiSwitcher();
//! Adds a new button to the cluster.
void AddButton(Button* button);
//! Removes a button from the cluster.
void RemoveButton(ButtonId buttonId);
void Update();
void SetActiveMode(ButtonId buttonId);
private:
QToolButton* m_activeButton;
ButtonId m_currentMode;
AZStd::shared_ptr<Cluster> m_switcher; //!< Data structure which the cluster will be displaying to the Viewport UI.
AZStd::unordered_map<ButtonId, QPointer<QAction>> m_buttonActionMap; //!< Map for buttons to their corresponding actions.
ViewportUiWidgetCallbacks m_widgetCallbacks; //!< Registers actions and manages updates.
};
} // namespace AzToolsFramework::ViewportUi::Internal
@@ -498,6 +498,8 @@ set(FILES
ViewportUi/ViewportUiTextField.cpp
ViewportUi/ViewportUiCluster.h
ViewportUi/ViewportUiCluster.cpp
ViewportUi/ViewportUiSwitcher.h
ViewportUi/ViewportUiSwitcher.cpp
ViewportUi/ViewportUiWidgetCallbacks.h
ViewportUi/ViewportUiWidgetCallbacks.cpp
ViewportUi/ViewportUiDisplayLayout.h
+15
View File
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>icon / Shapes / Box Shape</title>
<desc>Created with Sketch.</desc>
<defs>
<path d="M14.9104468,4.3572224 L12.3128297,5.76093751 L16.0323823,7.5841228 L18.8324648,6.03460766 L14.9104468,4.3572224 L14.9104468,4.3572224 Z M14.3295329,4.10877467 L11.8900329,3.06543897 L9.21101211,4.24054281 L11.7671344,5.49345813 L14.3295329,4.10877467 L14.3295329,4.10877467 Z M8.38222655,7.88497915 L11.8905679,9.87612824 L15.5034882,7.87680326 L11.7772657,6.05034863 L8.38222655,7.88497915 Z M7.87464586,7.59690319 L11.2315704,5.78286925 L8.61677453,4.50119435 L5.12147016,6.0343462 L7.87464586,7.59690319 L7.87464586,7.59690319 Z M13.4248204,16.5292285 L13.4248204,20.2714109 L16.7212531,18.3032444 L16.7212531,14.7683696 L13.4248204,16.5292285 L13.4248204,16.5292285 Z M13.4248204,15.9681994 L16.7212531,14.2073405 L16.7212531,10.6116223 L13.4248204,12.5573954 L13.4248204,15.9681994 L13.4248204,15.9681994 Z M20.0150235,13.0089329 L17.1953634,14.5151136 L17.1953634,18.0201723 L20.0150235,16.3366674 L20.0150235,13.0089329 L20.0150235,13.0089329 Z M20.0150235,12.4479038 L20.0150235,8.66742073 L17.1953634,10.331771 L17.1953634,13.9540845 L20.0150235,12.4479038 L20.0150235,12.4479038 Z M10.5822419,16.6160095 L7.71315676,15.0944695 L7.71315676,18.6332262 L10.5822419,20.3155143 L10.5822419,16.6160095 L10.5822419,16.6160095 Z M10.5822419,16.0558018 L10.5822419,12.5941648 L7.71315676,10.8873807 L7.71315676,14.5342618 L10.5822419,16.0558018 L10.5822419,16.0558018 Z M3.88624372,13.064972 L3.88624372,16.3893156 L7.23904643,18.3552316 L7.23904643,14.8430382 L3.88624372,13.064972 L3.88624372,13.064972 Z M3.88624372,12.5047643 L7.23904643,14.2828305 L7.23904643,10.6053382 L3.88624372,8.61079627 L3.88624372,12.5047643 Z M20.9632442,6.96066648 L20.9632442,16.9207316 L12.4765998,21.9877635 L12.4765998,11.9700465 L20.9632442,6.96066648 Z M2.93802306,6.89751494 L11.5304626,12.0090536 L11.5304626,22.0167477 L2.93802306,16.9785706 L2.93802306,6.89751494 Z M11.8854851,1.98325228 L21.0857681,5.91806831 L11.88495,11.0096352 L2.91423186,5.91832977 L11.8854851,1.98325228 Z" id="path-1"></path>
</defs>
<g id="icon-/-Shapes-/-Box-Shape" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="Shape" fill="white" fill-rule="nonzero" xlink:href="#path-1"></use>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

+15
View File
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>icon / Physics / PhysX / Collider</title>
<desc>Created with Sketch.</desc>
<defs>
<path d="M12.043679,5.12543204 C12.6455376,4.46828516 14.6137828,3.53572943 15.244248,3.33110407 C17.009147,2.75828401 18.7315616,2.38790865 20.0493963,2.16811396 C21.2646599,1.96542655 22.135872,1.89079171 22.3790759,1.90353749 C18.8152035,3.62798862 19.9408429,7.00209884 19.5932228,8.65045446 C19.3047236,10.0184689 19.0411048,10.4176579 19.0411048,10.4176579 C19.0411048,10.4176579 19.0421558,10.3901126 19.0428316,10.3391328 C18.3466128,12.0890837 16.5938037,13.2831335 14.6086839,13.1790978 C14.1703378,13.1561251 13.7498731,13.0713888 13.3552808,12.9337641 C13.7029408,13.6163616 13.881436,14.3966813 13.838464,15.2166358 C13.7692038,16.5381994 13.1385421,17.6972294 12.1896873,18.4747399 L12.1963718,18.4733283 C11.6414797,19.13201 9.60351024,20.09961 8.95986008,20.3085147 C5.56742949,21.4095705 2.28865841,21.5392397 1.78172358,21.5126723 C5.16300325,20.2460801 4.26326515,16.6375199 4.61088524,14.9891643 C4.89938446,13.6211499 5.16300325,13.2219608 5.16300325,13.2219608 C5.16300325,13.2219608 5.16289937,13.2246833 5.16273593,13.2300006 C5.87988102,11.5235982 7.60945094,10.3672474 9.56430092,10.4696968 C10.002647,10.4926695 10.4231118,10.5774058 10.8177041,10.7150305 C10.4700441,10.032433 10.2915489,9.25211326 10.3345209,8.43215881 C10.40524,7.08275773 11.0612604,5.90280964 12.043679,5.12543204 Z M9.17002893,17.9928546 C10.8338457,18.0800515 12.2533227,16.8019486 12.3405197,15.1381319 C12.4277166,13.4743151 11.1496137,12.054838 9.48579698,11.9676411 C7.82198023,11.8804441 6.40250316,13.158547 6.31530622,14.8223638 C6.22810928,16.4861805 7.50621217,17.9056576 9.17002893,17.9928546 Z M14.6871879,11.6811535 C16.3510046,11.7683504 17.7704817,10.4902476 17.8576786,8.8264308 C17.9448756,7.16261404 16.6667727,5.74313698 15.0029559,5.65594004 C13.3391392,5.5687431 11.9196621,6.84684599 11.8324652,8.51066274 C11.7452682,10.1744795 13.0233711,11.5939566 14.6871879,11.6811535 Z M9.44892816,9.41633625 C8.80658814,9.27851364 7.00329275,9.5141702 5.82367767,10.3697694 C4.61432252,11.2469398 3.19925517,12.75 2.71692188,13.1227631 C2.90564063,12.4636449 3.52626507,11.0682109 4.57879521,8.93646111 L1.646611,8.26788751 L4.57879521,6.41357644 L2.01674464,2.25 L6.20121245,4.5 L7.98683911,1.52934685 L8.55331654,4.5 C11.1035114,3.22719138 12.5893628,2.59078707 13.0108706,2.59078707 C12.3777116,3.34078707 11.035099,4.78582089 10.1767691,5.90383133 C9.31843918,7.02184178 9.34810954,8.59808265 9.44892816,9.41633625 Z M14.7587637,14.2497659 C15.4011037,14.3875886 17.2043991,14.151932 18.3840142,13.2963327 C19.5933693,12.4191624 21.0084367,10.9161022 21.4907699,10.5433391 C21.3020512,11.2024573 20.6814268,12.5978913 19.6288966,14.7296411 L22.5610808,15.3982147 L19.6288966,17.2525258 L22.1909472,21.4161022 L18.0064794,19.1661022 L16.2208527,22.1367553 L15.6543753,19.1661022 C13.1041804,20.4389108 11.618329,21.0753151 11.1968212,21.0753151 C11.8299803,20.3253151 13.1725928,18.8802813 14.0309227,17.7622709 C14.8892526,16.6442604 14.8595823,15.0680195 14.7587637,14.2497659 Z" id="path-1"></path>
</defs>
<g id="icon-/-Physics--/-PhysX-/--Collider" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="Combined-Shape" fill="white" xlink:href="#path-1"></use>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

+15
View File
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>icon / Gameplay / Transform</title>
<desc>Created with Sketch.</desc>
<defs>
<path d="M15.9522403,9.51007463 L7.96252407,17.6380228 L16.6574208,17.6380228 L16.6574208,15.1883807 L22.9067163,19.0941904 L16.6574208,23 L16.6574208,20.1191132 L3.46589817,20.1191132 L3.45687888,7.43690338 L1.09328375,7.43690338 L4.99909339,1.18760796 L8.90490302,7.43690338 L6.27428022,7.43690338 L6.27428022,15.2178454 L14.0844857,7.64232009 L12.3897381,5.94757242 L19.5704817,4.29047773 L17.913387,11.4712214 L15.9522403,9.51007463 Z" id="path-1"></path>
</defs>
<g id="icon-/-Gameplay-/-Transform" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="Combined-Shape" fill="white" xlink:href="#path-1"></use>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB