@ -754,7 +754,7 @@ Model LoadModel(const char *fileName)
if ( model . meshMaterial = = NULL ) model . meshMaterial = ( int * ) RL_CALLOC ( model . meshCount , sizeof ( int ) ) ;
}
return model ;
}
@ -3979,10 +3979,75 @@ static Model LoadGLTF(const char *fileName)
}
else
{
model . meshMaterial [ primitiveIndex ] = model . materialCount - 1 ; ;
model . meshMaterial [ primitiveIndex ] = model . materialCount - 1 ;
}
/ / if ( data - > meshes [ i ] . )
if ( model . meshes [ primitiveIndex ] . boneIds = = NULL & & data - > nodes_count > 0 )
{
for ( int nodeId = 0 ; nodeId < data - > nodes_count ; nodeId + + )
{
if ( data - > nodes [ nodeId ] . mesh = = & ( data - > meshes [ i ] ) )
{
model . meshes [ primitiveIndex ] . boneIds = RL_CALLOC ( 4 * model . meshes [ primitiveIndex ] . vertexCount , sizeof ( int ) ) ;
model . meshes [ primitiveIndex ] . boneWeights = RL_CALLOC ( 4 * model . meshes [ primitiveIndex ] . vertexCount , sizeof ( float ) ) ;
for ( int b = 0 ; b < 4 * model . meshes [ primitiveIndex ] . vertexCount ; b + + )
{
if ( b % 4 = = 0 )
{
model . meshes [ primitiveIndex ] . boneIds [ b ] = nodeId ;
model . meshes [ primitiveIndex ] . boneWeights [ b ] = 1.0f ;
}
else
{
model . meshes [ primitiveIndex ] . boneIds [ b ] = 0 ;
model . meshes [ primitiveIndex ] . boneWeights [ b ] = 0.0f ;
}
}
Vector3 boundVertex = { 0 } ;
Vector3 boundNormal = { 0 } ;
Vector3 outTranslation = { 0 } ;
Quaternion outRotation = { 0 } ;
Vector3 outScale = { 0 } ;
int vCounter = 0 ;
int boneCounter = 0 ;
int boneId = 0 ;
for ( int i = 0 ; i < model . meshes [ primitiveIndex ] . vertexCount ; i + + )
{
boneId = model . meshes [ primitiveIndex ] . boneIds [ boneCounter ] ;
outTranslation = model . bindPose [ boneId ] . translation ;
outRotation = model . bindPose [ boneId ] . rotation ;
outScale = model . bindPose [ boneId ] . scale ;
/ / Vertices processing
boundVertex = ( Vector3 ) { model . meshes [ primitiveIndex ] . vertices [ vCounter ] , model . meshes [ primitiveIndex ] . vertices [ vCounter + 1 ] , model . meshes [ primitiveIndex ] . vertices [ vCounter + 2 ] } ;
boundVertex = Vector3Multiply ( boundVertex , outScale ) ;
boundVertex = Vector3RotateByQuaternion ( boundVertex , outRotation ) ;
boundVertex = Vector3Add ( boundVertex , outTranslation ) ;
model . meshes [ primitiveIndex ] . vertices [ vCounter ] = boundVertex . x ;
model . meshes [ primitiveIndex ] . vertices [ vCounter + 1 ] = boundVertex . y ;
model . meshes [ primitiveIndex ] . vertices [ vCounter + 2 ] = boundVertex . z ;
/ / Normals processing
boundNormal = ( Vector3 ) { model . meshes [ primitiveIndex ] . normals [ vCounter ] , model . meshes [ primitiveIndex ] . normals [ vCounter + 1 ] , model . meshes [ primitiveIndex ] . normals [ vCounter + 2 ] } ;
boundNormal = Vector3RotateByQuaternion ( boundNormal , outRotation ) ;
model . meshes [ primitiveIndex ] . normals [ vCounter ] = boundNormal . x ;
model . meshes [ primitiveIndex ] . normals [ vCounter + 1 ] = boundNormal . y ;
model . meshes [ primitiveIndex ] . normals [ vCounter + 2 ] = boundNormal . z ;
vCounter + = 3 ;
boneCounter + = 4 ;
}
}
}
}
primitiveIndex + + ;
}
@ -4053,9 +4118,9 @@ static ModelAnimation *LoadGLTFModelAnimations(const char *fileName, int *animCo
result = cgltf_load_buffers ( & options , data , fileName ) ;
if ( result ! = cgltf_result_success ) TRACELOG ( LOG_WARNING , " MODEL: [%s] unable to load glTF animations data " , fileName ) ;
animations = RL_MALLOC ( data - > animations_count * sizeof ( ModelAnimation ) ) ;
* animCount = data - > animations_count ;
for ( unsigned int a = 0 ; a < data - > animations_count ; a + + )
{
/ / gltf animation consists of the following structures :
@ -4150,7 +4215,10 @@ static ModelAnimation *LoadGLTFModelAnimations(const char *fileName, int *animCo
float previousInputTime = 0.0f ;
if ( GltfReadFloat ( sampler - > input , outputMin , ( float * ) & previousInputTime , 1 ) )
{
lerpPercent = ( frameTime - previousInputTime ) / ( inputFrameTime - previousInputTime ) ;
if ( ( inputFrameTime - previousInputTime ) ! = 0 )
{
lerpPercent = ( frameTime - previousInputTime ) / ( inputFrameTime - previousInputTime ) ;
}
}
break ;