Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update GUI Pose Views for Dawntrail #1369

Merged
merged 11 commits into from
Aug 24, 2024
Merged
55 changes: 27 additions & 28 deletions Anamnesis/Actor/Pages/PosePage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
mc:Ignorable="d">

<Grid x:Name="ContentArea">

<Grid IsEnabled="{Binding Skeleton, Converter={StaticResource NotNullToBoolConverter}}">
<Grid.ColumnDefinitions>
<ColumnDefinition />
Expand All @@ -33,7 +32,7 @@
</Grid.RowDefinitions>

<!-- Sidebar -->
<Grid Grid.RowSpan="2" Grid.Column="2">
<Grid Grid.RowSpan="2" Grid.Column="2">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
Expand All @@ -60,12 +59,12 @@
<TextBox
Text="{Binding Skeleton.CurrentBone.Tooltip, UpdateSourceTrigger=PropertyChanged}"
Margin="0"
Padding="1"
FontSize="10"
FontWeight="Bold"
Padding="1"
FontSize="10"
FontWeight="Bold"
BorderBrush="Transparent"
Visibility="{Binding Skeleton.CurrentBone, Converter={StaticResource NotNullToVisibilityConverter}}"
Style="{StaticResource MaterialDesignTextBox}"/>
Style="{StaticResource MaterialDesignTextBox}"/>

<XivToolsWpf:TextBlock Style="{StaticResource Header}"
Text="{Binding Skeleton.CurrentBone.BoneName}"
Expand Down Expand Up @@ -381,7 +380,6 @@
<Grid Grid.Row="1"
Margin="3"
IsEnabled="{Binding PoseService.IsEnabled}">

<Grid
x:Name="MouseCanvas"
Grid.Row="1"
Expand All @@ -391,7 +389,8 @@
MouseUp="OnCanvasMouseUp">
<Grid DataContext="{Binding Skeleton}">
<views:Pose3DView x:Name="ThreeDView" Visibility="Collapsed" />
<views:PoseGuiView x:Name="GuiView" Visibility="Visible" />
<views:PoseBodyGuiView x:Name="BodyGuiView" Visibility="Visible" />
<views:PoseFaceGuiView x:Name="FaceGuiView" Visibility="Collapsed" />
<views:PoseMatrixView x:Name="MatrixView" Visibility="Collapsed" Margin="3, 28, 0, 3"/>
</Grid>
</Grid>
Expand All @@ -417,28 +416,29 @@
SelectedIndex="0"
SelectionChanged="OnViewChanged"
Style="{StaticResource MaterialDesignToolToggleListBox}">
<ListBoxItem
Margin="1"
Padding="8,5"
Cursor="Hand"
ToolTip="GUI View"
Visibility="{Binding Skeleton.File.AllowPoseGui, Converter={StaticResource B2V}}">
<XivToolsWpf:IconBlock Icon="ProjectDiagram" FontSize="10"/>
<ListBoxItem Margin="1"
Padding="8,5"
Cursor="Hand"
ToolTip="Body GUI View">
<XivToolsWpf:IconBlock Icon="StreetView" FontSize="10"/>
</ListBoxItem>
<ListBoxItem
Margin="1"
Padding="8,5"
Cursor="Hand"
ToolTip="Matrix View"
Visibility="{Binding Skeleton.File.AllowPoseMatrix, Converter={StaticResource B2V}}">
<ListBoxItem Margin="1"
Padding="8,5"
Cursor="Hand"
ToolTip="Face GUI View">
<XivToolsWpf:IconBlock Icon="GrinAlt" FontSize="10"/>
</ListBoxItem>
<ListBoxItem Margin="1"
Padding="8,5"
Cursor="Hand"
ToolTip="Matrix View">
<XivToolsWpf:IconBlock Icon="BorderAll" FontSize="10"/>
</ListBoxItem>
<ListBoxItem
x:Name="View3dButton"
Margin="1"
Padding="8,5"
Cursor="Hand"
ToolTip="3D View">
<ListBoxItem x:Name="View3dButton"
Margin="1"
Padding="8,5"
Cursor="Hand"
ToolTip="3D View">
<XivToolsWpf:IconBlock Icon="Cube" FontSize="10"/>
</ListBoxItem>
</ListBox>
Expand Down Expand Up @@ -470,6 +470,5 @@
<XivToolsWpf:InfoControl IsError="True" Key="Pose_NoModel" VerticalAlignment="Bottom" Margin="12"/>
</Grid>
</Grid>

</Grid>
</UserControl>
29 changes: 16 additions & 13 deletions Anamnesis/Actor/Pages/PosePage.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,13 @@

namespace Anamnesis.Actor.Pages;

using Anamnesis.Actor.Views;
using Anamnesis.Files;
using Anamnesis.GUI.Dialogs;
using Anamnesis.Memory;
using Anamnesis.Services;
using PropertyChanged;
using Serilog;
using System;
using System.Collections.Generic;
using System.IO;
Expand All @@ -12,13 +19,6 @@ namespace Anamnesis.Actor.Pages;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media.Media3D;
using Anamnesis.Files;
using Anamnesis.GUI.Dialogs;
using Anamnesis.Memory;
using Anamnesis.Actor.Views;
using Anamnesis.Services;
using PropertyChanged;
using Serilog;
using XivToolsWpf;
using CmQuaternion = Anamnesis.Memory.Quaternion;

Expand Down Expand Up @@ -214,7 +214,8 @@ private async Task Refresh()
await Dispatch.MainThread();

this.ThreeDView.DataContext = null;
this.GuiView.DataContext = null;
this.BodyGuiView.DataContext = null;
this.FaceGuiView.DataContext = null;
this.MatrixView.DataContext = null;

this.BoneViews.Clear();
Expand All @@ -234,7 +235,8 @@ private async Task Refresh()
await this.Skeleton.SetActor(this.Actor);

this.ThreeDView.DataContext = this.Skeleton;
this.GuiView.DataContext = this.Skeleton;
this.BodyGuiView.DataContext = this.Skeleton;
this.FaceGuiView.DataContext = this.Skeleton;
this.MatrixView.DataContext = this.Skeleton;

if (this.writeSkeletonTask == null || this.writeSkeletonTask.IsCompleted)
Expand Down Expand Up @@ -388,12 +390,13 @@ private void OnViewChanged(object sender, SelectionChangedEventArgs e)
{
int selected = this.ViewSelector.SelectedIndex;

if (this.GuiView == null)
if (this.BodyGuiView == null)
return;

this.GuiView.Visibility = selected == 0 ? Visibility.Visible : Visibility.Collapsed;
this.MatrixView.Visibility = selected == 1 ? Visibility.Visible : Visibility.Collapsed;
this.ThreeDView.Visibility = selected == 2 ? Visibility.Visible : Visibility.Collapsed;
this.BodyGuiView.Visibility = selected == 0 ? Visibility.Visible : Visibility.Collapsed;
this.FaceGuiView.Visibility = selected == 1 ? Visibility.Visible : Visibility.Collapsed;
this.MatrixView.Visibility = selected == 2 ? Visibility.Visible : Visibility.Collapsed;
this.ThreeDView.Visibility = selected == 3 ? Visibility.Visible : Visibility.Collapsed;
}

private void OnClearClicked(object? sender, RoutedEventArgs? e)
Expand Down
51 changes: 38 additions & 13 deletions Anamnesis/Actor/Posing/Views/BoneView.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@

namespace Anamnesis.Actor.Views;

using Anamnesis.Actor.Pages;
using MaterialDesignThemes.Wpf;
using Serilog;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
Expand All @@ -11,9 +14,6 @@ namespace Anamnesis.Actor.Views;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;
using Anamnesis.Actor.Pages;
using MaterialDesignThemes.Wpf;
using Serilog;
using XivToolsWpf.DependencyProperties;

public partial class BoneView : UserControl, IBone
Expand Down Expand Up @@ -116,7 +116,7 @@ private void BindDataContext()

private void OnSkeletonPropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
{
bool refreshBone = this.Bone == null || e.PropertyName == nameof(SkeletonVisual3d.FlipSides);
bool refreshBone = this.Bone == null || e.PropertyName == nameof(SkeletonVisual3d.FlipSides) || e.PropertyName == nameof(SkeletonVisual3d.AllBones);

if (refreshBone && this.DataContext is SkeletonVisual3d)
this.SetBone(this.CurrentBoneName);
Expand Down Expand Up @@ -160,18 +160,37 @@ private void DrawSkeleton()
if (childView.Visibility != Visibility.Visible)
continue;

var scale = 1.0;

// Determine line stroke thickness (if placed inside a Viewbox element)
if (this.Parent is Canvas cvs && cvs.Parent is Viewbox vbox)
{
scale = vbox.ActualWidth / cvs.ActualWidth;
}

if (this.Parent is Canvas c1 && childView.Parent is Canvas c2 && c1 == c2)
{
Line line = new Line();
line.SnapsToDevicePixels = true;
line.StrokeThickness = 1;
line.StrokeThickness = 1 / scale;
line.Stroke = Brushes.Gray;
line.IsHitTestVisible = false;

line.X1 = Canvas.GetLeft(this) + (this.Width / 2);
line.Y1 = Canvas.GetTop(this) + (this.Height / 2);
line.X2 = Canvas.GetLeft(childView) + (childView.Width / 2);
line.Y2 = Canvas.GetTop(childView) + (childView.Height / 2);
// Note: Canvas.GetLeft and Canvas.GetTop return the element corner, including margin, padding, and border.
// Adjust for these properties in coordinate calculations.
double parentWidth = this.ActualWidth + this.Margin.Left + this.Margin.Right + this.Padding.Left + this.Padding.Right +
this.BorderThickness.Right;
double parentHeight = this.ActualHeight + this.Margin.Top + this.Margin.Bottom + this.Padding.Top + this.Padding.Bottom +
this.BorderThickness.Bottom;
double childWidth = childView.ActualWidth + childView.Margin.Left + childView.Margin.Right + childView.Padding.Left + childView.Padding.Right +
childView.BorderThickness.Right;
double childHeight = childView.ActualHeight + childView.Margin.Top + childView.Margin.Bottom + childView.Padding.Top + childView.Padding.Bottom +
childView.BorderThickness.Bottom;

line.X1 = Canvas.GetLeft(this) + (parentWidth / 2);
line.Y1 = Canvas.GetTop(this) + (parentHeight / 2);
line.X2 = Canvas.GetLeft(childView) + (childWidth / 2);
line.Y2 = Canvas.GetTop(childView) + (childHeight / 2);

c1.Children.Insert(0, line);
this.linesToChildren.Add(line);
Expand All @@ -180,7 +199,6 @@ private void DrawSkeleton()
Line line2 = new Line();
line2.StrokeThickness = 25;
line2.Stroke = Brushes.Transparent;
////line2.Opacity = 0.1f;

line2.MouseEnter += childView.OnMouseEnter;
line2.MouseLeave += childView.OnMouseLeave;
Expand Down Expand Up @@ -289,14 +307,21 @@ private void UpdateState()
bool parentHovered = this.skeleton.GetIsBoneParentsHovered(this.Bone);

Color color = parentHovered ? theme.PrimaryMid.Color : theme.BodyLight;
int thickenss = parentSelected || selected || parentHovered ? 2 : 1;
double thickness = parentSelected || selected || parentHovered ? 2 : 1;

// Scale thickness based on viewbox scale (if applicable)
if (this.Parent is Canvas cvs && cvs.Parent is Viewbox vbox)
{
var scale = vbox.ActualWidth / cvs.ActualWidth;
thickness /= scale;
}

this.ForegroundElipse.Visibility = (selected || hovered) ? Visibility.Visible : Visibility.Hidden;
this.BackgroundElipse.Stroke = new SolidColorBrush(theme.PrimaryMid.Color);
this.SetState(new SolidColorBrush(color), thickenss);
this.SetState(new SolidColorBrush(color), thickness);
}

private void SetState(Brush stroke, int thickness)
private void SetState(Brush stroke, double thickness)
{
this.BackgroundElipse.StrokeThickness = thickness;

Expand Down
Loading