@ -3377,9 +3377,9 @@ static unsigned char *DecodeBase64(char *input, int *size)
}
/ / Load texture from cgltf_image
static Texture LoadTextur eFromCgltfImage( cgltf_image * image , const char * texPath , Color tint )
static Image LoadImag eFromCgltfImage( cgltf_image * image , const char * texPath , Color tint )
{
Texture textur e = { 0 } ;
Image rimag e = { 0 } ;
if ( image - > uri )
{
@ -3406,22 +3406,18 @@ static Texture LoadTextureFromCgltfImage(cgltf_image *image, const char *texPath
int w , h ;
unsigned char * raw = stbi_load_from_memory ( data , size , & w , & h , NULL , 4 ) ;
Image rimage = LoadImagePro ( raw , w , h , UNCOMPRESSED_R8G8B8A8 ) ;
rimage = LoadImagePro ( raw , w , h , UNCOMPRESSED_R8G8B8A8 ) ;
/ / TODO : Tint shouldn ' t be applied here !
ImageColorTint ( & rimage , tint ) ;
texture = LoadTextureFromImage ( rimage ) ;
UnloadImage ( rimage ) ;
}
}
else
{
Image rimage = LoadImage ( TextFormat ( " %s/%s " , texPath , image - > uri ) ) ;
rimage = LoadImage ( TextFormat ( " %s/%s " , texPath , image - > uri ) ) ;
/ / TODO : Tint shouldn ' t be applied here !
ImageColorTint ( & rimage , tint ) ;
texture = LoadTextureFromImage ( rimage ) ;
UnloadImage ( rimage ) ;
}
}
else if ( image - > buffer_view )
@ -3440,41 +3436,36 @@ static Texture LoadTextureFromCgltfImage(cgltf_image *image, const char *texPath
unsigned char * raw = stbi_load_from_memory ( data , image - > buffer_view - > size , & w , & h , NULL , 4 ) ;
free ( data ) ;
Image rimage = LoadImagePro ( raw , w , h , UNCOMPRESSED_R8G8B8A8 ) ;
rimage = LoadImagePro ( raw , w , h , UNCOMPRESSED_R8G8B8A8 ) ;
free ( raw ) ;
/ / TODO : Tint shouldn ' t be applied here !
ImageColorTint ( & rimage , tint ) ;
texture = LoadTextureFromImage ( rimage ) ;
UnloadImage ( rimage ) ;
}
else
{
Image rimage = LoadImageEx ( & tint , 1 , 1 ) ;
texture = LoadTextureFromImage ( rimage ) ;
UnloadImage ( rimage ) ;
rimage = LoadImageEx ( & tint , 1 , 1 ) ;
}
return textu re;
return rimag e ;
}
/ / Load glTF mesh data
/ / LoadGLTF loads in model data from given filename , supporting both . gltf and . glb
static Model LoadGLTF ( const char * fileName )
{
/***********************************************************************************
Function implemented by Wilhem Barbier ( @ wbrbr )
Function implemented by Wilhem Barbier ( @ wbrbr ) , with modifications by Tyler Bezera ( @ gamerfiend )
Features :
- Supports . gltf and . glb files
- Supports embedded ( base64 ) or external textures
- Loads the albedo / diffuse texture ( other maps could be added )
- Loads all raylib supported material textures , values and colors
- Supports multiple mesh per model and multiple primitives per model
Some restrictions ( not exhaustive ) :
- Triangle - only meshes
- Not supported node hierarchies or transforms
- Only loads the diffuse texture . . . but not too hard to support other maps ( normal , roughness / metalness . . . )
- Only supports unsigned short indices ( no byte / unsigned int )
- Only supports float for texture coordinates ( no byte / unsigned short )
@ -3547,44 +3538,62 @@ static Model LoadGLTF(const char *fileName)
/ / Ensure material follows raylib support for PBR ( metallic / roughness flow )
if ( data - > materials [ i ] . has_pbr_metallic_roughness )
{
float roughness = data - > materials [ i ] . pbr_metallic_roughness . roughness_factor ;
float metallic = data - > materials [ i ] . pbr_metallic_roughness . metallic_factor ;
tint . r = ( unsigned char ) ( data - > materials [ i ] . pbr_metallic_roughness . base_color_factor [ 0 ] * 255 ) ;
tint . g = ( unsigned char ) ( data - > materials [ i ] . pbr_metallic_roughness . base_color_factor [ 1 ] * 255 ) ;
tint . b = ( unsigned char ) ( data - > materials [ i ] . pbr_metallic_roughness . base_color_factor [ 2 ] * 255 ) ;
tint . a = ( unsigned char ) ( data - > materials [ i ] . pbr_metallic_roughness . base_color_factor [ 3 ] * 255 ) ;
/ / NOTE : Material name not used for the moment
/ / if ( model . materials [ i ] . name & & data - > materials [ i ] . name ) strcpy ( model . materials [ i ] . name , data - > materials [ i ] . name ) ;
/ / TODO : REview : shouldn ' t these be * 255 ? ? ?
tint . r = ( unsigned char ) ( data - > materials [ i ] . pbr_metallic_roughness . base_color_factor [ 0 ] * 255 ) ;
tint . g = ( unsigned char ) ( data - > materials [ i ] . pbr_metallic_roughness . base_color_factor [ 1 ] * 255 ) ;
tint . b = ( unsigned char ) ( data - > materials [ i ] . pbr_metallic_roughness . base_color_factor [ 2 ] * 255 ) ;
tint . a = ( unsigned char ) ( data - > materials [ i ] . pbr_metallic_roughness . base_color_factor [ 3 ] * 255 ) ;
model . materials [ i ] . maps [ MAP_ROUGHNESS ] . color = tint ;
model . materials [ i ] . maps [ MAP_ALBEDO ] . color = tint ;
if ( data - > materials [ i ] . pbr_metallic_roughness . base_color_texture . texture )
{
model . materials [ i ] . maps [ MAP_ALBEDO ] . texture = LoadTextureFromCgltfImage ( data - > materials [ i ] . pbr_metallic_roughness . base_color_texture . texture - > image , texPath , tint ) ;
Image albedo = LoadImageFromCgltfImage ( data - > materials [ i ] . pbr_metallic_roughness . base_color_texture . texture - > image , texPath , tint ) ;
model . materials [ i ] . maps [ MAP_ALBEDO ] . texture = LoadTextureFromImage ( albedo ) ;
UnloadImage ( albedo ) ;
}
/ / NOTE : Tint isn ' t need for other textures . . pass null or clear ?
/ / Just set as white , multiplying by white has no effect
/ / Set tint to white after it ' s been used by Albedo
tint = WHITE ;
if ( data - > materials [ i ] . pbr_metallic_roughness . metallic_roughness_texture . texture )
{
model . materials [ i ] . maps [ MAP_ROUGHNESS ] . texture = LoadTextureFromCgltfImage ( data - > materials [ i ] . pbr_metallic_roughness . metallic_roughness_texture . texture - > image , texPath , tint ) ;
Image metallicRoughness = LoadImageFromCgltfImage ( data - > materials [ i ] . pbr_metallic_roughness . metallic_roughness_texture . texture - > image , texPath , tint ) ;
model . materials [ i ] . maps [ MAP_ROUGHNESS ] . texture = LoadTextureFromImage ( metallicRoughness ) ;
float roughness = data - > materials [ i ] . pbr_metallic_roughness . roughness_factor ;
model . materials [ i ] . maps [ MAP_ROUGHNESS ] . value = roughness ;
float metallic = data - > materials [ i ] . pbr_metallic_roughness . metallic_factor ;
model . materials [ i ] . maps [ MAP_METALNESS ] . value = metallic ;
UnloadImage ( metallicRoughness ) ;
}
model . materials [ i ] . maps [ MAP_ROUGHNESS ] . value = roughness ;
model . materials [ i ] . maps [ MAP_METALNESS ] . value = metallic ;
if ( data - > materials [ i ] . normal_texture . texture )
{
model . materials [ i ] . maps [ MAP_NORMAL ] . texture = LoadTextureFromCgltfImage ( data - > materials [ i ] . normal_texture . texture - > image , texPath , tint ) ;
Image normalImage = LoadImageFromCgltfImage ( data - > materials [ i ] . normal_texture . texture - > image , texPath , tint ) ;
model . materials [ i ] . maps [ MAP_NORMAL ] . texture = LoadTextureFromImage ( normalImage ) ;
UnloadImage ( normalImage ) ;
}
if ( data - > materials [ i ] . occlusion_texture . texture )
{
model . materials [ i ] . maps [ MAP_OCCLUSION ] . texture = LoadTextureFromCgltfImage ( data - > materials [ i ] . occlusion_texture . texture - > image , texPath , tint ) ;
Image occulsionImage = LoadImageFromCgltfImage ( data - > materials [ i ] . occlusion_texture . texture - > image , texPath , tint ) ;
model . materials [ i ] . maps [ MAP_OCCLUSION ] . texture = LoadTextureFromImage ( occulsionImage ) ;
UnloadImage ( occulsionImage ) ;
}
if ( data - > materials [ i ] . emissive_texture . texture )
{
Image emissiveImage = LoadImageFromCgltfImage ( data - > materials [ i ] . emissive_texture . texture - > image , texPath , tint ) ;
model . materials [ i ] . maps [ MAP_EMISSION ] . texture = LoadTextureFromImage ( emissiveImage ) ;
tint . r = ( unsigned char ) ( data - > materials [ i ] . emissive_factor [ 0 ] * 255 ) ;
tint . g = ( unsigned char ) ( data - > materials [ i ] . emissive_factor [ 1 ] * 255 ) ;
tint . b = ( unsigned char ) ( data - > materials [ i ] . emissive_factor [ 2 ] * 255 ) ;
model . materials [ i ] . maps [ MAP_EMISSION ] . color = tint ;
UnloadImage ( emissiveImage ) ;
}
}
}