Add loading of joints(bones) to LoadAnimations.. Must prerender out all frames next..

This commit is contained in:
Tyler Bezera 2020-03-03 21:07:15 -08:00
parent 5ba1d841d2
commit d8de965c16
2 changed files with 47 additions and 11 deletions

View File

@ -18,8 +18,11 @@
********************************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#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);
//Draw debug
if(DEBUG_DRAW)
{
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

View File

@ -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)