diff --git a/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/maps/Map.groovy b/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/maps/Map.groovy index 6fa0bdcd..f399fee7 100644 --- a/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/maps/Map.groovy +++ b/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/maps/Map.groovy @@ -373,7 +373,7 @@ class Map extends Node { return scene .requestCreateOrGet(new MeshRequest(MeshType.TRIANGLES, new VertexBufferLayout(Attribute.POSITION, Attribute.COLOUR, Attribute.TEXTURE_UVS), - allVertices, Colour.WHITE, allTextureUVs, allIndices)) + allVertices, Colour.WHITE, allTextureUVs, false, allIndices)) .thenAcceptAsync { newMesh -> fullMesh = newMesh } diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRenderer.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRenderer.groovy index a92c16d1..7c483a2e 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRenderer.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRenderer.groovy @@ -59,14 +59,14 @@ interface GraphicsRenderer extends AutoCloseable, EventTarget { */ default Mesh createMesh(MeshType type, VertexBufferLayout layout, Vector2f[] vertices, Colour colour) { - return createMesh(type, layout, vertices, colour, null, null, false) + return createMesh(type, layout, vertices, colour, null, false, null) } /** * Create a mesh with all of the mesh parts. */ Mesh createMesh(MeshType type, VertexBufferLayout layout, Vector2f[] vertices, Colour colour, Vector2f[] textureUVs, - int[] indices, boolean dynamic) + boolean dynamic, int[] index) /** * Create a new shader program from the given configuration, or return the diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRequests.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRequests.groovy index 1c805a49..3200af2b 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRequests.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRequests.groovy @@ -41,14 +41,14 @@ interface GraphicsRequests { @ImmutableOptions(knownImmutables = ['layout', 'colour']) static record MeshRequest(MeshType type, VertexBufferLayout layout, Vector2f[] vertices, Colour colour, - Vector2f[] textureUVs, int[] indices, boolean dynamic = false) implements Request { + Vector2f[] textureUVs, boolean dynamic, int[] index) implements Request { - MeshRequest(MeshType type, VertexBufferLayout layout, Vector2f[] vertices, Colour colour, int[] indices, boolean dynamic = false) { - this(type, layout, vertices, colour, null, indices, dynamic) + MeshRequest(MeshType type, VertexBufferLayout layout, Vector2f[] vertices, Colour colour, boolean dynamic, int[] index) { + this(type, layout, vertices, colour, null, dynamic, index) } - MeshRequest(MeshType type, VertexBufferLayout layout, Vector2f[] vertices, Colour colour, boolean dynamic = false) { - this(type, layout, vertices, colour, null, null, dynamic) + MeshRequest(MeshType type, VertexBufferLayout layout, Vector2f[] vertices, Colour colour, boolean dynamic) { + this(type, layout, vertices, colour, null, dynamic, null) } } diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsSystem.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsSystem.groovy index 8fc0fdfc..07d9219d 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsSystem.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsSystem.groovy @@ -131,7 +131,7 @@ class GraphicsSystem extends EngineSystem implements GraphicsRequests { var resource = switch (request) { case ShaderRequest -> renderer.createShader(request.shaderConfig()) case MeshRequest -> renderer.createMesh(request.type(), request.layout(), request.vertices(), request.colour(), - request.textureUVs(), request.indices(), request.dynamic()) + request.textureUVs(), request.dynamic(), request.index()) case SpriteMeshRequest -> renderer.createSpriteMesh(request.surface(), request.textureUVs()) case TextureRequest -> renderer.createTexture(request.width(), request.height(), request.format(), request.data()) case SpriteSheetRequest -> renderer.createSpriteSheet(request.width(), request.height(), request.format(), request.data()) diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/Mesh.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/Mesh.groovy index 97ec83bd..2f1f826d 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/Mesh.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/Mesh.groovy @@ -34,8 +34,8 @@ abstract class Mesh implements GraphicsResource { final Vector2f[] vertices final Colour colour final Vector2f[] textureUVs - final int[] indices final boolean dynamic + final int[] index /** * Use this mesh in upcoming render operations. diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLMesh.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLMesh.groovy index a087ac17..a122ac22 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLMesh.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLMesh.groovy @@ -45,10 +45,10 @@ class OpenGLMesh extends Mesh { /** * Constructor, creates a new OpenGL mesh. */ - OpenGLMesh(int type, VertexBufferLayout layout, Vector2f[] vertices, Colour colour, Vector2f[] textureUVs, int[] indices, - boolean dynamic) { + OpenGLMesh(int type, VertexBufferLayout layout, Vector2f[] vertices, Colour colour, Vector2f[] textureUVs, + boolean dynamic, int[] index) { - super(type, layout, vertices, colour, textureUVs, indices, dynamic) + super(type, layout, vertices, colour, textureUVs, dynamic, index) vertexArrayId = glGenVertexArrays() glBindVertexArray(vertexArrayId) @@ -58,15 +58,12 @@ class OpenGLMesh extends Mesh { glBindBuffer(GL_ARRAY_BUFFER, vertexBufferId) stackPush().withCloseable { stack -> var vertexBuffer = stack.mallocFloat(layout.size() * vertices.size()) - vertices.eachWithIndex { vertex, index -> + vertices.eachWithIndex { vertex, i -> layout.attributes.each { attribute -> switch (attribute) { case Attribute.POSITION -> vertexBuffer.put(vertex.x, vertex.y) case Attribute.COLOUR -> vertexBuffer.put(colour.r, colour.g, colour.b, colour.a) - case Attribute.TEXTURE_UVS -> { - var textureUV = textureUVs[index] - vertexBuffer.put(textureUV.x, textureUV.y) - } + case Attribute.TEXTURE_UVS -> vertexBuffer.put(textureUVs[i].x, textureUVs[i].y) default -> throw new UnsupportedOperationException("Unhandled vertex layout part ${attribute.name()}") } } @@ -80,15 +77,11 @@ class OpenGLMesh extends Mesh { } } - // Buffer for all the index data, if applicable - if (indices) { + if (index) { elementBufferId = glGenBuffers() glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBufferId) stackPush().withCloseable { stack -> - var indexBuffer = stack.mallocInt(indices.size()) - .put(indices) - .flip() - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBuffer, GL_STATIC_DRAW) + glBufferData(GL_ELEMENT_ARRAY_BUFFER, stack.mallocInt(index.size()).put(index).flip(), GL_STATIC_DRAW) } } else { diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLRenderer.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLRenderer.groovy index 1745caf7..aa16a58c 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLRenderer.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLRenderer.groovy @@ -203,10 +203,10 @@ class OpenGLRenderer implements GraphicsRenderer { @Override Mesh createMesh(MeshType type, VertexBufferLayout layout, Vector2f[] vertices, Colour colour, Vector2f[] textureUVs, - int[] indices, boolean dynamic) { + boolean dynamic, int[] index) { var mesh = new OpenGLMesh(type == MeshType.LINES ? GL_LINES : type == MeshType.LINE_LOOP ? GL_LINE_LOOP : GL_TRIANGLES, - layout, vertices, colour, textureUVs, indices, dynamic) + layout, vertices, colour, textureUVs, dynamic, index) trigger(new MeshCreatedEvent(mesh)) return mesh } @@ -240,8 +240,8 @@ class OpenGLRenderer implements GraphicsRenderer { surface as Vector2f[], Colour.WHITE, textureUVs as Vector2f[], - [0, 1, 2, 0, 2, 3] as int[], - false + false, + [0, 1, 2, 0, 2, 3] as int[] ) } @@ -325,8 +325,8 @@ class OpenGLRenderer implements GraphicsRenderer { shader.use() shader.applyUniforms(transform, material, window) mesh.bind() - if (mesh.indices) { - glDrawElements(mesh.vertexType, mesh.indices.size(), GL_UNSIGNED_INT, 0) + if (mesh.index) { + glDrawElements(mesh.vertexType, mesh.index.size(), GL_UNSIGNED_INT, 0) } else { glDrawArrays(mesh.vertexType, 0, mesh.vertices.size()) diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/scenegraph/nodes/Primitive.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/scenegraph/nodes/Primitive.groovy index 96d440a6..6a0b914d 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/scenegraph/nodes/Primitive.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/scenegraph/nodes/Primitive.groovy @@ -72,8 +72,8 @@ class Primitive extends Node implements GraphicsElement { return CompletableFuture.allOf( scene .requestCreateOrGet(type == MeshType.TRIANGLES ? - new MeshRequest(type, new VertexBufferLayout(Attribute.POSITION, Attribute.COLOUR), this.points, colour, - [0, 1, 3, 1, 2, 3] as int[], dynamic) : + new MeshRequest(type, new VertexBufferLayout(Attribute.POSITION, Attribute.COLOUR), this.points, colour, dynamic, + [0, 1, 3, 1, 2, 3] as int[]) : new MeshRequest(type, new VertexBufferLayout(Attribute.POSITION, Attribute.COLOUR), this.points, colour, dynamic)) .thenAcceptAsync { newMesh -> mesh = newMesh