move Texture into its own file
This commit is contained in:
parent
d63bdb3265
commit
3d507f3794
1
Photo.cs
1
Photo.cs
@ -8,7 +8,6 @@ using System.Xml.Linq;
|
|||||||
|
|
||||||
namespace SemiColinGames;
|
namespace SemiColinGames;
|
||||||
|
|
||||||
|
|
||||||
public class Photo {
|
public class Photo {
|
||||||
public string Filename;
|
public string Filename;
|
||||||
public bool Loaded = false;
|
public bool Loaded = false;
|
||||||
|
59
Program.cs
59
Program.cs
@ -11,11 +11,9 @@ using SixLabors.ImageSharp.Drawing;
|
|||||||
using SixLabors.ImageSharp.Formats.Jpeg;
|
using SixLabors.ImageSharp.Formats.Jpeg;
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
|
|
||||||
namespace SemiColinGames;
|
namespace SemiColinGames;
|
||||||
|
|
||||||
|
|
||||||
public class FpsCounter {
|
public class FpsCounter {
|
||||||
private readonly int[] frameTimes = new int[30];
|
private readonly int[] frameTimes = new int[30];
|
||||||
private double fps = 0;
|
private double fps = 0;
|
||||||
@ -209,57 +207,6 @@ public class CropTool : ITool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public class Texture : IDisposable {
|
|
||||||
public int Handle;
|
|
||||||
public Vector2i Size;
|
|
||||||
|
|
||||||
private static int maxHandle = -1;
|
|
||||||
private bool disposedValue = false;
|
|
||||||
|
|
||||||
public Texture(Image<Rgba32> image) {
|
|
||||||
Size = new Vector2i(image.Width, image.Height);
|
|
||||||
byte[] pixelBytes = new byte[Size.X * Size.Y * Unsafe.SizeOf<Rgba32>()];
|
|
||||||
image.CopyPixelDataTo(pixelBytes);
|
|
||||||
|
|
||||||
Handle = GL.GenTexture();
|
|
||||||
if (Handle > maxHandle) {
|
|
||||||
// Console.WriteLine("GL.GenTexture #" + Handle);
|
|
||||||
maxHandle = Handle;
|
|
||||||
}
|
|
||||||
GL.ActiveTexture(TextureUnit.Texture0);
|
|
||||||
GL.BindTexture(TextureTarget.Texture2D, Handle);
|
|
||||||
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, Size.X, Size.Y, 0, PixelFormat.Rgba, PixelType.UnsignedByte, pixelBytes);
|
|
||||||
//GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) TextureMinFilter.LinearMipmapLinear);
|
|
||||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) TextureMinFilter.Linear);
|
|
||||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int) TextureMagFilter.Nearest);
|
|
||||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int) TextureWrapMode.ClampToBorder);
|
|
||||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int) TextureWrapMode.ClampToBorder);
|
|
||||||
float[] borderColor = { 0.0f, 0.0f, 0.0f, 1.0f };
|
|
||||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor, borderColor);
|
|
||||||
// FIXME: should we use mipmaps?
|
|
||||||
//GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void Dispose(bool disposing) {
|
|
||||||
if (!disposedValue) {
|
|
||||||
GL.DeleteTexture(Handle);
|
|
||||||
disposedValue = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
~Texture() {
|
|
||||||
if (!disposedValue) {
|
|
||||||
Console.WriteLine("~Texture(): resource leak? Dispose() should be called manually.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose() {
|
|
||||||
Dispose(true);
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public class UiGeometry {
|
public class UiGeometry {
|
||||||
public static Vector2i MIN_WINDOW_SIZE = new(1024, 768);
|
public static Vector2i MIN_WINDOW_SIZE = new(1024, 768);
|
||||||
|
|
||||||
@ -805,7 +752,8 @@ public class Game : GameWindow {
|
|||||||
|
|
||||||
Vector2i renderSize = (Vector2i) (((Vector2) active.Size) * scale);
|
Vector2i renderSize = (Vector2i) (((Vector2) active.Size) * scale);
|
||||||
Vector2i center = (Vector2i) geometry.PhotoBox.Center;
|
Vector2i center = (Vector2i) geometry.PhotoBox.Center;
|
||||||
Box2i photoBox = Util.MakeBox(center.X - renderSize.X / 2, center.Y - renderSize.Y / 2, renderSize.X, renderSize.Y);
|
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);
|
activeOffset = new(photoBox.Min.X, photoBox.Min.Y);
|
||||||
transform = new Transform(activeScale, activeOffset, activePhoto.Size);
|
transform = new Transform(activeScale, activeOffset, activePhoto.Size);
|
||||||
DrawTexture(active, photoBox);
|
DrawTexture(active, photoBox);
|
||||||
@ -817,7 +765,8 @@ public class Game : GameWindow {
|
|||||||
DrawCropRectangle(cropActive);
|
DrawCropRectangle(cropActive);
|
||||||
|
|
||||||
// Draw thumbnail boxes.
|
// Draw thumbnail boxes.
|
||||||
ribbonIndex = Math.Clamp(photoIndex - (geometry.ThumbnailBoxes.Count - 1) / 2, 0, Math.Max(0, photos.Count - geometry.ThumbnailBoxes.Count));
|
ribbonIndex = Math.Clamp(photoIndex - (geometry.ThumbnailBoxes.Count - 1) / 2,
|
||||||
|
0, Math.Max(0, photos.Count - geometry.ThumbnailBoxes.Count));
|
||||||
DrawFilledBox(geometry.ThumbnailBox, Color4.Black);
|
DrawFilledBox(geometry.ThumbnailBox, Color4.Black);
|
||||||
for (int i = 0; i < geometry.ThumbnailBoxes.Count; i++) {
|
for (int i = 0; i < geometry.ThumbnailBoxes.Count; i++) {
|
||||||
if (ribbonIndex + i >= photos.Count) {
|
if (ribbonIndex + i >= photos.Count) {
|
||||||
|
55
Texture.cs
Normal file
55
Texture.cs
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
using OpenTK.Graphics.OpenGL4;
|
||||||
|
using OpenTK.Mathematics;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
namespace SemiColinGames;
|
||||||
|
|
||||||
|
public class Texture : IDisposable {
|
||||||
|
public int Handle;
|
||||||
|
public Vector2i Size;
|
||||||
|
|
||||||
|
private static int maxHandle = -1;
|
||||||
|
private bool disposedValue = false;
|
||||||
|
|
||||||
|
public Texture(Image<Rgba32> image) {
|
||||||
|
Size = new Vector2i(image.Width, image.Height);
|
||||||
|
byte[] pixelBytes = new byte[Size.X * Size.Y * Unsafe.SizeOf<Rgba32>()];
|
||||||
|
image.CopyPixelDataTo(pixelBytes);
|
||||||
|
|
||||||
|
Handle = GL.GenTexture();
|
||||||
|
if (Handle > maxHandle) {
|
||||||
|
// Console.WriteLine("GL.GenTexture #" + Handle);
|
||||||
|
maxHandle = Handle;
|
||||||
|
}
|
||||||
|
GL.ActiveTexture(TextureUnit.Texture0);
|
||||||
|
GL.BindTexture(TextureTarget.Texture2D, Handle);
|
||||||
|
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, Size.X, Size.Y, 0, PixelFormat.Rgba, PixelType.UnsignedByte, pixelBytes);
|
||||||
|
//GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) TextureMinFilter.LinearMipmapLinear);
|
||||||
|
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) TextureMinFilter.Linear);
|
||||||
|
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int) TextureMagFilter.Nearest);
|
||||||
|
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int) TextureWrapMode.ClampToBorder);
|
||||||
|
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int) TextureWrapMode.ClampToBorder);
|
||||||
|
float[] borderColor = { 0.0f, 0.0f, 0.0f, 1.0f };
|
||||||
|
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor, borderColor);
|
||||||
|
// FIXME: should we use mipmaps?
|
||||||
|
//GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void Dispose(bool disposing) {
|
||||||
|
if (!disposedValue) {
|
||||||
|
GL.DeleteTexture(Handle);
|
||||||
|
disposedValue = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~Texture() {
|
||||||
|
if (!disposedValue) {
|
||||||
|
Console.WriteLine("~Texture(): resource leak? Dispose() should be called manually.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose() {
|
||||||
|
Dispose(true);
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user