Skip to content

Commit

Permalink
Reorganize vertex attribute layout
Browse files Browse the repository at this point in the history
  • Loading branch information
ultraq committed Feb 10, 2024
1 parent 6dbc370 commit 5e19c8f
Show file tree
Hide file tree
Showing 13 changed files with 61 additions and 74 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#version 410 core

in vec4 colour;
in vec4 position;
in vec4 colour;
in vec2 textureUVs;

out vec4 v_vertexColour;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
*
Expand All @@ -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
Expand All @@ -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}.
Expand All @@ -109,7 +133,6 @@ interface GraphicsRenderer extends Closeable, EventTarget {
* @param textureUVs
* @return
*/
@NamedVariant
Mesh createSpriteMesh(Rectanglef surface, Rectanglef textureUVs)

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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}")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,17 @@

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

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

/**
Expand All @@ -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
Expand Down Expand Up @@ -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[]
)
}
}
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -57,13 +57,15 @@ 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)
}
}
}
}
vertexBuffer.flip()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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[]
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#version 410 core

in vec4 colour;
in vec4 position;
in vec4 colour;

out vec4 v_vertexColour;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#version 410 core

in vec4 colour;
in vec4 position;
in vec4 colour;
in vec2 textureUVs;

out vec4 v_vertexColour;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

#define pi 3.141592654

in vec4 colour;
in vec4 position;
in vec4 colour;
in vec2 textureUVs;

out vec4 v_vertexColour;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#version 410 core

in vec4 colour;
in vec4 position;
in vec4 colour;
in vec2 textureUVs;

out vec4 v_vertexColour;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#version 410 core

in vec4 colour;
in vec4 position;
in vec4 colour;
in vec2 textureUVs;

out vec4 v_vertexColour;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ class FullScreenContainer extends Node<FullScreenContainer> 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[]
))
Expand Down

0 comments on commit 5e19c8f

Please sign in to comment.