move more calculations into UiGeometry

This commit is contained in:
Colin McMillen 2023-07-07 14:52:36 -04:00
parent 6812699401
commit b41321b0c7

View File

@ -184,29 +184,43 @@ public class Texture : IDisposable {
public class UiGeometry { public class UiGeometry {
public static Vector2i MIN_WINDOW_SIZE = new Vector2i(640, 480); public static Vector2i MIN_WINDOW_SIZE = new Vector2i(640, 480);
private static CameraInfo activeCamera = CameraInfo.NIKON_D7000;
public readonly Vector2i WindowSize; public readonly Vector2i WindowSize;
public readonly List<Box2i> ThumbnailBoxes = new();
public UiGeometry() : this(MIN_WINDOW_SIZE) {} public UiGeometry() : this(MIN_WINDOW_SIZE) {}
public UiGeometry(Vector2i windowSize) { public UiGeometry(Vector2i windowSize) {
WindowSize = windowSize; WindowSize = windowSize;
int thumbnailHeight = 150;
int thumbnailWidth = (int) 1.0 * thumbnailHeight * activeCamera.Resolution.X / activeCamera.Resolution.Y;
int numBoxes = 10; // FIXME
for (int i = 0; i < numBoxes; i++) {
Box2i box = Util.makeBox(WindowSize.X - thumbnailWidth, i * thumbnailHeight, thumbnailWidth, thumbnailHeight);
ThumbnailBoxes.Add(box);
}
}
}
public static class Util {
public static Box2i makeBox(int left, int top, int width, int height) {
return new Box2i(left, top, left + width, top + height);
} }
} }
public class Game : GameWindow { public class Game : GameWindow {
public Game(GameWindowSettings gwSettings, NativeWindowSettings nwSettings) : base(gwSettings, nwSettings) { } public Game(GameWindowSettings gwSettings, NativeWindowSettings nwSettings) : base(gwSettings, nwSettings) { }
static CameraInfo activeCamera = CameraInfo.NIKON_D7000;
static int thumbnailHeight = 150;
static int thumbnailWidth = (int) 1.0 * thumbnailHeight * activeCamera.Resolution.X / activeCamera.Resolution.Y;
static Texture TEXTURE_WHITE; static Texture TEXTURE_WHITE;
UiGeometry geometry = new UiGeometry(); UiGeometry geometry = new();
// four points of (x, y, z, tex_x, tex_y) // Four points, each consisting of (x, y, z, tex_x, tex_y).
float[] vertices = new float[20]; float[] vertices = new float[20];
// Indices to draw a rectangle from two triangles.
uint[] indices = { uint[] indices = {
0, 1, 3, // first triangle 0, 1, 3, // first triangle
1, 2, 3 // second triangle 1, 2, 3 // second triangle
@ -215,7 +229,7 @@ public class Game : GameWindow {
int VertexBufferObject; int VertexBufferObject;
int ElementBufferObject; int ElementBufferObject;
int VertexArrayObject; int VertexArrayObject;
List<Texture> textures = new List<Texture>(); List<Texture> textures = new();
int textureIndex = 0; int textureIndex = 0;
Shader shader; Shader shader;
Matrix4 projection; Matrix4 projection;
@ -244,8 +258,6 @@ public class Game : GameWindow {
protected override void OnLoad() { protected override void OnLoad() {
base.OnLoad(); base.OnLoad();
Console.WriteLine($"thumbnail size: {thumbnailWidth}x{thumbnailHeight}");
GL.ClearColor(0f, 0f, 0f, 1f); GL.ClearColor(0f, 0f, 0f, 1f);
VertexArrayObject = GL.GenVertexArray(); VertexArrayObject = GL.GenVertexArray();
@ -262,8 +274,8 @@ public class Game : GameWindow {
shader = new Shader(); shader = new Shader();
shader.Use(); shader.Use();
// Because there's now 5 floats between the start of the first vertex and the start of the second, // Because there's 5 floats between the start of the first vertex and the start of the second,
// we modify the stride from 3 * sizeof(float) to 5 * sizeof(float). // the stride is 5 * sizeof(float).
// This will now pass the new vertex array to the buffer. // This will now pass the new vertex array to the buffer.
var vertexLocation = shader.GetAttribLocation("aPosition"); var vertexLocation = shader.GetAttribLocation("aPosition");
GL.EnableVertexAttribArray(vertexLocation); GL.EnableVertexAttribArray(vertexLocation);
@ -276,8 +288,8 @@ public class Game : GameWindow {
GL.EnableVertexAttribArray(texCoordLocation); GL.EnableVertexAttribArray(texCoordLocation);
GL.VertexAttribPointer(texCoordLocation, 2, VertexAttribPointerType.Float, false, 5 * sizeof(float), 3 * sizeof(float)); GL.VertexAttribPointer(texCoordLocation, 2, VertexAttribPointerType.Float, false, 5 * sizeof(float), 3 * sizeof(float));
// Load blank white texture. // Create a blank white texture.
Image<Rgba32> white1x1 = new Image<Rgba32>(1, 1, new Rgba32(255, 255, 255)); Image<Rgba32> white1x1 = new(1, 1, new Rgba32(255, 255, 255));
TEXTURE_WHITE = new Texture(white1x1); TEXTURE_WHITE = new Texture(white1x1);
// Load textures from JPEGs. // Load textures from JPEGs.
@ -294,26 +306,22 @@ public class Game : GameWindow {
base.OnUnload(); base.OnUnload();
} }
private static Box2i makeBox(int left, int top, int width, int height) {
return new Box2i(left, top, left + width, top + height);
}
protected override void OnRenderFrame(FrameEventArgs e) { protected override void OnRenderFrame(FrameEventArgs e) {
base.OnRenderFrame(e); base.OnRenderFrame(e);
GL.Clear(ClearBufferMask.ColorBufferBit); GL.Clear(ClearBufferMask.ColorBufferBit);
GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferObject); GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferObject);
GL.ActiveTexture(TextureUnit.Texture0); GL.ActiveTexture(TextureUnit.Texture0);
int maxPhotoWidth = geometry.WindowSize.X - thumbnailWidth; int maxPhotoWidth = geometry.WindowSize.X - geometry.ThumbnailBoxes[0].Size.X; // FIXME
Texture active = textures[textureIndex]; Texture active = textures[textureIndex];
// TODO: handle the case where we need to letterbox vertically instead. // TODO: handle the case where we need to letterbox vertically instead.
int photoWidth = (int) (1.0 * geometry.WindowSize.Y / active.Height * active.Width); int photoWidth = (int) (1.0 * geometry.WindowSize.Y / active.Height * active.Width);
int letterboxWidth = (maxPhotoWidth - photoWidth) / 2; int letterboxWidth = (maxPhotoWidth - photoWidth) / 2;
DrawTexture(active, makeBox(letterboxWidth, 0, photoWidth, geometry.WindowSize.Y)); DrawTexture(active, Util.makeBox(letterboxWidth, 0, photoWidth, geometry.WindowSize.Y));
for (int i = 0; i < textures.Count; i++) { for (int i = 0; i < textures.Count; i++) {
Box2i box = makeBox(geometry.WindowSize.X - thumbnailWidth, i * thumbnailHeight, thumbnailWidth, thumbnailHeight); Box2i box = geometry.ThumbnailBoxes[i];
DrawTexture(textures[i], box); DrawTexture(textures[i], box);
if (i == textureIndex) { if (i == textureIndex) {
DrawBox(box, 5, Color4.Black); DrawBox(box, 5, Color4.Black);
@ -337,10 +345,10 @@ public class Game : GameWindow {
} }
void DrawBox(Box2i box, int thickness, Color4 color) { void DrawBox(Box2i box, int thickness, Color4 color) {
DrawTexture(TEXTURE_WHITE, makeBox(box.Min.X, box.Min.Y, box.Size.X, thickness), color); DrawTexture(TEXTURE_WHITE, Util.makeBox(box.Min.X, box.Min.Y, box.Size.X, thickness), color);
DrawTexture(TEXTURE_WHITE, makeBox(box.Min.X, box.Min.Y, thickness, box.Size.Y), color); DrawTexture(TEXTURE_WHITE, Util.makeBox(box.Min.X, box.Min.Y, thickness, box.Size.Y), color);
DrawTexture(TEXTURE_WHITE, makeBox(box.Min.X, box.Max.Y - thickness, box.Size.X, thickness), color); DrawTexture(TEXTURE_WHITE, Util.makeBox(box.Min.X, box.Max.Y - thickness, box.Size.X, thickness), color);
DrawTexture(TEXTURE_WHITE, makeBox(box.Max.X - thickness, box.Min.Y, thickness, box.Size.Y), color); DrawTexture(TEXTURE_WHITE, Util.makeBox(box.Max.X - thickness, box.Min.Y, thickness, box.Size.Y), color);
} }
protected override void OnResize(ResizeEventArgs e) { protected override void OnResize(ResizeEventArgs e) {
@ -399,10 +407,10 @@ static class Program {
} }
} }
Console.WriteLine($"best monitor: {bestMonitor.HorizontalResolution}x{bestMonitor.VerticalResolution}"); Console.WriteLine($"best monitor: {bestMonitor.HorizontalResolution}x{bestMonitor.VerticalResolution}");
GameWindowSettings gwSettings = new GameWindowSettings(); GameWindowSettings gwSettings = new();
gwSettings.RenderFrequency = 60.0; gwSettings.RenderFrequency = 60.0;
NativeWindowSettings nwSettings = new NativeWindowSettings(); NativeWindowSettings nwSettings = new();
nwSettings.WindowState = WindowState.Normal; nwSettings.WindowState = WindowState.Normal;
nwSettings.CurrentMonitor = bestMonitor.Handle; nwSettings.CurrentMonitor = bestMonitor.Handle;
nwSettings.Location = new Vector2i(bestMonitor.WorkArea.Min.X + 1, bestMonitor.WorkArea.Min.Y + 31); nwSettings.Location = new Vector2i(bestMonitor.WorkArea.Min.X + 1, bestMonitor.WorkArea.Min.Y + 31);