From 1d88c10404facbd6522697d7c07bfeb6468f1cee Mon Sep 17 00:00:00 2001 From: Emanuel Rabina Date: Sat, 10 Feb 2024 18:59:44 +1300 Subject: [PATCH] Reorganize vertex attribute layout --- .../classic/shaders/PalettedSprite.vert.glsl | 2 +- .../engine/graphics/GraphicsRenderer.groovy | 33 ++++++++++++++--- .../engine/graphics/GraphicsSystem.groovy | 2 +- .../opengl/OpenGLMaterialBundler.groovy | 37 +------------------ .../engine/graphics/opengl/OpenGLMesh.groovy | 25 +++++++------ .../graphics/opengl/OpenGLRenderer.groovy | 21 +++++------ .../graphics/opengl/Primitives.vert.glsl | 2 +- .../engine/graphics/opengl/Sprite.vert.glsl | 2 +- .../graphics/pipeline/RenderPipeline.groovy | 4 +- .../graphics/pipeline/Scanlines.vert.glsl | 2 +- .../engine/graphics/pipeline/Screen.vert.glsl | 2 +- .../pipeline/SharpUpscaling.vert.glsl | 2 +- .../nodes/FullScreenContainer.groovy | 2 +- 13 files changed, 62 insertions(+), 74 deletions(-) diff --git a/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/shaders/PalettedSprite.vert.glsl b/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/shaders/PalettedSprite.vert.glsl index 6b41392f..d73ad7fa 100644 --- a/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/shaders/PalettedSprite.vert.glsl +++ b/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/shaders/PalettedSprite.vert.glsl @@ -1,7 +1,7 @@ #version 410 core -in vec4 colour; in vec4 position; +in vec4 colour; in vec2 textureUVs; out vec4 v_vertexColour; 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 a9c326b5..7b6dc133 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 @@ -24,7 +24,6 @@ import org.joml.Matrix4f import org.joml.Vector2f import org.joml.primitives.Rectanglef -import groovy.transform.NamedVariant import groovy.transform.stc.ClosureParams import groovy.transform.stc.SimpleType import java.nio.ByteBuffer @@ -64,6 +63,21 @@ interface GraphicsRenderer extends Closeable, EventTarget { */ Framebuffer createFramebuffer(int width, int height, boolean filter) + /** + * Create a mesh without indices or textureUVs. + * + * @param type + * @param layout + * @param colour + * @param vertices + * @return + */ + default Mesh createMesh(MeshType type, VertexBufferLayout layout, Colour colour, Vector2f[] vertices) { + + return createMesh(type, layout, colour, vertices, null, null) + } + + /** * Create a mesh with all of the mesh parts. * @@ -75,9 +89,7 @@ interface GraphicsRenderer extends Closeable, EventTarget { * @param indices * @return */ - @NamedVariant - Mesh createMesh(MeshType type, VertexBufferLayout layout, Colour colour, Vector2f[] vertices, Vector2f[] textureUVs, - int[] indices) + Mesh createMesh(MeshType type, VertexBufferLayout layout, Colour colour, Vector2f[] vertices, Vector2f[] textureUVs, int[] indices) /** * Create a new shader program from the given configuration, or return the @@ -101,6 +113,18 @@ interface GraphicsRenderer extends Closeable, EventTarget { */ Shader createShader(String name, String vertexShaderSource, String fragmentShaderSource, Uniform... uniforms) + /** + * Create a mesh to represent a surface onto which a texture will go. This is + * a convenience method for {@link #createMesh}. + * + * @param surface + * @return + */ + default Mesh createSpriteMesh(Rectanglef surface) { + + return createSpriteMesh(surface, new Rectanglef(0, 0, 1, 1)) + } + /** * Create a mesh to represent a surface onto which a texture will go. This is * a convenience method for {@link #createMesh}. @@ -109,7 +133,6 @@ interface GraphicsRenderer extends Closeable, EventTarget { * @param textureUVs * @return */ - @NamedVariant Mesh createSpriteMesh(Rectanglef surface, Rectanglef textureUVs) /** 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 da353c27..3dd4577a 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 @@ -161,7 +161,7 @@ class GraphicsSystem extends EngineSystem implements GraphicsRequests { var resource = switch (request) { case ShaderRequest -> renderer.getShader(request.name()) case MeshRequest -> renderer.createMesh(request.type(), request.layout(), request.colour(), request.vertices(), null, request.indices()) - case SpriteMeshRequest -> renderer.createSpriteMesh(surface: request.surface()) + case SpriteMeshRequest -> renderer.createSpriteMesh(request.surface()) case TextureRequest -> renderer.createTexture(request.width(), request.height(), request.format(), request.data()) default -> throw new IllegalArgumentException("Cannot create resource from type ${request}") } diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLMaterialBundler.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLMaterialBundler.groovy index bd929d58..f84b5e5b 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLMaterialBundler.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLMaterialBundler.groovy @@ -16,11 +16,9 @@ package nz.net.ultraq.redhorizon.engine.graphics.opengl -import nz.net.ultraq.redhorizon.engine.graphics.Colour import nz.net.ultraq.redhorizon.engine.graphics.Material import nz.net.ultraq.redhorizon.engine.graphics.MaterialBundler import nz.net.ultraq.redhorizon.engine.graphics.Mesh -import nz.net.ultraq.redhorizon.engine.graphics.MeshType import nz.net.ultraq.redhorizon.engine.graphics.VertexBufferLayout import nz.net.ultraq.redhorizon.engine.graphics.VertexBufferLayoutPart import nz.net.ultraq.redhorizon.events.EventTarget @@ -28,10 +26,7 @@ import nz.net.ultraq.redhorizon.events.EventTarget import org.joml.Matrix4f import org.joml.Vector2f import org.joml.Vector3f -import org.joml.primitives.Rectanglef -import static org.lwjgl.opengl.GL11C.* -import groovy.transform.NamedVariant import groovy.transform.TupleConstructor /** @@ -44,12 +39,12 @@ class OpenGLMaterialBundler implements MaterialBundler, EventTarget { // TODO: Derive the layout from the materials being bundled, not hard-coded in this class private static final VertexBufferLayout VERTEX_BUFFER_LAYOUT = new VertexBufferLayout( - VertexBufferLayoutPart.COLOUR, VertexBufferLayoutPart.POSITION, + VertexBufferLayoutPart.COLOUR, VertexBufferLayoutPart.TEXTURE_UVS ) - @Delegate(excludes = ['createMesh', 'createSpriteMesh']) + @Delegate final OpenGLRenderer renderer // This currently works because meshes and materials are created in pairs, so @@ -101,32 +96,4 @@ class OpenGLMaterialBundler implements MaterialBundler, EventTarget { // return material // } // - @Override - @NamedVariant - Mesh createMesh(MeshType type, VertexBufferLayout layout, Colour colour, Vector2f[] vertices, - Vector2f[] textureUVs = null, int[] indices = null) { - - var mesh = new OpenGLMesh(type == MeshType.LINES ? GL_LINES : type == MeshType.LINE_LOOP ? GL_LINE_LOOP : GL_TRIANGLES, - layout, colour, vertices, textureUVs, indices) - meshes << mesh - return mesh - } - - @Override - @NamedVariant - Mesh createSpriteMesh(Rectanglef surface, Rectanglef textureUVs = new Rectanglef(0, 0, 1, 1)) { - - return createMesh( - type: MeshType.TRIANGLES, - layout: new VertexBufferLayout( - VertexBufferLayoutPart.COLOUR, - VertexBufferLayoutPart.POSITION, - VertexBufferLayoutPart.TEXTURE_UVS - ), - colour: Colour.WHITE, - vertices: surface as Vector2f[], - textureUVs: textureUVs as Vector2f[], - indices: [0, 1, 3, 1, 2, 3] as int[] - ) - } } 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 44844394..46e866e7 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 @@ -1,12 +1,12 @@ -/* +/* * Copyright 2023, Emanuel Rabina (http://www.ultraq.net.nz/) - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -57,13 +57,16 @@ class OpenGLMesh extends Mesh { stackPush().withCloseable { stack -> var vertexBuffer = stack.mallocFloat(layout.size() * vertices.size()) vertices.eachWithIndex { vertex, index -> - vertexBuffer.put( - colour.r, colour.g, colour.b, colour.a, - vertex.x, vertex.y - ) - if (layout.parts.contains(VertexBufferLayoutPart.TEXTURE_UVS)) { - var textureUV = textureUVs[index] - vertexBuffer.put(textureUV.x, textureUV.y) + layout.parts.each { layoutPart -> + switch (layoutPart) { + case VertexBufferLayoutPart.POSITION -> vertexBuffer.put(vertex.x, vertex.y) + case VertexBufferLayoutPart.COLOUR -> vertexBuffer.put(colour.r, colour.g, colour.b, colour.a) + case VertexBufferLayoutPart.TEXTURE_UVS -> { + var textureUV = textureUVs[index] + vertexBuffer.put(textureUV.x, textureUV.y) + } + default -> throw new IllegalArgumentException("Unhandled vertex layout part ${layoutPart.name()}") + } } } vertexBuffer.flip() 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 05182cd1..47908fc8 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 @@ -180,9 +180,7 @@ class OpenGLRenderer implements GraphicsRenderer { } @Override - @NamedVariant - Mesh createMesh(MeshType type, VertexBufferLayout layout, Colour colour, Vector2f[] vertices, - Vector2f[] textureUVs = null, int[] indices = null) { + Mesh createMesh(MeshType type, VertexBufferLayout layout, Colour colour, Vector2f[] vertices, Vector2f[] textureUVs, int[] indices) { var mesh = new OpenGLMesh(type == MeshType.LINES ? GL_LINES : type == MeshType.LINE_LOOP ? GL_LINE_LOOP : GL_TRIANGLES, layout, colour, vertices, textureUVs, indices) @@ -208,20 +206,19 @@ class OpenGLRenderer implements GraphicsRenderer { } @Override - @NamedVariant - Mesh createSpriteMesh(Rectanglef surface, Rectanglef textureUVs = new Rectanglef(0, 0, 1, 1)) { + Mesh createSpriteMesh(Rectanglef surface, Rectanglef textureUVs) { return createMesh( - type: MeshType.TRIANGLES, - layout: new VertexBufferLayout( - VertexBufferLayoutPart.COLOUR, + MeshType.TRIANGLES, + new VertexBufferLayout( VertexBufferLayoutPart.POSITION, + VertexBufferLayoutPart.COLOUR, VertexBufferLayoutPart.TEXTURE_UVS ), - colour: Colour.WHITE, - vertices: surface as Vector2f[], - textureUVs: textureUVs as Vector2f[], - indices: [0, 1, 3, 1, 2, 3] as int[] + Colour.WHITE, + surface as Vector2f[], + textureUVs as Vector2f[], + [0, 1, 3, 1, 2, 3] as int[] ) } diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/Primitives.vert.glsl b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/Primitives.vert.glsl index 2502cf19..744ed9e3 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/Primitives.vert.glsl +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/Primitives.vert.glsl @@ -1,7 +1,7 @@ #version 410 core -in vec4 colour; in vec4 position; +in vec4 colour; out vec4 v_vertexColour; diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/Sprite.vert.glsl b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/Sprite.vert.glsl index 6b41392f..d73ad7fa 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/Sprite.vert.glsl +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/Sprite.vert.glsl @@ -1,7 +1,7 @@ #version 410 core -in vec4 colour; in vec4 position; +in vec4 colour; in vec2 textureUVs; out vec4 v_vertexColour; diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/RenderPipeline.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/RenderPipeline.groovy index e3f99c0e..40602928 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/RenderPipeline.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/RenderPipeline.groovy @@ -80,9 +80,7 @@ class RenderPipeline implements AutoCloseable { this.imGuiLayer = imGuiLayer this.camera = camera - fullScreenQuad = renderer.createSpriteMesh( - surface: new Rectanglef(-1, -1, 1, 1) - ) + fullScreenQuad = renderer.createSpriteMesh(new Rectanglef(-1, -1, 1, 1)) overlayPasses << new ControlsOverlayRenderPass(inputEventStream).toggleWith(inputEventStream, GLFW_KEY_C) diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/Scanlines.vert.glsl b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/Scanlines.vert.glsl index 04a1c40d..e9672b42 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/Scanlines.vert.glsl +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/Scanlines.vert.glsl @@ -2,8 +2,8 @@ #define pi 3.141592654 -in vec4 colour; in vec4 position; +in vec4 colour; in vec2 textureUVs; out vec4 v_vertexColour; diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/Screen.vert.glsl b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/Screen.vert.glsl index 432ef178..4c53f63c 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/Screen.vert.glsl +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/Screen.vert.glsl @@ -1,7 +1,7 @@ #version 410 core -in vec4 colour; in vec4 position; +in vec4 colour; in vec2 textureUVs; out vec4 v_vertexColour; diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/SharpUpscaling.vert.glsl b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/SharpUpscaling.vert.glsl index a73f7222..796ae553 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/SharpUpscaling.vert.glsl +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/SharpUpscaling.vert.glsl @@ -1,7 +1,7 @@ #version 410 core -in vec4 colour; in vec4 position; +in vec4 colour; in vec2 textureUVs; out vec4 v_vertexColour; diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/scenegraph/nodes/FullScreenContainer.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/scenegraph/nodes/FullScreenContainer.groovy index 661ab7d0..87498767 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/scenegraph/nodes/FullScreenContainer.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/scenegraph/nodes/FullScreenContainer.groovy @@ -111,7 +111,7 @@ class FullScreenContainer extends Node implements GraphicsE mesh = scene .requestCreateOrGet(new MeshRequest( MeshType.LINE_LOOP, - new VertexBufferLayout(VertexBufferLayoutPart.COLOUR, VertexBufferLayoutPart.POSITION), + new VertexBufferLayout(VertexBufferLayoutPart.POSITION, VertexBufferLayoutPart.COLOUR), Colour.GREEN, bounds as Vector2f[] ))