FaderShader class and SplashScene logic
This commit is contained in:
58
src/main/java/org/hirw/game/FaderShader.java
Normal file
58
src/main/java/org/hirw/game/FaderShader.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,8 +26,8 @@ public class Shader {
|
|||||||
ShaderType.FRAG, GL_FRAGMENT_SHADER,
|
ShaderType.FRAG, GL_FRAGMENT_SHADER,
|
||||||
ShaderType.VERT, GL_VERTEX_SHADER));
|
ShaderType.VERT, GL_VERTEX_SHADER));
|
||||||
|
|
||||||
private static final String DEFAULT_FRAG_PATH = "assets/shaders/default.frag.glsl";
|
protected 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_VERT_PATH = "assets/shaders/default.vert.glsl";
|
||||||
|
|
||||||
@Getter private String vertexSource;
|
@Getter private String vertexSource;
|
||||||
@Getter private String fragmentSource;
|
@Getter private String fragmentSource;
|
||||||
@@ -58,6 +58,8 @@ public class Shader {
|
|||||||
glUseProgram(0);
|
glUseProgram(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void update() {}
|
||||||
|
|
||||||
private void compileShader(ShaderType shaderType) {
|
private void compileShader(ShaderType shaderType) {
|
||||||
int shaderID = glCreateShader(SHADERS.get(shaderType));
|
int shaderID = glCreateShader(SHADERS.get(shaderType));
|
||||||
|
|
||||||
|
|||||||
@@ -1,53 +1,45 @@
|
|||||||
package org.hirw.game;
|
package org.hirw.game;
|
||||||
|
|
||||||
import static org.lwjgl.opengl.GL11.*;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import org.hirw.game.util.Time;
|
|
||||||
|
|
||||||
public class SplashScene extends Scene {
|
public class SplashScene extends Scene {
|
||||||
@Getter public final SceneType SCENE_TYPE = SceneType.SPLASH;
|
@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 Mesh screenCover;
|
||||||
|
@Getter @Setter private FaderShader screenCoverFaderShader;
|
||||||
|
|
||||||
public SplashScene() {
|
public SplashScene() {
|
||||||
this.brightness = INITIAL_BRIGHTNESS;
|
super(SceneType.SPLASH);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void init() {
|
public void init() {
|
||||||
Shader faderShader = new Shader();
|
createScreenCover();
|
||||||
faderShader.init();
|
|
||||||
Mesh screenCover = new Mesh(faderShader);
|
|
||||||
screenCover.init();
|
|
||||||
setScreenCover(screenCover);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void update() {
|
public void update() {
|
||||||
if (Objects.isNull(Window.get().getGlfwWindow())) {
|
getScreenCoverFaderShader().update();
|
||||||
return;
|
getScreenCover().draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
screenCover.draw();
|
private void createScreenCover() {
|
||||||
|
FaderShader faderShader = new FaderShader();
|
||||||
fadeIn();
|
faderShader.init();
|
||||||
|
Mesh screenCover = new Mesh(faderShader, screenCoverRectVertices, screenCoverRectElements);
|
||||||
|
screenCover.init();
|
||||||
|
setScreenCoverFaderShader(faderShader);
|
||||||
|
setScreenCover(screenCover);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void fadeIn() {
|
private static final float[] screenCoverRectVertices = {
|
||||||
glClearColor(this.brightness, this.brightness, this.brightness, 0.0f);
|
1.0f, -1.0f, 0.0f, /* */ 0.0f, 0.0f, 0.0f, 1.0f,
|
||||||
final float fadeAmount = FADE_RATE * Time.deltaTime();
|
-1.0f, 1.0f, 0.0f, /* */ 0.0f, 0.0f, 0.0f, 0.0f,
|
||||||
this.brightness += fadeAmount;
|
|
||||||
}
|
|
||||||
|
|
||||||
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,
|
|
||||||
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,
|
-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
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,11 @@ public class Window {
|
|||||||
glfwShowWindow(glfwWindow);
|
glfwShowWindow(glfwWindow);
|
||||||
|
|
||||||
GL.createCapabilities();
|
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() {
|
private void createShader() {
|
||||||
@@ -87,15 +91,14 @@ public class Window {
|
|||||||
Mesh mesh = new Mesh(getShader());
|
Mesh mesh = new Mesh(getShader());
|
||||||
setMesh(mesh);
|
setMesh(mesh);
|
||||||
mesh.init();
|
mesh.init();
|
||||||
mesh.log();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loop() {
|
private void loop() {
|
||||||
while (!glfwWindowShouldClose(glfwWindow)) {
|
while (!glfwWindowShouldClose(glfwWindow)) {
|
||||||
Time.update();
|
Time.update();
|
||||||
SceneManager.update();
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
getMesh().draw();
|
getMesh().draw();
|
||||||
|
SceneManager.update();
|
||||||
glfwSwapBuffers(glfwWindow);
|
glfwSwapBuffers(glfwWindow);
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user