From d4dc038e2e77ad8b0fddcfa323ee872cc2eb1d0b Mon Sep 17 00:00:00 2001 From: Ray Date: Tue, 24 Feb 2026 01:18:57 +0100 Subject: [PATCH] WARNING: BREAKING: REDESIGNED: **Animation System** #4606 REVIEWED: Reorganized structures for a clearer distinction between "skeleton", "skin" and "skinning" data ADDED: New structures: `ModelSkeleton`, `ModelAnimPose` (alias `Transform*`) ADDED: Runtime data `currentPose` and `boneMatrices` to `Model` structure ADDED: Support animation frames-blending, for timing control ADDED: Support animations blending, between two animations REVIEWED: All models animation loading functions ADDED: `UpdateModelAnimationEx()` for two animations blending REMOVED: `UpdateModelAnimationBones*()`, simplified API REVIEWED: Shader attributes/uniforms names for animations, for consistency REVIEWED: Multiple tweaks on animations loading for consistency between formats ADDED: example: `models_animation_timing` ADDED: example: `models_animation_blending` REVIEWED: example: `models_animation_gpu_skinning` REVIEWED: example: `models_animation_blend_custom` REVIEWED: All animated models loading examples --- examples/examples_list.txt | 2 +- .../models/models_animation_blend_custom.c | 278 +++--- .../models/models_animation_blend_custom.png | Bin 23976 -> 83827 bytes examples/models/models_animation_blending.c | 207 +++- examples/models/models_animation_blending.png | Bin 26143 -> 28003 bytes .../models/models_animation_gpu_skinning.c | 1 - .../models/models_animation_gpu_skinning.png | Bin 49846 -> 66853 bytes ...on_timming.c => models_animation_timing.c} | 65 +- examples/models/models_animation_timing.png | Bin 0 -> 23489 bytes examples/models/models_animation_timming.png | Bin 22154 -> 0 bytes examples/models/models_loading.c | 21 +- examples/models/models_loading_gltf.c | 37 +- examples/models/models_loading_gltf.png | Bin 26632 -> 22136 bytes examples/models/models_loading_iqm.c | 46 +- examples/models/models_loading_iqm.png | Bin 67020 -> 59771 bytes examples/models/models_loading_m3d.c | 132 +-- examples/models/models_loading_m3d.png | Bin 25881 -> 22930 bytes examples/models/models_loading_vox.c | 7 +- examples/models/models_loading_vox.png | Bin 23252 -> 37121 bytes ...cxproj => models_animation_timing.vcxproj} | 4 +- projects/VS2022/raylib.sln | 2 +- src/config.h | 35 +- src/raylib.h | 59 +- src/rcore.c | 8 +- src/rlgl.h | 60 +- src/rmodels.c | 895 ++++++++++-------- 26 files changed, 1052 insertions(+), 807 deletions(-) rename examples/models/{models_animation_timming.c => models_animation_timing.c} (57%) create mode 100644 examples/models/models_animation_timing.png delete mode 100644 examples/models/models_animation_timming.png rename projects/VS2022/examples/{models_animation_timming.vcxproj => models_animation_timing.vcxproj} (99%) diff --git a/examples/examples_list.txt b/examples/examples_list.txt index 042c1aed3..dc3312893 100644 --- a/examples/examples_list.txt +++ b/examples/examples_list.txt @@ -173,7 +173,7 @@ models;models_decals;★★★★;5.6-dev;5.6-dev;2025;2025;"JP Mortiboys";@them models;models_directional_billboard;★★☆☆;5.6-dev;5.6;2025;2025;"Robin";@RobinsAviary models;models_animation_blend_custom;★★★★;5.5;5.5;2026;2026;"dmitrii-brand";@dmitrii-brand models;models_animation_blending;☆☆☆☆;5.5;5.6-dev;2024;2024;"Kirandeep";@Kirandeep-Singh-Khehra -models;models_animation_timming;★★☆☆;5.6;5.6;2026;2026;"Ramon Santamaria";@raysan5 +models;models_animation_timing;★★☆☆;5.6;5.6;2026;2026;"Ramon Santamaria";@raysan5 shaders;shaders_ascii_rendering;★★☆☆;5.5;5.6;2025;2025;"Maicon Santana";@maiconpintoabreu shaders;shaders_basic_lighting;★★★★;3.0;4.2;2019;2025;"Chris Camacho";@chriscamacho shaders;shaders_model_shader;★★☆☆;1.3;3.7;2014;2025;"Ramon Santamaria";@raysan5 diff --git a/examples/models/models_animation_blend_custom.c b/examples/models/models_animation_blend_custom.c index 76dba6a69..f846a125b 100644 --- a/examples/models/models_animation_blend_custom.c +++ b/examples/models/models_animation_blend_custom.c @@ -6,7 +6,7 @@ * * Example originally created with raylib 5.5, last time updated with raylib 5.5 * -* This example demonstrates per-bone animation blending, allowing smooth transitions +* DETAILS: Example demonstrates per-bone animation blending, allowing smooth transitions * between two animations by interpolating bone transforms. This is useful for: * - Blending movement animations (walk/run) with action animations (jump/attack) * - Creating smooth animation transitions @@ -27,8 +27,10 @@ #include "raymath.h" -#include // Required for: memcpy() -#include // Required for: NULL +#include "rlgl.h" // Requried for: rlUpdateVertexBuffer() (CPU-skinning) + +#include // Required for: memcpy() +#include // Required for: NULL #if defined(PLATFORM_DESKTOP) #define GLSL_VERSION 330 @@ -40,8 +42,8 @@ // Module Functions Declaration //------------------------------------------------------------------------------------ static bool IsUpperBodyBone(const char *boneName); -static void BlendModelAnimationsBones(Model *model, ModelAnimation *anim1, int frame1, - ModelAnimation *anim2, int frame2, float blendFactor, bool upperBodyBlend); +static void UpdateModelAnimationBones(Model *model, ModelAnimation *anim1, int frame1, + ModelAnimation *anim2, int frame2, float blend, bool upperBodyBlend); //------------------------------------------------------------------------------------ // Program main entry point @@ -57,51 +59,40 @@ int main(void) // Define the camera to look into our 3d world Camera camera = { 0 }; - camera.position = (Vector3){ 5.0f, 5.0f, 5.0f }; // Camera position - camera.target = (Vector3){ 0.0f, 2.0f, 0.0f }; // Camera looking at point + camera.position = (Vector3){ 4.0f, 4.0f, 4.0f }; // Camera position + camera.target = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera looking at point camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) camera.fovy = 45.0f; // Camera field-of-view Y camera.projection = CAMERA_PERSPECTIVE; // Camera projection type // Load gltf model - Model characterModel = LoadModel("resources/models/gltf/greenman.glb"); + Model model = LoadModel("resources/models/gltf/greenman.glb"); + Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position // Load skinning shader + // WARNING: GPU skinning must be enabled in raylib with a compilation flag, + // if not enabled, CPU skinning will be used instead Shader skinningShader = LoadShader(TextFormat("resources/shaders/glsl%i/skinning.vs", GLSL_VERSION), TextFormat("resources/shaders/glsl%i/skinning.fs", GLSL_VERSION)); - - characterModel.materials[1].shader = skinningShader; + model.materials[1].shader = skinningShader; // Load gltf model animations - int animsCount = 0; - ModelAnimation *modelAnimations = LoadModelAnimations("resources/models/gltf/greenman.glb", &animsCount); + int animCount = 0; + ModelAnimation *anims = LoadModelAnimations("resources/models/gltf/greenman.glb", &animCount); - // Log all available animations for debugging - TraceLog(LOG_INFO, "Found %d animations:", animsCount); - for (int i = 0; i < animsCount; i++) - { - TraceLog(LOG_INFO, " Animation %d: %s (%d frames)", i, modelAnimations[i].name, modelAnimations[i].keyframeCount); - } - - // Use specific indices: walk/move = 2, attack = 3 - unsigned int animIndex1 = 2; // Walk/Move animation (index 2) - unsigned int animIndex2 = 3; // Attack animation (index 3) + // Use specific animation indices: 2-walk/move, 3-attack + unsigned int animIndex0 = 2; // Walk/Move animation (index 2) + unsigned int animIndex1 = 3; // Attack animation (index 3) + unsigned int animCurrentFrame0 = 0; unsigned int animCurrentFrame1 = 0; - unsigned int animCurrentFrame2 = 0; // Validate indices - if (animIndex1 >= animsCount) animIndex1 = 0; - if (animIndex2 >= animsCount) animIndex2 = (animsCount > 1) ? 1 : 0; - - TraceLog(LOG_INFO, "Using Walk (index %d): %s", animIndex1, modelAnimations[animIndex1].name); - TraceLog(LOG_INFO, "Using Attack (index %d): %s", animIndex2, modelAnimations[animIndex2].name); + if (animIndex0 >= animCount) animIndex0 = 0; + if (animIndex1 >= animCount) animIndex1 = (animCount > 1) ? 1 : 0; - Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position - bool upperBodyBlend = true; // Toggle: true = upper/lower body blending, false = uniform blending (50/50) + bool upperBodyBlend = true; // Toggle: true = upper/lower body blending, false = uniform blending (50/50) - DisableCursor(); // Limit cursor to relative movement inside the window - - SetTargetFPS(60); // Set our game to run at 60 frames-per-second + SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- // Main game loop @@ -109,24 +100,28 @@ int main(void) { // Update //---------------------------------------------------------------------------------- - UpdateCamera(&camera, CAMERA_THIRD_PERSON); + UpdateCamera(&camera, CAMERA_ORBITAL); // Toggle upper/lower body blending mode (SPACE key) if (IsKeyPressed(KEY_SPACE)) upperBodyBlend = !upperBodyBlend; // Update animation frames - ModelAnimation anim1 = modelAnimations[animIndex1]; - ModelAnimation anim2 = modelAnimations[animIndex2]; + ModelAnimation anim0 = anims[animIndex0]; + ModelAnimation anim1 = anims[animIndex1]; + animCurrentFrame0 = (animCurrentFrame0 + 1)%anim0.keyframeCount; animCurrentFrame1 = (animCurrentFrame1 + 1)%anim1.keyframeCount; - animCurrentFrame2 = (animCurrentFrame2 + 1)%anim2.keyframeCount; // Blend the two animations - characterModel.transform = MatrixTranslate(position.x, position.y, position.z); // When upperBodyBlend is ON: upper body = attack (1.0), lower body = walk (0.0) // When upperBodyBlend is OFF: uniform blend at 0.5 (50% walk, 50% attack) - float blendFactor = upperBodyBlend ? 1.0f : 0.5f; - BlendModelAnimationsBones(&characterModel, &anim1, animCurrentFrame1, &anim2, animCurrentFrame2, blendFactor, upperBodyBlend); + float blendFactor = (upperBodyBlend? 1.0f : 0.5f); + UpdateModelAnimationBones(&model, &anim0, animCurrentFrame0, + &anim1, animCurrentFrame1, blendFactor, upperBodyBlend); + + // raylib provided animation blending function + //UpdateModelAnimationEx(model, anim0, (float)animCurrentFrame0, + // anim1, (float)animCurrentFrame1, blendFactor); //---------------------------------------------------------------------------------- // Draw @@ -137,19 +132,18 @@ int main(void) BeginMode3D(camera); - // Draw character mesh, pose calculation is done in shader (GPU skinning) - DrawMesh(characterModel.meshes[0], characterModel.materials[1], characterModel.transform); + DrawModel(model, position, 1.0f, WHITE); DrawGrid(10, 1.0f); EndMode3D(); // Draw UI - DrawText("BONE BLENDING EXAMPLE", 10, 10, 20, DARKGRAY); - DrawText(TextFormat("Walk (Animation 2): %s", anim1.name), 10, 35, 10, GRAY); - DrawText(TextFormat("Attack (Animation 3): %s", anim2.name), 10, 50, 10, GRAY); - DrawText(TextFormat("Mode: %s", upperBodyBlend ? "Upper/Lower Body Blending" : "Uniform Blending"), 10, 65, 10, GRAY); - DrawText("SPACE - Toggle blending mode", 10, GetScreenHeight() - 20, 10, DARKGRAY); + DrawText(TextFormat("ANIM 0: %s", anim0.name), 10, 10, 20, GRAY); + DrawText(TextFormat("ANIM 1: %s", anim1.name), 10, 40, 20, GRAY); + DrawText(TextFormat("[SPACE] Toggle blending mode: %s", + upperBodyBlend? "Upper/Lower Body Blending" : "Uniform Blending"), + 10, GetScreenHeight() - 30, 20, DARKGRAY); EndDrawing(); //---------------------------------------------------------------------------------- @@ -157,8 +151,8 @@ int main(void) // De-Initialization //-------------------------------------------------------------------------------------- - UnloadModelAnimations(modelAnimations, animsCount); // Unload model animation - UnloadModel(characterModel); // Unload model and meshes/material + UnloadModelAnimations(anims, animCount); // Unload model animation + UnloadModel(model); // Unload model and meshes/material UnloadShader(skinningShader); // Unload GPU skinning shader CloseWindow(); // Close window and OpenGL context @@ -199,74 +193,138 @@ static bool IsUpperBodyBone(const char *boneName) } // Blend two animations per-bone with selective upper/lower body blending -static void BlendModelAnimationsBones(Model *model, ModelAnimation *anim1, int frame1, - ModelAnimation *anim2, int frame2, float blendFactor, bool upperBodyBlend) +static void UpdateModelAnimationBones(Model *model, ModelAnimation *anim0, int frame0, + ModelAnimation *anim1, int frame1, float blend, bool upperBodyBlend) { // Validate inputs - if (anim1->boneCount == 0 || anim1->keyframePoses == NULL || - anim2->boneCount == 0 || anim2->keyframePoses == NULL || - model->skeleton.boneCount == 0 || model->skeleton.bindPose == NULL) + if ((anim0->boneCount != 0) && (anim0->keyframePoses != NULL) && + (anim1->boneCount != 0) && (anim1->keyframePoses != NULL) && + (model->skeleton.boneCount != 0) && (model->skeleton.bindPose != NULL)) { - return; - } - - // Clamp blend factor to [0, 1] - blendFactor = fminf(1.0f, fmaxf(0.0f, blendFactor)); - - // Ensure frame indices are valid - if (frame1 >= anim1->keyframeCount) frame1 = anim1->keyframeCount - 1; - if (frame2 >= anim2->keyframeCount) frame2 = anim2->keyframeCount - 1; - if (frame1 < 0) frame1 = 0; - if (frame2 < 0) frame2 = 0; - - // Get bone count (use minimum of all to be safe) - int boneCount = model->skeleton.boneCount; - if (anim1->boneCount < boneCount) boneCount = anim1->boneCount; - if (anim2->boneCount < boneCount) boneCount = anim2->boneCount; - - // Blend each bone - for (int boneId = 0; boneId < boneCount; boneId++) - { - // Determine blend factor for this bone - float boneBlendFactor = blendFactor; + // Clamp blend factor to [0, 1] + blend = fminf(1.0f, fmaxf(0.0f, blend)); - // If upper body blending is enabled, use different blend factors for upper vs lower body - if (upperBodyBlend) + // Ensure frame indices are valid + if (frame0 >= anim0->keyframeCount) frame0 = anim0->keyframeCount - 1; + if (frame1 >= anim1->keyframeCount) frame1 = anim1->keyframeCount - 1; + if (frame0 < 0) frame0 = 0; + if (frame1 < 0) frame1 = 0; + + // Get bone count (use minimum of all to be safe) + int boneCount = model->skeleton.boneCount; + if (anim0->boneCount < boneCount) boneCount = anim0->boneCount; + if (anim1->boneCount < boneCount) boneCount = anim1->boneCount; + + // Blend each bone + for (int boneIndex = 0; boneIndex < boneCount; boneIndex++) { - const char *boneName = model->skeleton.bones[boneId].name; - bool isUpperBody = IsUpperBodyBone(boneName); + // Determine blend factor for this bone + float boneBlendFactor = blend; - // Upper body: use anim2 (attack), Lower body: use anim1 (walk) - // blendFactor = 0.0 means full anim1 (walk), 1.0 means full anim2 (attack) - if (isUpperBody) boneBlendFactor = blendFactor; // Upper body: blend towards anim2 (attack) - else boneBlendFactor = 1.0f - blendFactor; // Lower body: blend towards anim1 (walk) - invert the blend + // If upper body blending is enabled, use different blend factors for upper vs lower body + if (upperBodyBlend) + { + const char *boneName = model->skeleton.bones[boneIndex].name; + bool isUpperBody = IsUpperBodyBone(boneName); + + // Upper body: use anim1 (attack), Lower body: use anim0 (walk) + // blend = 0.0 means full anim0 (walk), 1.0 means full anim1 (attack) + if (isUpperBody) boneBlendFactor = blend; // Upper body: blend towards anim1 (attack) + else boneBlendFactor = 1.0f - blend; // Lower body: blend towards anim0 (walk) - invert the blend + } + + // Get transforms from both animations + Transform *bindTransform = &model->skeleton.bindPose[boneIndex]; + Transform *animTransform0 = &anim0->keyframePoses[frame0][boneIndex]; + Transform *animTransform1 = &anim1->keyframePoses[frame1][boneIndex]; + + // Blend the transforms + Transform blended = { 0 }; + blended.translation = Vector3Lerp(animTransform0->translation, animTransform1->translation, boneBlendFactor); + blended.rotation = QuaternionSlerp(animTransform0->rotation, animTransform1->rotation, boneBlendFactor); + blended.scale = Vector3Lerp(animTransform0->scale, animTransform1->scale, boneBlendFactor); + + // Convert bind pose to matrix + Matrix bindMatrix = MatrixMultiply(MatrixMultiply( + MatrixScale(bindTransform->scale.x, bindTransform->scale.y, bindTransform->scale.z), + QuaternionToMatrix(bindTransform->rotation)), + MatrixTranslate(bindTransform->translation.x, bindTransform->translation.y, bindTransform->translation.z)); + + // Convert blended transform to matrix + Matrix blendedMatrix = MatrixMultiply(MatrixMultiply( + MatrixScale(blended.scale.x, blended.scale.y, blended.scale.z), + QuaternionToMatrix(blended.rotation)), + MatrixTranslate(blended.translation.x, blended.translation.y, blended.translation.z)); + + // Calculate final bone matrix (similar to UpdateModelAnimationBones) + model->boneMatrices[boneIndex] = MatrixMultiply(MatrixInvert(bindMatrix), blendedMatrix); + } + + // CPU skinning, updates CPU buffers and uploads them to GPU (if available) + // NOTE: Fallback in case GPU skinning is not supported or enabled + for (int m = 0; m < model->meshCount; m++) + { + Mesh mesh = model->meshes[m]; + Vector3 animVertex = { 0 }; + Vector3 animNormal = { 0 }; + const int vertexValuesCount = mesh.vertexCount*3; + + int boneIndex = 0; + int boneCounter = 0; + float boneWeight = 0.0f; + bool bufferUpdateRequired = false; // Flag to check when anim vertex information is updated + + // Skip if missing bone data or missing anim buffers initialization + if ((mesh.boneWeights == NULL) || (mesh.boneIndices == NULL) || + (mesh.animVertices == NULL) || (mesh.animNormals == NULL)) continue; + + for (int vCounter = 0; vCounter < vertexValuesCount; vCounter += 3) + { + mesh.animVertices[vCounter] = 0; + mesh.animVertices[vCounter + 1] = 0; + mesh.animVertices[vCounter + 2] = 0; + if (mesh.animNormals != NULL) + { + mesh.animNormals[vCounter] = 0; + mesh.animNormals[vCounter + 1] = 0; + mesh.animNormals[vCounter + 2] = 0; + } + + // Iterates over 4 bones per vertex + for (int j = 0; j < 4; j++, boneCounter++) + { + boneWeight = mesh.boneWeights[boneCounter]; + boneIndex = mesh.boneIndices[boneCounter]; + + // Early stop when no transformation will be applied + if (boneWeight == 0.0f) continue; + animVertex = (Vector3){ mesh.vertices[vCounter], mesh.vertices[vCounter + 1], mesh.vertices[vCounter + 2] }; + animVertex = Vector3Transform(animVertex, model->boneMatrices[boneIndex]); + mesh.animVertices[vCounter] += animVertex.x*boneWeight; + mesh.animVertices[vCounter + 1] += animVertex.y*boneWeight; + mesh.animVertices[vCounter + 2] += animVertex.z*boneWeight; + bufferUpdateRequired = true; + + // Normals processing + // NOTE: We use meshes.baseNormals (default normal) to calculate meshes.normals (animated normals) + if ((mesh.normals != NULL) && (mesh.animNormals != NULL )) + { + animNormal = (Vector3){ mesh.normals[vCounter], mesh.normals[vCounter + 1], mesh.normals[vCounter + 2] }; + animNormal = Vector3Transform(animNormal, MatrixTranspose(MatrixInvert(model->boneMatrices[boneIndex]))); + mesh.animNormals[vCounter] += animNormal.x*boneWeight; + mesh.animNormals[vCounter + 1] += animNormal.y*boneWeight; + mesh.animNormals[vCounter + 2] += animNormal.z*boneWeight; + } + } + } + + if (bufferUpdateRequired) + { + // Update GPU vertex buffers with updated data (position + normals) + rlUpdateVertexBuffer(mesh.vboId[SHADER_LOC_VERTEX_POSITION], mesh.animVertices, mesh.vertexCount*3*sizeof(float), 0); + if (mesh.normals != NULL) rlUpdateVertexBuffer(mesh.vboId[SHADER_LOC_VERTEX_NORMAL], mesh.animNormals, mesh.vertexCount*3*sizeof(float), 0); + } } - - // Get transforms from both animations - Transform *bindTransform = &model->skeleton.bindPose[boneId]; - Transform *anim1Transform = &anim1->keyframePoses[frame1][boneId]; - Transform *anim2Transform = &anim2->keyframePoses[frame2][boneId]; - - // Blend the transforms - Transform blended = { 0 }; - blended.translation = Vector3Lerp(anim1Transform->translation, anim2Transform->translation, boneBlendFactor); - blended.rotation = QuaternionSlerp(anim1Transform->rotation, anim2Transform->rotation, boneBlendFactor); - blended.scale = Vector3Lerp(anim1Transform->scale, anim2Transform->scale, boneBlendFactor); - - // Convert bind pose to matrix - Matrix bindMatrix = MatrixMultiply(MatrixMultiply( - MatrixScale(bindTransform->scale.x, bindTransform->scale.y, bindTransform->scale.z), - QuaternionToMatrix(bindTransform->rotation)), - MatrixTranslate(bindTransform->translation.x, bindTransform->translation.y, bindTransform->translation.z)); - - // Convert blended transform to matrix - Matrix blendedMatrix = MatrixMultiply(MatrixMultiply( - MatrixScale(blended.scale.x, blended.scale.y, blended.scale.z), - QuaternionToMatrix(blended.rotation)), - MatrixTranslate(blended.translation.x, blended.translation.y, blended.translation.z)); - - // Calculate final bone matrix (similar to UpdateModelAnimationBones) - model->boneMatrices[boneId] = MatrixMultiply(MatrixInvert(bindMatrix), blendedMatrix); } } diff --git a/examples/models/models_animation_blend_custom.png b/examples/models/models_animation_blend_custom.png index 0f6dbca87898af2cbf5bb535fab3ba46c6ca85fe..95ea1dad2abe0d5e93ef30d769abe9030ae3bfdd 100644 GIT binary patch literal 83827 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 qscD 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 diff --git a/examples/models/models_animation_blending.c b/examples/models/models_animation_blending.c index 39623cd28..a5d3d4b1d 100644 --- a/examples/models/models_animation_blending.c +++ b/examples/models/models_animation_blending.c @@ -21,7 +21,8 @@ #include "raylib.h" -#define clamp(x,a,b) ((x < a)? a : (x > b)? b : x) +#define RAYGUI_IMPLEMENTATION +#include "raygui.h" // Required for: UI controls #if defined(PLATFORM_DESKTOP) #define GLSL_VERSION 330 @@ -43,31 +44,58 @@ int main(void) // Define the camera to look into our 3d world Camera camera = { 0 }; - camera.position = (Vector3){ 8.0f, 8.0f, 8.0f }; // Camera position + camera.position = (Vector3){ 6.0f, 6.0f, 6.0f }; // Camera position camera.target = (Vector3){ 0.0f, 2.0f, 0.0f }; // Camera looking at point camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) camera.fovy = 45.0f; // Camera field-of-view Y camera.projection = CAMERA_PERSPECTIVE; // Camera projection type // Load model - Model characterModel = LoadModel("resources/models/gltf/robot.glb"); // Load character model - + Model model = LoadModel("resources/models/gltf/robot.glb"); // Load character model + Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model world position + // Load skinning shader + // WARNING: It requires SUPPORT_GPU_SKINNING enabled on raylib (disabled by default) Shader skinningShader = LoadShader(TextFormat("resources/shaders/glsl%i/skinning.vs", GLSL_VERSION), TextFormat("resources/shaders/glsl%i/skinning.fs", GLSL_VERSION)); // Assign skinning shader to all materials shaders - for (int i = 0; i < characterModel.materialCount; i++) characterModel.materials[i].shader = skinningShader; + //for (int i = 0; i < model.materialCount; i++) model.materials[i].shader = skinningShader; // Load model animations - int animsCount = 0; - ModelAnimation *modelAnimations = LoadModelAnimations("resources/models/gltf/robot.glb", &animsCount); + int animCount = 0; + ModelAnimation *anims = LoadModelAnimations("resources/models/gltf/robot.glb", &animCount); - // Define animation variables - unsigned int animIndex0 = 0; - unsigned int animIndex1 = 0; - float animCurrentFrame = 0; - float blendFactor = 0.5f; + // Animation playing variables + // NOTE: Two animations are played with a smooth transition between them + int currentAnimPlaying = 0; // Current animation playing (0 o 1) + int nextAnimToPlay = 1; // Next animation to play (to transition) + bool animTransition = false; // Flag to register anim transition state + + int animIndex0 = 10; // Current animation playing (walking) + float animCurrentFrame0 = 0.0f; // Current animation frame (supporting interpolated frames) + float animFrameSpeed0 = 0.5f; // Current animation play speed + int animIndex1 = 6; // Next animation to play (running) + float animCurrentFrame1 = 0.0f; // Next animation frame (supporting interpolated frames) + float animFrameSpeed1 = 0.5f; // Next animation play speed + + float animBlendFactor = 0.0f; // Blend factor from anim0[frame0] --> anim1[frame1], [0.0f..1.0f] + // NOTE: 0.0f results in full anim0[] and 1.0f in full anim1[] + + float animBlendTime = 2.0f; // Time to blend from one playing animation to another (in seconds) + float animBlendTimeCounter = 0.0f; // Time counter (delta time) + + bool animPause = false; // Pause animation + + // UI required variables + char *animNames[64] = { 0 }; // Pointers to animation names for dropdown box + for (int i = 0; i < animCount; i++) animNames[i] = anims[i].name; + + bool dropdownEditMode0 = false; + bool dropdownEditMode1 = false; + float animFrameProgress0 = 0.0f; + float animFrameProgress1 = 0.0f; + float animBlendProgress = 0.0f; SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -79,23 +107,100 @@ int main(void) //---------------------------------------------------------------------------------- UpdateCamera(&camera, CAMERA_ORBITAL); - // Select current animation - if (IsKeyPressed(KEY_T)) animIndex0 = (animIndex0 + 1)%animsCount; - else if (IsKeyPressed(KEY_G)) animIndex0 = (animIndex0 + animsCount - 1)%animsCount; - if (IsKeyPressed(KEY_Y)) animIndex1 = (animIndex1 + 1)%animsCount; - else if (IsKeyPressed(KEY_H)) animIndex1 = (animIndex1 + animsCount - 1)%animsCount; - - // Select blend factor - if (IsKeyPressed(KEY_U)) blendFactor = clamp(blendFactor - 0.1, 0.0f, 1.0f); - else if (IsKeyPressed(KEY_J)) blendFactor = clamp(blendFactor + 0.1, 0.0f, 1.0f); + if (IsKeyPressed(KEY_P)) animPause = !animPause; - // Update animation - animCurrentFrame += 0.2f; + if (!animPause) + { + // Start transition from anim0[] to anim1[] + if (IsKeyPressed(KEY_SPACE) && !animTransition) + { + if (currentAnimPlaying == 0) + { + // Transition anim0 --> anim1 + nextAnimToPlay = 1; + animCurrentFrame1 = 0.0f; + } + else + { + // Transition anim1 --> anim0 + nextAnimToPlay = 0; + animCurrentFrame0 = 0.0f; + } - // Update bones - // Note: Same animation frame index is used below. By default it loops both animations - UpdateModelAnimationEx(characterModel, modelAnimations[animIndex0], animCurrentFrame, - modelAnimations[animIndex1], animCurrentFrame, blendFactor); + // Set animation transition + animTransition = true; + animBlendTimeCounter = 0.0f; + animBlendFactor = 0.0f; + } + + if (animTransition) + { + // Playing anim0 and anim1 at the same time + animCurrentFrame0 += animFrameSpeed0; + if (animCurrentFrame0 >= anims[animIndex0].keyframeCount) animCurrentFrame0 = 0.0f; + animCurrentFrame1 += animFrameSpeed1; + if (animCurrentFrame1 >= anims[animIndex1].keyframeCount) animCurrentFrame1 = 0.0f; + + // Increment blend factor over time to transition from anim0 --> anim1 over time + // NOTE: Time blending could be other than linear, using some easing + animBlendFactor = animBlendTimeCounter/animBlendTime; + animBlendTimeCounter += GetFrameTime(); + animBlendProgress = animBlendFactor; + + // Update model with animations blending + if (nextAnimToPlay == 1) + { + // Blend anim0 --> anim1 + UpdateModelAnimationEx(model, anims[animIndex0], animCurrentFrame0, + anims[animIndex1], animCurrentFrame1, animBlendFactor); + } + else + { + // Blend anim1 --> anim0 + UpdateModelAnimationEx(model, anims[animIndex1], animCurrentFrame1, + anims[animIndex0], animCurrentFrame0, animBlendFactor); + } + + // Check if transition completed + if (animBlendFactor > 1.0f) + { + // Reset frame states + if (currentAnimPlaying == 0) animCurrentFrame0 = 0.0f; + else if (currentAnimPlaying == 1) animCurrentFrame1 = 0.0f; + currentAnimPlaying = nextAnimToPlay; // Update current animation playing + + animBlendFactor = 0.0f; // Reset blend factor + animTransition = false; // Exit transition mode + animBlendTimeCounter = 0.0f; + } + } + else + { + // Play only one anim, the current one + if (currentAnimPlaying == 0) + { + // Playing anim0 at defined speed + animCurrentFrame0 += animFrameSpeed0; + if (animCurrentFrame0 >= anims[animIndex0].keyframeCount) animCurrentFrame0 = 0.0f; + UpdateModelAnimation(model, anims[animIndex0], animCurrentFrame0); + //UpdateModelAnimationEx(model, anims[animIndex0], animCurrentFrame0, + // anims[animIndex1], animCurrentFrame1, 0.0f); + } + else if (currentAnimPlaying == 1) + { + // Playing anim1 at defined speed + animCurrentFrame1 += animFrameSpeed1; + if (animCurrentFrame1 >= anims[animIndex1].keyframeCount) animCurrentFrame1 = 0.0f; + UpdateModelAnimation(model, anims[animIndex1], animCurrentFrame1); + //UpdateModelAnimationEx(model, anims[animIndex0], animCurrentFrame0, + // anims[animIndex1], animCurrentFrame1, 1.0f); + } + } + } + + // Update progress bars values with current frame for each animation + float animFrameProgress0 = animCurrentFrame0; + float animFrameProgress1 = animCurrentFrame1; //---------------------------------------------------------------------------------- // Draw @@ -106,16 +211,47 @@ int main(void) BeginMode3D(camera); - DrawModel(characterModel, (Vector3){0.0f, 0.0f, 0.0f}, 1.0f, WHITE); + DrawModel(model, position, 1.0f, WHITE); // Draw animated model + DrawGrid(10, 1.0f); EndMode3D(); - DrawText("Use the U/J to adjust blend factor", 10, 10, 20, GRAY); - DrawText("Use the T/G to switch first animation", 10, 30, 20, GRAY); - DrawText("Use the Y/H to switch second animation", 10, 50, 20, GRAY); - DrawText(TextFormat("Animations: %s, %s", modelAnimations[animIndex0].name, modelAnimations[animIndex1].name), 10, 70, 20, BLACK); - DrawText(TextFormat("Blend Factor: %f", blendFactor), 10, 86, 20, BLACK); + if (animTransition) DrawText("ANIM TRANSITION BLENDING!", 170, 50, 30, BLUE); + + // Draw UI elements + //--------------------------------------------------------------------------------------------- + // Draw animation selectors for blending transition + // NOTE: Transition does not start until requested + GuiSetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING, 1); + if (GuiDropdownBox((Rectangle){ 10, 10, 160, 24 }, TextJoin(animNames, animCount, ";"), + &animIndex0, dropdownEditMode0)) dropdownEditMode0 = !dropdownEditMode0; + + // Blending process progress bar + if (nextAnimToPlay == 1) GuiSetStyle(PROGRESSBAR, PROGRESS_SIDE, 0); // Left-->Right + else GuiSetStyle(PROGRESSBAR, PROGRESS_SIDE, 1); // Right-->Left + GuiProgressBar((Rectangle){ 180, 14, 440, 16 }, NULL, NULL, &animBlendProgress, 0.0f, 1.0f); + GuiSetStyle(PROGRESSBAR, PROGRESS_SIDE, 0); // Reset to Left-->Right + + if (GuiDropdownBox((Rectangle){ GetScreenWidth() - 170, 10, 160, 24 }, TextJoin(animNames, animCount, ";"), + &animIndex1, dropdownEditMode1)) dropdownEditMode1 = !dropdownEditMode1; + + // Draw playing timeline with keyframes for anim0[] + GuiProgressBar((Rectangle){ 60, GetScreenHeight() - 60, GetScreenWidth() - 180, 20 }, "ANIM 0", + TextFormat("FRAME: %.2f / %i", animFrameProgress0, anims[animIndex0].keyframeCount), + &animFrameProgress0, 0.0f, (float)anims[animIndex0].keyframeCount); + for (int i = 0; i < anims[animIndex0].keyframeCount; i++) + DrawRectangle(60 + ((float)(GetScreenWidth() - 180)/(float)anims[animIndex0].keyframeCount)*(float)i, + GetScreenHeight() - 60, 1, 20, BLUE); + + // Draw playing timeline with keyframes for anim1[] + GuiProgressBar((Rectangle){ 60, GetScreenHeight() - 30, GetScreenWidth() - 180, 20 }, "ANIM 1", + TextFormat("FRAME: %.2f / %i", animFrameProgress1, anims[animIndex1].keyframeCount), + &animFrameProgress1, 0.0f, (float)anims[animIndex1].keyframeCount); + for (int i = 0; i < anims[animIndex1].keyframeCount; i++) + DrawRectangle(60 + ((float)(GetScreenWidth() - 180)/(float)anims[animIndex1].keyframeCount)*(float)i, + GetScreenHeight() - 30, 1, 20, BLUE); + //--------------------------------------------------------------------------------------------- EndDrawing(); //---------------------------------------------------------------------------------- @@ -123,9 +259,8 @@ int main(void) // De-Initialization //-------------------------------------------------------------------------------------- - UnloadModelAnimations(modelAnimations, animsCount); // Unload model animation - UnloadModel(characterModel); // Unload model and meshes/material - + UnloadModelAnimations(anims, animCount); // Unload model animation + UnloadModel(model); // Unload model and meshes/material UnloadShader(skinningShader); // Unload GPU skinning shader CloseWindow(); // Close window and OpenGL context diff --git a/examples/models/models_animation_blending.png b/examples/models/models_animation_blending.png index 0d70c1a88436a01b3689693035840c34133cd936..d1ca4a51bc254686bea1b9e979d2760422071fed 100644 GIT binary patch literal 28003 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 z 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 F{{csB+`Rw* literal 26143 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踶GXh~jYVq$`4YMFi*YwYaw_;8L5!(E+DCTM?N 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 HR>uDTmGoo_ diff --git a/examples/models/models_animation_timming.c b/examples/models/models_animation_timing.c similarity index 57% rename from examples/models/models_animation_timming.c rename to examples/models/models_animation_timing.c index 8069537ce..d845e3a9c 100644 --- a/examples/models/models_animation_timming.c +++ b/examples/models/models_animation_timing.c @@ -1,6 +1,6 @@ /******************************************************************************************* * -* raylib [models] example - animation timming +* raylib [models] example - animation timing * * Example complexity rating: [★★☆☆] 2/4 * @@ -16,7 +16,7 @@ #include "raylib.h" #define RAYGUI_IMPLEMENTATION -#include "raygui.h" // Required for: UI controls +#include "raygui.h" // Required for: UI controls //------------------------------------------------------------------------------------ // Program main entry point @@ -28,7 +28,7 @@ int main(void) const int screenWidth = 800; const int screenHeight = 450; - InitWindow(screenWidth, screenHeight, "raylib [models] example - animation timming"); + InitWindow(screenWidth, screenHeight, "raylib [models] example - animation timing"); // Define the camera to look into our 3d world Camera camera = { 0 }; @@ -43,13 +43,21 @@ int main(void) Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model world position // Load model animations - int animsCount = 0; - ModelAnimation *modelAnimations = LoadModelAnimations("resources/models/gltf/robot.glb", &animsCount); + int animCount = 0; + ModelAnimation *anims = LoadModelAnimations("resources/models/gltf/robot.glb", &animCount); // Animation playing variables - unsigned int animIndex = 0; // Current animation playing + int animIndex = 10; // Current animation playing float animCurrentFrame = 0.0f; // Current animation frame (supporting interpolated frames) - float animFrameSpeed = 0.1f; // Animation play speed + float animFrameSpeed = 0.5f; // Animation play speed + bool animPause = false; // Pause animation + + // UI required variables + char *animNames[64] = { 0 }; + for (int i = 0; i < animCount; i++) animNames[i] = anims[i].name; + + bool dropdownEditMode = false; + float animFrameProgress = 0.0f; SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -61,17 +69,20 @@ int main(void) //---------------------------------------------------------------------------------- UpdateCamera(&camera, CAMERA_ORBITAL); - // Select current animation - if (IsMouseButtonPressed(MOUSE_BUTTON_RIGHT)) animIndex = (animIndex + 1)%animsCount; - else if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) animIndex = (animIndex + animsCount - 1)%animsCount; + if (IsKeyPressed(KEY_P)) animPause = !animPause; - // Select animation playing speed - if (IsKeyPressed(KEY_RIGHT)) animFrameSpeed += 0.1f; - else if (IsKeyPressed(KEY_LEFT)) animFrameSpeed -= 0.1f; + if (!animPause && (animIndex < animCount)) + { + // Update model animation + animCurrentFrame += animFrameSpeed; + if (animCurrentFrame >= anims[animIndex].keyframeCount) animCurrentFrame = 0.0f; + UpdateModelAnimation(model, anims[animIndex], animCurrentFrame); + } - // Update model animation - animCurrentFrame += animFrameSpeed; - UpdateModelAnimation(model, modelAnimations[animIndex], animCurrentFrame); + // NOTE: Animation and playing speed selected through UI + + // Update progressbar value with current frame + animFrameProgress = animCurrentFrame; //---------------------------------------------------------------------------------- // Draw @@ -88,13 +99,22 @@ int main(void) EndMode3D(); - // Draw UI - //GuiDropdownBox((Rectangle){ 10, 20, 240, 30 }, "text", &animIndex, editMode); + // Draw UI, select anim and playing speed + GuiSetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING, 1); + if (GuiDropdownBox((Rectangle){ 10, 10, 140, 24 }, TextJoin(animNames, animCount, ";"), + &animIndex, dropdownEditMode)) dropdownEditMode = !dropdownEditMode; - DrawText(TextFormat("FRAME SPEED: x%.1f", animFrameSpeed), 10, 40, 20, RED); + GuiSlider((Rectangle){ 260, 10, 500, 24 }, "FRAME SPEED: ", TextFormat("x%.1f", animFrameSpeed), + &animFrameSpeed, 0.1f, 2.0f); - DrawText("Use the LEFT/RIGHT mouse buttons to switch animation", 10, 10, 20, GRAY); - DrawText(TextFormat("Animation: %s", modelAnimations[animIndex].name), 10, GetScreenHeight() - 20, 10, DARKGRAY); + // Draw playing timeline with keyframes + GuiLabel((Rectangle){ 10, GetScreenHeight() - 64, GetScreenWidth() - 20, 24 }, + TextFormat("CURRENT FRAME: %.2f / %i", animFrameProgress, anims[animIndex].keyframeCount)); + GuiProgressBar((Rectangle){ 10, GetScreenHeight() - 40, GetScreenWidth() - 20, 24 }, NULL, NULL, + &animFrameProgress, 0.0f, (float)anims[animIndex].keyframeCount); + for (int i = 0; i < anims[animIndex].keyframeCount; i++) + DrawRectangle(10 + ((float)(GetScreenWidth() - 20)/(float)anims[animIndex].keyframeCount)*(float)i, + GetScreenHeight() - 40, 1, 24, BLUE); EndDrawing(); //---------------------------------------------------------------------------------- @@ -102,6 +122,7 @@ int main(void) // De-Initialization //-------------------------------------------------------------------------------------- + UnloadModelAnimations(anims, animCount); // Unload model animation UnloadModel(model); // Unload model and meshes/material CloseWindow(); // Close window and OpenGL context @@ -110,5 +131,3 @@ int main(void) return 0; } - - diff --git a/examples/models/models_animation_timing.png b/examples/models/models_animation_timing.png new file mode 100644 index 0000000000000000000000000000000000000000..4448fec67af1efcdda7c26d444ae2cea3aff867c GIT binary patch literal 23489 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Ν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 B^KJkD literal 0 HcmV?d00001 diff --git a/examples/models/models_animation_timming.png b/examples/models/models_animation_timming.png deleted file mode 100644 index 673994b7c4451ad3a8f431a9e92cf21406496fbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22154 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 diff --git a/examples/models/models_loading.c b/examples/models/models_loading.c index 650b3126f..0672da047 100644 --- a/examples/models/models_loading.c +++ b/examples/models/models_loading.c @@ -7,11 +7,11 @@ * NOTE: raylib supports multiple models file formats: * * - OBJ > Text file format. Must include vertex position-texcoords-normals information, -* if files references some .mtl materials file, it will be loaded (or try to) -* - GLTF > Text/binary file format. Includes lot of information and it could -* also reference external files, raylib will try loading mesh and materials data +* if .obj references some .mtl materials file, it will be tried to be loaded +* - GLTF/GLB > Text/binary file formats. Includes lot of information and it could +* also reference external files, mesh and materials data will be tried to be loaded * - IQM > Binary file format. Includes mesh vertex data but also animation data, -* raylib can load .iqm animations +* meshes and animation data can be loaded * - VOX > Binary file format. MagikaVoxel mesh format: * https://github.com/ephtracy/voxel-model/blob/master/MagicaVoxel-file-format-vox.txt * - M3D > Binary file format. Model 3D format: @@ -43,10 +43,10 @@ int main(void) // Define the camera to look into our 3d world Camera camera = { 0 }; camera.position = (Vector3){ 50.0f, 50.0f, 50.0f }; // Camera position - camera.target = (Vector3){ 0.0f, 10.0f, 0.0f }; // Camera looking at point + camera.target = (Vector3){ 0.0f, 12.0f, 0.0f }; // Camera looking at point camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) camera.fovy = 45.0f; // Camera field-of-view Y - camera.projection = CAMERA_PERSPECTIVE; // Camera mode type + camera.projection = CAMERA_PERSPECTIVE; // Camera mode type Model model = LoadModel("resources/models/obj/castle.obj"); // Load model Texture2D texture = LoadTexture("resources/models/obj/castle_diffuse.png"); // Load model texture @@ -61,8 +61,6 @@ int main(void) bool selected = false; // Selected object flag - DisableCursor(); // Limit cursor to relative movement inside the window - SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -71,7 +69,7 @@ int main(void) { // Update //---------------------------------------------------------------------------------- - UpdateCamera(&camera, CAMERA_FIRST_PERSON); + UpdateCamera(&camera, CAMERA_ORBITAL); // Load new models/textures on drag&drop if (IsFileDropped()) @@ -93,7 +91,10 @@ int main(void) bounds = GetMeshBoundingBox(model.meshes[0]); - // TODO: Move camera position from target enough distance to visualize model properly + // Move camera position from target enough distance to visualize model properly + camera.position.x = bounds.max.x + 10.0f; + camera.position.y = bounds.max.y + 10.0f; + camera.position.z = bounds.max.z + 10.0f; } else if (IsFileExtension(droppedFiles.paths[0], ".png")) // Texture file formats supported { diff --git a/examples/models/models_loading_gltf.c b/examples/models/models_loading_gltf.c index 7729da13f..f21207ba1 100644 --- a/examples/models/models_loading_gltf.c +++ b/examples/models/models_loading_gltf.c @@ -42,15 +42,17 @@ int main(void) camera.fovy = 45.0f; // Camera field-of-view Y camera.projection = CAMERA_PERSPECTIVE; // Camera projection type - // Load gltf model + // Load model Model model = LoadModel("resources/models/gltf/robot.glb"); - Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position + Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model world position - // Load gltf model animations - int animsCount = 0; - unsigned int animIndex = 0; - unsigned int animCurrentFrame = 0; - ModelAnimation *modelAnimations = LoadModelAnimations("resources/models/gltf/robot.glb", &animsCount); + // Load model animations + int animCount = 0; + ModelAnimation *anims = LoadModelAnimations("resources/models/gltf/robot.glb", &animCount); + + // Animation playing variables + unsigned int animIndex = 0; // Current animation playing + unsigned int animCurrentFrame = 0; // Current animation frame SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -63,13 +65,12 @@ int main(void) UpdateCamera(&camera, CAMERA_ORBITAL); // Select current animation - if (IsMouseButtonPressed(MOUSE_BUTTON_RIGHT)) animIndex = (animIndex + 1)%animsCount; - else if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) animIndex = (animIndex + animsCount - 1)%animsCount; + if (IsKeyPressed(KEY_RIGHT)) animIndex = (animIndex + 1)%animCount; + else if (IsKeyPressed(KEY_LEFT)) animIndex = (animIndex + animCount - 1)%animCount; // Update model animation - ModelAnimation anim = modelAnimations[animIndex]; - animCurrentFrame = (animCurrentFrame + 1)%anim.frameCount; - UpdateModelAnimation(model, anim, animCurrentFrame); + animCurrentFrame = (animCurrentFrame + 1)%anims[animIndex].keyframeCount; + UpdateModelAnimation(model, anims[animIndex], (float)animCurrentFrame); //---------------------------------------------------------------------------------- // Draw @@ -79,12 +80,15 @@ int main(void) ClearBackground(RAYWHITE); BeginMode3D(camera); - DrawModel(model, position, 1.0f, WHITE); // Draw animated model + + DrawModel(model, position, 1.0f, WHITE); + DrawGrid(10, 1.0f); + EndMode3D(); - DrawText("Use the LEFT/RIGHT mouse buttons to switch animation", 10, 10, 20, GRAY); - DrawText(TextFormat("Animation: %s", anim.name), 10, GetScreenHeight() - 20, 10, DARKGRAY); + DrawText(TextFormat("Current animation: %s", anims[animIndex].name), 10, 40, 20, MAROON); + DrawText("Use the LEFT/RIGHT keys to switch animation", 10, 10, 20, GRAY); EndDrawing(); //---------------------------------------------------------------------------------- @@ -92,7 +96,8 @@ int main(void) // De-Initialization //-------------------------------------------------------------------------------------- - UnloadModel(model); // Unload model and meshes/material + UnloadModelAnimations(anims, animCount); // Unload model animations data + UnloadModel(model); // Unload model CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- diff --git a/examples/models/models_loading_gltf.png b/examples/models/models_loading_gltf.png index ce2a85284077b0cce9fbfb8b63f326ca48013be8..9aa3e23501db07da0c1f0f630574d9fdd1420b39 100644 GIT binary patch literal 22136 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%0DXCk@=8pxu^9@OA5hv! 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 diff --git a/examples/models/models_loading_iqm.c b/examples/models/models_loading_iqm.c index 97d97ad40..0eab898a4 100644 --- a/examples/models/models_loading_iqm.c +++ b/examples/models/models_loading_iqm.c @@ -8,17 +8,15 @@ * * Example contributed by Culacant (@culacant) and reviewed by Ramon Santamaria (@raysan5) * +* NOTES: To export an IQM model from blender, make sure it is not posed, the vertices need +* to be in the same position as they would be in edit mode and the scale of the models is +* set to 0; scaling can be set from the export menu +* * Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, * BSD-like license that allows static linking with closed source software * * Copyright (c) 2019-2025 Culacant (@culacant) and Ramon Santamaria (@raysan5) * -******************************************************************************************** -* -* NOTE: To export a model from blender, make sure it is not posed, the vertices need to be -* in the same position as they would be in edit mode and the scale of your models is -* set to 0. Scaling can be done from the export menu -* ********************************************************************************************/ #include "raylib.h" @@ -38,7 +36,7 @@ int main(void) // Define the camera to look into our 3d world Camera camera = { 0 }; camera.position = (Vector3){ 10.0f, 10.0f, 10.0f }; // Camera position - camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point + camera.target = (Vector3){ 0.0f, 4.0f, 0.0f }; // Camera looking at point camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) camera.fovy = 45.0f; // Camera field-of-view Y camera.projection = CAMERA_PERSPECTIVE; // Camera mode type @@ -46,15 +44,16 @@ int main(void) Model model = LoadModel("resources/models/iqm/guy.iqm"); // Load the animated model mesh and basic data Texture2D texture = LoadTexture("resources/models/iqm/guytex.png"); // Load model texture and set material SetMaterialTexture(&model.materials[0], MATERIAL_MAP_DIFFUSE, texture); // Set model material map texture - - Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position + Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position // Load animation data - int animsCount = 0; - ModelAnimation *anims = LoadModelAnimations("resources/models/iqm/guyanim.iqm", &animsCount); - float animFrameCounter = 0; + int animCount = 0; + ModelAnimation *anims = LoadModelAnimations("resources/models/iqm/guyanim.iqm", &animCount); + + // Animation playing variables + unsigned int animIndex = 0; // Current animation playing + float animCurrentFrame = 0.0f; // Current animation frame (supporting interpolated frames) - DisableCursor(); // Catch cursor SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -66,9 +65,9 @@ int main(void) UpdateCamera(&camera, CAMERA_ORBITAL); // Play animation when spacebar is held down - animFrameCounter += 1.0f; - UpdateModelAnimation(model, anims[0], animFrameCounter); - if (animFrameCounter >= anims[0].keyframeCount) animFrameCounter = 0; + animCurrentFrame += 1.0f; + UpdateModelAnimation(model, anims[0], animCurrentFrame); + if (animCurrentFrame >= anims[0].keyframeCount) animCurrentFrame = 0; //---------------------------------------------------------------------------------- // Draw @@ -81,16 +80,11 @@ int main(void) DrawModelEx(model, position, (Vector3){ 1.0f, 0.0f, 0.0f }, -90.0f, (Vector3){ 1.0f, 1.0f, 1.0f }, WHITE); - for (int i = 0; i < model.skeleton.boneCount; i++) - { - //DrawCube(anims[0].keyframePoses[animFrameCounter][i].translation, 0.2f, 0.2f, 0.2f, RED); - } - - DrawGrid(10, 1.0f); // Draw a grid + DrawGrid(10, 1.0f); EndMode3D(); - DrawText("PRESS SPACE to PLAY MODEL ANIMATION", 10, 10, 20, MAROON); + DrawText(TextFormat("Current animation: %s", anims[animIndex].name), 10, 10, 20, MAROON); DrawText("(c) Guy IQM 3D model by @culacant", screenWidth - 200, screenHeight - 20, 10, GRAY); EndDrawing(); @@ -99,9 +93,9 @@ int main(void) // De-Initialization //-------------------------------------------------------------------------------------- - UnloadTexture(texture); // Unload texture - UnloadModelAnimations(anims, animsCount); // Unload model animations data - UnloadModel(model); // Unload model + UnloadTexture(texture); // Unload texture + UnloadModelAnimations(anims, animCount); // Unload model animations data + UnloadModel(model); // Unload model CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- diff --git a/examples/models/models_loading_iqm.png b/examples/models/models_loading_iqm.png index 57e39dd3e1a40cb357bd8fcc0f4ad69bb695da21..560cb3580ae3d2542d05386adbe03177461e1c28 100644 GIT binary patch literal 59771 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 a76yiSu3=w}G)%K&00K`}KbLh*2~7aM4-;nq literal 67020 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

nx+G@icFY4x~P!mlg=U-u#vOWz< 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

*k;B!N<*xC7{1c z_X`oB!{;>vzgbkB%Uv8k%L@{y9_zngv;qMQkA*-gN+q`h&&-n{;NP~bE_Qcp=`sHY Dw%LXw diff --git a/examples/models/models_loading_m3d.c b/examples/models/models_loading_m3d.c index 452a21610..06911bf53 100644 --- a/examples/models/models_loading_m3d.c +++ b/examples/models/models_loading_m3d.c @@ -21,6 +21,8 @@ #include "raylib.h" +static void DrawModelSkeleton(ModelSkeleton skeleton, ModelAnimPose pose, float scale, Color color); + //------------------------------------------------------------------------------------ // Program main entry point //------------------------------------------------------------------------------------ @@ -41,22 +43,17 @@ int main(void) camera.fovy = 45.0f; // Camera field-of-view Y camera.projection = CAMERA_PERSPECTIVE; // Camera projection type - Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position - - char modelFileName[128] = "resources/models/m3d/cesium_man.m3d"; - bool drawMesh = 1; - bool drawSkeleton = 1; - bool animPlaying = false; // Store anim state, what to draw - // Load model - Model model = LoadModel(modelFileName); // Load the bind-pose model mesh and basic data + Model model = LoadModel("resources/models/m3d/cesium_man.m3d"); // Load the animated model mesh and basic data + Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position - // Load animations - int animsCount = 0; - int animFrameCounter = 0, animId = 0; - ModelAnimation *anims = LoadModelAnimations(modelFileName, &animsCount); // Load skeletal animation data + // Load animation data + int animCount = 0; + ModelAnimation *anims = LoadModelAnimations("resources/models/m3d/cesium_man.m3d", &animCount); - DisableCursor(); // Limit cursor to relative movement inside the window + // Animation playing variables + unsigned int animIndex = 0; // Current animation playing + float animCurrentFrame = 0.0f; // Current animation frame (supporting interpolated frames) SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -66,38 +63,16 @@ int main(void) { // Update //---------------------------------------------------------------------------------- - UpdateCamera(&camera, CAMERA_FIRST_PERSON); + UpdateCamera(&camera, CAMERA_ORBITAL); - if (animsCount) - { - // Play animation when spacebar is held down (or step one frame with N) - if (IsKeyDown(KEY_SPACE) || IsKeyPressed(KEY_N)) - { - animFrameCounter++; + // Select current animation + if (IsKeyPressed(KEY_RIGHT)) animIndex = (animIndex + 1)%animCount; + else if (IsKeyPressed(KEY_LEFT)) animIndex = (animIndex + animCount - 1)%animCount; - if (animFrameCounter >= anims[animId].frameCount) animFrameCounter = 0; - - UpdateModelAnimation(model, anims[animId], animFrameCounter); - animPlaying = true; - } - - // Select animation by pressing C - if (IsKeyPressed(KEY_C)) - { - animFrameCounter = 0; - animId++; - - if (animId >= (int)animsCount) animId = 0; - UpdateModelAnimation(model, anims[animId], 0); - animPlaying = true; - } - } - - // Toggle skeleton drawing - if (IsKeyPressed(KEY_B)) drawSkeleton ^= 1; - - // Toggle mesh drawing - if (IsKeyPressed(KEY_M)) drawMesh ^= 1; + // Update model animation + animCurrentFrame += 1.0f; + if (animCurrentFrame >= anims[animIndex].keyframeCount) animCurrentFrame = 0.0f; + UpdateModelAnimation(model, anims[animIndex], animCurrentFrame); //---------------------------------------------------------------------------------- // Draw @@ -109,52 +84,19 @@ int main(void) BeginMode3D(camera); // Draw 3d model with texture - if (drawMesh) DrawModel(model, position, 1.0f, WHITE); - - // Draw the animated skeleton - if (drawSkeleton) + if (!IsKeyDown(KEY_SPACE)) DrawModel(model, position, 1.0f, WHITE); + else { - // Loop to (boneCount - 1) because the last one is a special "no bone" bone, - // needed to workaround buggy models - // without a -1, we would always draw a cube at the origin - for (int i = 0; i < model.boneCount - 1; i++) - { - // By default the model is loaded in bind-pose by LoadModel() - // But if UpdateModelAnimation() has been called at least once - // then the model is already in animation pose, so we need the animated skeleton - if (!animPlaying || !animsCount) - { - // Display the bind-pose skeleton - DrawCube(model.bindPose[i].translation, 0.04f, 0.04f, 0.04f, RED); - - if (model.bones[i].parent >= 0) - { - DrawLine3D(model.bindPose[i].translation, - model.bindPose[model.bones[i].parent].translation, RED); - } - } - else - { - // Display the frame-pose skeleton - DrawCube(anims[animId].framePoses[animFrameCounter][i].translation, 0.05f, 0.05f, 0.05f, RED); - - if (anims[animId].bones[i].parent >= 0) - { - DrawLine3D(anims[animId].framePoses[animFrameCounter][i].translation, - anims[animId].framePoses[animFrameCounter][anims[animId].bones[i].parent].translation, RED); - } - } - } + // Draw the animated skeleton + DrawModelSkeleton(model.skeleton, anims[animIndex].keyframePoses[(int)animCurrentFrame], 1.0f, RED); } - DrawGrid(10, 1.0f); // Draw a grid + DrawGrid(10, 1.0f); EndMode3D(); - DrawText("PRESS SPACE to PLAY MODEL ANIMATION", 10, GetScreenHeight() - 80, 10, MAROON); - DrawText("PRESS N to STEP ONE ANIMATION FRAME", 10, GetScreenHeight() - 60, 10, DARKGRAY); - DrawText("PRESS C to CYCLE THROUGH ANIMATIONS", 10, GetScreenHeight() - 40, 10, DARKGRAY); - DrawText("PRESS M to toggle MESH, B to toggle SKELETON DRAWING", 10, GetScreenHeight() - 20, 10, DARKGRAY); + DrawText(TextFormat("Current animation: %s", anims[animIndex].name), 10, 10, 20, LIGHTGRAY); + DrawText("Press SPACE to draw skeleton", 10, 40, 20, MAROON); DrawText("(c) CesiumMan model by KhronosGroup", GetScreenWidth() - 210, GetScreenHeight() - 20, 10, GRAY); EndDrawing(); @@ -163,14 +105,28 @@ int main(void) // De-Initialization //-------------------------------------------------------------------------------------- - - // Unload model animations data - UnloadModelAnimations(anims, animsCount); - - UnloadModel(model); // Unload model + UnloadModelAnimations(anims, animCount); // Unload model animations data + UnloadModel(model); // Unload model CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return 0; } + +// Draw model skeleton +static void DrawModelSkeleton(ModelSkeleton skeleton, ModelAnimPose pose, float scale, Color color) +{ + // Loop to (boneCount - 1) because the last one is a special "no bone" bone, + // needed to workaround buggy models without a -1, a cube is always drawn at the origin + for (int i = 0; i < skeleton.boneCount - 1; i++) + { + // Display the frame-pose skeleton + DrawCube(pose[i].translation, scale*0.05f, scale*0.05f, scale*0.05f, color); + + if (skeleton.bones[i].parent >= 0) + { + DrawLine3D(pose[i].translation, pose[skeleton.bones[i].parent].translation, color); + } + } +} \ No newline at end of file diff --git a/examples/models/models_loading_m3d.png b/examples/models/models_loading_m3d.png index 9220419ad1c9124b887dc019f0ecdf776eac1f31..101831c60eddfc7b8042660bc502e9dc7c4dfb32 100644 GIT binary patch literal 22930 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 literal 25881 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 l%o%Vu0{0rQ56G!+dTcYHd8`V{|m|TrIG*u diff --git a/examples/models/models_loading_vox.c b/examples/models/models_loading_vox.c index 06dc651d7..04b203ad9 100644 --- a/examples/models/models_loading_vox.c +++ b/examples/models/models_loading_vox.c @@ -25,9 +25,9 @@ #include "rlights.h" #if defined(PLATFORM_DESKTOP) -#define GLSL_VERSION 330 + #define GLSL_VERSION 330 #else // PLATFORM_ANDROID, PLATFORM_WEB -#define GLSL_VERSION 100 + #define GLSL_VERSION 100 #endif //------------------------------------------------------------------------------------ @@ -130,6 +130,7 @@ int main(void) camerarot.y = 0; } + // Update camere movement, custom controls UpdateCameraPro(&camera, (Vector3){ (IsKeyDown(KEY_W) || IsKeyDown(KEY_UP))*0.1f - (IsKeyDown(KEY_S) || IsKeyDown(KEY_DOWN))*0.1f, // Move forward-backward (IsKeyDown(KEY_D) || IsKeyDown(KEY_RIGHT))*0.1f - (IsKeyDown(KEY_A) || IsKeyDown(KEY_LEFT))*0.1f, // Move right-left @@ -173,7 +174,7 @@ int main(void) DrawText("- MOUSE LEFT BUTTON: CYCLE VOX MODELS", 20, 50, 10, BLUE); DrawText("- MOUSE MIDDLE BUTTON: ZOOM OR ROTATE CAMERA", 20, 70, 10, BLUE); DrawText("- UP-DOWN-LEFT-RIGHT KEYS: MOVE CAMERA", 20, 90, 10, BLUE); - DrawText(TextFormat("Model file: %s", GetFileName(voxFileNames[currentModel])), 10, 10, 20, GRAY); + DrawText(TextFormat("VOX model file: %s", GetFileName(voxFileNames[currentModel])), 10, 10, 20, GRAY); EndDrawing(); //---------------------------------------------------------------------------------- diff --git a/examples/models/models_loading_vox.png b/examples/models/models_loading_vox.png index 417d887e4a7f9798833c6d112c9277dd522a0d8d..2bae0ab3e49ac54573f95ba86a1e5fd3ce4f463a 100644 GIT binary patch literal 37121 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 diff --git a/projects/VS2022/examples/models_animation_timming.vcxproj b/projects/VS2022/examples/models_animation_timing.vcxproj similarity index 99% rename from projects/VS2022/examples/models_animation_timming.vcxproj rename to projects/VS2022/examples/models_animation_timing.vcxproj index a18123bbc..9a1034925 100644 --- a/projects/VS2022/examples/models_animation_timming.vcxproj +++ b/projects/VS2022/examples/models_animation_timing.vcxproj @@ -55,7 +55,7 @@ Win32Proj models_animation_timming 10.0 - models_animation_timming + models_animation_timing @@ -553,7 +553,7 @@ - + diff --git a/projects/VS2022/raylib.sln b/projects/VS2022/raylib.sln index 51268e037..02fe4b197 100644 --- a/projects/VS2022/raylib.sln +++ b/projects/VS2022/raylib.sln @@ -435,7 +435,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "models_animation_blending", EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core_window_web", "examples\core_window_web.vcxproj", "{4E7157E0-6CDB-47AE-A19A-FEC3876FA8A3}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "models_animation_timming", "examples\models_animation_timming.vcxproj", "{89D5A0E9-683C-465C-BF85-A880865175C8}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "models_animation_timing", "examples\models_animation_timing.vcxproj", "{89D5A0E9-683C-465C-BF85-A880865175C8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/config.h b/src/config.h index 3beaeeceb..5fb4f5545 100644 --- a/src/config.h +++ b/src/config.h @@ -131,13 +131,13 @@ // Module: rlgl - Configuration values //------------------------------------------------------------------------------------ #if !defined(EXTERNAL_CONFIG_FLAGS) +//#define SUPPORT_GPU_SKINNING 1 // GPU skinning, comment if your GPU does not support more than 8 VBOs + // Enable OpenGL Debug Context (only available on OpenGL 4.3) -//#define RLGL_ENABLE_OPENGL_DEBUG_CONTEXT 1 +//#define RLGL_ENABLE_OPENGL_DEBUG_CONTEXT 1 // OpenGL debug context requested // Show OpenGL extensions and capabilities detailed logs on init -//#define RLGL_SHOW_GL_DETAILS_INFO 1 - -#define RL_SUPPORT_MESH_GPU_SKINNING 1 // GPU skinning, comment if your GPU does not support more than 8 VBOs +//#define RLGL_SHOW_GL_DETAILS_INFO 1 // Show OpenGL detailed info on initialization (limits and extensions) #endif //#define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 4096 // Default internal render batch elements limits @@ -149,8 +149,8 @@ #define RL_MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported -#define RL_CULL_DISTANCE_NEAR 0.05 // Default projection matrix near cull distance -#define RL_CULL_DISTANCE_FAR 4000.0 // Default projection matrix far cull distance +#define RL_CULL_DISTANCE_NEAR 0.05 // Default projection matrix near cull distance +#define RL_CULL_DISTANCE_FAR 4000.0 // Default projection matrix far cull distance // Default shader vertex attribute locations #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION 0 @@ -160,27 +160,31 @@ #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT 4 #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 5 #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_INDICES 6 -#if defined(RL_SUPPORT_MESH_GPU_SKINNING) - #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS 7 +#if defined(SUPPORT_GPU_SKINNING) + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES 7 #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS 8 #endif -#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCE_TX 9 +#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCETRANSFORMS 9 -// Default shader vertex attribute names to set location points -// NOTE: When a new shader is loaded, the following locations are tried to be set for convenience +// Default shader vertex attribute/uniform names to set location points +// NOTE: When a new shader is loaded, locations are tried to be set for convenience, +// if the following names are found in the shader, if not, it's up to the user to set locations #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 +#define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEINDICES "vertexBoneIndices" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES +#define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS "vertexBoneWeights" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS #define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP "mvp" // model-view-projection matrix #define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW "matView" // view matrix #define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION "matProjection" // projection matrix #define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL "matModel" // model matrix #define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL "matNormal" // normal matrix (transpose(inverse(matModelView)) -#define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR "colDiffuse" // color diffuse (base tint color, multiplied by texture color) +#define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR "colDiffuse" // color diffuse (tint color, multiplied by texture color) +#define RL_DEFAULT_SHADER_UNIFORM_NAME_BONEMATRICES "boneMatrices" // bone matrices #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 "texture0" // texture0 (texture slot active 0) #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 "texture1" // texture1 (texture slot active 1) #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2) @@ -278,10 +282,11 @@ //------------------------------------------------------------------------------------ #define MAX_MATERIAL_MAPS 12 // Maximum number of shader maps supported -#ifdef RL_SUPPORT_MESH_GPU_SKINNING -#define MAX_MESH_VERTEX_BUFFERS 9 // Maximum vertex buffers (VBO) per mesh +#ifdef SUPPORT_GPU_SKINNING + // NOTE: Two additional vertex buffers required to store bone indices and bone weights + #define MAX_MESH_VERTEX_BUFFERS 9 // Maximum vertex buffers (VBO) per mesh #else -#define MAX_MESH_VERTEX_BUFFERS 7 // Maximum vertex buffers (VBO) per mesh + #define MAX_MESH_VERTEX_BUFFERS 7 // Maximum vertex buffers (VBO) per mesh #endif //------------------------------------------------------------------------------------ diff --git a/src/raylib.h b/src/raylib.h index 06138ceca..bd64bbe6f 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -353,13 +353,15 @@ typedef struct Mesh { unsigned char *colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3) unsigned short *indices; // Vertex indices (in case vertex data comes indexed) - // Animation vertex data + // Skin data for animation + int boneCount; // Number of bones (MAX: 256 bones) + unsigned char *boneIndices; // Vertex bone indices, up to 4 bones influence by vertex (skinning) (shader-location = 6) + float *boneWeights; // Vertex bone weight, up to 4 bones influence by vertex (skinning) (shader-location = 7) + + // Runtime animation vertex data (CPU skinning) + // NOTE: In case of GPU skinning, not used, pointers are NULL float *animVertices; // Animated vertex positions (after bones transformations) float *animNormals; // Animated normals (after bones transformations) - unsigned char *boneIds; // Vertex bone ids, max 255 bone ids, up to 4 bones influence by vertex (skinning) (shader-location = 6) - float *boneWeights; // Vertex bone weight, up to 4 bones influence by vertex (skinning) (shader-location = 7) - Matrix *boneMatrices; // Bones animated transformation matrices - int boneCount; // Number of bones // OpenGL identifiers unsigned int vaoId; // OpenGL Vertex Array Object id @@ -393,12 +395,22 @@ typedef struct Transform { Vector3 scale; // Scale } Transform; +// Anim pose, an array of Transform[] +typedef Transform *ModelAnimPose; + // Bone, skeletal animation bone typedef struct BoneInfo { char name[32]; // Bone name int parent; // Bone parent } BoneInfo; +// Skeleton, animation bones hierarchy +typedef struct ModelSkeleton { + int boneCount; // Number of bones + BoneInfo *bones; // Bones information (skeleton) + ModelAnimPose bindPose; // Bones base transformation (Transform[]) +} ModelSkeleton; + // Model, meshes, materials and animation data typedef struct Model { Matrix transform; // Local transform matrix @@ -410,18 +422,20 @@ typedef struct Model { int *meshMaterial; // Mesh material number // Animation data - int boneCount; // Number of bones - BoneInfo *bones; // Bones information (skeleton) - Transform *bindPose; // Bones base transformation (pose) + ModelSkeleton skeleton; // Skeleton for animation + + // Runtime animation data (CPU/GPU skinning) + ModelAnimPose currentPose; // Current animation pose (Transform[]) + Matrix *boneMatrices; // Bones animated transformation matrices } Model; -// ModelAnimation +// ModelAnimation, contains a full animation sequence typedef struct ModelAnimation { char name[32]; // Animation name - int boneCount; // Number of bones - int frameCount; // Number of animation frames - BoneInfo *bones; // Bones information (skeleton) - Transform **framePoses; // Poses array by frame + + int boneCount; // Number of bones (per pose) + int keyframeCount; // Number of animation key frames + ModelAnimPose *keyframePoses; // Animation sequence keyframe poses [keyframe][pose] } ModelAnimation; // Ray, ray for raycasting @@ -768,6 +782,8 @@ typedef enum { #define MATERIAL_MAP_SPECULAR MATERIAL_MAP_METALNESS // Shader location index +// NOTE: Some locations are tried to be set automatically on shader loading, +// but only if default attributes/uniforms names are found, check config.h for names typedef enum { SHADER_LOC_VERTEX_POSITION = 0, // Shader location: vertex attribute: position SHADER_LOC_VERTEX_TEXCOORD01, // Shader location: vertex attribute: texcoord01 @@ -790,15 +806,15 @@ typedef enum { SHADER_LOC_MAP_ROUGHNESS, // Shader location: sampler2d texture: roughness SHADER_LOC_MAP_OCCLUSION, // Shader location: sampler2d texture: occlusion SHADER_LOC_MAP_EMISSION, // Shader location: sampler2d texture: emission - SHADER_LOC_MAP_HEIGHT, // Shader location: sampler2d texture: height + SHADER_LOC_MAP_HEIGHT, // Shader location: sampler2d texture: heightmap SHADER_LOC_MAP_CUBEMAP, // Shader location: samplerCube texture: cubemap SHADER_LOC_MAP_IRRADIANCE, // Shader location: samplerCube texture: irradiance SHADER_LOC_MAP_PREFILTER, // Shader location: samplerCube texture: prefilter SHADER_LOC_MAP_BRDF, // Shader location: sampler2d texture: brdf - SHADER_LOC_VERTEX_BONEIDS, // Shader location: vertex attribute: boneIds - SHADER_LOC_VERTEX_BONEWEIGHTS, // Shader location: vertex attribute: boneWeights - SHADER_LOC_BONE_MATRICES, // Shader location: array of matrices uniform: boneMatrices - SHADER_LOC_VERTEX_INSTANCE_TX // Shader location: vertex attribute: instanceTransform + SHADER_LOC_VERTEX_BONEIDS, // Shader location: vertex attribute: bone indices + SHADER_LOC_VERTEX_BONEWEIGHTS, // Shader location: vertex attribute: bone weights + SHADER_LOC_MATRIX_BONETRANSFORMS, // Shader location: matrix attribute: bone transforms (animation) + SHADER_LOC_VERTEX_INSTANCETRANSFORMS // Shader location: vertex attribute: instance transforms } ShaderLocationIndex; #define SHADER_LOC_MAP_DIFFUSE SHADER_LOC_MAP_ALBEDO @@ -1619,11 +1635,8 @@ RLAPI void SetModelMeshMaterial(Model *model, int meshId, int materialId); // Model animations loading/unloading functions RLAPI ModelAnimation *LoadModelAnimations(const char *fileName, int *animCount); // Load model animations from file -RLAPI void UpdateModelAnimation(Model model, ModelAnimation anim, int frame); // Update model animation pose (CPU) -RLAPI void UpdateModelAnimationBones(Model model, ModelAnimation anim, int frame); // Update model animation mesh bone matrices (GPU skinning) -RLAPI void UpdateModelAnimationBonesLerp(Model model, ModelAnimation animA, int frameA, ModelAnimation animB, int frameB, float value); // Update model animation mesh bone matrices with interpolation between two poses(GPU skinning) -RLAPI void UpdateModelVertsToCurrentBones(Model model); // Update model vertices according to mesh bone matrices (CPU) -RLAPI void UnloadModelAnimation(ModelAnimation anim); // Unload animation data +RLAPI void UpdateModelAnimation(Model model, ModelAnimation anim, float frame); // Update model animation pose (vertex buffers and bone matrices) +RLAPI void UpdateModelAnimationEx(Model model, ModelAnimation animA, float frameA, ModelAnimation animB, float frameB, float blend); // Update model animation pose, blending two animations RLAPI void UnloadModelAnimations(ModelAnimation *animations, int animCount); // Unload animation array data RLAPI bool IsModelAnimationValid(Model model, ModelAnimation anim); // Check model animation skeleton match diff --git a/src/rcore.c b/src/rcore.c index c29fb1e19..f1481890b 100644 --- a/src/rcore.c +++ b/src/rcore.c @@ -1286,7 +1286,7 @@ Shader LoadShaderFromMemory(const char *vsCode, const char *fsCode) // - vertex color location = 3 // - vertex tangent location = 4 // - vertex texcoord2 location = 5 - // - vertex boneIds location = 6 + // - vertex boneIndices location = 6 // - vertex boneWeights location = 7 // NOTE: If any location is not found, loc point becomes -1 @@ -1303,9 +1303,9 @@ Shader LoadShaderFromMemory(const char *vsCode, const char *fsCode) shader.locs[SHADER_LOC_VERTEX_NORMAL] = rlGetLocationAttrib(shader.id, RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL); shader.locs[SHADER_LOC_VERTEX_TANGENT] = rlGetLocationAttrib(shader.id, RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT); shader.locs[SHADER_LOC_VERTEX_COLOR] = rlGetLocationAttrib(shader.id, RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR); - shader.locs[SHADER_LOC_VERTEX_BONEIDS] = rlGetLocationAttrib(shader.id, RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS); + shader.locs[SHADER_LOC_VERTEX_BONEIDS] = rlGetLocationAttrib(shader.id, RL_DEFAULT_SHADER_ATTRIB_NAME_BONEINDICES); shader.locs[SHADER_LOC_VERTEX_BONEWEIGHTS] = rlGetLocationAttrib(shader.id, RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS); - shader.locs[SHADER_LOC_VERTEX_INSTANCE_TX] = rlGetLocationAttrib(shader.id, RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCE_TX); + shader.locs[SHADER_LOC_VERTEX_INSTANCETRANSFORMS] = rlGetLocationAttrib(shader.id, RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCETRANSFORMS); // Get handles to GLSL uniform locations (vertex shader) shader.locs[SHADER_LOC_MATRIX_MVP] = rlGetLocationUniform(shader.id, RL_DEFAULT_SHADER_UNIFORM_NAME_MVP); @@ -1313,7 +1313,7 @@ Shader LoadShaderFromMemory(const char *vsCode, const char *fsCode) shader.locs[SHADER_LOC_MATRIX_PROJECTION] = rlGetLocationUniform(shader.id, RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION); shader.locs[SHADER_LOC_MATRIX_MODEL] = rlGetLocationUniform(shader.id, RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL); shader.locs[SHADER_LOC_MATRIX_NORMAL] = rlGetLocationUniform(shader.id, RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL); - shader.locs[SHADER_LOC_BONE_MATRICES] = rlGetLocationUniform(shader.id, RL_DEFAULT_SHADER_UNIFORM_NAME_BONE_MATRICES); + shader.locs[SHADER_LOC_MATRIX_BONETRANSFORMS] = rlGetLocationUniform(shader.id, RL_DEFAULT_SHADER_UNIFORM_NAME_BONEMATRICES); // Get handles to GLSL uniform locations (fragment shader) shader.locs[SHADER_LOC_COLOR_DIFFUSE] = rlGetLocationUniform(shader.id, RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR); diff --git a/src/rlgl.h b/src/rlgl.h index 0cde3e6eb..67817a3c9 100644 --- a/src/rlgl.h +++ b/src/rlgl.h @@ -65,7 +65,7 @@ * #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR * #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT * #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 -* #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS "vertexBoneIds" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEINDICES "vertexBoneIndices" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES * #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS "vertexBoneWeights" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS * #define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP "mvp" // model-view-projection matrix * #define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW "matView" // view matrix @@ -73,7 +73,7 @@ * #define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL "matModel" // model matrix * #define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL "matNormal" // normal matrix (transpose(inverse(matModelView))) * #define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR "colDiffuse" // color diffuse (base tint color, multiplied by texture color) -* #define RL_DEFAULT_SHADER_UNIFORM_NAME_BONE_MATRICES "boneMatrices" // bone matrices +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_BONEMATRICES "boneMatrices" // bone matrices * #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 "texture0" // texture0 (texture slot active 0) * #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 "texture1" // texture1 (texture slot active 1) * #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2) @@ -345,16 +345,16 @@ #ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_INDICES #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_INDICES 6 #endif -#ifdef RL_SUPPORT_MESH_GPU_SKINNING -#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS - #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS 7 +#ifdef SUPPORT_GPU_SKINNING + #ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES 7 + #endif + #ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS 8 + #endif #endif -#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS - #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS 8 -#endif -#endif -#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCE_TX - #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCE_TX 9 +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCETRANSFORMS + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCETRANSFORMS 9 #endif //---------------------------------------------------------------------------------- @@ -992,31 +992,34 @@ RLAPI void rlLoadDrawQuad(void); // Load and draw a quad // Default shader vertex attribute names to set location points #ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION - #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION + #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION #endif #ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD - #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD + #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD #endif #ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL - #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL + #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL #endif #ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR - #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR + #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR #endif #ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT - #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT + #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT #endif #ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 - #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 + #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 #endif -#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS - #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS "vertexBoneIds" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_BONEINDICES + #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEINDICES "vertexBoneIndices" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES #endif #ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS - #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS "vertexBoneWeights" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS + #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS "vertexBoneWeights" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS #endif -#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCE_TX - #define RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCE_TX "instanceTransform" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCE_TX +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_BONEMATRICES + #define RL_DEFAULT_SHADER_UNIFORM_NAME_BONEMATRICES "boneMatrices" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEMATRICES +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCETRANSFORMS + #define RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCETRANSFORMS "instanceTransform" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCETRANSFORMS #endif #ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_MVP @@ -1037,9 +1040,6 @@ RLAPI void rlLoadDrawQuad(void); // Load and draw a quad #ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR #define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR "colDiffuse" // color diffuse (base tint color, multiplied by texture color) #endif -#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_BONE_MATRICES - #define RL_DEFAULT_SHADER_UNIFORM_NAME_BONE_MATRICES "boneMatrices" // bone matrices -#endif #ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 "texture0" // texture0 (texture slot active 0) #endif @@ -1049,6 +1049,9 @@ RLAPI void rlLoadDrawQuad(void); // Load and draw a quad #ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2) #endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_BONEMATRICES + #define RL_DEFAULT_SHADER_UNIFORM_NAME_BONEMATRICES "boneMatrices" // bone matrices (required for GPU skinning) +#endif //---------------------------------------------------------------------------------- // Module Types and Structures Definition @@ -4339,10 +4342,9 @@ unsigned int rlLoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId) glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR, RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR); glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT, RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT); glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2, RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2); - glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCE_TX, RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCE_TX); - -#ifdef RL_SUPPORT_MESH_GPU_SKINNING - glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS, RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS); + glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCETRANSFORMS, RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCETRANSFORMS); +#ifdef SUPPORT_GPU_SKINNING + glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES, RL_DEFAULT_SHADER_ATTRIB_NAME_BONEINDICES); glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS, RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS); #endif diff --git a/src/rmodels.c b/src/rmodels.c index b90b6a53f..1649fb8f3 100644 --- a/src/rmodels.c +++ b/src/rmodels.c @@ -167,6 +167,9 @@ static ModelAnimation *LoadModelAnimationsM3D(const char *fileName, int *animCou static void ProcessMaterialsOBJ(Material *rayMaterials, tinyobj_material_t *materials, int materialCount); // Process obj materials #endif +// Update model vertex data (positions and normals) +static void UpdateModelAnimationVertexBuffers(Model model); + //---------------------------------------------------------------------------------- // Module Functions Definition //---------------------------------------------------------------------------------- @@ -1182,7 +1185,7 @@ bool IsModelValid(Model model) if ((model.meshes[i].tangents != NULL) && (model.meshes[i].vboId[4] == 0)) { result = false; break; } // Vertex tangents buffer not uploaded to GPU if ((model.meshes[i].texcoords2 != NULL) && (model.meshes[i].vboId[5] == 0)) { result = false; break; } // Vertex texcoords2 buffer not uploaded to GPU if ((model.meshes[i].indices != NULL) && (model.meshes[i].vboId[6] == 0)) { result = false; break; } // Vertex indices buffer not uploaded to GPU - if ((model.meshes[i].boneIds != NULL) && (model.meshes[i].vboId[7] == 0)) { result = false; break; } // Vertex boneIds buffer not uploaded to GPU + if ((model.meshes[i].boneIndices != NULL) && (model.meshes[i].vboId[7] == 0)) { result = false; break; } // Vertex boneIndices buffer not uploaded to GPU if ((model.meshes[i].boneWeights != NULL) && (model.meshes[i].vboId[8] == 0)) { result = false; break; } // Vertex boneWeights buffer not uploaded to GPU // NOTE: Some OpenGL versions do not support VAO, so we don't check it @@ -1212,8 +1215,8 @@ void UnloadModel(Model model) RL_FREE(model.meshMaterial); // Unload animation data - RL_FREE(model.bones); - RL_FREE(model.bindPose); + RL_FREE(model.skeleton.bones); + RL_FREE(model.skeleton.bindPose); TRACELOG(LOG_INFO, "MODEL: Unloaded model (and meshes) from RAM and VRAM"); } @@ -1273,9 +1276,8 @@ void UploadMesh(Mesh *mesh, bool dynamic) mesh->vboId[RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT] = 0; // Vertex buffer: tangents mesh->vboId[RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2] = 0; // Vertex buffer: texcoords2 mesh->vboId[RL_DEFAULT_SHADER_ATTRIB_LOCATION_INDICES] = 0; // Vertex buffer: indices - -#ifdef RL_SUPPORT_MESH_GPU_SKINNING - mesh->vboId[RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS] = 0; // Vertex buffer: boneIds +#ifdef SUPPORT_GPU_SKINNING + mesh->vboId[RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES] = 0; // Vertex buffer: boneIndices mesh->vboId[RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS] = 0; // Vertex buffer: boneWeights #endif @@ -1375,21 +1377,21 @@ void UploadMesh(Mesh *mesh, bool dynamic) rlDisableVertexAttribute(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2); } -#ifdef RL_SUPPORT_MESH_GPU_SKINNING - if (mesh->boneIds != NULL) +#ifdef SUPPORT_GPU_SKINNING + if (mesh->boneIndices != NULL) { - // Enable vertex attribute: boneIds (shader-location = 7) - mesh->vboId[RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS] = rlLoadVertexBuffer(mesh->boneIds, mesh->vertexCount*4*sizeof(unsigned char), dynamic); - rlSetVertexAttribute(RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS, 4, RL_UNSIGNED_BYTE, 0, 0, 0); - rlEnableVertexAttribute(RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS); + // Enable vertex attribute: boneIndices (shader-location = 7) + mesh->vboId[RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES] = rlLoadVertexBuffer(mesh->boneIndices, mesh->vertexCount*4*sizeof(unsigned char), dynamic); + rlSetVertexAttribute(RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES, 4, RL_UNSIGNED_BYTE, 0, 0, 0); + rlEnableVertexAttribute(RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES); } else { - // Default vertex attribute: boneIds + // Default vertex attribute: boneIndices // WARNING: Default value provided to shader if location available float value[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; - rlSetVertexAttributeDefault(RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS, value, SHADER_ATTRIB_VEC4, 4); - rlDisableVertexAttribute(RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS); + rlSetVertexAttributeDefault(RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES, value, SHADER_ATTRIB_VEC4, 4); + rlDisableVertexAttribute(RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES); } if (mesh->boneWeights != NULL) @@ -1436,17 +1438,17 @@ void DrawMesh(Mesh mesh, Material material, Matrix transform) #define GL_COLOR_ARRAY 0x8076 #define GL_TEXTURE_COORD_ARRAY 0x8078 - if (mesh.texcoords && material.maps[MATERIAL_MAP_DIFFUSE].texture.id > 0) rlEnableTexture(material.maps[MATERIAL_MAP_DIFFUSE].texture.id); + if ((mesh.texcoords != NULL) && (material.maps[MATERIAL_MAP_DIFFUSE].texture.id > 0)) rlEnableTexture(material.maps[MATERIAL_MAP_DIFFUSE].texture.id); - if (mesh.animVertices) rlEnableStatePointer(GL_VERTEX_ARRAY, mesh.animVertices); + if (mesh.animVertices != NULL) rlEnableStatePointer(GL_VERTEX_ARRAY, mesh.animVertices); else rlEnableStatePointer(GL_VERTEX_ARRAY, mesh.vertices); if (mesh.texcoords) rlEnableStatePointer(GL_TEXTURE_COORD_ARRAY, mesh.texcoords); - if (mesh.animNormals) rlEnableStatePointer(GL_NORMAL_ARRAY, mesh.animNormals); - else if (mesh.normals) rlEnableStatePointer(GL_NORMAL_ARRAY, mesh.normals); + if (mesh.animNormals != NULL) rlEnableStatePointer(GL_NORMAL_ARRAY, mesh.animNormals); + else if (mesh.normals != NULL) rlEnableStatePointer(GL_NORMAL_ARRAY, mesh.normals); - if (mesh.colors) rlEnableStatePointer(GL_COLOR_ARRAY, mesh.colors); + if (mesh.colors != NULL) rlEnableStatePointer(GL_COLOR_ARRAY, mesh.colors); rlPushMatrix(); rlMultMatrixf(MatrixToFloat(transform)); @@ -1528,14 +1530,6 @@ void DrawMesh(Mesh mesh, Material material, Matrix transform) // Upload model normal matrix (if locations available) if (material.shader.locs[SHADER_LOC_MATRIX_NORMAL] != -1) rlSetUniformMatrix(material.shader.locs[SHADER_LOC_MATRIX_NORMAL], MatrixTranspose(MatrixInvert(matModel))); - -#ifdef RL_SUPPORT_MESH_GPU_SKINNING - // Upload Bone Transforms - if ((material.shader.locs[SHADER_LOC_BONE_MATRICES] != -1) && mesh.boneMatrices) - { - rlSetUniformMatrices(material.shader.locs[SHADER_LOC_BONE_MATRICES], mesh.boneMatrices, mesh.boneCount); - } -#endif //----------------------------------------------------- // Bind active texture maps (if available) @@ -1615,11 +1609,11 @@ void DrawMesh(Mesh mesh, Material material, Matrix transform) rlEnableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_TEXCOORD02]); } -#ifdef RL_SUPPORT_MESH_GPU_SKINNING +#ifdef SUPPORT_GPU_SKINNING // Bind mesh VBO data: vertex bone ids (shader-location = 6, if available) if (material.shader.locs[SHADER_LOC_VERTEX_BONEIDS] != -1) { - rlEnableVertexBuffer(mesh.vboId[RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS]); + rlEnableVertexBuffer(mesh.vboId[RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES]); rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_BONEIDS], 4, RL_UNSIGNED_BYTE, 0, 0, 0); rlEnableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_BONEIDS]); } @@ -1743,7 +1737,7 @@ void DrawMeshInstanced(Mesh mesh, Material material, const Matrix *transforms, i if (material.shader.locs[SHADER_LOC_MATRIX_PROJECTION] != -1) rlSetUniformMatrix(material.shader.locs[SHADER_LOC_MATRIX_PROJECTION], matProjection); // Create instances buffer - instanceTransforms = (float16 *)RL_MALLOC(instances*sizeof(float16)); + instanceTransforms = (float16 *)RL_CALLOC(instances, sizeof(float16)); // Fill buffer with instances transformations as float16 arrays for (int i = 0; i < instances; i++) instanceTransforms[i] = MatrixToFloatV(transforms[i]); @@ -1757,14 +1751,14 @@ void DrawMeshInstanced(Mesh mesh, Material material, const Matrix *transforms, i // no faster, since all the transform matrices are transferred anyway instancesVboId = rlLoadVertexBuffer(instanceTransforms, instances*sizeof(float16), false); - // Instances transformation matrices are sent to shader attribute location: SHADER_LOC_VERTEX_INSTANCE_TX - if (material.shader.locs[SHADER_LOC_VERTEX_INSTANCE_TX] != -1) + // Instances transformation matrices are sent to shader attribute location: SHADER_LOC_VERTEX_INSTANCETRANSFORMS + if (material.shader.locs[SHADER_LOC_VERTEX_INSTANCETRANSFORMS] != -1) { for (unsigned int i = 0; i < 4; i++) { - rlEnableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_INSTANCE_TX] + i); - rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_INSTANCE_TX] + i, 4, RL_FLOAT, 0, sizeof(Matrix), i*sizeof(Vector4)); - rlSetVertexAttributeDivisor(material.shader.locs[SHADER_LOC_VERTEX_INSTANCE_TX] + i, 1); + rlEnableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_INSTANCETRANSFORMS] + i); + rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_INSTANCETRANSFORMS] + i, 4, RL_FLOAT, 0, sizeof(Matrix), i*sizeof(Vector4)); + rlSetVertexAttributeDivisor(material.shader.locs[SHADER_LOC_VERTEX_INSTANCETRANSFORMS] + i, 1); } } @@ -1777,15 +1771,6 @@ void DrawMeshInstanced(Mesh mesh, Material material, const Matrix *transforms, i // Upload model normal matrix (if locations available) if (material.shader.locs[SHADER_LOC_MATRIX_NORMAL] != -1) rlSetUniformMatrix(material.shader.locs[SHADER_LOC_MATRIX_NORMAL], MatrixTranspose(MatrixInvert(matModel))); - -#ifdef RL_SUPPORT_MESH_GPU_SKINNING - // Upload Bone Transforms - if ((material.shader.locs[SHADER_LOC_BONE_MATRICES] != -1) && mesh.boneMatrices) - { - rlSetUniformMatrices(material.shader.locs[SHADER_LOC_BONE_MATRICES], mesh.boneMatrices, mesh.boneCount); - } -#endif - //----------------------------------------------------- // Bind active texture maps (if available) @@ -1863,11 +1848,11 @@ void DrawMeshInstanced(Mesh mesh, Material material, const Matrix *transforms, i rlEnableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_TEXCOORD02]); } -#ifdef RL_SUPPORT_MESH_GPU_SKINNING +#ifdef SUPPORT_GPU_SKINNING // Bind mesh VBO data: vertex bone ids (shader-location = 6, if available) if (material.shader.locs[SHADER_LOC_VERTEX_BONEIDS] != -1) { - rlEnableVertexBuffer(mesh.vboId[RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS]); + rlEnableVertexBuffer(mesh.vboId[RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES]); rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_BONEIDS], 4, RL_UNSIGNED_BYTE, 0, 0, 0); rlEnableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_BONEIDS]); } @@ -1946,6 +1931,7 @@ void UnloadMesh(Mesh mesh) if (mesh.vboId != NULL) for (int i = 0; i < MAX_MESH_VERTEX_BUFFERS; i++) rlUnloadVertexBuffer(mesh.vboId[i]); RL_FREE(mesh.vboId); + // Unload mesh vertex buffers RL_FREE(mesh.vertices); RL_FREE(mesh.texcoords); RL_FREE(mesh.normals); @@ -1954,11 +1940,13 @@ void UnloadMesh(Mesh mesh) RL_FREE(mesh.texcoords2); RL_FREE(mesh.indices); + // Unload mesh skin animation data + RL_FREE(mesh.boneWeights); + RL_FREE(mesh.boneIndices); + + // Unload mesh runtime CPU skinning data RL_FREE(mesh.animVertices); RL_FREE(mesh.animNormals); - RL_FREE(mesh.boneWeights); - RL_FREE(mesh.boneIds); - RL_FREE(mesh.boneMatrices); } // Export mesh data to file @@ -2189,7 +2177,7 @@ Material *LoadMaterials(const char *fileName, int *materialCount) int result = tinyobj_parse_mtl_file(&mats, &count, fileName); if (result != TINYOBJ_SUCCESS) TRACELOG(LOG_WARNING, "MATERIAL: [%s] Failed to parse materials file", fileName); - materials = (Material *)RL_MALLOC(count*sizeof(Material)); + materials = (Material *)RL_CALLOC(count, sizeof(Material)); ProcessMaterialsOBJ(materials, mats, count); tinyobj_materials_free(mats, count); @@ -2228,10 +2216,11 @@ bool IsMaterialValid(Material material) { bool result = false; - if ((material.maps != NULL) && // Validate material contain some map + if ((material.maps != NULL) && // Validate material contain some map (material.shader.id > 0)) result = true; // Validate material shader is valid - // TODO: Check if available maps contain loaded textures + // NOTE: Checking if available maps contain loaded textures does not determine if + // a material is valid, there can be maps without a texture assigned, only properties return result; } @@ -2287,146 +2276,205 @@ ModelAnimation *LoadModelAnimations(const char *fileName, int *animCount) return animations; } -// Update model animated bones transform matrices for a given frame -// NOTE: Updated data is not uploaded to GPU but kept at model.meshes[i].boneMatrices[boneId], -// to be uploaded to shader at drawing, in case GPU skinning is enabled -void UpdateModelAnimationBones(Model model, ModelAnimation anim, int frame) +// Update model animation data (vertex buffers / bone matrices) for a specific pose +// NOTE 1: Request frame could be fractional, using a lerp interpolation between two frames +// NOTE 2: Updated vertex animation data is uploaded to GPU in case of CPU skinning, +// for GPU skinning, bone matrices are uploaded to shader on DrawModelEx() +void UpdateModelAnimation(Model model, ModelAnimation anim, float frame) { - if ((anim.frameCount > 0) && (anim.bones != NULL) && (anim.framePoses != NULL)) + if (model.boneMatrices == NULL) return; + + //UpdateModelAnimationEx(model, anim, frame, anim, frame, 0.0f); + + // Update model animated bones transform matrices for a given frame + if ((anim.keyframeCount > 0) && (model.skeleton.bones != NULL) && (anim.keyframePoses != NULL)) { - if (frame >= anim.frameCount) frame = frame%anim.frameCount; + // Get frame and blending from frame factor required + int currentFrame = (int)frame; + int nextFrame = currentFrame + 1; + float blend = frame - currentFrame; + blend = Clamp(blend, 0.0f, 1.0f); + if (currentFrame >= anim.keyframeCount) currentFrame = currentFrame%anim.keyframeCount; + if (nextFrame >= anim.keyframeCount) nextFrame = nextFrame%anim.keyframeCount; - // Get first mesh which have bones - int firstMeshWithBones = -1; + Matrix bindPoseMatrix = { 0 }; + Matrix currentPoseMatrix = { 0 }; - for (int i = 0; i < model.meshCount; i++) + // Update all bones and bone matrices of model + for (int boneIndex = 0; boneIndex < model.skeleton.boneCount; boneIndex++) { - if (model.meshes[i].boneMatrices) - { - if (firstMeshWithBones == -1) - { - firstMeshWithBones = i; - break; - } - } + // Compute interpolated pose between current and next frame + // NOTE: Storing animation frame data in model.currentPose + model.currentPose[boneIndex].translation = Vector3Lerp( + anim.keyframePoses[currentFrame][boneIndex].translation, + anim.keyframePoses[nextFrame][boneIndex].translation, blend); + model.currentPose[boneIndex].rotation = QuaternionSlerp( + anim.keyframePoses[currentFrame][boneIndex].rotation, + anim.keyframePoses[nextFrame][boneIndex].rotation, blend); + model.currentPose[boneIndex].scale = Vector3Lerp( + anim.keyframePoses[currentFrame][boneIndex].scale, + anim.keyframePoses[nextFrame][boneIndex].scale, blend); + + // Compute runtime bone matrix from model current pose + //----------------------------------------------------------------------------------- + Transform *bindPoseTransform = &model.skeleton.bindPose[boneIndex]; + bindPoseMatrix = MatrixMultiply( + MatrixMultiply(MatrixScale(bindPoseTransform->scale.x, bindPoseTransform->scale.y, bindPoseTransform->scale.z), + QuaternionToMatrix(bindPoseTransform->rotation)), + MatrixTranslate(bindPoseTransform->translation.x, bindPoseTransform->translation.y, bindPoseTransform->translation.z)); + + Transform *currentPoseTransform = &model.currentPose[boneIndex]; + currentPoseMatrix = MatrixMultiply( + MatrixMultiply(MatrixScale(currentPoseTransform->scale.x, currentPoseTransform->scale.y, currentPoseTransform->scale.z), + QuaternionToMatrix(currentPoseTransform->rotation)), + MatrixTranslate(currentPoseTransform->translation.x, currentPoseTransform->translation.y, currentPoseTransform->translation.z)); + + model.boneMatrices[boneIndex] = MatrixMultiply(MatrixInvert(bindPoseMatrix), currentPoseMatrix); + //----------------------------------------------------------------------------------- } - if (firstMeshWithBones != -1) - { - // Update all bones and boneMatrices of first mesh with bones - for (int boneId = 0; boneId < anim.boneCount; boneId++) - { - Transform *bindTransform = &model.bindPose[boneId]; - Matrix bindMatrix = MatrixMultiply(MatrixMultiply( - MatrixScale(bindTransform->scale.x, bindTransform->scale.y, bindTransform->scale.z), - QuaternionToMatrix(bindTransform->rotation)), - MatrixTranslate(bindTransform->translation.x, bindTransform->translation.y, bindTransform->translation.z)); - - Transform *targetTransform = &anim.framePoses[frame][boneId]; - Matrix targetMatrix = MatrixMultiply(MatrixMultiply( - MatrixScale(targetTransform->scale.x, targetTransform->scale.y, targetTransform->scale.z), - QuaternionToMatrix(targetTransform->rotation)), - MatrixTranslate(targetTransform->translation.x, targetTransform->translation.y, targetTransform->translation.z)); - - model.meshes[firstMeshWithBones].boneMatrices[boneId] = MatrixMultiply(MatrixInvert(bindMatrix), targetMatrix); - } - - // Update remaining meshes with bones - // NOTE: Using deep copy because shallow copy results in double free with 'UnloadModel()' - for (int i = firstMeshWithBones + 1; i < model.meshCount; i++) - { - if (model.meshes[i].boneMatrices) - { - memcpy(model.meshes[i].boneMatrices, - model.meshes[firstMeshWithBones].boneMatrices, - model.meshes[i].boneCount*sizeof(model.meshes[i].boneMatrices[0])); - } - } - } + // CPU skinning, updates CPU buffers and uploads them to GPU + // NOTE: On GPU skinning not supported, use CPU skinning + UpdateModelAnimationVertexBuffers(model); } } -// Update model animated bones transform matrices by interpolating between two different given frames of different ModelAnimation(could be same too) -// NOTE: Updated data is not uploaded to GPU but kept at model.meshes[i].boneMatrices[boneId], -// to be uploaded to shader at drawing, in case GPU skinning is enabled -void UpdateModelAnimationBonesLerp(Model model, ModelAnimation animA, int frameA, ModelAnimation animB, int frameB, float value) +// Update model animation data (vertex buffers / bone matrices) for a specific pose, +// defined by two different animations at specific frames blended together +// NOTE 1: Request frames could be fractional, using a lerp interpolation between two frames +// NOTE 2: Updated vertex animation data is uploaded to GPU in case of CPU skinning, +// for GPU skinning, bone matrices are uploaded to shader on DrawModelEx() +void UpdateModelAnimationEx(Model model, ModelAnimation animA, float frameA, ModelAnimation animB, float frameB, float blend) { - if ((animA.frameCount > 0) && (animA.bones != NULL) && (animA.framePoses != NULL) && - (animB.frameCount > 0) && (animB.bones != NULL) && (animB.framePoses != NULL) && - (value >= 0.0f) && (value <= 1.0f)) + if (model.boneMatrices == NULL) return; + + if ((animA.keyframeCount > 0) && (animA.keyframePoses != NULL) && + (animB.keyframeCount > 0) && (animB.keyframePoses != NULL) && + (blend >= 0.0f) && (blend <= 1.0f)) { - frameA = frameA % animA.frameCount; - frameB = frameB % animB.frameCount; + // Inter-frame interpolation values for first animation + int currentFrameA = (int)frameA%animA.keyframeCount; + int nextFrameA = currentFrameA + 1; + float blendA = frameA - currentFrameA; + blendA = Clamp(blendA, 0.0f, 1.0f); + if (currentFrameA >= animA.keyframeCount) currentFrameA = currentFrameA%animA.keyframeCount; + if (nextFrameA >= animA.keyframeCount) nextFrameA = nextFrameA%animA.keyframeCount; - for (int i = 0; i < model.meshCount; i++) + // Inter-frame interpolation values for second animation + int currentFrameB = (int)frameB%animB.keyframeCount; + int nextFrameB = currentFrameB + 1; + float blendB = frameB - currentFrameB; + blendB = Clamp(blendB, 0.0f, 1.0f); + if (currentFrameB >= animB.keyframeCount) currentFrameB = currentFrameB%animB.keyframeCount; + if (nextFrameB >= animB.keyframeCount) nextFrameB = nextFrameB%animB.keyframeCount; + + Matrix bindPoseMatrix = { 0 }; + Matrix currentPoseMatrix = { 0 }; + + for (int boneIndex = 0; boneIndex < model.skeleton.boneCount; boneIndex++) { - if (model.meshes[i].boneMatrices) - { - assert(model.meshes[i].boneCount == animA.boneCount); - assert(model.meshes[i].boneCount == animB.boneCount); + // Get frame-interpolation for first animation + Vector3 frameATranslation = Vector3Lerp( + animA.keyframePoses[currentFrameA][boneIndex].translation, + animA.keyframePoses[nextFrameA][boneIndex].translation, blendA); + Quaternion frameARotation = QuaternionSlerp( + animA.keyframePoses[currentFrameA][boneIndex].rotation, + animA.keyframePoses[nextFrameA][boneIndex].rotation, blendA); + Vector3 frameAScale = Vector3Lerp( + animA.keyframePoses[currentFrameA][boneIndex].scale, + animA.keyframePoses[nextFrameA][boneIndex].scale, blendA); - for (int boneId = 0; boneId < model.meshes[i].boneCount; boneId++) - { - Vector3 inTranslation = model.bindPose[boneId].translation; - Quaternion inRotation = model.bindPose[boneId].rotation; - Vector3 inScale = model.bindPose[boneId].scale; + // Get frame-interpolation for second animation + Vector3 frameBTranslation = Vector3Lerp( + animB.keyframePoses[currentFrameB][boneIndex].translation, + animB.keyframePoses[nextFrameB][boneIndex].translation, blendB); + Quaternion frameBRotation = QuaternionSlerp( + animB.keyframePoses[currentFrameB][boneIndex].rotation, + animB.keyframePoses[nextFrameB][boneIndex].rotation, blendB); + Vector3 frameBScale = Vector3Lerp( + animB.keyframePoses[currentFrameB][boneIndex].scale, + animB.keyframePoses[nextFrameB][boneIndex].scale, blendB); + + // Compute interpolated pose between both animations frames + // NOTE: Storing animation frame data in model.currentPose + model.currentPose[boneIndex].translation = Vector3Lerp(frameATranslation, frameBTranslation, blend); + model.currentPose[boneIndex].rotation = QuaternionSlerp(frameARotation, frameBRotation, blend); + model.currentPose[boneIndex].scale = Vector3Lerp(frameAScale, frameBScale, blend); - Vector3 outATranslation = animA.framePoses[frameA][boneId].translation; - Quaternion outARotation = animA.framePoses[frameA][boneId].rotation; - Vector3 outAScale = animA.framePoses[frameA][boneId].scale; + // Compute runtime bone matrix from model current pose + //----------------------------------------------------------------------------------- + Transform *bindPoseTransform = &model.skeleton.bindPose[boneIndex]; + bindPoseMatrix = MatrixMultiply( + MatrixMultiply(MatrixScale(bindPoseTransform->scale.x, bindPoseTransform->scale.y, bindPoseTransform->scale.z), + QuaternionToMatrix(bindPoseTransform->rotation)), + MatrixTranslate(bindPoseTransform->translation.x, bindPoseTransform->translation.y, bindPoseTransform->translation.z)); - Vector3 outBTranslation = animB.framePoses[frameB][boneId].translation; - Quaternion outBRotation = animB.framePoses[frameB][boneId].rotation; - Vector3 outBScale = animB.framePoses[frameB][boneId].scale; + Transform *currentPoseTransform = &model.currentPose[boneIndex]; + currentPoseMatrix = MatrixMultiply( + MatrixMultiply(MatrixScale(currentPoseTransform->scale.x, currentPoseTransform->scale.y, currentPoseTransform->scale.z), + QuaternionToMatrix(currentPoseTransform->rotation)), + MatrixTranslate(currentPoseTransform->translation.x, currentPoseTransform->translation.y, currentPoseTransform->translation.z)); - Vector3 outTranslation = Vector3Lerp(outATranslation, outBTranslation, value); - Quaternion outRotation = QuaternionSlerp(outARotation, outBRotation, value); - Vector3 outScale = Vector3Lerp(outAScale, outBScale, value); + model.boneMatrices[boneIndex] = MatrixMultiply(MatrixInvert(bindPoseMatrix), currentPoseMatrix); + //----------------------------------------------------------------------------------- - Vector3 invTranslation = Vector3RotateByQuaternion(Vector3Negate(inTranslation), QuaternionInvert(inRotation)); - Quaternion invRotation = QuaternionInvert(inRotation); - Vector3 invScale = Vector3Divide((Vector3){ 1.0f, 1.0f, 1.0f }, inScale); + /* + Vector3 outATranslation = animA.keyframePoses[currentFrameA][boneIndex].translation; + Quaternion outARotation = animA.keyframePoses[currentFrameA][boneIndex].rotation; + Vector3 outAScale = animA.keyframePoses[currentFrameA][boneIndex].scale; - Vector3 boneTranslation = Vector3Add( - Vector3RotateByQuaternion(Vector3Multiply(outScale, invTranslation), - outRotation), outTranslation); - Quaternion boneRotation = QuaternionMultiply(outRotation, invRotation); - Vector3 boneScale = Vector3Multiply(outScale, invScale); + Vector3 outBTranslation = animB.keyframePoses[currentFrameB][boneIndex].translation; + Quaternion outBRotation = animB.keyframePoses[currentFrameB][boneIndex].rotation; + Vector3 outBScale = animB.keyframePoses[currentFrameB][boneIndex].scale; - Matrix boneMatrix = MatrixMultiply(MatrixMultiply( - QuaternionToMatrix(boneRotation), - MatrixTranslate(boneTranslation.x, boneTranslation.y, boneTranslation.z)), - MatrixScale(boneScale.x, boneScale.y, boneScale.z)); + // Invert bind pose transformation + Vector3 invBindTranslation = Vector3RotateByQuaternion( + Vector3Negate(model.skeleton.bindPose[boneIndex].translation), + QuaternionInvert(model.skeleton.bindPose[boneIndex].rotation)); + Quaternion invBindRotation = QuaternionInvert(model.skeleton.bindPose[boneIndex].rotation); + Vector3 invBindScale = Vector3Divide((Vector3){ 1.0f, 1.0f, 1.0f }, model.skeleton.bindPose[boneIndex].scale); - model.meshes[i].boneMatrices[boneId] = boneMatrix; - } - } + Vector3 boneTranslation = Vector3Add(Vector3RotateByQuaternion( + Vector3Multiply(model.currentPose[boneIndex].scale, invBindTranslation), + model.currentPose[boneIndex].rotation), + model.currentPose[boneIndex].translation); + Quaternion boneRotation = QuaternionMultiply(model.currentPose[boneIndex].rotation, invBindRotation); + Vector3 boneScale = Vector3Multiply(model.currentPose[boneIndex].scale, invBindScale); + + model.boneMatrices[boneIndex] = MatrixMultiply( + MatrixMultiply(QuaternionToMatrix(boneRotation), + MatrixTranslate(boneTranslation.x, boneTranslation.y, boneTranslation.z)), + MatrixScale(boneScale.x, boneScale.y, boneScale.z)); + */ } + + // CPU skinning, updates CPU buffers and uploads them to GPU (if available) + // NOTE: Fallback in case GPU skinning is not supported or enabled + UpdateModelAnimationVertexBuffers(model); } } -// Update model vertex data (positions and normals) from mesh bone data -// NOTE: Updated data is uploaded to GPU -void UpdateModelVertsToCurrentBones(Model model) +// Update model vertex animation buffers (positions and normals) +// NOTE: Required for CPU skinning, uploads animated vertex buffers to GPU +static void UpdateModelAnimationVertexBuffers(Model model) { - //UpdateModelAnimationBones(model, anim, frame); // TODO: Review - for (int m = 0; m < model.meshCount; m++) { Mesh mesh = model.meshes[m]; Vector3 animVertex = { 0 }; Vector3 animNormal = { 0 }; - const int vValues = mesh.vertexCount*3; + const int vertexValuesCount = mesh.vertexCount*3; - int boneId = 0; + int boneIndex = 0; int boneCounter = 0; float boneWeight = 0.0f; - bool updated = false; // Flag to check when anim vertex information is updated + bool bufferUpdateRequired = false; // Flag to check when anim vertex information is updated - // Skip if missing bone data, causes segfault without on some models - if ((mesh.boneWeights == NULL) || (mesh.boneIds == NULL)) continue; + // Skip if missing bone data or missing anim buffers initialization + if ((mesh.boneWeights == NULL) || (mesh.boneIndices == NULL) || + (mesh.animVertices == NULL) || (mesh.animNormals == NULL)) continue; - for (int vCounter = 0; vCounter < vValues; vCounter += 3) + for (int vCounter = 0; vCounter < vertexValuesCount; vCounter += 3) { mesh.animVertices[vCounter] = 0; mesh.animVertices[vCounter + 1] = 0; @@ -2442,23 +2490,23 @@ void UpdateModelVertsToCurrentBones(Model model) for (int j = 0; j < 4; j++, boneCounter++) { boneWeight = mesh.boneWeights[boneCounter]; - boneId = mesh.boneIds[boneCounter]; + boneIndex = mesh.boneIndices[boneCounter]; // Early stop when no transformation will be applied if (boneWeight == 0.0f) continue; animVertex = (Vector3){ mesh.vertices[vCounter], mesh.vertices[vCounter + 1], mesh.vertices[vCounter + 2] }; - animVertex = Vector3Transform(animVertex, model.meshes[m].boneMatrices[boneId]); + animVertex = Vector3Transform(animVertex, model.boneMatrices[boneIndex]); mesh.animVertices[vCounter] += animVertex.x*boneWeight; - mesh.animVertices[vCounter+1] += animVertex.y*boneWeight; - mesh.animVertices[vCounter+2] += animVertex.z*boneWeight; - updated = true; + mesh.animVertices[vCounter + 1] += animVertex.y*boneWeight; + mesh.animVertices[vCounter + 2] += animVertex.z*boneWeight; + bufferUpdateRequired = true; // Normals processing // NOTE: We use meshes.baseNormals (default normal) to calculate meshes.normals (animated normals) if ((mesh.normals != NULL) && (mesh.animNormals != NULL )) { animNormal = (Vector3){ mesh.normals[vCounter], mesh.normals[vCounter + 1], mesh.normals[vCounter + 2] }; - animNormal = Vector3Transform(animNormal, MatrixTranspose(MatrixInvert(model.meshes[m].boneMatrices[boneId]))); + animNormal = Vector3Transform(animNormal, MatrixTranspose(MatrixInvert(model.boneMatrices[boneIndex]))); mesh.animNormals[vCounter] += animNormal.x*boneWeight; mesh.animNormals[vCounter + 1] += animNormal.y*boneWeight; mesh.animNormals[vCounter + 2] += animNormal.z*boneWeight; @@ -2466,53 +2514,36 @@ void UpdateModelVertsToCurrentBones(Model model) } } - if (updated) + if (bufferUpdateRequired) { - rlUpdateVertexBuffer(mesh.vboId[0], mesh.animVertices, mesh.vertexCount*3*sizeof(float), 0); // Update vertex position - if (mesh.normals != NULL) rlUpdateVertexBuffer(mesh.vboId[2], mesh.animNormals, mesh.vertexCount*3*sizeof(float), 0); // Update vertex normals + // Update GPU vertex buffers with updated data (position + normals) + rlUpdateVertexBuffer(mesh.vboId[SHADER_LOC_VERTEX_POSITION], mesh.animVertices, mesh.vertexCount*3*sizeof(float), 0); + if (mesh.normals != NULL) rlUpdateVertexBuffer(mesh.vboId[SHADER_LOC_VERTEX_NORMAL], mesh.animNormals, mesh.vertexCount*3*sizeof(float), 0); } } } -// at least 2x speed up vs the old method -// Update model animated vertex data (positions and normals) for a given frame -// NOTE: Updated data is uploaded to GPU -void UpdateModelAnimation(Model model, ModelAnimation anim, int frame) -{ - UpdateModelAnimationBones(model,anim,frame); - UpdateModelVertsToCurrentBones(model); -} - // Unload animation array data void UnloadModelAnimations(ModelAnimation *animations, int animCount) { - for (int i = 0; i < animCount; i++) UnloadModelAnimation(animations[i]); + for (int a = 0; a < animCount; a++) + { + for (int i = 0; i < animations[a].keyframeCount; i++) + RL_FREE(animations[a].keyframePoses[i]); + + RL_FREE(animations[a].keyframePoses); + } + RL_FREE(animations); } -// Unload animation data -void UnloadModelAnimation(ModelAnimation anim) -{ - for (int i = 0; i < anim.frameCount; i++) RL_FREE(anim.framePoses[i]); - - RL_FREE(anim.bones); - RL_FREE(anim.framePoses); -} - // Check model animation skeleton match // NOTE: Only number of bones and parent connections are checked bool IsModelAnimationValid(Model model, ModelAnimation anim) { int result = true; - if (model.boneCount != anim.boneCount) result = false; - else - { - for (int i = 0; i < model.boneCount; i++) - { - if (model.bones[i].parent != anim.bones[i].parent) { result = false; break; } - } - } + if (model.skeleton.boneCount != anim.boneCount) result = false; return result; } @@ -3883,17 +3914,31 @@ void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rota for (int i = 0; i < model.meshCount; i++) { - Color color = model.materials[model.meshMaterial[i]].maps[MATERIAL_MAP_DIFFUSE].color; + Material mat = model.materials[model.meshMaterial[i]]; + Color colDiffuse = mat.maps[MATERIAL_MAP_DIFFUSE].color; - Color colorTint = WHITE; - colorTint.r = (unsigned char)(((int)color.r*(int)tint.r)/255); - colorTint.g = (unsigned char)(((int)color.g*(int)tint.g)/255); - colorTint.b = (unsigned char)(((int)color.b*(int)tint.b)/255); - colorTint.a = (unsigned char)(((int)color.a*(int)tint.a)/255); + // Applying color tint directly to material diffuse map, + // because is comes as an input paramter to the function + Color colTinted = { 0 }; + colTinted.r = (unsigned char)(((int)colDiffuse.r*(int)tint.r)/255); + colTinted.g = (unsigned char)(((int)colDiffuse.g*(int)tint.g)/255); + colTinted.b = (unsigned char)(((int)colDiffuse.b*(int)tint.b)/255); + colTinted.a = (unsigned char)(((int)colDiffuse.a*(int)tint.a)/255); - model.materials[model.meshMaterial[i]].maps[MATERIAL_MAP_DIFFUSE].color = colorTint; - DrawMesh(model.meshes[i], model.materials[model.meshMaterial[i]], model.transform); - model.materials[model.meshMaterial[i]].maps[MATERIAL_MAP_DIFFUSE].color = color; + mat.maps[MATERIAL_MAP_DIFFUSE].color = colTinted; + + // Upload runtime bone transforms matrices, to compute skinning on the shader (GPU-skinning) + // NOTE: Required location must be found and Mesh bones indices and weights must be also uploaded to shader + if ((mat.shader.locs[SHADER_LOC_MATRIX_BONETRANSFORMS] != -1) && (model.boneMatrices != NULL)) + { + rlEnableShader(mat.shader.id); // Enable shader to set bone transform matrices + rlSetUniformMatrices(mat.shader.locs[SHADER_LOC_MATRIX_BONETRANSFORMS], model.boneMatrices, model.skeleton.boneCount); + } + + DrawMesh(model.meshes[i], mat, model.transform); + + // Restore material diffuse map color (before tint applied) + mat.maps[MATERIAL_MAP_DIFFUSE].color = colDiffuse; } } @@ -4344,7 +4389,7 @@ static void BuildPoseFromParentJoints(BoneInfo *bones, int boneCount, Transform { if (bones[i].parent > i) { - TRACELOG(LOG_WARNING, "Assumes bones are toplogically sorted, but bone %d has parent %d. Skipping.", i, bones[i].parent); + TRACELOG(LOG_WARNING, "Skipping bone not topologically sorted: Bone %d has parent %d", i, bones[i].parent); continue; } transforms[i].rotation = QuaternionMultiply(transforms[bones[i].parent].rotation, transforms[i].rotation); @@ -4762,11 +4807,11 @@ static Model LoadIQM(const char *fileName) for (int i = 0; i < model.meshCount; i++) { - //fseek(iqmFile, iqmHeader->ofs_text + imesh[i].name, SEEK_SET); + //fseek(iqmFile, iqmHeader->ofs_text + imesh[a].name, SEEK_SET); //fread(name, sizeof(char), MESH_NAME_LENGTH, iqmFile); memcpy(name, fileDataPtr + iqmHeader->ofs_text + imesh[i].name, MESH_NAME_LENGTH*sizeof(char)); - //fseek(iqmFile, iqmHeader->ofs_text + imesh[i].material, SEEK_SET); + //fseek(iqmFile, iqmHeader->ofs_text + imesh[a].material, SEEK_SET); //fread(material, sizeof(char), MATERIAL_NAME_LENGTH, iqmFile); memcpy(material, fileDataPtr + iqmHeader->ofs_text + imesh[i].material, MATERIAL_NAME_LENGTH*sizeof(char)); @@ -4783,16 +4828,18 @@ static Model LoadIQM(const char *fileName) model.meshes[i].normals = (float *)RL_CALLOC(model.meshes[i].vertexCount*3, sizeof(float)); // Default vertex normals model.meshes[i].texcoords = (float *)RL_CALLOC(model.meshes[i].vertexCount*2, sizeof(float)); // Default vertex texcoords - model.meshes[i].boneIds = (unsigned char *)RL_CALLOC(model.meshes[i].vertexCount*4, sizeof(unsigned char)); // Up-to 4 bones supported! + model.meshes[i].boneIndices = (unsigned char *)RL_CALLOC(model.meshes[i].vertexCount*4, sizeof(unsigned char)); // Up-to 4 bones supported! model.meshes[i].boneWeights = (float *)RL_CALLOC(model.meshes[i].vertexCount*4, sizeof(float)); // Up-to 4 bones supported! model.meshes[i].triangleCount = imesh[i].num_triangles; model.meshes[i].indices = (unsigned short *)RL_CALLOC(model.meshes[i].triangleCount*3, sizeof(unsigned short)); +#if !defined(SUPPORT_GPU_SKINNING) // Animated vertex data, what we actually process for rendering // NOTE: Animated vertex should be re-uploaded to GPU (if not using GPU skinning) model.meshes[i].animVertices = (float *)RL_CALLOC(model.meshes[i].vertexCount*3, sizeof(float)); model.meshes[i].animNormals = (float *)RL_CALLOC(model.meshes[i].vertexCount*3, sizeof(float)); +#endif } // Triangles data processing @@ -4830,7 +4877,7 @@ static Model LoadIQM(const char *fileName) case IQM_POSITION: { vertex = (float *)RL_MALLOC(iqmHeader->num_vertexes*3*sizeof(float)); - //fseek(iqmFile, va[i].offset, SEEK_SET); + //fseek(iqmFile, va[a].offset, SEEK_SET); //fread(vertex, iqmHeader->num_vertexes*3*sizeof(float), 1, iqmFile); memcpy(vertex, fileDataPtr + va[i].offset, iqmHeader->num_vertexes*3*sizeof(float)); @@ -4840,7 +4887,7 @@ static Model LoadIQM(const char *fileName) for (unsigned int i = imesh[m].first_vertex*3; i < (imesh[m].first_vertex + imesh[m].num_vertexes)*3; i++) { model.meshes[m].vertices[vCounter] = vertex[i]; - model.meshes[m].animVertices[vCounter] = vertex[i]; + if (model.meshes[m].animVertices != NULL) model.meshes[m].animVertices[vCounter] = vertex[i]; vCounter++; } } @@ -4848,7 +4895,7 @@ static Model LoadIQM(const char *fileName) case IQM_NORMAL: { normal = (float *)RL_MALLOC(iqmHeader->num_vertexes*3*sizeof(float)); - //fseek(iqmFile, va[i].offset, SEEK_SET); + //fseek(iqmFile, va[a].offset, SEEK_SET); //fread(normal, iqmHeader->num_vertexes*3*sizeof(float), 1, iqmFile); memcpy(normal, fileDataPtr + va[i].offset, iqmHeader->num_vertexes*3*sizeof(float)); @@ -4858,7 +4905,7 @@ static Model LoadIQM(const char *fileName) for (unsigned int i = imesh[m].first_vertex*3; i < (imesh[m].first_vertex + imesh[m].num_vertexes)*3; i++) { model.meshes[m].normals[vCounter] = normal[i]; - model.meshes[m].animNormals[vCounter] = normal[i]; + if (model.meshes[m].animNormals != NULL) model.meshes[m].animNormals[vCounter] = normal[i]; vCounter++; } } @@ -4866,7 +4913,7 @@ static Model LoadIQM(const char *fileName) case IQM_TEXCOORD: { text = (float *)RL_MALLOC(iqmHeader->num_vertexes*2*sizeof(float)); - //fseek(iqmFile, va[i].offset, SEEK_SET); + //fseek(iqmFile, va[a].offset, SEEK_SET); //fread(text, iqmHeader->num_vertexes*2*sizeof(float), 1, iqmFile); memcpy(text, fileDataPtr + va[i].offset, iqmHeader->num_vertexes*2*sizeof(float)); @@ -4883,7 +4930,7 @@ static Model LoadIQM(const char *fileName) case IQM_BLENDINDEXES: { blendi = (char *)RL_MALLOC(iqmHeader->num_vertexes*4*sizeof(char)); - //fseek(iqmFile, va[i].offset, SEEK_SET); + //fseek(iqmFile, va[a].offset, SEEK_SET); //fread(blendi, iqmHeader->num_vertexes*4*sizeof(char), 1, iqmFile); memcpy(blendi, fileDataPtr + va[i].offset, iqmHeader->num_vertexes*4*sizeof(char)); @@ -4892,7 +4939,7 @@ static Model LoadIQM(const char *fileName) int boneCounter = 0; for (unsigned int i = imesh[m].first_vertex*4; i < (imesh[m].first_vertex + imesh[m].num_vertexes)*4; i++) { - model.meshes[m].boneIds[boneCounter] = blendi[i]; + model.meshes[m].boneIndices[boneCounter] = blendi[i]; boneCounter++; } } @@ -4900,7 +4947,7 @@ static Model LoadIQM(const char *fileName) case IQM_BLENDWEIGHTS: { blendw = (unsigned char *)RL_MALLOC(iqmHeader->num_vertexes*4*sizeof(unsigned char)); - //fseek(iqmFile, va[i].offset, SEEK_SET); + //fseek(iqmFile, va[a].offset, SEEK_SET); //fread(blendw, iqmHeader->num_vertexes*4*sizeof(unsigned char), 1, iqmFile); memcpy(blendw, fileDataPtr + va[i].offset, iqmHeader->num_vertexes*4*sizeof(unsigned char)); @@ -4917,7 +4964,7 @@ static Model LoadIQM(const char *fileName) case IQM_COLOR: { color = (unsigned char *)RL_MALLOC(iqmHeader->num_vertexes*4*sizeof(unsigned char)); - //fseek(iqmFile, va[i].offset, SEEK_SET); + //fseek(iqmFile, va[a].offset, SEEK_SET); //fread(blendw, iqmHeader->num_vertexes*4*sizeof(unsigned char), 1, iqmFile); memcpy(color, fileDataPtr + va[i].offset, iqmHeader->num_vertexes*4*sizeof(unsigned char)); @@ -4942,45 +4989,39 @@ static Model LoadIQM(const char *fileName) //fread(ijoint, sizeof(IQMJoint), iqmHeader->num_joints, iqmFile); memcpy(ijoint, fileDataPtr + iqmHeader->ofs_joints, iqmHeader->num_joints*sizeof(IQMJoint)); - model.boneCount = iqmHeader->num_joints; - model.bones = (BoneInfo *)RL_MALLOC(iqmHeader->num_joints*sizeof(BoneInfo)); - model.bindPose = (Transform *)RL_MALLOC(iqmHeader->num_joints*sizeof(Transform)); + model.skeleton.boneCount = iqmHeader->num_joints; + model.skeleton.bones = (BoneInfo *)RL_CALLOC(iqmHeader->num_joints, sizeof(BoneInfo)); + model.skeleton.bindPose = (Transform *)RL_CALLOC(iqmHeader->num_joints, sizeof(Transform)); for (unsigned int i = 0; i < iqmHeader->num_joints; i++) { // Bones - model.bones[i].parent = ijoint[i].parent; - //fseek(iqmFile, iqmHeader->ofs_text + ijoint[i].name, SEEK_SET); - //fread(model.bones[i].name, sizeof(char), BONE_NAME_LENGTH, iqmFile); - memcpy(model.bones[i].name, fileDataPtr + iqmHeader->ofs_text + ijoint[i].name, BONE_NAME_LENGTH*sizeof(char)); + model.skeleton.bones[i].parent = ijoint[i].parent; + //fseek(iqmFile, iqmHeader->ofs_text + ijoint[a].name, SEEK_SET); + //fread(model.bones[a].name, sizeof(char), BONE_NAME_LENGTH, iqmFile); + memcpy(model.skeleton.bones[i].name, fileDataPtr + iqmHeader->ofs_text + ijoint[i].name, BONE_NAME_LENGTH*sizeof(char)); // Bind pose (base pose) - model.bindPose[i].translation.x = ijoint[i].translate[0]; - model.bindPose[i].translation.y = ijoint[i].translate[1]; - model.bindPose[i].translation.z = ijoint[i].translate[2]; + model.skeleton.bindPose[i].translation.x = ijoint[i].translate[0]; + model.skeleton.bindPose[i].translation.y = ijoint[i].translate[1]; + model.skeleton.bindPose[i].translation.z = ijoint[i].translate[2]; - model.bindPose[i].rotation.x = ijoint[i].rotate[0]; - model.bindPose[i].rotation.y = ijoint[i].rotate[1]; - model.bindPose[i].rotation.z = ijoint[i].rotate[2]; - model.bindPose[i].rotation.w = ijoint[i].rotate[3]; + model.skeleton.bindPose[i].rotation.x = ijoint[i].rotate[0]; + model.skeleton.bindPose[i].rotation.y = ijoint[i].rotate[1]; + model.skeleton.bindPose[i].rotation.z = ijoint[i].rotate[2]; + model.skeleton.bindPose[i].rotation.w = ijoint[i].rotate[3]; - model.bindPose[i].scale.x = ijoint[i].scale[0]; - model.bindPose[i].scale.y = ijoint[i].scale[1]; - model.bindPose[i].scale.z = ijoint[i].scale[2]; + model.skeleton.bindPose[i].scale.x = ijoint[i].scale[0]; + model.skeleton.bindPose[i].scale.y = ijoint[i].scale[1]; + model.skeleton.bindPose[i].scale.z = ijoint[i].scale[2]; } - BuildPoseFromParentJoints(model.bones, model.boneCount, model.bindPose); + BuildPoseFromParentJoints(model.skeleton.bones, model.skeleton.boneCount, model.skeleton.bindPose); - for (int i = 0; i < model.meshCount; i++) - { - model.meshes[i].boneCount = model.boneCount; - model.meshes[i].boneMatrices = (Matrix *)RL_CALLOC(model.meshes[i].boneCount, sizeof(Matrix)); - - for (int j = 0; j < model.meshes[i].boneCount; j++) - { - model.meshes[i].boneMatrices[j] = MatrixIdentity(); - } - } + // Initialize runtime animation data: current pose and bone matrices + model.currentPose = (Transform *)RL_CALLOC(model.skeleton.boneCount, sizeof(Transform)); + model.boneMatrices = (Matrix *)RL_CALLOC(model.skeleton.boneCount, sizeof(Matrix)); + for (int j = 0; j < model.skeleton.boneCount; j++) model.boneMatrices[j] = MatrixIdentity(); UnloadFileData(fileData); @@ -5078,37 +5119,42 @@ static ModelAnimation *LoadModelAnimationsIQM(const char *fileName, int *animCou //fread(anim, sizeof(IQMAnim), iqmHeader->num_anims, iqmFile); memcpy(anim, fileDataPtr + iqmHeader->ofs_anims, iqmHeader->num_anims*sizeof(IQMAnim)); - ModelAnimation *animations = (ModelAnimation *)RL_MALLOC(iqmHeader->num_anims*sizeof(ModelAnimation)); + ModelAnimation *animations = (ModelAnimation *)RL_CALLOC(iqmHeader->num_anims, sizeof(ModelAnimation)); // frameposes - unsigned short *framedata = (unsigned short *)RL_MALLOC(iqmHeader->num_frames*iqmHeader->num_framechannels*sizeof(unsigned short)); + unsigned short *framedata = (unsigned short *)RL_CALLOC(iqmHeader->num_frames*iqmHeader->num_framechannels, sizeof(unsigned short)); //fseek(iqmFile, iqmHeader->ofs_frames, SEEK_SET); //fread(framedata, sizeof(unsigned short), iqmHeader->num_frames*iqmHeader->num_framechannels, iqmFile); memcpy(framedata, fileDataPtr + iqmHeader->ofs_frames, iqmHeader->num_frames*iqmHeader->num_framechannels*sizeof(unsigned short)); // joints - IQMJoint *joints = (IQMJoint *)RL_MALLOC(iqmHeader->num_joints*sizeof(IQMJoint)); + IQMJoint *joints = (IQMJoint *)RL_CALLOC(iqmHeader->num_joints, sizeof(IQMJoint)); memcpy(joints, fileDataPtr + iqmHeader->ofs_joints, iqmHeader->num_joints*sizeof(IQMJoint)); for (unsigned int a = 0; a < iqmHeader->num_anims; a++) { - animations[a].frameCount = anim[a].num_frames; animations[a].boneCount = iqmHeader->num_poses; - animations[a].bones = (BoneInfo *)RL_MALLOC(iqmHeader->num_poses*sizeof(BoneInfo)); - animations[a].framePoses = (Transform **)RL_MALLOC(anim[a].num_frames*sizeof(Transform *)); + BoneInfo *bones = (BoneInfo *)RL_CALLOC(iqmHeader->num_poses, sizeof(BoneInfo)); + + animations[a].keyframeCount = anim[a].num_frames; + animations[a].keyframePoses = (Transform **)RL_CALLOC(anim[a].num_frames, sizeof(Transform *)); memcpy(animations[a].name, fileDataPtr + iqmHeader->ofs_text + anim[a].name, 32); - TRACELOG(LOG_INFO, "IQM Anim %s", animations[a].name); - //animations[a].framerate = anim.framerate; // TODO: Use animation framerate data? + // TODO: Use animation framerate data? + //animations[a].framerate = anim.framerate; + + TRACELOG(LOG_INFO, "MODEL: [%s] Loaded animation: %s | Frames: %d | Framerate: %f", fileName, animations[a].name, animations[a].keyframeCount, anim[a].framerate); for (unsigned int j = 0; j < iqmHeader->num_poses; j++) { - // If animations and skeleton are in the same file, copy bone names to anim - if (iqmHeader->num_joints > 0) memcpy(animations[a].bones[j].name, fileDataPtr + iqmHeader->ofs_text + joints[j].name, BONE_NAME_LENGTH*sizeof(char)); - else memcpy(animations[a].bones[j].name, "ANIMJOINTNAME", 13); // Default bone name otherwise - animations[a].bones[j].parent = poses[j].parent; + bones[j].parent = poses[j].parent; + + // NOTE: No need to store bones names, bones only required to generate keyframe poses + //if (iqmHeader->num_joints > 0) memcpy(bones[j].name, fileDataPtr + iqmHeader->ofs_text + joints[j].name, BONE_NAME_LENGTH*sizeof(char)); + //else memcpy(bones[j].name, "ANIMJOINTNAME", 13); // Default bone name otherwise } - for (unsigned int j = 0; j < anim[a].num_frames; j++) animations[a].framePoses[j] = (Transform *)RL_MALLOC(iqmHeader->num_poses*sizeof(Transform)); + for (unsigned int j = 0; j < anim[a].num_frames; j++) + animations[a].keyframePoses[j] = (Transform *)RL_MALLOC(iqmHeader->num_poses*sizeof(Transform)); int dcounter = anim[a].first_frame*iqmHeader->num_framechannels; @@ -5116,87 +5162,87 @@ static ModelAnimation *LoadModelAnimationsIQM(const char *fileName, int *animCou { for (unsigned int i = 0; i < iqmHeader->num_poses; i++) { - animations[a].framePoses[frame][i].translation.x = poses[i].channeloffset[0]; + animations[a].keyframePoses[frame][i].translation.x = poses[i].channeloffset[0]; if (poses[i].mask & 0x01) { - animations[a].framePoses[frame][i].translation.x += framedata[dcounter]*poses[i].channelscale[0]; + animations[a].keyframePoses[frame][i].translation.x += framedata[dcounter]*poses[i].channelscale[0]; dcounter++; } - animations[a].framePoses[frame][i].translation.y = poses[i].channeloffset[1]; + animations[a].keyframePoses[frame][i].translation.y = poses[i].channeloffset[1]; if (poses[i].mask & 0x02) { - animations[a].framePoses[frame][i].translation.y += framedata[dcounter]*poses[i].channelscale[1]; + animations[a].keyframePoses[frame][i].translation.y += framedata[dcounter]*poses[i].channelscale[1]; dcounter++; } - animations[a].framePoses[frame][i].translation.z = poses[i].channeloffset[2]; + animations[a].keyframePoses[frame][i].translation.z = poses[i].channeloffset[2]; if (poses[i].mask & 0x04) { - animations[a].framePoses[frame][i].translation.z += framedata[dcounter]*poses[i].channelscale[2]; + animations[a].keyframePoses[frame][i].translation.z += framedata[dcounter]*poses[i].channelscale[2]; dcounter++; } - animations[a].framePoses[frame][i].rotation.x = poses[i].channeloffset[3]; + animations[a].keyframePoses[frame][i].rotation.x = poses[i].channeloffset[3]; if (poses[i].mask & 0x08) { - animations[a].framePoses[frame][i].rotation.x += framedata[dcounter]*poses[i].channelscale[3]; + animations[a].keyframePoses[frame][i].rotation.x += framedata[dcounter]*poses[i].channelscale[3]; dcounter++; } - animations[a].framePoses[frame][i].rotation.y = poses[i].channeloffset[4]; + animations[a].keyframePoses[frame][i].rotation.y = poses[i].channeloffset[4]; if (poses[i].mask & 0x10) { - animations[a].framePoses[frame][i].rotation.y += framedata[dcounter]*poses[i].channelscale[4]; + animations[a].keyframePoses[frame][i].rotation.y += framedata[dcounter]*poses[i].channelscale[4]; dcounter++; } - animations[a].framePoses[frame][i].rotation.z = poses[i].channeloffset[5]; + animations[a].keyframePoses[frame][i].rotation.z = poses[i].channeloffset[5]; if (poses[i].mask & 0x20) { - animations[a].framePoses[frame][i].rotation.z += framedata[dcounter]*poses[i].channelscale[5]; + animations[a].keyframePoses[frame][i].rotation.z += framedata[dcounter]*poses[i].channelscale[5]; dcounter++; } - animations[a].framePoses[frame][i].rotation.w = poses[i].channeloffset[6]; + animations[a].keyframePoses[frame][i].rotation.w = poses[i].channeloffset[6]; if (poses[i].mask & 0x40) { - animations[a].framePoses[frame][i].rotation.w += framedata[dcounter]*poses[i].channelscale[6]; + animations[a].keyframePoses[frame][i].rotation.w += framedata[dcounter]*poses[i].channelscale[6]; dcounter++; } - animations[a].framePoses[frame][i].scale.x = poses[i].channeloffset[7]; + animations[a].keyframePoses[frame][i].scale.x = poses[i].channeloffset[7]; if (poses[i].mask & 0x80) { - animations[a].framePoses[frame][i].scale.x += framedata[dcounter]*poses[i].channelscale[7]; + animations[a].keyframePoses[frame][i].scale.x += framedata[dcounter]*poses[i].channelscale[7]; dcounter++; } - animations[a].framePoses[frame][i].scale.y = poses[i].channeloffset[8]; + animations[a].keyframePoses[frame][i].scale.y = poses[i].channeloffset[8]; if (poses[i].mask & 0x100) { - animations[a].framePoses[frame][i].scale.y += framedata[dcounter]*poses[i].channelscale[8]; + animations[a].keyframePoses[frame][i].scale.y += framedata[dcounter]*poses[i].channelscale[8]; dcounter++; } - animations[a].framePoses[frame][i].scale.z = poses[i].channeloffset[9]; + animations[a].keyframePoses[frame][i].scale.z = poses[i].channeloffset[9]; if (poses[i].mask & 0x200) { - animations[a].framePoses[frame][i].scale.z += framedata[dcounter]*poses[i].channelscale[9]; + animations[a].keyframePoses[frame][i].scale.z += framedata[dcounter]*poses[i].channelscale[9]; dcounter++; } - animations[a].framePoses[frame][i].rotation = QuaternionNormalize(animations[a].framePoses[frame][i].rotation); + animations[a].keyframePoses[frame][i].rotation = QuaternionNormalize(animations[a].keyframePoses[frame][i].rotation); } } @@ -5205,15 +5251,17 @@ static ModelAnimation *LoadModelAnimationsIQM(const char *fileName, int *animCou { for (int i = 0; i < animations[a].boneCount; i++) { - if (animations[a].bones[i].parent >= 0) + if (bones[i].parent >= 0) { - animations[a].framePoses[frame][i].rotation = QuaternionMultiply(animations[a].framePoses[frame][animations[a].bones[i].parent].rotation, animations[a].framePoses[frame][i].rotation); - animations[a].framePoses[frame][i].translation = Vector3RotateByQuaternion(animations[a].framePoses[frame][i].translation, animations[a].framePoses[frame][animations[a].bones[i].parent].rotation); - animations[a].framePoses[frame][i].translation = Vector3Add(animations[a].framePoses[frame][i].translation, animations[a].framePoses[frame][animations[a].bones[i].parent].translation); - animations[a].framePoses[frame][i].scale = Vector3Multiply(animations[a].framePoses[frame][i].scale, animations[a].framePoses[frame][animations[a].bones[i].parent].scale); + animations[a].keyframePoses[frame][i].rotation = QuaternionMultiply(animations[a].keyframePoses[frame][bones[i].parent].rotation, animations[a].keyframePoses[frame][i].rotation); + animations[a].keyframePoses[frame][i].translation = Vector3RotateByQuaternion(animations[a].keyframePoses[frame][i].translation, animations[a].keyframePoses[frame][bones[i].parent].rotation); + animations[a].keyframePoses[frame][i].translation = Vector3Add(animations[a].keyframePoses[frame][i].translation, animations[a].keyframePoses[frame][bones[i].parent].translation); + animations[a].keyframePoses[frame][i].scale = Vector3Multiply(animations[a].keyframePoses[frame][i].scale, animations[a].keyframePoses[frame][bones[i].parent].scale); } } } + + RL_FREE(bones); } UnloadFileData(fileData); @@ -5375,7 +5423,7 @@ static Model LoadGLTF(const char *fileName) - Supports basic animations - Transforms, including parent-child relations, are applied on the mesh data, but the hierarchy is not kept (as it can't be represented) - - Mesh instances in the glTF file (i.e. same mesh linked from multiple nodes) + - Mesh instances in the glTF file (a.e. same mesh linked from multiple nodes) are turned into separate raylib Meshes RESTRICTIONS: @@ -5604,7 +5652,7 @@ static Model LoadGLTF(const char *fileName) // NOTE: Visit each node in the hierarchy and process any mesh linked from it // - Each primitive within a glTF node becomes a raylib Mesh // - The local-to-world transform of each node is used to transform the points/normals/tangents of the created Mesh(es) - // - Any glTF mesh linked from more than one Node (i.e. instancing) is turned into multiple Mesh's, as each Node will have its own transform applied + // - Any glTF mesh linked from more than one Node (a.e. instancing) is turned into multiple Mesh's, as each Node will have its own transform applied // // WARNING: The code below disregards the scenes defined in the file, all nodes are used //---------------------------------------------------------------------------------------------------- @@ -6092,15 +6140,15 @@ static Model LoadGLTF(const char *fileName) // LIMITATIONS: // - Only supports 1 armature per file, and skips loading it if there are multiple armatures // - Only supports linear interpolation (default method in Blender when checked "Always Sample Animations" when exporting a GLTF file) - // - Only supports translation/rotation/scale animation channel.path, weights not considered (i.e. morph targets) + // - Only supports translation/rotation/scale animation channel.path, weights not considered (a.e. morph targets) //---------------------------------------------------------------------------------------------------- if (data->skins_count > 0) { cgltf_skin skin = data->skins[0]; - model.bones = LoadBoneInfoGLTF(skin, &model.boneCount); - model.bindPose = (Transform *)RL_MALLOC(model.boneCount*sizeof(Transform)); + model.skeleton.bones = LoadBoneInfoGLTF(skin, &model.skeleton.boneCount); + model.skeleton.bindPose = (Transform *)RL_CALLOC(model.skeleton.boneCount, sizeof(Transform)); - for (int i = 0; i < model.boneCount; i++) + for (int i = 0; i < model.skeleton.boneCount; i++) { cgltf_node *node = skin.joints[i]; cgltf_float worldTransform[16]; @@ -6111,7 +6159,11 @@ static Model LoadGLTF(const char *fileName) worldTransform[2], worldTransform[6], worldTransform[10], worldTransform[14], worldTransform[3], worldTransform[7], worldTransform[11], worldTransform[15] }; - MatrixDecompose(worldMatrix, &(model.bindPose[i].translation), &(model.bindPose[i].rotation), &(model.bindPose[i].scale)); + + MatrixDecompose(worldMatrix, + &(model.skeleton.bindPose[i].translation), + &(model.skeleton.bindPose[i].rotation), + &(model.skeleton.bindPose[i].scale)); } if (data->skins_count > 1) TRACELOG(LOG_WARNING, "MODEL: [%s] can only load one skin (armature) per model, but gltf skins_count == %i", fileName, data->skins_count); @@ -6143,7 +6195,7 @@ static Model LoadGLTF(const char *fileName) // NOTE: JOINTS_n can only be vec4 and u8/u16 // SPECS: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#meshes-overview - // WARNING: raylib only supports model.meshes[].boneIds as u8 (unsigned char), + // WARNING: raylib only supports model.meshes[].boneIndices as u8 (unsigned char), // 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) @@ -6151,16 +6203,16 @@ static Model LoadGLTF(const char *fileName) { if (attribute->component_type == cgltf_component_type_r_8u) { - // Init raylib mesh boneIds to copy glTF attribute data - model.meshes[meshIndex].boneIds = (unsigned char *)RL_CALLOC(model.meshes[meshIndex].vertexCount*4, sizeof(unsigned char)); + // Init raylib mesh boneIndices to copy glTF attribute data + model.meshes[meshIndex].boneIndices = (unsigned char *)RL_CALLOC(model.meshes[meshIndex].vertexCount*4, sizeof(unsigned char)); // Load attribute: vec4, u8 (unsigned char) - LOAD_ATTRIBUTE(attribute, 4, unsigned char, model.meshes[meshIndex].boneIds) + LOAD_ATTRIBUTE(attribute, 4, unsigned char, model.meshes[meshIndex].boneIndices) } else if (attribute->component_type == cgltf_component_type_r_16u) { - // Init raylib mesh boneIds to copy glTF attribute data - model.meshes[meshIndex].boneIds = (unsigned char *)RL_CALLOC(model.meshes[meshIndex].vertexCount*4, sizeof(unsigned char)); + // Init raylib mesh boneIndices to copy glTF attribute data + model.meshes[meshIndex].boneIndices = (unsigned char *)RL_CALLOC(model.meshes[meshIndex].vertexCount*4, sizeof(unsigned char)); // Load data into a temp buffer to be converted to raylib data type unsigned short *temp = (unsigned short *)RL_CALLOC(model.meshes[meshIndex].vertexCount*4, sizeof(unsigned short)); @@ -6177,7 +6229,7 @@ static Model LoadGLTF(const char *fileName) } // Despite the possible overflow, we convert data to unsigned char - model.meshes[meshIndex].boneIds[b] = (unsigned char)temp[b]; + model.meshes[meshIndex].boneIndices[b] = (unsigned char)temp[b]; } RL_FREE(temp); @@ -6243,7 +6295,7 @@ static Model LoadGLTF(const char *fileName) if (data->skins_count > 0 && !hasJoints && node->parent != NULL && node->parent->mesh == NULL) { int parentBoneId = -1; - for (int joint = 0; joint < model.boneCount; joint++) + for (int joint = 0; joint < model.skeleton.boneCount; joint++) { if (data->skins[0].joints[joint] == node->parent) { @@ -6254,38 +6306,34 @@ static Model LoadGLTF(const char *fileName) if (parentBoneId >= 0) { - model.meshes[meshIndex].boneIds = (unsigned char *)RL_CALLOC(model.meshes[meshIndex].vertexCount*4, sizeof(unsigned char)); + model.meshes[meshIndex].boneIndices = (unsigned char *)RL_CALLOC(model.meshes[meshIndex].vertexCount*4, sizeof(unsigned char)); model.meshes[meshIndex].boneWeights = (float *)RL_CALLOC(model.meshes[meshIndex].vertexCount*4, sizeof(float)); for (int vertexIndex = 0; vertexIndex < model.meshes[meshIndex].vertexCount*4; vertexIndex += 4) { - model.meshes[meshIndex].boneIds[vertexIndex] = (unsigned char)parentBoneId; + model.meshes[meshIndex].boneIndices[vertexIndex] = (unsigned char)parentBoneId; model.meshes[meshIndex].boneWeights[vertexIndex] = 1.0f; } } } - // Animated vertex data +#if !defined(SUPPORT_GPU_SKINNING) + // Animated vertex data (CPU skinning) model.meshes[meshIndex].animVertices = (float *)RL_CALLOC(model.meshes[meshIndex].vertexCount*3, sizeof(float)); memcpy(model.meshes[meshIndex].animVertices, model.meshes[meshIndex].vertices, model.meshes[meshIndex].vertexCount*3*sizeof(float)); model.meshes[meshIndex].animNormals = (float *)RL_CALLOC(model.meshes[meshIndex].vertexCount*3, sizeof(float)); - if (model.meshes[meshIndex].normals != NULL) - { - memcpy(model.meshes[meshIndex].animNormals, model.meshes[meshIndex].normals, model.meshes[meshIndex].vertexCount*3*sizeof(float)); - } - - // Bone Transform Matrices - model.meshes[meshIndex].boneCount = model.boneCount; - model.meshes[meshIndex].boneMatrices = (Matrix *)RL_CALLOC(model.meshes[meshIndex].boneCount, sizeof(Matrix)); - - for (int j = 0; j < model.meshes[meshIndex].boneCount; j++) - { - model.meshes[meshIndex].boneMatrices[j] = MatrixIdentity(); - } + if (model.meshes[meshIndex].normals != NULL) memcpy(model.meshes[meshIndex].animNormals, model.meshes[meshIndex].normals, model.meshes[meshIndex].vertexCount*3*sizeof(float)); +#endif + model.meshes[meshIndex].boneCount = model.skeleton.boneCount; meshIndex++; // Move to next mesh } } + + // Initialize runtime animation data: current pose and bone matrices + model.currentPose = (Transform *)RL_CALLOC(model.skeleton.boneCount, sizeof(Transform)); + model.boneMatrices = (Matrix *)RL_CALLOC(model.skeleton.boneCount, sizeof(Matrix)); + for (int j = 0; j < model.skeleton.boneCount; j++) model.boneMatrices[j] = MatrixIdentity(); //---------------------------------------------------------------------------------------------------- // Free all cgltf loaded data @@ -6484,11 +6532,11 @@ static ModelAnimation *LoadModelAnimationsGLTF(const char *fileName, int *animCo }; MatrixDecompose(worldMatrix, &worldTransform.translation, &worldTransform.rotation, &worldTransform.scale); - for (unsigned int i = 0; i < data->animations_count; i++) + for (unsigned int a = 0; a < data->animations_count; a++) { - animations[i].bones = LoadBoneInfoGLTF(skin, &animations[i].boneCount); + BoneInfo *bones = LoadBoneInfoGLTF(skin, &animations[a].boneCount); - cgltf_animation animData = data->animations[i]; + cgltf_animation animData = data->animations[a]; struct Channels { cgltf_animation_channel *translate; @@ -6497,7 +6545,7 @@ static ModelAnimation *LoadModelAnimationsGLTF(const char *fileName, int *animCo cgltf_interpolation_type interpolationType; }; - struct Channels *boneChannels = (struct Channels *)RL_CALLOC(animations[i].boneCount, sizeof(struct Channels)); + struct Channels *boneChannels = (struct Channels *)RL_CALLOC(animations[a].boneCount, sizeof(struct Channels)); float animDuration = 0.0f; for (unsigned int j = 0; j < animData.channels_count; j++) @@ -6514,11 +6562,7 @@ static ModelAnimation *LoadModelAnimationsGLTF(const char *fileName, int *animCo } } - if (boneIndex == -1) - { - // Animation channel for a node not in the armature - continue; - } + if (boneIndex == -1) continue; // Animation channel for a node not in the skeleton boneChannels[boneIndex].interpolationType = animData.channels[j].sampler->interpolation; @@ -6538,34 +6582,34 @@ static ModelAnimation *LoadModelAnimationsGLTF(const char *fileName, int *animCo } else { - TRACELOG(LOG_WARNING, "MODEL: [%s] Unsupported target_path on channel %d's sampler for animation %d. Skipping.", fileName, j, i); + TRACELOG(LOG_WARNING, "MODEL: [%s] Unsupported target_path on channel %d's sampler for animation %d. Skipping.", fileName, j, a); } } else TRACELOG(LOG_WARNING, "MODEL: [%s] Invalid interpolation curve encountered for GLTF animation.", fileName); - float t = 0.0f; - cgltf_bool r = cgltf_accessor_read_float(channel.sampler->input, channel.sampler->input->count - 1, &t, 1); + float time = 0.0f; + cgltf_bool result = cgltf_accessor_read_float(channel.sampler->input, channel.sampler->input->count - 1, &time, 1); - if (!r) + if (!result) { TRACELOG(LOG_WARNING, "MODEL: [%s] Failed to load input time", fileName); continue; } - animDuration = (t > animDuration)? t : animDuration; + animDuration = (time > animDuration)? time : animDuration; } - if (animData.name != NULL) strncpy(animations[i].name, animData.name, sizeof(animations[i].name) - 1); + if (animData.name != NULL) strncpy(animations[a].name, animData.name, sizeof(animations[a].name) - 1); - animations[i].frameCount = (int)(animDuration*GLTF_FRAMERATE) + 1; - animations[i].framePoses = (Transform **)RL_MALLOC(animations[i].frameCount*sizeof(Transform *)); + animations[a].keyframeCount = (int)(animDuration*GLTF_FRAMERATE) + 1; + animations[a].keyframePoses = (Transform **)RL_CALLOC(animations[a].keyframeCount, sizeof(Transform *)); - for (int j = 0; j < animations[i].frameCount; j++) + for (int j = 0; j < animations[a].keyframeCount; j++) { - animations[i].framePoses[j] = (Transform *)RL_MALLOC(animations[i].boneCount*sizeof(Transform)); + animations[a].keyframePoses[j] = (Transform *)RL_CALLOC(animations[a].boneCount, sizeof(Transform)); float time = (float)j / GLTF_FRAMERATE; - for (int k = 0; k < animations[i].boneCount; k++) + for (int k = 0; k < animations[a].boneCount; k++) { Vector3 translation = {skin.joints[k]->translation[0], skin.joints[k]->translation[1], skin.joints[k]->translation[2]}; Quaternion rotation = {skin.joints[k]->rotation[0], skin.joints[k]->rotation[1], skin.joints[k]->rotation[2], skin.joints[k]->rotation[3]}; @@ -6575,7 +6619,7 @@ static ModelAnimation *LoadModelAnimationsGLTF(const char *fileName, int *animCo { if (!GetPoseAtTimeGLTF(boneChannels[k].interpolationType, boneChannels[k].translate->sampler->input, boneChannels[k].translate->sampler->output, time, &translation)) { - TRACELOG(LOG_INFO, "MODEL: [%s] Failed to load translate pose data for bone %s", fileName, animations[i].bones[k].name); + TRACELOG(LOG_INFO, "MODEL: [%s] Failed to load translate pose data for bone %s", fileName, bones[k].name); } } @@ -6583,7 +6627,7 @@ static ModelAnimation *LoadModelAnimationsGLTF(const char *fileName, int *animCo { if (!GetPoseAtTimeGLTF(boneChannels[k].interpolationType, boneChannels[k].rotate->sampler->input, boneChannels[k].rotate->sampler->output, time, &rotation)) { - TRACELOG(LOG_INFO, "MODEL: [%s] Failed to load rotate pose data for bone %s", fileName, animations[i].bones[k].name); + TRACELOG(LOG_INFO, "MODEL: [%s] Failed to load rotate pose data for bone %s", fileName, bones[k].name); } } @@ -6591,40 +6635,43 @@ static ModelAnimation *LoadModelAnimationsGLTF(const char *fileName, int *animCo { if (!GetPoseAtTimeGLTF(boneChannels[k].interpolationType, boneChannels[k].scale->sampler->input, boneChannels[k].scale->sampler->output, time, &scale)) { - TRACELOG(LOG_INFO, "MODEL: [%s] Failed to load scale pose data for bone %s", fileName, animations[i].bones[k].name); + TRACELOG(LOG_INFO, "MODEL: [%s] Failed to load scale pose data for bone %s", fileName, bones[k].name); } } - animations[i].framePoses[j][k] = (Transform){ + animations[a].keyframePoses[j][k] = (Transform){ .translation = translation, .rotation = rotation, .scale = scale }; } - Transform *root = &animations[i].framePoses[j][0]; + Transform *root = &animations[a].keyframePoses[j][0]; root->rotation = QuaternionMultiply(worldTransform.rotation, root->rotation); root->scale = Vector3Multiply(root->scale, worldTransform.scale); root->translation = Vector3Multiply(root->translation, worldTransform.scale); root->translation = Vector3RotateByQuaternion(root->translation, worldTransform.rotation); root->translation = Vector3Add(root->translation, worldTransform.translation); - BuildPoseFromParentJoints(animations[i].bones, animations[i].boneCount, animations[i].framePoses[j]); + BuildPoseFromParentJoints(bones, animations[a].boneCount, animations[a].keyframePoses[j]); } - TRACELOG(LOG_INFO, "MODEL: [%s] Loaded animation: %s (%d frames, %fs)", fileName, (animData.name != NULL)? animData.name : "NULL", animations[i].frameCount, animDuration); + TRACELOG(LOG_INFO, "MODEL: [%s] Loaded animation: %s | Frames: %d | Duration: %fs", fileName, (animData.name != NULL)? animData.name : "NULL", animations[a].keyframeCount, animDuration); RL_FREE(boneChannels); + RL_FREE(bones); } } if (data->skins_count > 1) { - TRACELOG(LOG_WARNING, "MODEL: [%s] expected exactly one skin to load animation data from, but found %i", fileName, data->skins_count); + TRACELOG(LOG_WARNING, "MODEL: [%s] Expected one unique skin to load animation data from, but found %i", fileName, data->skins_count); } cgltf_free(data); } + UnloadFileData(fileData); + return animations; } #endif @@ -6795,13 +6842,13 @@ static Model LoadM3D(const char *fileName) // WARNING: Sorting is not needed, valid M3D model files should already be sorted // Just keeping the sorting function for reference (Check PR #3363 #3385) /* - for (i = 1; i < m3d->numface; i++) + for (a = 1; a < m3d->numface; a++) { - if (m3d->face[i-1].materialid <= m3d->face[i].materialid) continue; + if (m3d->face[a-1].materialid <= m3d->face[a].materialid) continue; - // face[i-1] > face[i]. slide face[i] lower - m3df_t slider = m3d->face[i]; - j = i-1; + // face[a-1] > face[a]. slide face[a] lower + m3df_t slider = m3d->face[a]; + j = a-1; do { // face[j] > slider, face[j+1] is svailable vacant gap @@ -6875,10 +6922,12 @@ static Model LoadM3D(const char *fileName) if (m3d->numbone && m3d->numskin) { - model.meshes[k].boneIds = (unsigned char *)RL_CALLOC(model.meshes[k].vertexCount*4, sizeof(unsigned char)); + model.meshes[k].boneIndices = (unsigned char *)RL_CALLOC(model.meshes[k].vertexCount*4, sizeof(unsigned char)); model.meshes[k].boneWeights = (float *)RL_CALLOC(model.meshes[k].vertexCount*4, sizeof(float)); +#if !defined(SUPPORT_GPU_SKINNING) model.meshes[k].animVertices = (float *)RL_CALLOC(model.meshes[k].vertexCount*3, sizeof(float)); model.meshes[k].animNormals = (float *)RL_CALLOC(model.meshes[k].vertexCount*3, sizeof(float)); +#endif } model.meshMaterial[k] = mi + 1; @@ -6942,7 +6991,7 @@ static Model LoadM3D(const char *fileName) { for (j = 0; j < 4; j++) { - model.meshes[k].boneIds[l*12 + n*4 + j] = m3d->skin[skinid].boneid[j]; + model.meshes[k].boneIndices[l*12 + n*4 + j] = m3d->skin[skinid].boneid[j]; model.meshes[k].boneWeights[l*12 + n*4 + j] = m3d->skin[skinid].weight[j]; } } @@ -6950,7 +6999,7 @@ static Model LoadM3D(const char *fileName) { // raylib does not handle boneless meshes with skeletal animations, so // we put all vertices without a bone into a special "no bone" bone - model.meshes[k].boneIds[l*12 + n*4] = m3d->numbone; + model.meshes[k].boneIndices[l*12 + n*4] = m3d->numbone; model.meshes[k].boneWeights[l*12 + n*4] = 1.0f; } } @@ -7031,47 +7080,47 @@ static Model LoadM3D(const char *fileName) // Load bones if (m3d->numbone) { - model.boneCount = m3d->numbone + 1; - model.bones = (BoneInfo *)RL_CALLOC(model.boneCount, sizeof(BoneInfo)); - model.bindPose = (Transform *)RL_CALLOC(model.boneCount, sizeof(Transform)); + model.skeleton.boneCount = m3d->numbone + 1; + model.skeleton.bones = (BoneInfo *)RL_CALLOC(model.skeleton.boneCount, sizeof(BoneInfo)); + model.skeleton.bindPose = (Transform *)RL_CALLOC(model.skeleton.boneCount, sizeof(Transform)); for (i = 0; i < (int)m3d->numbone; i++) { - model.bones[i].parent = m3d->bone[i].parent; - strncpy(model.bones[i].name, m3d->bone[i].name, sizeof(model.bones[i].name) - 1); - model.bindPose[i].translation.x = m3d->vertex[m3d->bone[i].pos].x*m3d->scale; - model.bindPose[i].translation.y = m3d->vertex[m3d->bone[i].pos].y*m3d->scale; - model.bindPose[i].translation.z = m3d->vertex[m3d->bone[i].pos].z*m3d->scale; - model.bindPose[i].rotation.x = m3d->vertex[m3d->bone[i].ori].x; - model.bindPose[i].rotation.y = m3d->vertex[m3d->bone[i].ori].y; - model.bindPose[i].rotation.z = m3d->vertex[m3d->bone[i].ori].z; - model.bindPose[i].rotation.w = m3d->vertex[m3d->bone[i].ori].w; + model.skeleton.bones[i].parent = m3d->bone[i].parent; + strncpy(model.skeleton.bones[i].name, m3d->bone[i].name, sizeof(model.skeleton.bones[i].name) - 1); + model.skeleton.bindPose[i].translation.x = m3d->vertex[m3d->bone[i].pos].x*m3d->scale; + model.skeleton.bindPose[i].translation.y = m3d->vertex[m3d->bone[i].pos].y*m3d->scale; + model.skeleton.bindPose[i].translation.z = m3d->vertex[m3d->bone[i].pos].z*m3d->scale; + model.skeleton.bindPose[i].rotation.x = m3d->vertex[m3d->bone[i].ori].x; + model.skeleton.bindPose[i].rotation.y = m3d->vertex[m3d->bone[i].ori].y; + model.skeleton.bindPose[i].rotation.z = m3d->vertex[m3d->bone[i].ori].z; + model.skeleton.bindPose[i].rotation.w = m3d->vertex[m3d->bone[i].ori].w; - // TODO: If the orientation quaternion is not normalized, then that's encoding scaling - model.bindPose[i].rotation = QuaternionNormalize(model.bindPose[i].rotation); - model.bindPose[i].scale.x = model.bindPose[i].scale.y = model.bindPose[i].scale.z = 1.0f; + // NOTE: If the orientation quaternion is not normalized, then that's encoding scaling + model.skeleton.bindPose[i].rotation = QuaternionNormalize(model.skeleton.bindPose[i].rotation); + model.skeleton.bindPose[i].scale.x = model.skeleton.bindPose[i].scale.y = model.skeleton.bindPose[i].scale.z = 1.0f; // Child bones are stored in parent bone relative space, convert that into model space - if (model.bones[i].parent >= 0) + if (model.skeleton.bones[i].parent >= 0) { - model.bindPose[i].rotation = QuaternionMultiply(model.bindPose[model.bones[i].parent].rotation, model.bindPose[i].rotation); - model.bindPose[i].translation = Vector3RotateByQuaternion(model.bindPose[i].translation, model.bindPose[model.bones[i].parent].rotation); - model.bindPose[i].translation = Vector3Add(model.bindPose[i].translation, model.bindPose[model.bones[i].parent].translation); - model.bindPose[i].scale = Vector3Multiply(model.bindPose[i].scale, model.bindPose[model.bones[i].parent].scale); + model.skeleton.bindPose[i].rotation = QuaternionMultiply(model.skeleton.bindPose[model.skeleton.bones[i].parent].rotation, model.skeleton.bindPose[i].rotation); + model.skeleton.bindPose[i].translation = Vector3RotateByQuaternion(model.skeleton.bindPose[i].translation, model.skeleton.bindPose[model.skeleton.bones[i].parent].rotation); + model.skeleton.bindPose[i].translation = Vector3Add(model.skeleton.bindPose[i].translation, model.skeleton.bindPose[model.skeleton.bones[i].parent].translation); + model.skeleton.bindPose[i].scale = Vector3Multiply(model.skeleton.bindPose[i].scale, model.skeleton.bindPose[model.skeleton.bones[i].parent].scale); } } // Add a special "no bone" bone - model.bones[i].parent = -1; - memcpy(model.bones[i].name, "NO BONE", 7); - model.bindPose[i].translation.x = 0.0f; - model.bindPose[i].translation.y = 0.0f; - model.bindPose[i].translation.z = 0.0f; - model.bindPose[i].rotation.x = 0.0f; - model.bindPose[i].rotation.y = 0.0f; - model.bindPose[i].rotation.z = 0.0f; - model.bindPose[i].rotation.w = 1.0f; - model.bindPose[i].scale.x = model.bindPose[i].scale.y = model.bindPose[i].scale.z = 1.0f; + model.skeleton.bones[i].parent = -1; + memcpy(model.skeleton.bones[i].name, "NO BONE", 7); + model.skeleton.bindPose[i].translation.x = 0.0f; + model.skeleton.bindPose[i].translation.y = 0.0f; + model.skeleton.bindPose[i].translation.z = 0.0f; + model.skeleton.bindPose[i].rotation.x = 0.0f; + model.skeleton.bindPose[i].rotation.y = 0.0f; + model.skeleton.bindPose[i].rotation.z = 0.0f; + model.skeleton.bindPose[i].rotation.w = 1.0f; + model.skeleton.bindPose[i].scale.x = model.skeleton.bindPose[i].scale.y = model.skeleton.bindPose[i].scale.z = 1.0f; } // Load bone-pose default mesh into animation vertices. These will be updated when UpdateModelAnimation gets @@ -7080,16 +7129,19 @@ static Model LoadM3D(const char *fileName) { for (i = 0; i < model.meshCount; i++) { + model.meshes[i].boneCount = model.skeleton.boneCount; + +#if !defined(SUPPORT_GPU_SKINNING) + // Initialize vertex buffers for CPU skinning memcpy(model.meshes[i].animVertices, model.meshes[i].vertices, model.meshes[i].vertexCount*3*sizeof(float)); memcpy(model.meshes[i].animNormals, model.meshes[i].normals, model.meshes[i].vertexCount*3*sizeof(float)); - - model.meshes[i].boneCount = model.boneCount; - model.meshes[i].boneMatrices = (Matrix *)RL_CALLOC(model.meshes[i].boneCount, sizeof(Matrix)); - for (j = 0; j < model.meshes[i].boneCount; j++) - { - model.meshes[i].boneMatrices[j] = MatrixIdentity(); - } +#endif } + + // Initialize runtime animation data: current pose and bone matrices + model.currentPose = (Transform *)RL_CALLOC(model.skeleton.boneCount, sizeof(Transform)); + model.boneMatrices = (Matrix *)RL_CALLOC(model.skeleton.boneCount, sizeof(Matrix)); + for (int j = 0; j < model.skeleton.boneCount; j++) model.boneMatrices[j] = MatrixIdentity(); } m3d_free(m3d); @@ -7123,8 +7175,7 @@ static ModelAnimation *LoadModelAnimationsM3D(const char *fileName, int *animCou UnloadFileData(fileData); return NULL; } - else TRACELOG(LOG_INFO, "MODEL: [%s] M3D data loaded successfully: %i animations, %i bones, %i skins", fileName, - m3d->numaction, m3d->numbone, m3d->numskin); + else TRACELOG(LOG_INFO, "MODEL: [%s] M3D data loaded successfully: %i animations, %i bones, %i skins", fileName, m3d->numaction, m3d->numbone, m3d->numskin); // No animation or bones, exit out. skins are not required because some people use one animation for N models if (!m3d->numaction || !m3d->numbone) @@ -7139,29 +7190,30 @@ static ModelAnimation *LoadModelAnimationsM3D(const char *fileName, int *animCou for (unsigned int a = 0; a < m3d->numaction; a++) { - animations[a].frameCount = m3d->action[a].durationmsec/M3D_ANIMDELAY; animations[a].boneCount = m3d->numbone + 1; - animations[a].bones = (BoneInfo *)RL_MALLOC((m3d->numbone + 1)*sizeof(BoneInfo)); - animations[a].framePoses = (Transform **)RL_MALLOC(animations[a].frameCount*sizeof(Transform *)); + BoneInfo *bones = (BoneInfo *)RL_CALLOC((m3d->numbone + 1), sizeof(BoneInfo)); + + animations[a].keyframeCount = m3d->action[a].durationmsec/M3D_ANIMDELAY; + animations[a].keyframePoses = (Transform **)RL_CALLOC(animations[a].keyframeCount, sizeof(Transform *)); strncpy(animations[a].name, m3d->action[a].name, sizeof(animations[a].name) - 1); - TRACELOG(LOG_INFO, "MODEL: [%s] animation #%i: %i msec, %i frames", fileName, a, m3d->action[a].durationmsec, animations[a].frameCount); + TRACELOG(LOG_INFO, "MODEL: [%s] Loaded animation: %s | Frames: %d | Duration: %fs", fileName, animations[a].name, animations[a].keyframeCount, m3d->action[a].durationmsec); for (i = 0; i < (int)m3d->numbone; i++) { - animations[a].bones[i].parent = m3d->bone[i].parent; - strncpy(animations[a].bones[i].name, m3d->bone[i].name, sizeof(animations[a].bones[i].name) - 1); + bones[i].parent = m3d->bone[i].parent; + strncpy(bones[i].name, m3d->bone[i].name, sizeof(bones[i].name) - 1); } // A special, never transformed "no bone" bone, used for boneless vertices - animations[a].bones[i].parent = -1; - memcpy(animations[a].bones[i].name, "NO BONE", 7); + bones[i].parent = -1; + memcpy(bones[i].name, "NO BONE", 7); // M3D stores frames at arbitrary intervals with sparse skeletons. We need full skeletons at // regular intervals, so let the M3D SDK do the heavy lifting and calculate interpolated bones - for (i = 0; i < animations[a].frameCount; i++) + for (i = 0; i < animations[a].keyframeCount; i++) { - animations[a].framePoses[i] = (Transform *)RL_MALLOC((m3d->numbone + 1)*sizeof(Transform)); + animations[a].keyframePoses[i] = (Transform *)RL_CALLOC((m3d->numbone + 1), sizeof(Transform)); m3db_t *pose = m3d_pose(m3d, a, i*M3D_ANIMDELAY); @@ -7169,38 +7221,43 @@ static ModelAnimation *LoadModelAnimationsM3D(const char *fileName, int *animCou { for (j = 0; j < (int)m3d->numbone; j++) { - animations[a].framePoses[i][j].translation.x = m3d->vertex[pose[j].pos].x*m3d->scale; - animations[a].framePoses[i][j].translation.y = m3d->vertex[pose[j].pos].y*m3d->scale; - animations[a].framePoses[i][j].translation.z = m3d->vertex[pose[j].pos].z*m3d->scale; - animations[a].framePoses[i][j].rotation.x = m3d->vertex[pose[j].ori].x; - animations[a].framePoses[i][j].rotation.y = m3d->vertex[pose[j].ori].y; - animations[a].framePoses[i][j].rotation.z = m3d->vertex[pose[j].ori].z; - animations[a].framePoses[i][j].rotation.w = m3d->vertex[pose[j].ori].w; - animations[a].framePoses[i][j].rotation = QuaternionNormalize(animations[a].framePoses[i][j].rotation); - animations[a].framePoses[i][j].scale.x = animations[a].framePoses[i][j].scale.y = animations[a].framePoses[i][j].scale.z = 1.0f; + animations[a].keyframePoses[i][j].translation.x = m3d->vertex[pose[j].pos].x*m3d->scale; + animations[a].keyframePoses[i][j].translation.y = m3d->vertex[pose[j].pos].y*m3d->scale; + animations[a].keyframePoses[i][j].translation.z = m3d->vertex[pose[j].pos].z*m3d->scale; + animations[a].keyframePoses[i][j].rotation.x = m3d->vertex[pose[j].ori].x; + animations[a].keyframePoses[i][j].rotation.y = m3d->vertex[pose[j].ori].y; + animations[a].keyframePoses[i][j].rotation.z = m3d->vertex[pose[j].ori].z; + animations[a].keyframePoses[i][j].rotation.w = m3d->vertex[pose[j].ori].w; + animations[a].keyframePoses[i][j].rotation = QuaternionNormalize(animations[a].keyframePoses[i][j].rotation); + animations[a].keyframePoses[i][j].scale.x = animations[a].keyframePoses[i][j].scale.y = animations[a].keyframePoses[i][j].scale.z = 1.0f; // Child bones are stored in parent bone relative space, convert that into model space - if (animations[a].bones[j].parent >= 0) + if (bones[j].parent >= 0) { - animations[a].framePoses[i][j].rotation = QuaternionMultiply(animations[a].framePoses[i][animations[a].bones[j].parent].rotation, animations[a].framePoses[i][j].rotation); - animations[a].framePoses[i][j].translation = Vector3RotateByQuaternion(animations[a].framePoses[i][j].translation, animations[a].framePoses[i][animations[a].bones[j].parent].rotation); - animations[a].framePoses[i][j].translation = Vector3Add(animations[a].framePoses[i][j].translation, animations[a].framePoses[i][animations[a].bones[j].parent].translation); - animations[a].framePoses[i][j].scale = Vector3Multiply(animations[a].framePoses[i][j].scale, animations[a].framePoses[i][animations[a].bones[j].parent].scale); + animations[a].keyframePoses[i][j].rotation = QuaternionMultiply(animations[a].keyframePoses[i][bones[j].parent].rotation, animations[a].keyframePoses[i][j].rotation); + animations[a].keyframePoses[i][j].translation = Vector3RotateByQuaternion(animations[a].keyframePoses[i][j].translation, animations[a].keyframePoses[i][bones[j].parent].rotation); + animations[a].keyframePoses[i][j].translation = Vector3Add(animations[a].keyframePoses[i][j].translation, animations[a].keyframePoses[i][bones[j].parent].translation); + animations[a].keyframePoses[i][j].scale = Vector3Multiply(animations[a].keyframePoses[i][j].scale, animations[a].keyframePoses[i][bones[j].parent].scale); } } // Default transform for the "no bone" bone - animations[a].framePoses[i][j].translation.x = 0.0f; - animations[a].framePoses[i][j].translation.y = 0.0f; - animations[a].framePoses[i][j].translation.z = 0.0f; - animations[a].framePoses[i][j].rotation.x = 0.0f; - animations[a].framePoses[i][j].rotation.y = 0.0f; - animations[a].framePoses[i][j].rotation.z = 0.0f; - animations[a].framePoses[i][j].rotation.w = 1.0f; - animations[a].framePoses[i][j].scale.x = animations[a].framePoses[i][j].scale.y = animations[a].framePoses[i][j].scale.z = 1.0f; + animations[a].keyframePoses[i][j].translation.x = 0.0f; + animations[a].keyframePoses[i][j].translation.y = 0.0f; + animations[a].keyframePoses[i][j].translation.z = 0.0f; + animations[a].keyframePoses[i][j].rotation.x = 0.0f; + animations[a].keyframePoses[i][j].rotation.y = 0.0f; + animations[a].keyframePoses[i][j].rotation.z = 0.0f; + animations[a].keyframePoses[i][j].rotation.w = 1.0f; + animations[a].keyframePoses[i][j].scale.x = 1.0f; + animations[a].keyframePoses[i][j].scale.y = 1.0f; + animations[a].keyframePoses[i][j].scale.z = 1.0f; + RL_FREE(pose); } } + + RL_FREE(bones); } m3d_free(m3d);