Skip to content

Commit f0685a7

Browse files
authored
Merge pull request #120 from prideout/master
Add support for KHR_materials_transmission.
2 parents 10e9606 + ed7195b commit f0685a7

File tree

3 files changed

+72
-1
lines changed

3 files changed

+72
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ cgltf also supports some glTF extensions:
104104
- KHR_draco_mesh_compression (requires a library like [Google's Draco](https://github.com/google/draco) for decompression though)
105105
- KHR_lights_punctual
106106
- KHR_materials_clearcoat
107+
- KHR_materials_transmission
107108
- KHR_materials_pbrSpecularGlossiness
108109
- KHR_materials_unlit
109110
- KHR_texture_transform

cgltf.h

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,15 +397,23 @@ typedef struct cgltf_clearcoat
397397
cgltf_float clearcoat_roughness_factor;
398398
} cgltf_clearcoat;
399399

400+
typedef struct cgltf_transmission
401+
{
402+
cgltf_texture_view transmission_texture;
403+
cgltf_float transmission_factor;
404+
} cgltf_transmission;
405+
400406
typedef struct cgltf_material
401407
{
402408
char* name;
403409
cgltf_bool has_pbr_metallic_roughness;
404410
cgltf_bool has_pbr_specular_glossiness;
405411
cgltf_bool has_clearcoat;
412+
cgltf_bool has_transmission;
406413
cgltf_pbr_metallic_roughness pbr_metallic_roughness;
407414
cgltf_pbr_specular_glossiness pbr_specular_glossiness;
408415
cgltf_clearcoat clearcoat;
416+
cgltf_transmission transmission;
409417
cgltf_texture_view normal_texture;
410418
cgltf_texture_view occlusion_texture;
411419
cgltf_texture_view emissive_texture;
@@ -1646,6 +1654,10 @@ void cgltf_free(cgltf_data* data)
16461654
cgltf_free_extensions(data, data->materials[i].clearcoat.clearcoat_roughness_texture.extensions, data->materials[i].clearcoat.clearcoat_roughness_texture.extensions_count);
16471655
cgltf_free_extensions(data, data->materials[i].clearcoat.clearcoat_normal_texture.extensions, data->materials[i].clearcoat.clearcoat_normal_texture.extensions_count);
16481656
}
1657+
if(data->materials[i].has_transmission)
1658+
{
1659+
cgltf_free_extensions(data, data->materials[i].transmission.transmission_texture.extensions, data->materials[i].transmission.transmission_texture.extensions_count);
1660+
}
16491661

16501662
cgltf_free_extensions(data, data->materials[i].normal_texture.extensions, data->materials[i].normal_texture.extensions_count);
16511663
cgltf_free_extensions(data, data->materials[i].occlusion_texture.extensions, data->materials[i].occlusion_texture.extensions_count);
@@ -3263,6 +3275,40 @@ static int cgltf_parse_json_clearcoat(cgltf_options* options, jsmntok_t const* t
32633275
return i;
32643276
}
32653277

3278+
static int cgltf_parse_json_transmission(cgltf_options* options, jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_transmission* out_transmission)
3279+
{
3280+
CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3281+
int size = tokens[i].size;
3282+
++i;
3283+
3284+
for (int j = 0; j < size; ++j)
3285+
{
3286+
CGLTF_CHECK_KEY(tokens[i]);
3287+
3288+
if (cgltf_json_strcmp(tokens+i, json_chunk, "transmissionFactor") == 0)
3289+
{
3290+
++i;
3291+
out_transmission->transmission_factor = cgltf_json_to_float(tokens + i, json_chunk);
3292+
++i;
3293+
}
3294+
else if (cgltf_json_strcmp(tokens+i, json_chunk, "transmissionTexture") == 0)
3295+
{
3296+
i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_transmission->transmission_texture);
3297+
}
3298+
else
3299+
{
3300+
i = cgltf_skip_json(tokens, i+1);
3301+
}
3302+
3303+
if (i < 0)
3304+
{
3305+
return i;
3306+
}
3307+
}
3308+
3309+
return i;
3310+
}
3311+
32663312
static int cgltf_parse_json_image(cgltf_options* options, jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_image* out_image)
32673313
{
32683314
CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
@@ -3550,6 +3596,11 @@ static int cgltf_parse_json_material(cgltf_options* options, jsmntok_t const* to
35503596
out_material->has_clearcoat = 1;
35513597
i = cgltf_parse_json_clearcoat(options, tokens, i + 1, json_chunk, &out_material->clearcoat);
35523598
}
3599+
else if (cgltf_json_strcmp(tokens+i, json_chunk, "KHR_materials_transmission") == 0)
3600+
{
3601+
out_material->has_transmission = 1;
3602+
i = cgltf_parse_json_transmission(options, tokens, i + 1, json_chunk, &out_material->transmission);
3603+
}
35533604
else
35543605
{
35553606
i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_material->extensions[out_material->extensions_count++]));
@@ -5148,6 +5199,8 @@ static int cgltf_fixup_pointers(cgltf_data* data)
51485199
CGLTF_PTRFIXUP(data->materials[i].clearcoat.clearcoat_texture.texture, data->textures, data->textures_count);
51495200
CGLTF_PTRFIXUP(data->materials[i].clearcoat.clearcoat_roughness_texture.texture, data->textures, data->textures_count);
51505201
CGLTF_PTRFIXUP(data->materials[i].clearcoat.clearcoat_normal_texture.texture, data->textures, data->textures_count);
5202+
5203+
CGLTF_PTRFIXUP(data->materials[i].transmission.transmission_texture.texture, data->textures, data->textures_count);
51515204
}
51525205

51535206
for (cgltf_size i = 0; i < data->buffer_views_count; ++i)

cgltf_write.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ cgltf_size cgltf_write(const cgltf_options* options, char* buffer, cgltf_size si
7575
#define CGLTF_EXTENSION_FLAG_LIGHTS_PUNCTUAL (1 << 3)
7676
#define CGLTF_EXTENSION_FLAG_DRACO_MESH_COMPRESSION (1 << 4)
7777
#define CGLTF_EXTENSION_FLAG_MATERIALS_CLEARCOAT (1 << 5)
78+
#define CGLTF_EXTENSION_FLAG_MATERIALS_TRANSMISSION (1 << 6)
7879

7980
typedef struct {
8081
char* buffer;
@@ -502,6 +503,11 @@ static void cgltf_write_material(cgltf_write_context* context, const cgltf_mater
502503
context->extension_flags |= CGLTF_EXTENSION_FLAG_MATERIALS_CLEARCOAT;
503504
}
504505

506+
if (material->has_transmission)
507+
{
508+
context->extension_flags |= CGLTF_EXTENSION_FLAG_MATERIALS_TRANSMISSION;
509+
}
510+
505511
if (material->has_pbr_metallic_roughness)
506512
{
507513
const cgltf_pbr_metallic_roughness* params = &material->pbr_metallic_roughness;
@@ -518,7 +524,7 @@ static void cgltf_write_material(cgltf_write_context* context, const cgltf_mater
518524
cgltf_write_line(context, "}");
519525
}
520526

521-
if (material->unlit || material->has_pbr_specular_glossiness || material->has_clearcoat)
527+
if (material->unlit || material->has_pbr_specular_glossiness || material->has_clearcoat || material->has_transmission)
522528
{
523529
cgltf_write_line(context, "\"extensions\": {");
524530
if (material->has_clearcoat)
@@ -532,6 +538,14 @@ static void cgltf_write_material(cgltf_write_context* context, const cgltf_mater
532538
cgltf_write_floatprop(context, "clearcoatRoughnessFactor", params->clearcoat_roughness_factor, 0.0f);
533539
cgltf_write_line(context, "}");
534540
}
541+
if (material->has_transmission)
542+
{
543+
const cgltf_transmission* params = &material->transmission;
544+
cgltf_write_line(context, "\"KHR_materials_transmission\": {");
545+
CGLTF_WRITE_TEXTURE_INFO("transmissionTexture", params->transmission_texture);
546+
cgltf_write_floatprop(context, "transmissionFactor", params->transmission_factor, 0.0f);
547+
cgltf_write_line(context, "}");
548+
}
535549
if (material->has_pbr_specular_glossiness)
536550
{
537551
const cgltf_pbr_specular_glossiness* params = &material->pbr_specular_glossiness;
@@ -900,6 +914,9 @@ static void cgltf_write_extensions(cgltf_write_context* context, uint32_t extens
900914
if (extension_flags & CGLTF_EXTENSION_FLAG_MATERIALS_CLEARCOAT) {
901915
cgltf_write_stritem(context, "KHR_materials_clearcoat");
902916
}
917+
if (extension_flags & CGLTF_EXTENSION_FLAG_MATERIALS_TRANSMISSION) {
918+
cgltf_write_stritem(context, "KHR_materials_transmission");
919+
}
903920
}
904921

905922
cgltf_size cgltf_write(const cgltf_options* options, char* buffer, cgltf_size size, const cgltf_data* data)

0 commit comments

Comments
 (0)