Skip to content

Commit f34ab10

Browse files
committed
Highlight diff gradient on mesh when hovering over slider with CTRL key down
Slider diffs are now highlighted with a color gradient based on how much each vertex is affected by the slider relative to other vertices. The gradient shows when hovering the mouse over a slider and holding down the CTRL key.
1 parent 1c49b9c commit f34ab10

File tree

2 files changed

+101
-0
lines changed

2 files changed

+101
-0
lines changed

src/program/OutfitStudio.cpp

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2502,6 +2502,20 @@ void OutfitStudioFrame::createSliderGUI(const std::string& name, wxScrolledWindo
25022502
int maxValue = Config.GetIntValue("Input/SliderMaximum");
25032503

25042504
if (sliderPanel->Create(wnd, sliderName, minValue, maxValue, *bmpEditSlider, *bmpSliderSettings)) {
2505+
// Hover enter
2506+
sliderPanel->btnSliderEdit->Bind(wxEVT_ENTER_WINDOW, &OutfitStudioFrame::OnEnterHoverSlider, this);
2507+
sliderPanel->sliderCheck->Bind(wxEVT_ENTER_WINDOW, &OutfitStudioFrame::OnEnterHoverSlider, this);
2508+
sliderPanel->sliderName->Bind(wxEVT_ENTER_WINDOW, &OutfitStudioFrame::OnEnterHoverSlider, this);
2509+
sliderPanel->slider->Bind(wxEVT_ENTER_WINDOW, &OutfitStudioFrame::OnEnterHoverSlider, this);
2510+
sliderPanel->sliderReadout->Bind(wxEVT_ENTER_WINDOW, &OutfitStudioFrame::OnEnterHoverSlider, this);
2511+
2512+
// Hover leave
2513+
sliderPanel->btnSliderEdit->Bind(wxEVT_LEAVE_WINDOW, &OutfitStudioFrame::OnLeaveHoverSlider, this);
2514+
sliderPanel->sliderCheck->Bind(wxEVT_LEAVE_WINDOW, &OutfitStudioFrame::OnLeaveHoverSlider, this);
2515+
sliderPanel->sliderName->Bind(wxEVT_LEAVE_WINDOW, &OutfitStudioFrame::OnLeaveHoverSlider, this);
2516+
sliderPanel->slider->Bind(wxEVT_LEAVE_WINDOW, &OutfitStudioFrame::OnLeaveHoverSlider, this);
2517+
sliderPanel->sliderReadout->Bind(wxEVT_LEAVE_WINDOW, &OutfitStudioFrame::OnLeaveHoverSlider, this);
2518+
25052519
sliderPanel->btnSliderEdit->Bind(wxEVT_BUTTON, &OutfitStudioFrame::OnClickSliderButton, this);
25062520
sliderPanel->btnSliderProp->Bind(wxEVT_BUTTON, &OutfitStudioFrame::OnClickSliderButton, this);
25072521
sliderPanel->btnMinus->Bind(wxEVT_BUTTON, &OutfitStudioFrame::OnClickSliderButton, this);
@@ -2984,6 +2998,20 @@ void OutfitStudioFrame::HideSliderPanel(wxSliderPanel* sliderPanel) {
29842998
if (!sliderPanel)
29852999
return;
29863000

3001+
// Hover enter
3002+
sliderPanel->btnSliderEdit->Unbind(wxEVT_ENTER_WINDOW, &OutfitStudioFrame::OnEnterHoverSlider, this);
3003+
sliderPanel->sliderCheck->Unbind(wxEVT_ENTER_WINDOW, &OutfitStudioFrame::OnEnterHoverSlider, this);
3004+
sliderPanel->sliderName->Unbind(wxEVT_ENTER_WINDOW, &OutfitStudioFrame::OnEnterHoverSlider, this);
3005+
sliderPanel->slider->Unbind(wxEVT_ENTER_WINDOW, &OutfitStudioFrame::OnEnterHoverSlider, this);
3006+
sliderPanel->sliderReadout->Unbind(wxEVT_ENTER_WINDOW, &OutfitStudioFrame::OnEnterHoverSlider, this);
3007+
3008+
// Hover leave
3009+
sliderPanel->btnSliderEdit->Bind(wxEVT_LEAVE_WINDOW, &OutfitStudioFrame::OnLeaveHoverSlider, this);
3010+
sliderPanel->sliderCheck->Unbind(wxEVT_LEAVE_WINDOW, &OutfitStudioFrame::OnLeaveHoverSlider, this);
3011+
sliderPanel->sliderName->Unbind(wxEVT_LEAVE_WINDOW, &OutfitStudioFrame::OnLeaveHoverSlider, this);
3012+
sliderPanel->slider->Unbind(wxEVT_LEAVE_WINDOW, &OutfitStudioFrame::OnLeaveHoverSlider, this);
3013+
sliderPanel->sliderReadout->Unbind(wxEVT_LEAVE_WINDOW, &OutfitStudioFrame::OnLeaveHoverSlider, this);
3014+
29873015
sliderPanel->btnSliderEdit->Unbind(wxEVT_BUTTON, &OutfitStudioFrame::OnClickSliderButton, this);
29883016
sliderPanel->btnSliderProp->Unbind(wxEVT_BUTTON, &OutfitStudioFrame::OnClickSliderButton, this);
29893017
sliderPanel->btnMinus->Unbind(wxEVT_BUTTON, &OutfitStudioFrame::OnClickSliderButton, this);
@@ -6501,6 +6529,77 @@ void OutfitStudioFrame::OnClickSliderButton(wxCommandEvent& event) {
65016529
ExitSliderEdit();
65026530
}
65036531

6532+
void OutfitStudioFrame::OnEnterHoverSlider(wxMouseEvent& event) {
6533+
event.Skip();
6534+
6535+
if (!event.ControlDown())
6536+
return;
6537+
6538+
if (currentTabButton != meshTabButton)
6539+
return;
6540+
6541+
wxWindow* winObj = (wxWindow*)event.GetEventObject();
6542+
if (!winObj)
6543+
return;
6544+
6545+
wxString objName = winObj->GetName();
6546+
std::string sliderName{objName.BeforeLast('|').ToUTF8()};
6547+
if (sliderName.empty())
6548+
return;
6549+
6550+
SliderData& sd = project->activeSet[sliderName];
6551+
6552+
for (auto& shape : project->GetWorkNif()->GetShapes()) {
6553+
Mesh* m = glView->GetMesh(shape->name.get());
6554+
if (m && m->weight) {
6555+
// Clear color
6556+
m->WeightFill(0.0f);
6557+
6558+
auto diff = project->GetDiffSet(sd, shape);
6559+
if (!diff)
6560+
continue;
6561+
6562+
// Get largest diff (length)
6563+
float maxLength = 0.0f;
6564+
for (auto& d : *diff) {
6565+
if (d.second.length() > maxLength)
6566+
maxLength = d.second.length();
6567+
}
6568+
6569+
// Apply color gradient to all vertices with diffs
6570+
for (auto& d : *diff) {
6571+
if (m->nVerts > d.first) {
6572+
float gradient = d.second.length() / maxLength;
6573+
m->weight[d.first] = gradient;
6574+
}
6575+
}
6576+
6577+
m->QueueUpdate(Mesh::UpdateType::Weight);
6578+
}
6579+
}
6580+
6581+
glView->SetWeightVisible();
6582+
glView->Render();
6583+
}
6584+
6585+
void OutfitStudioFrame::OnLeaveHoverSlider(wxMouseEvent& event) {
6586+
event.Skip();
6587+
6588+
if (currentTabButton != meshTabButton)
6589+
return;
6590+
6591+
for (auto& shape : project->GetWorkNif()->GetShapes()) {
6592+
Mesh* m = glView->GetMesh(shape->name.get());
6593+
if (m && m->weight) {
6594+
// Clear color
6595+
m->WeightFill(0.0f);
6596+
}
6597+
}
6598+
6599+
glView->SetWeightVisible(false);
6600+
glView->Render();
6601+
}
6602+
65046603
void OutfitStudioFrame::OnReadoutChange(wxCommandEvent& event) {
65056604
wxTextCtrl* w = (wxTextCtrl*)event.GetEventObject();
65066605
event.Skip();

src/program/OutfitStudio.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1229,6 +1229,8 @@ class OutfitStudioFrame : public wxFrame {
12291229

12301230
void OnSlider(wxCommandEvent& event);
12311231
void OnClickSliderButton(wxCommandEvent& event);
1232+
void OnEnterHoverSlider(wxMouseEvent& event);
1233+
void OnLeaveHoverSlider(wxMouseEvent& event);
12321234
void OnReadoutChange(wxCommandEvent& event);
12331235
void OnSliderCheckBox(wxCommandEvent& event);
12341236

0 commit comments

Comments
 (0)