diff --git a/Engine/settings.gradle.kts b/Engine/settings.gradle.kts index 7d8723a..7c29e34 100644 --- a/Engine/settings.gradle.kts +++ b/Engine/settings.gradle.kts @@ -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") \ No newline at end of file +project(":rendering").projectDir = file("src/rendering") +include(":resources") +project(":resources").projectDir = file("src/resources") \ No newline at end of file diff --git a/Engine/src/opengl/build.gradle.kts b/Engine/src/opengl/build.gradle.kts index 75357db..a7d76d7 100644 --- a/Engine/src/opengl/build.gradle.kts +++ b/Engine/src/opengl/build.gradle.kts @@ -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") diff --git a/Engine/src/opengl/java/dev/euph/engine/opengl/GLMesh.java b/Engine/src/opengl/java/dev/euph/engine/opengl/GLMesh.java index d24f1c9..d2dfdd8 100644 --- a/Engine/src/opengl/java/dev/euph/engine/opengl/GLMesh.java +++ b/Engine/src/opengl/java/dev/euph/engine/opengl/GLMesh.java @@ -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; diff --git a/Engine/src/opengl/java/dev/euph/engine/opengl/GLRenderer.java b/Engine/src/opengl/java/dev/euph/engine/opengl/GLRenderer.java index b39b017..c3e62ad 100644 --- a/Engine/src/opengl/java/dev/euph/engine/opengl/GLRenderer.java +++ b/Engine/src/opengl/java/dev/euph/engine/opengl/GLRenderer.java @@ -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; diff --git a/Engine/src/opengl/java/dev/euph/engine/opengl/GLTexturedMesh.java b/Engine/src/opengl/java/dev/euph/engine/opengl/GLTexturedMesh.java index 6ef0e21..f67e6ce 100644 --- a/Engine/src/opengl/java/dev/euph/engine/opengl/GLTexturedMesh.java +++ b/Engine/src/opengl/java/dev/euph/engine/opengl/GLTexturedMesh.java @@ -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; diff --git a/Engine/src/rendering/build.gradle.kts b/Engine/src/rendering/build.gradle.kts index 984f68b..44f0618 100644 --- a/Engine/src/rendering/build.gradle.kts +++ b/Engine/src/rendering/build.gradle.kts @@ -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()) diff --git a/Engine/src/rendering/java/dev/euph/engine/rendering/components/MeshRenderer.java b/Engine/src/rendering/java/dev/euph/engine/rendering/components/MeshRenderer.java index 4b411e0..31c3806 100644 --- a/Engine/src/rendering/java/dev/euph/engine/rendering/components/MeshRenderer.java +++ b/Engine/src/rendering/java/dev/euph/engine/rendering/components/MeshRenderer.java @@ -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; diff --git a/Engine/src/resources/build.gradle.kts b/Engine/src/resources/build.gradle.kts index e17f1e7..8cc792c 100644 --- a/Engine/src/resources/build.gradle.kts +++ b/Engine/src/resources/build.gradle.kts @@ -26,13 +26,11 @@ 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-assimp") runtimeOnly("org.lwjgl", "lwjgl-assimp", classifier = lwjglNatives) - shadow(localGroovy()) shadow(gradleApi()) } diff --git a/Engine/src/rendering/java/dev/euph/engine/rendering/resources/Mesh.java b/Engine/src/resources/java/dev/euph/engine/resources/Mesh.java similarity index 66% rename from Engine/src/rendering/java/dev/euph/engine/rendering/resources/Mesh.java rename to Engine/src/resources/java/dev/euph/engine/resources/Mesh.java index 28da075..d2086a9 100644 --- a/Engine/src/rendering/java/dev/euph/engine/rendering/resources/Mesh.java +++ b/Engine/src/resources/java/dev/euph/engine/resources/Mesh.java @@ -1,4 +1,4 @@ -package dev.euph.engine.rendering.resources; +package dev.euph.engine.resources; public interface Mesh { void bind(); diff --git a/Engine/src/opengl/java/dev/euph/engine/opengl/GLMeshLoader.java b/Engine/src/resources/java/dev/euph/engine/resources/MeshLoader.java similarity index 84% rename from Engine/src/opengl/java/dev/euph/engine/opengl/GLMeshLoader.java rename to Engine/src/resources/java/dev/euph/engine/resources/MeshLoader.java index 2af3fe2..db1751d 100644 --- a/Engine/src/opengl/java/dev/euph/engine/opengl/GLMeshLoader.java +++ b/Engine/src/resources/java/dev/euph/engine/resources/MeshLoader.java @@ -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 verticesList = new ArrayList<>(); List 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()); diff --git a/TestGame/build.gradle.kts b/TestGame/build.gradle.kts index eb3fb82..d3c728b 100644 --- a/TestGame/build.gradle.kts +++ b/TestGame/build.gradle.kts @@ -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")) } \ No newline at end of file diff --git a/TestGame/settings.gradle.kts b/TestGame/settings.gradle.kts index 94f30db..3ef7147 100644 --- a/TestGame/settings.gradle.kts +++ b/TestGame/settings.gradle.kts @@ -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") \ No newline at end of file +project(":opengl").projectDir = file("../Engine/src/opengl") +include(":resources") +project(":resources").projectDir = file("../Engine/src/resources") \ No newline at end of file diff --git a/TestGame/src/dev/euph/game/Main.java b/TestGame/src/dev/euph/game/Main.java index 02e0bb5..e1db546 100644 --- a/TestGame/src/dev/euph/game/Main.java +++ b/TestGame/src/dev/euph/game/Main.java @@ -11,8 +11,9 @@ 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.resources.Mesh; import dev.euph.engine.rendering.resources.Texture; +import dev.euph.engine.resources.MeshLoader; import org.joml.Vector3f; import java.awt.*; @@ -85,7 +86,7 @@ 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")); + Mesh modelMesh = MeshLoader.loadTexturedMesh(Main.class.getResource("/dev/euph/game/models/human_rigged.obj"), GLTexturedMesh::new); Texture uvTexture = GLTextureLoader.loadTexture(Main.class.getResource("/dev/euph/game/textures/uv.png")); Material modelMaterial = new Material(shaderManager.getShader("default")) .setColor(new Color(7, 77, 255, 255))