Refactoring
This commit is contained in:
parent
e7336cbf82
commit
b1d828fae0
22 changed files with 83 additions and 70 deletions
|
@ -4,4 +4,6 @@ project(":core").projectDir = file("src/core")
|
|||
include(":opengl")
|
||||
project(":opengl").projectDir = file("src/opengl")
|
||||
include(":rendering")
|
||||
project(":rendering").projectDir = file("src/rendering")
|
||||
project(":rendering").projectDir = file("src/rendering")
|
||||
include(":resources")
|
||||
project(":resources").projectDir = file("src/resources")
|
|
@ -32,9 +32,6 @@ dependencies {
|
|||
|
||||
implementation("org.lwjgl", "lwjgl-glfw")
|
||||
runtimeOnly("org.lwjgl", "lwjgl-glfw", classifier = lwjglNatives)
|
||||
|
||||
implementation("org.lwjgl", "lwjgl-stb")
|
||||
runtimeOnly("org.lwjgl", "lwjgl-stb", classifier = lwjglNatives)
|
||||
|
||||
implementation("org.joml", "joml", jomlVersion)
|
||||
implementation("org.joml", "joml-primitives", jomlPrimitivesVersion)
|
||||
|
|
|
@ -27,6 +27,7 @@ dependencies {
|
|||
implementation("javax.annotation:javax.annotation-api:1.3.2")
|
||||
|
||||
compileOnly(project(":core", configuration = "shadow"))
|
||||
compileOnly(project(":resources", configuration = "shadow"))
|
||||
compileOnly(project(":rendering", configuration = "shadow"))
|
||||
|
||||
implementation("org.lwjgl", "lwjgl-assimp")
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package dev.euph.engine.opengl;
|
||||
|
||||
import dev.euph.engine.rendering.resources.Mesh;
|
||||
import dev.euph.engine.resources.Mesh;
|
||||
|
||||
import static org.lwjgl.opengl.GL30.glBindVertexArray;
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ import dev.euph.engine.rendering.Shader;
|
|||
import dev.euph.engine.rendering.ShaderManager;
|
||||
import dev.euph.engine.rendering.components.Camera;
|
||||
import dev.euph.engine.rendering.components.MeshRenderer;
|
||||
import dev.euph.engine.rendering.resources.Mesh;
|
||||
import dev.euph.engine.resources.Mesh;
|
||||
import dev.euph.engine.rendering.utils.ProjectionMatrix;
|
||||
import dev.euph.engine.rendering.utils.ViewMatrix;
|
||||
import lombok.Getter;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package dev.euph.engine.opengl;
|
||||
|
||||
import dev.euph.engine.rendering.Shader;
|
||||
import dev.euph.engine.rendering.resources.Texture;
|
||||
import dev.euph.engine.resources.Texture;
|
||||
import org.joml.Matrix4f;
|
||||
import org.joml.Vector2f;
|
||||
import org.joml.Vector3f;
|
||||
|
|
|
@ -1,34 +1,40 @@
|
|||
package dev.euph.engine.opengl;
|
||||
|
||||
import dev.euph.engine.core.data.ImageLoader;
|
||||
import dev.euph.engine.rendering.resources.Texture;
|
||||
import dev.euph.engine.resources.Texture;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.net.URL;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import static dev.euph.engine.opengl.GL.*;
|
||||
|
||||
public class GLTextureLoader {
|
||||
public static Texture loadTexture(URL imageResource) {
|
||||
int textureID = GL.glGenTextures();
|
||||
glBindTexture(GL_TEXTURE_2D, textureID);
|
||||
@Getter
|
||||
public class GLTexture implements Texture {
|
||||
private final int id;
|
||||
private final int height;
|
||||
private final int width;
|
||||
|
||||
public GLTexture(int width, int height, ByteBuffer data) {
|
||||
this.id = GL.glGenTextures();
|
||||
glBindTexture(GL_TEXTURE_2D, this.id);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
|
||||
ImageLoader.Image image = ImageLoader.loadImage(imageResource.getPath());
|
||||
glTexImage2D(
|
||||
GL_TEXTURE_2D,
|
||||
0,
|
||||
GL_RGBA,
|
||||
image.width(), image.height(),
|
||||
width, height,
|
||||
0,
|
||||
GL_RGBA,
|
||||
GL_UNSIGNED_BYTE,
|
||||
image.data()
|
||||
data
|
||||
);
|
||||
glGenerateMipmap(GL_TEXTURE_2D);
|
||||
return new Texture(textureID, image.width(), image.height());
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
package dev.euph.engine.opengl;
|
||||
|
||||
import dev.euph.engine.rendering.resources.Mesh;
|
||||
import dev.euph.engine.resources.Mesh;
|
||||
|
||||
import static org.lwjgl.opengl.GL30.glBindVertexArray;
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@ dependencies {
|
|||
implementation("javax.annotation:javax.annotation-api:1.3.2")
|
||||
|
||||
compileOnly(project(":core", configuration = "shadow"))
|
||||
compileOnly(project(":resources", configuration = "shadow"))
|
||||
implementation(platform("org.lwjgl:lwjgl-bom:$lwjglVersion"))
|
||||
|
||||
shadow(localGroovy())
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package dev.euph.engine.rendering;
|
||||
|
||||
import dev.euph.engine.rendering.resources.Texture;
|
||||
import dev.euph.engine.resources.Texture;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package dev.euph.engine.rendering;
|
||||
|
||||
import dev.euph.engine.rendering.resources.Texture;
|
||||
import dev.euph.engine.resources.Texture;
|
||||
import lombok.Setter;
|
||||
|
||||
@Setter
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package dev.euph.engine.rendering;
|
||||
|
||||
import dev.euph.engine.rendering.resources.Texture;
|
||||
import dev.euph.engine.resources.Texture;
|
||||
import lombok.Getter;
|
||||
import org.joml.Vector2f;
|
||||
import org.joml.Vector3f;
|
||||
|
|
|
@ -4,7 +4,7 @@ import dev.euph.engine.core.transform.Transform;
|
|||
import dev.euph.engine.core.ecs.Component;
|
||||
import dev.euph.engine.core.ecs.Requires;
|
||||
import dev.euph.engine.rendering.Material;
|
||||
import dev.euph.engine.rendering.resources.Mesh;
|
||||
import dev.euph.engine.resources.Mesh;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
|
|
|
@ -1,23 +0,0 @@
|
|||
package dev.euph.engine.rendering.resources;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class Texture {
|
||||
|
||||
public final static int ALBEDO_INDEX = 0;
|
||||
public final static int NORMAL_INDEX = 1;
|
||||
public final static int METALLIC_INDEX = 2;
|
||||
public final static int ROUGHNESS_INDEX = 3;
|
||||
public final static int AMBIENT_OCCLUSION_INDEX = 4;
|
||||
|
||||
private final int id;
|
||||
private final int height;
|
||||
private final int width;
|
||||
|
||||
public Texture(int id, int width, int height) {
|
||||
this.id = id;
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
}
|
||||
}
|
|
@ -26,13 +26,14 @@ dependencies {
|
|||
annotationProcessor("javax.annotation:javax.annotation-api:1.3.2")
|
||||
implementation("javax.annotation:javax.annotation-api:1.3.2")
|
||||
|
||||
compileOnly(project(":core", configuration = "shadow"))
|
||||
implementation(platform("org.lwjgl:lwjgl-bom:$lwjglVersion"))
|
||||
|
||||
implementation("org.lwjgl", "lwjgl-stb")
|
||||
runtimeOnly("org.lwjgl", "lwjgl-stb", classifier = lwjglNatives)
|
||||
|
||||
implementation("org.lwjgl", "lwjgl-assimp")
|
||||
runtimeOnly("org.lwjgl", "lwjgl-assimp", classifier = lwjglNatives)
|
||||
|
||||
|
||||
shadow(localGroovy())
|
||||
shadow(gradleApi())
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package dev.euph.engine.rendering.resources;
|
||||
package dev.euph.engine.resources;
|
||||
|
||||
public interface Mesh {
|
||||
void bind();
|
|
@ -1,6 +1,5 @@
|
|||
package dev.euph.engine.opengl;
|
||||
package dev.euph.engine.resources;
|
||||
|
||||
import dev.euph.engine.rendering.resources.Mesh;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.lwjgl.assimp.*;
|
||||
|
||||
|
@ -10,9 +9,19 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
public class GLMeshLoader{
|
||||
public class MeshLoader {
|
||||
|
||||
public static Mesh loadMesh(URL modelResource) {
|
||||
@FunctionalInterface
|
||||
public interface meshConstructor {
|
||||
Mesh create(float[] vertices, int[] indices);
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
public interface texturedMeshConstructor {
|
||||
Mesh create(float[] vertices, int[] indices, float[] textureCoordinates);
|
||||
}
|
||||
|
||||
public static Mesh loadMesh(URL modelResource, meshConstructor constructor) {
|
||||
try {
|
||||
AIMesh mesh = loadMeshIntoAssimp(modelResource);
|
||||
|
||||
|
@ -23,17 +32,16 @@ public class GLMeshLoader{
|
|||
float[] vertices = listToFloatArray(verticesList);
|
||||
int[] indices = listToIntArray(loadIndices(mesh));
|
||||
|
||||
return new GLMesh(vertices, indices);
|
||||
return constructor.create(vertices, indices);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException("Error loading mesh: " + modelResource.getPath());
|
||||
}
|
||||
}
|
||||
|
||||
public static Mesh loadTexturedMesh(URL modelResource) {
|
||||
public static Mesh loadTexturedMesh(URL modelResource, texturedMeshConstructor constructor) {
|
||||
try {
|
||||
AIMesh mesh = loadMeshIntoAssimp(modelResource);
|
||||
|
||||
List<Float> verticesList = new ArrayList<>();
|
||||
List<Float> textureCoordinatesList = new ArrayList<>();
|
||||
|
||||
|
@ -45,7 +53,7 @@ public class GLMeshLoader{
|
|||
int[] indices = listToIntArray(loadIndices(mesh));
|
||||
float[] texCoords = listToFloatArray(textureCoordinatesList);
|
||||
|
||||
return new GLTexturedMesh(vertices, indices, texCoords);
|
||||
return constructor.create(vertices, indices, texCoords);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException("Error loading mesh: " + modelResource.getPath());
|
|
@ -0,0 +1,13 @@
|
|||
package dev.euph.engine.resources;
|
||||
|
||||
public interface Texture {
|
||||
public final static int ALBEDO_INDEX = 0;
|
||||
public final static int NORMAL_INDEX = 1;
|
||||
public final static int METALLIC_INDEX = 2;
|
||||
public final static int ROUGHNESS_INDEX = 3;
|
||||
public final static int AMBIENT_OCCLUSION_INDEX = 4;
|
||||
|
||||
public int getId();
|
||||
public int getHeight();
|
||||
public int getWidth();
|
||||
}
|
|
@ -1,26 +1,28 @@
|
|||
package dev.euph.engine.core.data;
|
||||
package dev.euph.engine.resources;
|
||||
|
||||
import org.lwjgl.BufferUtils;
|
||||
|
||||
import java.net.URL;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.IntBuffer;
|
||||
|
||||
import static org.lwjgl.stb.STBImage.*;
|
||||
|
||||
|
||||
public class ImageLoader {
|
||||
public record Image(ByteBuffer data, int width, int height) {
|
||||
public class TextureLoader {
|
||||
@FunctionalInterface
|
||||
public interface textureConstructor {
|
||||
Texture create(int height, int width, ByteBuffer data);
|
||||
}
|
||||
|
||||
public static Image loadImage(String path) {
|
||||
public static Texture loadTexture(URL imageResource, textureConstructor constructor) {
|
||||
IntBuffer width = BufferUtils.createIntBuffer(1);
|
||||
IntBuffer height = BufferUtils.createIntBuffer(1);
|
||||
IntBuffer channels = BufferUtils.createIntBuffer(1);
|
||||
ByteBuffer imageBuffer = stbi_load(path, width, height, channels, 0);
|
||||
|
||||
ByteBuffer imageBuffer = stbi_load(imageResource.getPath(), width, height, channels, 0);
|
||||
if(imageBuffer == null) {
|
||||
throw new RuntimeException("Failed to load image: " + stbi_failure_reason());
|
||||
}
|
||||
Image image = new Image(imageBuffer, width.get(0), height.get(0));
|
||||
Texture image = constructor.create(width.get(0), height.get(0), imageBuffer);
|
||||
stbi_image_free(imageBuffer);
|
||||
return image;
|
||||
}
|
|
@ -70,4 +70,5 @@ dependencies {
|
|||
implementation(project(":core", configuration = "shadow"))
|
||||
implementation(project(":rendering", configuration = "shadow"))
|
||||
implementation(project(":opengl", configuration = "shadow"))
|
||||
implementation(project(":resources", configuration = "shadow"))
|
||||
}
|
|
@ -5,4 +5,6 @@ project(":core").projectDir = file("../Engine/src/core")
|
|||
include(":rendering")
|
||||
project(":rendering").projectDir = file("../Engine/src/rendering")
|
||||
include(":opengl")
|
||||
project(":opengl").projectDir = file("../Engine/src/opengl")
|
||||
project(":opengl").projectDir = file("../Engine/src/opengl")
|
||||
include(":resources")
|
||||
project(":resources").projectDir = file("../Engine/src/resources")
|
|
@ -11,8 +11,10 @@ import dev.euph.engine.rendering.components.Camera;
|
|||
import dev.euph.engine.rendering.components.MeshRenderer;
|
||||
import dev.euph.engine.rendering.components.lights.DirectionalLight;
|
||||
import dev.euph.engine.rendering.components.lights.PointLight;
|
||||
import dev.euph.engine.rendering.resources.Mesh;
|
||||
import dev.euph.engine.rendering.resources.Texture;
|
||||
import dev.euph.engine.resources.Mesh;
|
||||
import dev.euph.engine.resources.Texture;
|
||||
import dev.euph.engine.resources.MeshLoader;
|
||||
import dev.euph.engine.resources.TextureLoader;
|
||||
import org.joml.Vector3f;
|
||||
|
||||
import java.awt.*;
|
||||
|
@ -85,8 +87,8 @@ public class Main {
|
|||
.addComponent(new PointLight(Color.red, new Vector3f(10)))
|
||||
.addToScene(scene);
|
||||
|
||||
Mesh modelMesh = GLMeshLoader.loadTexturedMesh(Main.class.getResource("/dev/euph/game/models/human_rigged.obj"));
|
||||
Texture uvTexture = GLTextureLoader.loadTexture(Main.class.getResource("/dev/euph/game/textures/uv.png"));
|
||||
Mesh modelMesh = MeshLoader.loadTexturedMesh(Main.class.getResource("/dev/euph/game/models/human_rigged.obj"), GLTexturedMesh::new);
|
||||
Texture uvTexture = TextureLoader.loadTexture(Main.class.getResource("/dev/euph/game/textures/uv.png"), GLTexture::new);
|
||||
Material modelMaterial = new Material(shaderManager.getShader("default"))
|
||||
.setColor(new Color(7, 77, 255, 255))
|
||||
.setAlbedoTexture(uvTexture);
|
||||
|
|
Loading…
Reference in a new issue