From df49b1f25ce7bab6a51f2cdf6f8c3a9d26fcd1b1 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 1 Dec 2023 13:51:34 -0800 Subject: [PATCH] Something is materializing - Add flw_material struct to the shader api. - Initialized by the pipeline. --- .../flywheel/flywheel/api/fragment.glsl | 4 ++ .../flywheel/flywheel/api/material.glsl | 32 ++++++++++ .../assets/flywheel/flywheel/api/vertex.glsl | 4 ++ .../internal/indirect/api/fragment.glsl | 5 +- .../internal/indirect/api/vertex.glsl | 5 +- .../flywheel/internal/indirect/draw.frag | 4 +- .../flywheel/internal/indirect/draw.vert | 6 +- .../internal/instancing/api/fragment.glsl | 5 +- .../internal/instancing/api/vertex.glsl | 5 +- .../flywheel/internal/instancing/draw.frag | 4 +- .../flywheel/internal/instancing/draw.vert | 4 +- .../flywheel/flywheel/internal/material.glsl | 28 +++++++++ .../flywheel/flywheel/util/material.glsl | 59 ------------------- 13 files changed, 97 insertions(+), 68 deletions(-) create mode 100644 src/main/resources/assets/flywheel/flywheel/api/material.glsl create mode 100644 src/main/resources/assets/flywheel/flywheel/internal/material.glsl delete mode 100644 src/main/resources/assets/flywheel/flywheel/util/material.glsl diff --git a/src/main/resources/assets/flywheel/flywheel/api/fragment.glsl b/src/main/resources/assets/flywheel/flywheel/api/fragment.glsl index 4e0ec60a3..586d9650b 100644 --- a/src/main/resources/assets/flywheel/flywheel/api/fragment.glsl +++ b/src/main/resources/assets/flywheel/flywheel/api/fragment.glsl @@ -1,3 +1,5 @@ +#include "flywheel:api/material.glsl" + /*const*/ vec4 flw_vertexPos; /*const*/ vec4 flw_vertexColor; /*const*/ vec2 flw_vertexTexCoord; @@ -14,6 +16,8 @@ /*const*/ vec4 flw_sampleColor; +/*const*/ FlwMaterial flw_material; + vec4 flw_fragColor; ivec2 flw_fragOverlay; vec2 flw_fragLight; diff --git a/src/main/resources/assets/flywheel/flywheel/api/material.glsl b/src/main/resources/assets/flywheel/flywheel/api/material.glsl new file mode 100644 index 000000000..bd338d490 --- /dev/null +++ b/src/main/resources/assets/flywheel/flywheel/api/material.glsl @@ -0,0 +1,32 @@ +const uint FLW_FOG_LINEAR = 0u; +const uint FLW_FOG_LINEAR_FADE = 1u; +const uint FLW_FOG_NONE = 2u; + +const uint FLW_TRANSPARENCY_OPAQUE = 0u; +const uint FLW_TRANSPARENCY_ADDITIVE = 1u; +const uint FLW_TRANSPARENCY_LIGHTING = 2u; +const uint FLW_TRANSPARENCY_GLINT = 3u; +const uint FLW_TRANSPARENCY_CRUMBLING = 4u; +const uint FLW_TRANSPARENCY_TRANSLUCENT = 5u; + +const uint FLW_CUTOUT_OFF = 0u; +const uint FLW_CUTOUT_EPSILON = 1u; +const uint FLW_CUTOUT_HALF = 2u; + +const uint FLW_WRITE_MASK_BOTH = 0u; +const uint FLW_WRITE_MASK_COLOR = 1u; +const uint FLW_WRITE_MASK_DEPTH = 2u; + +struct FlwMaterial { + bool diffuse; + bool lighting; + bool blur; + bool backfaceCull; + bool polygonOffset; + bool mip; + + uint fog; + uint transparency; + uint cutout; + uint writeMask; +}; diff --git a/src/main/resources/assets/flywheel/flywheel/api/vertex.glsl b/src/main/resources/assets/flywheel/flywheel/api/vertex.glsl index 6c6d96834..fc3924c01 100644 --- a/src/main/resources/assets/flywheel/flywheel/api/vertex.glsl +++ b/src/main/resources/assets/flywheel/flywheel/api/vertex.glsl @@ -1,3 +1,5 @@ +#include "flywheel:api/material.glsl" + vec4 flw_vertexPos; vec4 flw_vertexColor; vec2 flw_vertexTexCoord; @@ -12,6 +14,8 @@ vec4 flw_var1; vec4 flw_var2; vec4 flw_var3; +/*const*/ FlwMaterial flw_material; + // To be implemented by the layout shader. void flw_layoutVertex(); diff --git a/src/main/resources/assets/flywheel/flywheel/internal/indirect/api/fragment.glsl b/src/main/resources/assets/flywheel/flywheel/internal/indirect/api/fragment.glsl index 707383754..45573db55 100644 --- a/src/main/resources/assets/flywheel/flywheel/internal/indirect/api/fragment.glsl +++ b/src/main/resources/assets/flywheel/flywheel/internal/indirect/api/fragment.glsl @@ -1,6 +1,8 @@ // API // ------------------------------------------ +#include "flywheel:api/material.glsl" + in vec4 flw_vertexPos; in vec4 flw_vertexColor; in vec2 flw_vertexTexCoord; @@ -21,6 +23,8 @@ vec4 flw_fragColor; ivec2 flw_fragOverlay; vec2 flw_fragLight; +FlwMaterial flw_material; + vec4 flw_fogFilter(vec4 color); bool flw_discardPredicate(vec4 finalColor); @@ -34,6 +38,5 @@ void flw_contextFragment(); // ------------------------------------------ uint _flw_materialFragmentID; -uint _flw_packedMaterialProperties; // ------------------------------------------ diff --git a/src/main/resources/assets/flywheel/flywheel/internal/indirect/api/vertex.glsl b/src/main/resources/assets/flywheel/flywheel/internal/indirect/api/vertex.glsl index 236f82666..e1dc35403 100644 --- a/src/main/resources/assets/flywheel/flywheel/internal/indirect/api/vertex.glsl +++ b/src/main/resources/assets/flywheel/flywheel/internal/indirect/api/vertex.glsl @@ -1,6 +1,8 @@ // API // ------------------------------------------ +#include "flywheel:api/material.glsl" + out vec4 flw_vertexPos; out vec4 flw_vertexColor; out vec2 flw_vertexTexCoord; @@ -15,6 +17,8 @@ out vec4 flw_var1; out vec4 flw_var2; out vec4 flw_var3; +FlwMaterial flw_material; + void flw_layoutVertex(); void flw_initVertex(); void flw_instanceVertex(FlwInstance i); @@ -27,7 +31,6 @@ void flw_contextVertex(); uint _flw_materialVertexID; uint _flw_materialFragmentID; -uint _flw_packedMaterialProperties; FlwInstance _flw_unpackInstance(FlwPackedInstance i); diff --git a/src/main/resources/assets/flywheel/flywheel/internal/indirect/draw.frag b/src/main/resources/assets/flywheel/flywheel/internal/indirect/draw.frag index c1b735732..8a6f93d99 100644 --- a/src/main/resources/assets/flywheel/flywheel/internal/indirect/draw.frag +++ b/src/main/resources/assets/flywheel/flywheel/internal/indirect/draw.frag @@ -1,10 +1,12 @@ #include "flywheel:internal/indirect/api/fragment.glsl" +#include "flywheel:internal/material.glsl" flat in uvec2 _flw_material; void main() { _flw_materialFragmentID = _flw_material.x; - _flw_packedMaterialProperties = _flw_material.y; + + _flw_unpackMaterial(_flw_material.y, flw_material); flw_initFragment(); flw_materialFragment(); diff --git a/src/main/resources/assets/flywheel/flywheel/internal/indirect/draw.vert b/src/main/resources/assets/flywheel/flywheel/internal/indirect/draw.vert index 006ee3370..1abe66d1f 100644 --- a/src/main/resources/assets/flywheel/flywheel/internal/indirect/draw.vert +++ b/src/main/resources/assets/flywheel/flywheel/internal/indirect/draw.vert @@ -1,5 +1,6 @@ #include "flywheel:internal/indirect/api/vertex.glsl" #include "flywheel:internal/indirect/mesh.glsl" +#include "flywheel:internal/material.glsl" flat out uvec2 _flw_material; @@ -27,9 +28,10 @@ void main() { _flw_materialVertexID = drawCommands[batchID].vertexMaterialID; _flw_materialFragmentID = drawCommands[batchID].fragmentMaterialID; - _flw_packedMaterialProperties = drawCommands[batchID].packedMaterialProperties; + uint p = drawCommands[batchID].packedMaterialProperties; - _flw_material = uvec2(_flw_materialFragmentID, _flw_packedMaterialProperties); + _flw_unpackMaterial(p, flw_material); + _flw_material = uvec2(_flw_materialFragmentID, p); flw_layoutVertex(); flw_initVertex(); diff --git a/src/main/resources/assets/flywheel/flywheel/internal/instancing/api/fragment.glsl b/src/main/resources/assets/flywheel/flywheel/internal/instancing/api/fragment.glsl index 796891579..6efbbabb9 100644 --- a/src/main/resources/assets/flywheel/flywheel/internal/instancing/api/fragment.glsl +++ b/src/main/resources/assets/flywheel/flywheel/internal/instancing/api/fragment.glsl @@ -1,5 +1,7 @@ // API // ----------------------------------------- +#include "flywheel:api/material.glsl" + in vec4 flw_vertexPos; in vec4 flw_vertexColor; in vec2 flw_vertexTexCoord; @@ -20,6 +22,8 @@ vec4 flw_fragColor; ivec2 flw_fragOverlay; vec2 flw_fragLight; +FlwMaterial flw_material; + vec4 flw_fogFilter(vec4 color); bool flw_discardPredicate(vec4 finalColor); @@ -34,7 +38,6 @@ void flw_contextFragment(); uint _flw_materialVertexID; uint _flw_materialFragmentID; -uint _flw_packedMaterialProperties; uniform uvec3 _flw_material_instancing; diff --git a/src/main/resources/assets/flywheel/flywheel/internal/instancing/api/vertex.glsl b/src/main/resources/assets/flywheel/flywheel/internal/instancing/api/vertex.glsl index 5f56bf704..32749d0ba 100644 --- a/src/main/resources/assets/flywheel/flywheel/internal/instancing/api/vertex.glsl +++ b/src/main/resources/assets/flywheel/flywheel/internal/instancing/api/vertex.glsl @@ -1,5 +1,7 @@ // API // ------------------------------------ +#include "flywheel:api/material.glsl" + out vec4 flw_vertexPos; out vec4 flw_vertexColor; out vec2 flw_vertexTexCoord; @@ -14,6 +16,8 @@ out vec4 flw_var1; out vec4 flw_var2; out vec4 flw_var3; +FlwMaterial flw_material; + void flw_layoutVertex(); void flw_initVertex(); void flw_instanceVertex(FlwInstance i); @@ -26,7 +30,6 @@ void flw_contextVertex(); uint _flw_materialVertexID; uint _flw_materialFragmentID; -uint _flw_packedMaterialProperties; FlwInstance _flw_unpackInstance(); diff --git a/src/main/resources/assets/flywheel/flywheel/internal/instancing/draw.frag b/src/main/resources/assets/flywheel/flywheel/internal/instancing/draw.frag index 0432299f3..4e7d38e91 100644 --- a/src/main/resources/assets/flywheel/flywheel/internal/instancing/draw.frag +++ b/src/main/resources/assets/flywheel/flywheel/internal/instancing/draw.frag @@ -1,9 +1,11 @@ #include "flywheel:internal/instancing/api/fragment.glsl" +#include "flywheel:internal/material.glsl" void main() { _flw_materialVertexID = _flw_material_instancing.x; _flw_materialFragmentID = _flw_material_instancing.y; - _flw_packedMaterialProperties = _flw_material_instancing.z; + + _flw_unpackMaterial(_flw_material_instancing.z, flw_material); flw_initFragment(); flw_materialFragment(); diff --git a/src/main/resources/assets/flywheel/flywheel/internal/instancing/draw.vert b/src/main/resources/assets/flywheel/flywheel/internal/instancing/draw.vert index 21923825e..2290a60fd 100644 --- a/src/main/resources/assets/flywheel/flywheel/internal/instancing/draw.vert +++ b/src/main/resources/assets/flywheel/flywheel/internal/instancing/draw.vert @@ -1,9 +1,11 @@ #include "flywheel:internal/instancing/api/vertex.glsl" +#include "flywheel:internal/material.glsl" void main() { _flw_materialVertexID = _flw_material_instancing.x; _flw_materialFragmentID = _flw_material_instancing.y; - _flw_packedMaterialProperties = _flw_material_instancing.z; + + _flw_unpackMaterial(_flw_material_instancing.z, flw_material); FlwInstance i = _flw_unpackInstance(); diff --git a/src/main/resources/assets/flywheel/flywheel/internal/material.glsl b/src/main/resources/assets/flywheel/flywheel/internal/material.glsl new file mode 100644 index 000000000..6985149cb --- /dev/null +++ b/src/main/resources/assets/flywheel/flywheel/internal/material.glsl @@ -0,0 +1,28 @@ +#include "flywheel:api/material.glsl" + +// Packed format: +// writeMask[2] | cutout[2] | transparency[3] | fog[2] | mip[1] | polygonOffset[1] | backfaceCull[1] | blur[1] | lighting[1] | diffuse[1] + +const uint DIFFUSE_MASK = 1u; +const uint LIGHTING_MASK = 1u << 1u; +const uint BLUR_MASK = 1u << 2u; +const uint BACKFACE_CULL_MASK = 1u << 3u; +const uint POLYGON_OFFSET_MASK = 1u << 4u; +const uint MIP_MASK = 1u << 5u; +const uint FOG_MASK = 3u << 6u; +const uint TRANSPARENCY_MASK = 7u << 8u; +const uint CUTOUT_MASK = 3u << 11u; +const uint WRITE_MASK_MASK = 3u << 13u; + +void _flw_unpackMaterial(uint m, out FlwMaterial o) { + o.diffuse = (m & DIFFUSE_MASK) != 0u; + o.lighting = (m & LIGHTING_MASK) != 0u; + o.blur = (m & BLUR_MASK) != 0u; + o.backfaceCull = (m & BACKFACE_CULL_MASK) != 0u; + o.polygonOffset = (m & POLYGON_OFFSET_MASK) != 0u; + o.mip = (m & MIP_MASK) != 0u; + o.fog = (m & FOG_MASK) >> 6; + o.transparency = (m & TRANSPARENCY_MASK) >> 8; + o.cutout = (m & CUTOUT_MASK) >> 11; + o.writeMask = (m & WRITE_MASK_MASK) >> 13; +} diff --git a/src/main/resources/assets/flywheel/flywheel/util/material.glsl b/src/main/resources/assets/flywheel/flywheel/util/material.glsl deleted file mode 100644 index 2eed067bb..000000000 --- a/src/main/resources/assets/flywheel/flywheel/util/material.glsl +++ /dev/null @@ -1,59 +0,0 @@ -const uint LINEAR = 0; -const uint LINEAR_FADE = 1; -const uint NONE = 2; - -const uint OPAQUE_TRANSPARENCY = 0; -const uint ADDITIVE_TRANSPARENCY = 1; -const uint LIGHTING_TRANSPARENCY = 2; -const uint GLINT_TRANSPARENCY = 3; -const uint CRUMBLING_TRANSPARENCY = 4; -const uint TRANSLUCENT_TRANSPARENCY = 5; - -const uint CUTOUT_OFF = 0; -const uint CUTOUT_EPSILON = 1; -const uint CUTOUT_HALF = 2; - -const uint WRITE_MASK_BOTH = 0; -const uint WRITE_MASK_COLOR = 1; -const uint WRITE_MASK_DEPTH = 2; - -struct Material { - bool diffuse; - bool lighting; - bool blur; - bool backfaceCull; - bool polygonOffset; - bool mip; - - uint fog; - uint transparency; - uint cutout; - uint writeMask; -}; - -// Packed format: -// writeMask[2] | cutout[2] | transparency[3] | fog[2] | mip[1] | polygonOffset[1] | backfaceCull[1] | blur[1] | lighting[1] | diffuse[1] - -const uint DIFFUSE_MASK = 1; -const uint LIGHTING_MASK = 1 << 1; -const uint BLUR_MASK = 1 << 2; -const uint BACKFACE_CULL_MASK = 1 << 3; -const uint POLYGON_OFFSET_MASK = 1 << 4; -const uint MIP_MASK = 1 << 5; -const uint FOG_MASK = 3 << 6; -const uint TRANSPARENCY_MASK = 7 << 8; -const uint CUTOUT_MASK = 3 << 11; -const uint WRITE_MASK_MASK = 3 << 13; - -void unpackMaterial(uint m, out Material o) { - o.diffuse = (m & DIFFUSE_MASK) != 0; - o.lighting = (m & LIGHTING_MASK) != 0; - o.blur = (m & BLUR_MASK) != 0; - o.backfaceCull = (m & BACKFACE_CULL_MASK) != 0; - o.polygonOffset = (m & POLYGON_OFFSET_MASK) != 0; - o.mip = (m & MIP_MASK) != 0; - o.fog = (m & FOG_MASK) >> 6; - o.transparency = (m & TRANSPARENCY_MASK) >> 8; - o.cutout = (m & CUTOUT_MASK) >> 11; - o.writeMask = (m & WRITE_MASK_MASK) >> 13; -}