Skip to content

Commit

Permalink
#5776: Rotation manipulator buttons
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Oct 10, 2021
1 parent 10e2668 commit 12e794a
Show file tree
Hide file tree
Showing 7 changed files with 535 additions and 0 deletions.
407 changes: 407 additions & 0 deletions install/ui/texturetoolmanipulationpanel.fbp

Large diffs are not rendered by default.

74 changes: 74 additions & 0 deletions install/ui/texturetoolmanipulationpanel.xrc
Expand Up @@ -205,6 +205,80 @@
<enabled>0</enabled>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT|wxTOP</flag>
<border>8</border>
<object class="wxBoxSizer">
<orient>wxVERTICAL</orient>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER|wxBOTTOM</flag>
<border>6</border>
<object class="wxStaticText" name="RotateLabel">
<label>Rotate</label>
<wrap>-1</wrap>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER|wxBOTTOM</flag>
<border>6</border>
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER|wxBOTTOM</flag>
<border>0</border>
<object class="wxBitmapButton" name="RotateClockWiseButton">
<bitmap stock_id="darkradiant:arrow_left_blue.png" stock_client="">undefined.png</bitmap>
<default>0</default>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxLEFT</flag>
<border>6</border>
<object class="wxBitmapButton" name="RotateCounterClockWiseButton">
<bitmap stock_id="darkradiant:arrow_right_blue.png" stock_client="">undefined.png</bitmap>
<default>0</default>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxLEFT</flag>
<border>6</border>
<object class="wxSpinCtrl" name="RotateAngle">
<style>wxSP_ARROW_KEYS</style>
<size>60,-1</size>
<value>0</value>
<min>1</min>
<max>999</max>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxLEFT</flag>
<border>3</border>
<object class="wxStaticText" name="m_staticText42">
<label>°</label>
<wrap>-1</wrap>
</object>
</object>
</object>
</object>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxEXPAND | wxALL</flag>
<border>0</border>
<object class="wxPanel" name="m_panel111">
<size>-1,1</size>
<bg>#303030</bg>
<enabled>0</enabled>
</object>
</object>
</object>
</object>
</resource>
1 change: 1 addition & 0 deletions install/user.xml
Expand Up @@ -116,6 +116,7 @@
<gridActive value="1" />
<horizontalScaleFactor value="10" />
<verticalScaleFactor value="10" />
<rotateAngle value="45" />
</texTool>
</textures>
<grid>
Expand Down
17 changes: 17 additions & 0 deletions radiant/textool/TexTool.cpp
Expand Up @@ -42,6 +42,7 @@ namespace

const std::string RKEY_HSCALE_FACTOR = RKEY_TEXTOOL_ROOT + "horizontalScaleFactor";
const std::string RKEY_VSCALE_FACTOR = RKEY_TEXTOOL_ROOT + "verticalScaleFactor";
const std::string RKEY_ROTATE_ANGLE = RKEY_TEXTOOL_ROOT + "rotateAngle";

constexpr const float ZOOM_MODIFIER = 1.25f;
}
Expand Down Expand Up @@ -129,6 +130,7 @@ wxWindow* TexTool::createManipulationPanel()

makeLabelBold(panel, "ShiftLabel");
makeLabelBold(panel, "ScaleLabel");
makeLabelBold(panel, "RotateLabel");

findNamedObject<wxButton>(panel, "ShiftUpButton")->Bind(wxEVT_BUTTON, [this] (wxCommandEvent&) { onShiftSelected("up"); });
findNamedObject<wxButton>(panel, "ShiftDownButton")->Bind(wxEVT_BUTTON, [this] (wxCommandEvent&) { onShiftSelected("down"); });
Expand All @@ -140,11 +142,16 @@ wxWindow* TexTool::createManipulationPanel()
findNamedObject<wxButton>(panel, "ScaleVertSmallerButton")->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { onScaleSelected("down"); });
findNamedObject<wxButton>(panel, "ScaleVertLargerButton")->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { onScaleSelected("up"); });

findNamedObject<wxButton>(panel, "RotateClockWiseButton")->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { onRotateSelected("cw"); });
findNamedObject<wxButton>(panel, "RotateCounterClockWiseButton")->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { onRotateSelected("ccw"); });

convertToSpinCtrlDouble(panel, "HorizScaleFactor", 0.1, 1000, 0.5, 1);
convertToSpinCtrlDouble(panel, "VertScaleFactor", 0.1, 1000, 0.5, 1);
convertToSpinCtrlDouble(panel, "RotateAngle", 0, 360, 0.5, 1);

registry::bindWidget(findNamedObject<wxSpinCtrlDouble>(panel, "HorizScaleFactor"), RKEY_HSCALE_FACTOR);
registry::bindWidget(findNamedObject<wxSpinCtrlDouble>(panel, "VertScaleFactor"), RKEY_VSCALE_FACTOR);
registry::bindWidget(findNamedObject<wxSpinCtrlDouble>(panel, "RotateAngle"), RKEY_ROTATE_ANGLE);

return panel;
}
Expand Down Expand Up @@ -798,6 +805,8 @@ void TexTool::onMouseUp(wxMouseEvent& ev)

void TexTool::onMouseDown(wxMouseEvent& ev)
{
_glWidget->SetFocus();

// Send the event to the mouse tool handler
MouseToolHandler::onGLMouseButtonPress(ev);

Expand Down Expand Up @@ -1019,6 +1028,14 @@ void TexTool::onScaleSelected(const std::string& direction)
GlobalCommandSystem().executeCommand("TexToolScaleSelected", scale);
}

void TexTool::onRotateSelected(const std::string& direction)
{
double angle = findNamedObject<wxSpinCtrlDouble>(this, "RotateAngle")->GetValue();
angle *= direction == "cw" ? -1 : +1;

GlobalCommandSystem().executeCommand("TexToolRotateSelected", angle);
}

void TexTool::updateManipulationPanel()
{

Expand Down
1 change: 1 addition & 0 deletions radiant/textool/TexTool.h
Expand Up @@ -137,6 +137,7 @@ class TexTool :

void onShiftSelected(const std::string& direction);
void onScaleSelected(const std::string& direction);
void onRotateSelected(const std::string& direction);

// UndoSystem event handler
void onUndoRedoOperation();
Expand Down
34 changes: 34 additions & 0 deletions radiantcore/selection/textool/TextureToolSelectionSystem.cpp
Expand Up @@ -63,6 +63,9 @@ void TextureToolSelectionSystem::initialiseModule(const IApplicationContext& ctx
GlobalCommandSystem().addCommand("TexToolScaleSelected",
std::bind(&TextureToolSelectionSystem::scaleSelectionCmd, this, std::placeholders::_1),
{ cmd::ARGTYPE_VECTOR2 });
GlobalCommandSystem().addCommand("TexToolRotateSelected",
std::bind(&TextureToolSelectionSystem::rotateSelectionCmd, this, std::placeholders::_1),
{ cmd::ARGTYPE_DOUBLE });

GlobalCommandSystem().addCommand("TexToolFlipS",
std::bind(&TextureToolSelectionSystem::flipHorizontallyCmd, this, std::placeholders::_1));
Expand Down Expand Up @@ -815,6 +818,37 @@ void TextureToolSelectionSystem::scaleSelectionCmd(const cmd::ArgumentList& args
foreachSelectedNode(scaler);
}

void TextureToolSelectionSystem::rotateSelectionCmd(const cmd::ArgumentList& args)
{
if (getSelectionMode() != SelectionMode::Surface)
{
rWarning() << "This command can only be executed in Surface manipulation mode" << std::endl;
return;
}

UndoableCommand cmd("rotateTexcoords");

if (args.size() < 1)
{
return;
}

auto angle = degrees_to_radians(args[0].getDouble());

// Calculate the center based on the selection
selection::algorithm::TextureBoundsAccumulator accumulator;
foreachSelectedNode(accumulator);

if (!accumulator.getBounds().isValid())
{
return;
}

Vector2 pivot{ accumulator.getBounds().origin.x(), accumulator.getBounds().origin.y() };
selection::algorithm::TextureRotator rotator(pivot, angle);
foreachSelectedNode(rotator);
}

module::StaticModule<TextureToolSelectionSystem> _textureToolSelectionSystemModule;

}
1 change: 1 addition & 0 deletions radiantcore/selection/textool/TextureToolSelectionSystem.h
Expand Up @@ -95,6 +95,7 @@ class TextureToolSelectionSystem :
void normaliseSelectionCmd(const cmd::ArgumentList& args);
void shiftSelectionCmd(const cmd::ArgumentList& args);
void scaleSelectionCmd(const cmd::ArgumentList& args);
void rotateSelectionCmd(const cmd::ArgumentList& args);

void flipSelected(int axis);
void performSelectionTest(Selector& selector, SelectionTest& test);
Expand Down

0 comments on commit 12e794a

Please sign in to comment.