diff --git a/src/main/java/org/hirw/game/FaderShader.java b/src/main/java/org/hirw/game/FaderShader.java new file mode 100644 index 0000000..9f8dec8 --- /dev/null +++ b/src/main/java/org/hirw/game/FaderShader.java @@ -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); + } +} diff --git a/src/main/java/org/hirw/game/Shader.java b/src/main/java/org/hirw/game/Shader.java index f1bd03c..6f1bca6 100644 --- a/src/main/java/org/hirw/game/Shader.java +++ b/src/main/java/org/hirw/game/Shader.java @@ -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)); diff --git a/src/main/java/org/hirw/game/SplashScene.java b/src/main/java/org/hirw/game/SplashScene.java index a6a9044..e8d52b2 100644 --- a/src/main/java/org/hirw/game/SplashScene.java +++ b/src/main/java/org/hirw/game/SplashScene.java @@ -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 + }; } diff --git a/src/main/java/org/hirw/game/Window.java b/src/main/java/org/hirw/game/Window.java index 8c1afde..f49d40e 100644 --- a/src/main/java/org/hirw/game/Window.java +++ b/src/main/java/org/hirw/game/Window.java @@ -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(); }