Compare commits

...

4 Commits

Author SHA1 Message Date
dc50ee48c2 FaderShader class and SplashScene logic 2025-10-25 03:21:09 +01:00
0e66f20423 Simplify SceneManager initial scene logic 2025-10-25 03:20:35 +01:00
2ed1763b83 Add 'DEBUG' LogType and Log::debug function 2025-10-25 03:19:10 +01:00
abd4597f69 Added fader frag shader 2025-10-25 03:18:02 +01:00
10 changed files with 132 additions and 48 deletions

View File

@@ -0,0 +1,10 @@
#version 330 core
in vec4 fColour;
out vec4 colour;
uniform float u_alpha;
void main() {
colour = vec4(fColour.xyz, 1.0 - u_alpha);
}

View File

@@ -0,0 +1,58 @@
package org.hirw.game;
import static org.lwjgl.opengl.GL20.*;
import lombok.Getter;
import lombok.Setter;
import org.hirw.game.util.Log;
import org.hirw.game.util.Time;
public class FaderShader extends Shader {
private static final String FADER_SHADER_FRAG_PATH = "assets/shaders/fader.frag.glsl";
private static final float DEFAULT_ALPHA_INCREASE_STEP = 1.0f / 3;
private final float INITIAL_ALPHA = 0.0f;
@Getter private final float alphaIncreaseStep;
@Getter @Setter private float alpha;
@Getter @Setter private int alphaUniformLocation;
public FaderShader(float alphaIncreaseStep) {
super(FADER_SHADER_FRAG_PATH, DEFAULT_VERT_PATH);
this.alpha = INITIAL_ALPHA;
this.alphaIncreaseStep = alphaIncreaseStep;
}
public FaderShader() {
this(DEFAULT_ALPHA_INCREASE_STEP);
}
public void init() {
super.init();
findAlphaUniformLocation();
}
public void update() {
super.update();
increaseAlpha();
}
private void findAlphaUniformLocation() {
int location = glGetUniformLocation(getShaderProgramID(), "u_alpha");
if (location == -1) {
Log.warning("FaderShader", "Failed to get 'u_alpha' uniform location, trying to continue...");
} else {
setAlphaUniformLocation(location);
}
}
private void increaseAlpha() {
if (getAlphaUniformLocation() == -1) return;
if (getAlpha() >= 1.0f) return;
setAlpha(getAlpha() + (getAlphaIncreaseStep() * Time.deltaTime()));
glUseProgram(getShaderProgramID());
glUniform1f(getAlphaUniformLocation(), getAlpha());
glUseProgram(0);
}
}

View File

@@ -1,15 +1,19 @@
package org.hirw.game;
public abstract class Scene {
public final SceneType SCENE_TYPE = SceneType.UNDEFINED;
import lombok.Getter;
public Scene() {}
public abstract class Scene {
@Getter private final SceneType sceneType;
public Scene(SceneType sceneType) {
this.sceneType = sceneType;
}
public abstract void init();
public abstract void update();
public String toString() {
return SCENE_TYPE.toString();
return getSceneType().toString();
}
}

View File

@@ -15,32 +15,42 @@ public final class SceneManager {
SceneType.MENU, new SplashScene(),
SceneType.GAME, new SplashScene()));
@Getter private static Scene scene = SCENES.get(DEFAULT_SCENE_TYPE);
@Getter private static Scene scene;
public static void init() {
setScene(DEFAULT_SCENE_TYPE);
}
public static void setScene(SceneType sceneType) {
scene = SCENES.get(sceneType);
Scene newScene = SCENES.get(sceneType);
if (scene == newScene) {
Log.warning("SceneManager", sameSceneWarningString());
return;
} else {
scene = newScene;
}
scene.init();
logSceneChange();
}
public static void update() {
if (scene.SCENE_TYPE == SceneType.UNDEFINED) return;
if (scene.getSceneType() == null) return;
getScene().update();
}
private static void logSceneChange() {
SceneType newSceneType = getScene().SCENE_TYPE;
SceneType newSceneType = getScene().getSceneType();
String loadedSceneMessage = String.format("Changed to scene '%s'", newSceneType.toString());
if (newSceneType == SceneType.UNDEFINED) {
Log.warning("SceneManager", loadedSceneMessage);
} else {
Log.success("SceneManager", loadedSceneMessage);
}
Log.success("SceneManager", loadedSceneMessage);
}
private static String sameSceneWarningString() {
return String.format(
"Tried to switch to scene '%s' but that scene is already loaded",
scene.getSceneType().toString());
}
}

View File

@@ -1,7 +1,6 @@
package org.hirw.game;
public enum SceneType {
UNDEFINED,
SPLASH,
MENU,
GAME,

View File

@@ -26,8 +26,8 @@ public class Shader {
ShaderType.FRAG, GL_FRAGMENT_SHADER,
ShaderType.VERT, GL_VERTEX_SHADER));
private static final String DEFAULT_FRAG_PATH = "assets/shaders/default.frag.glsl";
private static final String DEFAULT_VERT_PATH = "assets/shaders/default.vert.glsl";
protected static final String DEFAULT_FRAG_PATH = "assets/shaders/default.frag.glsl";
protected static final String DEFAULT_VERT_PATH = "assets/shaders/default.vert.glsl";
@Getter private String vertexSource;
@Getter private String fragmentSource;
@@ -58,6 +58,8 @@ public class Shader {
glUseProgram(0);
}
public void update() {}
private void compileShader(ShaderType shaderType) {
int shaderID = glCreateShader(SHADERS.get(shaderType));

View File

@@ -1,53 +1,45 @@
package org.hirw.game;
import static org.lwjgl.opengl.GL11.*;
import java.util.Objects;
import lombok.Getter;
import lombok.Setter;
import org.hirw.game.util.Time;
public class SplashScene extends Scene {
@Getter public final SceneType SCENE_TYPE = SceneType.SPLASH;
private final float INITIAL_BRIGHTNESS = 0.0f;
private final float FADE_RATE = 0.5f;
private float brightness;
@Getter @Setter private Mesh screenCover;
@Getter @Setter private FaderShader screenCoverFaderShader;
public SplashScene() {
this.brightness = INITIAL_BRIGHTNESS;
super(SceneType.SPLASH);
}
public void init() {
Shader faderShader = new Shader();
faderShader.init();
Mesh screenCover = new Mesh(faderShader);
screenCover.init();
setScreenCover(screenCover);
createScreenCover();
}
public void update() {
if (Objects.isNull(Window.get().getGlfwWindow())) {
return;
}
screenCover.draw();
fadeIn();
getScreenCoverFaderShader().update();
getScreenCover().draw();
}
private void fadeIn() {
glClearColor(this.brightness, this.brightness, this.brightness, 0.0f);
final float fadeAmount = FADE_RATE * Time.deltaTime();
this.brightness += fadeAmount;
private void createScreenCover() {
FaderShader faderShader = new FaderShader();
faderShader.init();
Mesh screenCover = new Mesh(faderShader, screenCoverRectVertices, screenCoverRectElements);
screenCover.init();
setScreenCoverFaderShader(faderShader);
setScreenCover(screenCover);
}
private static final float[] screenCoverRect = {
1.0f, -0.0f, 0.0f, /* */ 0.0f, 0.0f, 0.0f, 0.0f,
-0.0f, 1.0f, 0.0f, /* */ 0.0f, 0.0f, 0.0f, 0.0f,
private static final float[] screenCoverRectVertices = {
1.0f, -1.0f, 0.0f, /* */ 0.0f, 0.0f, 0.0f, 1.0f,
-1.0f, 1.0f, 0.0f, /* */ 0.0f, 0.0f, 0.0f, 0.0f,
1.0f, 1.0f, 0.0f, /* */ 0.0f, 0.0f, 0.0f, 0.0f,
-1.0f, -1.0f, 0.0f, /* */ 0.0f, 0.0f, 0.0f, 0.0f,
};
private static final int[] screenCoverRectElements = {
2, 1, 0,
0, 1, 3
};
}

View File

@@ -74,7 +74,11 @@ public class Window {
glfwShowWindow(glfwWindow);
GL.createCapabilities();
glClearColor(0.0f, 0.0f, 2.0f, 0.0f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
}
private void createShader() {
@@ -87,15 +91,14 @@ public class Window {
Mesh mesh = new Mesh(getShader());
setMesh(mesh);
mesh.init();
mesh.log();
}
private void loop() {
while (!glfwWindowShouldClose(glfwWindow)) {
Time.update();
SceneManager.update();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
getMesh().draw();
SceneManager.update();
glfwSwapBuffers(glfwWindow);
glfwPollEvents();
}

View File

@@ -29,7 +29,8 @@ public final class Log {
Map.of(
LogType.SUCCESS, Colours.GREEN,
LogType.ERROR, Colours.RED,
LogType.WARNING, Colours.PURPLE));
LogType.WARNING, Colours.PURPLE,
LogType.DEBUG, Colours.WHITE));
public static void error(String errorStage, String errorDescription) {
System.out.println(formatString(LogType.ERROR, errorStage, errorDescription));
@@ -43,6 +44,10 @@ public final class Log {
System.out.println(formatString(LogType.WARNING, warningStage, warningDescription));
}
public static void debug(String debugMessage) {
System.out.println(formatString(LogType.DEBUG, "DEBUG", debugMessage));
}
private static String formatString(LogType logType, String stage, String description) {
String formattedType = String.format("[%s]", colouriseString(logType, logType.toString()));
String formattedStage = colouriseString(Colours.YELLOW, String.format("<%s>", stage));

View File

@@ -4,4 +4,5 @@ public enum LogType {
SUCCESS,
WARNING,
ERROR,
DEBUG,
}