Skip to content

Commit

Permalink
Start extracting transform property from material
Browse files Browse the repository at this point in the history
  • Loading branch information
ultraq committed Feb 6, 2024
1 parent 475dab3 commit ec74ea0
Show file tree
Hide file tree
Showing 14 changed files with 56 additions and 113 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@

package nz.net.ultraq.redhorizon.classic.shaders

import nz.net.ultraq.redhorizon.engine.graphics.Material
import nz.net.ultraq.redhorizon.engine.graphics.Shader
import nz.net.ultraq.redhorizon.engine.graphics.ShaderConfig
import nz.net.ultraq.redhorizon.engine.graphics.Window

/**
* A 2D sprite shader for palette-based sprites.
Expand All @@ -34,17 +31,14 @@ class PalettedSpriteShader extends ShaderConfig {
'PalettedSprite',
'nz/net/ultraq/redhorizon/classic/shaders/PalettedSprite.vert.glsl',
'nz/net/ultraq/redhorizon/classic/shaders/PalettedSprite.frag.glsl',
{ Shader shader, Material material, Window window ->
{ shader, material, window ->
shader.setUniformTexture('indexTexture', 0, material.texture)
},
{ Shader shader, Material material, Window window ->
{ shader, material, window ->
shader.setUniformTexture('paletteTexture', 1, material.palette)
},
{ Shader shader, Material material, Window window ->
{ shader, material, window ->
shader.setUniform('factionColours', material.faction.colours)
},
{ Shader shader, Material material, Window window ->
shader.setUniform('model', material.transform)
}
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,18 +64,6 @@ interface GraphicsRenderer extends Closeable, EventTarget {
*/
Framebuffer createFramebuffer(int width, int height, boolean filter)

/**
* Create a material out of the given component parts.
*
* @param mesh
* @param texture
* @param shader
* @param transform
* @return
*/
@NamedVariant
Material createMaterial(Texture texture, Matrix4f transform)

/**
* Create a mesh with all of the mesh parts.
*
Expand Down Expand Up @@ -142,13 +130,6 @@ interface GraphicsRenderer extends Closeable, EventTarget {
*/
void deleteFramebuffer(Framebuffer framebuffer)

/**
* Delete all of the items tied to the material.
*
* @param material
*/
void deleteMaterial(Material material)

/**
* Delete mesh data.
*
Expand All @@ -163,15 +144,24 @@ interface GraphicsRenderer extends Closeable, EventTarget {
*/
void deleteTexture(Texture texture)

/**
* Draw a mesh using the given shader.
*
* @param mesh
* @param transform
* @param shader
*/
void draw(Mesh mesh, Matrix4f transform, Shader shader)

/**
* Draw a mesh using a shader and material to configure the shader.
*
* @param mesh
* @param transform
* @param shader
* @param material
*/
@NamedVariant
void draw(Mesh mesh, Shader shader, Material material)
void draw(Mesh mesh, Matrix4f transform, Shader shader, Material material)

/**
* Return the maximum size that any dimension of a texture can be for the
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,16 @@

package nz.net.ultraq.redhorizon.engine.graphics

import org.joml.Matrix4f

import groovy.transform.TupleConstructor

/**
* A material defines how a shape should be rendered. A {@link Mesh} already
* covers the shape part, so a material covers the uniform values that go into
* configuring a shader. These values are stored as a general-purpose
* {@code Map}, with extensions used to simplify access to that map.
* A material defines special properties to how a shape should be rendered.
* These are often uniform values that go into configuring a shader, stored as a
* general-purpose {@code Map}, with extensions used to simplify access to that
* map.
*
* @author Emanuel Rabina
*/
@TupleConstructor(includes = ['texture', 'transform'])
class Material implements GraphicsResource {
class Material {

final Map<String, Object> attributes = [:]
Texture texture
Matrix4f transform

@Override
void close() {

texture?.close()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,18 @@ import groovy.transform.TupleConstructor
@TupleConstructor
abstract class Shader implements GraphicsResource {

static final String UNIFORM_MODEL = 'model'

final String name
final Uniform[] uniforms

/**
* Update a shader's uniforms using the given material and window context.
* Update a shader's uniforms using the given context.
*/
void applyMaterial(Material material, Window window) {
void applyUniforms(Matrix4f transform, Material material, Window window) {

// Model uniform is universal, so bake this here
setUniform(UNIFORM_MODEL, transform)

uniforms*.apply(this, material, window)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@ package nz.net.ultraq.redhorizon.engine.graphics
*/
class ShaderConfig {

static final String UNIFORM_MODEL = 'model'

final String name
final String vertexShaderSource
final String fragmentShaderSource
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
/*
/*
* Copyright 2021, 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 All @@ -21,7 +21,6 @@ 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.Texture
import nz.net.ultraq.redhorizon.engine.graphics.VertexBufferLayout
import nz.net.ultraq.redhorizon.engine.graphics.VertexBufferLayoutPart
import nz.net.ultraq.redhorizon.events.EventTarget
Expand Down Expand Up @@ -50,7 +49,7 @@ class OpenGLMaterialBundler implements MaterialBundler, EventTarget {
VertexBufferLayoutPart.TEXTURE_UVS
)

@Delegate(excludes = ['createMaterial', 'createMesh', 'createSpriteMesh'])
@Delegate(excludes = ['createMesh', 'createSpriteMesh'])
final OpenGLRenderer renderer

// This currently works because meshes and materials are created in pairs, so
Expand Down Expand Up @@ -93,15 +92,15 @@ class OpenGLMaterialBundler implements MaterialBundler, EventTarget {
return new Tuple2<>(mesh, material)
}

@Override
@NamedVariant
Material createMaterial(Texture texture = null, Matrix4f transform = null) {

var material = new Material(texture, transform)
materials << material
return material
}

// @Override
// @NamedVariant
// Material createMaterial(Texture texture = null, Matrix4f transform = null) {
//
// var material = new Material(texture, transform)
// materials << material
// return material
// }
//
@Override
@NamedVariant
Mesh createMesh(MeshType type, VertexBufferLayout layout, Colour colour, Vector2f[] vertices,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,13 +179,6 @@ class OpenGLRenderer implements GraphicsRenderer {
return framebuffer
}

@Override
@NamedVariant
Material createMaterial(Texture texture = null, Matrix4f transform = new Matrix4f()) {

return new Material(texture, transform)
}

@Override
@NamedVariant
Mesh createMesh(MeshType type, VertexBufferLayout layout, Colour colour, Vector2f[] vertices,
Expand Down Expand Up @@ -249,12 +242,6 @@ class OpenGLRenderer implements GraphicsRenderer {
}
}

@Override
void deleteMaterial(Material material) {

material?.close()
}

@Override
void deleteMesh(Mesh mesh) {

Expand All @@ -275,12 +262,12 @@ class OpenGLRenderer implements GraphicsRenderer {

@Override
@NamedVariant
void draw(Mesh mesh, Shader shader, Material material = null) {
void draw(Mesh mesh, Matrix4f transform, Shader shader, Material material = null) {

averageNanos('draw', 1f, logger) { ->
shader.use()
if (material) {
shader.applyMaterial(material, window)
shader.applyUniforms(transform, material, window)
}

mesh.bind()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,6 @@ class SpriteShader extends ShaderConfig {
'nz/net/ultraq/redhorizon/engine/graphics/opengl/Sprite.frag.glsl',
{ shader, material, window ->
shader.setUniformTexture(UNIFORM_MAIN_TEXTURE, 0, material.texture)
},
{ shader, material, window ->
shader.setUniform(UNIFORM_MODEL, material.transform)
}
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,6 @@ class RenderPipeline implements AutoCloseable {
// Sharp upscaling post-processing pass
renderPasses << new PostProcessingRenderPass(
renderer.createFramebuffer(window.targetResolution, false),
renderer.createMaterial(),
renderer.createShader(new SharpUpscalingShader()),
true
)
Expand All @@ -139,7 +138,6 @@ class RenderPipeline implements AutoCloseable {
// Scanline post-processing pass
renderPasses << new PostProcessingRenderPass(
renderer.createFramebuffer(window.targetResolution, false),
renderer.createMaterial(),
renderer.createShader(new ScanlinesShader()),
config.scanlines
)
Expand All @@ -149,7 +147,6 @@ class RenderPipeline implements AutoCloseable {

// Final pass to emit the result to the screen
renderPasses << new ScreenRenderPass(
renderer.createMaterial(),
renderer.createShader(new ScreenShader()),
!config.startWithChrome,
window
Expand Down Expand Up @@ -234,14 +231,14 @@ class RenderPipeline implements AutoCloseable {
*/
private class PostProcessingRenderPass implements RenderPass<Framebuffer> {

final Matrix4f transform = new Matrix4f()
final Material material = new Material()
final Framebuffer framebuffer
final Material material
final Shader shader

PostProcessingRenderPass(Framebuffer framebuffer, Material material, Shader shader, boolean enabled) {
PostProcessingRenderPass(Framebuffer framebuffer, Shader shader, boolean enabled) {

this.framebuffer = framebuffer
this.material = material
this.shader = shader
this.enabled = enabled
}
Expand All @@ -250,14 +247,13 @@ class RenderPipeline implements AutoCloseable {
void delete(GraphicsRenderer renderer) {

renderer.deleteFramebuffer(framebuffer)
renderer.deleteMaterial(material)
}

@Override
void render(GraphicsRenderer renderer, Framebuffer previous) {

material.texture = previous.texture
renderer.draw(fullScreenQuad, shader, material)
renderer.draw(fullScreenQuad, transform, shader, material)
}
}

Expand All @@ -268,27 +264,26 @@ class RenderPipeline implements AutoCloseable {
private class ScreenRenderPass implements RenderPass<Framebuffer> {

final Framebuffer framebuffer = null
final Material material
final Matrix4f transform = new Matrix4f()
final Material material = new Material()
final Shader shader

/**
* Constructor, create a basic material that covers the screen yet responds
* to changes in output/window resolution.
*
* @param material
* @param shader
* @param enabled
* @param window
*/
ScreenRenderPass(Material material, Shader shader, boolean enabled, Window window) {
ScreenRenderPass(Shader shader, boolean enabled, Window window) {

this.material = material
this.shader = shader
this.enabled = enabled

material.transform.set(calculateScreenModelMatrix(window.framebufferSize, window.targetResolution))
transform.set(calculateScreenModelMatrix(window.framebufferSize, window.targetResolution))
window.on(FramebufferSizeEvent) { event ->
material.transform.set(calculateScreenModelMatrix(event.framebufferSize, event.targetResolution))
transform.set(calculateScreenModelMatrix(event.framebufferSize, event.targetResolution))
}
}

Expand Down Expand Up @@ -317,15 +312,13 @@ class RenderPipeline implements AutoCloseable {

@Override
void delete(GraphicsRenderer renderer) {

renderer.deleteMaterial(material)
}

@Override
void render(GraphicsRenderer renderer, Framebuffer previous) {

material.texture = previous.texture
renderer.draw(fullScreenQuad, shader, material)
renderer.draw(fullScreenQuad, transform, shader, material)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ class ScanlinesShader extends ShaderConfig {
'nz/net/ultraq/redhorizon/engine/graphics/pipeline/Scanlines.vert.glsl',
'nz/net/ultraq/redhorizon/engine/graphics/pipeline/Scanlines.frag.glsl',
Uniforms.framebufferUniform,
Uniforms.modelUniform,
{ shader, material, window ->
def scale = window.renderResolution.height / window.targetResolution.height / 2 as float
shader.setUniform('textureSourceSize', window.renderResolution * scale as float[])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ class ScreenShader extends ShaderConfig {
'Screen',
'nz/net/ultraq/redhorizon/engine/graphics/pipeline/Screen.vert.glsl',
'nz/net/ultraq/redhorizon/engine/graphics/pipeline/Screen.frag.glsl',
Uniforms.framebufferUniform,
Uniforms.modelUniform
Uniforms.framebufferUniform
)
}
}
Loading

0 comments on commit ec74ea0

Please sign in to comment.