Add example resources
|  | @ -0,0 +1,133 @@ | ||||||
|  | /******************************************************************************************* | ||||||
|  | * | ||||||
|  | *   raylib [audio] example - Module playing (streaming) | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.5, last time updated with raylib 3.5 | ||||||
|  | * | ||||||
|  | *   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) 2016-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | const MAX_CIRCLES = 64 | ||||||
|  | 
 | ||||||
|  | // Initialization
 | ||||||
|  | //--------------------------------------------------------------------------------------
 | ||||||
|  | const screenWidth = 800; | ||||||
|  | const screenHeight = 450; | ||||||
|  | 
 | ||||||
|  | setConfigFlags(FLAG_MSAA_4X_HINT);  // NOTE: Try to enable MSAA 4X
 | ||||||
|  | 
 | ||||||
|  | initWindow(screenWidth, screenHeight, "raylib [audio] example - module playing (streaming)"); | ||||||
|  | 
 | ||||||
|  | initAudioDevice();                  // Initialize audio device
 | ||||||
|  | 
 | ||||||
|  | const colors = [ORANGE, RED, GOLD, LIME, BLUE, VIOLET, BROWN, LIGHTGRAY, PINK, | ||||||
|  |                         YELLOW, GREEN, SKYBLUE, PURPLE, BEIGE]; | ||||||
|  | 
 | ||||||
|  | // Creates some circles for visual effect
 | ||||||
|  | const circles = new Array(MAX_CIRCLES).fill({}); | ||||||
|  | 
 | ||||||
|  | for (let i = MAX_CIRCLES - 1; i >= 0; i--) | ||||||
|  | { | ||||||
|  |     circles[i].alpha = 0.0; | ||||||
|  |     circles[i].radius = getRandomValue(10, 40); | ||||||
|  |     circles[i].position = new Vector2(0,0) | ||||||
|  |     circles[i].position.x = getRandomValue(circles[i].radius, (screenWidth - circles[i].radius)); | ||||||
|  |     circles[i].position.y = getRandomValue(circles[i].radius, (screenHeight - circles[i].radius)); | ||||||
|  |     circles[i].speed = getRandomValue(1, 100)/2000.0; | ||||||
|  |     circles[i].color = colors[getRandomValue(0, 13)]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const music = loadMusicStream("resources/mini1111.xm"); | ||||||
|  | music.looping = false; | ||||||
|  | const pitch = 1.0; | ||||||
|  | 
 | ||||||
|  | playMusicStream(music); | ||||||
|  | 
 | ||||||
|  | let timePlayed = 0.0; | ||||||
|  | let pause = false; | ||||||
|  | 
 | ||||||
|  | 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
 | ||||||
|  |     //----------------------------------------------------------------------------------
 | ||||||
|  |     updateMusicStream(music);      // Update music buffer with new stream data
 | ||||||
|  | 
 | ||||||
|  |     // Restart music playing (stop and play)
 | ||||||
|  |     if (isKeyPressed(KEY_SPACE)) | ||||||
|  |     { | ||||||
|  |         stopMusicStream(music); | ||||||
|  |         playMusicStream(music); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Pause/Resume music playing
 | ||||||
|  |     if (isKeyPressed(KEY_P)) | ||||||
|  |     { | ||||||
|  |         pause = !pause; | ||||||
|  | 
 | ||||||
|  |         if (pause) pauseMusicStream(music); | ||||||
|  |         else resumeMusicStream(music); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (isKeyDown(KEY_DOWN)) pitch -= 0.01; | ||||||
|  |     else if (isKeyDown(KEY_UP)) pitch += 0.01; | ||||||
|  | 
 | ||||||
|  |     setMusicPitch(music, pitch); | ||||||
|  | 
 | ||||||
|  |     // Get timePlayed scaled to bar dimensions
 | ||||||
|  |     timePlayed = getMusicTimePlayed(music) / getMusicTimeLength(music) * (screenWidth - 40); | ||||||
|  | 
 | ||||||
|  |     // Color circles animation
 | ||||||
|  |     for (let i = MAX_CIRCLES - 1; (i >= 0) && !pause; i--) | ||||||
|  |     { | ||||||
|  |         circles[i].alpha += circles[i].speed; | ||||||
|  |         circles[i].radius += circles[i].speed*10.0; | ||||||
|  | 
 | ||||||
|  |         if (circles[i].alpha > 1.0) circles[i].speed *= -1; | ||||||
|  | 
 | ||||||
|  |         if (circles[i].alpha <= 0.0) | ||||||
|  |         { | ||||||
|  |             circles[i].alpha = 0.0; | ||||||
|  |             circles[i].radius = getRandomValue(10, 40); | ||||||
|  |             circles[i].position.x = getRandomValue(circles[i].radius, (screenWidth - circles[i].radius)); | ||||||
|  |             circles[i].position.y = getRandomValue(circles[i].radius, (screenHeight - circles[i].radius)); | ||||||
|  |             circles[i].color = colors[getRandomValue(0, 13)]; | ||||||
|  |             circles[i].speed = getRandomValue(1, 100) / 2000.0; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     // Draw
 | ||||||
|  |     //----------------------------------------------------------------------------------
 | ||||||
|  |     beginDrawing(); | ||||||
|  | 
 | ||||||
|  |         clearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |         for (let i = MAX_CIRCLES - 1; i >= 0; i--) | ||||||
|  |         { | ||||||
|  |             drawCircleV(circles[i].position, circles[i].radius, fade(circles[i].color, circles[i].alpha)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Draw time bar
 | ||||||
|  |         drawRectangle(20, screenHeight - 20 - 12, screenWidth - 40, 12, LIGHTGRAY); | ||||||
|  |         drawRectangle(20, screenHeight - 20 - 12, timePlayed, 12, MAROON); | ||||||
|  |         drawRectangleLines(20, screenHeight - 20 - 12, screenWidth - 40, 12, GRAY); | ||||||
|  | 
 | ||||||
|  |     endDrawing(); | ||||||
|  |     //----------------------------------------------------------------------------------
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // De-Initialization
 | ||||||
|  | //--------------------------------------------------------------------------------------
 | ||||||
|  | unloadMusicStream(music);          // Unload music stream buffers from RAM
 | ||||||
|  | 
 | ||||||
|  | closeAudioDevice();     // Close audio device (music streaming is automatically stopped)
 | ||||||
|  | 
 | ||||||
|  | closeWindow();          // Close window and OpenGL context
 | ||||||
|  | //--------------------------------------------------------------------------------------
 | ||||||
|  | @ -0,0 +1,87 @@ | ||||||
|  | /******************************************************************************************* | ||||||
|  | * | ||||||
|  | *   raylib [audio] example - Music playing (streaming) | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.3, last time updated with raylib 4.0 | ||||||
|  | * | ||||||
|  | *   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) 2015-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | // Initialization
 | ||||||
|  | //--------------------------------------------------------------------------------------
 | ||||||
|  | const screenWidth = 800; | ||||||
|  | const screenHeight = 450; | ||||||
|  | 
 | ||||||
|  | initWindow(screenWidth, screenHeight, "raylib [audio] example - music playing (streaming)"); | ||||||
|  | 
 | ||||||
|  | initAudioDevice();              // Initialize audio device
 | ||||||
|  | 
 | ||||||
|  | const music = loadMusicStream("resources/country.mp3"); | ||||||
|  | 
 | ||||||
|  | playMusicStream(music); | ||||||
|  | 
 | ||||||
|  | let timePlayed = 0.0;        // Time played normalized [0.0f..1.0f]
 | ||||||
|  | let pause = false;             // Music playing paused
 | ||||||
|  | 
 | ||||||
|  | setTargetFPS(30);               // Set our game to run at 30 frames-per-second
 | ||||||
|  | //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | // Main game loop
 | ||||||
|  | while (!windowShouldClose())    // Detect window close button or ESC key
 | ||||||
|  | { | ||||||
|  |     // Update
 | ||||||
|  |     //----------------------------------------------------------------------------------
 | ||||||
|  |     updateMusicStream(music);   // Update music buffer with new stream data
 | ||||||
|  |      | ||||||
|  |     // Restart music playing (stop and play)
 | ||||||
|  |     if (isKeyPressed(KEY_SPACE)) | ||||||
|  |     { | ||||||
|  |         stopMusicStream(music); | ||||||
|  |         playMusicStream(music); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Pause/Resume music playing
 | ||||||
|  |     if (isKeyPressed(KEY_P)) | ||||||
|  |     { | ||||||
|  |         pause = !pause; | ||||||
|  | 
 | ||||||
|  |         if (pause) pauseMusicStream(music); | ||||||
|  |         else resumeMusicStream(music); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Get normalized time played for current music stream
 | ||||||
|  |     timePlayed = getMusicTimePlayed(music)/getMusicTimeLength(music); | ||||||
|  | 
 | ||||||
|  |     if (timePlayed > 1.0) timePlayed = 1.0;   // Make sure time played is no longer than music
 | ||||||
|  |     //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     // Draw
 | ||||||
|  |     //----------------------------------------------------------------------------------
 | ||||||
|  |     beginDrawing(); | ||||||
|  | 
 | ||||||
|  |         clearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |         drawText("MUSIC SHOULD BE PLAYING!", 255, 150, 20, LIGHTGRAY); | ||||||
|  | 
 | ||||||
|  |         drawRectangle(200, 200, 400, 12, LIGHTGRAY); | ||||||
|  |         drawRectangle(200, 200, (timePlayed*400.0), 12, MAROON); | ||||||
|  |         drawRectangleLines(200, 200, 400, 12, GRAY); | ||||||
|  | 
 | ||||||
|  |         drawText("PRESS SPACE TO RESTART MUSIC", 215, 250, 20, LIGHTGRAY); | ||||||
|  |         drawText("PRESS P TO PAUSE/RESUME MUSIC", 208, 280, 20, LIGHTGRAY); | ||||||
|  | 
 | ||||||
|  |     endDrawing(); | ||||||
|  |     //----------------------------------------------------------------------------------
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // De-Initialization
 | ||||||
|  | //--------------------------------------------------------------------------------------
 | ||||||
|  | unloadMusicStream(music);   // Unload music stream buffers from RAM
 | ||||||
|  | 
 | ||||||
|  | closeAudioDevice();         // Close audio device (music streaming is automatically stopped)
 | ||||||
|  | 
 | ||||||
|  | closeWindow();              // Close window and OpenGL context
 | ||||||
|  | //--------------------------------------------------------------------------------------
 | ||||||
|  | @ -0,0 +1,58 @@ | ||||||
|  | /******************************************************************************************* | ||||||
|  | * | ||||||
|  | *   raylib [audio] example - Sound loading and playing | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.1, last time updated with raylib 3.5 | ||||||
|  | * | ||||||
|  | *   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) 2014-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | // Initialization
 | ||||||
|  | //--------------------------------------------------------------------------------------
 | ||||||
|  | let screenWidth = 800; | ||||||
|  | let screenHeight = 450; | ||||||
|  | 
 | ||||||
|  | initWindow(screenWidth, screenHeight, "raylib [audio] example - sound loading and playing"); | ||||||
|  | 
 | ||||||
|  | initAudioDevice();      // Initialize audio device
 | ||||||
|  | 
 | ||||||
|  | const fxWav = loadSound("resources/sound.wav");         // Load WAV audio file
 | ||||||
|  | const fxOgg = loadSound("resources/target.ogg");        // Load OGG audio file
 | ||||||
|  | 
 | ||||||
|  | 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
 | ||||||
|  |     //----------------------------------------------------------------------------------
 | ||||||
|  |     if (isKeyPressed(KEY_SPACE)) playSound(fxWav);      // Play WAV sound
 | ||||||
|  |     if (isKeyPressed(KEY_ENTER)) playSound(fxOgg);      // Play OGG sound
 | ||||||
|  |     //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     // Draw
 | ||||||
|  |     //----------------------------------------------------------------------------------
 | ||||||
|  |     beginDrawing(); | ||||||
|  | 
 | ||||||
|  |         clearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |         drawText("Press SPACE to PLAY the WAV sound!", 200, 180, 20, LIGHTGRAY); | ||||||
|  |         drawText("Press ENTER to PLAY the OGG sound!", 200, 220, 20, LIGHTGRAY); | ||||||
|  | 
 | ||||||
|  |     endDrawing(); | ||||||
|  |     //----------------------------------------------------------------------------------
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // De-Initialization
 | ||||||
|  | //--------------------------------------------------------------------------------------
 | ||||||
|  | unloadSound(fxWav);     // Unload sound data
 | ||||||
|  | unloadSound(fxOgg);     // Unload sound data
 | ||||||
|  | 
 | ||||||
|  | closeAudioDevice();     // Close audio device
 | ||||||
|  | 
 | ||||||
|  | closeWindow();          // Close window and OpenGL context
 | ||||||
|  | //--------------------------------------------------------------------------------------
 | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | | resource             | author      | licence | notes | | ||||||
|  | | :------------------- | :---------: | :------ | :---- | | ||||||
|  | | country.mp3          | [@emegeme](https://github.com/emegeme) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Originally created for "DART that TARGET" game | | ||||||
|  | | target.ogg           | [@emegeme](https://github.com/emegeme) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Originally created for "DART that TARGET" game | | ||||||
|  | | target.flac          | [@emegeme](https://github.com/emegeme) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Originally created for "DART that TARGET" game | | ||||||
|  | | coin.wav             | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Made with [rFXGen](https://raylibtech.itch.io/rfxgen) | | ||||||
|  | | sound.wav            | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Made with [rFXGen](https://raylibtech.itch.io/rfxgen) | | ||||||
|  | | spring.wav           | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Made with [rFXGen](https://raylibtech.itch.io/rfxgen) | | ||||||
|  | | weird.wav            | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Made with [rFXGen](https://raylibtech.itch.io/rfxgen) | | ||||||
|  | | mini1111.xm          | [tPORt](https://modarchive.org/index.php?request=view_by_moduleid&query=51891) | [Mod Archive Distribution license](https://modarchive.org/index.php?terms-upload) | - | | ||||||
|  | @ -0,0 +1,298 @@ | ||||||
|  | /******************************************************************************************* | ||||||
|  | * | ||||||
|  | *   raylib [core] example - 2d camera platformer | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 2.5, last time updated with raylib 3.0 | ||||||
|  | * | ||||||
|  | *   Example contributed by arvyy (@arvyy) and reviewed by Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | *   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-2023 arvyy (@arvyy) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | #include "raymath.h" | ||||||
|  | 
 | ||||||
|  | #define G 400 | ||||||
|  | #define PLAYER_JUMP_SPD 350.0f | ||||||
|  | #define PLAYER_HOR_SPD 200.0f | ||||||
|  | 
 | ||||||
|  | typedef struct Player { | ||||||
|  |     Vector2 position; | ||||||
|  |     float speed; | ||||||
|  |     bool canJump; | ||||||
|  | } Player; | ||||||
|  | 
 | ||||||
|  | typedef struct EnvItem { | ||||||
|  |     Rectangle rect; | ||||||
|  |     int blocking; | ||||||
|  |     Color color; | ||||||
|  | } EnvItem; | ||||||
|  | 
 | ||||||
|  | //----------------------------------------------------------------------------------
 | ||||||
|  | // Module functions declaration
 | ||||||
|  | //----------------------------------------------------------------------------------
 | ||||||
|  | void UpdatePlayer(Player *player, EnvItem *envItems, int envItemsLength, float delta); | ||||||
|  | void UpdateCameraCenter(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height); | ||||||
|  | void UpdateCameraCenterInsideMap(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height); | ||||||
|  | void UpdateCameraCenterSmoothFollow(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height); | ||||||
|  | void UpdateCameraEvenOutOnLanding(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height); | ||||||
|  | void UpdateCameraPlayerBoundsPush(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height); | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera"); | ||||||
|  | 
 | ||||||
|  |     Player player = { 0 }; | ||||||
|  |     player.position = (Vector2){ 400, 280 }; | ||||||
|  |     player.speed = 0; | ||||||
|  |     player.canJump = false; | ||||||
|  |     EnvItem envItems[] = { | ||||||
|  |         {{ 0, 0, 1000, 400 }, 0, LIGHTGRAY }, | ||||||
|  |         {{ 0, 400, 1000, 200 }, 1, GRAY }, | ||||||
|  |         {{ 300, 200, 400, 10 }, 1, GRAY }, | ||||||
|  |         {{ 250, 300, 100, 10 }, 1, GRAY }, | ||||||
|  |         {{ 650, 300, 100, 10 }, 1, GRAY } | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     int envItemsLength = sizeof(envItems)/sizeof(envItems[0]); | ||||||
|  | 
 | ||||||
|  |     Camera2D camera = { 0 }; | ||||||
|  |     camera.target = player.position; | ||||||
|  |     camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f }; | ||||||
|  |     camera.rotation = 0.0f; | ||||||
|  |     camera.zoom = 1.0f; | ||||||
|  | 
 | ||||||
|  |     // Store pointers to the multiple update camera functions
 | ||||||
|  |     void (*cameraUpdaters[])(Camera2D*, Player*, EnvItem*, int, float, int, int) = { | ||||||
|  |         UpdateCameraCenter, | ||||||
|  |         UpdateCameraCenterInsideMap, | ||||||
|  |         UpdateCameraCenterSmoothFollow, | ||||||
|  |         UpdateCameraEvenOutOnLanding, | ||||||
|  |         UpdateCameraPlayerBoundsPush | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     int cameraOption = 0; | ||||||
|  |     int cameraUpdatersLength = sizeof(cameraUpdaters)/sizeof(cameraUpdaters[0]); | ||||||
|  | 
 | ||||||
|  |     char *cameraDescriptions[] = { | ||||||
|  |         "Follow player center", | ||||||
|  |         "Follow player center, but clamp to map edges", | ||||||
|  |         "Follow player center; smoothed", | ||||||
|  |         "Follow player center horizontally; updateplayer center vertically after landing", | ||||||
|  |         "Player push camera on getting too close to screen edge" | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     SetTargetFPS(60); | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     // Main game loop
 | ||||||
|  |     while (!WindowShouldClose()) | ||||||
|  |     { | ||||||
|  |         // Update
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         float deltaTime = GetFrameTime(); | ||||||
|  | 
 | ||||||
|  |         UpdatePlayer(&player, envItems, envItemsLength, deltaTime); | ||||||
|  | 
 | ||||||
|  |         camera.zoom += ((float)GetMouseWheelMove()*0.05f); | ||||||
|  | 
 | ||||||
|  |         if (camera.zoom > 3.0f) camera.zoom = 3.0f; | ||||||
|  |         else if (camera.zoom < 0.25f) camera.zoom = 0.25f; | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_R)) | ||||||
|  |         { | ||||||
|  |             camera.zoom = 1.0f; | ||||||
|  |             player.position = (Vector2){ 400, 280 }; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_C)) cameraOption = (cameraOption + 1)%cameraUpdatersLength; | ||||||
|  | 
 | ||||||
|  |         // Call update camera function by its pointer
 | ||||||
|  |         cameraUpdaters[cameraOption](&camera, &player, envItems, envItemsLength, deltaTime, screenWidth, screenHeight); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(LIGHTGRAY); | ||||||
|  | 
 | ||||||
|  |             BeginMode2D(camera); | ||||||
|  | 
 | ||||||
|  |                 for (int i = 0; i < envItemsLength; i++) DrawRectangleRec(envItems[i].rect, envItems[i].color); | ||||||
|  | 
 | ||||||
|  |                 Rectangle playerRect = { player.position.x - 20, player.position.y - 40, 40, 40 }; | ||||||
|  |                 DrawRectangleRec(playerRect, RED); | ||||||
|  | 
 | ||||||
|  |             EndMode2D(); | ||||||
|  | 
 | ||||||
|  |             DrawText("Controls:", 20, 20, 10, BLACK); | ||||||
|  |             DrawText("- Right/Left to move", 40, 40, 10, DARKGRAY); | ||||||
|  |             DrawText("- Space to jump", 40, 60, 10, DARKGRAY); | ||||||
|  |             DrawText("- Mouse Wheel to Zoom in-out, R to reset zoom", 40, 80, 10, DARKGRAY); | ||||||
|  |             DrawText("- C to change camera mode", 40, 100, 10, DARKGRAY); | ||||||
|  |             DrawText("Current camera mode:", 20, 120, 10, BLACK); | ||||||
|  |             DrawText(cameraDescriptions[cameraOption], 40, 140, 10, DARKGRAY); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void UpdatePlayer(Player *player, EnvItem *envItems, int envItemsLength, float delta) | ||||||
|  | { | ||||||
|  |     if (IsKeyDown(KEY_LEFT)) player->position.x -= PLAYER_HOR_SPD*delta; | ||||||
|  |     if (IsKeyDown(KEY_RIGHT)) player->position.x += PLAYER_HOR_SPD*delta; | ||||||
|  |     if (IsKeyDown(KEY_SPACE) && player->canJump) | ||||||
|  |     { | ||||||
|  |         player->speed = -PLAYER_JUMP_SPD; | ||||||
|  |         player->canJump = false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     int hitObstacle = 0; | ||||||
|  |     for (int i = 0; i < envItemsLength; i++) | ||||||
|  |     { | ||||||
|  |         EnvItem *ei = envItems + i; | ||||||
|  |         Vector2 *p = &(player->position); | ||||||
|  |         if (ei->blocking && | ||||||
|  |             ei->rect.x <= p->x && | ||||||
|  |             ei->rect.x + ei->rect.width >= p->x && | ||||||
|  |             ei->rect.y >= p->y && | ||||||
|  |             ei->rect.y <= p->y + player->speed*delta) | ||||||
|  |         { | ||||||
|  |             hitObstacle = 1; | ||||||
|  |             player->speed = 0.0f; | ||||||
|  |             p->y = ei->rect.y; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (!hitObstacle) | ||||||
|  |     { | ||||||
|  |         player->position.y += player->speed*delta; | ||||||
|  |         player->speed += G*delta; | ||||||
|  |         player->canJump = false; | ||||||
|  |     } | ||||||
|  |     else player->canJump = true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void UpdateCameraCenter(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height) | ||||||
|  | { | ||||||
|  |     camera->offset = (Vector2){ width/2.0f, height/2.0f }; | ||||||
|  |     camera->target = player->position; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void UpdateCameraCenterInsideMap(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height) | ||||||
|  | { | ||||||
|  |     camera->target = player->position; | ||||||
|  |     camera->offset = (Vector2){ width/2.0f, height/2.0f }; | ||||||
|  |     float minX = 1000, minY = 1000, maxX = -1000, maxY = -1000; | ||||||
|  | 
 | ||||||
|  |     for (int i = 0; i < envItemsLength; i++) | ||||||
|  |     { | ||||||
|  |         EnvItem *ei = envItems + i; | ||||||
|  |         minX = fminf(ei->rect.x, minX); | ||||||
|  |         maxX = fmaxf(ei->rect.x + ei->rect.width, maxX); | ||||||
|  |         minY = fminf(ei->rect.y, minY); | ||||||
|  |         maxY = fmaxf(ei->rect.y + ei->rect.height, maxY); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     Vector2 max = GetWorldToScreen2D((Vector2){ maxX, maxY }, *camera); | ||||||
|  |     Vector2 min = GetWorldToScreen2D((Vector2){ minX, minY }, *camera); | ||||||
|  | 
 | ||||||
|  |     if (max.x < width) camera->offset.x = width - (max.x - width/2); | ||||||
|  |     if (max.y < height) camera->offset.y = height - (max.y - height/2); | ||||||
|  |     if (min.x > 0) camera->offset.x = width/2 - min.x; | ||||||
|  |     if (min.y > 0) camera->offset.y = height/2 - min.y; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void UpdateCameraCenterSmoothFollow(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height) | ||||||
|  | { | ||||||
|  |     static float minSpeed = 30; | ||||||
|  |     static float minEffectLength = 10; | ||||||
|  |     static float fractionSpeed = 0.8f; | ||||||
|  | 
 | ||||||
|  |     camera->offset = (Vector2){ width/2.0f, height/2.0f }; | ||||||
|  |     Vector2 diff = Vector2Subtract(player->position, camera->target); | ||||||
|  |     float length = Vector2Length(diff); | ||||||
|  | 
 | ||||||
|  |     if (length > minEffectLength) | ||||||
|  |     { | ||||||
|  |         float speed = fmaxf(fractionSpeed*length, minSpeed); | ||||||
|  |         camera->target = Vector2Add(camera->target, Vector2Scale(diff, speed*delta/length)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void UpdateCameraEvenOutOnLanding(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height) | ||||||
|  | { | ||||||
|  |     static float evenOutSpeed = 700; | ||||||
|  |     static int eveningOut = false; | ||||||
|  |     static float evenOutTarget; | ||||||
|  | 
 | ||||||
|  |     camera->offset = (Vector2){ width/2.0f, height/2.0f }; | ||||||
|  |     camera->target.x = player->position.x; | ||||||
|  | 
 | ||||||
|  |     if (eveningOut) | ||||||
|  |     { | ||||||
|  |         if (evenOutTarget > camera->target.y) | ||||||
|  |         { | ||||||
|  |             camera->target.y += evenOutSpeed*delta; | ||||||
|  | 
 | ||||||
|  |             if (camera->target.y > evenOutTarget) | ||||||
|  |             { | ||||||
|  |                 camera->target.y = evenOutTarget; | ||||||
|  |                 eveningOut = 0; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             camera->target.y -= evenOutSpeed*delta; | ||||||
|  | 
 | ||||||
|  |             if (camera->target.y < evenOutTarget) | ||||||
|  |             { | ||||||
|  |                 camera->target.y = evenOutTarget; | ||||||
|  |                 eveningOut = 0; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         if (player->canJump && (player->speed == 0) && (player->position.y != camera->target.y)) | ||||||
|  |         { | ||||||
|  |             eveningOut = 1; | ||||||
|  |             evenOutTarget = player->position.y; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void UpdateCameraPlayerBoundsPush(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height) | ||||||
|  | { | ||||||
|  |     static Vector2 bbox = { 0.2f, 0.2f }; | ||||||
|  | 
 | ||||||
|  |     Vector2 bboxWorldMin = GetScreenToWorld2D((Vector2){ (1 - bbox.x)*0.5f*width, (1 - bbox.y)*0.5f*height }, *camera); | ||||||
|  |     Vector2 bboxWorldMax = GetScreenToWorld2D((Vector2){ (1 + bbox.x)*0.5f*width, (1 + bbox.y)*0.5f*height }, *camera); | ||||||
|  |     camera->offset = (Vector2){ (1 - bbox.x)*0.5f * width, (1 - bbox.y)*0.5f*height }; | ||||||
|  | 
 | ||||||
|  |     if (player->position.x < bboxWorldMin.x) camera->target.x = player->position.x; | ||||||
|  |     if (player->position.y < bboxWorldMin.y) camera->target.y = player->position.y; | ||||||
|  |     if (player->position.x > bboxWorldMax.x) camera->target.x = bboxWorldMin.x + (player->position.x - bboxWorldMax.x); | ||||||
|  |     if (player->position.y > bboxWorldMax.y) camera->target.y = bboxWorldMin.y + (player->position.y - bboxWorldMax.y); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,206 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [core] example - 3d camera first person | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.3, last time updated with raylib 1.3 | ||||||
|  | * | ||||||
|  | *   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) 2015-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | #include "rcamera.h" | ||||||
|  | 
 | ||||||
|  | #define MAX_COLUMNS 20 | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera first person"); | ||||||
|  | 
 | ||||||
|  |     // Define the camera to look into our 3d world (position, target, up vector)
 | ||||||
|  |     Camera camera = { 0 }; | ||||||
|  |     camera.position = (Vector3){ 0.0f, 2.0f, 4.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 = 60.0f;                                // Camera field-of-view Y
 | ||||||
|  |     camera.projection = CAMERA_PERSPECTIVE;             // Camera projection type
 | ||||||
|  | 
 | ||||||
|  |     int cameraMode = CAMERA_FIRST_PERSON; | ||||||
|  | 
 | ||||||
|  |     // Generates some random columns
 | ||||||
|  |     float heights[MAX_COLUMNS] = { 0 }; | ||||||
|  |     Vector3 positions[MAX_COLUMNS] = { 0 }; | ||||||
|  |     Color colors[MAX_COLUMNS] = { 0 }; | ||||||
|  | 
 | ||||||
|  |     for (int i = 0; i < MAX_COLUMNS; i++) | ||||||
|  |     { | ||||||
|  |         heights[i] = (float)GetRandomValue(1, 12); | ||||||
|  |         positions[i] = (Vector3){ (float)GetRandomValue(-15, 15), heights[i]/2.0f, (float)GetRandomValue(-15, 15) }; | ||||||
|  |         colors[i] = (Color){ GetRandomValue(20, 255), GetRandomValue(10, 55), 30, 255 }; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     DisableCursor();                    // Limit cursor to relative movement inside the window
 | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         // Switch camera mode
 | ||||||
|  |         if (IsKeyPressed(KEY_ONE)) | ||||||
|  |         { | ||||||
|  |             cameraMode = CAMERA_FREE; | ||||||
|  |             camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_TWO)) | ||||||
|  |         { | ||||||
|  |             cameraMode = CAMERA_FIRST_PERSON; | ||||||
|  |             camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_THREE)) | ||||||
|  |         { | ||||||
|  |             cameraMode = CAMERA_THIRD_PERSON; | ||||||
|  |             camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_FOUR)) | ||||||
|  |         { | ||||||
|  |             cameraMode = CAMERA_ORBITAL; | ||||||
|  |             camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Switch camera projection
 | ||||||
|  |         if (IsKeyPressed(KEY_P)) | ||||||
|  |         { | ||||||
|  |             if (camera.projection == CAMERA_PERSPECTIVE) | ||||||
|  |             { | ||||||
|  |                 // Create isometric view
 | ||||||
|  |                 cameraMode = CAMERA_THIRD_PERSON; | ||||||
|  |                 // Note: The target distance is related to the render distance in the orthographic projection
 | ||||||
|  |                 camera.position = (Vector3){ 0.0f, 2.0f, -100.0f }; | ||||||
|  |                 camera.target = (Vector3){ 0.0f, 2.0f, 0.0f }; | ||||||
|  |                 camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; | ||||||
|  |                 camera.projection = CAMERA_ORTHOGRAPHIC; | ||||||
|  |                 camera.fovy = 20.0f; // near plane width in CAMERA_ORTHOGRAPHIC
 | ||||||
|  |                 CameraYaw(&camera, -135 * DEG2RAD, true); | ||||||
|  |                 CameraPitch(&camera, -45 * DEG2RAD, true, true, false); | ||||||
|  |             } | ||||||
|  |             else if (camera.projection == CAMERA_ORTHOGRAPHIC) | ||||||
|  |             { | ||||||
|  |                 // Reset to default view
 | ||||||
|  |                 cameraMode = CAMERA_THIRD_PERSON; | ||||||
|  |                 camera.position = (Vector3){ 0.0f, 2.0f, 10.0f }; | ||||||
|  |                 camera.target = (Vector3){ 0.0f, 2.0f, 0.0f }; | ||||||
|  |                 camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; | ||||||
|  |                 camera.projection = CAMERA_PERSPECTIVE; | ||||||
|  |                 camera.fovy = 60.0f; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Update camera computes movement internally depending on the camera mode
 | ||||||
|  |         // Some default standard keyboard/mouse inputs are hardcoded to simplify use
 | ||||||
|  |         // For advance camera controls, it's reecommended to compute camera movement manually
 | ||||||
|  |         UpdateCamera(&camera, cameraMode);                  // Update camera
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |         // Camera PRO usage example (EXPERIMENTAL)
 | ||||||
|  |         // This new camera function allows custom movement/rotation values to be directly provided
 | ||||||
|  |         // as input parameters, with this approach, rcamera module is internally independent of raylib inputs
 | ||||||
|  |         UpdateCameraPro(&camera, | ||||||
|  |             (Vector3){ | ||||||
|  |                 (IsKeyDown(KEY_W) || IsKeyDown(KEY_UP))*0.1f -      // Move forward-backward
 | ||||||
|  |                 (IsKeyDown(KEY_S) || IsKeyDown(KEY_DOWN))*0.1f,     | ||||||
|  |                 (IsKeyDown(KEY_D) || IsKeyDown(KEY_RIGHT))*0.1f -   // Move right-left
 | ||||||
|  |                 (IsKeyDown(KEY_A) || IsKeyDown(KEY_LEFT))*0.1f, | ||||||
|  |                 0.0f                                                // Move up-down
 | ||||||
|  |             }, | ||||||
|  |             (Vector3){ | ||||||
|  |                 GetMouseDelta().x*0.05f,                            // Rotation: yaw
 | ||||||
|  |                 GetMouseDelta().y*0.05f,                            // Rotation: pitch
 | ||||||
|  |                 0.0f                                                // Rotation: roll
 | ||||||
|  |             }, | ||||||
|  |             GetMouseWheelMove()*2.0f);                              // Move to target (zoom)
 | ||||||
|  | */ | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 DrawPlane((Vector3){ 0.0f, 0.0f, 0.0f }, (Vector2){ 32.0f, 32.0f }, LIGHTGRAY); // Draw ground
 | ||||||
|  |                 DrawCube((Vector3){ -16.0f, 2.5f, 0.0f }, 1.0f, 5.0f, 32.0f, BLUE);     // Draw a blue wall
 | ||||||
|  |                 DrawCube((Vector3){ 16.0f, 2.5f, 0.0f }, 1.0f, 5.0f, 32.0f, LIME);      // Draw a green wall
 | ||||||
|  |                 DrawCube((Vector3){ 0.0f, 2.5f, 16.0f }, 32.0f, 5.0f, 1.0f, GOLD);      // Draw a yellow wall
 | ||||||
|  | 
 | ||||||
|  |                 // Draw some cubes around
 | ||||||
|  |                 for (int i = 0; i < MAX_COLUMNS; i++) | ||||||
|  |                 { | ||||||
|  |                     DrawCube(positions[i], 2.0f, heights[i], 2.0f, colors[i]); | ||||||
|  |                     DrawCubeWires(positions[i], 2.0f, heights[i], 2.0f, MAROON); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 // Draw player cube
 | ||||||
|  |                 if (cameraMode == CAMERA_THIRD_PERSON) | ||||||
|  |                 { | ||||||
|  |                     DrawCube(camera.target, 0.5f, 0.5f, 0.5f, PURPLE); | ||||||
|  |                     DrawCubeWires(camera.target, 0.5f, 0.5f, 0.5f, DARKPURPLE); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             // Draw info boxes
 | ||||||
|  |             DrawRectangle(5, 5, 330, 100, Fade(SKYBLUE, 0.5f)); | ||||||
|  |             DrawRectangleLines(5, 5, 330, 100, BLUE); | ||||||
|  | 
 | ||||||
|  |             DrawText("Camera controls:", 15, 15, 10, BLACK); | ||||||
|  |             DrawText("- Move keys: W, A, S, D, Space, Left-Ctrl", 15, 30, 10, BLACK); | ||||||
|  |             DrawText("- Look around: arrow keys or mouse", 15, 45, 10, BLACK); | ||||||
|  |             DrawText("- Camera mode keys: 1, 2, 3, 4", 15, 60, 10, BLACK); | ||||||
|  |             DrawText("- Zoom keys: num-plus, num-minus or mouse scroll", 15, 75, 10, BLACK); | ||||||
|  |             DrawText("- Camera projection key: P", 15, 90, 10, BLACK); | ||||||
|  | 
 | ||||||
|  |             DrawRectangle(600, 5, 195, 100, Fade(SKYBLUE, 0.5f)); | ||||||
|  |             DrawRectangleLines(600, 5, 195, 100, BLUE); | ||||||
|  | 
 | ||||||
|  |             DrawText("Camera status:", 610, 15, 10, BLACK); | ||||||
|  |             DrawText(TextFormat("- Mode: %s", (cameraMode == CAMERA_FREE) ? "FREE" : | ||||||
|  |                                               (cameraMode == CAMERA_FIRST_PERSON) ? "FIRST_PERSON" : | ||||||
|  |                                               (cameraMode == CAMERA_THIRD_PERSON) ? "THIRD_PERSON" : | ||||||
|  |                                               (cameraMode == CAMERA_ORBITAL) ? "ORBITAL" : "CUSTOM"), 610, 30, 10, BLACK); | ||||||
|  |             DrawText(TextFormat("- Projection: %s", (camera.projection == CAMERA_PERSPECTIVE) ? "PERSPECTIVE" : | ||||||
|  |                                                     (camera.projection == CAMERA_ORTHOGRAPHIC) ? "ORTHOGRAPHIC" : "CUSTOM"), 610, 45, 10, BLACK); | ||||||
|  |             DrawText(TextFormat("- Position: (%06.3f, %06.3f, %06.3f)", camera.position.x, camera.position.y, camera.position.z), 610, 60, 10, BLACK); | ||||||
|  |             DrawText(TextFormat("- Target: (%06.3f, %06.3f, %06.3f)", camera.target.x, camera.target.y, camera.target.z), 610, 75, 10, BLACK); | ||||||
|  |             DrawText(TextFormat("- Up: (%06.3f, %06.3f, %06.3f)", camera.up.x, camera.up.y, camera.up.z), 610, 90, 10, BLACK); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,88 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [core] example - Initialize 3d camera free | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.3, last time updated with raylib 1.3 | ||||||
|  | * | ||||||
|  | *   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) 2015-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera free"); | ||||||
|  | 
 | ||||||
|  |     // Define the camera to look into our 3d world
 | ||||||
|  |     Camera3D 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 projection type
 | ||||||
|  | 
 | ||||||
|  |     Vector3 cubePosition = { 0.0f, 0.0f, 0.0f }; | ||||||
|  | 
 | ||||||
|  |     DisableCursor();                    // Limit cursor to relative movement inside the window
 | ||||||
|  | 
 | ||||||
|  |     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, CAMERA_FREE); | ||||||
|  | 
 | ||||||
|  |         if (IsKeyDown('Z')) camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 DrawCube(cubePosition, 2.0f, 2.0f, 2.0f, RED); | ||||||
|  |                 DrawCubeWires(cubePosition, 2.0f, 2.0f, 2.0f, MAROON); | ||||||
|  | 
 | ||||||
|  |                 DrawGrid(10, 1.0f); | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawRectangle( 10, 10, 320, 133, Fade(SKYBLUE, 0.5f)); | ||||||
|  |             DrawRectangleLines( 10, 10, 320, 133, BLUE); | ||||||
|  | 
 | ||||||
|  |             DrawText("Free camera default controls:", 20, 20, 10, BLACK); | ||||||
|  |             DrawText("- Mouse Wheel to Zoom in-out", 40, 40, 10, DARKGRAY); | ||||||
|  |             DrawText("- Mouse Wheel Pressed to Pan", 40, 60, 10, DARKGRAY); | ||||||
|  |             DrawText("- Alt + Mouse Wheel Pressed to Rotate", 40, 80, 10, DARKGRAY); | ||||||
|  |             DrawText("- Alt + Ctrl + Mouse Wheel Pressed for Smooth Zoom", 40, 100, 10, DARKGRAY); | ||||||
|  |             DrawText("- Z to zoom to (0, 0, 0)", 40, 120, 10, DARKGRAY); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,118 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [core] example - Picking in 3d mode | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.3, last time updated with raylib 4.0 | ||||||
|  | * | ||||||
|  | *   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) 2015-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d picking"); | ||||||
|  | 
 | ||||||
|  |     // 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 projection type
 | ||||||
|  | 
 | ||||||
|  |     Vector3 cubePosition = { 0.0f, 1.0f, 0.0f }; | ||||||
|  |     Vector3 cubeSize = { 2.0f, 2.0f, 2.0f }; | ||||||
|  | 
 | ||||||
|  |     Ray ray = { 0 };                    // Picking line ray
 | ||||||
|  |     RayCollision collision = { 0 };     // Ray collision hit info
 | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         if (IsCursorHidden()) UpdateCamera(&camera, CAMERA_FIRST_PERSON); | ||||||
|  | 
 | ||||||
|  |         // Toggle camera controls
 | ||||||
|  |         if (IsMouseButtonPressed(MOUSE_BUTTON_RIGHT)) | ||||||
|  |         { | ||||||
|  |             if (IsCursorHidden()) EnableCursor(); | ||||||
|  |             else DisableCursor(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) | ||||||
|  |         { | ||||||
|  |             if (!collision.hit) | ||||||
|  |             { | ||||||
|  |                 ray = GetMouseRay(GetMousePosition(), camera); | ||||||
|  | 
 | ||||||
|  |                 // Check collision between ray and box
 | ||||||
|  |                 collision = GetRayCollisionBox(ray, | ||||||
|  |                             (BoundingBox){(Vector3){ cubePosition.x - cubeSize.x/2, cubePosition.y - cubeSize.y/2, cubePosition.z - cubeSize.z/2 }, | ||||||
|  |                                           (Vector3){ cubePosition.x + cubeSize.x/2, cubePosition.y + cubeSize.y/2, cubePosition.z + cubeSize.z/2 }}); | ||||||
|  |             } | ||||||
|  |             else collision.hit = false; | ||||||
|  |         } | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 if (collision.hit) | ||||||
|  |                 { | ||||||
|  |                     DrawCube(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, RED); | ||||||
|  |                     DrawCubeWires(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, MAROON); | ||||||
|  | 
 | ||||||
|  |                     DrawCubeWires(cubePosition, cubeSize.x + 0.2f, cubeSize.y + 0.2f, cubeSize.z + 0.2f, GREEN); | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     DrawCube(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, GRAY); | ||||||
|  |                     DrawCubeWires(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, DARKGRAY); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 DrawRay(ray, MAROON); | ||||||
|  |                 DrawGrid(10, 1.0f); | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawText("Try clicking on the box with your mouse!", 240, 10, 20, DARKGRAY); | ||||||
|  | 
 | ||||||
|  |             if (collision.hit) DrawText("BOX SELECTED", (screenWidth - MeasureText("BOX SELECTED", 30)) / 2, (int)(screenHeight * 0.1f), 30, GREEN); | ||||||
|  | 
 | ||||||
|  |             DrawText("Right click mouse to toggle camera controls", 10, 430, 10, GRAY); | ||||||
|  | 
 | ||||||
|  |             DrawFPS(10, 10); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,88 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [core] example - Custom logging | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 2.5, last time updated with raylib 2.5 | ||||||
|  | * | ||||||
|  | *   Example contributed by Pablo Marcos Oltra (@pamarcos) and reviewed by Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | *   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) 2018-2023 Pablo Marcos Oltra (@pamarcos) and Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | #include <stdio.h>                  // Required for: fopen(), fclose(), fputc(), fwrite(), printf(), fprintf(), funopen() | ||||||
|  | #include <time.h>                   // Required for: time_t, tm, time(), localtime(), strftime() | ||||||
|  | 
 | ||||||
|  | // Custom logging function
 | ||||||
|  | void CustomLog(int msgType, const char *text, va_list args) | ||||||
|  | { | ||||||
|  |     char timeStr[64] = { 0 }; | ||||||
|  |     time_t now = time(NULL); | ||||||
|  |     struct tm *tm_info = localtime(&now); | ||||||
|  | 
 | ||||||
|  |     strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", tm_info); | ||||||
|  |     printf("[%s] ", timeStr); | ||||||
|  | 
 | ||||||
|  |     switch (msgType) | ||||||
|  |     { | ||||||
|  |         case LOG_INFO: printf("[INFO] : "); break; | ||||||
|  |         case LOG_ERROR: printf("[ERROR]: "); break; | ||||||
|  |         case LOG_WARNING: printf("[WARN] : "); break; | ||||||
|  |         case LOG_DEBUG: printf("[DEBUG]: "); break; | ||||||
|  |         default: break; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     vprintf(text, args); | ||||||
|  |     printf("\n"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     // Set custom logger
 | ||||||
|  |     SetTraceLogCallback(CustomLog); | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - custom logging"); | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         // TODO: Update your variables here
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |         ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |         DrawText("Check out the console output to see the custom logger in action!", 60, 200, 20, LIGHTGRAY); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,119 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [core] example - Input Gestures Detection | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.4, last time updated with raylib 4.2 | ||||||
|  | * | ||||||
|  | *   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) 2016-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | #define MAX_GESTURE_STRINGS   20 | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - input gestures"); | ||||||
|  | 
 | ||||||
|  |     Vector2 touchPosition = { 0, 0 }; | ||||||
|  |     Rectangle touchArea = { 220, 10, screenWidth - 230.0f, screenHeight - 20.0f }; | ||||||
|  | 
 | ||||||
|  |     int gesturesCount = 0; | ||||||
|  |     char gestureStrings[MAX_GESTURE_STRINGS][32]; | ||||||
|  | 
 | ||||||
|  |     int currentGesture = GESTURE_NONE; | ||||||
|  |     int lastGesture = GESTURE_NONE; | ||||||
|  | 
 | ||||||
|  |     //SetGesturesEnabled(0b0000000000001001);   // Enable only some gestures to be detected
 | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         lastGesture = currentGesture; | ||||||
|  |         currentGesture = GetGestureDetected(); | ||||||
|  |         touchPosition = GetTouchPosition(0); | ||||||
|  | 
 | ||||||
|  |         if (CheckCollisionPointRec(touchPosition, touchArea) && (currentGesture != GESTURE_NONE)) | ||||||
|  |         { | ||||||
|  |             if (currentGesture != lastGesture) | ||||||
|  |             { | ||||||
|  |                 // Store gesture string
 | ||||||
|  |                 switch (currentGesture) | ||||||
|  |                 { | ||||||
|  |                     case GESTURE_TAP: TextCopy(gestureStrings[gesturesCount], "GESTURE TAP"); break; | ||||||
|  |                     case GESTURE_DOUBLETAP: TextCopy(gestureStrings[gesturesCount], "GESTURE DOUBLETAP"); break; | ||||||
|  |                     case GESTURE_HOLD: TextCopy(gestureStrings[gesturesCount], "GESTURE HOLD"); break; | ||||||
|  |                     case GESTURE_DRAG: TextCopy(gestureStrings[gesturesCount], "GESTURE DRAG"); break; | ||||||
|  |                     case GESTURE_SWIPE_RIGHT: TextCopy(gestureStrings[gesturesCount], "GESTURE SWIPE RIGHT"); break; | ||||||
|  |                     case GESTURE_SWIPE_LEFT: TextCopy(gestureStrings[gesturesCount], "GESTURE SWIPE LEFT"); break; | ||||||
|  |                     case GESTURE_SWIPE_UP: TextCopy(gestureStrings[gesturesCount], "GESTURE SWIPE UP"); break; | ||||||
|  |                     case GESTURE_SWIPE_DOWN: TextCopy(gestureStrings[gesturesCount], "GESTURE SWIPE DOWN"); break; | ||||||
|  |                     case GESTURE_PINCH_IN: TextCopy(gestureStrings[gesturesCount], "GESTURE PINCH IN"); break; | ||||||
|  |                     case GESTURE_PINCH_OUT: TextCopy(gestureStrings[gesturesCount], "GESTURE PINCH OUT"); break; | ||||||
|  |                     default: break; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 gesturesCount++; | ||||||
|  | 
 | ||||||
|  |                 // Reset gestures strings
 | ||||||
|  |                 if (gesturesCount >= MAX_GESTURE_STRINGS) | ||||||
|  |                 { | ||||||
|  |                     for (int i = 0; i < MAX_GESTURE_STRINGS; i++) TextCopy(gestureStrings[i], "\0"); | ||||||
|  | 
 | ||||||
|  |                     gesturesCount = 0; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             DrawRectangleRec(touchArea, GRAY); | ||||||
|  |             DrawRectangle(225, 15, screenWidth - 240, screenHeight - 30, RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             DrawText("GESTURES TEST AREA", screenWidth - 270, screenHeight - 40, 20, Fade(GRAY, 0.5f)); | ||||||
|  | 
 | ||||||
|  |             for (int i = 0; i < gesturesCount; i++) | ||||||
|  |             { | ||||||
|  |                 if (i%2 == 0) DrawRectangle(10, 30 + 20*i, 200, 20, Fade(LIGHTGRAY, 0.5f)); | ||||||
|  |                 else DrawRectangle(10, 30 + 20*i, 200, 20, Fade(LIGHTGRAY, 0.3f)); | ||||||
|  | 
 | ||||||
|  |                 if (i < gesturesCount - 1) DrawText(gestureStrings[i], 35, 36 + 20*i, 10, DARKGRAY); | ||||||
|  |                 else DrawText(gestureStrings[i], 35, 36 + 20*i, 10, MAROON); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             DrawRectangleLines(10, 29, 200, screenHeight - 50, GRAY); | ||||||
|  |             DrawText("DETECTED GESTURES", 50, 15, 10, GRAY); | ||||||
|  | 
 | ||||||
|  |             if (currentGesture != GESTURE_NONE) DrawCircleV(touchPosition, 30, MAROON); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,79 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [core] example - Input multitouch | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 2.1, last time updated with raylib 2.5 | ||||||
|  | * | ||||||
|  | *   Example contributed by Berni (@Berni8k) and reviewed by Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | *   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-2023 Berni (@Berni8k) and Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | #define MAX_TOUCH_POINTS 10 | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - input multitouch"); | ||||||
|  | 
 | ||||||
|  |     Vector2 touchPositions[MAX_TOUCH_POINTS] = { 0 }; | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         // Get the touch point count ( how many fingers are touching the screen )
 | ||||||
|  |         int tCount = GetTouchPointCount(); | ||||||
|  |         // Clamp touch points available ( set the maximum touch points allowed )
 | ||||||
|  |         if(tCount > MAX_TOUCH_POINTS) tCount = MAX_TOUCH_POINTS; | ||||||
|  |         // Get touch points positions
 | ||||||
|  |         for (int i = 0; i < tCount; ++i) touchPositions[i] = GetTouchPosition(i); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  |              | ||||||
|  |             for (int i = 0; i < tCount; ++i) | ||||||
|  |             { | ||||||
|  |                 // Make sure point is not (0, 0) as this means there is no touch for it
 | ||||||
|  |                 if ((touchPositions[i].x > 0) && (touchPositions[i].y > 0)) | ||||||
|  |                 { | ||||||
|  |                     // Draw circle and touch index number
 | ||||||
|  |                     DrawCircleV(touchPositions[i], 34, ORANGE); | ||||||
|  |                     DrawText(TextFormat("%d", i), (int)touchPositions[i].x - 10, (int)touchPositions[i].y - 70, 40, BLACK); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             DrawText("touch the screen at multiple locations to get multiple balls", 10, 10, 20, DARKGRAY); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,72 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [core] example - Generate random values | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.1, last time updated with raylib 1.1 | ||||||
|  | * | ||||||
|  | *   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) 2014-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - generate random values"); | ||||||
|  | 
 | ||||||
|  |     // SetRandomSeed(0xaabbccff);   // Set a custom random seed if desired, by default: "time(NULL)"
 | ||||||
|  | 
 | ||||||
|  |     int randValue = GetRandomValue(-8, 5);   // Get a random integer number between -8 and 5 (both included)
 | ||||||
|  |      | ||||||
|  |     int framesCounter = 0;          // Variable used to count frames
 | ||||||
|  |      | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         framesCounter++; | ||||||
|  | 
 | ||||||
|  |         // Every two seconds (120 frames) a new random value is generated
 | ||||||
|  |         if (((framesCounter/120)%2) == 1) | ||||||
|  |         { | ||||||
|  |             randValue = GetRandomValue(-8, 5); | ||||||
|  |             framesCounter = 0; | ||||||
|  |         } | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             DrawText("Every 2 seconds a new random value is generated:", 130, 100, 20, MAROON); | ||||||
|  | 
 | ||||||
|  |             DrawText(TextFormat("%i", randValue), 360, 180, 80, LIGHTGRAY); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,76 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [core] example - Scissor test | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 2.5, last time updated with raylib 3.0 | ||||||
|  | * | ||||||
|  | *   Example contributed by Chris Dill (@MysteriousSpace) and reviewed by Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | *   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-2023 Chris Dill (@MysteriousSpace) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - scissor test"); | ||||||
|  | 
 | ||||||
|  |     Rectangle scissorArea = { 0, 0, 300, 300 }; | ||||||
|  |     bool scissorMode = true; | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         if (IsKeyPressed(KEY_S)) scissorMode = !scissorMode; | ||||||
|  | 
 | ||||||
|  |         // Centre the scissor area around the mouse position
 | ||||||
|  |         scissorArea.x = GetMouseX() - scissorArea.width/2; | ||||||
|  |         scissorArea.y = GetMouseY() - scissorArea.height/2; | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             if (scissorMode) BeginScissorMode((int)scissorArea.x, (int)scissorArea.y, (int)scissorArea.width, (int)scissorArea.height); | ||||||
|  | 
 | ||||||
|  |             // Draw full screen rectangle and some text
 | ||||||
|  |             // NOTE: Only part defined by scissor area will be rendered
 | ||||||
|  |             DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), RED); | ||||||
|  |             DrawText("Move the mouse around to reveal this text!", 190, 200, 20, LIGHTGRAY); | ||||||
|  | 
 | ||||||
|  |             if (scissorMode) EndScissorMode(); | ||||||
|  | 
 | ||||||
|  |             DrawRectangleLinesEx(scissorArea, 1, BLACK); | ||||||
|  |             DrawText("Press S to toggle scissor test", 10, 10, 20, BLACK); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,122 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [core] example - smooth pixel-perfect camera | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 3.7, last time updated with raylib 4.0 | ||||||
|  | *    | ||||||
|  | *   Example contributed by Giancamillo Alessandroni (@NotManyIdeasDev) and | ||||||
|  | *   reviewed by Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | *   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) 2021-2023 Giancamillo Alessandroni (@NotManyIdeasDev) and Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | #include <math.h>       // Required for: sinf(), cosf() | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     const int virtualScreenWidth = 160; | ||||||
|  |     const int virtualScreenHeight = 90; | ||||||
|  | 
 | ||||||
|  |     const float virtualRatio = (float)screenWidth/(float)virtualScreenWidth; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - smooth pixel-perfect camera"); | ||||||
|  | 
 | ||||||
|  |     Camera2D worldSpaceCamera = { 0 };  // Game world camera
 | ||||||
|  |     worldSpaceCamera.zoom = 1.0f; | ||||||
|  | 
 | ||||||
|  |     Camera2D screenSpaceCamera = { 0 }; // Smoothing camera
 | ||||||
|  |     screenSpaceCamera.zoom = 1.0f; | ||||||
|  | 
 | ||||||
|  |     RenderTexture2D target = LoadRenderTexture(virtualScreenWidth, virtualScreenHeight); // This is where we'll draw all our objects.
 | ||||||
|  | 
 | ||||||
|  |     Rectangle rec01 = { 70.0f, 35.0f, 20.0f, 20.0f }; | ||||||
|  |     Rectangle rec02 = { 90.0f, 55.0f, 30.0f, 10.0f }; | ||||||
|  |     Rectangle rec03 = { 80.0f, 65.0f, 15.0f, 25.0f }; | ||||||
|  | 
 | ||||||
|  |     // The target's height is flipped (in the source Rectangle), due to OpenGL reasons
 | ||||||
|  |     Rectangle sourceRec = { 0.0f, 0.0f, (float)target.texture.width, -(float)target.texture.height }; | ||||||
|  |     Rectangle destRec = { -virtualRatio, -virtualRatio, screenWidth + (virtualRatio*2), screenHeight + (virtualRatio*2) }; | ||||||
|  | 
 | ||||||
|  |     Vector2 origin = { 0.0f, 0.0f }; | ||||||
|  | 
 | ||||||
|  |     float rotation = 0.0f; | ||||||
|  | 
 | ||||||
|  |     float cameraX = 0.0f; | ||||||
|  |     float cameraY = 0.0f; | ||||||
|  | 
 | ||||||
|  |     SetTargetFPS(60); | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     // Main game loop
 | ||||||
|  |     while (!WindowShouldClose())    // Detect window close button or ESC key
 | ||||||
|  |     { | ||||||
|  |         // Update
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         rotation += 60.0f*GetFrameTime();   // Rotate the rectangles, 60 degrees per second
 | ||||||
|  | 
 | ||||||
|  |         // Make the camera move to demonstrate the effect
 | ||||||
|  |         cameraX = (sinf(GetTime())*50.0f) - 10.0f; | ||||||
|  |         cameraY = cosf(GetTime())*30.0f; | ||||||
|  | 
 | ||||||
|  |         // Set the camera's target to the values computed above
 | ||||||
|  |         screenSpaceCamera.target = (Vector2){ cameraX, cameraY }; | ||||||
|  | 
 | ||||||
|  |         // Round worldSpace coordinates, keep decimals into screenSpace coordinates
 | ||||||
|  |         worldSpaceCamera.target.x = (int)screenSpaceCamera.target.x; | ||||||
|  |         screenSpaceCamera.target.x -= worldSpaceCamera.target.x; | ||||||
|  |         screenSpaceCamera.target.x *= virtualRatio; | ||||||
|  | 
 | ||||||
|  |         worldSpaceCamera.target.y = (int)screenSpaceCamera.target.y; | ||||||
|  |         screenSpaceCamera.target.y -= worldSpaceCamera.target.y; | ||||||
|  |         screenSpaceCamera.target.y *= virtualRatio; | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginTextureMode(target); | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode2D(worldSpaceCamera); | ||||||
|  |                 DrawRectanglePro(rec01, origin, rotation, BLACK); | ||||||
|  |                 DrawRectanglePro(rec02, origin, -rotation, RED); | ||||||
|  |                 DrawRectanglePro(rec03, origin, rotation + 45.0f, BLUE); | ||||||
|  |             EndMode2D(); | ||||||
|  |         EndTextureMode(); | ||||||
|  | 
 | ||||||
|  |         BeginDrawing(); | ||||||
|  |             ClearBackground(RED); | ||||||
|  | 
 | ||||||
|  |             BeginMode2D(screenSpaceCamera); | ||||||
|  |                 DrawTexturePro(target.texture, sourceRec, destRec, origin, 0.0f, WHITE); | ||||||
|  |             EndMode2D(); | ||||||
|  | 
 | ||||||
|  |             DrawText(TextFormat("Screen resolution: %ix%i", screenWidth, screenHeight), 10, 10, 20, DARKBLUE); | ||||||
|  |             DrawText(TextFormat("World resolution: %ix%i", virtualScreenWidth, virtualScreenHeight), 10, 40, 20, DARKGREEN); | ||||||
|  |             DrawFPS(GetScreenWidth() - 95, 10); | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     UnloadRenderTexture(target);    // Unload render texture
 | ||||||
|  | 
 | ||||||
|  |     CloseWindow();                  // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,151 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [core] example - split screen | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 3.7, last time updated with raylib 4.0 | ||||||
|  | * | ||||||
|  | *   Example contributed by Jeffery Myers (@JeffM2501) and reviewed by Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | *   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) 2021-2023 Jeffery Myers (@JeffM2501) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | Camera cameraPlayer1 = { 0 }; | ||||||
|  | Camera cameraPlayer2 = { 0 }; | ||||||
|  | 
 | ||||||
|  | // Scene drawing
 | ||||||
|  | void DrawScene(void) | ||||||
|  | { | ||||||
|  |     int count = 5; | ||||||
|  |     float spacing = 4; | ||||||
|  | 
 | ||||||
|  |     // Grid of cube trees on a plane to make a "world"
 | ||||||
|  |     DrawPlane((Vector3){ 0, 0, 0 }, (Vector2){ 50, 50 }, BEIGE); // Simple world plane
 | ||||||
|  | 
 | ||||||
|  |     for (float x = -count*spacing; x <= count*spacing; x += spacing) | ||||||
|  |     { | ||||||
|  |         for (float z = -count*spacing; z <= count*spacing; z += spacing) | ||||||
|  |         { | ||||||
|  |             DrawCube((Vector3) { x, 1.5f, z }, 1, 1, 1, LIME); | ||||||
|  |             DrawCube((Vector3) { x, 0.5f, z }, 0.25f, 1, 0.25f, BROWN); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Draw a cube at each player's position
 | ||||||
|  |     DrawCube(cameraPlayer1.position, 1, 1, 1, RED); | ||||||
|  |     DrawCube(cameraPlayer2.position, 1, 1, 1, BLUE); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - split screen"); | ||||||
|  | 
 | ||||||
|  |     // Setup player 1 camera and screen
 | ||||||
|  |     cameraPlayer1.fovy = 45.0f; | ||||||
|  |     cameraPlayer1.up.y = 1.0f; | ||||||
|  |     cameraPlayer1.target.y = 1.0f; | ||||||
|  |     cameraPlayer1.position.z = -3.0f; | ||||||
|  |     cameraPlayer1.position.y = 1.0f; | ||||||
|  | 
 | ||||||
|  |     RenderTexture screenPlayer1 = LoadRenderTexture(screenWidth/2, screenHeight); | ||||||
|  | 
 | ||||||
|  |     // Setup player two camera and screen
 | ||||||
|  |     cameraPlayer2.fovy = 45.0f; | ||||||
|  |     cameraPlayer2.up.y = 1.0f; | ||||||
|  |     cameraPlayer2.target.y = 3.0f; | ||||||
|  |     cameraPlayer2.position.x = -3.0f; | ||||||
|  |     cameraPlayer2.position.y = 3.0f; | ||||||
|  | 
 | ||||||
|  |     RenderTexture screenPlayer2 = LoadRenderTexture(screenWidth / 2, screenHeight); | ||||||
|  | 
 | ||||||
|  |     // Build a flipped rectangle the size of the split view to use for drawing later
 | ||||||
|  |     Rectangle splitScreenRect = { 0.0f, 0.0f, (float)screenPlayer1.texture.width, (float)-screenPlayer1.texture.height }; | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         // If anyone moves this frame, how far will they move based on the time since the last frame
 | ||||||
|  |         // this moves thigns at 10 world units per second, regardless of the actual FPS
 | ||||||
|  |         float offsetThisFrame = 10.0f*GetFrameTime(); | ||||||
|  | 
 | ||||||
|  |         // Move Player1 forward and backwards (no turning)
 | ||||||
|  |         if (IsKeyDown(KEY_W)) | ||||||
|  |         { | ||||||
|  |             cameraPlayer1.position.z += offsetThisFrame; | ||||||
|  |             cameraPlayer1.target.z += offsetThisFrame; | ||||||
|  |         } | ||||||
|  |         else if (IsKeyDown(KEY_S)) | ||||||
|  |         { | ||||||
|  |             cameraPlayer1.position.z -= offsetThisFrame; | ||||||
|  |             cameraPlayer1.target.z -= offsetThisFrame; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Move Player2 forward and backwards (no turning)
 | ||||||
|  |         if (IsKeyDown(KEY_UP)) | ||||||
|  |         { | ||||||
|  |             cameraPlayer2.position.x += offsetThisFrame; | ||||||
|  |             cameraPlayer2.target.x += offsetThisFrame; | ||||||
|  |         } | ||||||
|  |         else if (IsKeyDown(KEY_DOWN)) | ||||||
|  |         { | ||||||
|  |             cameraPlayer2.position.x -= offsetThisFrame; | ||||||
|  |             cameraPlayer2.target.x -= offsetThisFrame; | ||||||
|  |         } | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         // Draw Player1 view to the render texture
 | ||||||
|  |         BeginTextureMode(screenPlayer1); | ||||||
|  |             ClearBackground(SKYBLUE); | ||||||
|  |             BeginMode3D(cameraPlayer1); | ||||||
|  |                 DrawScene(); | ||||||
|  |             EndMode3D(); | ||||||
|  |             DrawText("PLAYER1 W/S to move", 10, 10, 20, RED); | ||||||
|  |         EndTextureMode(); | ||||||
|  | 
 | ||||||
|  |         // Draw Player2 view to the render texture
 | ||||||
|  |         BeginTextureMode(screenPlayer2); | ||||||
|  |             ClearBackground(SKYBLUE); | ||||||
|  |             BeginMode3D(cameraPlayer2); | ||||||
|  |                 DrawScene(); | ||||||
|  |             EndMode3D(); | ||||||
|  |             DrawText("PLAYER2 UP/DOWN to move", 10, 10, 20, BLUE); | ||||||
|  |         EndTextureMode(); | ||||||
|  | 
 | ||||||
|  |         // Draw both views render textures to the screen side by side
 | ||||||
|  |         BeginDrawing(); | ||||||
|  |             ClearBackground(BLACK); | ||||||
|  |             DrawTextureRec(screenPlayer1.texture, splitScreenRect, (Vector2){ 0, 0 }, WHITE); | ||||||
|  |             DrawTextureRec(screenPlayer2.texture, splitScreenRect, (Vector2){ screenWidth/2.0f, 0 }, WHITE); | ||||||
|  |         EndDrawing(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     UnloadRenderTexture(screenPlayer1); // Unload render texture
 | ||||||
|  |     UnloadRenderTexture(screenPlayer2); // Unload render texture
 | ||||||
|  | 
 | ||||||
|  |     CloseWindow();                      // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,196 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [core] example - window flags | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 3.5, last time updated with raylib 3.5 | ||||||
|  | * | ||||||
|  | *   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) 2020-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //---------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     // Possible window flags
 | ||||||
|  |     /*
 | ||||||
|  |     FLAG_VSYNC_HINT | ||||||
|  |     FLAG_FULLSCREEN_MODE    -> not working properly -> wrong scaling! | ||||||
|  |     FLAG_WINDOW_RESIZABLE | ||||||
|  |     FLAG_WINDOW_UNDECORATED | ||||||
|  |     FLAG_WINDOW_TRANSPARENT | ||||||
|  |     FLAG_WINDOW_HIDDEN | ||||||
|  |     FLAG_WINDOW_MINIMIZED   -> Not supported on window creation | ||||||
|  |     FLAG_WINDOW_MAXIMIZED   -> Not supported on window creation | ||||||
|  |     FLAG_WINDOW_UNFOCUSED | ||||||
|  |     FLAG_WINDOW_TOPMOST | ||||||
|  |     FLAG_WINDOW_HIGHDPI     -> errors after minimize-resize, fb size is recalculated | ||||||
|  |     FLAG_WINDOW_ALWAYS_RUN | ||||||
|  |     FLAG_MSAA_4X_HINT | ||||||
|  |     */ | ||||||
|  | 
 | ||||||
|  |     // Set configuration flags for window creation
 | ||||||
|  |     //SetConfigFlags(FLAG_VSYNC_HINT | FLAG_MSAA_4X_HINT | FLAG_WINDOW_HIGHDPI);
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - window flags"); | ||||||
|  | 
 | ||||||
|  |     Vector2 ballPosition = { GetScreenWidth() / 2.0f, GetScreenHeight() / 2.0f }; | ||||||
|  |     Vector2 ballSpeed = { 5.0f, 4.0f }; | ||||||
|  |     float ballRadius = 20; | ||||||
|  | 
 | ||||||
|  |     int framesCounter = 0; | ||||||
|  | 
 | ||||||
|  |     //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
 | ||||||
|  |         //-----------------------------------------------------
 | ||||||
|  |         if (IsKeyPressed(KEY_F)) ToggleFullscreen();  // modifies window size when scaling!
 | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_R)) | ||||||
|  |         { | ||||||
|  |             if (IsWindowState(FLAG_WINDOW_RESIZABLE)) ClearWindowState(FLAG_WINDOW_RESIZABLE); | ||||||
|  |             else SetWindowState(FLAG_WINDOW_RESIZABLE); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_D)) | ||||||
|  |         { | ||||||
|  |             if (IsWindowState(FLAG_WINDOW_UNDECORATED)) ClearWindowState(FLAG_WINDOW_UNDECORATED); | ||||||
|  |             else SetWindowState(FLAG_WINDOW_UNDECORATED); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_H)) | ||||||
|  |         { | ||||||
|  |             if (!IsWindowState(FLAG_WINDOW_HIDDEN)) SetWindowState(FLAG_WINDOW_HIDDEN); | ||||||
|  | 
 | ||||||
|  |             framesCounter = 0; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsWindowState(FLAG_WINDOW_HIDDEN)) | ||||||
|  |         { | ||||||
|  |             framesCounter++; | ||||||
|  |             if (framesCounter >= 240) ClearWindowState(FLAG_WINDOW_HIDDEN); // Show window after 3 seconds
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_N)) | ||||||
|  |         { | ||||||
|  |             if (!IsWindowState(FLAG_WINDOW_MINIMIZED)) MinimizeWindow(); | ||||||
|  | 
 | ||||||
|  |             framesCounter = 0; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsWindowState(FLAG_WINDOW_MINIMIZED)) | ||||||
|  |         { | ||||||
|  |             framesCounter++; | ||||||
|  |             if (framesCounter >= 240) RestoreWindow(); // Restore window after 3 seconds
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_M)) | ||||||
|  |         { | ||||||
|  |             // NOTE: Requires FLAG_WINDOW_RESIZABLE enabled!
 | ||||||
|  |             if (IsWindowState(FLAG_WINDOW_MAXIMIZED)) RestoreWindow(); | ||||||
|  |             else MaximizeWindow(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_U)) | ||||||
|  |         { | ||||||
|  |             if (IsWindowState(FLAG_WINDOW_UNFOCUSED)) ClearWindowState(FLAG_WINDOW_UNFOCUSED); | ||||||
|  |             else SetWindowState(FLAG_WINDOW_UNFOCUSED); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_T)) | ||||||
|  |         { | ||||||
|  |             if (IsWindowState(FLAG_WINDOW_TOPMOST)) ClearWindowState(FLAG_WINDOW_TOPMOST); | ||||||
|  |             else SetWindowState(FLAG_WINDOW_TOPMOST); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_A)) | ||||||
|  |         { | ||||||
|  |             if (IsWindowState(FLAG_WINDOW_ALWAYS_RUN)) ClearWindowState(FLAG_WINDOW_ALWAYS_RUN); | ||||||
|  |             else SetWindowState(FLAG_WINDOW_ALWAYS_RUN); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_V)) | ||||||
|  |         { | ||||||
|  |             if (IsWindowState(FLAG_VSYNC_HINT)) ClearWindowState(FLAG_VSYNC_HINT); | ||||||
|  |             else SetWindowState(FLAG_VSYNC_HINT); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Bouncing ball logic
 | ||||||
|  |         ballPosition.x += ballSpeed.x; | ||||||
|  |         ballPosition.y += ballSpeed.y; | ||||||
|  |         if ((ballPosition.x >= (GetScreenWidth() - ballRadius)) || (ballPosition.x <= ballRadius)) ballSpeed.x *= -1.0f; | ||||||
|  |         if ((ballPosition.y >= (GetScreenHeight() - ballRadius)) || (ballPosition.y <= ballRadius)) ballSpeed.y *= -1.0f; | ||||||
|  |         //-----------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //-----------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |         if (IsWindowState(FLAG_WINDOW_TRANSPARENT)) ClearBackground(BLANK); | ||||||
|  |         else ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |         DrawCircleV(ballPosition, ballRadius, MAROON); | ||||||
|  |         DrawRectangleLinesEx((Rectangle) { 0, 0, (float)GetScreenWidth(), (float)GetScreenHeight() }, 4, RAYWHITE); | ||||||
|  | 
 | ||||||
|  |         DrawCircleV(GetMousePosition(), 10, DARKBLUE); | ||||||
|  | 
 | ||||||
|  |         DrawFPS(10, 10); | ||||||
|  | 
 | ||||||
|  |         DrawText(TextFormat("Screen Size: [%i, %i]", GetScreenWidth(), GetScreenHeight()), 10, 40, 10, GREEN); | ||||||
|  | 
 | ||||||
|  |         // Draw window state info
 | ||||||
|  |         DrawText("Following flags can be set after window creation:", 10, 60, 10, GRAY); | ||||||
|  |         if (IsWindowState(FLAG_FULLSCREEN_MODE)) DrawText("[F] FLAG_FULLSCREEN_MODE: on", 10, 80, 10, LIME); | ||||||
|  |         else DrawText("[F] FLAG_FULLSCREEN_MODE: off", 10, 80, 10, MAROON); | ||||||
|  |         if (IsWindowState(FLAG_WINDOW_RESIZABLE)) DrawText("[R] FLAG_WINDOW_RESIZABLE: on", 10, 100, 10, LIME); | ||||||
|  |         else DrawText("[R] FLAG_WINDOW_RESIZABLE: off", 10, 100, 10, MAROON); | ||||||
|  |         if (IsWindowState(FLAG_WINDOW_UNDECORATED)) DrawText("[D] FLAG_WINDOW_UNDECORATED: on", 10, 120, 10, LIME); | ||||||
|  |         else DrawText("[D] FLAG_WINDOW_UNDECORATED: off", 10, 120, 10, MAROON); | ||||||
|  |         if (IsWindowState(FLAG_WINDOW_HIDDEN)) DrawText("[H] FLAG_WINDOW_HIDDEN: on", 10, 140, 10, LIME); | ||||||
|  |         else DrawText("[H] FLAG_WINDOW_HIDDEN: off", 10, 140, 10, MAROON); | ||||||
|  |         if (IsWindowState(FLAG_WINDOW_MINIMIZED)) DrawText("[N] FLAG_WINDOW_MINIMIZED: on", 10, 160, 10, LIME); | ||||||
|  |         else DrawText("[N] FLAG_WINDOW_MINIMIZED: off", 10, 160, 10, MAROON); | ||||||
|  |         if (IsWindowState(FLAG_WINDOW_MAXIMIZED)) DrawText("[M] FLAG_WINDOW_MAXIMIZED: on", 10, 180, 10, LIME); | ||||||
|  |         else DrawText("[M] FLAG_WINDOW_MAXIMIZED: off", 10, 180, 10, MAROON); | ||||||
|  |         if (IsWindowState(FLAG_WINDOW_UNFOCUSED)) DrawText("[G] FLAG_WINDOW_UNFOCUSED: on", 10, 200, 10, LIME); | ||||||
|  |         else DrawText("[U] FLAG_WINDOW_UNFOCUSED: off", 10, 200, 10, MAROON); | ||||||
|  |         if (IsWindowState(FLAG_WINDOW_TOPMOST)) DrawText("[T] FLAG_WINDOW_TOPMOST: on", 10, 220, 10, LIME); | ||||||
|  |         else DrawText("[T] FLAG_WINDOW_TOPMOST: off", 10, 220, 10, MAROON); | ||||||
|  |         if (IsWindowState(FLAG_WINDOW_ALWAYS_RUN)) DrawText("[A] FLAG_WINDOW_ALWAYS_RUN: on", 10, 240, 10, LIME); | ||||||
|  |         else DrawText("[A] FLAG_WINDOW_ALWAYS_RUN: off", 10, 240, 10, MAROON); | ||||||
|  |         if (IsWindowState(FLAG_VSYNC_HINT)) DrawText("[V] FLAG_VSYNC_HINT: on", 10, 260, 10, LIME); | ||||||
|  |         else DrawText("[V] FLAG_VSYNC_HINT: off", 10, 260, 10, MAROON); | ||||||
|  | 
 | ||||||
|  |         DrawText("Following flags can only be set before window creation:", 10, 300, 10, GRAY); | ||||||
|  |         if (IsWindowState(FLAG_WINDOW_HIGHDPI)) DrawText("FLAG_WINDOW_HIGHDPI: on", 10, 320, 10, LIME); | ||||||
|  |         else DrawText("FLAG_WINDOW_HIGHDPI: off", 10, 320, 10, MAROON); | ||||||
|  |         if (IsWindowState(FLAG_WINDOW_TRANSPARENT)) DrawText("FLAG_WINDOW_TRANSPARENT: on", 10, 340, 10, LIME); | ||||||
|  |         else DrawText("FLAG_WINDOW_TRANSPARENT: off", 10, 340, 10, MAROON); | ||||||
|  |         if (IsWindowState(FLAG_MSAA_4X_HINT)) DrawText("FLAG_MSAA_4X_HINT: on", 10, 360, 10, LIME); | ||||||
|  |         else DrawText("FLAG_MSAA_4X_HINT: off", 10, 360, 10, MAROON); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //-----------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //---------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //----------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,107 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [core] example - window scale letterbox (and virtual mouse) | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 2.5, last time updated with raylib 4.0 | ||||||
|  | * | ||||||
|  | *   Example contributed by Anata (@anatagawa) and reviewed by Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | *   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-2023 Anata (@anatagawa) and Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | #include "raymath.h"        // Required for: Vector2Clamp() | ||||||
|  | 
 | ||||||
|  | #define MAX(a, b) ((a)>(b)? (a) : (b)) | ||||||
|  | #define MIN(a, b) ((a)<(b)? (a) : (b)) | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     const int windowWidth = 800; | ||||||
|  |     const int windowHeight = 450; | ||||||
|  | 
 | ||||||
|  |     // Enable config flags for resizable window and vertical synchro
 | ||||||
|  |     SetConfigFlags(FLAG_WINDOW_RESIZABLE | FLAG_VSYNC_HINT); | ||||||
|  |     InitWindow(windowWidth, windowHeight, "raylib [core] example - window scale letterbox"); | ||||||
|  |     SetWindowMinSize(320, 240); | ||||||
|  | 
 | ||||||
|  |     int gameScreenWidth = 640; | ||||||
|  |     int gameScreenHeight = 480; | ||||||
|  | 
 | ||||||
|  |     // Render texture initialization, used to hold the rendering result so we can easily resize it
 | ||||||
|  |     RenderTexture2D target = LoadRenderTexture(gameScreenWidth, gameScreenHeight); | ||||||
|  |     SetTextureFilter(target.texture, TEXTURE_FILTER_BILINEAR);  // Texture scale filter to use
 | ||||||
|  | 
 | ||||||
|  |     Color colors[10] = { 0 }; | ||||||
|  |     for (int i = 0; i < 10; i++) colors[i] = (Color){ GetRandomValue(100, 250), GetRandomValue(50, 150), GetRandomValue(10, 100), 255 }; | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         // Compute required framebuffer scaling
 | ||||||
|  |         float scale = MIN((float)GetScreenWidth()/gameScreenWidth, (float)GetScreenHeight()/gameScreenHeight); | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_SPACE)) | ||||||
|  |         { | ||||||
|  |             // Recalculate random colors for the bars
 | ||||||
|  |             for (int i = 0; i < 10; i++) colors[i] = (Color){ GetRandomValue(100, 250), GetRandomValue(50, 150), GetRandomValue(10, 100), 255 }; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Update virtual mouse (clamped mouse value behind game screen)
 | ||||||
|  |         Vector2 mouse = GetMousePosition(); | ||||||
|  |         Vector2 virtualMouse = { 0 }; | ||||||
|  |         virtualMouse.x = (mouse.x - (GetScreenWidth() - (gameScreenWidth*scale))*0.5f)/scale; | ||||||
|  |         virtualMouse.y = (mouse.y - (GetScreenHeight() - (gameScreenHeight*scale))*0.5f)/scale; | ||||||
|  |         virtualMouse = Vector2Clamp(virtualMouse, (Vector2){ 0, 0 }, (Vector2){ (float)gameScreenWidth, (float)gameScreenHeight }); | ||||||
|  | 
 | ||||||
|  |         // Apply the same transformation as the virtual mouse to the real mouse (i.e. to work with raygui)
 | ||||||
|  |         //SetMouseOffset(-(GetScreenWidth() - (gameScreenWidth*scale))*0.5f, -(GetScreenHeight() - (gameScreenHeight*scale))*0.5f);
 | ||||||
|  |         //SetMouseScale(1/scale, 1/scale);
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         // Draw everything in the render texture, note this will not be rendered on screen, yet
 | ||||||
|  |         BeginTextureMode(target); | ||||||
|  |             ClearBackground(RAYWHITE);  // Clear render texture background color
 | ||||||
|  | 
 | ||||||
|  |             for (int i = 0; i < 10; i++) DrawRectangle(0, (gameScreenHeight/10)*i, gameScreenWidth, gameScreenHeight/10, colors[i]); | ||||||
|  | 
 | ||||||
|  |             DrawText("If executed inside a window,\nyou can resize the window,\nand see the screen scaling!", 10, 25, 20, WHITE); | ||||||
|  |             DrawText(TextFormat("Default Mouse: [%i , %i]", (int)mouse.x, (int)mouse.y), 350, 25, 20, GREEN); | ||||||
|  |             DrawText(TextFormat("Virtual Mouse: [%i , %i]", (int)virtualMouse.x, (int)virtualMouse.y), 350, 55, 20, YELLOW); | ||||||
|  |         EndTextureMode(); | ||||||
|  |          | ||||||
|  |         BeginDrawing(); | ||||||
|  |             ClearBackground(BLACK);     // Clear screen background
 | ||||||
|  | 
 | ||||||
|  |             // Draw render texture to screen, properly scaled
 | ||||||
|  |             DrawTexturePro(target.texture, (Rectangle){ 0.0f, 0.0f, (float)target.texture.width, (float)-target.texture.height }, | ||||||
|  |                            (Rectangle){ (GetScreenWidth() - ((float)gameScreenWidth*scale))*0.5f, (GetScreenHeight() - ((float)gameScreenHeight*scale))*0.5f, | ||||||
|  |                            (float)gameScreenWidth*scale, (float)gameScreenHeight*scale }, (Vector2){ 0, 0 }, 0.0f, WHITE); | ||||||
|  |         EndDrawing(); | ||||||
|  |         //--------------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     UnloadRenderTexture(target);        // Unload render texture
 | ||||||
|  | 
 | ||||||
|  |     CloseWindow();                      // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,77 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [core] example - Window should close | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 4.2, last time updated with raylib 4.2 | ||||||
|  | * | ||||||
|  | *   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) 2013-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - window should close"); | ||||||
|  |      | ||||||
|  |     SetExitKey(KEY_NULL);       // Disable KEY_ESCAPE to close window, X-button still works
 | ||||||
|  |      | ||||||
|  |     bool exitWindowRequested = false;   // Flag to request window to exit
 | ||||||
|  |     bool exitWindow = false;    // Flag to set window to exit
 | ||||||
|  | 
 | ||||||
|  |     SetTargetFPS(60);           // Set our game to run at 60 frames-per-second
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     // Main game loop
 | ||||||
|  |     while (!exitWindow) | ||||||
|  |     { | ||||||
|  |         // Update
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         // Detect if X-button or KEY_ESCAPE have been pressed to close window
 | ||||||
|  |         if (WindowShouldClose() || IsKeyPressed(KEY_ESCAPE)) exitWindowRequested = true; | ||||||
|  |          | ||||||
|  |         if (exitWindowRequested) | ||||||
|  |         { | ||||||
|  |             // A request for close window has been issued, we can save data before closing
 | ||||||
|  |             // or just show a message asking for confirmation
 | ||||||
|  |              | ||||||
|  |             if (IsKeyPressed(KEY_Y)) exitWindow = true; | ||||||
|  |             else if (IsKeyPressed(KEY_N)) exitWindowRequested = false; | ||||||
|  |         } | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             if (exitWindowRequested) | ||||||
|  |             { | ||||||
|  |                 DrawRectangle(0, 100, screenWidth, 200, BLACK); | ||||||
|  |                 DrawText("Are you sure you want to exit program? [Y/N]", 40, 180, 30, WHITE); | ||||||
|  |             } | ||||||
|  |             else DrawText("Try to close the window to get confirmation message!", 120, 200, 20, LIGHTGRAY); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,85 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [core] example - World to screen | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.3, last time updated with raylib 1.4 | ||||||
|  | * | ||||||
|  | *   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) 2015-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - core world screen"); | ||||||
|  | 
 | ||||||
|  |     // 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 projection type
 | ||||||
|  | 
 | ||||||
|  |     Vector3 cubePosition = { 0.0f, 0.0f, 0.0f }; | ||||||
|  |     Vector2 cubeScreenPosition = { 0.0f, 0.0f }; | ||||||
|  | 
 | ||||||
|  |     DisableCursor();                    // Limit cursor to relative movement inside the window
 | ||||||
|  | 
 | ||||||
|  |     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, CAMERA_THIRD_PERSON); | ||||||
|  | 
 | ||||||
|  |         // Calculate cube screen space position (with a little offset to be in top)
 | ||||||
|  |         cubeScreenPosition = GetWorldToScreen((Vector3){cubePosition.x, cubePosition.y + 2.5f, cubePosition.z}, camera); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 DrawCube(cubePosition, 2.0f, 2.0f, 2.0f, RED); | ||||||
|  |                 DrawCubeWires(cubePosition, 2.0f, 2.0f, 2.0f, MAROON); | ||||||
|  | 
 | ||||||
|  |                 DrawGrid(10, 1.0f); | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawText("Enemy: 100 / 100", (int)cubeScreenPosition.x - MeasureText("Enemy: 100/100", 20)/2, (int)cubeScreenPosition.y, 20, BLACK); | ||||||
|  |              | ||||||
|  |             DrawText(TextFormat("Cube position in screen space coordinates: [%i, %i]", (int)cubeScreenPosition.x, (int)cubeScreenPosition.y), 10, 10, 20, LIME); | ||||||
|  |             DrawText("Text 2d should be always on top of the cube", 10, 40, 20, GRAY); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,4 @@ | ||||||
|  | | resource      | author      | licence | notes | | ||||||
|  | | :------------ | :---------: | :------ | :---- | | ||||||
|  | | ps3.png       | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | - | | ||||||
|  | | xbox.png      | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | - | | ||||||
|  | @ -0,0 +1,52 @@ | ||||||
|  | #version 100 | ||||||
|  | 
 | ||||||
|  | precision mediump float; | ||||||
|  | 
 | ||||||
|  | // Input vertex attributes (from vertex shader) | ||||||
|  | varying vec2 fragTexCoord; | ||||||
|  | varying vec4 fragColor; | ||||||
|  | 
 | ||||||
|  | // Input uniform values | ||||||
|  | uniform sampler2D texture0; | ||||||
|  | uniform vec4 colDiffuse; | ||||||
|  | 
 | ||||||
|  | // NOTE: Add here your custom variables | ||||||
|  | uniform vec2 leftLensCenter; | ||||||
|  | uniform vec2 rightLensCenter; | ||||||
|  | uniform vec2 leftScreenCenter; | ||||||
|  | uniform vec2 rightScreenCenter; | ||||||
|  | uniform vec2 scale; | ||||||
|  | uniform vec2 scaleIn; | ||||||
|  | uniform vec4 deviceWarpParam; | ||||||
|  | uniform vec4 chromaAbParam; | ||||||
|  | 
 | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  |     // Compute lens distortion | ||||||
|  |     vec2 lensCenter = fragTexCoord.x < 0.5? leftLensCenter : rightLensCenter; | ||||||
|  |     vec2 screenCenter = fragTexCoord.x < 0.5? leftScreenCenter : rightScreenCenter; | ||||||
|  |     vec2 theta = (fragTexCoord - lensCenter)*scaleIn; | ||||||
|  |     float rSq = theta.x*theta.x + theta.y*theta.y; | ||||||
|  |     vec2 theta1 = theta*(deviceWarpParam.x + deviceWarpParam.y*rSq + deviceWarpParam.z*rSq*rSq + deviceWarpParam.w*rSq*rSq*rSq); | ||||||
|  |     vec2 thetaBlue = theta1*(chromaAbParam.z + chromaAbParam.w*rSq); | ||||||
|  |     vec2 tcBlue = lensCenter + scale*thetaBlue; | ||||||
|  | 
 | ||||||
|  |     if (any(bvec2(clamp(tcBlue, screenCenter - vec2(0.25, 0.5), screenCenter + vec2(0.25, 0.5)) - tcBlue))) | ||||||
|  |     { | ||||||
|  |         // Set black fragment for everything outside the lens border | ||||||
|  |         gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         // Compute color chroma aberration | ||||||
|  |         float blue = texture2D(texture0, tcBlue).b; | ||||||
|  |         vec2 tcGreen = lensCenter + scale*theta1; | ||||||
|  |         float green = texture2D(texture0, tcGreen).g; | ||||||
|  | 
 | ||||||
|  |         vec2 thetaRed = theta1*(chromaAbParam.x + chromaAbParam.y*rSq); | ||||||
|  |         vec2 tcRed = lensCenter + scale*thetaRed; | ||||||
|  | 
 | ||||||
|  |         float red = texture2D(texture0, tcRed).r; | ||||||
|  |         gl_FragColor = vec4(red, green, blue, 1.0); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,53 @@ | ||||||
|  | #version 330 | ||||||
|  | 
 | ||||||
|  | // Input vertex attributes (from vertex shader) | ||||||
|  | in vec2 fragTexCoord; | ||||||
|  | in vec4 fragColor; | ||||||
|  | 
 | ||||||
|  | // Input uniform values | ||||||
|  | uniform sampler2D texture0; | ||||||
|  | uniform vec4 colDiffuse; | ||||||
|  | 
 | ||||||
|  | // Output fragment color | ||||||
|  | out vec4 finalColor; | ||||||
|  | 
 | ||||||
|  | // NOTE: Add here your custom variables | ||||||
|  | uniform vec2 leftLensCenter = vec2(0.288, 0.5); | ||||||
|  | uniform vec2 rightLensCenter = vec2(0.712, 0.5); | ||||||
|  | uniform vec2 leftScreenCenter = vec2(0.25, 0.5); | ||||||
|  | uniform vec2 rightScreenCenter = vec2(0.75, 0.5); | ||||||
|  | uniform vec2 scale = vec2(0.25, 0.45); | ||||||
|  | uniform vec2 scaleIn = vec2(4, 2.2222); | ||||||
|  | uniform vec4 deviceWarpParam = vec4(1, 0.22, 0.24, 0); | ||||||
|  | uniform vec4 chromaAbParam = vec4(0.996, -0.004, 1.014, 0.0); | ||||||
|  | 
 | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  |     // Compute lens distortion | ||||||
|  |     vec2 lensCenter = fragTexCoord.x < 0.5? leftLensCenter : rightLensCenter; | ||||||
|  |     vec2 screenCenter = fragTexCoord.x < 0.5? leftScreenCenter : rightScreenCenter; | ||||||
|  |     vec2 theta = (fragTexCoord - lensCenter)*scaleIn; | ||||||
|  |     float rSq = theta.x*theta.x + theta.y*theta.y; | ||||||
|  |     vec2 theta1 = theta*(deviceWarpParam.x + deviceWarpParam.y*rSq + deviceWarpParam.z*rSq*rSq + deviceWarpParam.w*rSq*rSq*rSq); | ||||||
|  |     vec2 thetaBlue = theta1*(chromaAbParam.z + chromaAbParam.w*rSq); | ||||||
|  |     vec2 tcBlue = lensCenter + scale*thetaBlue; | ||||||
|  | 
 | ||||||
|  |     if (any(bvec2(clamp(tcBlue, screenCenter - vec2(0.25, 0.5), screenCenter + vec2(0.25, 0.5)) - tcBlue))) | ||||||
|  |     { | ||||||
|  |         // Set black fragment for everything outside the lens border | ||||||
|  |         finalColor = vec4(0.0, 0.0, 0.0, 1.0); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         // Compute color chroma aberration | ||||||
|  |         float blue = texture(texture0, tcBlue).b; | ||||||
|  |         vec2 tcGreen = lensCenter + scale*theta1; | ||||||
|  |         float green = texture(texture0, tcGreen).g; | ||||||
|  | 
 | ||||||
|  |         vec2 thetaRed = theta1*(chromaAbParam.x + chromaAbParam.y*rSq); | ||||||
|  |         vec2 tcRed = lensCenter + scale*thetaRed; | ||||||
|  | 
 | ||||||
|  |         float red = texture(texture0, tcRed).r; | ||||||
|  |         finalColor = vec4(red, green, blue, 1.0); | ||||||
|  |     } | ||||||
|  | } | ||||||
| After Width: | Height: | Size: 19 KiB | 
| After Width: | Height: | Size: 16 KiB | 
|  | @ -0,0 +1,111 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - Load 3d model with animations and play them | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 2.5, last time updated with raylib 3.5 | ||||||
|  | * | ||||||
|  | *   Example contributed by Culacant (@culacant) and reviewed by Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | *   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-2023 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" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - model animation"); | ||||||
|  | 
 | ||||||
|  |     // 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
 | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  | 
 | ||||||
|  |     // Load animation data
 | ||||||
|  |     unsigned int animsCount = 0; | ||||||
|  |     ModelAnimation *anims = LoadModelAnimations("resources/models/iqm/guyanim.iqm", &animsCount); | ||||||
|  |     int animFrameCounter = 0; | ||||||
|  | 
 | ||||||
|  |     DisableCursor();                    // Catch cursor
 | ||||||
|  |     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, CAMERA_FIRST_PERSON); | ||||||
|  | 
 | ||||||
|  |         // Play animation when spacebar is held down
 | ||||||
|  |         if (IsKeyDown(KEY_SPACE)) | ||||||
|  |         { | ||||||
|  |             animFrameCounter++; | ||||||
|  |             UpdateModelAnimation(model, anims[0], animFrameCounter); | ||||||
|  |             if (animFrameCounter >= anims[0].frameCount) animFrameCounter = 0; | ||||||
|  |         } | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 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.boneCount; i++) | ||||||
|  |                 { | ||||||
|  |                     DrawCube(anims[0].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, 10, 20, MAROON); | ||||||
|  |             DrawText("(c) Guy IQM 3D model by @culacant", screenWidth - 200, screenHeight - 20, 10, GRAY); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     UnloadTexture(texture);                     // Unload texture
 | ||||||
|  |     UnloadModelAnimations(anims, animsCount);   // Unload model animations data
 | ||||||
|  |     UnloadModel(model);                         // Unload model
 | ||||||
|  | 
 | ||||||
|  |     CloseWindow();                  // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,111 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - Drawing billboards | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.3, last time updated with raylib 3.5 | ||||||
|  | * | ||||||
|  | *   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) 2015-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | #include "raymath.h" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - drawing billboards"); | ||||||
|  | 
 | ||||||
|  |     // Define the camera to look into our 3d world
 | ||||||
|  |     Camera camera = { 0 }; | ||||||
|  |     camera.position = (Vector3){ 5.0f, 4.0f, 5.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
 | ||||||
|  | 
 | ||||||
|  |     Texture2D bill = LoadTexture("resources/billboard.png");    // Our billboard texture
 | ||||||
|  |     Vector3 billPositionStatic = { 0.0f, 2.0f, 0.0f };          // Position of static billboard
 | ||||||
|  |     Vector3 billPositionRotating = { 1.0f, 2.0f, 1.0f };        // Position of rotating billboard
 | ||||||
|  | 
 | ||||||
|  |     // Entire billboard texture, source is used to take a segment from a larger texture.
 | ||||||
|  |     Rectangle source = { 0.0f, 0.0f, (float)bill.width, (float)bill.height }; | ||||||
|  | 
 | ||||||
|  |     // NOTE: Billboard locked on axis-Y
 | ||||||
|  |     Vector3 billUp = { 0.0f, 1.0f, 0.0f }; | ||||||
|  | 
 | ||||||
|  |     // Rotate around origin
 | ||||||
|  |     // Here we choose to rotate around the image center
 | ||||||
|  |     // NOTE: (-1, 1) is the range where origin.x, origin.y is inside the texture
 | ||||||
|  |     Vector2 rotateOrigin = { 0.0f }; | ||||||
|  | 
 | ||||||
|  |     // Distance is needed for the correct billboard draw order
 | ||||||
|  |     // Larger distance (further away from the camera) should be drawn prior to smaller distance.
 | ||||||
|  |     float distanceStatic; | ||||||
|  |     float distanceRotating; | ||||||
|  |     float rotation = 0.0f; | ||||||
|  | 
 | ||||||
|  |     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, CAMERA_ORBITAL); | ||||||
|  | 
 | ||||||
|  |         rotation += 0.4f; | ||||||
|  |         distanceStatic = Vector3Distance(camera.position, billPositionStatic); | ||||||
|  |         distanceRotating = Vector3Distance(camera.position, billPositionRotating); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 DrawGrid(10, 1.0f);        // Draw a grid
 | ||||||
|  | 
 | ||||||
|  |                 // Draw order matters!
 | ||||||
|  |                 if (distanceStatic > distanceRotating)  | ||||||
|  |                 { | ||||||
|  |                     DrawBillboard(camera, bill, billPositionStatic, 2.0f, WHITE); | ||||||
|  |                     DrawBillboardPro(camera, bill, source, billPositionRotating, billUp, (Vector2) {1.0f, 1.0f}, rotateOrigin, rotation, WHITE); | ||||||
|  |                 }  | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     DrawBillboardPro(camera, bill, source, billPositionRotating, billUp, (Vector2) {1.0f, 1.0f}, rotateOrigin, rotation, WHITE); | ||||||
|  |                     DrawBillboard(camera, bill, billPositionStatic, 2.0f, WHITE); | ||||||
|  |                 } | ||||||
|  |                  | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawFPS(10, 10); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     UnloadTexture(bill);        // Unload texture
 | ||||||
|  | 
 | ||||||
|  |     CloseWindow();              // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,126 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - Detect basic 3d collisions (box vs sphere vs box) | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.3, last time updated with raylib 3.5 | ||||||
|  | * | ||||||
|  | *   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) 2015-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - box collisions"); | ||||||
|  | 
 | ||||||
|  |     // Define the camera to look into our 3d world
 | ||||||
|  |     Camera camera = { { 0.0f, 10.0f, 10.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f, 0 }; | ||||||
|  | 
 | ||||||
|  |     Vector3 playerPosition = { 0.0f, 1.0f, 2.0f }; | ||||||
|  |     Vector3 playerSize = { 1.0f, 2.0f, 1.0f }; | ||||||
|  |     Color playerColor = GREEN; | ||||||
|  | 
 | ||||||
|  |     Vector3 enemyBoxPos = { -4.0f, 1.0f, 0.0f }; | ||||||
|  |     Vector3 enemyBoxSize = { 2.0f, 2.0f, 2.0f }; | ||||||
|  | 
 | ||||||
|  |     Vector3 enemySpherePos = { 4.0f, 0.0f, 0.0f }; | ||||||
|  |     float enemySphereSize = 1.5f; | ||||||
|  | 
 | ||||||
|  |     bool collision = false; | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Move player
 | ||||||
|  |         if (IsKeyDown(KEY_RIGHT)) playerPosition.x += 0.2f; | ||||||
|  |         else if (IsKeyDown(KEY_LEFT)) playerPosition.x -= 0.2f; | ||||||
|  |         else if (IsKeyDown(KEY_DOWN)) playerPosition.z += 0.2f; | ||||||
|  |         else if (IsKeyDown(KEY_UP)) playerPosition.z -= 0.2f; | ||||||
|  | 
 | ||||||
|  |         collision = false; | ||||||
|  | 
 | ||||||
|  |         // Check collisions player vs enemy-box
 | ||||||
|  |         if (CheckCollisionBoxes( | ||||||
|  |             (BoundingBox){(Vector3){ playerPosition.x - playerSize.x/2, | ||||||
|  |                                      playerPosition.y - playerSize.y/2, | ||||||
|  |                                      playerPosition.z - playerSize.z/2 }, | ||||||
|  |                           (Vector3){ playerPosition.x + playerSize.x/2, | ||||||
|  |                                      playerPosition.y + playerSize.y/2, | ||||||
|  |                                      playerPosition.z + playerSize.z/2 }}, | ||||||
|  |             (BoundingBox){(Vector3){ enemyBoxPos.x - enemyBoxSize.x/2, | ||||||
|  |                                      enemyBoxPos.y - enemyBoxSize.y/2, | ||||||
|  |                                      enemyBoxPos.z - enemyBoxSize.z/2 }, | ||||||
|  |                           (Vector3){ enemyBoxPos.x + enemyBoxSize.x/2, | ||||||
|  |                                      enemyBoxPos.y + enemyBoxSize.y/2, | ||||||
|  |                                      enemyBoxPos.z + enemyBoxSize.z/2 }})) collision = true; | ||||||
|  | 
 | ||||||
|  |         // Check collisions player vs enemy-sphere
 | ||||||
|  |         if (CheckCollisionBoxSphere( | ||||||
|  |             (BoundingBox){(Vector3){ playerPosition.x - playerSize.x/2, | ||||||
|  |                                      playerPosition.y - playerSize.y/2, | ||||||
|  |                                      playerPosition.z - playerSize.z/2 }, | ||||||
|  |                           (Vector3){ playerPosition.x + playerSize.x/2, | ||||||
|  |                                      playerPosition.y + playerSize.y/2, | ||||||
|  |                                      playerPosition.z + playerSize.z/2 }}, | ||||||
|  |             enemySpherePos, enemySphereSize)) collision = true; | ||||||
|  | 
 | ||||||
|  |         if (collision) playerColor = RED; | ||||||
|  |         else playerColor = GREEN; | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 // Draw enemy-box
 | ||||||
|  |                 DrawCube(enemyBoxPos, enemyBoxSize.x, enemyBoxSize.y, enemyBoxSize.z, GRAY); | ||||||
|  |                 DrawCubeWires(enemyBoxPos, enemyBoxSize.x, enemyBoxSize.y, enemyBoxSize.z, DARKGRAY); | ||||||
|  | 
 | ||||||
|  |                 // Draw enemy-sphere
 | ||||||
|  |                 DrawSphere(enemySpherePos, enemySphereSize, GRAY); | ||||||
|  |                 DrawSphereWires(enemySpherePos, enemySphereSize, 16, 16, DARKGRAY); | ||||||
|  | 
 | ||||||
|  |                 // Draw player
 | ||||||
|  |                 DrawCubeV(playerPosition, playerSize, playerColor); | ||||||
|  | 
 | ||||||
|  |                 DrawGrid(10, 1.0f);        // Draw a grid
 | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawText("Move player with cursors to collide", 220, 40, 20, GRAY); | ||||||
|  | 
 | ||||||
|  |             DrawFPS(10, 10); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,95 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - Cubicmap loading and drawing | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.8, last time updated with raylib 3.5 | ||||||
|  | * | ||||||
|  | *   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) 2015-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - cubesmap loading and drawing"); | ||||||
|  | 
 | ||||||
|  |     // Define the camera to look into our 3d world
 | ||||||
|  |     Camera camera = { 0 }; | ||||||
|  |     camera.position = (Vector3){ 16.0f, 14.0f, 16.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 projection type
 | ||||||
|  | 
 | ||||||
|  |     Image image = LoadImage("resources/cubicmap.png");      // Load cubicmap image (RAM)
 | ||||||
|  |     Texture2D cubicmap = LoadTextureFromImage(image);       // Convert image to texture to display (VRAM)
 | ||||||
|  | 
 | ||||||
|  |     Mesh mesh = GenMeshCubicmap(image, (Vector3){ 1.0f, 1.0f, 1.0f }); | ||||||
|  |     Model model = LoadModelFromMesh(mesh); | ||||||
|  | 
 | ||||||
|  |     // NOTE: By default each cube is mapped to one part of texture atlas
 | ||||||
|  |     Texture2D texture = LoadTexture("resources/cubicmap_atlas.png");    // Load map texture
 | ||||||
|  |     model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture;    // Set map diffuse texture
 | ||||||
|  | 
 | ||||||
|  |     Vector3 mapPosition = { -16.0f, 0.0f, -8.0f };          // Set model position
 | ||||||
|  | 
 | ||||||
|  |     UnloadImage(image);     // Unload cubesmap image from RAM, already uploaded to VRAM
 | ||||||
|  | 
 | ||||||
|  |     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, CAMERA_ORBITAL); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 DrawModel(model, mapPosition, 1.0f, WHITE); | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawTextureEx(cubicmap, (Vector2){ screenWidth - cubicmap.width*4.0f - 20, 20.0f }, 0.0f, 4.0f, WHITE); | ||||||
|  |             DrawRectangleLines(screenWidth - cubicmap.width*4 - 20, 20, cubicmap.width*4, cubicmap.height*4, GREEN); | ||||||
|  | 
 | ||||||
|  |             DrawText("cubicmap image used to", 658, 90, 10, GRAY); | ||||||
|  |             DrawText("generate map 3d model", 658, 104, 10, GRAY); | ||||||
|  | 
 | ||||||
|  |             DrawFPS(10, 10); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     UnloadTexture(cubicmap);    // Unload cubicmap texture
 | ||||||
|  |     UnloadTexture(texture);     // Unload map texture
 | ||||||
|  |     UnloadModel(model);         // Unload map model
 | ||||||
|  | 
 | ||||||
|  |     CloseWindow();              // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,245 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - Draw textured cube | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 4.5, last time updated with raylib 4.5 | ||||||
|  | * | ||||||
|  | *   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) 2022-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | #include "rlgl.h"       // Required to define vertex data (immediate-mode style) | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Custom Functions Declaration
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float height, float length, Color color); // Draw cube textured
 | ||||||
|  | void DrawCubeTextureRec(Texture2D texture, Rectangle source, Vector3 position, float width, float height, float length, Color color); // Draw cube with a region of a texture
 | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - draw cube texture"); | ||||||
|  | 
 | ||||||
|  |     // Define the camera to look into our 3d world
 | ||||||
|  |     Camera camera = { 0 }; | ||||||
|  |     camera.position = (Vector3){ 0.0f, 10.0f, 10.0f }; | ||||||
|  |     camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; | ||||||
|  |     camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; | ||||||
|  |     camera.fovy = 45.0f; | ||||||
|  |     camera.projection = CAMERA_PERSPECTIVE; | ||||||
|  |      | ||||||
|  |     // Load texture to be applied to the cubes sides
 | ||||||
|  |     Texture2D texture = LoadTexture("resources/cubicmap_atlas.png"); | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         // TODO: Update your variables here
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 // Draw cube with an applied texture
 | ||||||
|  |                 DrawCubeTexture(texture, (Vector3){ -2.0f, 2.0f, 0.0f }, 2.0f, 4.0f, 2.0f, WHITE); | ||||||
|  | 
 | ||||||
|  |                 // Draw cube with an applied texture, but only a defined rectangle piece of the texture
 | ||||||
|  |                 DrawCubeTextureRec(texture, (Rectangle){ 0, texture.height/2, texture.width/2, texture.height/2 },  | ||||||
|  |                     (Vector3){ 2.0f, 1.0f, 0.0f }, 2.0f, 2.0f, 2.0f, WHITE); | ||||||
|  | 
 | ||||||
|  |                 DrawGrid(10, 1.0f);        // Draw a grid
 | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawFPS(10, 10); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     UnloadTexture(texture); // Unload texture
 | ||||||
|  |      | ||||||
|  |     CloseWindow();          // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Custom Functions Definition
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Draw cube textured
 | ||||||
|  | // NOTE: Cube position is the center position
 | ||||||
|  | void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float height, float length, Color color) | ||||||
|  | { | ||||||
|  |     float x = position.x; | ||||||
|  |     float y = position.y; | ||||||
|  |     float z = position.z; | ||||||
|  | 
 | ||||||
|  |     // Set desired texture to be enabled while drawing following vertex data
 | ||||||
|  |     rlSetTexture(texture.id); | ||||||
|  | 
 | ||||||
|  |     // Vertex data transformation can be defined with the commented lines,
 | ||||||
|  |     // but in this example we calculate the transformed vertex data directly when calling rlVertex3f()
 | ||||||
|  |     //rlPushMatrix();
 | ||||||
|  |         // NOTE: Transformation is applied in inverse order (scale -> rotate -> translate)
 | ||||||
|  |         //rlTranslatef(2.0f, 0.0f, 0.0f);
 | ||||||
|  |         //rlRotatef(45, 0, 1, 0);
 | ||||||
|  |         //rlScalef(2.0f, 2.0f, 2.0f);
 | ||||||
|  | 
 | ||||||
|  |         rlBegin(RL_QUADS); | ||||||
|  |             rlColor4ub(color.r, color.g, color.b, color.a); | ||||||
|  |             // Front Face
 | ||||||
|  |             rlNormal3f(0.0f, 0.0f, 1.0f);       // Normal Pointing Towards Viewer
 | ||||||
|  |             rlTexCoord2f(0.0f, 0.0f); rlVertex3f(x - width/2, y - height/2, z + length/2);  // Bottom Left Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(1.0f, 0.0f); rlVertex3f(x + width/2, y - height/2, z + length/2);  // Bottom Right Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(1.0f, 1.0f); rlVertex3f(x + width/2, y + height/2, z + length/2);  // Top Right Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(0.0f, 1.0f); rlVertex3f(x - width/2, y + height/2, z + length/2);  // Top Left Of The Texture and Quad
 | ||||||
|  |             // Back Face
 | ||||||
|  |             rlNormal3f(0.0f, 0.0f, - 1.0f);     // Normal Pointing Away From Viewer
 | ||||||
|  |             rlTexCoord2f(1.0f, 0.0f); rlVertex3f(x - width/2, y - height/2, z - length/2);  // Bottom Right Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(1.0f, 1.0f); rlVertex3f(x - width/2, y + height/2, z - length/2);  // Top Right Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(0.0f, 1.0f); rlVertex3f(x + width/2, y + height/2, z - length/2);  // Top Left Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(0.0f, 0.0f); rlVertex3f(x + width/2, y - height/2, z - length/2);  // Bottom Left Of The Texture and Quad
 | ||||||
|  |             // Top Face
 | ||||||
|  |             rlNormal3f(0.0f, 1.0f, 0.0f);       // Normal Pointing Up
 | ||||||
|  |             rlTexCoord2f(0.0f, 1.0f); rlVertex3f(x - width/2, y + height/2, z - length/2);  // Top Left Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(0.0f, 0.0f); rlVertex3f(x - width/2, y + height/2, z + length/2);  // Bottom Left Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(1.0f, 0.0f); rlVertex3f(x + width/2, y + height/2, z + length/2);  // Bottom Right Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(1.0f, 1.0f); rlVertex3f(x + width/2, y + height/2, z - length/2);  // Top Right Of The Texture and Quad
 | ||||||
|  |             // Bottom Face
 | ||||||
|  |             rlNormal3f(0.0f, - 1.0f, 0.0f);     // Normal Pointing Down
 | ||||||
|  |             rlTexCoord2f(1.0f, 1.0f); rlVertex3f(x - width/2, y - height/2, z - length/2);  // Top Right Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(0.0f, 1.0f); rlVertex3f(x + width/2, y - height/2, z - length/2);  // Top Left Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(0.0f, 0.0f); rlVertex3f(x + width/2, y - height/2, z + length/2);  // Bottom Left Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(1.0f, 0.0f); rlVertex3f(x - width/2, y - height/2, z + length/2);  // Bottom Right Of The Texture and Quad
 | ||||||
|  |             // Right face
 | ||||||
|  |             rlNormal3f(1.0f, 0.0f, 0.0f);       // Normal Pointing Right
 | ||||||
|  |             rlTexCoord2f(1.0f, 0.0f); rlVertex3f(x + width/2, y - height/2, z - length/2);  // Bottom Right Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(1.0f, 1.0f); rlVertex3f(x + width/2, y + height/2, z - length/2);  // Top Right Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(0.0f, 1.0f); rlVertex3f(x + width/2, y + height/2, z + length/2);  // Top Left Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(0.0f, 0.0f); rlVertex3f(x + width/2, y - height/2, z + length/2);  // Bottom Left Of The Texture and Quad
 | ||||||
|  |             // Left Face
 | ||||||
|  |             rlNormal3f( - 1.0f, 0.0f, 0.0f);    // Normal Pointing Left
 | ||||||
|  |             rlTexCoord2f(0.0f, 0.0f); rlVertex3f(x - width/2, y - height/2, z - length/2);  // Bottom Left Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(1.0f, 0.0f); rlVertex3f(x - width/2, y - height/2, z + length/2);  // Bottom Right Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(1.0f, 1.0f); rlVertex3f(x - width/2, y + height/2, z + length/2);  // Top Right Of The Texture and Quad
 | ||||||
|  |             rlTexCoord2f(0.0f, 1.0f); rlVertex3f(x - width/2, y + height/2, z - length/2);  // Top Left Of The Texture and Quad
 | ||||||
|  |         rlEnd(); | ||||||
|  |     //rlPopMatrix();
 | ||||||
|  | 
 | ||||||
|  |     rlSetTexture(0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Draw cube with texture piece applied to all faces
 | ||||||
|  | void DrawCubeTextureRec(Texture2D texture, Rectangle source, Vector3 position, float width, float height, float length, Color color) | ||||||
|  | { | ||||||
|  |     float x = position.x; | ||||||
|  |     float y = position.y; | ||||||
|  |     float z = position.z; | ||||||
|  |     float texWidth = (float)texture.width; | ||||||
|  |     float texHeight = (float)texture.height; | ||||||
|  | 
 | ||||||
|  |     // Set desired texture to be enabled while drawing following vertex data
 | ||||||
|  |     rlSetTexture(texture.id); | ||||||
|  | 
 | ||||||
|  |     // We calculate the normalized texture coordinates for the desired texture-source-rectangle
 | ||||||
|  |     // It means converting from (tex.width, tex.height) coordinates to [0.0f, 1.0f] equivalent 
 | ||||||
|  |     rlBegin(RL_QUADS); | ||||||
|  |         rlColor4ub(color.r, color.g, color.b, color.a); | ||||||
|  | 
 | ||||||
|  |         // Front face
 | ||||||
|  |         rlNormal3f(0.0f, 0.0f, 1.0f); | ||||||
|  |         rlTexCoord2f(source.x/texWidth, (source.y + source.height)/texHeight); | ||||||
|  |         rlVertex3f(x - width/2, y - height/2, z + length/2); | ||||||
|  |         rlTexCoord2f((source.x + source.width)/texWidth, (source.y + source.height)/texHeight); | ||||||
|  |         rlVertex3f(x + width/2, y - height/2, z + length/2); | ||||||
|  |         rlTexCoord2f((source.x + source.width)/texWidth, source.y/texHeight); | ||||||
|  |         rlVertex3f(x + width/2, y + height/2, z + length/2); | ||||||
|  |         rlTexCoord2f(source.x/texWidth, source.y/texHeight); | ||||||
|  |         rlVertex3f(x - width/2, y + height/2, z + length/2); | ||||||
|  | 
 | ||||||
|  |         // Back face
 | ||||||
|  |         rlNormal3f(0.0f, 0.0f, - 1.0f); | ||||||
|  |         rlTexCoord2f((source.x + source.width)/texWidth, (source.y + source.height)/texHeight); | ||||||
|  |         rlVertex3f(x - width/2, y - height/2, z - length/2); | ||||||
|  |         rlTexCoord2f((source.x + source.width)/texWidth, source.y/texHeight); | ||||||
|  |         rlVertex3f(x - width/2, y + height/2, z - length/2); | ||||||
|  |         rlTexCoord2f(source.x/texWidth, source.y/texHeight); | ||||||
|  |         rlVertex3f(x + width/2, y + height/2, z - length/2); | ||||||
|  |         rlTexCoord2f(source.x/texWidth, (source.y + source.height)/texHeight); | ||||||
|  |         rlVertex3f(x + width/2, y - height/2, z - length/2); | ||||||
|  | 
 | ||||||
|  |         // Top face
 | ||||||
|  |         rlNormal3f(0.0f, 1.0f, 0.0f); | ||||||
|  |         rlTexCoord2f(source.x/texWidth, source.y/texHeight); | ||||||
|  |         rlVertex3f(x - width/2, y + height/2, z - length/2); | ||||||
|  |         rlTexCoord2f(source.x/texWidth, (source.y + source.height)/texHeight); | ||||||
|  |         rlVertex3f(x - width/2, y + height/2, z + length/2); | ||||||
|  |         rlTexCoord2f((source.x + source.width)/texWidth, (source.y + source.height)/texHeight); | ||||||
|  |         rlVertex3f(x + width/2, y + height/2, z + length/2); | ||||||
|  |         rlTexCoord2f((source.x + source.width)/texWidth, source.y/texHeight); | ||||||
|  |         rlVertex3f(x + width/2, y + height/2, z - length/2); | ||||||
|  | 
 | ||||||
|  |         // Bottom face
 | ||||||
|  |         rlNormal3f(0.0f, - 1.0f, 0.0f); | ||||||
|  |         rlTexCoord2f((source.x + source.width)/texWidth, source.y/texHeight); | ||||||
|  |         rlVertex3f(x - width/2, y - height/2, z - length/2); | ||||||
|  |         rlTexCoord2f(source.x/texWidth, source.y/texHeight); | ||||||
|  |         rlVertex3f(x + width/2, y - height/2, z - length/2); | ||||||
|  |         rlTexCoord2f(source.x/texWidth, (source.y + source.height)/texHeight); | ||||||
|  |         rlVertex3f(x + width/2, y - height/2, z + length/2); | ||||||
|  |         rlTexCoord2f((source.x + source.width)/texWidth, (source.y + source.height)/texHeight); | ||||||
|  |         rlVertex3f(x - width/2, y - height/2, z + length/2); | ||||||
|  | 
 | ||||||
|  |         // Right face
 | ||||||
|  |         rlNormal3f(1.0f, 0.0f, 0.0f); | ||||||
|  |         rlTexCoord2f((source.x + source.width)/texWidth, (source.y + source.height)/texHeight); | ||||||
|  |         rlVertex3f(x + width/2, y - height/2, z - length/2); | ||||||
|  |         rlTexCoord2f((source.x + source.width)/texWidth, source.y/texHeight); | ||||||
|  |         rlVertex3f(x + width/2, y + height/2, z - length/2); | ||||||
|  |         rlTexCoord2f(source.x/texWidth, source.y/texHeight); | ||||||
|  |         rlVertex3f(x + width/2, y + height/2, z + length/2); | ||||||
|  |         rlTexCoord2f(source.x/texWidth, (source.y + source.height)/texHeight); | ||||||
|  |         rlVertex3f(x + width/2, y - height/2, z + length/2); | ||||||
|  | 
 | ||||||
|  |         // Left face
 | ||||||
|  |         rlNormal3f( - 1.0f, 0.0f, 0.0f); | ||||||
|  |         rlTexCoord2f(source.x/texWidth, (source.y + source.height)/texHeight); | ||||||
|  |         rlVertex3f(x - width/2, y - height/2, z - length/2); | ||||||
|  |         rlTexCoord2f((source.x + source.width)/texWidth, (source.y + source.height)/texHeight); | ||||||
|  |         rlVertex3f(x - width/2, y - height/2, z + length/2); | ||||||
|  |         rlTexCoord2f((source.x + source.width)/texWidth, source.y/texHeight); | ||||||
|  |         rlVertex3f(x - width/2, y + height/2, z + length/2); | ||||||
|  |         rlTexCoord2f(source.x/texWidth, source.y/texHeight); | ||||||
|  |         rlVertex3f(x - width/2, y + height/2, z - length/2); | ||||||
|  | 
 | ||||||
|  |     rlEnd(); | ||||||
|  | 
 | ||||||
|  |     rlSetTexture(0); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,133 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - first person maze | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 2.5, last time updated with raylib 3.5 | ||||||
|  | * | ||||||
|  | *   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-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | #include <stdlib.h>           // Required for: free() | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - first person maze"); | ||||||
|  | 
 | ||||||
|  |     // Define the camera to look into our 3d world
 | ||||||
|  |     Camera camera = { 0 }; | ||||||
|  |     camera.position = (Vector3){ 0.2f, 0.4f, 0.2f };    // Camera position
 | ||||||
|  |     camera.target = (Vector3){ 0.185f, 0.4f, 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
 | ||||||
|  |     Vector3 position = { 0.0f, 0.0f, 0.0f };            // Set model position
 | ||||||
|  | 
 | ||||||
|  |     Image imMap = LoadImage("resources/cubicmap.png");      // Load cubicmap image (RAM)
 | ||||||
|  |     Texture2D cubicmap = LoadTextureFromImage(imMap);       // Convert image to texture to display (VRAM)
 | ||||||
|  |     Mesh mesh = GenMeshCubicmap(imMap, (Vector3){ 1.0f, 1.0f, 1.0f }); | ||||||
|  |     Model model = LoadModelFromMesh(mesh); | ||||||
|  | 
 | ||||||
|  |     // NOTE: By default each cube is mapped to one part of texture atlas
 | ||||||
|  |     Texture2D texture = LoadTexture("resources/cubicmap_atlas.png");    // Load map texture
 | ||||||
|  |     model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture;    // Set map diffuse texture
 | ||||||
|  | 
 | ||||||
|  |     // Get map image data to be used for collision detection
 | ||||||
|  |     Color *mapPixels = LoadImageColors(imMap); | ||||||
|  |     UnloadImage(imMap);             // Unload image from RAM
 | ||||||
|  | 
 | ||||||
|  |     Vector3 mapPosition = { -16.0f, 0.0f, -8.0f };  // Set model position
 | ||||||
|  | 
 | ||||||
|  |     DisableCursor();                // Limit cursor to relative movement inside the window
 | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         Vector3 oldCamPos = camera.position;    // Store old camera position
 | ||||||
|  | 
 | ||||||
|  |         UpdateCamera(&camera, CAMERA_FIRST_PERSON); | ||||||
|  | 
 | ||||||
|  |         // Check player collision (we simplify to 2D collision detection)
 | ||||||
|  |         Vector2 playerPos = { camera.position.x, camera.position.z }; | ||||||
|  |         float playerRadius = 0.1f;  // Collision radius (player is modelled as a cilinder for collision)
 | ||||||
|  | 
 | ||||||
|  |         int playerCellX = (int)(playerPos.x - mapPosition.x + 0.5f); | ||||||
|  |         int playerCellY = (int)(playerPos.y - mapPosition.z + 0.5f); | ||||||
|  | 
 | ||||||
|  |         // Out-of-limits security check
 | ||||||
|  |         if (playerCellX < 0) playerCellX = 0; | ||||||
|  |         else if (playerCellX >= cubicmap.width) playerCellX = cubicmap.width - 1; | ||||||
|  | 
 | ||||||
|  |         if (playerCellY < 0) playerCellY = 0; | ||||||
|  |         else if (playerCellY >= cubicmap.height) playerCellY = cubicmap.height - 1; | ||||||
|  | 
 | ||||||
|  |         // Check map collisions using image data and player position
 | ||||||
|  |         // TODO: Improvement: Just check player surrounding cells for collision
 | ||||||
|  |         for (int y = 0; y < cubicmap.height; y++) | ||||||
|  |         { | ||||||
|  |             for (int x = 0; x < cubicmap.width; x++) | ||||||
|  |             { | ||||||
|  |                 if ((mapPixels[y*cubicmap.width + x].r == 255) &&       // Collision: white pixel, only check R channel
 | ||||||
|  |                     (CheckCollisionCircleRec(playerPos, playerRadius, | ||||||
|  |                     (Rectangle){ mapPosition.x - 0.5f + x*1.0f, mapPosition.z - 0.5f + y*1.0f, 1.0f, 1.0f }))) | ||||||
|  |                 { | ||||||
|  |                     // Collision detected, reset camera position
 | ||||||
|  |                     camera.position = oldCamPos; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  |                 DrawModel(model, mapPosition, 1.0f, WHITE);                     // Draw maze map
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawTextureEx(cubicmap, (Vector2){ GetScreenWidth() - cubicmap.width*4.0f - 20, 20.0f }, 0.0f, 4.0f, WHITE); | ||||||
|  |             DrawRectangleLines(GetScreenWidth() - cubicmap.width*4 - 20, 20, cubicmap.width*4, cubicmap.height*4, GREEN); | ||||||
|  | 
 | ||||||
|  |             // Draw player position radar
 | ||||||
|  |             DrawRectangle(GetScreenWidth() - cubicmap.width*4 - 20 + playerCellX*4, 20 + playerCellY*4, 4, 4, RED); | ||||||
|  | 
 | ||||||
|  |             DrawFPS(10, 10); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     UnloadImageColors(mapPixels);   // Unload color array
 | ||||||
|  | 
 | ||||||
|  |     UnloadTexture(cubicmap);        // Unload cubicmap texture
 | ||||||
|  |     UnloadTexture(texture);         // Unload map texture
 | ||||||
|  |     UnloadModel(model);             // Unload map model
 | ||||||
|  | 
 | ||||||
|  |     CloseWindow();                  // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,88 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - Draw some basic geometric shapes (cube, sphere, cylinder...) | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.0, last time updated with raylib 3.5 | ||||||
|  | * | ||||||
|  | *   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) 2014-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - geometric shapes"); | ||||||
|  | 
 | ||||||
|  |     // Define the camera to look into our 3d world
 | ||||||
|  |     Camera camera = { 0 }; | ||||||
|  |     camera.position = (Vector3){ 0.0f, 10.0f, 10.0f }; | ||||||
|  |     camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; | ||||||
|  |     camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; | ||||||
|  |     camera.fovy = 45.0f; | ||||||
|  |     camera.projection = CAMERA_PERSPECTIVE; | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         // TODO: Update your variables here
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 DrawCube((Vector3){-4.0f, 0.0f, 2.0f}, 2.0f, 5.0f, 2.0f, RED); | ||||||
|  |                 DrawCubeWires((Vector3){-4.0f, 0.0f, 2.0f}, 2.0f, 5.0f, 2.0f, GOLD); | ||||||
|  |                 DrawCubeWires((Vector3){-4.0f, 0.0f, -2.0f}, 3.0f, 6.0f, 2.0f, MAROON); | ||||||
|  | 
 | ||||||
|  |                 DrawSphere((Vector3){-1.0f, 0.0f, -2.0f}, 1.0f, GREEN); | ||||||
|  |                 DrawSphereWires((Vector3){1.0f, 0.0f, 2.0f}, 2.0f, 16, 16, LIME); | ||||||
|  | 
 | ||||||
|  |                 DrawCylinder((Vector3){4.0f, 0.0f, -2.0f}, 1.0f, 2.0f, 3.0f, 4, SKYBLUE); | ||||||
|  |                 DrawCylinderWires((Vector3){4.0f, 0.0f, -2.0f}, 1.0f, 2.0f, 3.0f, 4, DARKBLUE); | ||||||
|  |                 DrawCylinderWires((Vector3){4.5f, -1.0f, 2.0f}, 1.0f, 1.0f, 2.0f, 6, BROWN); | ||||||
|  | 
 | ||||||
|  |                 DrawCylinder((Vector3){1.0f, 0.0f, -4.0f}, 0.0f, 1.5f, 3.0f, 8, GOLD); | ||||||
|  |                 DrawCylinderWires((Vector3){1.0f, 0.0f, -4.0f}, 0.0f, 1.5f, 3.0f, 8, PINK); | ||||||
|  | 
 | ||||||
|  |                 DrawCapsule     ((Vector3){-3.0f, 1.5f, -4.0f}, (Vector3){-4.0f, -1.0f, -4.0f}, 1.2f, 8, 8, VIOLET); | ||||||
|  |                 DrawCapsuleWires((Vector3){-3.0f, 1.5f, -4.0f}, (Vector3){-4.0f, -1.0f, -4.0f}, 1.2f, 8, 8, PURPLE); | ||||||
|  | 
 | ||||||
|  |                 DrawGrid(10, 1.0f);        // Draw a grid
 | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawFPS(10, 10); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,90 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - Heightmap loading and drawing | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.8, last time updated with raylib 3.5 | ||||||
|  | * | ||||||
|  | *   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) 2015-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - heightmap loading and drawing"); | ||||||
|  | 
 | ||||||
|  |     // Define our custom camera to look into our 3d world
 | ||||||
|  |     Camera camera = { 0 }; | ||||||
|  |     camera.position = (Vector3){ 18.0f, 21.0f, 18.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 projection type
 | ||||||
|  | 
 | ||||||
|  |     Image image = LoadImage("resources/heightmap.png");     // Load heightmap image (RAM)
 | ||||||
|  |     Texture2D texture = LoadTextureFromImage(image);        // Convert image to texture (VRAM)
 | ||||||
|  | 
 | ||||||
|  |     Mesh mesh = GenMeshHeightmap(image, (Vector3){ 16, 8, 16 }); // Generate heightmap mesh (RAM and VRAM)
 | ||||||
|  |     Model model = LoadModelFromMesh(mesh);                  // Load model from generated mesh
 | ||||||
|  | 
 | ||||||
|  |     model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture; // Set map diffuse texture
 | ||||||
|  |     Vector3 mapPosition = { -8.0f, 0.0f, -8.0f };           // Define model position
 | ||||||
|  | 
 | ||||||
|  |     UnloadImage(image);             // Unload heightmap image from RAM, already uploaded to VRAM
 | ||||||
|  | 
 | ||||||
|  |     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, CAMERA_ORBITAL); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 DrawModel(model, mapPosition, 1.0f, RED); | ||||||
|  | 
 | ||||||
|  |                 DrawGrid(20, 1.0f); | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawTexture(texture, screenWidth - texture.width - 20, 20, WHITE); | ||||||
|  |             DrawRectangleLines(screenWidth - texture.width - 20, 20, texture.width, texture.height, GREEN); | ||||||
|  | 
 | ||||||
|  |             DrawFPS(10, 10); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     UnloadTexture(texture);     // Unload texture
 | ||||||
|  |     UnloadModel(model);         // Unload model
 | ||||||
|  | 
 | ||||||
|  |     CloseWindow();              // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,153 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - Models loading | ||||||
|  | * | ||||||
|  | *   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. | ||||||
|  | *     - IQM  > Binary file format. Includes mesh vertex data but also animation data, | ||||||
|  | *              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 | ||||||
|  | * | ||||||
|  | *   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) 2014-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - models loading"); | ||||||
|  | 
 | ||||||
|  |     // 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.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
 | ||||||
|  | 
 | ||||||
|  |     Model model = LoadModel("resources/models/obj/castle.obj");                 // Load model
 | ||||||
|  |     Texture2D texture = LoadTexture("resources/models/obj/castle_diffuse.png"); // Load model texture
 | ||||||
|  |     model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture;            // Set map diffuse texture
 | ||||||
|  | 
 | ||||||
|  |     Vector3 position = { 0.0f, 0.0f, 0.0f };                    // Set model position
 | ||||||
|  | 
 | ||||||
|  |     BoundingBox bounds = GetMeshBoundingBox(model.meshes[0]);   // Set model bounds
 | ||||||
|  | 
 | ||||||
|  |     // NOTE: bounds are calculated from the original size of the model,
 | ||||||
|  |     // if model is scaled on drawing, bounds must be also scaled
 | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     // Main game loop
 | ||||||
|  |     while (!WindowShouldClose())    // Detect window close button or ESC key
 | ||||||
|  |     { | ||||||
|  |         // Update
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         UpdateCamera(&camera, CAMERA_FIRST_PERSON); | ||||||
|  | 
 | ||||||
|  |         // Load new models/textures on drag&drop
 | ||||||
|  |         if (IsFileDropped()) | ||||||
|  |         { | ||||||
|  |             FilePathList droppedFiles = LoadDroppedFiles(); | ||||||
|  | 
 | ||||||
|  |             if (droppedFiles.count == 1) // Only support one file dropped
 | ||||||
|  |             { | ||||||
|  |                 if (IsFileExtension(droppedFiles.paths[0], ".obj") || | ||||||
|  |                     IsFileExtension(droppedFiles.paths[0], ".gltf") || | ||||||
|  |                     IsFileExtension(droppedFiles.paths[0], ".glb") || | ||||||
|  |                     IsFileExtension(droppedFiles.paths[0], ".vox") || | ||||||
|  |                     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
 | ||||||
|  |                     model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture; // Set current map diffuse texture
 | ||||||
|  | 
 | ||||||
|  |                     bounds = GetMeshBoundingBox(model.meshes[0]); | ||||||
|  | 
 | ||||||
|  |                     // TODO: Move camera position from target enough distance to visualize model properly
 | ||||||
|  |                 } | ||||||
|  |                 else if (IsFileExtension(droppedFiles.paths[0], ".png"))  // Texture file formats supported
 | ||||||
|  |                 { | ||||||
|  |                     // Unload current model texture and load new one
 | ||||||
|  |                     UnloadTexture(texture); | ||||||
|  |                     texture = LoadTexture(droppedFiles.paths[0]); | ||||||
|  |                     model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             UnloadDroppedFiles(droppedFiles);    // Unload filepaths from memory
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Select model on mouse click
 | ||||||
|  |         if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) | ||||||
|  |         { | ||||||
|  |             // Check collision between ray and box
 | ||||||
|  |             if (GetRayCollisionBox(GetMouseRay(GetMousePosition(), camera), bounds).hit) selected = !selected; | ||||||
|  |             else selected = false; | ||||||
|  |         } | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 DrawModel(model, position, 1.0f, WHITE);        // Draw 3d model with texture
 | ||||||
|  | 
 | ||||||
|  |                 DrawGrid(20, 10.0f);         // Draw a grid
 | ||||||
|  | 
 | ||||||
|  |                 if (selected) DrawBoundingBox(bounds, GREEN);   // Draw selection box
 | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawText("Drag & drop model to load mesh/texture.", 10, GetScreenHeight() - 20, 10, DARKGRAY); | ||||||
|  |             if (selected) DrawText("MODEL SELECTED", GetScreenWidth() - 110, 10, 10, GREEN); | ||||||
|  | 
 | ||||||
|  |             DrawText("(c) Castle 3D model by Alberto Cano", screenWidth - 200, screenHeight - 20, 10, GRAY); | ||||||
|  | 
 | ||||||
|  |             DrawFPS(10, 10); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     UnloadTexture(texture);     // Unload texture
 | ||||||
|  |     UnloadModel(model);         // Unload model
 | ||||||
|  | 
 | ||||||
|  |     CloseWindow();              // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,102 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - loading gltf with animations | ||||||
|  | * | ||||||
|  | *   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) | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 3.7, last time updated with raylib 4.2 | ||||||
|  | * | ||||||
|  | *   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) 2020-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - loading gltf"); | ||||||
|  | 
 | ||||||
|  |     // 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.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 model = LoadModel("resources/models/gltf/robot.glb"); | ||||||
|  |      | ||||||
|  |     // Load gltf model animations
 | ||||||
|  |     unsigned int animsCount = 0; | ||||||
|  |     unsigned int animIndex = 0; | ||||||
|  |     unsigned int animCurrentFrame = 0; | ||||||
|  |     ModelAnimation *modelAnimations = LoadModelAnimations("resources/models/gltf/robot.glb", &animsCount); | ||||||
|  | 
 | ||||||
|  |     Vector3 position = { 0.0f, 0.0f, 0.0f };    // Set model position
 | ||||||
|  | 
 | ||||||
|  |     DisableCursor();                    // Limit cursor to relative movement inside the window
 | ||||||
|  | 
 | ||||||
|  |     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, CAMERA_THIRD_PERSON); | ||||||
|  |         // Select current animation
 | ||||||
|  |         if (IsKeyPressed(KEY_UP)) animIndex = (animIndex + 1)%animsCount; | ||||||
|  |         else if (IsKeyPressed(KEY_DOWN)) animIndex = (animIndex + animsCount - 1)%animsCount; | ||||||
|  |          | ||||||
|  |         // Update model animation
 | ||||||
|  |         ModelAnimation anim = modelAnimations[animIndex]; | ||||||
|  |         animCurrentFrame = (animCurrentFrame + 1)%anim.frameCount; | ||||||
|  |         UpdateModelAnimation(model, anim, animCurrentFrame); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 DrawModel(model, position, 1.0f, WHITE);    // Draw animated model
 | ||||||
|  |                 DrawGrid(10, 1.0f); | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawText("Use the UP/DOWN arrow keys to switch animation", 10, 10, 20, GRAY); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     UnloadModel(model);         // Unload model and meshes/material
 | ||||||
|  | 
 | ||||||
|  |     CloseWindow();              // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,173 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - Load models M3D | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 4.5, last time updated with raylib 4.5 | ||||||
|  | * | ||||||
|  | *   Example contributed by bzt (@bztsrc) and reviewed by Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | *   NOTES: | ||||||
|  | *     - Model3D (M3D) fileformat specs: https://gitlab.com/bztsrc/model3d
 | ||||||
|  | *     - Bender M3D exported: https://gitlab.com/bztsrc/model3d/-/tree/master/blender
 | ||||||
|  | * | ||||||
|  | *   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) 2022-2023 bzt (@bztsrc) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - M3D model loading"); | ||||||
|  | 
 | ||||||
|  |     // Define the camera to look into our 3d world
 | ||||||
|  |     Camera camera = { 0 }; | ||||||
|  |     camera.position = (Vector3){ 1.5f, 1.5f, 1.5f };    // Camera position
 | ||||||
|  |     camera.target = (Vector3){ 0.0f, 0.4f, 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
 | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  | 
 | ||||||
|  |     // Load animations
 | ||||||
|  |     unsigned int animsCount = 0; | ||||||
|  |     int animFrameCounter = 0, animId = 0; | ||||||
|  |     ModelAnimation *anims = LoadModelAnimations(modelFileName, &animsCount); // Load skeletal animation data
 | ||||||
|  | 
 | ||||||
|  |     DisableCursor();                    // Limit cursor to relative movement inside the window
 | ||||||
|  | 
 | ||||||
|  |     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, CAMERA_FIRST_PERSON); | ||||||
|  | 
 | ||||||
|  |         if (animsCount) | ||||||
|  |         { | ||||||
|  |             // Play animation when spacebar is held down (or step one frame with N)
 | ||||||
|  |             if (IsKeyDown(KEY_SPACE) || IsKeyPressed(KEY_N)) | ||||||
|  |             { | ||||||
|  |                 animFrameCounter++; | ||||||
|  |                  | ||||||
|  |                 if (animFrameCounter >= anims[animId].frameCount) animFrameCounter = 0; | ||||||
|  |                  | ||||||
|  |                 UpdateModelAnimation(model, anims[animId], animFrameCounter); | ||||||
|  |                 animPlaying = true; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             // Select animation by pressing A
 | ||||||
|  |             if (IsKeyPressed(KEY_A)) | ||||||
|  |             { | ||||||
|  |                 animFrameCounter = 0; | ||||||
|  |                 animId++; | ||||||
|  |                  | ||||||
|  |                 if (animId >= animsCount) animId = 0; | ||||||
|  |                 UpdateModelAnimation(model, anims[animId], 0); | ||||||
|  |                 animPlaying = true; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Toggle skeleton drawing
 | ||||||
|  |         if (IsKeyPressed(KEY_S)) drawSkeleton ^= 1; | ||||||
|  | 
 | ||||||
|  |         // Toggle mesh drawing
 | ||||||
|  |         if (IsKeyPressed(KEY_M)) drawMesh ^= 1; | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 // Draw 3d model with texture
 | ||||||
|  |                 if (drawMesh) DrawModel(model, position, 1.0f, WHITE); | ||||||
|  | 
 | ||||||
|  |                 // Draw the animated skeleton
 | ||||||
|  |                 if (drawSkeleton) | ||||||
|  |                 { | ||||||
|  |                     // 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); | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 DrawGrid(10, 1.0f);         // Draw a grid
 | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawText("PRESS SPACE to PLAY MODEL ANIMATION", 10, GetScreenHeight() - 60, 10, MAROON); | ||||||
|  |             DrawText("PRESS A to CYCLE THROUGH ANIMATIONS", 10, GetScreenHeight() - 40, 10, DARKGRAY); | ||||||
|  |             DrawText("PRESS M to toggle MESH, S to toggle SKELETON DRAWING", 10, GetScreenHeight() - 20, 10, DARKGRAY); | ||||||
|  |             DrawText("(c) CesiumMan model by KhronosGroup", GetScreenWidth() - 210, GetScreenHeight() - 20, 10, GRAY); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     // Unload model animations data
 | ||||||
|  |     UnloadModelAnimations(anims, animsCount); | ||||||
|  | 
 | ||||||
|  |     UnloadModel(model);         // Unload model
 | ||||||
|  | 
 | ||||||
|  |     CloseWindow();              // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,133 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - Load models vox (MagicaVoxel) | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 4.0, last time updated with raylib 4.0 | ||||||
|  | * | ||||||
|  | *   Example contributed by Johann Nadalutti (@procfxgen) and reviewed by Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | *   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) 2021-2023 Johann Nadalutti (@procfxgen) and Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | #include "raymath.h"        // Required for: MatrixTranslate() | ||||||
|  | 
 | ||||||
|  | #define MAX_VOX_FILES  3 | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     const char *voxFileNames[] = { | ||||||
|  |         "resources/models/vox/chr_knight.vox", | ||||||
|  |         "resources/models/vox/chr_sword.vox", | ||||||
|  |         "resources/models/vox/monu9.vox" | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - magicavoxel loading"); | ||||||
|  | 
 | ||||||
|  |     // 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 projection type
 | ||||||
|  | 
 | ||||||
|  |     // Load MagicaVoxel files
 | ||||||
|  |     Model models[MAX_VOX_FILES] = { 0 }; | ||||||
|  | 
 | ||||||
|  |     for (int i = 0; i < MAX_VOX_FILES; i++) | ||||||
|  |     { | ||||||
|  |         // Load VOX file and measure time
 | ||||||
|  |         double t0 = GetTime()*1000.0; | ||||||
|  |         models[i] = LoadModel(voxFileNames[i]); | ||||||
|  |         double t1 = GetTime()*1000.0; | ||||||
|  | 
 | ||||||
|  |         TraceLog(LOG_WARNING, TextFormat("[%s] File loaded in %.3f ms", voxFileNames[i], t1 - t0)); | ||||||
|  | 
 | ||||||
|  |         // Compute model translation matrix to center model on draw position (0, 0 , 0)
 | ||||||
|  |         BoundingBox bb = GetModelBoundingBox(models[i]); | ||||||
|  |         Vector3 center = { 0 }; | ||||||
|  |         center.x = bb.min.x  + (((bb.max.x - bb.min.x)/2)); | ||||||
|  |         center.z = bb.min.z  + (((bb.max.z - bb.min.z)/2)); | ||||||
|  | 
 | ||||||
|  |         Matrix matTranslate = MatrixTranslate(-center.x, 0, -center.z); | ||||||
|  |         models[i].transform = matTranslate; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     int currentModel = 0; | ||||||
|  | 
 | ||||||
|  |     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, CAMERA_ORBITAL); | ||||||
|  | 
 | ||||||
|  |         // Cycle between models on mouse click
 | ||||||
|  |         if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) currentModel = (currentModel + 1)%MAX_VOX_FILES; | ||||||
|  | 
 | ||||||
|  |         // Cycle between models on key pressed
 | ||||||
|  |         if (IsKeyPressed(KEY_RIGHT)) | ||||||
|  |         { | ||||||
|  |             currentModel++; | ||||||
|  |             if (currentModel >= MAX_VOX_FILES) currentModel = 0; | ||||||
|  |         } | ||||||
|  |         else if (IsKeyPressed(KEY_LEFT)) | ||||||
|  |         { | ||||||
|  |             currentModel--; | ||||||
|  |             if (currentModel < 0) currentModel = MAX_VOX_FILES - 1; | ||||||
|  |         } | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             // Draw 3D model
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 DrawModel(models[currentModel], (Vector3){ 0, 0, 0 }, 1.0f, WHITE); | ||||||
|  |                 DrawGrid(10, 1.0); | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             // Display info
 | ||||||
|  |             DrawRectangle(10, 400, 310, 30, Fade(SKYBLUE, 0.5f)); | ||||||
|  |             DrawRectangleLines(10, 400, 310, 30, Fade(DARKBLUE, 0.5f)); | ||||||
|  |             DrawText("MOUSE LEFT BUTTON to CYCLE VOX MODELS", 40, 410, 10, BLUE); | ||||||
|  |             DrawText(TextFormat("File: %s", GetFileName(voxFileNames[currentModel])), 10, 10, 20, GRAY); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     // Unload models data (GPU VRAM)
 | ||||||
|  |     for (int i = 0; i < MAX_VOX_FILES; i++) UnloadModel(models[i]); | ||||||
|  | 
 | ||||||
|  |     CloseWindow();          // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @ -0,0 +1,190 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib example - procedural mesh generation | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.8, last time updated with raylib 4.0 | ||||||
|  | * | ||||||
|  | *   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) 2017-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | #define NUM_MODELS  9               // Parametric 3d shapes to generate
 | ||||||
|  | 
 | ||||||
|  | static Mesh GenMeshCustom(void);    // Generate a simple triangle mesh from code
 | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - mesh generation"); | ||||||
|  | 
 | ||||||
|  |     // We generate a checked image for texturing
 | ||||||
|  |     Image checked = GenImageChecked(2, 2, 1, 1, RED, GREEN); | ||||||
|  |     Texture2D texture = LoadTextureFromImage(checked); | ||||||
|  |     UnloadImage(checked); | ||||||
|  | 
 | ||||||
|  |     Model models[NUM_MODELS] = { 0 }; | ||||||
|  | 
 | ||||||
|  |     models[0] = LoadModelFromMesh(GenMeshPlane(2, 2, 5, 5)); | ||||||
|  |     models[1] = LoadModelFromMesh(GenMeshCube(2.0f, 1.0f, 2.0f)); | ||||||
|  |     models[2] = LoadModelFromMesh(GenMeshSphere(2, 32, 32)); | ||||||
|  |     models[3] = LoadModelFromMesh(GenMeshHemiSphere(2, 16, 16)); | ||||||
|  |     models[4] = LoadModelFromMesh(GenMeshCylinder(1, 2, 16)); | ||||||
|  |     models[5] = LoadModelFromMesh(GenMeshTorus(0.25f, 4.0f, 16, 32)); | ||||||
|  |     models[6] = LoadModelFromMesh(GenMeshKnot(1.0f, 2.0f, 16, 128)); | ||||||
|  |     models[7] = LoadModelFromMesh(GenMeshPoly(5, 2.0f)); | ||||||
|  |     models[8] = LoadModelFromMesh(GenMeshCustom()); | ||||||
|  |      | ||||||
|  |     // Generated meshes could be exported as .obj files
 | ||||||
|  |     //ExportMesh(models[0].meshes[0], "plane.obj");
 | ||||||
|  |     //ExportMesh(models[1].meshes[0], "cube.obj");
 | ||||||
|  |     //ExportMesh(models[2].meshes[0], "sphere.obj");
 | ||||||
|  |     //ExportMesh(models[3].meshes[0], "hemisphere.obj");
 | ||||||
|  |     //ExportMesh(models[4].meshes[0], "cylinder.obj");
 | ||||||
|  |     //ExportMesh(models[5].meshes[0], "torus.obj");
 | ||||||
|  |     //ExportMesh(models[6].meshes[0], "knot.obj");
 | ||||||
|  |     //ExportMesh(models[7].meshes[0], "poly.obj");
 | ||||||
|  |     //ExportMesh(models[8].meshes[0], "custom.obj");
 | ||||||
|  | 
 | ||||||
|  |     // Set checked texture as default diffuse component for all models material
 | ||||||
|  |     for (int i = 0; i < NUM_MODELS; i++) models[i].materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture; | ||||||
|  | 
 | ||||||
|  |     // Define the camera to look into our 3d world
 | ||||||
|  |     Camera camera = { { 5.0f, 5.0f, 5.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f, 0 }; | ||||||
|  | 
 | ||||||
|  |     // Model drawing position
 | ||||||
|  |     Vector3 position = { 0.0f, 0.0f, 0.0f }; | ||||||
|  | 
 | ||||||
|  |     int currentModel = 0; | ||||||
|  | 
 | ||||||
|  |     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, CAMERA_ORBITAL); | ||||||
|  | 
 | ||||||
|  |         if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) | ||||||
|  |         { | ||||||
|  |             currentModel = (currentModel + 1)%NUM_MODELS; // Cycle between the textures
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (IsKeyPressed(KEY_RIGHT)) | ||||||
|  |         { | ||||||
|  |             currentModel++; | ||||||
|  |             if (currentModel >= NUM_MODELS) currentModel = 0; | ||||||
|  |         } | ||||||
|  |         else if (IsKeyPressed(KEY_LEFT)) | ||||||
|  |         { | ||||||
|  |             currentModel--; | ||||||
|  |             if (currentModel < 0) currentModel = NUM_MODELS - 1; | ||||||
|  |         } | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                DrawModel(models[currentModel], position, 1.0f, WHITE); | ||||||
|  |                DrawGrid(10, 1.0); | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawRectangle(30, 400, 310, 30, Fade(SKYBLUE, 0.5f)); | ||||||
|  |             DrawRectangleLines(30, 400, 310, 30, Fade(DARKBLUE, 0.5f)); | ||||||
|  |             DrawText("MOUSE LEFT BUTTON to CYCLE PROCEDURAL MODELS", 40, 410, 10, BLUE); | ||||||
|  | 
 | ||||||
|  |             switch(currentModel) | ||||||
|  |             { | ||||||
|  |                 case 0: DrawText("PLANE", 680, 10, 20, DARKBLUE); break; | ||||||
|  |                 case 1: DrawText("CUBE", 680, 10, 20, DARKBLUE); break; | ||||||
|  |                 case 2: DrawText("SPHERE", 680, 10, 20, DARKBLUE); break; | ||||||
|  |                 case 3: DrawText("HEMISPHERE", 640, 10, 20, DARKBLUE); break; | ||||||
|  |                 case 4: DrawText("CYLINDER", 680, 10, 20, DARKBLUE); break; | ||||||
|  |                 case 5: DrawText("TORUS", 680, 10, 20, DARKBLUE); break; | ||||||
|  |                 case 6: DrawText("KNOT", 680, 10, 20, DARKBLUE); break; | ||||||
|  |                 case 7: DrawText("POLY", 680, 10, 20, DARKBLUE); break; | ||||||
|  |                 case 8: DrawText("Custom (triangle)", 580, 10, 20, DARKBLUE); break; | ||||||
|  |                 default: break; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     UnloadTexture(texture); // Unload texture
 | ||||||
|  | 
 | ||||||
|  |     // Unload models data (GPU VRAM)
 | ||||||
|  |     for (int i = 0; i < NUM_MODELS; i++) UnloadModel(models[i]); | ||||||
|  | 
 | ||||||
|  |     CloseWindow();          // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Generate a simple triangle mesh from code
 | ||||||
|  | static Mesh GenMeshCustom(void) | ||||||
|  | { | ||||||
|  |     Mesh mesh = { 0 }; | ||||||
|  |     mesh.triangleCount = 1; | ||||||
|  |     mesh.vertexCount = mesh.triangleCount*3; | ||||||
|  |     mesh.vertices = (float *)MemAlloc(mesh.vertexCount*3*sizeof(float));    // 3 vertices, 3 coordinates each (x, y, z)
 | ||||||
|  |     mesh.texcoords = (float *)MemAlloc(mesh.vertexCount*2*sizeof(float));   // 3 vertices, 2 coordinates each (x, y)
 | ||||||
|  |     mesh.normals = (float *)MemAlloc(mesh.vertexCount*3*sizeof(float));     // 3 vertices, 3 coordinates each (x, y, z)
 | ||||||
|  | 
 | ||||||
|  |     // Vertex at (0, 0, 0)
 | ||||||
|  |     mesh.vertices[0] = 0; | ||||||
|  |     mesh.vertices[1] = 0; | ||||||
|  |     mesh.vertices[2] = 0; | ||||||
|  |     mesh.normals[0] = 0; | ||||||
|  |     mesh.normals[1] = 1; | ||||||
|  |     mesh.normals[2] = 0; | ||||||
|  |     mesh.texcoords[0] = 0; | ||||||
|  |     mesh.texcoords[1] = 0; | ||||||
|  | 
 | ||||||
|  |     // Vertex at (1, 0, 2)
 | ||||||
|  |     mesh.vertices[3] = 1; | ||||||
|  |     mesh.vertices[4] = 0; | ||||||
|  |     mesh.vertices[5] = 2; | ||||||
|  |     mesh.normals[3] = 0; | ||||||
|  |     mesh.normals[4] = 1; | ||||||
|  |     mesh.normals[5] = 0; | ||||||
|  |     mesh.texcoords[2] = 0.5f; | ||||||
|  |     mesh.texcoords[3] = 1.0f; | ||||||
|  | 
 | ||||||
|  |     // Vertex at (2, 0, 0)
 | ||||||
|  |     mesh.vertices[6] = 2; | ||||||
|  |     mesh.vertices[7] = 0; | ||||||
|  |     mesh.vertices[8] = 0; | ||||||
|  |     mesh.normals[6] = 0; | ||||||
|  |     mesh.normals[7] = 1; | ||||||
|  |     mesh.normals[8] = 0; | ||||||
|  |     mesh.texcoords[4] = 1; | ||||||
|  |     mesh.texcoords[5] =0; | ||||||
|  | 
 | ||||||
|  |     // Upload mesh data from CPU (RAM) to GPU (VRAM) memory
 | ||||||
|  |     UploadMesh(&mesh, false); | ||||||
|  | 
 | ||||||
|  |     return mesh; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,246 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - Mesh picking in 3d mode, ground plane, triangle, mesh | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.7, last time updated with raylib 4.0 | ||||||
|  | * | ||||||
|  | *   Example contributed by Joel Davis (@joeld42) and reviewed by Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | *   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) 2017-2023 Joel Davis (@joeld42) and Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | #include "raymath.h" | ||||||
|  | 
 | ||||||
|  | #define FLT_MAX     340282346638528859811704183484516925440.0f     // Maximum value of a float, from bit pattern 01111111011111111111111111111111
 | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - mesh picking"); | ||||||
|  | 
 | ||||||
|  |     // Define the camera to look into our 3d world
 | ||||||
|  |     Camera camera = { 0 }; | ||||||
|  |     camera.position = (Vector3){ 20.0f, 20.0f, 20.0f }; // Camera position
 | ||||||
|  |     camera.target = (Vector3){ 0.0f, 8.0f, 0.0f };      // Camera looking at point
 | ||||||
|  |     camera.up = (Vector3){ 0.0f, 1.6f, 0.0f };          // Camera up vector (rotation towards target)
 | ||||||
|  |     camera.fovy = 45.0f;                                // Camera field-of-view Y
 | ||||||
|  |     camera.projection = CAMERA_PERSPECTIVE;             // Camera projection type
 | ||||||
|  | 
 | ||||||
|  |     Ray ray = { 0 };        // Picking ray
 | ||||||
|  | 
 | ||||||
|  |     Model tower = LoadModel("resources/models/obj/turret.obj");                 // Load OBJ model
 | ||||||
|  |     Texture2D texture = LoadTexture("resources/models/obj/turret_diffuse.png"); // Load model texture
 | ||||||
|  |     tower.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture;            // Set model diffuse texture
 | ||||||
|  | 
 | ||||||
|  |     Vector3 towerPos = { 0.0f, 0.0f, 0.0f };                        // Set model position
 | ||||||
|  |     BoundingBox towerBBox = GetMeshBoundingBox(tower.meshes[0]);    // Get mesh bounding box
 | ||||||
|  | 
 | ||||||
|  |     // Ground quad
 | ||||||
|  |     Vector3 g0 = (Vector3){ -50.0f, 0.0f, -50.0f }; | ||||||
|  |     Vector3 g1 = (Vector3){ -50.0f, 0.0f,  50.0f }; | ||||||
|  |     Vector3 g2 = (Vector3){  50.0f, 0.0f,  50.0f }; | ||||||
|  |     Vector3 g3 = (Vector3){  50.0f, 0.0f, -50.0f }; | ||||||
|  | 
 | ||||||
|  |     // Test triangle
 | ||||||
|  |     Vector3 ta = (Vector3){ -25.0f, 0.5f, 0.0f }; | ||||||
|  |     Vector3 tb = (Vector3){ -4.0f, 2.5f, 1.0f }; | ||||||
|  |     Vector3 tc = (Vector3){ -8.0f, 6.5f, 0.0f }; | ||||||
|  | 
 | ||||||
|  |     Vector3 bary = { 0.0f, 0.0f, 0.0f }; | ||||||
|  | 
 | ||||||
|  |     // Test sphere
 | ||||||
|  |     Vector3 sp = (Vector3){ -30.0f, 5.0f, 5.0f }; | ||||||
|  |     float sr = 4.0f; | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         if (IsCursorHidden()) UpdateCamera(&camera, CAMERA_FIRST_PERSON);          // Update camera
 | ||||||
|  | 
 | ||||||
|  |         // Toggle camera controls
 | ||||||
|  |         if (IsMouseButtonPressed(MOUSE_BUTTON_RIGHT)) | ||||||
|  |         { | ||||||
|  |             if (IsCursorHidden()) EnableCursor(); | ||||||
|  |             else DisableCursor(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Display information about closest hit
 | ||||||
|  |         RayCollision collision = { 0 }; | ||||||
|  |         char *hitObjectName = "None"; | ||||||
|  |         collision.distance = FLT_MAX; | ||||||
|  |         collision.hit = false; | ||||||
|  |         Color cursorColor = WHITE; | ||||||
|  | 
 | ||||||
|  |         // Get ray and test against objects
 | ||||||
|  |         ray = GetMouseRay(GetMousePosition(), camera); | ||||||
|  | 
 | ||||||
|  |         // Check ray collision against ground quad
 | ||||||
|  |         RayCollision groundHitInfo = GetRayCollisionQuad(ray, g0, g1, g2, g3); | ||||||
|  | 
 | ||||||
|  |         if ((groundHitInfo.hit) && (groundHitInfo.distance < collision.distance)) | ||||||
|  |         { | ||||||
|  |             collision = groundHitInfo; | ||||||
|  |             cursorColor = GREEN; | ||||||
|  |             hitObjectName = "Ground"; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Check ray collision against test triangle
 | ||||||
|  |         RayCollision triHitInfo = GetRayCollisionTriangle(ray, ta, tb, tc); | ||||||
|  | 
 | ||||||
|  |         if ((triHitInfo.hit) && (triHitInfo.distance < collision.distance)) | ||||||
|  |         { | ||||||
|  |             collision = triHitInfo; | ||||||
|  |             cursorColor = PURPLE; | ||||||
|  |             hitObjectName = "Triangle"; | ||||||
|  | 
 | ||||||
|  |             bary = Vector3Barycenter(collision.point, ta, tb, tc); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Check ray collision against test sphere
 | ||||||
|  |         RayCollision sphereHitInfo = GetRayCollisionSphere(ray, sp, sr); | ||||||
|  | 
 | ||||||
|  |         if ((sphereHitInfo.hit) && (sphereHitInfo.distance < collision.distance)) | ||||||
|  |         { | ||||||
|  |             collision = sphereHitInfo; | ||||||
|  |             cursorColor = ORANGE; | ||||||
|  |             hitObjectName = "Sphere"; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Check ray collision against bounding box first, before trying the full ray-mesh test
 | ||||||
|  |         RayCollision boxHitInfo = GetRayCollisionBox(ray, towerBBox); | ||||||
|  | 
 | ||||||
|  |         if ((boxHitInfo.hit) && (boxHitInfo.distance < collision.distance)) | ||||||
|  |         { | ||||||
|  |             collision = boxHitInfo; | ||||||
|  |             cursorColor = ORANGE; | ||||||
|  |             hitObjectName = "Box"; | ||||||
|  | 
 | ||||||
|  |             // Check ray collision against model meshes
 | ||||||
|  |             RayCollision meshHitInfo = { 0 }; | ||||||
|  |             for (int m = 0; m < tower.meshCount; m++) | ||||||
|  |             { | ||||||
|  |                 // NOTE: We consider the model.transform for the collision check but 
 | ||||||
|  |                 // it can be checked against any transform Matrix, used when checking against same
 | ||||||
|  |                 // model drawn multiple times with multiple transforms
 | ||||||
|  |                 meshHitInfo = GetRayCollisionMesh(ray, tower.meshes[m], tower.transform); | ||||||
|  |                 if (meshHitInfo.hit) | ||||||
|  |                 { | ||||||
|  |                     // Save the closest hit mesh
 | ||||||
|  |                     if ((!collision.hit) || (collision.distance > meshHitInfo.distance)) collision = meshHitInfo; | ||||||
|  |                      | ||||||
|  |                     break;  // Stop once one mesh collision is detected, the colliding mesh is m
 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (meshHitInfo.hit) | ||||||
|  |             { | ||||||
|  |                 collision = meshHitInfo; | ||||||
|  |                 cursorColor = ORANGE; | ||||||
|  |                 hitObjectName = "Mesh"; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 // Draw the tower
 | ||||||
|  |                 // WARNING: If scale is different than 1.0f,
 | ||||||
|  |                 // not considered by GetRayCollisionModel()
 | ||||||
|  |                 DrawModel(tower, towerPos, 1.0f, WHITE); | ||||||
|  | 
 | ||||||
|  |                 // Draw the test triangle
 | ||||||
|  |                 DrawLine3D(ta, tb, PURPLE); | ||||||
|  |                 DrawLine3D(tb, tc, PURPLE); | ||||||
|  |                 DrawLine3D(tc, ta, PURPLE); | ||||||
|  | 
 | ||||||
|  |                 // Draw the test sphere
 | ||||||
|  |                 DrawSphereWires(sp, sr, 8, 8, PURPLE); | ||||||
|  | 
 | ||||||
|  |                 // Draw the mesh bbox if we hit it
 | ||||||
|  |                 if (boxHitInfo.hit) DrawBoundingBox(towerBBox, LIME); | ||||||
|  | 
 | ||||||
|  |                 // If we hit something, draw the cursor at the hit point
 | ||||||
|  |                 if (collision.hit) | ||||||
|  |                 { | ||||||
|  |                     DrawCube(collision.point, 0.3f, 0.3f, 0.3f, cursorColor); | ||||||
|  |                     DrawCubeWires(collision.point, 0.3f, 0.3f, 0.3f, RED); | ||||||
|  | 
 | ||||||
|  |                     Vector3 normalEnd; | ||||||
|  |                     normalEnd.x = collision.point.x + collision.normal.x; | ||||||
|  |                     normalEnd.y = collision.point.y + collision.normal.y; | ||||||
|  |                     normalEnd.z = collision.point.z + collision.normal.z; | ||||||
|  | 
 | ||||||
|  |                     DrawLine3D(collision.point, normalEnd, RED); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 DrawRay(ray, MAROON); | ||||||
|  | 
 | ||||||
|  |                 DrawGrid(10, 10.0f); | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             // Draw some debug GUI text
 | ||||||
|  |             DrawText(TextFormat("Hit Object: %s", hitObjectName), 10, 50, 10, BLACK); | ||||||
|  | 
 | ||||||
|  |             if (collision.hit) | ||||||
|  |             { | ||||||
|  |                 int ypos = 70; | ||||||
|  | 
 | ||||||
|  |                 DrawText(TextFormat("Distance: %3.2f", collision.distance), 10, ypos, 10, BLACK); | ||||||
|  | 
 | ||||||
|  |                 DrawText(TextFormat("Hit Pos: %3.2f %3.2f %3.2f", | ||||||
|  |                                     collision.point.x, | ||||||
|  |                                     collision.point.y, | ||||||
|  |                                     collision.point.z), 10, ypos + 15, 10, BLACK); | ||||||
|  | 
 | ||||||
|  |                 DrawText(TextFormat("Hit Norm: %3.2f %3.2f %3.2f", | ||||||
|  |                                     collision.normal.x, | ||||||
|  |                                     collision.normal.y, | ||||||
|  |                                     collision.normal.z), 10, ypos + 30, 10, BLACK); | ||||||
|  | 
 | ||||||
|  |                 if (triHitInfo.hit && TextIsEqual(hitObjectName, "Triangle")) | ||||||
|  |                     DrawText(TextFormat("Barycenter: %3.2f %3.2f %3.2f",  bary.x, bary.y, bary.z), 10, ypos + 45, 10, BLACK); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             DrawText("Right click mouse to toggle camera controls", 10, 430, 10, GRAY); | ||||||
|  | 
 | ||||||
|  |             DrawText("(c) Turret 3D model by Alberto Cano", screenWidth - 200, screenHeight - 20, 10, GRAY); | ||||||
|  | 
 | ||||||
|  |             DrawFPS(10, 10); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     UnloadModel(tower);         // Unload model
 | ||||||
|  |     UnloadTexture(texture);     // Unload texture
 | ||||||
|  | 
 | ||||||
|  |     CloseWindow();              // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,102 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - Show the difference between perspective and orthographic projection | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 2.0, last time updated with raylib 3.7 | ||||||
|  | * | ||||||
|  | *   Example contributed by Max Danielsson (@autious) and reviewed by Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | *   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) 2018-2023 Max Danielsson (@autious) and Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | #define FOVY_PERSPECTIVE    45.0f | ||||||
|  | #define WIDTH_ORTHOGRAPHIC  10.0f | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - geometric shapes"); | ||||||
|  | 
 | ||||||
|  |     // Define the camera to look into our 3d world
 | ||||||
|  |     Camera camera = { { 0.0f, 10.0f, 10.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, FOVY_PERSPECTIVE, CAMERA_PERSPECTIVE }; | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         if (IsKeyPressed(KEY_SPACE)) | ||||||
|  |         { | ||||||
|  |             if (camera.projection == CAMERA_PERSPECTIVE) | ||||||
|  |             { | ||||||
|  |                 camera.fovy = WIDTH_ORTHOGRAPHIC; | ||||||
|  |                 camera.projection = CAMERA_ORTHOGRAPHIC; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 camera.fovy = FOVY_PERSPECTIVE; | ||||||
|  |                 camera.projection = CAMERA_PERSPECTIVE; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 DrawCube((Vector3){-4.0f, 0.0f, 2.0f}, 2.0f, 5.0f, 2.0f, RED); | ||||||
|  |                 DrawCubeWires((Vector3){-4.0f, 0.0f, 2.0f}, 2.0f, 5.0f, 2.0f, GOLD); | ||||||
|  |                 DrawCubeWires((Vector3){-4.0f, 0.0f, -2.0f}, 3.0f, 6.0f, 2.0f, MAROON); | ||||||
|  | 
 | ||||||
|  |                 DrawSphere((Vector3){-1.0f, 0.0f, -2.0f}, 1.0f, GREEN); | ||||||
|  |                 DrawSphereWires((Vector3){1.0f, 0.0f, 2.0f}, 2.0f, 16, 16, LIME); | ||||||
|  | 
 | ||||||
|  |                 DrawCylinder((Vector3){4.0f, 0.0f, -2.0f}, 1.0f, 2.0f, 3.0f, 4, SKYBLUE); | ||||||
|  |                 DrawCylinderWires((Vector3){4.0f, 0.0f, -2.0f}, 1.0f, 2.0f, 3.0f, 4, DARKBLUE); | ||||||
|  |                 DrawCylinderWires((Vector3){4.5f, -1.0f, 2.0f}, 1.0f, 1.0f, 2.0f, 6, BROWN); | ||||||
|  | 
 | ||||||
|  |                 DrawCylinder((Vector3){1.0f, 0.0f, -4.0f}, 0.0f, 1.5f, 3.0f, 8, GOLD); | ||||||
|  |                 DrawCylinderWires((Vector3){1.0f, 0.0f, -4.0f}, 0.0f, 1.5f, 3.0f, 8, PINK); | ||||||
|  | 
 | ||||||
|  |                 DrawGrid(10, 1.0f);        // Draw a grid
 | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawText("Press Spacebar to switch camera type", 10, GetScreenHeight() - 30, 20, DARKGRAY); | ||||||
|  | 
 | ||||||
|  |             if (camera.projection == CAMERA_ORTHOGRAPHIC) DrawText("ORTHOGRAPHIC", 10, 40, 20, BLACK); | ||||||
|  |             else if (camera.projection == CAMERA_PERSPECTIVE) DrawText("PERSPECTIVE", 10, 40, 20, BLACK); | ||||||
|  | 
 | ||||||
|  |             DrawFPS(10, 10); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,172 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - rlgl module usage with push/pop matrix transformations | ||||||
|  | * | ||||||
|  | *   NOTE: This example uses [rlgl] module functionality (pseudo-OpenGL 1.1 style coding) | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 2.5, last time updated with raylib 4.0 | ||||||
|  | * | ||||||
|  | *   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) 2018-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | #include "rlgl.h" | ||||||
|  | 
 | ||||||
|  | #include <math.h>           // Required for: cosf(), sinf() | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Module Functions Declaration
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | void DrawSphereBasic(Color color);      // Draw sphere without any matrix transformation
 | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     const float sunRadius = 4.0f; | ||||||
|  |     const float earthRadius = 0.6f; | ||||||
|  |     const float earthOrbitRadius = 8.0f; | ||||||
|  |     const float moonRadius = 0.16f; | ||||||
|  |     const float moonOrbitRadius = 1.5f; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - rlgl module usage with push/pop matrix transformations"); | ||||||
|  | 
 | ||||||
|  |     // Define the camera to look into our 3d world
 | ||||||
|  |     Camera camera = { 0 }; | ||||||
|  |     camera.position = (Vector3){ 16.0f, 16.0f, 16.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 projection type
 | ||||||
|  | 
 | ||||||
|  |     float rotationSpeed = 0.2f;         // General system rotation speed
 | ||||||
|  | 
 | ||||||
|  |     float earthRotation = 0.0f;         // Rotation of earth around itself (days) in degrees
 | ||||||
|  |     float earthOrbitRotation = 0.0f;    // Rotation of earth around the Sun (years) in degrees
 | ||||||
|  |     float moonRotation = 0.0f;          // Rotation of moon around itself
 | ||||||
|  |     float moonOrbitRotation = 0.0f;     // Rotation of moon around earth in degrees
 | ||||||
|  | 
 | ||||||
|  |     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, CAMERA_ORBITAL); | ||||||
|  | 
 | ||||||
|  |         earthRotation += (5.0f*rotationSpeed); | ||||||
|  |         earthOrbitRotation += (365/360.0f*(5.0f*rotationSpeed)*rotationSpeed); | ||||||
|  |         moonRotation += (2.0f*rotationSpeed); | ||||||
|  |         moonOrbitRotation += (8.0f*rotationSpeed); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 rlPushMatrix(); | ||||||
|  |                     rlScalef(sunRadius, sunRadius, sunRadius);          // Scale Sun
 | ||||||
|  |                     DrawSphereBasic(GOLD);                              // Draw the Sun
 | ||||||
|  |                 rlPopMatrix(); | ||||||
|  | 
 | ||||||
|  |                 rlPushMatrix(); | ||||||
|  |                     rlRotatef(earthOrbitRotation, 0.0f, 1.0f, 0.0f);    // Rotation for Earth orbit around Sun
 | ||||||
|  |                     rlTranslatef(earthOrbitRadius, 0.0f, 0.0f);         // Translation for Earth orbit
 | ||||||
|  | 
 | ||||||
|  |                     rlPushMatrix(); | ||||||
|  |                         rlRotatef(earthRotation, 0.25, 1.0, 0.0);       // Rotation for Earth itself
 | ||||||
|  |                         rlScalef(earthRadius, earthRadius, earthRadius);// Scale Earth
 | ||||||
|  | 
 | ||||||
|  |                         DrawSphereBasic(BLUE);                          // Draw the Earth
 | ||||||
|  |                     rlPopMatrix(); | ||||||
|  | 
 | ||||||
|  |                     rlRotatef(moonOrbitRotation, 0.0f, 1.0f, 0.0f);     // Rotation for Moon orbit around Earth
 | ||||||
|  |                     rlTranslatef(moonOrbitRadius, 0.0f, 0.0f);          // Translation for Moon orbit
 | ||||||
|  |                     rlRotatef(moonRotation, 0.0f, 1.0f, 0.0f);          // Rotation for Moon itself
 | ||||||
|  |                     rlScalef(moonRadius, moonRadius, moonRadius);       // Scale Moon
 | ||||||
|  | 
 | ||||||
|  |                     DrawSphereBasic(LIGHTGRAY);                         // Draw the Moon
 | ||||||
|  |                 rlPopMatrix(); | ||||||
|  | 
 | ||||||
|  |                 // Some reference elements (not affected by previous matrix transformations)
 | ||||||
|  |                 DrawCircle3D((Vector3){ 0.0f, 0.0f, 0.0f }, earthOrbitRadius, (Vector3){ 1, 0, 0 }, 90.0f, Fade(RED, 0.5f)); | ||||||
|  |                 DrawGrid(20, 1.0f); | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawText("EARTH ORBITING AROUND THE SUN!", 400, 10, 20, MAROON); | ||||||
|  |             DrawFPS(10, 10); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //--------------------------------------------------------------------------------------------
 | ||||||
|  | // Module Functions Definitions (local)
 | ||||||
|  | //--------------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | // Draw sphere without any matrix transformation
 | ||||||
|  | // NOTE: Sphere is drawn in world position ( 0, 0, 0 ) with radius 1.0f
 | ||||||
|  | void DrawSphereBasic(Color color) | ||||||
|  | { | ||||||
|  |     int rings = 16; | ||||||
|  |     int slices = 16; | ||||||
|  | 
 | ||||||
|  |     // Make sure there is enough space in the internal render batch
 | ||||||
|  |     // buffer to store all required vertex, batch is reseted if required
 | ||||||
|  |     rlCheckRenderBatchLimit((rings + 2)*slices*6); | ||||||
|  | 
 | ||||||
|  |     rlBegin(RL_TRIANGLES); | ||||||
|  |         rlColor4ub(color.r, color.g, color.b, color.a); | ||||||
|  | 
 | ||||||
|  |         for (int i = 0; i < (rings + 2); i++) | ||||||
|  |         { | ||||||
|  |             for (int j = 0; j < slices; j++) | ||||||
|  |             { | ||||||
|  |                 rlVertex3f(cosf(DEG2RAD*(270+(180/(rings + 1))*i))*sinf(DEG2RAD*(j*360/slices)), | ||||||
|  |                            sinf(DEG2RAD*(270+(180/(rings + 1))*i)), | ||||||
|  |                            cosf(DEG2RAD*(270+(180/(rings + 1))*i))*cosf(DEG2RAD*(j*360/slices))); | ||||||
|  |                 rlVertex3f(cosf(DEG2RAD*(270+(180/(rings + 1))*(i+1)))*sinf(DEG2RAD*((j+1)*360/slices)), | ||||||
|  |                            sinf(DEG2RAD*(270+(180/(rings + 1))*(i+1))), | ||||||
|  |                            cosf(DEG2RAD*(270+(180/(rings + 1))*(i+1)))*cosf(DEG2RAD*((j+1)*360/slices))); | ||||||
|  |                 rlVertex3f(cosf(DEG2RAD*(270+(180/(rings + 1))*(i+1)))*sinf(DEG2RAD*(j*360/slices)), | ||||||
|  |                            sinf(DEG2RAD*(270+(180/(rings + 1))*(i+1))), | ||||||
|  |                            cosf(DEG2RAD*(270+(180/(rings + 1))*(i+1)))*cosf(DEG2RAD*(j*360/slices))); | ||||||
|  | 
 | ||||||
|  |                 rlVertex3f(cosf(DEG2RAD*(270+(180/(rings + 1))*i))*sinf(DEG2RAD*(j*360/slices)), | ||||||
|  |                            sinf(DEG2RAD*(270+(180/(rings + 1))*i)), | ||||||
|  |                            cosf(DEG2RAD*(270+(180/(rings + 1))*i))*cosf(DEG2RAD*(j*360/slices))); | ||||||
|  |                 rlVertex3f(cosf(DEG2RAD*(270+(180/(rings + 1))*(i)))*sinf(DEG2RAD*((j+1)*360/slices)), | ||||||
|  |                            sinf(DEG2RAD*(270+(180/(rings + 1))*(i))), | ||||||
|  |                            cosf(DEG2RAD*(270+(180/(rings + 1))*(i)))*cosf(DEG2RAD*((j+1)*360/slices))); | ||||||
|  |                 rlVertex3f(cosf(DEG2RAD*(270+(180/(rings + 1))*(i+1)))*sinf(DEG2RAD*((j+1)*360/slices)), | ||||||
|  |                            sinf(DEG2RAD*(270+(180/(rings + 1))*(i+1))), | ||||||
|  |                            cosf(DEG2RAD*(270+(180/(rings + 1))*(i+1)))*cosf(DEG2RAD*((j+1)*360/slices))); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     rlEnd(); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,271 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - Skybox loading and drawing | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.8, last time updated with raylib 4.0 | ||||||
|  | * | ||||||
|  | *   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) 2017-2023 Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | #include "rlgl.h" | ||||||
|  | #include "raymath.h"      // Required for: MatrixPerspective(), MatrixLookAt() | ||||||
|  | 
 | ||||||
|  | #if defined(PLATFORM_DESKTOP) | ||||||
|  |     #define GLSL_VERSION            330 | ||||||
|  | #else   // PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB
 | ||||||
|  |     #define GLSL_VERSION            100 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // Generate cubemap (6 faces) from equirectangular (panorama) texture
 | ||||||
|  | static TextureCubemap GenTextureCubemap(Shader shader, Texture2D panorama, int size, int format); | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - skybox loading and drawing"); | ||||||
|  | 
 | ||||||
|  |     // Define the camera to look into our 3d world
 | ||||||
|  |     Camera camera = { 0 }; | ||||||
|  |     camera.position = (Vector3){ 1.0f, 1.0f, 1.0f };    // Camera position
 | ||||||
|  |     camera.target = (Vector3){ 4.0f, 1.0f, 4.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 skybox model
 | ||||||
|  |     Mesh cube = GenMeshCube(1.0f, 1.0f, 1.0f); | ||||||
|  |     Model skybox = LoadModelFromMesh(cube); | ||||||
|  | 
 | ||||||
|  |     bool useHDR = true; | ||||||
|  | 
 | ||||||
|  |     // Load skybox shader and set required locations
 | ||||||
|  |     // NOTE: Some locations are automatically set at shader loading
 | ||||||
|  |     skybox.materials[0].shader = LoadShader(TextFormat("resources/shaders/glsl%i/skybox.vs", GLSL_VERSION), | ||||||
|  |                                             TextFormat("resources/shaders/glsl%i/skybox.fs", GLSL_VERSION)); | ||||||
|  | 
 | ||||||
|  |     SetShaderValue(skybox.materials[0].shader, GetShaderLocation(skybox.materials[0].shader, "environmentMap"), (int[1]){ MATERIAL_MAP_CUBEMAP }, SHADER_UNIFORM_INT); | ||||||
|  |     SetShaderValue(skybox.materials[0].shader, GetShaderLocation(skybox.materials[0].shader, "doGamma"), (int[1]) { useHDR ? 1 : 0 }, SHADER_UNIFORM_INT); | ||||||
|  |     SetShaderValue(skybox.materials[0].shader, GetShaderLocation(skybox.materials[0].shader, "vflipped"), (int[1]){ useHDR ? 1 : 0 }, SHADER_UNIFORM_INT); | ||||||
|  | 
 | ||||||
|  |     // Load cubemap shader and setup required shader locations
 | ||||||
|  |     Shader shdrCubemap = LoadShader(TextFormat("resources/shaders/glsl%i/cubemap.vs", GLSL_VERSION), | ||||||
|  |                                     TextFormat("resources/shaders/glsl%i/cubemap.fs", GLSL_VERSION)); | ||||||
|  | 
 | ||||||
|  |     SetShaderValue(shdrCubemap, GetShaderLocation(shdrCubemap, "equirectangularMap"), (int[1]){ 0 }, SHADER_UNIFORM_INT); | ||||||
|  | 
 | ||||||
|  |     char skyboxFileName[256] = { 0 }; | ||||||
|  |      | ||||||
|  |     Texture2D panorama; | ||||||
|  | 
 | ||||||
|  |     if (useHDR) | ||||||
|  |     { | ||||||
|  |         TextCopy(skyboxFileName, "resources/dresden_square_2k.hdr"); | ||||||
|  | 
 | ||||||
|  |         // Load HDR panorama (sphere) texture
 | ||||||
|  |         panorama = LoadTexture(skyboxFileName); | ||||||
|  | 
 | ||||||
|  |         // Generate cubemap (texture with 6 quads-cube-mapping) from panorama HDR texture
 | ||||||
|  |         // NOTE 1: New texture is generated rendering to texture, shader calculates the sphere->cube coordinates mapping
 | ||||||
|  |         // NOTE 2: It seems on some Android devices WebGL, fbo does not properly support a FLOAT-based attachment,
 | ||||||
|  |         // despite texture can be successfully created.. so using PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 instead of PIXELFORMAT_UNCOMPRESSED_R32G32B32A32
 | ||||||
|  |         skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture = GenTextureCubemap(shdrCubemap, panorama, 1024, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8); | ||||||
|  | 
 | ||||||
|  |         //UnloadTexture(panorama);    // Texture not required anymore, cubemap already generated
 | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         Image img = LoadImage("resources/skybox.png"); | ||||||
|  |         skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture = LoadTextureCubemap(img, CUBEMAP_LAYOUT_AUTO_DETECT);    // CUBEMAP_LAYOUT_PANORAMA
 | ||||||
|  |         UnloadImage(img); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     DisableCursor();                    // Limit cursor to relative movement inside the window
 | ||||||
|  | 
 | ||||||
|  |     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, CAMERA_FIRST_PERSON); | ||||||
|  | 
 | ||||||
|  |         // Load new cubemap texture on drag&drop
 | ||||||
|  |         if (IsFileDropped()) | ||||||
|  |         { | ||||||
|  |             FilePathList droppedFiles = LoadDroppedFiles(); | ||||||
|  | 
 | ||||||
|  |             if (droppedFiles.count == 1)         // Only support one file dropped
 | ||||||
|  |             { | ||||||
|  |                 if (IsFileExtension(droppedFiles.paths[0], ".png;.jpg;.hdr;.bmp;.tga")) | ||||||
|  |                 { | ||||||
|  |                     // Unload current cubemap texture and load new one
 | ||||||
|  |                     UnloadTexture(skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture); | ||||||
|  |                     if (useHDR) | ||||||
|  |                     { | ||||||
|  |                         Texture2D panorama = LoadTexture(droppedFiles.paths[0]); | ||||||
|  | 
 | ||||||
|  |                         // Generate cubemap from panorama texture
 | ||||||
|  |                         skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture = GenTextureCubemap(shdrCubemap, panorama, 1024, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8); | ||||||
|  |                         UnloadTexture(panorama); | ||||||
|  |                     } | ||||||
|  |                     else | ||||||
|  |                     { | ||||||
|  |                         Image img = LoadImage(droppedFiles.paths[0]); | ||||||
|  |                         skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture = LoadTextureCubemap(img, CUBEMAP_LAYOUT_AUTO_DETECT); | ||||||
|  |                         UnloadImage(img); | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     TextCopy(skyboxFileName, droppedFiles.paths[0]); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             UnloadDroppedFiles(droppedFiles);    // Unload filepaths from memory
 | ||||||
|  |         } | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 // We are inside the cube, we need to disable backface culling!
 | ||||||
|  |                 rlDisableBackfaceCulling(); | ||||||
|  |                 rlDisableDepthMask(); | ||||||
|  |                     DrawModel(skybox, (Vector3){0, 0, 0}, 1.0f, WHITE); | ||||||
|  |                 rlEnableBackfaceCulling(); | ||||||
|  |                 rlEnableDepthMask(); | ||||||
|  | 
 | ||||||
|  |                 DrawGrid(10, 1.0f); | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  |              | ||||||
|  |             //DrawTextureEx(panorama, (Vector2){ 0, 0 }, 0.0f, 0.5f, WHITE);
 | ||||||
|  | 
 | ||||||
|  |             if (useHDR) DrawText(TextFormat("Panorama image from hdrihaven.com: %s", GetFileName(skyboxFileName)), 10, GetScreenHeight() - 20, 10, BLACK); | ||||||
|  |             else DrawText(TextFormat(": %s", GetFileName(skyboxFileName)), 10, GetScreenHeight() - 20, 10, BLACK); | ||||||
|  | 
 | ||||||
|  |             DrawFPS(10, 10); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     UnloadShader(skybox.materials[0].shader); | ||||||
|  |     UnloadTexture(skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture); | ||||||
|  | 
 | ||||||
|  |     UnloadModel(skybox);        // Unload skybox model
 | ||||||
|  | 
 | ||||||
|  |     CloseWindow();              // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Generate cubemap texture from HDR texture
 | ||||||
|  | static TextureCubemap GenTextureCubemap(Shader shader, Texture2D panorama, int size, int format) | ||||||
|  | { | ||||||
|  |     TextureCubemap cubemap = { 0 }; | ||||||
|  | 
 | ||||||
|  |     rlDisableBackfaceCulling();     // Disable backface culling to render inside the cube
 | ||||||
|  | 
 | ||||||
|  |     // STEP 1: Setup framebuffer
 | ||||||
|  |     //------------------------------------------------------------------------------------------
 | ||||||
|  |     unsigned int rbo = rlLoadTextureDepth(size, size, true); | ||||||
|  |     cubemap.id = rlLoadTextureCubemap(0, size, format); | ||||||
|  | 
 | ||||||
|  |     unsigned int fbo = rlLoadFramebuffer(size, size); | ||||||
|  |     rlFramebufferAttach(fbo, rbo, RL_ATTACHMENT_DEPTH, RL_ATTACHMENT_RENDERBUFFER, 0); | ||||||
|  |     rlFramebufferAttach(fbo, cubemap.id, RL_ATTACHMENT_COLOR_CHANNEL0, RL_ATTACHMENT_CUBEMAP_POSITIVE_X, 0); | ||||||
|  | 
 | ||||||
|  |     // Check if framebuffer is complete with attachments (valid)
 | ||||||
|  |     if (rlFramebufferComplete(fbo)) TraceLog(LOG_INFO, "FBO: [ID %i] Framebuffer object created successfully", fbo); | ||||||
|  |     //------------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     // STEP 2: Draw to framebuffer
 | ||||||
|  |     //------------------------------------------------------------------------------------------
 | ||||||
|  |     // NOTE: Shader is used to convert HDR equirectangular environment map to cubemap equivalent (6 faces)
 | ||||||
|  |     rlEnableShader(shader.id); | ||||||
|  | 
 | ||||||
|  |     // Define projection matrix and send it to shader
 | ||||||
|  |     Matrix matFboProjection = MatrixPerspective(90.0*DEG2RAD, 1.0, RL_CULL_DISTANCE_NEAR, RL_CULL_DISTANCE_FAR); | ||||||
|  |     rlSetUniformMatrix(shader.locs[SHADER_LOC_MATRIX_PROJECTION], matFboProjection); | ||||||
|  | 
 | ||||||
|  |     // Define view matrix for every side of the cubemap
 | ||||||
|  |     Matrix fboViews[6] = { | ||||||
|  |         MatrixLookAt((Vector3){ 0.0f, 0.0f, 0.0f }, (Vector3){  1.0f,  0.0f,  0.0f }, (Vector3){ 0.0f, -1.0f,  0.0f }), | ||||||
|  |         MatrixLookAt((Vector3){ 0.0f, 0.0f, 0.0f }, (Vector3){ -1.0f,  0.0f,  0.0f }, (Vector3){ 0.0f, -1.0f,  0.0f }), | ||||||
|  |         MatrixLookAt((Vector3){ 0.0f, 0.0f, 0.0f }, (Vector3){  0.0f,  1.0f,  0.0f }, (Vector3){ 0.0f,  0.0f,  1.0f }), | ||||||
|  |         MatrixLookAt((Vector3){ 0.0f, 0.0f, 0.0f }, (Vector3){  0.0f, -1.0f,  0.0f }, (Vector3){ 0.0f,  0.0f, -1.0f }), | ||||||
|  |         MatrixLookAt((Vector3){ 0.0f, 0.0f, 0.0f }, (Vector3){  0.0f,  0.0f,  1.0f }, (Vector3){ 0.0f, -1.0f,  0.0f }), | ||||||
|  |         MatrixLookAt((Vector3){ 0.0f, 0.0f, 0.0f }, (Vector3){  0.0f,  0.0f, -1.0f }, (Vector3){ 0.0f, -1.0f,  0.0f }) | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     rlViewport(0, 0, size, size);   // Set viewport to current fbo dimensions
 | ||||||
|  |      | ||||||
|  |     // Activate and enable texture for drawing to cubemap faces
 | ||||||
|  |     rlActiveTextureSlot(0); | ||||||
|  |     rlEnableTexture(panorama.id); | ||||||
|  | 
 | ||||||
|  |     for (int i = 0; i < 6; i++) | ||||||
|  |     { | ||||||
|  |         // Set the view matrix for the current cube face
 | ||||||
|  |         rlSetUniformMatrix(shader.locs[SHADER_LOC_MATRIX_VIEW], fboViews[i]); | ||||||
|  |          | ||||||
|  |         // Select the current cubemap face attachment for the fbo
 | ||||||
|  |         // WARNING: This function by default enables->attach->disables fbo!!!
 | ||||||
|  |         rlFramebufferAttach(fbo, cubemap.id, RL_ATTACHMENT_COLOR_CHANNEL0, RL_ATTACHMENT_CUBEMAP_POSITIVE_X + i, 0); | ||||||
|  |         rlEnableFramebuffer(fbo); | ||||||
|  | 
 | ||||||
|  |         // Load and draw a cube, it uses the current enabled texture
 | ||||||
|  |         rlClearScreenBuffers(); | ||||||
|  |         rlLoadDrawCube(); | ||||||
|  | 
 | ||||||
|  |         // ALTERNATIVE: Try to use internal batch system to draw the cube instead of rlLoadDrawCube
 | ||||||
|  |         // for some reason this method does not work, maybe due to cube triangles definition? normals pointing out?
 | ||||||
|  |         // TODO: Investigate this issue...
 | ||||||
|  |         //rlSetTexture(panorama.id); // WARNING: It must be called after enabling current framebuffer if using internal batch system!
 | ||||||
|  |         //rlClearScreenBuffers();
 | ||||||
|  |         //DrawCubeV(Vector3Zero(), Vector3One(), WHITE);
 | ||||||
|  |         //rlDrawRenderBatchActive();
 | ||||||
|  |     } | ||||||
|  |     //------------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     // STEP 3: Unload framebuffer and reset state
 | ||||||
|  |     //------------------------------------------------------------------------------------------
 | ||||||
|  |     rlDisableShader();          // Unbind shader
 | ||||||
|  |     rlDisableTexture();         // Unbind texture
 | ||||||
|  |     rlDisableFramebuffer();     // Unbind framebuffer
 | ||||||
|  |     rlUnloadFramebuffer(fbo);   // Unload framebuffer (and automatically attached depth texture/renderbuffer)
 | ||||||
|  | 
 | ||||||
|  |     // Reset viewport dimensions to default
 | ||||||
|  |     rlViewport(0, 0, rlGetFramebufferWidth(), rlGetFramebufferHeight()); | ||||||
|  |     rlEnableBackfaceCulling(); | ||||||
|  |     //------------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     cubemap.width = size; | ||||||
|  |     cubemap.height = size; | ||||||
|  |     cubemap.mipmaps = 1; | ||||||
|  |     cubemap.format = format; | ||||||
|  | 
 | ||||||
|  |     return cubemap; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,117 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - Waving cubes | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 2.5, last time updated with raylib 3.7 | ||||||
|  | * | ||||||
|  | *   Example contributed by Codecat (@codecat) and reviewed by Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | *   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-2023 Codecat (@codecat) and Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | #include <math.h>       // Required for: sinf() | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - waving cubes"); | ||||||
|  | 
 | ||||||
|  |     // Initialize the camera
 | ||||||
|  |     Camera3D camera = { 0 }; | ||||||
|  |     camera.position = (Vector3){ 30.0f, 20.0f, 30.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 = 70.0f;                                // Camera field-of-view Y
 | ||||||
|  |     camera.projection = CAMERA_PERSPECTIVE;             // Camera projection type
 | ||||||
|  | 
 | ||||||
|  |     // Specify the amount of blocks in each direction
 | ||||||
|  |     const int numBlocks = 15; | ||||||
|  | 
 | ||||||
|  |     SetTargetFPS(60); | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     // Main game loop
 | ||||||
|  |     while (!WindowShouldClose())    // Detect window close button or ESC key
 | ||||||
|  |     { | ||||||
|  |         // Update
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         double time = GetTime(); | ||||||
|  | 
 | ||||||
|  |         // Calculate time scale for cube position and size
 | ||||||
|  |         float scale = (2.0f + (float)sin(time))*0.7f; | ||||||
|  | 
 | ||||||
|  |         // Move camera around the scene
 | ||||||
|  |         double cameraTime = time*0.3; | ||||||
|  |         camera.position.x = (float)cos(cameraTime)*40.0f; | ||||||
|  |         camera.position.z = (float)sin(cameraTime)*40.0f; | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 DrawGrid(10, 5.0f); | ||||||
|  | 
 | ||||||
|  |                 for (int x = 0; x < numBlocks; x++) | ||||||
|  |                 { | ||||||
|  |                     for (int y = 0; y < numBlocks; y++) | ||||||
|  |                     { | ||||||
|  |                         for (int z = 0; z < numBlocks; z++) | ||||||
|  |                         { | ||||||
|  |                             // Scale of the blocks depends on x/y/z positions
 | ||||||
|  |                             float blockScale = (x + y + z)/30.0f; | ||||||
|  | 
 | ||||||
|  |                             // Scatter makes the waving effect by adding blockScale over time
 | ||||||
|  |                             float scatter = sinf(blockScale*20.0f + (float)(time*4.0f)); | ||||||
|  | 
 | ||||||
|  |                             // Calculate the cube position
 | ||||||
|  |                             Vector3 cubePos = { | ||||||
|  |                                 (float)(x - numBlocks/2)*(scale*3.0f) + scatter, | ||||||
|  |                                 (float)(y - numBlocks/2)*(scale*2.0f) + scatter, | ||||||
|  |                                 (float)(z - numBlocks/2)*(scale*3.0f) + scatter | ||||||
|  |                             }; | ||||||
|  | 
 | ||||||
|  |                             // Pick a color with a hue depending on cube position for the rainbow color effect
 | ||||||
|  |                             Color cubeColor = ColorFromHSV((float)(((x + y + z)*18)%360), 0.75f, 0.9f); | ||||||
|  | 
 | ||||||
|  |                             // Calculate cube size
 | ||||||
|  |                             float cubeSize = (2.4f - scale)*blockScale; | ||||||
|  | 
 | ||||||
|  |                             // And finally, draw the cube!
 | ||||||
|  |                             DrawCube(cubePos, cubeSize, cubeSize, cubeSize, cubeColor); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             DrawFPS(10, 10); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     CloseWindow();        // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,122 @@ | ||||||
|  | /*******************************************************************************************
 | ||||||
|  | * | ||||||
|  | *   raylib [models] example - Plane rotations (yaw, pitch, roll) | ||||||
|  | * | ||||||
|  | *   Example originally created with raylib 1.8, last time updated with raylib 4.0 | ||||||
|  | * | ||||||
|  | *   Example contributed by Berni (@Berni8k) and reviewed by Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | *   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) 2017-2023 Berni (@Berni8k) and Ramon Santamaria (@raysan5) | ||||||
|  | * | ||||||
|  | ********************************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include "raylib.h" | ||||||
|  | 
 | ||||||
|  | #include "raymath.h"        // Required for: MatrixRotateXYZ() | ||||||
|  | 
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | // Program main entry point
 | ||||||
|  | //------------------------------------------------------------------------------------
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     // Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     const int screenWidth = 800; | ||||||
|  |     const int screenHeight = 450; | ||||||
|  | 
 | ||||||
|  |     //SetConfigFlags(FLAG_MSAA_4X_HINT | FLAG_WINDOW_HIGHDPI);
 | ||||||
|  |     InitWindow(screenWidth, screenHeight, "raylib [models] example - plane rotations (yaw, pitch, roll)"); | ||||||
|  | 
 | ||||||
|  |     Camera camera = { 0 }; | ||||||
|  |     camera.position = (Vector3){ 0.0f, 50.0f, -120.0f };// Camera position perspective
 | ||||||
|  |     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 = 30.0f;                                // Camera field-of-view Y
 | ||||||
|  |     camera.projection = CAMERA_PERSPECTIVE;             // Camera type
 | ||||||
|  | 
 | ||||||
|  |     Model model = LoadModel("resources/models/obj/plane.obj");                  // Load model
 | ||||||
|  |     Texture2D texture = LoadTexture("resources/models/obj/plane_diffuse.png");  // Load model texture
 | ||||||
|  |     model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture;            // Set map diffuse texture
 | ||||||
|  | 
 | ||||||
|  |     float pitch = 0.0f; | ||||||
|  |     float roll = 0.0f; | ||||||
|  |     float yaw = 0.0f; | ||||||
|  | 
 | ||||||
|  |     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
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         // Plane pitch (x-axis) controls
 | ||||||
|  |         if (IsKeyDown(KEY_DOWN)) pitch += 0.6f; | ||||||
|  |         else if (IsKeyDown(KEY_UP)) pitch -= 0.6f; | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             if (pitch > 0.3f) pitch -= 0.3f; | ||||||
|  |             else if (pitch < -0.3f) pitch += 0.3f; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Plane yaw (y-axis) controls
 | ||||||
|  |         if (IsKeyDown(KEY_S)) yaw -= 1.0f; | ||||||
|  |         else if (IsKeyDown(KEY_A)) yaw += 1.0f; | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             if (yaw > 0.0f) yaw -= 0.5f; | ||||||
|  |             else if (yaw < 0.0f) yaw += 0.5f; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Plane roll (z-axis) controls
 | ||||||
|  |         if (IsKeyDown(KEY_LEFT)) roll -= 1.0f; | ||||||
|  |         else if (IsKeyDown(KEY_RIGHT)) roll += 1.0f; | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             if (roll > 0.0f) roll -= 0.5f; | ||||||
|  |             else if (roll < 0.0f) roll += 0.5f; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Tranformation matrix for rotations
 | ||||||
|  |         model.transform = MatrixRotateXYZ((Vector3){ DEG2RAD*pitch, DEG2RAD*yaw, DEG2RAD*roll }); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |         // Draw
 | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |         BeginDrawing(); | ||||||
|  | 
 | ||||||
|  |             ClearBackground(RAYWHITE); | ||||||
|  | 
 | ||||||
|  |             // Draw 3D model (recomended to draw 3D always before 2D)
 | ||||||
|  |             BeginMode3D(camera); | ||||||
|  | 
 | ||||||
|  |                 DrawModel(model, (Vector3){ 0.0f, -8.0f, 0.0f }, 1.0f, WHITE);   // Draw 3d model with texture
 | ||||||
|  |                 DrawGrid(10, 10.0f); | ||||||
|  | 
 | ||||||
|  |             EndMode3D(); | ||||||
|  | 
 | ||||||
|  |             // Draw controls info
 | ||||||
|  |             DrawRectangle(30, 370, 260, 70, Fade(GREEN, 0.5f)); | ||||||
|  |             DrawRectangleLines(30, 370, 260, 70, Fade(DARKGREEN, 0.5f)); | ||||||
|  |             DrawText("Pitch controlled with: KEY_UP / KEY_DOWN", 40, 380, 10, DARKGRAY); | ||||||
|  |             DrawText("Roll controlled with: KEY_LEFT / KEY_RIGHT", 40, 400, 10, DARKGRAY); | ||||||
|  |             DrawText("Yaw controlled with: KEY_A / KEY_S", 40, 420, 10, DARKGRAY); | ||||||
|  | 
 | ||||||
|  |             DrawText("(c) WWI Plane Model created by GiaHanLam", screenWidth - 240, screenHeight - 20, 10, DARKGRAY); | ||||||
|  | 
 | ||||||
|  |         EndDrawing(); | ||||||
|  |         //----------------------------------------------------------------------------------
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // De-Initialization
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  |     UnloadModel(model);     // Unload model data
 | ||||||
|  | 
 | ||||||
|  |     CloseWindow();          // Close window and OpenGL context
 | ||||||
|  |     //--------------------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,22 @@ | ||||||
|  | | resource             | author      | licence | notes | | ||||||
|  | | :------------------- | :---------: | :------ | :---- | | ||||||
|  | | models/obj/castle.obj,<br>models/obj/castle_diffuse.png | [Alberto Cano](https://www.artstation.com/albertocano) | [CC-BY-NC](https://creativecommons.org/licenses/by-nc/4.0/legalcode) | - | | ||||||
|  | | models/obj/bridge.obj,<br>models/obj/bridge_diffuse.png | [Alberto Cano](https://www.artstation.com/albertocano) | [CC-BY-NC](https://creativecommons.org/licenses/by-nc/4.0/legalcode) | - | | ||||||
|  | | models/obj/house.obj,<br>models/obj/house_diffuse.png | [Alberto Cano](https://www.artstation.com/albertocano) | [CC-BY-NC](https://creativecommons.org/licenses/by-nc/4.0/legalcode)  | - | | ||||||
|  | | models/obj/market.obj,<br>models/obj/market_diffuse.png | [Alberto Cano](https://www.artstation.com/albertocano) | [CC-BY-NC](https://creativecommons.org/licenses/by-nc/4.0/legalcode)  | - | | ||||||
|  | | models/obj/turret.obj,<br>models/obj/turret_diffuse.png | [Alberto Cano](https://www.artstation.com/albertocano) | [CC-BY-NC](https://creativecommons.org/licenses/by-nc/4.0/legalcode) | - | | ||||||
|  | | models/obj/well.obj,<br>models/obj/well_diffuse.png | [Alberto Cano](https://www.artstation.com/albertocano) | [CC-BY-NC](https://creativecommons.org/licenses/by-nc/4.0/legalcode) | - | | ||||||
|  | | models/obj/cube.obj,<br>models/obj/cube_diffuse.png | [@raysan5](https://github.com/raysan5)    | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | - | | ||||||
|  | | models/obj/plane.obj,<br>models/obj/plane_diffuse.png | [GiaHanLam](https://sketchfab.com/GiaHanLam)  | [CC-BY](https://creativecommons.org/licenses/by/4.0/)  | Used by: [`models_yaw_pitch_roll.c`](https://github.com/raysan5/raylib/blob/master/examples/models/models_yaw_pitch_roll.c) | ||||||
|  | | models/iqm/guy.iqm,<br>models/iqm/guyanim.iqm,<br>models/iqm/guytex.png,<br>models/iqm/guy.blend | [@culacant](https://github.com/culacant)  | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | - | | ||||||
|  | | models/gltf/robot.glb,<br>models/gltf/robot.blend | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | - | | ||||||
|  | | models/vox/chr_knight.vox |  ❔         | ❔     | - | | ||||||
|  | | models/vox/chr_sword.vox  |  ❔         | ❔     | - | | ||||||
|  | | models/vox/monu9.vox   |  ❔            | ❔     | - | | ||||||
|  | | billboard.png          | [@emegeme](https://github.com/emegeme)    | [CC0](https://creativecommons.org/publicdomain/zero/1.0/)     | - | | ||||||
|  | | cubicmap.png           | [@raysan5](https://github.com/raysan5)    | [CC0](https://creativecommons.org/publicdomain/zero/1.0/)     | - | | ||||||
|  | | cubicmap_atlas.png     | [@emegeme](https://github.com/emegeme)    | [CC0](https://creativecommons.org/publicdomain/zero/1.0/)     | - | | ||||||
|  | | heightmap.png          | [@raysan5](https://github.com/raysan5)    | [CC0](https://creativecommons.org/publicdomain/zero/1.0/)     | - | | ||||||
|  | | dresden_square_1k.hdr  | [HDRIHaven](https://hdrihaven.com/hdri/?h=dresden_square) | [CC0](https://hdrihaven.com/p/license.php) | - | | ||||||
|  | | dresden_square_2k.hdr  | [HDRIHaven](https://hdrihaven.com/hdri/?h=dresden_square) | [CC0](https://hdrihaven.com/p/license.php) | - | | ||||||
|  | | skybox.png             |  ❔            | ❔     | - | | ||||||
| After Width: | Height: | Size: 22 KiB | 
| After Width: | Height: | Size: 164 B | 
| After Width: | Height: | Size: 36 KiB | 
| After Width: | Height: | Size: 11 KiB | 
|  | @ -0,0 +1,2 @@ | ||||||
|  | robot.glb model by @Quaternius (https://www.patreon.com/quaternius) | ||||||
|  | Licensed under CC0 1.0 Universal (CC0 1.0) - Public Domain Dedication (https://creativecommons.org/publicdomain/zero/1.0/) | ||||||
| After Width: | Height: | Size: 295 KiB | 
| After Width: | Height: | Size: 311 KiB | 
| After Width: | Height: | Size: 434 KiB | 
|  | @ -0,0 +1,68 @@ | ||||||
|  | # reference material | ||||||
|  | #mtllib cube.mtl | ||||||
|  | 
 | ||||||
|  | # object box | ||||||
|  | 
 | ||||||
|  | # vertex  (XZY) | ||||||
|  | v  5.5  0  1.5 | ||||||
|  | v  8.5  0  1.5 | ||||||
|  | v  5.5  0  -1.5 | ||||||
|  | v  8.5  0  -1.5 | ||||||
|  | v  5.5  3  1.5 | ||||||
|  | v  8.5  3  1.5 | ||||||
|  | v  5.5  3  -1.5 | ||||||
|  | v  8.5  3  -1.5 | ||||||
|  | 
 | ||||||
|  | # normals  (XYZ) | ||||||
|  | vn  0  -1  0 | ||||||
|  | vn  0  1  0 | ||||||
|  | vn  0  0  1 | ||||||
|  | vn  1  0  0 | ||||||
|  | vn  0  0  -1 | ||||||
|  | vn  -1  0  0 | ||||||
|  | 
 | ||||||
|  | # UVs (XY) | ||||||
|  | vt 0.5  0    0  | ||||||
|  | vt 1    0    0 | ||||||
|  | vt 1    0.5  0 | ||||||
|  | vt 0.5  0.5  0 | ||||||
|  | vt 0.5  0.5  0 | ||||||
|  | vt 1    0.5  0 | ||||||
|  | vt 0.5  1    0 | ||||||
|  | vt 1    1    0 | ||||||
|  | vt 0    0.5  0 | ||||||
|  | vt 1    0.5  0 | ||||||
|  | vt 1    0    0 | ||||||
|  | vt 0    0    0 | ||||||
|  | vt 0    0.5  0 | ||||||
|  | vt 1    0.5  0 | ||||||
|  | vt 1    1    0 | ||||||
|  | vt 0    1    0 | ||||||
|  | vt 0.5  0    0 | ||||||
|  | vt 0    0    0 | ||||||
|  | vt 0    0.5  0 | ||||||
|  | vt 0.5  0.5  0 | ||||||
|  | vt 0    0.5  0 | ||||||
|  | vt 0.5  0.5  0 | ||||||
|  | vt 0.5  1    0 | ||||||
|  | vt 0    1    0 | ||||||
|  | 
 | ||||||
|  | # merger  | ||||||
|  | g box | ||||||
|  | 
 | ||||||
|  | # reference material | ||||||
|  | #usemtl mat01 | ||||||
|  | 
 | ||||||
|  | # faces | ||||||
|  | f 1/9/1 3/10/1 4/11/1  | ||||||
|  | f 4/11/1 2/12/1 1/9/1  | ||||||
|  | f 5/13/2 6/14/2 8/15/2  | ||||||
|  | f 8/15/2 7/16/2 5/13/2  | ||||||
|  | f 1/17/6 2/18/6 6/19/6  | ||||||
|  | f 6/19/6 5/20/6 1/17/6  | ||||||
|  | f 2/6/1 4/5/1 8/7/1  | ||||||
|  | f 8/7/1 6/8/1 2/6/1 | ||||||
|  | f 4/2/3 3/1/3 7/4/3  | ||||||
|  | f 7/4/3 8/3/3 4/2/3  | ||||||
|  | f 3/22/5 1/21/5 5/24/5  | ||||||
|  | f 5/24/5 7/23/5 3/22/5  | ||||||
| After Width: | Height: | Size: 23 KiB | 
| After Width: | Height: | Size: 383 KiB | 
| After Width: | Height: | Size: 380 KiB | 
| After Width: | Height: | Size: 804 KiB | 
| After Width: | Height: | Size: 371 KiB | 
| After Width: | Height: | Size: 334 KiB | 
|  | @ -0,0 +1,9 @@ | ||||||
|  | The following models are provided by the official github repo of voxel-model format by MagikaVoxel developer @ephtracy | ||||||
|  | 
 | ||||||
|  | GitHub official repo: https://github.com/ephtracy/voxel-model | ||||||
|  | 
 | ||||||
|  |  - chr_knight.vox - https://github.com/ephtracy/voxel-model/blob/master/vox/character/chr_knight.vox | ||||||
|  |  - chr_sword.vox - https://github.com/ephtracy/voxel-model/blob/master/vox/character/chr_sword.vox | ||||||
|  |  - monu9.vox - https://github.com/ephtracy/voxel-model/blob/master/vox/monument/monu9.vox | ||||||
|  |   | ||||||
|  | Worth mentioning there is no license specified for the models yet: https://github.com/ephtracy/voxel-model/issues/22 | ||||||
|  | @ -0,0 +1,29 @@ | ||||||
|  | #version 100 | ||||||
|  | 
 | ||||||
|  | precision mediump float; | ||||||
|  | 
 | ||||||
|  | // Input vertex attributes (from vertex shader) | ||||||
|  | varying vec3 fragPosition; | ||||||
|  | 
 | ||||||
|  | // Input uniform values | ||||||
|  | uniform sampler2D equirectangularMap; | ||||||
|  | 
 | ||||||
|  | vec2 SampleSphericalMap(vec3 v) | ||||||
|  | { | ||||||
|  |     vec2 uv = vec2(atan(v.z, v.x), asin(v.y)); | ||||||
|  |     uv *= vec2(0.1591, 0.3183); | ||||||
|  |     uv += 0.5; | ||||||
|  |     return uv; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  |     // Normalize local position | ||||||
|  |     vec2 uv = SampleSphericalMap(normalize(fragPosition)); | ||||||
|  | 
 | ||||||
|  |     // Fetch color from texture map | ||||||
|  |     vec3 color = texture2D(equirectangularMap, uv).rgb; | ||||||
|  | 
 | ||||||
|  |     // Calculate final fragment color | ||||||
|  |     gl_FragColor = vec4(color, 1.0); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,20 @@ | ||||||
|  | #version 100 | ||||||
|  | 
 | ||||||
|  | // Input vertex attributes | ||||||
|  | attribute vec3 vertexPosition; | ||||||
|  | 
 | ||||||
|  | // Input uniform values | ||||||
|  | uniform mat4 matProjection; | ||||||
|  | uniform mat4 matView; | ||||||
|  | 
 | ||||||
|  | // Output vertex attributes (to fragment shader) | ||||||
|  | varying vec3 fragPosition; | ||||||
|  | 
 | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  |     // Calculate fragment position based on model transformations | ||||||
|  |     fragPosition = vertexPosition; | ||||||
|  | 
 | ||||||
|  |     // Calculate final vertex position | ||||||
|  |     gl_Position = matProjection*matView*vec4(vertexPosition, 1.0); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,31 @@ | ||||||
|  | #version 100 | ||||||
|  | 
 | ||||||
|  | precision mediump float; | ||||||
|  | 
 | ||||||
|  | // Input vertex attributes (from vertex shader) | ||||||
|  | varying vec3 fragPosition; | ||||||
|  | 
 | ||||||
|  | // Input uniform values | ||||||
|  | uniform samplerCube environmentMap; | ||||||
|  | uniform bool vflipped; | ||||||
|  | uniform bool doGamma; | ||||||
|  | 
 | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  |     // Fetch color from texture map | ||||||
|  |     vec4 texelColor = vec4(0.0); | ||||||
|  | 
 | ||||||
|  |     if (vflipped) texelColor = textureCube(environmentMap, vec3(fragPosition.x, -fragPosition.y, fragPosition.z)); | ||||||
|  |     else texelColor = textureCube(environmentMap, fragPosition); | ||||||
|  | 
 | ||||||
|  |     vec3 color = vec3(texelColor.x, texelColor.y, texelColor.z); | ||||||
|  | 
 | ||||||
|  |     if (doGamma) // Apply gamma correction | ||||||
|  |     { | ||||||
|  |         color = color/(color + vec3(1.0)); | ||||||
|  |         color = pow(color, vec3(1.0/2.2)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Calculate final fragment color | ||||||
|  |     gl_FragColor = vec4(color, 1.0); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,24 @@ | ||||||
|  | #version 100 | ||||||
|  | 
 | ||||||
|  | // Input vertex attributes | ||||||
|  | attribute vec3 vertexPosition; | ||||||
|  | 
 | ||||||
|  | // Input uniform values | ||||||
|  | uniform mat4 matProjection; | ||||||
|  | uniform mat4 matView; | ||||||
|  | 
 | ||||||
|  | // Output vertex attributes (to fragment shader) | ||||||
|  | varying vec3 fragPosition; | ||||||
|  | 
 | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  |     // Calculate fragment position based on model transformations | ||||||
|  |     fragPosition = vertexPosition; | ||||||
|  | 
 | ||||||
|  |     // Remove translation from the view matrix | ||||||
|  |     mat4 rotView = mat4(mat3(matView)); | ||||||
|  |     vec4 clipPos = matProjection*rotView*vec4(vertexPosition, 1.0); | ||||||
|  | 
 | ||||||
|  |     // Calculate final vertex position | ||||||
|  |     gl_Position = clipPos; | ||||||
|  | } | ||||||