diff options
| author | Ray <[email protected]> | 2022-08-26 10:04:38 +0200 |
|---|---|---|
| committer | Ray <[email protected]> | 2022-08-26 10:04:38 +0200 |
| commit | f66b1a313650051cfaa9c38b1117944630b35d5a (patch) | |
| tree | ccc9e6e7de5752a69627a5edffa5e1af768063f6 /examples | |
| parent | ae745e4fa8f25e16a2e6964b417454e8a35a61b7 (diff) | |
| download | raylib-f66b1a313650051cfaa9c38b1117944630b35d5a.tar.gz raylib-f66b1a313650051cfaa9c38b1117944630b35d5a.zip | |
REVIEWED: Support M3D file loading #2648
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/Makefile | 1 | ||||
| -rw-r--r-- | examples/models/models_loading.c | 5 | ||||
| -rw-r--r-- | examples/models/models_loading_m3d.c | 127 |
3 files changed, 132 insertions, 1 deletions
diff --git a/examples/Makefile b/examples/Makefile index 6a39a1c5..b0bf4252 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -466,6 +466,7 @@ MODELS = \ models/models_loading \ models/models_loading_vox \ models/models_loading_gltf \ + models/models_loading_m3d \ models/models_orthographic_projection \ models/models_rlgl_solar_system \ models/models_skybox \ diff --git a/examples/models/models_loading.c b/examples/models/models_loading.c index bb3b490f..d4066141 100644 --- a/examples/models/models_loading.c +++ b/examples/models/models_loading.c @@ -12,6 +12,8 @@ * raylib can load .iqm animations. * - 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: +* https://bztsrc.gitlab.io/model3d * * Example originally created with raylib 2.0, last time updated with raylib 4.2 * @@ -80,7 +82,8 @@ int main(void) IsFileExtension(droppedFiles.paths[0], ".gltf") || IsFileExtension(droppedFiles.paths[0], ".glb") || IsFileExtension(droppedFiles.paths[0], ".vox") || - IsFileExtension(droppedFiles.paths[0], ".iqm")) // Model file formats supported + IsFileExtension(droppedFiles.paths[0], ".iqm") || + IsFileExtension(droppedFiles.paths[0], ".m3d")) // Model file formats supported { UnloadModel(model); // Unload previous model model = LoadModel(droppedFiles.paths[0]); // Load new model diff --git a/examples/models/models_loading_m3d.c b/examples/models/models_loading_m3d.c new file mode 100644 index 00000000..ca77d360 --- /dev/null +++ b/examples/models/models_loading_m3d.c @@ -0,0 +1,127 @@ +/******************************************************************************************* +* +* raylib [models] example - Load M3D model (with optional animations) and play them +* +* Example static mesh Suzanne from Blender +* Example animated seagull model from Scorched 3D, licensed GPLv2 +* +* Copyright (c) 2019-2022 Culacant (@culacant) and Ramon Santamaria (@raysan5) +* Copyright (c) 2022 bzt (@bztsrc) +* +******************************************************************************************** +* +* NOTE: To export a model from blender, just use https://gitlab.com/bztsrc/model3d/-/tree/master/blender +* and make sure to add "(action)" markers to the timeline if you want multiple animations. +* +********************************************************************************************/ + +#include "raylib.h" + +#include <stdlib.h> + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(int argc, char **argv) +{ + char *model_fn = argc > 1 ? argv[1] : "resources/models/m3d/suzanne.m3d"; + + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [models] example - M3D model"); + + // 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.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 + Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position + + // Load model + Model model = LoadModel(model_fn); // Load the animated model mesh and basic data + + // Load animation data + unsigned int animsCount = 0; + ModelAnimation *anims = LoadModelAnimations(model_fn, &animsCount); + int animFrameCounter = 0, animId = 0; + + SetCameraMode(camera, CAMERA_FREE); // Set free camera mode + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + UpdateCamera(&camera); + + // Play animation when spacebar is held down + if (animsCount) + { + if (IsKeyDown(KEY_SPACE)) + { + animFrameCounter++; + UpdateModelAnimation(model, anims[animId], animFrameCounter); + if (animFrameCounter >= anims[animId].frameCount) animFrameCounter = 0; + } + + // Select animation on mouse click + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) + { + animFrameCounter = 0; + animId++; + if (animId >= animsCount) animId = 0; + UpdateModelAnimation(model, anims[animId], 0); + } + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + BeginMode3D(camera); + + DrawModel(model, position, 1.0f, WHITE); // Draw 3d model with texture + if(anims) + for (int i = 0; i < model.boneCount; i++) + { + DrawCube(anims[animId].framePoses[animFrameCounter][i].translation, 0.2f, 0.2f, 0.2f, RED); + } + + DrawGrid(10, 1.0f); // Draw a grid + + EndMode3D(); + + DrawText("PRESS SPACE to PLAY MODEL ANIMATION", 10, GetScreenHeight() - 30, 10, MAROON); + DrawText("MOUSE LEFT BUTTON to CYCLE THROUGH ANIMATIONS", 10, GetScreenHeight() - 20, 10, DARKGRAY); + DrawText("(c) Suzanne 3D model by blender", screenWidth - 200, screenHeight - 20, 10, GRAY); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + + // Unload model animations data + for (unsigned int i = 0; i < animsCount; i++) UnloadModelAnimation(anims[i]); + RL_FREE(anims); + + UnloadModel(model); // Unload model + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} |
