Something is materializing

- Add flw_material struct to the shader api.
- Initialized by the pipeline.
This commit is contained in:
Jozufozu 2023-12-01 13:51:34 -08:00
parent 31ee65de30
commit df49b1f25c
13 changed files with 97 additions and 68 deletions

View file

@ -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;

View file

@ -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;
};

View file

@ -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();

View file

@ -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;
// ------------------------------------------

View file

@ -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);

View file

@ -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();

View file

@ -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();

View file

@ -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;

View file

@ -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();

View file

@ -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();

View file

@ -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();

View file

@ -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;
}

View file

@ -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;
}