From 82e9f59f5e39d65dfffaffd9b11845183e4bf16f Mon Sep 17 00:00:00 2001 From: Colin McMillen Date: Sat, 5 Aug 2023 14:34:06 -0400 Subject: [PATCH] pull out a separate Transform class --- Program.cs | 88 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 51 insertions(+), 37 deletions(-) diff --git a/Program.cs b/Program.cs index 504cf01..224d230 100644 --- a/Program.cs +++ b/Program.cs @@ -57,15 +57,54 @@ public enum ToolStatus { } +public class Transform { + // FIXME: move scale and offset into Photo itself? + float activeScale; + Vector2i activeOffset; + Photo photo; + + public Transform(float scale, Vector2i offset, Photo photo) { + activeScale = scale; + activeOffset = offset; + this.photo = photo; + } + + public Vector2i ScreenToImageDelta(int x, int y) { + return new((int) (x / activeScale), (int) (y / activeScale)); + } + + public Vector2i ScreenToImage(int x, int y) { + int rx = (int) ((x - activeOffset.X) / activeScale); + int ry = (int) ((y - activeOffset.Y) / activeScale); + rx = Math.Clamp(rx, 0, photo.Size.X); + ry = Math.Clamp(ry, 0, photo.Size.Y); + return new(rx, ry); + } + + public Vector2i ScreenToImage(Vector2i position) { + return ScreenToImage(position.X, position.Y); + } + + public Vector2i ImageToScreen(int x, int y) { + int rx = (int) ((x * activeScale) + activeOffset.X); + int ry = (int) ((y * activeScale) + activeOffset.Y); + return new(rx, ry); + } + + public Vector2i ImageToScreen(Vector2i position) { + return ImageToScreen(position.X, position.Y); + } +} + public interface ITool { - ToolStatus HandleInput(KeyboardState input, MouseState mouse, Game game); + ToolStatus HandleInput(KeyboardState input, MouseState mouse, Transform transform); string Status(); void Draw(UiGeometry geometry, Game game); } public class ViewTool : ITool { - public ToolStatus HandleInput(KeyboardState input, MouseState mouse, Game game) { + public ToolStatus HandleInput(KeyboardState input, MouseState mouse, Transform transform) { return ToolStatus.Active; } @@ -78,7 +117,6 @@ public class ViewTool : ITool { } -// FIXME: remove unneeded dependencies on "Game" or at least refactor them a bit. public class CropTool : ITool { Photo photo; @@ -93,9 +131,9 @@ public class CropTool : ITool { mouseDragEnd = new(photo.CropRectangle.Right, photo.CropRectangle.Bottom); } - public ToolStatus HandleInput(KeyboardState input, MouseState mouse, Game game) { + public ToolStatus HandleInput(KeyboardState input, MouseState mouse, Transform transform) { Vector2i mousePosition = (Vector2i) mouse.Position; - Vector2i imagePosition = game.ScreenToImage(mousePosition); + Vector2i imagePosition = transform.ScreenToImage(mousePosition); if (mouse.IsButtonPressed(MouseButton.Button1)) { dragging = photo.CropRectangle.Contains(imagePosition.X, imagePosition.Y); @@ -118,7 +156,7 @@ public class CropTool : ITool { } else { if (mouse.IsButtonDown(MouseButton.Button1)) { Vector2 delta = mouse.Delta; - Vector2i imageDelta = game.ScreenToImageDelta((int) delta.X, (int) delta.Y); + Vector2i imageDelta = transform.ScreenToImageDelta((int) delta.X, (int) delta.Y); photo.CropRectangle.Offset(imageDelta.X, imageDelta.Y); if (photo.CropRectangle.Left < 0) { photo.CropRectangle.Offset(-photo.CropRectangle.Left, 0); @@ -406,6 +444,7 @@ public class Game : GameWindow { Vector2i mousePosition; float activeScale = 1f; Vector2i activeOffset; + Transform transform = new(1f, Vector2i.Zero, null); Shader shader = new(); Matrix4 projection; float zoomLevel = 0f; @@ -574,7 +613,7 @@ public class Game : GameWindow { } // Delegate input to the active tool. - ToolStatus status = activeTool.HandleInput(KeyboardState, MouseState, this); + ToolStatus status = activeTool.HandleInput(KeyboardState, MouseState, transform); // Change back to the default tool if the active tool is done. if (status != ToolStatus.Active) { @@ -642,9 +681,9 @@ public class Game : GameWindow { GL.VertexAttribPointer(texCoordLocation, 2, VertexAttribPointerType.Float, false, 5 * sizeof(float), 3 * sizeof(float)); // Load photos from a directory. - // string[] files = Directory.GetFiles(@"c:\users\colin\desktop\photos-test\"); + string[] files = Directory.GetFiles(@"c:\users\colin\desktop\photos-test\"); // string[] files = Directory.GetFiles(@"c:\users\colin\pictures\photos\2023\07\14\"); - string[] files = Directory.GetFiles(@"c:\users\colin\pictures\photos\2023\07\23\"); + // string[] files = Directory.GetFiles(@"c:\users\colin\pictures\photos\2023\07\23\"); // string[] files = Directory.GetFiles(@"G:\DCIM\100EOSR6\"); // string[] files = Directory.GetFiles(@"c:\users\colin\desktop\totte-output\2023\07\31"); // string[] files = Directory.GetFiles(@"C:\Users\colin\Pictures\photos\2018\06\23"); @@ -777,6 +816,7 @@ public class Game : GameWindow { Vector2i center = (Vector2i) geometry.PhotoBox.Center; Box2i photoBox = Util.MakeBox(center.X - renderSize.X / 2, center.Y - renderSize.Y / 2, renderSize.X, renderSize.Y); activeOffset = new(photoBox.Min.X, photoBox.Min.Y); + transform = new Transform(activeScale, activeOffset, activePhoto); DrawTexture(active, photoBox); for (int i = 0; i < 5; i++) { Texture star = (activePhoto.Rating > i) ? STAR_FILLED : STAR_EMPTY; @@ -827,8 +867,8 @@ public class Game : GameWindow { return; } - Vector2i leftTop = ImageToScreen(activePhoto.CropRectangle.Left, activePhoto.CropRectangle.Top); - Vector2i rightBottom = ImageToScreen(activePhoto.CropRectangle.Right, activePhoto.CropRectangle.Bottom); + Vector2i leftTop = transform.ImageToScreen(activePhoto.CropRectangle.Left, activePhoto.CropRectangle.Top); + Vector2i rightBottom = transform.ImageToScreen(activePhoto.CropRectangle.Right, activePhoto.CropRectangle.Bottom); var (left, top) = leftTop; var (right, bottom) = rightBottom; @@ -846,32 +886,6 @@ public class Game : GameWindow { } } - public Vector2i ScreenToImageDelta(int x, int y) { - return new((int) (x / activeScale), (int) (y / activeScale)); - } - - public Vector2i ScreenToImage(int x, int y) { - int rx = (int) ((x - activeOffset.X) / activeScale); - int ry = (int) ((y - activeOffset.Y) / activeScale); - rx = Math.Clamp(rx, 0, photos[photoIndex].Size.X); - ry = Math.Clamp(ry, 0, photos[photoIndex].Size.Y); - return new(rx, ry); - } - - public Vector2i ScreenToImage(Vector2i position) { - return ScreenToImage(position.X, position.Y); - } - - public Vector2i ImageToScreen(int x, int y) { - int rx = (int) ((x * activeScale) + activeOffset.X); - int ry = (int) ((y * activeScale) + activeOffset.Y); - return new(rx, ry); - } - - public Vector2i ImageToScreen(Vector2i position) { - return ImageToScreen(position.X, position.Y); - } - public void DrawTexture(Texture texture, int x, int y) { DrawTexture(texture, Util.MakeBox(x, y, texture.Size.X, texture.Size.Y)); }