diff --git a/examples/core/core_quat_conversion.c b/examples/core/core_quat_conversion.c index f3c9b757e..3fc98b3df 100644 --- a/examples/core/core_quat_conversion.c +++ b/examples/core/core_quat_conversion.c @@ -10,7 +10,7 @@ * * Example contributed by Chris Camacho (@chriscamacho) and reviewed by Ramon Santamaria (@raysan5) * -* Copyright (c) 2020 Chris Camacho (@chriscamacho) and Ramon Santamaria (@raysan5) +* Copyright (c) 2020-2021 Chris Camacho (@chriscamacho) and Ramon Santamaria (@raysan5) * ********************************************************************************************/ @@ -32,15 +32,23 @@ int main(void) 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 + camera.projection = CAMERA_PERSPECTIVE; // Camera mode type - Mesh mesh = GenMeshCylinder(0.2f, 1.0f, 32); - Model model = LoadModelFromMesh(mesh); + // Load a cylinder model for testing + Model model = LoadModelFromMesh(GenMeshCylinder(0.2f, 1.0f, 32)); - // Some required variables + // Generic quaternion for operations Quaternion q1 = { 0 }; - Matrix m1 = { 0 }, m2 = { 0 }, m3 = { 0 }, m4 = { 0 }; - Vector3 v1 = { 0 }, v2 = { 0 }; + + // Transform matrices required to draw 4 cylinders + Matrix m1 = { 0 }; + Matrix m2 = { 0 }; + Matrix m3 = { 0 }; + Matrix m4 = { 0 }; + + // Generic vectors for rotations + Vector3 v1 = { 0 }; + Vector3 v2 = { 0 }; SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -50,6 +58,10 @@ int main(void) { // Update //-------------------------------------------------------------------------------------- + if (v2.x < 0) v2.x += PI*2; + if (v2.y < 0) v2.y += PI*2; + if (v2.z < 0) v2.z += PI*2; + if (!IsKeyDown(KEY_SPACE)) { v1.x += 0.01f; @@ -68,7 +80,7 @@ int main(void) q1 = QuaternionFromMatrix(m1); m3 = QuaternionToMatrix(q1); - v2 = QuaternionToEuler(q1); + v2 = QuaternionToEuler(q1); // Angles returned in radians m4 = MatrixRotateZYX(v2); //-------------------------------------------------------------------------------------- @@ -83,10 +95,13 @@ int main(void) model.transform = m1; DrawModel(model, (Vector3){ -1, 0, 0 }, 1.0f, RED); + model.transform = m2; DrawModel(model, (Vector3){ 1, 0, 0 }, 1.0f, RED); + model.transform = m3; DrawModel(model, (Vector3){ 0, 0, 0 }, 1.0f, RED); + model.transform = m4; DrawModel(model, (Vector3){ 0, 0, -1 }, 1.0f, RED); @@ -94,23 +109,13 @@ int main(void) EndMode3D(); - if (v2.x < 0) v2.x += PI*2; - if (v2.y < 0) v2.y += PI*2; - if (v2.z < 0) v2.z += PI*2; - - Color cx,cy,cz; - cx = cy = cz = BLACK; - if (v1.x == v2.x) cx = GREEN; - if (v1.y == v2.y) cy = GREEN; - if (v1.z == v2.z) cz = GREEN; - - DrawText(TextFormat("%2.3f", v1.x), 20, 20, 20, cx); - DrawText(TextFormat("%2.3f", v1.y), 20, 40, 20, cy); - DrawText(TextFormat("%2.3f", v1.z), 20, 60, 20, cz); + DrawText(TextFormat("%2.3f", v1.x), 20, 20, 20, (v1.x == v2.x)? GREEN: BLACK); + DrawText(TextFormat("%2.3f", v1.y), 20, 40, 20, (v1.y == v2.y)? GREEN: BLACK); + DrawText(TextFormat("%2.3f", v1.z), 20, 60, 20, (v1.z == v2.z)? GREEN: BLACK); - DrawText(TextFormat("%2.3f", v2.x), 200, 20, 20, cx); - DrawText(TextFormat("%2.3f", v2.y), 200, 40, 20, cy); - DrawText(TextFormat("%2.3f", v2.z), 200, 60, 20, cz); + DrawText(TextFormat("%2.3f", v2.x), 200, 20, 20, (v1.x == v2.x)? GREEN: BLACK); + DrawText(TextFormat("%2.3f", v2.y), 200, 40, 20, (v1.y == v2.y)? GREEN: BLACK); + DrawText(TextFormat("%2.3f", v2.z), 200, 60, 20, (v1.z == v2.z)? GREEN: BLACK); EndDrawing(); //---------------------------------------------------------------------------------- diff --git a/examples/core/core_random_values.c b/examples/core/core_random_values.c index 260e708cc..b44b5faf4 100644 --- a/examples/core/core_random_values.c +++ b/examples/core/core_random_values.c @@ -20,10 +20,12 @@ int main(void) InitWindow(screenWidth, screenHeight, "raylib [core] example - generate random values"); - int framesCounter = 0; // Variable used to count frames + // 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 //-------------------------------------------------------------------------------------- diff --git a/examples/core/core_2d_camera_smooth_pixelperfect.c b/examples/core/core_smooth_pixelperfect.c similarity index 97% rename from examples/core/core_2d_camera_smooth_pixelperfect.c rename to examples/core/core_smooth_pixelperfect.c index 75ffe262a..86a647010 100644 --- a/examples/core/core_2d_camera_smooth_pixelperfect.c +++ b/examples/core/core_smooth_pixelperfect.c @@ -1,118 +1,117 @@ -/******************************************************************************************* -* -* raylib [core] example - smooth pixel-perfect camera -* -* This example has been created using raylib 3.7 (www.raylib.com) -* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) -* -* Example contributed by Giancamillo Alessandroni (@NotManyIdeasDev) and -* reviewed by Ramon Santamaria (@raysan5) -* -* Copyright (c) 2021 Giancamillo Alessandroni (@NotManyIdeasDev) and Ramon Santamaria (@raysan5) -* -********************************************************************************************/ - -#include "raylib.h" - -#include <math.h> // Required for: sinf(), cosf() - -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; +/******************************************************************************************* +* +* raylib [core] example - smooth pixel-perfect camera +* +* This example has been created using raylib 3.7 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Example contributed by Giancamillo Alessandroni (@NotManyIdeasDev) and +* reviewed by Ramon Santamaria (@raysan5) +* +* Copyright (c) 2021 Giancamillo Alessandroni (@NotManyIdeasDev) and Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +#include <math.h> // Required for: sinf(), cosf() + +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; } \ No newline at end of file diff --git a/examples/core/core_split_screen.c b/examples/core/core_split_screen.c index 31c3fb4bf..1f4242e76 100644 --- a/examples/core/core_split_screen.c +++ b/examples/core/core_split_screen.c @@ -122,7 +122,7 @@ int main(void) BeginMode3D(cameraPlayer1); DrawScene(); EndMode3D(); - DrawText("PLAYER1 W/S to move", 0, 0, 20, RED); + DrawText("PLAYER1 W/S to move", 10, 10, 20, RED); EndTextureMode(); // Draw Player2 view to the render texture @@ -131,7 +131,7 @@ int main(void) BeginMode3D(cameraPlayer2); DrawScene(); EndMode3D(); - DrawText("PLAYER2 UP/DOWN to move", 0, 0, 20, BLUE); + DrawText("PLAYER2 UP/DOWN to move", 10, 10, 20, BLUE); EndTextureMode(); // Draw both views render textures to the screen side by side diff --git a/examples/textures/textures_poly.c b/examples/textures/textures_polygon.c similarity index 82% rename from examples/textures/textures_poly.c rename to examples/textures/textures_polygon.c index a2423a4bb..9d26505e2 100644 --- a/examples/textures/textures_poly.c +++ b/examples/textures/textures_polygon.c @@ -15,7 +15,7 @@ #include "raylib.h" #include "raymath.h" -#define MAX_POINTS 11 // 10 points and back to the start +#define MAX_POINTS 11 // 10 points and back to the start int main(void) { @@ -23,7 +23,10 @@ int main(void) //-------------------------------------------------------------------------------------- const int screenWidth = 800; const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [textures] example - textured polygon"); + // Define texture coordinates to map our texture to poly Vector2 texcoords[MAX_POINTS] = { (Vector2){ 0.75f, 0.0f }, (Vector2){ 0.25f, 0.0f }, @@ -38,22 +41,24 @@ int main(void) (Vector2){ 0.75f, 0.0f} // Close the poly }; + // Define the base poly vertices from the UV's + // NOTE: They can be specified in any other way Vector2 points[MAX_POINTS] = { 0 }; - - // Create the poly coords from the UV's - // you don't have to do this you can specify - // them however you want for (int i = 0; i < MAX_POINTS; i++) { points[i].x = (texcoords[i].x - 0.5f)*256.0f; points[i].y = (texcoords[i].y - 0.5f)*256.0f; } + + // Define the vertices drawing position + // NOTE: Initially same as points but updated every frame + Vector2 positions[MAX_POINTS] = { 0 }; + for (int i = 0; i < MAX_POINTS; i++) positions[i] = points[i]; - InitWindow(screenWidth, screenHeight, "raylib [textures] example - textured polygon"); - + // Load texture to be mapped to poly Texture texture = LoadTexture("resources/cat.png"); - float angle = 0.0f; + float angle = 0.0f; // Rotation angle (in degrees) SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -63,10 +68,9 @@ int main(void) { // Update //---------------------------------------------------------------------------------- + // Update points rotation with an angle transform + // NOTE: Base points position are not modified angle++; - - Vector2 positions[MAX_POINTS] = { 0 }; - for (int i = 0; i < MAX_POINTS; i++) positions[i] = Vector2Rotate(points[i], angle*DEG2RAD); //---------------------------------------------------------------------------------- diff --git a/examples/textures/textures_poly.png b/examples/textures/textures_polygon.png similarity index 100% rename from examples/textures/textures_poly.png rename to examples/textures/textures_polygon.png