diff --git a/examples/models/models_animation_gltf.c b/examples/models/models_animation_gltf.c index 41a8144f4..bf9113126 100644 --- a/examples/models/models_animation_gltf.c +++ b/examples/models/models_animation_gltf.c @@ -18,8 +18,11 @@ ********************************************************************************************/ #include +#include #include "raylib.h" +#define DEBUG_DRAW 0 + int main(void) { // Initialization @@ -44,7 +47,10 @@ int main(void) int animsCount = 0; ModelAnimation *anims = LoadModelAnimations("resources/models/RiggedFigure.glb", &animsCount); int animFrameCounter = 0; - + bool isValid = IsModelAnimationValid(model2, anims[2]); + if (!isValid) { + printf("\n\n\n\nModel Bone Count: %i, Animation Bone Count: %i, Animation Count: %i\n\n\n\n", model2.boneCount, anims[2].boneCount, animsCount); + } SetCameraMode(camera, CAMERA_FREE); // Set free camera mode SetTargetFPS(60); // Set our game to run at 60 frames-per-second @@ -61,7 +67,7 @@ int main(void) if (IsKeyDown(KEY_SPACE)) { //animFrameCounter++; - //UpdateModelAnimation(model, anims[0], animFrameCounter); + //UpdateModelAnimation(model2, anims[0], animFrameCounter); //if (animFrameCounter >= anims[0].frameCount) animFrameCounter = 0; } //---------------------------------------------------------------------------------- @@ -76,10 +82,16 @@ int main(void) DrawModelEx(model2, position, (Vector3){ 1.0f, 0.0f, 0.0f }, -90.0f, (Vector3){ 1.0f, 1.0f, 1.0f }, WHITE); - for (int i = 0; i < model2.boneCount; i++) + //Draw debug + if(DEBUG_DRAW) { - //DrawCube(anims[0].framePoses[animFrameCounter][i].translation, 0.2f, 0.2f, 0.2f, RED); + for (int i = 0; i < model2.boneCount; i++) + { + //DrawCube(anims[0].framePoses[animFrameCounter][i].translation, 0.2f, 0.2f, 0.2f, RED); + //DrawCube(model2.bindPose[i].translation, 0.2f, 0.2f, 0.2f, RED); + } } + DrawGrid(10, 1.0f); // Draw a grid diff --git a/src/models.c b/src/models.c index 3a5cdd924..0e08625dc 100644 --- a/src/models.c +++ b/src/models.c @@ -925,7 +925,9 @@ ModelAnimation *LoadModelAnimations(const char *filename, int *animCount) } if (TextIsEqual(extension, GLTF_EXTENSION) || TextIsEqual(extension, GLB_EXTENSION)) { - return loadGLTFModelAnimations(animationFile, filename, animCount); + ModelAnimation *anims = loadGLTFModelAnimations(animationFile, filename, animCount); + printf("\n\n\nONCE AGAIN: %i\n\n\n", anims[0].boneCount); + return anims; } if (TextIsEqual(extension, IQM_EXTENSION)) { @@ -979,14 +981,14 @@ static ModelAnimation *loadGLTFModelAnimations(FILE* gltfFile, const char* fileN cgltf_options options = { 0 }; cgltf_data *data = NULL; cgltf_result result = cgltf_parse(&options, buffer, size, &data); - + ModelAnimation* animations = NULL; if (result == cgltf_result_success) { // Read data buffers result = cgltf_load_buffers(&options, data, fileName); if (result != cgltf_result_success) TRACELOG(LOG_INFO, "[%s][%s] Error loading mesh/material buffers", fileName, (data->file_type == 2)? "glb" : "gltf"); - ModelAnimation* animations = RL_CALLOC(data->animations_count, sizeof(ModelAnimation)); - + animations = RL_CALLOC(data->animations_count, sizeof(ModelAnimation)); + *animCount = data->animations_count; for (int i = 0; i < data->animations_count; i++) { // Copy Animation Name if (data->animations[i].name) { @@ -995,7 +997,28 @@ static ModelAnimation *loadGLTFModelAnimations(FILE* gltfFile, const char* fileN } } - //GLTFAnimation animation = { 0 }; + // Load Skeleton Data + // Currenly only support one skin + printf("\n\n Joints for Animation: %i \n\n", data->skins[0].joints_count); + animations[i].boneCount = data->skins[0].joints_count; + animations[i].bones = RL_CALLOC(animations[i].boneCount, sizeof(BoneInfo)); + for (int i = 0; i < animations[i].boneCount; i++) + { + if (data->skins[0].joints[i]->name) { + // Raylib only supports names up to 34 characters.. + if (TextLength(data->skins[0].joints[i]->name) <= 34) { + TextCopy(animations[i].bones[i].name, data->skins[0].joints[i]->name); + } + } + + // Mark parents in array + if (data->skins[0].joints[i]->children_count > 0) { + int numOfChildrenJoints = data->skins[0].joints[i]->children_count; + for (int j = i; j < numOfChildrenJoints; j++) { + animations[i].bones[j].parent = i; + } + } + } // Contains Channels, copy those to internal struct if (data->animations[i].channels_count > 0) { @@ -1021,7 +1044,7 @@ static ModelAnimation *loadGLTFModelAnimations(FILE* gltfFile, const char* fileN // in most cases it will Vec3(3) or Vec4(4), so we must accomdate the array size float* outputs = RL_CALLOC(outputAcc->count * outputAcc->type, sizeof(float)); int outputsCount = outputAcc->count * outputAcc->type; - LOAD_ACCESSOR(float, 3, outputAcc, outputs); + LOAD_ACCESSOR(float, outputAcc->type, outputAcc, outputs); for (int blah = 0; blah < outputsCount; blah++) { printf("OUTPUT: animation: %d, channel: %d, index: %d, value: %f\n", i, j, blah, outputs[blah]); @@ -1047,7 +1070,8 @@ static ModelAnimation *loadGLTFModelAnimations(FILE* gltfFile, const char* fileN } free(data); - return NULL; + printf("\n\n\nANIAMTION JOINT COUNT: %i\n\n\n\n", animations[0].boneCount); + return animations; } static ModelAnimation *loadIQMModelAnimations(FILE* iqmFile, int *animCount)