Small work on gui renderer

This commit is contained in:
Speiger 2025-05-11 23:50:11 +02:00
parent c7c7fd9856
commit 02b1aab8f3
10 changed files with 119 additions and 12 deletions

View File

@ -5,9 +5,9 @@ connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER)
connection.project.dir= connection.project.dir=
eclipse.preferences.version=1 eclipse.preferences.version=1
gradle.user.home= gradle.user.home=
java.home= java.home=C\:/Program Files/Eclipse Adoptium/jdk-21.0.1.12-hotspot
jvm.arguments= jvm.arguments=
offline.mode=false offline.mode=false
override.workspace.settings=false override.workspace.settings=true
show.console.view=false show.console.view=false
show.executions.view=false show.executions.view=false

View File

@ -14,6 +14,7 @@ import speiger.src.coreengine.rendering.models.DrawCall;
import speiger.src.coreengine.rendering.tesselation.buffer.VertexBuilder; import speiger.src.coreengine.rendering.tesselation.buffer.VertexBuilder;
import speiger.src.coreengine.rendering.tesselation.format.VertexFormat; import speiger.src.coreengine.rendering.tesselation.format.VertexFormat;
import speiger.src.coreengine.rendering.tesselation.format.VertexTypes; import speiger.src.coreengine.rendering.tesselation.format.VertexTypes;
import speiger.src.coreengine.rendering.utils.ScissorsManager;
import speiger.src.coreengine.rendering.utils.values.GLMode; import speiger.src.coreengine.rendering.utils.values.GLMode;
public class SimpleUIRenderer implements IUIRenderer, AutoCloseable { public class SimpleUIRenderer implements IUIRenderer, AutoCloseable {
@ -23,8 +24,8 @@ public class SimpleUIRenderer implements IUIRenderer, AutoCloseable {
int currentMatrix = 0; int currentMatrix = 0;
int lastTexture = 0; int lastTexture = 0;
List<UIDrawCall> drawCalls = new ObjectArrayList<>(); List<UIDrawCall> drawCalls = new ObjectArrayList<>();
VertexBuilder builder = new VertexBuilder(Short.MAX_VALUE); VertexBuilder builder = new VertexBuilder(Short.MAX_VALUE);
ScissorsManager manager = new ScissorsManager(32);
@Override @Override
@ -34,17 +35,19 @@ public class SimpleUIRenderer implements IUIRenderer, AutoCloseable {
@Override @Override
public boolean isInScissors(IGuiBox box) { public boolean isInScissors(IGuiBox box) {
return false; return manager.contains(box);
} }
@Override @Override
public void pushScissors(IGuiBox box) { public void pushScissors(IGuiBox box) {
float minX = box.getMinX();
float minY = box.getMinY();
manager.push((int)minX, (int)minY, (int)(box.getMaxX() - minX), (int)(box.getMaxY() - minY));
} }
@Override @Override
public void popScissors() { public void popScissors() {
manager.pop();
} }
@Override @Override
@ -52,6 +55,7 @@ public class SimpleUIRenderer implements IUIRenderer, AutoCloseable {
@Override @Override
public void flush() { public void flush() {
pushDrawcall();
} }

View File

@ -0,0 +1,27 @@
package speiger.src.coreengine.rendering.gui.renderer;
import speiger.src.coreengine.assets.AssetLocation;
import speiger.src.coreengine.assets.base.IAssetProvider;
import speiger.src.coreengine.math.vector.floats.Vec4f;
import speiger.src.coreengine.math.vector.matrix.Matrix4f;
import speiger.src.coreengine.rendering.shader.SimpleShader;
import speiger.src.coreengine.rendering.shader.uniform.base.BufferUniform;
import speiger.src.coreengine.rendering.shader.uniform.base.FloatUniform;
import speiger.src.coreengine.rendering.shader.uniform.base.TextureUniform;
import speiger.src.coreengine.rendering.shader.uniform.vec.Matrix4fUniform;
import speiger.src.coreengine.rendering.shader.uniform.vec.Vec4fUniform;
public class SimpleUIShader extends SimpleShader {
public BufferUniform camera = uniforms.addBuffer("cameraTransform", 0);
public Matrix4fUniform modelMatrix = uniforms.addMat("modelMatrix", new Matrix4f());
public TextureUniform texture = uniforms.addTexture("texture", 0);
public FloatUniform useTexture = uniforms.addFloat("use_texture", 0);
public Vec4fUniform bounds = uniforms.addVec4("bounds", Vec4f.ZERO);
public FloatUniform roundness = uniforms.addFloat("roundness", 0);
public SimpleUIShader(IAssetProvider provider) {
super(provider, "gui_simple", AssetLocation.of("shader/gui/simple/vertex.vs"), AssetLocation.of("shader/gui/simple/fragment.vs"), "in_position", "in_tex", "in_color");
}
}

View File

@ -1071,7 +1071,7 @@ public abstract class GuiComponent extends FlagHolder
int bottom = y + height; int bottom = y + height;
Window window = owner.getWindow(); Window window = owner.getWindow();
Vec2d vec = owner.getUIManager().res.getScaleVec(); Vec2d vec = owner.getUIManager().res.getScaleVec();
GLStateTracker.instance().scissors.enableScissors((int)(x * vec.x()), (int)(window.getHeight() - bottom * vec.y()), (int)(width * vec.x()), (int)(height * vec.y())); GLStateTracker.instance().scissors.push((int)(x * vec.x()), (int)(window.getHeight() - bottom * vec.y()), (int)(width * vec.x()), (int)(height * vec.y()));
} }
protected final boolean isInScissors(Plane box) protected final boolean isInScissors(Plane box)
@ -1094,13 +1094,13 @@ public abstract class GuiComponent extends FlagHolder
int bottom = y + height; int bottom = y + height;
Window window = owner.getWindow(); Window window = owner.getWindow();
Vec2d vec = owner.getUIManager().res.getScaleVec(); Vec2d vec = owner.getUIManager().res.getScaleVec();
return GLStateTracker.instance().scissors.isInScissors((int)(x * vec.x()), (int)(window.getHeight() - bottom * vec.y()), (int)(width * vec.x()), (int)(height * vec.y())); return GLStateTracker.instance().scissors.contains((int)(x * vec.x()), (int)(window.getHeight() - bottom * vec.y()), (int)(width * vec.x()), (int)(height * vec.y()));
} }
public final void disableScissors() public final void disableScissors()
{ {
getRenderer().flush(); getRenderer().flush();
GLStateTracker.instance().scissors.disableScissors(); GLStateTracker.instance().scissors.pop();
} }
class KeyBindAction implements IKeyComponent class KeyBindAction implements IKeyComponent

View File

@ -3,6 +3,7 @@ package speiger.src.coreengine.rendering.shader.uniform;
import speiger.src.coreengine.rendering.shader.ShaderProgram; import speiger.src.coreengine.rendering.shader.ShaderProgram;
public interface IUniform { public interface IUniform {
public String name();
public void registerShader(ShaderProgram program); public void registerShader(ShaderProgram program);
public void removeShader(ShaderProgram program); public void removeShader(ShaderProgram program);
} }

View File

@ -17,6 +17,10 @@ public abstract class Uniform implements IUniform {
positions.setDefaultReturnValue(-1); positions.setDefaultReturnValue(-1);
} }
public String name() {
return name;
}
protected boolean contains(int shaderId) { protected boolean contains(int shaderId) {
return positions.containsKey(shaderId); return positions.containsKey(shaderId);
} }

View File

@ -81,6 +81,15 @@ public class UniformManager {
return uniform; return uniform;
} }
@SuppressWarnings("unchecked")
public <T extends IUniform> T getUniform(String name) {
for(int i = 0,m=uniforms.size();i<m;i++) {
IUniform uni = uniforms.get(i);
if(uni.name().equals(name)) return (T)uni;
}
return null;
}
public void validate() { public void validate() {
for(int i = 0,m=uniforms.size();i<m;i++) { for(int i = 0,m=uniforms.size();i<m;i++) {
uniforms.get(i).registerShader(owner); uniforms.get(i).registerShader(owner);

View File

@ -3,6 +3,7 @@ package speiger.src.coreengine.rendering.utils;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import speiger.src.coreengine.math.collision2d.Plane; import speiger.src.coreengine.math.collision2d.Plane;
import speiger.src.coreengine.rendering.guiOld.helper.box.IGuiBox;
import speiger.src.coreengine.utils.io.GameLog; import speiger.src.coreengine.utils.io.GameLog;
public class ScissorsManager public class ScissorsManager
@ -17,7 +18,7 @@ public class ScissorsManager
} }
} }
public void enableScissors(int x, int y, int width, int height) { public void push(int x, int y, int width, int height) {
if(inUse + 1 >= instances.length) { if(inUse + 1 >= instances.length) {
GameLog.warn("Scissors test would go out of Bounds!"); GameLog.warn("Scissors test would go out of Bounds!");
return; return;
@ -34,11 +35,15 @@ public class ScissorsManager
GL11.glScissor(box.getMinX(), box.getMinY(), box.getWidth(), box.getHeight()); GL11.glScissor(box.getMinX(), box.getMinY(), box.getWidth(), box.getHeight());
} }
public boolean isInScissors(int x, int y, int width, int height) { public boolean contains(IGuiBox box) {
return inUse == -1 || instances[inUse].isIntersecting((int)box.getMinX(), (int)box.getMinY(), (int)box.getMaxX(), (int)box.getMaxY());
}
public boolean contains(int x, int y, int width, int height) {
return inUse == -1 || instances[inUse].isIntersecting(x, y, x + width, y + height); return inUse == -1 || instances[inUse].isIntersecting(x, y, x + width, y + height);
} }
public void disableScissors() { public void pop() {
if(inUse < 0) { if(inUse < 0) {
GameLog.warn("Scissors test would go into negative"); GameLog.warn("Scissors test would go into negative");
return; return;

View File

@ -0,0 +1,35 @@
#version 330
in vec4 pass_color;
in vec2 pass_tex;
in vec2 pass_pos;
out vec4 frag_color;
uniform sampler2D texture;
uniform float use_texture;
uniform vec4 bounds;
uniform float roundness;
const vec4 no_texture = vec4(1.0, 1.0, 1.0, 1.0);
const float cornerSmoothFactor = 0.55;
float square(float val) {
return val * val;
}
float distanceSquared(vec2 p1, vec2 p2) {
vec2 vector = p2 - p1;
return dot(vector, vector);
}
float calcRoundedCorners() {
if (roundness <= 0.0) return 1.0;
return smoothstep(square(roundness + cornerSmoothFactor), square(roundness - cornerSmoothFactor), distanceSquared(pass_pos, clamp(pass_pos, vec2(bounds.x + roundness, bounds.y + roundness), vec2(bounds.z - roundness, bounds.w - roundness))));
}
void main()
{
frag_color = pass_color * mix(no_texture, texture2D(texture, pass_tex), use_texture);
frag_color.a *= calcRoundedCorners();
}

View File

@ -0,0 +1,22 @@
#version 330
layout(location = 0) in vec3 in_position;
layout(location = 1) in vec2 in_tex;
layout(location = 2) in vec4 in_color;
out vec4 pass_color;
out vec2 pass_tex;
out vec2 pass_pos;
layout (std140, column_major) uniform cameraTransform {
mat4 proMatrix;
};
uniform mat4 modelMatrix;
void main()
{
gl_Position = proMatrix * modelMatrix * vec4(in_position, 1.0);
pass_color = in_color;
pass_tex = in_tex;
pass_pos = in_position.xy;
}