@@ -2502,6 +2502,20 @@ void OutfitStudioFrame::createSliderGUI(const std::string& name, wxScrolledWindo
2502
2502
int maxValue = Config.GetIntValue("Input/SliderMaximum");
2503
2503
2504
2504
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
+
2505
2519
sliderPanel->btnSliderEdit->Bind(wxEVT_BUTTON, &OutfitStudioFrame::OnClickSliderButton, this);
2506
2520
sliderPanel->btnSliderProp->Bind(wxEVT_BUTTON, &OutfitStudioFrame::OnClickSliderButton, this);
2507
2521
sliderPanel->btnMinus->Bind(wxEVT_BUTTON, &OutfitStudioFrame::OnClickSliderButton, this);
@@ -2984,6 +2998,20 @@ void OutfitStudioFrame::HideSliderPanel(wxSliderPanel* sliderPanel) {
2984
2998
if (!sliderPanel)
2985
2999
return;
2986
3000
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
+
2987
3015
sliderPanel->btnSliderEdit->Unbind(wxEVT_BUTTON, &OutfitStudioFrame::OnClickSliderButton, this);
2988
3016
sliderPanel->btnSliderProp->Unbind(wxEVT_BUTTON, &OutfitStudioFrame::OnClickSliderButton, this);
2989
3017
sliderPanel->btnMinus->Unbind(wxEVT_BUTTON, &OutfitStudioFrame::OnClickSliderButton, this);
@@ -6501,6 +6529,77 @@ void OutfitStudioFrame::OnClickSliderButton(wxCommandEvent& event) {
6501
6529
ExitSliderEdit();
6502
6530
}
6503
6531
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
+
6504
6603
void OutfitStudioFrame::OnReadoutChange(wxCommandEvent& event) {
6505
6604
wxTextCtrl* w = (wxTextCtrl*)event.GetEventObject();
6506
6605
event.Skip();
0 commit comments