@@ -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+
400406typedef 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+
32663312static 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 )
0 commit comments