|
|
@ -5532,6 +5532,10 @@ static Model LoadGLTF(const char *fileName) |
|
|
|
|
|
|
|
// WARNING: SPECS: POSITION accessor MUST have its min and max properties defined |
|
|
|
|
|
|
|
// make sure we don't leak this buffer if there are multiple attributes of the same type |
|
|
|
if (model.meshes[meshIndex].vertices) |
|
|
|
MemFree(model.meshes[meshIndex].vertices); |
|
|
|
|
|
|
|
if ((attribute->type == cgltf_type_vec3) && (attribute->component_type == cgltf_component_type_r_32f)) |
|
|
|
{ |
|
|
|
// Init raylib mesh vertices to copy glTF attribute data |
|
|
@ -5557,6 +5561,10 @@ static Model LoadGLTF(const char *fileName) |
|
|
|
{ |
|
|
|
cgltf_accessor *attribute = mesh->primitives[p].attributes[j].data; |
|
|
|
|
|
|
|
// make sure we don't leak this buffer if there are multiple attributes of the same type |
|
|
|
if (model.meshes[meshIndex].normals) |
|
|
|
MemFree(model.meshes[meshIndex].normals); |
|
|
|
|
|
|
|
if ((attribute->type == cgltf_type_vec3) && (attribute->component_type == cgltf_component_type_r_32f)) |
|
|
|
{ |
|
|
|
// Init raylib mesh normals to copy glTF attribute data |
|
|
@ -5581,6 +5589,10 @@ static Model LoadGLTF(const char *fileName) |
|
|
|
{ |
|
|
|
cgltf_accessor *attribute = mesh->primitives[p].attributes[j].data; |
|
|
|
|
|
|
|
// make sure we don't leak this buffer if there are multiple attributes of the same type |
|
|
|
if (model.meshes[meshIndex].tangents) |
|
|
|
MemFree(model.meshes[meshIndex].tangents); |
|
|
|
|
|
|
|
if ((attribute->type == cgltf_type_vec4) && (attribute->component_type == cgltf_component_type_r_32f)) |
|
|
|
{ |
|
|
|
// Init raylib mesh tangent to copy glTF attribute data |
|
|
@ -5651,8 +5663,21 @@ static Model LoadGLTF(const char *fileName) |
|
|
|
else TRACELOG(LOG_WARNING, "MODEL: [%s] Texcoords attribute data format not supported, use vec2 float", fileName); |
|
|
|
|
|
|
|
int index = mesh->primitives[p].attributes[j].index; |
|
|
|
if (index == 0) model.meshes[meshIndex].texcoords = texcoordPtr; |
|
|
|
else if (index == 1) model.meshes[meshIndex].texcoords2 = texcoordPtr; |
|
|
|
if (index == 0) |
|
|
|
{ |
|
|
|
// make sure we don't leak this buffer if there are multiple attributes of the same type |
|
|
|
if (model.meshes[meshIndex].texcoords) |
|
|
|
MemFree(model.meshes[meshIndex].texcoords); |
|
|
|
|
|
|
|
model.meshes[meshIndex].texcoords = texcoordPtr; |
|
|
|
} |
|
|
|
else if (index == 1) |
|
|
|
{ |
|
|
|
// make sure we don't leak this buffer if there are multiple attributes of the same type |
|
|
|
if (model.meshes[meshIndex].texcoords2) |
|
|
|
MemFree(model.meshes[meshIndex].texcoords2); |
|
|
|
model.meshes[meshIndex].texcoords2 = texcoordPtr; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
TRACELOG(LOG_WARNING, "MODEL: [%s] No more than 2 texture coordinates attributes supported", fileName); |
|
|
@ -5664,6 +5689,9 @@ static Model LoadGLTF(const char *fileName) |
|
|
|
cgltf_accessor *attribute = mesh->primitives[p].attributes[j].data; |
|
|
|
|
|
|
|
// WARNING: SPECS: All components of each COLOR_n accessor element MUST be clamped to [0.0, 1.0] range |
|
|
|
// make sure we don't leak this buffer if there are multiple attributes of the same type |
|
|
|
if (model.meshes[meshIndex].colors) |
|
|
|
MemFree(model.meshes[meshIndex].colors); |
|
|
|
|
|
|
|
if (attribute->type == cgltf_type_vec3) // RGB |
|
|
|
{ |
|
|
@ -5782,6 +5810,10 @@ static Model LoadGLTF(const char *fileName) |
|
|
|
|
|
|
|
model.meshes[meshIndex].triangleCount = (int)attribute->count/3; |
|
|
|
|
|
|
|
// make sure we don't leak this buffer if there are multiple attributes of the same type |
|
|
|
if (model.meshes[meshIndex].indices) |
|
|
|
MemFree(model.meshes[meshIndex].indices); |
|
|
|
|
|
|
|
if (attribute->component_type == cgltf_component_type_r_16u) |
|
|
|
{ |
|
|
|
// Init raylib mesh indices to copy glTF attribute data |
|
|
@ -5896,6 +5928,10 @@ static Model LoadGLTF(const char *fileName) |
|
|
|
// if data is provided in any other format, it is converted to supported format but |
|
|
|
// it could imply data loss (a warning message is issued in that case) |
|
|
|
|
|
|
|
// make sure we don't leak this buffer if there are multiple attributes of the same type |
|
|
|
if (model.meshes[meshIndex].boneIds) |
|
|
|
MemFree(model.meshes[meshIndex].boneIds); |
|
|
|
|
|
|
|
if (attribute->type == cgltf_type_vec4) |
|
|
|
{ |
|
|
|
if (attribute->component_type == cgltf_component_type_r_8u) |
|
|
@ -5939,6 +5975,10 @@ static Model LoadGLTF(const char *fileName) |
|
|
|
{ |
|
|
|
cgltf_accessor *attribute = mesh->primitives[p].attributes[j].data; |
|
|
|
|
|
|
|
// make sure we don't leak this buffer if there are multiple attributes of the same type |
|
|
|
if (model.meshes[meshIndex].boneWeights) |
|
|
|
MemFree(model.meshes[meshIndex].boneWeights); |
|
|
|
|
|
|
|
if (attribute->type == cgltf_type_vec4) |
|
|
|
{ |
|
|
|
if (attribute->component_type == cgltf_component_type_r_8u) |
|
|
|