What am I doing

This commit is contained in:
JacobTech 2023-01-29 21:06:11 -05:00
parent 6e7467b56e
commit b88cea7363
17 changed files with 434 additions and 129 deletions

View File

@ -19,6 +19,7 @@ public class ContextMenu : Window
StartFocused = false, StartFocused = false,
Size = new OpenTK.Mathematics.Vector2i(400, 5), Size = new OpenTK.Mathematics.Vector2i(400, 5),
StartVisible = false, StartVisible = false,
SharedContext = null
}; };
private FlowLayout fl; private FlowLayout fl;

View File

@ -1,3 +1,9 @@
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Drawing;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
namespace GraphicsManager.Globals; namespace GraphicsManager.Globals;
public static class EXT public static class EXT
@ -15,6 +21,63 @@ public static class EXT
return dest; return dest;
} }
public static IImageProcessingContext ConvertToAvatar(this IImageProcessingContext context, int size, float cornerRadius)
{
return context.Resize(new ResizeOptions
{
Size = new Size(size),
Mode = ResizeMode.Crop
}).ApplyRoundedCorners(cornerRadius);
}
// This method can be seen as an inline implementation of an `IImageProcessor`:
// (The combination of `IImageOperations.Apply()` + this could be replaced with an `IImageProcessor`)
public static IImageProcessingContext ApplyRoundedCorners(this IImageProcessingContext context, float cornerRadius)
{
Size size = context.GetCurrentSize();
IPathCollection corners = BuildCorners(size.Width, size.Height, cornerRadius);
context.SetGraphicsOptions(new GraphicsOptions()
{
Antialias = true,
// Enforces that any part of this shape that has color is punched out of the background
AlphaCompositionMode = PixelAlphaCompositionMode.DestOut
});
// Mutating in here as we already have a cloned original
// use any color (not Transparent), so the corners will be clipped
foreach (IPath path in corners)
{
context = context.Fill(Color.Red, path);
}
return context;
}
public static IPathCollection BuildCorners(int imageWidth, int imageHeight, float cornerRadius)
{
// First create a square
var rect = new RectangularPolygon(-0.5f, -0.5f, cornerRadius, cornerRadius);
// Then cut out of the square a circle so we are left with a corner
IPath cornerTopLeft = rect.Clip(new EllipsePolygon(cornerRadius - 0.5f, cornerRadius - 0.5f, cornerRadius));
// Corner is now a corner shape positions top left
// let's make 3 more positioned correctly, we can do that by translating the original around the center of the image.
float rightPos = imageWidth - cornerTopLeft.Bounds.Width + 1;
float bottomPos = imageHeight - cornerTopLeft.Bounds.Height + 1;
// Move it across the width of the image - the width of the shape
IPath cornerTopRight = cornerTopLeft.RotateDegree(90).Translate(rightPos, 0);
IPath cornerBottomLeft = cornerTopLeft.RotateDegree(-90).Translate(0, bottomPos);
IPath cornerBottomRight = cornerTopLeft.RotateDegree(180).Translate(rightPos, bottomPos);
return new PathCollection(cornerTopLeft, cornerBottomLeft, cornerTopRight, cornerBottomRight);
}
public static T[] Add<T>(this T[] source, T Object) public static T[] Add<T>(this T[] source, T Object)
{ {
T[] dest = new T[source.Length + 1]; T[] dest = new T[source.Length + 1];

View File

@ -10,7 +10,15 @@
<IncludeSymbols>False</IncludeSymbols> <IncludeSymbols>False</IncludeSymbols>
<RepositoryUrl>https://git.jacobtech.com/JacobTech.com/GraphicsManager</RepositoryUrl> <RepositoryUrl>https://git.jacobtech.com/JacobTech.com/GraphicsManager</RepositoryUrl>
<RepositoryType>git</RepositoryType> <RepositoryType>git</RepositoryType>
<Version>1.0.4-alpha09</Version> <Version>1.0.5-alpha08</Version>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -26,7 +34,8 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="OpenTK" Version="4.7.1" /> <PackageReference Include="OpenTK" Version="4.7.1" />
<PackageReference Include="SixLabors.ImageSharp" Version="1.0.4" /> <PackageReference Include="SixLabors.ImageSharp" Version="2.1.3" />
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="1.0.0-beta15" />
<PackageReference Include="SpaceWizards.SharpFont" Version="1.0.1" /> <PackageReference Include="SpaceWizards.SharpFont" Version="1.0.1" />
</ItemGroup> </ItemGroup>

View File

@ -8,6 +8,7 @@ public interface IParent
public Vector2 LocationAsFloat { get; } public Vector2 LocationAsFloat { get; }
public IParent? Parent { get; } public IParent? Parent { get; }
public Vector2i Size { get; } public Vector2i Size { get; }
public Vector2i GetParentRelLocPoint();
public void ParentResize(ResizeEventArgs e); public void ParentResize(ResizeEventArgs e);
public float[] RctToFloat(int x, int y, int Width, int Height, bool hastexture = false, float z = 0.0f); public float[] RctToFloat(int x, int y, int Width, int Height, bool hastexture = false, float z = 0.0f);
public Vector3 PointToVector(float x, float y, float z = 0.0f); public Vector3 PointToVector(float x, float y, float z = 0.0f);

View File

@ -9,7 +9,7 @@ public interface IRenderObject
public ObjectAnchor Anchor { get; set; } public ObjectAnchor Anchor { get; set; }
public bool Loaded { get; } public bool Loaded { get; }
public void LoadToParent(IParent Parent, Window Window); public void LoadToParent(IParent Parent, Window Window);
public void Draw(); public void Draw(int x, int y, int w, int h);
public void Clean(); public void Clean();
public void Focus(); public void Focus();
public void UnFocus(); public void UnFocus();
@ -17,6 +17,7 @@ public interface IRenderObject
public Vector2i Location { get; set; } public Vector2i Location { get; set; }
public Vector2 SizeAsFloat { get; } public Vector2 SizeAsFloat { get; }
public Vector2 LocationAsFloat { get; } public Vector2 LocationAsFloat { get; }
public Vector2i ScissorLocation { get; }
public Vector2i Distance { get; } public Vector2i Distance { get; }
public IParent? Parent { get; } public IParent? Parent { get; }
public Window? Window { get; } public Window? Window { get; }

View File

@ -1,4 +1,5 @@
using GraphicsManager.Structs; using GraphicsManager.Globals;
using GraphicsManager.Structs;
using OpenTK.Graphics.ES30; using OpenTK.Graphics.ES30;
using OpenTK.Mathematics; using OpenTK.Mathematics;
using OpenTK.Windowing.Desktop; using OpenTK.Windowing.Desktop;
@ -27,31 +28,39 @@ public class Texture
public static readonly Dictionary<IGLFWGraphicsContext, Shader> TextureShader = new (); public static readonly Dictionary<IGLFWGraphicsContext, Shader> TextureShader = new ();
public int handel; public int handel;
internal Texture(byte[] File) public int Location { get; set; } = 1;
internal Texture(byte[] File, bool Rounded = false)
{ {
Image<Rgba32> image = Image.Load<Rgba32>(File); Image<Rgba32> image = Image.Load<Rgba32>(File);
image.Mutate(x => x.Flip(FlipMode.Vertical)); if (Rounded)
var pixels = new List<byte>(4 * image.Width * image.Height);
for (int y = 0; y < image.Height; y++)
{ {
var row = image.GetPixelRowSpan(y); image.Mutate(x =>
for (int x = 0; x < image.Width; x++)
{ {
pixels.Add(row[x].R); x.Flip(FlipMode.Vertical);
pixels.Add(row[x].G); if (image.Width <= image.Height) x.ConvertToAvatar(image.Width, image.Width/2);
pixels.Add(row[x].B); else x.ConvertToAvatar(image.Height, image.Height/2);
pixels.Add(row[x].A); });
}
} }
else
{
image.Mutate(x =>
{
x.Flip(FlipMode.Vertical);
});
}
Span<byte> pixels = new byte[4 * image.Width * image.Height].AsSpan();
image.CopyPixelDataTo(pixels);
handel = GL.GenTexture(); handel = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, handel); GL.BindTexture(TextureTarget.Texture2D, handel);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, image.Width, image.Height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, pixels.ToArray()); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, image.Width, image.Height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, pixels.ToArray());
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
} }
private Texture() private Texture()
@ -224,7 +233,10 @@ public class Texture
GL.TexImage2D(TextureTarget.Texture2D, 0, GL.TexImage2D(TextureTarget.Texture2D, 0,
PixelInternalFormat.R8, bitmap.Width, bitmap.Rows, 0, PixelInternalFormat.R8, bitmap.Width, bitmap.Rows, 0,
PixelFormat.Red, PixelType.UnsignedByte, bitmap.Buffer); PixelFormat.Red, PixelType.UnsignedByte, bitmap.Buffer);
GL.TextureParameter(t.handel, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TextureParameter(t.handel, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
GL.TextureParameter(t.handel, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge);
GL.TextureParameter(t.handel, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge);
Character cha = new() Character cha = new()
{ {
@ -284,6 +296,10 @@ public class Texture
GL.TexImage2D(TextureTarget.Texture2D, 0, GL.TexImage2D(TextureTarget.Texture2D, 0,
PixelInternalFormat.R8, bitmap2.Width, bitmap2.Rows, 0, PixelInternalFormat.R8, bitmap2.Width, bitmap2.Rows, 0,
PixelFormat.Red, PixelType.UnsignedByte, bitmap2.Buffer); PixelFormat.Red, PixelType.UnsignedByte, bitmap2.Buffer);
GL.TextureParameter(t.handel, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TextureParameter(t.handel, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
GL.TextureParameter(t.handel, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge);
GL.TextureParameter(t.handel, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge);
Character cha2 = new() Character cha2 = new()
{ {
Size = new Vector2(bitmap2.Width, bitmap2.Rows), Size = new Vector2(bitmap2.Width, bitmap2.Rows),
@ -321,7 +337,10 @@ public class Texture
GL.TexImage2D(TextureTarget.Texture2D, 0, GL.TexImage2D(TextureTarget.Texture2D, 0,
PixelInternalFormat.R8, bitmap.Width, bitmap.Rows, 0, PixelInternalFormat.R8, bitmap.Width, bitmap.Rows, 0,
PixelFormat.Red, PixelType.UnsignedByte, bitmap.Buffer); PixelFormat.Red, PixelType.UnsignedByte, bitmap.Buffer);
GL.TextureParameter(t.handel, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TextureParameter(t.handel, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
GL.TextureParameter(t.handel, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge);
GL.TextureParameter(t.handel, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge);
Character cha = new() Character cha = new()
{ {
@ -344,23 +363,6 @@ public class Texture
} }
} }
public void LoadText()
{
GL.TextureParameter(handel, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TextureParameter(handel, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
GL.TextureParameter(handel, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge);
GL.TextureParameter(handel, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge);
}
public void Load(int loc)
{
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
GL.EnableVertexAttribArray(loc);
GL.VertexAttribPointer(loc, 2, VertexAttribPointerType.Float, false, 5 * sizeof(float), 3 * sizeof(float));
}
public void Use(TextureUnit unit = TextureUnit.Texture0) public void Use(TextureUnit unit = TextureUnit.Texture0)
{ {
GL.ActiveTexture(unit); GL.ActiveTexture(unit);

View File

@ -41,12 +41,14 @@ public class TextureManager
} }
} }
public Texture AddTexture(byte[] Texture) public Texture AddTexture(byte[] Texture, bool Rounded = false)
{ {
byte[] hash = SHA256.HashData(Texture); List<byte> hash2 = SHA256.HashData(Texture).ToList();
hash2.Insert(0, Convert.ToByte(Rounded));
byte[] hash = hash2.ToArray();
if (TextureHashMap.ContainsKey(hash)) return TextureHashMap[hash]; if (TextureHashMap.ContainsKey(hash)) return TextureHashMap[hash];
Context.MakeCurrent(); Context.MakeCurrent();
TextureHashMap.Add(hash, new(Texture)); TextureHashMap.Add(hash, new(Texture, Rounded));
return TextureHashMap[hash]; return TextureHashMap[hash];
} }
} }

View File

@ -217,6 +217,7 @@ public class FlowLayout : IRenderObject, IParent
BlockDraw = false; BlockDraw = false;
} }
} }
public Vector2i ScissorLocation { get => _bounds.ScissorLocation; }
public Vector2i Position => Location; public Vector2i Position => Location;
public Vector2 LocationAsFloat { get => _bounds.LocationAsFloat; } public Vector2 LocationAsFloat { get => _bounds.LocationAsFloat; }
@ -399,11 +400,11 @@ public class FlowLayout : IRenderObject, IParent
} }
} }
public void Draw() public void Draw(int x, int y, int w, int h)
{ {
if (Loaded) if (Loaded)
{ {
_bounds.Draw(); _bounds.Draw(x,y,w,h);
IEnumerable<IRenderObject> needload = Controls.Where(a => a.Loaded == false); IEnumerable<IRenderObject> needload = Controls.Where(a => a.Loaded == false);
if (needload.Any()) if (needload.Any())
@ -418,10 +419,24 @@ public class FlowLayout : IRenderObject, IParent
} }
for (int i = 0; i < Controls.Length; i++) for (int i = 0; i < Controls.Length; i++)
{ {
Controls[i].Draw(); Vector2i laff = new(Controls[i].ScissorLocation.X, Controls[i].ScissorLocation.Y);
Vector2i saff = new Vector2i(Controls[i].Size.X, Controls[i].Size.Y);
if (laff.X < ScissorLocation.X) laff = new(ScissorLocation.X, laff.Y);
if (laff.X < x) laff = new(x, laff.Y);
if (laff.Y < ScissorLocation.Y) laff = new(laff.X, ScissorLocation.Y);
if (laff.Y < y) laff = new(laff.X, y);
if (saff.X + laff.X > Size.X + ScissorLocation.X) saff = new(Size.X, saff.Y);
if (saff.Y + laff.Y > Size.Y + ScissorLocation.Y) saff = new(saff.X, Size.Y);
GL.Scissor(laff.X, laff.Y, saff.X, saff.Y);
Controls[i].Draw(ScissorLocation.X, ScissorLocation.Y, Size.X, Size.Y);
} }
} }
} }
public Vector2i GetParentRelLocPoint()
{
return Parent!.GetParentRelLocPoint() + new Vector2i(Location.X, Parent.Size.Y - (Location.Y + Size.Y));
}
public void Clean() public void Clean()
{ {

View File

@ -120,8 +120,23 @@ public class Label : IRenderObject
Size = new((int)addx, (int)addy); Size = new((int)addx, (int)addy);
if (Loaded) if (Loaded)
{ {
GL.PixelStore(PixelStoreParameter.UnpackAlignment, 1);
if (Window is not null && Window.CanControleUpdate) Parent!.TryDraw(); if (Window is not null && Window.CanControleUpdate)
{
if (!Window.Context.IsCurrent)
{
try
{
Window.Context.MakeCurrent();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
GL.PixelStore(PixelStoreParameter.UnpackAlignment, 1);
Parent!.TryDraw();
}
} }
} }
} }
@ -141,29 +156,56 @@ public class Label : IRenderObject
{ {
loc_ = value; loc_ = value;
if (Window is null || Parent is null) return; if (Window is null || Parent is null) return;
if (Window.CanControleUpdate && Loaded) Parent!.TryDraw(); if (Window.CanControleUpdate && Loaded)
{
ScissorLocation = Parent.GetParentRelLocPoint() + new Vector2i(Location.X, Parent.Size.Y - (loc_.Y + Size.Y));
Parent!.TryDraw();
if (!Window.Context.IsCurrent) Window.Context.MakeCurrent();
}
}
}
private Vector2i _size;
public Vector2i Size { get => _size;
set
{
_size = value;
if (Loaded && Parent is not null) ScissorLocation = Parent.GetParentRelLocPoint() + new Vector2i(Location.X, Parent.Size.Y - (loc_.Y + Size.Y));
} }
} }
public Vector2i Size { get; set; }
public void Clean() public void Clean()
{ {
GL.DeleteBuffer(VBO); Tuple<int, int, int> tup = GlobalBuffers[Window!.Context];
if (tup.Item3 - 1 == 0)
{
//Broken, I may fix latter
//if (!Window.Context.IsCurrent) Window.Context.MakeCurrent();
//GL.DeleteBuffer(VBO);
//GL.DeleteVertexArray(VAO);
//GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
//GlobalBuffers.Remove(Window!.Context);
}
else
{
GlobalBuffers[Window!.Context] = new(tup.Item1, tup.Item2, tup.Item3 - 1);
}
Size = new(0, 0); Size = new(0, 0);
GL.DeleteVertexArray(VAO);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
Loaded = false; Loaded = false;
Visible = false; Visible = false;
} }
public Vector2i ScissorLocation { get; private set; }
public void Draw() public void Draw(int x, int y, int ww, int hh)
{ {
if (Visible & Loaded) if (Visible & Loaded)
{ {
if (!Window!.Context.IsCurrent) Window.Context.MakeCurrent();
Shader.Use(); Shader.Use();
GL.Enable(EnableCap.Blend); GL.Enable(EnableCap.Blend);
GL.Uniform4(2, Color); GL.Uniform4(2, Color);
Matrix4 projectionM = Matrix4.CreateOrthographicOffCenter(0, Window!.Size.X, Window!.Size.Y, 0, -1.0f, 1.0f); Matrix4 projectionM = Matrix4.CreateOrthographicOffCenter(0, Window!.Size.X, Window!.Size.Y, 0, -1.0f, 1.0f);
GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);
GL.BlendFunc(0, BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); GL.BlendFunc(0, BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
GL.UniformMatrix4(1, false, ref projectionM); GL.UniformMatrix4(1, false, ref projectionM);
@ -173,8 +215,7 @@ public class Label : IRenderObject
float angle_rad = (float)Math.Atan2(DIR.Y, DIR.X); float angle_rad = (float)Math.Atan2(DIR.Y, DIR.X);
Matrix4 rotateM = Matrix4.CreateRotationZ(angle_rad); Matrix4 rotateM = Matrix4.CreateRotationZ(angle_rad);
Matrix4 transOriginM = Matrix4.CreateTranslation(new Vector3(loc_.X + Window.FloatToInt(Parent!.IntToFloat(0)), loc_.Y + Font.PixelHeight + Window.FloatToInt(Parent!.IntToFloat(0, true), true), 0f)); Matrix4 transOriginM = Matrix4.CreateTranslation(new Vector3(loc_.X + Window.FloatToInt(Parent!.IntToFloat(0)), loc_.Y + Font.PixelHeight + Window.FloatToInt(Parent!.IntToFloat(0, true), true), 0f));
float char_x = 0.0f;
float char_x = 0.0f;
GL.PixelStore(PixelStoreParameter.UnpackAlignment, 1); GL.PixelStore(PixelStoreParameter.UnpackAlignment, 1);
GL.ActiveTexture(TextureUnit.Texture0); GL.ActiveTexture(TextureUnit.Texture0);
@ -191,7 +232,6 @@ public class Label : IRenderObject
if (!_characters[Window!.Context][Font].ContainsKey(c) && !n) if (!_characters[Window!.Context][Font].ContainsKey(c) && !n)
{ {
var f = Texture.TextureForChar(Window!.Context, Font, c); var f = Texture.TextureForChar(Window!.Context, Font, c);
f.LoadText();
} }
int maxx = 0; int maxx = 0;
@ -226,7 +266,7 @@ public class Label : IRenderObject
} }
} }
public Window? Window { get; private set; } public Window? Window { get; private set; }
private static Dictionary<IGLFWGraphicsContext, Tuple<int, int, int>> GlobalBuffers = new();
public void LoadToParent(IParent window, Window win) public void LoadToParent(IParent window, Window win)
{ {
if (Loaded) return; if (Loaded) return;
@ -237,18 +277,40 @@ public class Label : IRenderObject
Window = win; Window = win;
Window.MouseMove += WindowOnMouseMove; Window.MouseMove += WindowOnMouseMove;
Window.MouseDown += WindowOnMouseDown; Window.MouseDown += WindowOnMouseDown;
if (!Window!.Context.IsCurrent) Window.Context.MakeCurrent();
GL.PixelStore(PixelStoreParameter.UnpackAlignment, 1); GL.PixelStore(PixelStoreParameter.UnpackAlignment, 1);
GL.PixelStore(PixelStoreParameter.UnpackAlignment, 4); GL.PixelStore(PixelStoreParameter.UnpackAlignment, 4);
float[] vquad = if (!GlobalBuffers.ContainsKey(win.Context))
{ {
0.0f, -1.0f, 0.0f, 0.0f, float[] vquad =
0.0f, 0.0f, 0.0f, 1.0f, {
1.0f, 0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f,
0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
1.0f, -1.0f, 1.0f, 0.0f 0.0f, -1.0f, 0.0f, 0.0f,
}; 1.0f, 0.0f, 1.0f, 1.0f,
1.0f, -1.0f, 1.0f, 0.0f
};
int _VBO = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, _VBO);
GL.BufferData(BufferTarget.ArrayBuffer, 4 * 6 * 4, vquad, BufferUsageHint.StaticDraw);
int _VAO = GL.GenVertexArray();
GL.BindVertexArray(_VAO);
GL.EnableVertexAttribArray(0);
GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, 4 * 4, 0);
GL.EnableVertexAttribArray(1);
GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, 4 * 4, 2 * 4);
GlobalBuffers.Add(win.Context, new(_VBO, _VAO, 0));
}
Tuple<int, int, int> tup = GlobalBuffers[win.Context];
VBO = tup.Item1;
VAO = tup.Item2;
GlobalBuffers[win.Context] = new(VBO, VAO, tup.Item3 + 1);
/*
VBO = GL.GenBuffer(); VBO = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, VBO); GL.BindBuffer(BufferTarget.ArrayBuffer, VBO);
GL.BufferData(BufferTarget.ArrayBuffer, 4 * 6 * 4, vquad, BufferUsageHint.StaticDraw); GL.BufferData(BufferTarget.ArrayBuffer, 4 * 6 * 4, vquad, BufferUsageHint.StaticDraw);
@ -259,7 +321,7 @@ public class Label : IRenderObject
GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, 4 * 4, 0); GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, 4 * 4, 0);
GL.EnableVertexAttribArray(1); GL.EnableVertexAttribArray(1);
GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, 4 * 4, 2 * 4); GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, 4 * 4, 2 * 4);
*/
GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindVertexArray(0); GL.BindVertexArray(0);

View File

@ -15,7 +15,7 @@ public class Rectangle : ITextureObject
public ObjectAnchor Anchor { get; set; } = ObjectAnchor.Left | ObjectAnchor.Top; public ObjectAnchor Anchor { get; set; } = ObjectAnchor.Left | ObjectAnchor.Top;
public Texture? Texture { get; private set; } public Texture? Texture { get; set; }
public ContextMenu? ContextMenu { get; set; } = null; public ContextMenu? ContextMenu { get; set; } = null;
public event Func<string[], Task>? FilesDroped; public event Func<string[], Task>? FilesDroped;
@ -67,13 +67,15 @@ public class Rectangle : ITextureObject
} }
} }
public void Draw() public void Draw(int x, int y, int w, int h)
{ {
if (Visible && Loaded) if (Visible && Loaded)
{ {
if (!Window!.Context.IsCurrent) Window.Context.MakeCurrent();
if (Texture is not null) Texture.Use(); if (Texture is not null) Texture.Use();
Shader.Use(); Shader.Use();
GL.Uniform4(0, BackgroundColor); if (Texture is null) GL.Uniform4(0, BackgroundColor);
if (Texture is not null) if (Texture is not null)
{ {
GL.Enable(EnableCap.Blend); GL.Enable(EnableCap.Blend);
@ -115,7 +117,6 @@ public class Rectangle : ITextureObject
if (Texture is not null) if (Texture is not null)
{ {
Shader = Texture.TextureShader[Window.Context]; Shader = Texture.TextureShader[Window.Context];
Texture.Load(Shader.GetAttribLocation("aTexCoord"));
} }
GL.EnableVertexAttribArray(0); GL.EnableVertexAttribArray(0);
GL.BindBuffer(BufferTarget.ArrayBuffer, BufferObject); GL.BindBuffer(BufferTarget.ArrayBuffer, BufferObject);
@ -197,14 +198,19 @@ public class Rectangle : ITextureObject
if (Loaded) if (Loaded)
{ {
//Distance = new(Parent!.Size.X - Size.X - Location.X, Parent.Size.Y - Size.Y - Location.Y); //Distance = new(Parent!.Size.X - Size.X - Location.X, Parent.Size.Y - Size.Y - Location.Y);
int add = 3;
if (Texture is not null) add = 5;
GL.BindBuffer(BufferTarget.ArrayBuffer, BufferObject); GL.BindBuffer(BufferTarget.ArrayBuffer, BufferObject);
GL.BindVertexArray(ArrayObject); GL.BindVertexArray(ArrayObject);
int add = 3;
if (Texture is not null)
{
add = 5;
GL.VertexAttribPointer(Texture.Location, 2, VertexAttribPointerType.Float, false, 5 * sizeof(float), 3 * sizeof(float));
GL.EnableVertexAttribArray(Texture.Location);
}
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, add * sizeof(float), 0); GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, add * sizeof(float), 0);
GL.EnableVertexAttribArray(0); GL.EnableVertexAttribArray(0);
GL.BindBuffer(BufferTarget.ArrayBuffer, BufferObject); GL.BindBuffer(BufferTarget.ArrayBuffer, BufferObject);
GL.BufferData(BufferTarget.ArrayBuffer, Points_.Length * sizeof(float), Points_, Hint); GL.BufferData(BufferTarget.ArrayBuffer, value.Length * sizeof(float), value, Hint);
GL.BindVertexArray(ArrayObject); GL.BindVertexArray(ArrayObject);
GL.BindBuffer(BufferTarget.ElementArrayBuffer, ElementBufferObject); GL.BindBuffer(BufferTarget.ElementArrayBuffer, ElementBufferObject);
GL.BufferData(BufferTarget.ElementArrayBuffer, Indexs.Length * sizeof(uint), Indexs, Hint); GL.BufferData(BufferTarget.ElementArrayBuffer, Indexs.Length * sizeof(uint), Indexs, Hint);
@ -248,6 +254,7 @@ public class Rectangle : ITextureObject
temp[(Texture is null ? 3 : 5)] = saf.X; temp[(Texture is null ? 3 : 5)] = saf.X;
temp[(Texture is null ? 4 : 6)] = saf.Y; temp[(Texture is null ? 4 : 6)] = saf.Y;
temp[(Texture is null ? 7 : 11)] = saf.Y; temp[(Texture is null ? 7 : 11)] = saf.Y;
ScissorLocation = Parent.GetParentRelLocPoint() + new Vector2i(Location.X, Parent.Size.Y - (loc_.Y + value.Y));
Points = temp; Points = temp;
} }
} }
@ -273,9 +280,14 @@ public class Rectangle : ITextureObject
temp[(Texture is null ? 3 : 5)] = saf.X; temp[(Texture is null ? 3 : 5)] = saf.X;
temp[(Texture is null ? 4 : 6)] = saf.Y; temp[(Texture is null ? 4 : 6)] = saf.Y;
temp[(Texture is null ? 7 : 11)] = saf.Y; temp[(Texture is null ? 7 : 11)] = saf.Y;
ScissorLocation = Parent.GetParentRelLocPoint() + new Vector2i(value.X, Parent.Size.Y - (value.Y + Size.Y));// new((int)Window.FloatToInt(Parent.IntToFloat(value.X)),
//ScissorLocation = new Vector2i(ScissorLocation.X, Window.Size.Y - ScissorLocation.Y);
//(int)Window.FloatToInt(Parent.IntToFloat(value.Y, true), true)
//);
Points = temp; Points = temp;
} }
} }
public Vector2i ScissorLocation { get; private set; }
private Vector2 laf = new(), saf = new(); private Vector2 laf = new(), saf = new();
public Vector2 LocationAsFloat { get { return laf; } } public Vector2 LocationAsFloat { get { return laf; } }

View File

@ -73,6 +73,8 @@ public class RoundedButton : IRenderObject
_label.Location = new( value.X + Border + (((Size.X - (Border * 2)) / 2) - (_label.Size.X / 2)), value.Y + Border + (((Size.Y - (Border * 2)) / 2) - (_label.Size.Y / 2))); _label.Location = new( value.X + Border + (((Size.X - (Border * 2)) / 2) - (_label.Size.X / 2)), value.Y + Border + (((Size.Y - (Border * 2)) / 2) - (_label.Size.Y / 2)));
} }
} }
public Vector2i ScissorLocation { get => _bounds.ScissorLocation; }
public Vector2 SizeAsFloat { get => _bounds.SizeAsFloat; } public Vector2 SizeAsFloat { get => _bounds.SizeAsFloat; }
public Vector2 LocationAsFloat { get => _bounds.LocationAsFloat; } public Vector2 LocationAsFloat { get => _bounds.LocationAsFloat; }
public Vector2i Distance { get => _bounds.Distance; internal set => _bounds.Distance = value;} public Vector2i Distance { get => _bounds.Distance; internal set => _bounds.Distance = value;}
@ -108,12 +110,12 @@ public class RoundedButton : IRenderObject
_label.Clean(); _label.Clean();
} }
public void Draw() public void Draw(int x, int y, int w, int h)
{ {
if (!Visible || !Loaded) return; if (!Visible || !Loaded) return;
_bounds.Draw(); _bounds.Draw(x,y,w,h);
_inside.Draw(); _inside.Draw(x,y,w,h);
_label.Draw(); _label.Draw(x,y,w,h);
} }
public void LoadToParent(IParent Parent, Window Window) public void LoadToParent(IParent Parent, Window Window)

View File

@ -4,7 +4,6 @@ using GraphicsManager.Objects.Core;
using OpenTK.Graphics.OpenGL4; using OpenTK.Graphics.OpenGL4;
using OpenTK.Mathematics; using OpenTK.Mathematics;
using OpenTK.Windowing.GraphicsLibraryFramework; using OpenTK.Windowing.GraphicsLibraryFramework;
using System.Runtime.Intrinsics.X86;
using OpenTK.Windowing.Common; using OpenTK.Windowing.Common;
namespace GraphicsManager.Objects; namespace GraphicsManager.Objects;
@ -18,7 +17,7 @@ public class RoundedRectangle : IRenderObject
public RoundedRectangle() public RoundedRectangle()
{ {
Points_ = new float[36 + (((sn - 1) * 4) * 3)]; //Points_ = new float[36 + (((sn - 1) * 4) * 3)];
} }
public event Func<IRenderObject, Task>? WindowLoaded; public event Func<IRenderObject, Task>? WindowLoaded;
public event Func<IRenderObject, Task>? MouseEnter; public event Func<IRenderObject, Task>? MouseEnter;
@ -110,7 +109,7 @@ public class RoundedRectangle : IRenderObject
} }
} }
public void Draw() public void Draw(int x, int y, int w, int h)
{ {
if (Visible && Loaded) if (Visible && Loaded)
{ {
@ -141,26 +140,13 @@ public class RoundedRectangle : IRenderObject
this.Parent = Parent; this.Parent = Parent;
this.Window = Window; this.Window = Window;
if (Shader is null) Shader = Rectangle.DefaultShader[Window.Context]; if (Shader is null) Shader = Rectangle.DefaultShader[Window.Context];
int pos = Points.Length - 3;
pos = 4;
BufferObject = GL.GenBuffer(); BufferObject = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, BufferObject);
ArrayObject = GL.GenVertexArray(); ArrayObject = GL.GenVertexArray();
GL.BindVertexArray(ArrayObject);
int add = 3;
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, add * sizeof(float), 0);
GL.EnableVertexAttribArray(0);
GL.BindBuffer(BufferTarget.ArrayBuffer, BufferObject);
GL.BufferData(BufferTarget.ArrayBuffer, Points.Length * sizeof(float), Points, Hint);
GL.BindVertexArray(ArrayObject);
ElementBufferObject = GL.GenBuffer(); ElementBufferObject = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ElementArrayBuffer, ElementBufferObject); Location = Location;
GL.BufferData(BufferTarget.ElementArrayBuffer, Indexs.Length * sizeof(uint), Indexs, Hint);
Loaded = true; Loaded = true;
Window.MouseDown += Window_MouseDown; Window.MouseDown += Window_MouseDown;
Window.MouseMove += WindowOnMouseMove; Window.MouseMove += WindowOnMouseMove;
Location = Location;
Distance = new(Parent.Size.X - Size.X - Location.X, Parent.Size.Y - Size.Y - Location.Y); Distance = new(Parent.Size.X - Size.X - Location.X, Parent.Size.Y - Size.Y - Location.Y);
if (WindowLoaded is not null) WindowLoaded.Invoke(this); if (WindowLoaded is not null) WindowLoaded.Invoke(this);
} }
@ -212,30 +198,22 @@ public class RoundedRectangle : IRenderObject
public int ElementBufferObject { get; private set; } public int ElementBufferObject { get; private set; }
public int BufferObject { get; private set; } public int BufferObject { get; private set; }
public int ArrayObject { get; private set; } public int ArrayObject { get; private set; }
private float[] Points_;
private Vector2i size_ = new(), loc_ = new(); private Vector2i size_ = new(), loc_ = new();
public float[] Points private float[] Points
{ {
get
{
return Points_;
}
set set
{ {
Points_ = value;
try try
{ {
if (Loaded) if (Loaded)
{ {
//Distance = new(Parent!.Size.X - Size.X - Location.X, Parent.Size.Y - Size.Y - Location.Y);
int add = 3;
GL.BindBuffer(BufferTarget.ArrayBuffer, BufferObject); GL.BindBuffer(BufferTarget.ArrayBuffer, BufferObject);
GL.BindVertexArray(ArrayObject); GL.BindVertexArray(ArrayObject);
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, add * sizeof(float), 0); GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0);
GL.EnableVertexAttribArray(0); GL.EnableVertexAttribArray(0);
GL.BindBuffer(BufferTarget.ArrayBuffer, BufferObject); GL.BindBuffer(BufferTarget.ArrayBuffer, BufferObject);
GL.BufferData(BufferTarget.ArrayBuffer, Points_.Length * sizeof(float), Points_, Hint); GL.BufferData(BufferTarget.ArrayBuffer, value.Length * sizeof(float), value, Hint);
GL.BindVertexArray(ArrayObject); GL.BindVertexArray(ArrayObject);
GL.BindBuffer(BufferTarget.ElementArrayBuffer, ElementBufferObject); GL.BindBuffer(BufferTarget.ElementArrayBuffer, ElementBufferObject);
GL.BufferData(BufferTarget.ElementArrayBuffer, Indexs.Length * sizeof(uint), Indexs, Hint); GL.BufferData(BufferTarget.ElementArrayBuffer, Indexs.Length * sizeof(uint), Indexs, Hint);
@ -290,6 +268,7 @@ public class RoundedRectangle : IRenderObject
Parent.ReportSizeUpdate(this); Parent.ReportSizeUpdate(this);
Location = Location; Location = Location;
saf = new Vector2(Parent.IntToFloat(value.X + loc_.X, false), Parent.IntToFloat(value.Y + loc_.Y, true)); saf = new Vector2(Parent.IntToFloat(value.X + loc_.X, false), Parent.IntToFloat(value.Y + loc_.Y, true));
ScissorLocation = Parent.GetParentRelLocPoint() + new Vector2i(Location.X, Parent.Size.Y - (loc_.Y + value.Y));
} }
} }
@ -348,9 +327,17 @@ public class RoundedRectangle : IRenderObject
temp.Add(tri.Z); temp.Add(tri.Z);
} }
} }
//ScissorLocation = new((int)Window.FloatToInt(Parent.IntToFloat(value.X)),
//(int)Window.FloatToInt(Parent.IntToFloat(value.Y, true), true)
//);
//ScissorLocation = Parent.GetParentRelLocPoint() + value;
//ScissorLocation = Parent.GetParentRelLocPoint() + value;// new((int)Window.FloatToInt(Parent.IntToFloat(value.X)),
//ScissorLocation = new Vector2i(ScissorLocation.X, Window.Size.Y - ScissorLocation.Y);
ScissorLocation = Parent.GetParentRelLocPoint() + new Vector2i(value.X, Parent.Size.Y - (value.Y + Size.Y));
Points = temp.ToArray(); Points = temp.ToArray();
} }
} }
public Vector2i ScissorLocation { get; private set; }
private Vector2 laf = new(), saf = new(); private Vector2 laf = new(), saf = new();
public Vector2 LocationAsFloat { get { return laf; } } public Vector2 LocationAsFloat { get { return laf; } }

View File

@ -1,6 +1,7 @@
using GraphicsManager.Enums; using GraphicsManager.Enums;
using GraphicsManager.Interfaces; using GraphicsManager.Interfaces;
using GraphicsManager.Objects.Core; using GraphicsManager.Objects.Core;
using OpenTK.Graphics.OpenGL4;
using OpenTK.Mathematics; using OpenTK.Mathematics;
using OpenTK.Windowing.Common; using OpenTK.Windowing.Common;
using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing;
@ -126,6 +127,7 @@ public class TabControl : IRenderObject, IParent
public ContextMenu? ContextMenu { get => _bounds.ContextMenu; set => _bounds.ContextMenu = value; } public ContextMenu? ContextMenu { get => _bounds.ContextMenu; set => _bounds.ContextMenu = value; }
public Vector2i Distance { get => _bounds.Distance; internal set => _bounds.Distance = value; } public Vector2i Distance { get => _bounds.Distance; internal set => _bounds.Distance = value; }
public Vector2 LocationAsFloat { get => _bounds.LocationAsFloat; } public Vector2 LocationAsFloat { get => _bounds.LocationAsFloat; }
public Vector2i ScissorLocation { get => _bounds.ScissorLocation; }
public Vector2 SizeAsFloat { get => _bounds.SizeAsFloat; } public Vector2 SizeAsFloat { get => _bounds.SizeAsFloat; }
private uint pgi = 0; private uint pgi = 0;
public uint PageIndex public uint PageIndex
@ -226,6 +228,7 @@ public class TabControl : IRenderObject, IParent
this.Parent = Parent; this.Parent = Parent;
this.Window = Window; this.Window = Window;
BlockDraw = true; BlockDraw = true;
if (!Window!.Context.IsCurrent) Window.Context.MakeCurrent();
Loaded = true; Loaded = true;
_bounds.LoadToParent(Parent, Window); _bounds.LoadToParent(Parent, Window);
for (int i = 0; i < Controls.Length; i++) for (int i = 0; i < Controls.Length; i++)
@ -241,18 +244,25 @@ public class TabControl : IRenderObject, IParent
if (WindowLoaded is not null) WindowLoaded.Invoke(this); if (WindowLoaded is not null) WindowLoaded.Invoke(this);
} }
public void Draw() public void Draw(int x, int y, int w, int h)
{ {
if (Loaded && Visible) if (Loaded && Visible)
{ {
_bounds.Draw(); _bounds.Draw(x,y,w,h);
if (!(Controls.Length >= (PageIndex))) return; if (!(Controls.Length >= (PageIndex))) return;
if (!Controls[PageIndex].Loaded) return; if (!Controls[PageIndex].Loaded) return;
Controls[PageIndex].Draw(); GL.Scissor(Controls[PageIndex].ScissorLocation.X, Controls[PageIndex].ScissorLocation.Y, Controls[PageIndex].Size.X, Controls[PageIndex].Size.Y);
Controls[PageIndex].Draw(x,y,w,h);
GL.Scissor(ScissorLocation.X, ScissorLocation.Y, Size.X, Size.Y);
for (int i = 0; i < Buttonts.Length; i++) for (int i = 0; i < Buttonts.Length; i++)
Buttonts[i].Draw(); Buttonts[i].Draw(x,y,w,h);
} }
} }
public Vector2i GetParentRelLocPoint()
{
return Parent!.GetParentRelLocPoint() + new Vector2i(Location.X, Parent.Size.Y - (Location.Y + Size.Y));
}
public void Clean() public void Clean()
{ {

View File

@ -1,8 +1,10 @@
using System.Timers; using System.Timers;
using System.Timers;
using GraphicsManager.Enums; using GraphicsManager.Enums;
using GraphicsManager.Interfaces; using GraphicsManager.Interfaces;
using GraphicsManager.Objects.Core; using GraphicsManager.Objects.Core;
using OpenTK.Graphics.GL; using OpenTK.Graphics.GL;
using OpenTK.Graphics.OpenGL4;
using OpenTK.Mathematics; using OpenTK.Mathematics;
using OpenTK.Windowing.Common; using OpenTK.Windowing.Common;
using OpenTK.Windowing.GraphicsLibraryFramework; using OpenTK.Windowing.GraphicsLibraryFramework;
@ -153,13 +155,34 @@ public class Textbox : IRenderObject
_watermark.Clean(); _watermark.Clean();
} }
public void Draw() private Vector2i? l = null, s = null;
public Vector2i ScissorLocation { get => _bounds.ScissorLocation; }
public void Draw(int x, int y, int w, int h)
{ {
if (!Visible || !Loaded) return; if (!Visible || !Loaded) return;
_bounds.Draw(); _bounds.Draw(x,y,w,h);
_inside.Draw(); _inside.Draw(x,y,w,h);
if (!string.IsNullOrEmpty(_label.Text)) _label.Draw(); if (l is null || s is null)
else _watermark.Draw(); {
l = new((int)Window.FloatToInt(Parent.IntToFloat(_inside.Location.X)),
(int)Window.FloatToInt(Parent.IntToFloat(_inside.Location.Y, true), true));
s = new(_inside.Size.X - _label.Location.X + Location.X,
_inside.Size.Y);
Console.WriteLine(_inside.Location.Y);
Console.WriteLine($"x:{l.Value.X} y:{l.Value.Y} xx:{s.Value.X} yy:{s.Value.Y}");
l = new(l.Value.X, 0);
s = new(s.Value.X, Window.Size.Y);
}
GL.Disable(EnableCap.ScissorTest);
GL.Enable(EnableCap.ScissorTest);
GL.Scissor(l.Value.X,
l.Value.Y,
s.Value.X,
s.Value.Y
);
if (!string.IsNullOrEmpty(_label.Text)) _label.Draw(x,y,w,h);
else _watermark.Draw(x,y,w,h);
} }
public void LoadToParent(IParent Parent, Window Window) public void LoadToParent(IParent Parent, Window Window)
@ -171,6 +194,7 @@ public class Textbox : IRenderObject
this.Window.KeyDown += Window_KeyDown; this.Window.KeyDown += Window_KeyDown;
this.Window.TextInput += WindowOnTextInput; this.Window.TextInput += WindowOnTextInput;
Loaded = true; Loaded = true;
if (!Window!.Context.IsCurrent) Window.Context.MakeCurrent();
_bounds.LoadToParent(Parent, Window); _bounds.LoadToParent(Parent, Window);
_inside.LoadToParent(Parent, Window); _inside.LoadToParent(Parent, Window);
_label.LoadToParent(Parent, Window); _label.LoadToParent(Parent, Window);

View File

@ -0,0 +1,13 @@
using GraphicsManager.Interfaces;
namespace GraphicsManager.Objects;
public class TitleBar
{
public bool Loaded { get; private set; } = false;
public void Draw()
{
}
}

View File

@ -1,6 +1,7 @@
using GraphicsManager.Enums; using GraphicsManager.Enums;
using GraphicsManager.Interfaces; using GraphicsManager.Interfaces;
using GraphicsManager.Objects.Core; using GraphicsManager.Objects.Core;
using OpenTK.Graphics.OpenGL4;
using OpenTK.Mathematics; using OpenTK.Mathematics;
using OpenTK.Windowing.Common; using OpenTK.Windowing.Common;
@ -92,6 +93,7 @@ public class UserControl : IRenderObject, IParent
BlockDraw = false; BlockDraw = false;
} }
} }
public Vector2i ScissorLocation { get => _bounds.ScissorLocation; }
public Vector2i Position => Location; public Vector2i Position => Location;
public Vector2 LocationAsFloat { get => _bounds.LocationAsFloat; } public Vector2 LocationAsFloat { get => _bounds.LocationAsFloat; }
@ -123,11 +125,12 @@ public class UserControl : IRenderObject, IParent
if (WindowLoaded is not null) WindowLoaded.Invoke(this); if (WindowLoaded is not null) WindowLoaded.Invoke(this);
} }
public void Draw() public void Draw(int x, int y, int w, int h)
{ {
if (Loaded) if (Loaded)
{ {
_bounds.Draw(); _bounds.Draw(x,y,w,h);
IEnumerable<IRenderObject> needload = Controls.Where(a => a.Loaded == false); IEnumerable<IRenderObject> needload = Controls.Where(a => a.Loaded == false);
if (needload.Any()) if (needload.Any())
@ -142,11 +145,25 @@ public class UserControl : IRenderObject, IParent
} }
for (int i = 0; i < Controls.Length; i++) for (int i = 0; i < Controls.Length; i++)
{ {
Controls[i].Draw(); Vector2i laff = new(Controls[i].ScissorLocation.X, Controls[i].ScissorLocation.Y);
Vector2i saff = new Vector2i(Controls[i].Size.X, Controls[i].Size.Y);
if (laff.X < ScissorLocation.X) laff = new(ScissorLocation.X, laff.Y);
if (laff.X < x) laff = new(x, laff.Y);
if (laff.Y < ScissorLocation.Y) laff = new(laff.X, ScissorLocation.Y);
if (laff.Y < y) laff = new(laff.X, y);
if (saff.X + laff.X > Size.X + ScissorLocation.X) saff = new(Size.X, saff.Y);
if (saff.Y + laff.Y > Size.Y + ScissorLocation.Y) saff = new(saff.X, Size.Y);
GL.Scissor(laff.X, laff.Y, saff.X, saff.Y);
Controls[i].Draw(ScissorLocation.X, ScissorLocation.Y, Size.X, Size.Y);
} }
} }
} }
public Vector2i GetParentRelLocPoint()
{
return Parent!.GetParentRelLocPoint() + new Vector2i(Location.X, Parent.Size.Y - (Location.Y + Size.Y));
}
public void Clean() public void Clean()
{ {
for (int i = 0; i < Controls.Length; i++) for (int i = 0; i < Controls.Length; i++)

View File

@ -15,15 +15,21 @@ public class Window : NativeWindow , IParent
{ {
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)
{ {
for (int i = 0; i < Controls.Length; i++)
{
Controls[i].Clean();
}
Context.MakeNoneCurrent();
base.Dispose(disposing); base.Dispose(disposing);
} }
public TextureManager TextureManager { get; private set; } public TextureManager TextureManager { get; private set; }
private TitleBar? _tb = null;
public TitleBar? CustomeTitleBar
{
get => _tb;
set
{
_tb = value;
//some setting/changeing code
}
}
internal IRenderObject? focused; internal IRenderObject? focused;
public void CenterWindow(int mon) public void CenterWindow(int mon)
@ -51,15 +57,50 @@ public class Window : NativeWindow , IParent
{ {
TextureManager = TextureManager.GetTextureManager(Context); TextureManager = TextureManager.GetTextureManager(Context);
Context.MakeCurrent(); Context.MakeCurrent();
Texture.TextureShader.Add(Context, new("RectangleTexture", true)); if (!Texture.TextureShader.ContainsKey(Context)) Texture.TextureShader.Add(Context, new("RectangleTexture", true));
Objects.Rectangle.DefaultShader.Add(Context, new("Rectangle", true)); if (!Rectangle.DefaultShader.ContainsKey(Context)) Rectangle.DefaultShader.Add(Context, new("Rectangle", true));
Label.DefaultTextShader.Add(Context, new("Label", true)); if (!Label.DefaultTextShader.ContainsKey(Context)) Label.DefaultTextShader.Add(Context, new("Label", true));
Label._characters.Add(Context, new()); if (!Label._characters.ContainsKey(Context)) Label._characters.Add(Context, new());
last = WindowState;
KeyDown += OnKeyDownn;
} }
public Window() : base(new NativeWindowSettings()) private WindowState last;
private bool fs = false;
private Vector2i os, loc;
private unsafe void OnKeyDownn(KeyboardKeyEventArgs obj)
{
if (obj.Key != Keys.F11 || WindowBorder == WindowBorder.Fixed) return;
GLFW.WindowHint(WindowHintBool.AutoIconify, true);
if (WindowState != WindowState.Normal) last = WindowState;
Console.WriteLine(fs);
switch (fs)
{ {
case false:
loc = Location;
os = Size;
WindowBorder = WindowBorder.Hidden;
Location = new(4090, 0);
fs = true;
break;
case true:
WindowBorder = WindowBorder.Resizable;
Size = os;
Location = loc;
fs = false;
break;
}
}
public Window() : this(new NativeWindowSettings())
{
/*
TextureManager = TextureManager.GetTextureManager(Context); TextureManager = TextureManager.GetTextureManager(Context);
if (!Texture.TextureShader.ContainsKey(Context)) Texture.TextureShader.Add(Context, new("RectangleTexture", true));
if (!Rectangle.DefaultShader.ContainsKey(Context)) Rectangle.DefaultShader.Add(Context, new("Rectangle", true));
if (!Label.DefaultTextShader.ContainsKey(Context)) Label.DefaultTextShader.Add(Context, new("Label", true));
if (!Label._characters.ContainsKey(Context)) Label._characters.Add(Context, new());*/
} }
public Vector2i Position { get; } = new Vector2i(0, 0); public Vector2i Position { get; } = new Vector2i(0, 0);
public Color4 BackgroundColor { get; set; } = new Color4(0, 0, 0, 255); public Color4 BackgroundColor { get; set; } = new Color4(0, 0, 0, 255);
@ -147,9 +188,10 @@ public class Window : NativeWindow , IParent
public void ParentResize(ResizeEventArgs e) public void ParentResize(ResizeEventArgs e)
{ {
if (e.Width == 0 && e.Height == 0) return;
BlockDraw = true;
base.OnResize(e); base.OnResize(e);
if (e.Width == 0 && e.Height == 0 && WindowState != WindowState.Fullscreen) return;
BlockDraw = true;
GL.Viewport(0, 0, e.Width, e.Height); GL.Viewport(0, 0, e.Width, e.Height);
for (int i = 0; i < Controls.Length; i++) for (int i = 0; i < Controls.Length; i++)
{ {
@ -189,6 +231,7 @@ public class Window : NativeWindow , IParent
protected override void OnClosing(CancelEventArgs e) protected override void OnClosing(CancelEventArgs e)
{ {
Context.MakeCurrent();
GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindVertexArray(0); GL.BindVertexArray(0);
GL.UseProgram(0); GL.UseProgram(0);
@ -204,6 +247,12 @@ public class Window : NativeWindow , IParent
public int FPS { get; set; } = 0; public int FPS { get; set; } = 0;
public event Func<Window, Task>? WindowLoaded; public event Func<Window, Task>? WindowLoaded;
public List<Window> Windows = new();
public void ProcessEvent()
{
ProcessEvents();
}
public void StartRender() public void StartRender()
{ {
Context.MakeCurrent(); Context.MakeCurrent();
@ -214,6 +263,13 @@ public class Window : NativeWindow , IParent
while (Exists && IsVisible && !IsExiting) while (Exists && IsVisible && !IsExiting)
{ {
GLFW.PollEvents(); GLFW.PollEvents();
if (Windows.Any())
{
foreach (var win in Windows)
{
win.ProcessEvent();
}
}
if (invokes.Any()) if (invokes.Any())
{ {
for (int i = 0; i < invokes.Count; i++) invokes.Dequeue().Invoke(); for (int i = 0; i < invokes.Count; i++) invokes.Dequeue().Invoke();
@ -222,6 +278,12 @@ public class Window : NativeWindow , IParent
} }
} }
public void StartRenderAsync()
{
Thread t = new Thread(_ => StartRender());
t.Start();
}
public bool BlockDraw { get; set; } = false; public bool BlockDraw { get; set; } = false;
public void TryDraw() public void TryDraw()
@ -245,12 +307,19 @@ public class Window : NativeWindow , IParent
{ {
invokes.Enqueue(A); invokes.Enqueue(A);
} }
public Vector2i GetParentRelLocPoint()
{
return new(0);
}
public void DrawFrame() public void DrawFrame()
{ {
Context.MakeCurrent(); Context.MakeCurrent();
frame++; frame++;
Console.WriteLine($"Drawing Frame: {frame}"); Console.WriteLine($"Drawing Frame: {frame}");
GL.Enable(EnableCap.ScissorTest);
GL.Scissor(0, 0, Size.X, Size.Y);
GL.ClearColor(BackgroundColor.R, BackgroundColor.G, BackgroundColor.B, (BackgroundColor.A * -1) + 1); GL.ClearColor(BackgroundColor.R, BackgroundColor.G, BackgroundColor.B, (BackgroundColor.A * -1) + 1);
IEnumerable<IRenderObject> needload = Controls.Where(a => a.Loaded == false); IEnumerable<IRenderObject> needload = Controls.Where(a => a.Loaded == false);
@ -263,11 +332,26 @@ public class Window : NativeWindow , IParent
} }
BlockDraw = false; BlockDraw = false;
} }
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
for (int i = 0; i < Controls.Length; i++) for (int i = 0; i < Controls.Length; i++)
{ {
if (Controls[i].Loaded) Controls[i].Draw(); if (!Controls[i].Loaded) continue;
GL.Disable(EnableCap.ScissorTest);
if (Controls[i] is not Label)
{
GL.Enable(EnableCap.ScissorTest);
GL.Scissor(Controls[i].ScissorLocation.X, Controls[i].ScissorLocation.Y, Controls[i].Size.X, Controls[i].Size.Y);
Controls[i].Draw(0,0,Size.X, Size.Y);
}
else
{
GL.Enable(EnableCap.ScissorTest);
GL.Scissor(0, 0, Size.X, Size.Y);
Controls[i].Draw(0,0,Size.X, Size.Y);
}
} }
GL.Disable(EnableCap.ScissorTest);
Context.SwapBuffers(); Context.SwapBuffers();
} }