diff --git a/src/api/l_graphics.c b/src/api/l_graphics.c index 0fb52a16..89f1af6f 100644 --- a/src/api/l_graphics.c +++ b/src/api/l_graphics.c @@ -132,6 +132,7 @@ StringEntry lovrMaterialColor[] = { StringEntry lovrMaterialScalar[] = { [SCALAR_METALNESS] = ENTRY("metalness"), [SCALAR_ROUGHNESS] = ENTRY("roughness"), + [SCALAR_ALPHA_CUTOFF] = ENTRY("alphacutoff"), { 0 } }; diff --git a/src/modules/data/modelData.h b/src/modules/data/modelData.h index 778f0bec..c58ff547 100644 --- a/src/modules/data/modelData.h +++ b/src/modules/data/modelData.h @@ -58,6 +58,7 @@ typedef struct { typedef enum { SCALAR_METALNESS, SCALAR_ROUGHNESS, + SCALAR_ALPHA_CUTOFF, MAX_MATERIAL_SCALARS } MaterialScalar; diff --git a/src/modules/data/modelData_gltf.c b/src/modules/data/modelData_gltf.c index 2906cf32..a80012d3 100644 --- a/src/modules/data/modelData_gltf.c +++ b/src/modules/data/modelData_gltf.c @@ -688,6 +688,7 @@ ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io for (int i = (token++)->size; i > 0; i--, material++) { material->scalars[SCALAR_METALNESS] = 1.f; material->scalars[SCALAR_ROUGHNESS] = 1.f; + material->scalars[SCALAR_ALPHA_CUTOFF] = 0.f; material->colors[COLOR_DIFFUSE] = (Color) { 1.f, 1.f, 1.f, 1.f }; material->colors[COLOR_EMISSIVE] = (Color) { 0.f, 0.f, 0.f, 0.f }; memset(material->images, 0xff, MAX_MATERIAL_TEXTURES * sizeof(uint32_t)); @@ -729,6 +730,8 @@ ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io material->colors[COLOR_EMISSIVE].r = NOM_FLOAT(json, token); material->colors[COLOR_EMISSIVE].g = NOM_FLOAT(json, token); material->colors[COLOR_EMISSIVE].b = NOM_FLOAT(json, token); + } else if (STR_EQ(key, "alphaCutoff")) { + material->scalars[SCALAR_ALPHA_CUTOFF] = NOM_FLOAT(json, token); } else if (STR_EQ(key, "name")) { gltfString name = NOM_STR(json, token); map_set(&model->materialMap, hash64(name.data, name.length), model->materialCount - i); diff --git a/src/modules/graphics/material.c b/src/modules/graphics/material.c index 439f7938..3bab4239 100644 --- a/src/modules/graphics/material.c +++ b/src/modules/graphics/material.c @@ -21,7 +21,7 @@ Material* lovrMaterialCreate() { material->ref = 1; for (int i = 0; i < MAX_MATERIAL_SCALARS; i++) { - material->scalars[i] = 1.f; + material->scalars[i] = i == SCALAR_ALPHA_CUTOFF ? 0.f : 1.f; } for (int i = 0; i < MAX_MATERIAL_COLORS; i++) { diff --git a/src/resources/shaders.c b/src/resources/shaders.c index 12cadfca..2b332971 100644 --- a/src/resources/shaders.c +++ b/src/resources/shaders.c @@ -87,6 +87,7 @@ const char* lovrShaderFragmentPrefix = "" "out vec4 lovrCanvas[gl_MaxDrawBuffers]; \n" "uniform float lovrMetalness; \n" "uniform float lovrRoughness; \n" +"uniform float lovrAlphaCutoff; \n" "uniform vec4 lovrDiffuseColor; \n" "uniform vec4 lovrEmissiveColor; \n" "uniform sampler2D lovrDiffuseTexture; \n" @@ -124,7 +125,7 @@ const char* lovrShaderFragmentSuffix = "" "#else \n" " lovrCanvas[0] = color(lovrGraphicsColor, lovrDiffuseTexture, lovrTexCoord); \n" "#ifdef FLAG_alphaCutoff \n" -" if (lovrCanvas[0].a < FLAG_alphaCutoff) { \n" +" if (lovrCanvas[0].a < lovrAlphaCutoff) { \n" " discard; \n" " } \n" "#endif \n" @@ -372,7 +373,8 @@ const char* lovrFillVertexShader = "" const char* lovrShaderScalarUniforms[] = { "lovrMetalness", - "lovrRoughness" + "lovrRoughness", + "lovrAlphaCutoff" }; const char* lovrShaderColorUniforms[] = {