Skip to content

Commit 0d929f0

Browse files
committed
Add flip x, flip y and rotate buttons to tile picker, and right click to delete tile
1 parent 1c7f64f commit 0d929f0

File tree

4 files changed

+66
-17
lines changed

4 files changed

+66
-17
lines changed

UndertaleModToolAvalonia/Controls/UndertaleRoomEditor.cs

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,14 @@ protected override void OnPointerMoved(PointerEventArgs e)
119119
hoveredTile = GetLayerTile(roomMousePosition, tilesLayer);
120120
if (settingTiles)
121121
{
122-
SetLayerTile(roomMousePosition, tilesLayer, vm.SelectedTileData);
122+
if (e.GetCurrentPoint(this).Properties.IsRightButtonPressed)
123+
{
124+
SetLayerTile(roomMousePosition, tilesLayer, 0);
125+
}
126+
else
127+
{
128+
SetLayerTile(roomMousePosition, tilesLayer, vm.SelectedTileData);
129+
}
123130
}
124131
}
125132
else
@@ -182,15 +189,15 @@ static bool RectContainsPoint(Rect rect, double rotation, Point pivot, Point poi
182189

183190
protected override void OnPointerPressed(PointerPressedEventArgs e)
184191
{
192+
Point roomMousePosition = (mousePosition - translation) / scaling;
193+
185194
if (e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed)
186195
{
187196
this.Focus();
188197
movingTranslationOffset = mousePosition - translation;
189198
}
190199
else if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed)
191200
{
192-
Point roomMousePosition = (mousePosition - translation) / scaling;
193-
194201
if (vm!.RoomItemsSelectedItem is UndertaleRoom.Layer { LayerType: UndertaleRoom.LayerType.Tiles } tilesLayer)
195202
{
196203
settingTiles = true;
@@ -216,6 +223,14 @@ protected override void OnPointerPressed(PointerPressedEventArgs e)
216223
}
217224
}
218225
}
226+
else if (e.GetCurrentPoint(this).Properties.IsRightButtonPressed)
227+
{
228+
if (vm!.RoomItemsSelectedItem is UndertaleRoom.Layer { LayerType: UndertaleRoom.LayerType.Tiles } tilesLayer)
229+
{
230+
settingTiles = true;
231+
SetLayerTile(roomMousePosition, tilesLayer, 0);
232+
}
233+
}
219234
}
220235

221236
protected override void OnPointerReleased(PointerReleasedEventArgs e)
@@ -288,7 +303,7 @@ static string GetTileInfo(uint? tile)
288303
{
289304
if (tile is uint tileNN)
290305
{
291-
uint tileId = tileNN & 0x0FFFFFFF;
306+
uint tileId = tileNN & UndertaleRoomViewModel.TILE_ID;
292307
uint tileOrientation = tileNN >> 28;
293308

294309
float scaleX = (((tileOrientation >> 0) & 1) == 0) ? 1 : -1;
@@ -301,13 +316,13 @@ static string GetTileInfo(uint? tile)
301316
}
302317

303318
context.DrawText(new FormattedText(
304-
$"mouse: ({mousePosition.X}, {mousePosition.Y}), room: ({Math.Floor(roomMousePosition.X)}, {Math.Floor(roomMousePosition.Y)})\n" +
305-
$"view: ({-translation.X}, {-translation.Y}, {-translation.X + Bounds.Width}, {-translation.Y + Bounds.Height}), zoom: {scaling}x\n" +
306-
$"{vm?.Room.Name.Content} ({vm?.Room.Width}, {vm?.Room.Height})\n" +
319+
$"mouse: ({mousePosition.X}, {mousePosition.Y})\n" +
320+
$"view: ({-translation.X}, {-translation.Y}, {-translation.X + Bounds.Width}, {-translation.Y + Bounds.Height})\n" +
307321
$"category: {vm?.CategorySelected}\n" +
308322
$"custom render time: <{customDrawOperationTime} ms\n" +
309323
$"hovered room item: {hoveredRoomItem?.Object}\n" +
310-
$"hovered tile: {GetTileInfo(hoveredTile)}",
324+
$"hovered tile: {GetTileInfo(hoveredTile)}\n" +
325+
$"selected tile: {GetTileInfo(vm?.SelectedTileData)}",
311326
CultureInfo.CurrentCulture, FlowDirection.LeftToRight, Typeface.Default, 12, new SolidColorBrush(Colors.White)),
312327
new Point(0, 0));
313328
}
@@ -953,7 +968,7 @@ static void AddQuad(List<SKPoint> list, float x1, float y1, float x2, float y2,
953968
for (int x = 0; x < tileData[y].Length; x++)
954969
{
955970
uint tile = tileData[y][x];
956-
uint tileId = tile & 0x0FFFFFFF;
971+
uint tileId = tile & UndertaleRoomViewModel.TILE_ID;
957972

958973
if (tileId != 0)
959974
{

UndertaleModToolAvalonia/Controls/UndertaleRoomTilePicker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ public void Render(ImmediateDrawingContext context)
229229
}
230230
}
231231

232-
uint selectedTileId = SelectedTileData & 0x0FFFFFFF;
232+
uint selectedTileId = SelectedTileData & UndertaleRoomViewModel.TILE_ID;
233233
uint selectedTileX = (selectedTileId % VisualColumns) * tileW;
234234
uint selectedTileY = (selectedTileId / VisualColumns) * tileH;
235235

UndertaleModToolAvalonia/ResourceViews/UndertaleRoomView.axaml

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
xmlns:undertalem="clr-namespace:UndertaleModLib.Models;assembly=UndertaleModLib"
88
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
99
x:Class="UndertaleModToolAvalonia.UndertaleRoomView"
10-
x:DataType="l:UndertaleRoomViewModel">
10+
x:DataType="l:UndertaleRoomViewModel"
11+
x:Name="Root">
1112
<UserControl.Resources>
1213
<ContextMenu x:Key="GameObjectListMenu">
1314
<MenuItem Header="_Add game object instance" Click="ContextMenu_AddGameObjectInstance_GameObjectList_Click"/>
@@ -525,25 +526,31 @@
525526
<Grid ColumnDefinitions="1*,1*,1*">
526527
<TextBox Grid.Column="0" Text="{Binding TilesX, UpdateSourceTrigger=LostFocus}" />
527528
<TextBox Grid.Column="1" Text="{Binding TilesY, UpdateSourceTrigger=LostFocus}" />
528-
<Button Grid.Column="2" Command="{Binding $parent[UserControl].((l:UndertaleRoomViewModel)DataContext).AutoSizeTileLayer}">Auto</Button>
529+
<Button Grid.Column="2" Command="{Binding #Root.DataContext.AutoSizeTileLayer}">Auto</Button>
529530
</Grid>
530531

531532
<Label>Tile set</Label>
532533
<l:UndertaleResourceReferenceView Reference="{Binding Background}" ReferenceType="undertalem:UndertaleBackground" />
533534

534-
<!-- TODO: Edit/export/import tile data -->
535+
<!-- TODO: Export/import tile data -->
535536
<Label>Selected tile data</Label>
536-
<TextBox Text="{Binding $parent[UserControl].((l:UndertaleRoomViewModel)DataContext).SelectedTileData}" />
537+
<TextBox Text="{Binding #Root.DataContext.SelectedTileData}" />
537538

538539
<Label>Tile set columns</Label>
539540
<NumericUpDown
540-
Value="{Binding $parent[UserControl].((l:UndertaleRoomViewModel)DataContext).TileSetColumns}"
541+
Value="{Binding #Root.DataContext.TileSetColumns}"
541542
Minimum="0" FormatString="0" />
542543
</Grid>
543544

545+
<StackPanel Orientation="Horizontal">
546+
<Button Command="{Binding #Root.DataContext.SelectedTileDataFlipX}">Flip X</Button>
547+
<Button Command="{Binding #Root.DataContext.SelectedTileDataFlipY}">Flip Y</Button>
548+
<Button Command="{Binding #Root.DataContext.SelectedTileDataRotateClockwise}">Rotate clockwise</Button>
549+
</StackPanel>
550+
544551
<l:UndertaleRoomTilePicker
545-
SelectedTileData="{Binding $parent[UserControl].((l:UndertaleRoomViewModel)DataContext).SelectedTileData}"
546-
TileSetColumns="{Binding $parent[UserControl].((l:UndertaleRoomViewModel)DataContext).TileSetColumns}"
552+
SelectedTileData="{Binding #Root.DataContext.SelectedTileData}"
553+
TileSetColumns="{Binding #Root.DataContext.TileSetColumns}"
547554
MinHeight="{Binding $parent[ScrollViewer].Viewport.Height}" />
548555
</StackPanel>
549556
</DataTemplate>

UndertaleModToolAvalonia/ResourceViews/UndertaleRoomViewModel.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ namespace UndertaleModToolAvalonia;
1717

1818
public partial class UndertaleRoomViewModel : IUndertaleResourceViewModel
1919
{
20+
public const uint TILE_ID = 0b00000000000001111111111111111111;
21+
public const uint TILE_FLIP_H = 0b00010000000000000000000000000000;
22+
public const uint TILE_FLIP_V = 0b00100000000000000000000000000000;
23+
public const uint TILE_ROTATE = 0b01000000000000000000000000000000;
24+
2025
public MainViewModel MainVM;
2126
public UndertaleResource Resource => Room;
2227
public UndertaleRoom Room { get; set; }
@@ -347,6 +352,28 @@ public async void AutoSizeTileLayer()
347352
}
348353
}
349354

355+
public void SelectedTileDataFlipX()
356+
{
357+
SelectedTileData ^= ((SelectedTileData & TILE_ROTATE) == 0) ? TILE_FLIP_H : TILE_FLIP_V;
358+
}
359+
360+
public void SelectedTileDataFlipY()
361+
{
362+
SelectedTileData ^= ((SelectedTileData & TILE_ROTATE) == 0) ? TILE_FLIP_V : TILE_FLIP_H;
363+
}
364+
365+
public void SelectedTileDataRotateClockwise()
366+
{
367+
if ((SelectedTileData & TILE_ROTATE) != 0)
368+
{
369+
SelectedTileData ^= TILE_ROTATE | TILE_FLIP_H | TILE_FLIP_V;
370+
}
371+
else
372+
{
373+
SelectedTileData ^= TILE_ROTATE;
374+
}
375+
}
376+
350377
public async void SaveAsImage()
351378
{
352379
IStorageFile? file = await MainVM.View!.SaveFileDialog(new FilePickerSaveOptions()

0 commit comments

Comments
 (0)