From 639f41cf5412affbe85439e318205cf855716114 Mon Sep 17 00:00:00 2001 From: Ray Date: Sat, 30 Sep 2017 00:45:03 +0200 Subject: Renamed example file --- examples/models/models_plane_rotations.c | 198 ------------------------------- examples/models/models_yaw_pitch_roll.c | 198 +++++++++++++++++++++++++++++++ 2 files changed, 198 insertions(+), 198 deletions(-) delete mode 100644 examples/models/models_plane_rotations.c create mode 100644 examples/models/models_yaw_pitch_roll.c (limited to 'examples/models') diff --git a/examples/models/models_plane_rotations.c b/examples/models/models_plane_rotations.c deleted file mode 100644 index 8178a5e8..00000000 --- a/examples/models/models_plane_rotations.c +++ /dev/null @@ -1,198 +0,0 @@ -/******************************************************************************************* -* -* raylib [models] example - Plane rotations (pitch, roll, yaw) -* -* This example has been created using raylib 1.8 (www.raylib.com) -* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) -* -* Example based on Berni work on Raspberry Pi: -* http://forum.raylib.com/index.php?p=/discussion/124/line-versus-triangle-drawing-order -* -* Copyright (c) 2017 Ramon Santamaria (@raysan5) -* -********************************************************************************************/ - -#include "raylib.h" -#include "raymath.h" - -// Draw angle gauge controls -void DrawAngleGauge(Texture2D angleGauge, int x, int y, float angle, char title[], Color color); - -//---------------------------------------------------------------------------------- -// Main entry point -//---------------------------------------------------------------------------------- -int main() -{ - // Initialization - //-------------------------------------------------------------------------------------- - const int screenWidth = 800; - const int screenHeight = 450; - - InitWindow(screenWidth, screenHeight, "raylib [models] example - plane rotations (pitch, roll, yaw)"); - - Texture2D texAngleGauge = LoadTexture("resources/angle_gauge.png"); - Texture2D texBackground = LoadTexture("resources/background.png"); - Texture2D texPitch = LoadTexture("resources/pitch.png"); - Texture2D texPlane = LoadTexture("resources/plane.png"); - - RenderTexture2D framebuffer = LoadRenderTexture(192, 192); - - // Model loading - Model model = LoadModel("resources/plane.obj"); // Load OBJ model - model.material.maps[MAP_DIFFUSE].texture = LoadTexture("resources/plane_diffuse.png"); // Set map diffuse texture - - GenTextureMipmaps(&model.material.maps[MAP_DIFFUSE].texture); - - Camera camera = { 0 }; - camera.position = (Vector3){ 0.0f, 60.0f, -120.0f };// Camera position perspective - camera.target = (Vector3){ 0.0f, 12.0f, 0.0f }; // Camera looking at point - camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) - camera.fovy = 30.0f; // Camera field-of-view Y - - float pitch = 0.0f; - float roll = 0.0f; - float yaw = 0.0f; - - SetTargetFPS(60); - //-------------------------------------------------------------------------------------- - - - while (!WindowShouldClose()) // Detect window close button or ESC key - { - // Update - //---------------------------------------------------------------------------------- - - // Plane roll (x-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; - } - - // Plane pitch (z-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; - } - - // Wraps the phase of an angle to fit between -180 and +180 degrees - int pitchOffset = pitch; - while (pitchOffset > 180) pitchOffset -= 360; - while (pitchOffset < -180) pitchOffset += 360; - pitchOffset *= 10; - - // 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; - } - - Matrix transform = MatrixIdentity(); - - transform = MatrixMultiply(transform, MatrixRotateZ(DEG2RAD*roll)); - transform = MatrixMultiply(transform, MatrixRotateX(DEG2RAD*pitch)); - transform = MatrixMultiply(transform, MatrixRotateY(DEG2RAD*yaw)); - - model.transform = transform; - //---------------------------------------------------------------------------------- - - // Draw - //---------------------------------------------------------------------------------- - BeginDrawing(); - - ClearBackground(RAYWHITE); - - // Draw framebuffer texture (Ahrs Display) - int centerX = framebuffer.texture.width/2; - int centerY = framebuffer.texture.height/2; - float scaleFactor = 0.5f; - - BeginTextureMode(framebuffer); - - BeginBlendMode(BLEND_ALPHA); - - DrawTexturePro(texBackground, (Rectangle){0,0,texBackground.width, texBackground.height}, - (Rectangle){ centerX, centerY, texBackground.width*scaleFactor, texBackground.height*scaleFactor}, - (Vector2){texBackground.width/2*scaleFactor, texBackground.height/2*scaleFactor + pitchOffset*scaleFactor}, roll, WHITE); - - DrawTexturePro(texPitch, (Rectangle){ 0, 0, texPitch.width, texPitch.height }, - (Rectangle){ centerX, centerY, texPitch.width*scaleFactor, texPitch.height*scaleFactor }, - (Vector2){ texPitch.width/2*scaleFactor, texPitch.height/2*scaleFactor + pitchOffset*scaleFactor }, roll, WHITE); - - DrawTexturePro(texPlane, (Rectangle){0,0,texPlane.width, texPlane.height }, - (Rectangle){ centerX, centerY, texPlane.width*scaleFactor, texPlane.height*scaleFactor }, - (Vector2){texPlane.width/2*scaleFactor, texPlane.height/2*scaleFactor }, 0, WHITE); - - EndBlendMode(); - - EndTextureMode(); - - // Draw 3D model (recomended to draw 3D always before 2D) - Begin3dMode(camera); - - DrawModel(model, (Vector3){ 0, 6.0f, 0 }, 1.0f, WHITE); // Draw 3d model with texture - DrawGrid(10, 10.0f); - - End3dMode(); - - // Draw 2D GUI stuff - DrawAngleGauge(texAngleGauge, 80, 80, roll, "roll", RED); - DrawAngleGauge(texAngleGauge, 190, 80, pitch, "pitch", GREEN); - DrawAngleGauge(texAngleGauge, 300, 80, yaw, "yaw", SKYBLUE); - - DrawRectangle(30, 360, 260, 70, Fade(SKYBLUE, 0.5f)); - DrawRectangleLines(30, 360, 260, 70, Fade(DARKBLUE, 0.5f)); - DrawText("Pitch controlled with: KEY_UP / KEY_DOWN", 40, 370, 10, DARKGRAY); - DrawText("Roll controlled with: KEY_LEFT / KEY_RIGHT", 40, 390, 10, DARKGRAY); - DrawText("Yaw controlled with: KEY_A / KEY_S", 40, 410, 10, DARKGRAY); - - // Draw framebuffer texture - DrawTextureRec(framebuffer.texture, (Rectangle){ 0, 0, framebuffer.texture.width, -framebuffer.texture.height }, - (Vector2){ screenWidth - framebuffer.texture.width - 20, 20 }, Fade(WHITE, 0.8f)); - - DrawRectangleLines(screenWidth - framebuffer.texture.width - 20, 20, framebuffer.texture.width, framebuffer.texture.height, DARKGRAY); - - EndDrawing(); - //---------------------------------------------------------------------------------- - } - - // De-Initialization - //-------------------------------------------------------------------------------------- - - // Unload all loaded data - UnloadModel(model); - - UnloadRenderTexture(framebuffer); - - UnloadTexture(texAngleGauge); - UnloadTexture(texBackground); - UnloadTexture(texPitch); - UnloadTexture(texPlane); - - CloseWindow(); // Close window and OpenGL context - //-------------------------------------------------------------------------------------- - - return 0; -} - -// Draw angle gauge controls -void DrawAngleGauge(Texture2D angleGauge, int x, int y, float angle, char title[], Color color) -{ - Rectangle srcRec = { 0, 0, angleGauge.width, angleGauge.height }; - Rectangle dstRec = { x, y, angleGauge.width, angleGauge.height }; - Vector2 origin = { angleGauge.width/2, angleGauge.height/2}; - int textSize = 20; - - DrawTexturePro(angleGauge, srcRec, dstRec, origin, angle, color); - - DrawText(FormatText("%5.1f°", angle), x - MeasureText(FormatText("%5.1f°", angle), textSize) / 2, y + 10, textSize, DARKGRAY); - DrawText(title, x - MeasureText(title, textSize) / 2, y + 60, textSize, DARKGRAY); -} \ No newline at end of file diff --git a/examples/models/models_yaw_pitch_roll.c b/examples/models/models_yaw_pitch_roll.c new file mode 100644 index 00000000..2bae2bf8 --- /dev/null +++ b/examples/models/models_yaw_pitch_roll.c @@ -0,0 +1,198 @@ +/******************************************************************************************* +* +* raylib [models] example - Plane rotations (yaw, pitch, roll) +* +* This example has been created using raylib 1.8 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Example based on Berni work on Raspberry Pi: +* http://forum.raylib.com/index.php?p=/discussion/124/line-versus-triangle-drawing-order +* +* Copyright (c) 2017 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" +#include "raymath.h" + +// Draw angle gauge controls +void DrawAngleGauge(Texture2D angleGauge, int x, int y, float angle, char title[], Color color); + +//---------------------------------------------------------------------------------- +// Main entry point +//---------------------------------------------------------------------------------- +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [models] example - plane rotations (yaw, pitch, roll)"); + + Texture2D texAngleGauge = LoadTexture("resources/angle_gauge.png"); + Texture2D texBackground = LoadTexture("resources/background.png"); + Texture2D texPitch = LoadTexture("resources/pitch.png"); + Texture2D texPlane = LoadTexture("resources/plane.png"); + + RenderTexture2D framebuffer = LoadRenderTexture(192, 192); + + // Model loading + Model model = LoadModel("resources/plane.obj"); // Load OBJ model + model.material.maps[MAP_DIFFUSE].texture = LoadTexture("resources/plane_diffuse.png"); // Set map diffuse texture + + GenTextureMipmaps(&model.material.maps[MAP_DIFFUSE].texture); + + Camera camera = { 0 }; + camera.position = (Vector3){ 0.0f, 60.0f, -120.0f };// Camera position perspective + camera.target = (Vector3){ 0.0f, 12.0f, 0.0f }; // Camera looking at point + camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) + camera.fovy = 30.0f; // Camera field-of-view Y + + float pitch = 0.0f; + float roll = 0.0f; + float yaw = 0.0f; + + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + + // Plane roll (x-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; + } + + // 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 pitch (z-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; + } + + // Wraps the phase of an angle to fit between -180 and +180 degrees + int pitchOffset = pitch; + while (pitchOffset > 180) pitchOffset -= 360; + while (pitchOffset < -180) pitchOffset += 360; + pitchOffset *= 10; + + Matrix transform = MatrixIdentity(); + + transform = MatrixMultiply(transform, MatrixRotateZ(DEG2RAD*roll)); + transform = MatrixMultiply(transform, MatrixRotateX(DEG2RAD*pitch)); + transform = MatrixMultiply(transform, MatrixRotateY(DEG2RAD*yaw)); + + model.transform = transform; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + // Draw framebuffer texture (Ahrs Display) + int centerX = framebuffer.texture.width/2; + int centerY = framebuffer.texture.height/2; + float scaleFactor = 0.5f; + + BeginTextureMode(framebuffer); + + BeginBlendMode(BLEND_ALPHA); + + DrawTexturePro(texBackground, (Rectangle){0,0,texBackground.width, texBackground.height}, + (Rectangle){ centerX, centerY, texBackground.width*scaleFactor, texBackground.height*scaleFactor}, + (Vector2){texBackground.width/2*scaleFactor, texBackground.height/2*scaleFactor + pitchOffset*scaleFactor}, roll, WHITE); + + DrawTexturePro(texPitch, (Rectangle){ 0, 0, texPitch.width, texPitch.height }, + (Rectangle){ centerX, centerY, texPitch.width*scaleFactor, texPitch.height*scaleFactor }, + (Vector2){ texPitch.width/2*scaleFactor, texPitch.height/2*scaleFactor + pitchOffset*scaleFactor }, roll, WHITE); + + DrawTexturePro(texPlane, (Rectangle){0,0,texPlane.width, texPlane.height }, + (Rectangle){ centerX, centerY, texPlane.width*scaleFactor, texPlane.height*scaleFactor }, + (Vector2){texPlane.width/2*scaleFactor, texPlane.height/2*scaleFactor }, 0, WHITE); + + EndBlendMode(); + + EndTextureMode(); + + // Draw 3D model (recomended to draw 3D always before 2D) + Begin3dMode(camera); + + DrawModel(model, (Vector3){ 0, 6.0f, 0 }, 1.0f, WHITE); // Draw 3d model with texture + DrawGrid(10, 10.0f); + + End3dMode(); + + // Draw 2D GUI stuff + DrawAngleGauge(texAngleGauge, 80, 80, roll, "roll", RED); + DrawAngleGauge(texAngleGauge, 190, 80, pitch, "pitch", GREEN); + DrawAngleGauge(texAngleGauge, 300, 80, yaw, "yaw", SKYBLUE); + + DrawRectangle(30, 360, 260, 70, Fade(SKYBLUE, 0.5f)); + DrawRectangleLines(30, 360, 260, 70, Fade(DARKBLUE, 0.5f)); + DrawText("Pitch controlled with: KEY_UP / KEY_DOWN", 40, 370, 10, DARKGRAY); + DrawText("Roll controlled with: KEY_LEFT / KEY_RIGHT", 40, 390, 10, DARKGRAY); + DrawText("Yaw controlled with: KEY_A / KEY_S", 40, 410, 10, DARKGRAY); + + // Draw framebuffer texture + DrawTextureRec(framebuffer.texture, (Rectangle){ 0, 0, framebuffer.texture.width, -framebuffer.texture.height }, + (Vector2){ screenWidth - framebuffer.texture.width - 20, 20 }, Fade(WHITE, 0.8f)); + + DrawRectangleLines(screenWidth - framebuffer.texture.width - 20, 20, framebuffer.texture.width, framebuffer.texture.height, DARKGRAY); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + + // Unload all loaded data + UnloadModel(model); + + UnloadRenderTexture(framebuffer); + + UnloadTexture(texAngleGauge); + UnloadTexture(texBackground); + UnloadTexture(texPitch); + UnloadTexture(texPlane); + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} + +// Draw angle gauge controls +void DrawAngleGauge(Texture2D angleGauge, int x, int y, float angle, char title[], Color color) +{ + Rectangle srcRec = { 0, 0, angleGauge.width, angleGauge.height }; + Rectangle dstRec = { x, y, angleGauge.width, angleGauge.height }; + Vector2 origin = { angleGauge.width/2, angleGauge.height/2}; + int textSize = 20; + + DrawTexturePro(angleGauge, srcRec, dstRec, origin, angle, color); + + DrawText(FormatText("%5.1f°", angle), x - MeasureText(FormatText("%5.1f°", angle), textSize) / 2, y + 10, textSize, DARKGRAY); + DrawText(title, x - MeasureText(title, textSize) / 2, y + 60, textSize, DARKGRAY); +} \ No newline at end of file -- cgit v1.2.3 From 2051be3825afb89e7dc01711c573827491e14789 Mon Sep 17 00:00:00 2001 From: raysan5 Date: Mon, 9 Oct 2017 10:13:02 +0200 Subject: Add mesh generation example -IN PROGRESS- --- examples/models/models_mesh_generation.c | 89 +++++++++++++++++++++++++++++++ examples/models/resources/pixels.png | Bin 0 -> 168 bytes 2 files changed, 89 insertions(+) create mode 100644 examples/models/models_mesh_generation.c create mode 100644 examples/models/resources/pixels.png (limited to 'examples/models') diff --git a/examples/models/models_mesh_generation.c b/examples/models/models_mesh_generation.c new file mode 100644 index 00000000..2b3d5c5f --- /dev/null +++ b/examples/models/models_mesh_generation.c @@ -0,0 +1,89 @@ +/******************************************************************************************* +* +* raylib example - procedural mesh generation +* +* This example has been created using raylib 1.8 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2017 Ramon Santamaria (Ray San) +* +********************************************************************************************/ + +#include "raylib.h" + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [models] example - mesh generation"); + + //Model model = LoadModelFromMesh(GenMeshPlane(2, 2, 5, 5)); // Texture coordinates must be divided by resX, resZ + //Model model = LoadModelFromMesh(GenMeshCube(2.0f, 1.0f, 2.0f)); // OK! + //Model model = LoadModelFromMesh(GenMeshSphere(2, 32, 32)); // OK! (par_shapes) + //Model model = LoadModelFromMesh(GenMeshHemiSphere(2, 16, 16)); // OK! (par_shapes) + //Model model = LoadModelFromMesh(GenMeshCylinder(1, 2, 16)); // OK! (par_shapes) + Model model = LoadModelFromMesh(GenMeshTorus(0.25f, 4.0f, 16, 32)); + //Model model = LoadModelFromMesh(GenMeshKnot(1.0f, 2.0f, 16, 128)); + model.material.maps[MAP_DIFFUSE].texture = LoadTexture("resources/pixels.png"); + + // Debug information + /* + printf("model.mesh.vertexCount: %i\n", model.mesh.vertexCount); + printf("model.mesh.triangleCount: %i\n", model.mesh.triangleCount); + printf("model.mesh.vboId (position): %i\n", model.mesh.vboId[0]); + printf("model.mesh.vboId (texcoords): %i\n", model.mesh.vboId[1]); + printf("model.mesh.vboId (normals): %i\n", model.mesh.vboId[2]); + printf("model.mesh.vboId (indices): %i\n", model.mesh.vboId[6]); + */ + + // 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 }; + + Vector3 position = { 0.0f, 0.0f, 0.0f }; + + SetCameraMode(camera, CAMERA_FREE); // Set a free camera mode + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + UpdateCamera(&camera); // Update internal camera and our camera + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + Begin3dMode(camera); + + DrawModel(model, position, 1.0f, WHITE); + + DrawGrid(10, 1.0); + + End3dMode(); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadModel(model); + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/examples/models/resources/pixels.png b/examples/models/resources/pixels.png new file mode 100644 index 00000000..c9a4134b Binary files /dev/null and b/examples/models/resources/pixels.png differ -- cgit v1.2.3 From 9446746001fe0ae2255b901b03bdd835c21553ce Mon Sep 17 00:00:00 2001 From: raysan5 Date: Sat, 14 Oct 2017 00:11:37 +0200 Subject: Corrected issues on examples --- examples/models/models_mesh_picking.c | 2 +- examples/shaders/shaders_shapes_textures.c | 2 +- examples/shapes/shapes_basic_shapes.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'examples/models') diff --git a/examples/models/models_mesh_picking.c b/examples/models/models_mesh_picking.c index 2f54468a..e150fe92 100644 --- a/examples/models/models_mesh_picking.c +++ b/examples/models/models_mesh_picking.c @@ -89,7 +89,7 @@ int main() cursorColor = PURPLE; hitObjectName = "Triangle"; - bary = VectorBarycenter(nearestHit.position, ta, tb, tc); + bary = Vector3Barycenter(nearestHit.position, ta, tb, tc); hitTriangle = true; } else hitTriangle = false; diff --git a/examples/shaders/shaders_shapes_textures.c b/examples/shaders/shaders_shapes_textures.c index 40e99a8f..e8c36a19 100644 --- a/examples/shaders/shaders_shapes_textures.c +++ b/examples/shaders/shaders_shapes_textures.c @@ -65,7 +65,7 @@ int main() DrawText("USING CUSTOM SHADER", 190, 40, 10, RED); DrawRectangle(250 - 60, 90, 120, 60, RED); - DrawRectangleGradient(250 - 90, 170, 180, 130, MAROON, GOLD); + DrawRectangleGradientH(250 - 90, 170, 180, 130, MAROON, GOLD); DrawRectangleLines(250 - 40, 320, 80, 60, ORANGE); // Activate our default shader for next drawings diff --git a/examples/shapes/shapes_basic_shapes.c b/examples/shapes/shapes_basic_shapes.c index 6b2719fc..4b7cc261 100644 --- a/examples/shapes/shapes_basic_shapes.c +++ b/examples/shapes/shapes_basic_shapes.c @@ -46,7 +46,7 @@ int main() DrawCircleLines(screenWidth/4, 340, 80, DARKBLUE); DrawRectangle(screenWidth/4*2 - 60, 100, 120, 60, RED); - DrawRectangleGradient(screenWidth/4*2 - 90, 170, 180, 130, MAROON, GOLD); + DrawRectangleGradientH(screenWidth/4*2 - 90, 170, 180, 130, MAROON, GOLD); DrawRectangleLines(screenWidth/4*2 - 40, 320, 80, 60, ORANGE); DrawTriangle((Vector2){screenWidth/4*3, 80}, -- cgit v1.2.3 From 5dc216f4196603a9b5951b596ac2b9b0e84d56e3 Mon Sep 17 00:00:00 2001 From: Ray San Date: Tue, 17 Oct 2017 11:51:50 +0200 Subject: Improved some examples --- examples/models/models_material_pbr.png | Bin 193874 -> 324224 bytes examples/models/models_mesh_generation.c | 74 ++++++++++++++------- examples/models/models_plane_rotations.png | Bin 183992 -> 0 bytes examples/models/models_yaw_pitch_roll.png | Bin 0 -> 183992 bytes .../textures/resources/custom_jupiter_crash.png | Bin 0 -> 23596 bytes examples/textures/textures_image_drawing.c | 8 +++ examples/textures/textures_image_generation.c | 44 ++++++++---- examples/textures/textures_image_generation.png | Bin 222595 -> 225357 bytes 8 files changed, 87 insertions(+), 39 deletions(-) delete mode 100644 examples/models/models_plane_rotations.png create mode 100644 examples/models/models_yaw_pitch_roll.png create mode 100644 examples/textures/resources/custom_jupiter_crash.png (limited to 'examples/models') diff --git a/examples/models/models_material_pbr.png b/examples/models/models_material_pbr.png index cde171b9..86ba01b0 100644 Binary files a/examples/models/models_material_pbr.png and b/examples/models/models_material_pbr.png differ diff --git a/examples/models/models_mesh_generation.c b/examples/models/models_mesh_generation.c index 2b3d5c5f..72222156 100644 --- a/examples/models/models_mesh_generation.c +++ b/examples/models/models_mesh_generation.c @@ -11,9 +11,8 @@ #include "raylib.h" -//------------------------------------------------------------------------------------ -// Program main entry point -//------------------------------------------------------------------------------------ +#define NUM_MODELS 7 // We generate 7 parametric 3d shapes + int main() { // Initialization @@ -23,33 +22,35 @@ int main() InitWindow(screenWidth, screenHeight, "raylib [models] example - mesh generation"); - //Model model = LoadModelFromMesh(GenMeshPlane(2, 2, 5, 5)); // Texture coordinates must be divided by resX, resZ - //Model model = LoadModelFromMesh(GenMeshCube(2.0f, 1.0f, 2.0f)); // OK! - //Model model = LoadModelFromMesh(GenMeshSphere(2, 32, 32)); // OK! (par_shapes) - //Model model = LoadModelFromMesh(GenMeshHemiSphere(2, 16, 16)); // OK! (par_shapes) - //Model model = LoadModelFromMesh(GenMeshCylinder(1, 2, 16)); // OK! (par_shapes) - Model model = LoadModelFromMesh(GenMeshTorus(0.25f, 4.0f, 16, 32)); - //Model model = LoadModelFromMesh(GenMeshKnot(1.0f, 2.0f, 16, 128)); - model.material.maps[MAP_DIFFUSE].texture = LoadTexture("resources/pixels.png"); - - // Debug information - /* - printf("model.mesh.vertexCount: %i\n", model.mesh.vertexCount); - printf("model.mesh.triangleCount: %i\n", model.mesh.triangleCount); - printf("model.mesh.vboId (position): %i\n", model.mesh.vboId[0]); - printf("model.mesh.vboId (texcoords): %i\n", model.mesh.vboId[1]); - printf("model.mesh.vboId (normals): %i\n", model.mesh.vboId[2]); - printf("model.mesh.vboId (indices): %i\n", model.mesh.vboId[6]); - */ + // 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]; + + 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)); + // Set checked texture as default diffuse component for all models material + for (int i = 0; i < NUM_MODELS; i++) models[i].material.maps[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 }; + // Model drawing position Vector3 position = { 0.0f, 0.0f, 0.0f }; - SetCameraMode(camera, CAMERA_FREE); // Set a free camera mode + int currentModel = 0; + + SetCameraMode(camera, CAMERA_ORBITAL); // Set a orbital camera mode - SetTargetFPS(60); // Set our game to run at 60 frames-per-second + SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- // Main game loop @@ -58,6 +59,11 @@ int main() // Update //---------------------------------------------------------------------------------- UpdateCamera(&camera); // Update internal camera and our camera + + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) + { + currentModel = (currentModel + 1)%NUM_MODELS; // Cycle between the textures + } //---------------------------------------------------------------------------------- // Draw @@ -68,11 +74,27 @@ int main() Begin3dMode(camera); - DrawModel(model, position, 1.0f, WHITE); + DrawModel(models[currentModel], position, 1.0f, WHITE); DrawGrid(10, 1.0); End3dMode(); + + 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; + default: break; + } EndDrawing(); //---------------------------------------------------------------------------------- @@ -80,7 +102,9 @@ int main() // De-Initialization //-------------------------------------------------------------------------------------- - UnloadModel(model); + + // Unload models data (GPU VRAM) + for (int i = 0; i < NUM_MODELS; i++) UnloadModel(models[i]); CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- diff --git a/examples/models/models_plane_rotations.png b/examples/models/models_plane_rotations.png deleted file mode 100644 index 5400304d..00000000 Binary files a/examples/models/models_plane_rotations.png and /dev/null differ diff --git a/examples/models/models_yaw_pitch_roll.png b/examples/models/models_yaw_pitch_roll.png new file mode 100644 index 00000000..5400304d Binary files /dev/null and b/examples/models/models_yaw_pitch_roll.png differ diff --git a/examples/textures/resources/custom_jupiter_crash.png b/examples/textures/resources/custom_jupiter_crash.png new file mode 100644 index 00000000..451b591f Binary files /dev/null and b/examples/textures/resources/custom_jupiter_crash.png differ diff --git a/examples/textures/textures_image_drawing.c b/examples/textures/textures_image_drawing.c index 1c6a1fb9..ac128af9 100644 --- a/examples/textures/textures_image_drawing.c +++ b/examples/textures/textures_image_drawing.c @@ -36,6 +36,14 @@ int main() ImageCrop(&parrots, (Rectangle){ 0, 50, parrots.width, parrots.height - 100 }); // Crop resulting image UnloadImage(cat); // Unload image from RAM + + // Load custom font for frawing on image + SpriteFont font = LoadSpriteFont("resources/custom_jupiter_crash.png"); + + // Draw over image using custom font + ImageDrawTextEx(&parrots, (Vector2){ 300, 230 }, font, "PARROTS & CAT", font.baseSize, -2, WHITE); + + UnloadSpriteFont(font); // Unload custom spritefont (already drawn used on image) Texture2D texture = LoadTextureFromImage(parrots); // Image converted to texture, uploaded to GPU memory (VRAM) UnloadImage(parrots); // Once image has been converted to texture and uploaded to VRAM, it can be unloaded from RAM diff --git a/examples/textures/textures_image_generation.c b/examples/textures/textures_image_generation.c index 8f87e689..7d8e017e 100644 --- a/examples/textures/textures_image_generation.c +++ b/examples/textures/textures_image_generation.c @@ -11,7 +11,7 @@ #include "raylib.h" -#define TEXTURES_NUM 7 // for now we have 7 generation algorithms +#define NUM_TEXTURES 7 // Currently we have 7 generation algorithms int main() { @@ -30,7 +30,7 @@ int main() Image perlinNoise = GenImagePerlinNoise(screenWidth, screenHeight, 8.f); Image cellular = GenImageCellular(screenWidth, screenHeight, 32); - Texture2D textures[TEXTURES_NUM]; + Texture2D textures[NUM_TEXTURES]; textures[0] = LoadTextureFromImage(verticalGradient); textures[1] = LoadTextureFromImage(horizontalGradient); textures[2] = LoadTextureFromImage(radialGradient); @@ -38,6 +38,15 @@ int main() textures[4] = LoadTextureFromImage(whiteNoise); textures[5] = LoadTextureFromImage(perlinNoise); textures[6] = LoadTextureFromImage(cellular); + + // Unload image data (CPU RAM) + UnloadImage(verticalGradient); + UnloadImage(horizontalGradient); + UnloadImage(radialGradient); + UnloadImage(checked); + UnloadImage(whiteNoise); + UnloadImage(perlinNoise); + UnloadImage(cellular); int currentTexture = 0; @@ -51,7 +60,7 @@ int main() //---------------------------------------------------------------------------------- if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) { - currentTexture = (currentTexture + 1) % TEXTURES_NUM; // cycle between the 5 textures + currentTexture = (currentTexture + 1)%NUM_TEXTURES; // Cycle between the textures } //---------------------------------------------------------------------------------- @@ -63,24 +72,31 @@ int main() DrawTexture(textures[currentTexture], 0, 0, WHITE); + DrawRectangle(30, 400, 325, 30, Fade(SKYBLUE, 0.5f)); + DrawRectangleLines(30, 400, 325, 30, Fade(WHITE, 0.5f)); + DrawText("MOUSE LEFT BUTTON to CYCLE PROCEDURAL TEXTURES", 40, 410, 10, WHITE); + + switch(currentTexture) + { + case 0: DrawText("VERTICAL GRADIENT", 560, 10, 20, RAYWHITE); break; + case 1: DrawText("HORIZONTAL GRADIENT", 540, 10, 20, RAYWHITE); break; + case 2: DrawText("RADIAL GRADIENT", 580, 10, 20, LIGHTGRAY); break; + case 3: DrawText("CHECKED", 680, 10, 20, RAYWHITE); break; + case 4: DrawText("WHITE NOISE", 640, 10, 20, RED); break; + case 5: DrawText("PERLIN NOISE", 630, 10, 20, RAYWHITE); break; + case 6: DrawText("CELLULAR", 670, 10, 20, RAYWHITE); break; + default: break; + } + EndDrawing(); //---------------------------------------------------------------------------------- } // De-Initialization //-------------------------------------------------------------------------------------- - - // Unload image data (CPU RAM) - UnloadImage(verticalGradient); - UnloadImage(horizontalGradient); - UnloadImage(radialGradient); - UnloadImage(checked); - UnloadImage(whiteNoise); - UnloadImage(perlinNoise); - UnloadImage(cellular); - + // Unload textures data (GPU VRAM) - for (int i = 0; i < TEXTURES_NUM; i++) UnloadTexture(textures[i]); + for (int i = 0; i < NUM_TEXTURES; i++) UnloadTexture(textures[i]); CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- diff --git a/examples/textures/textures_image_generation.png b/examples/textures/textures_image_generation.png index a272b405..398b0462 100644 Binary files a/examples/textures/textures_image_generation.png and b/examples/textures/textures_image_generation.png differ -- cgit v1.2.3 From 76c821a68d35811a8d5adc384191ee5daa69afdd Mon Sep 17 00:00:00 2001 From: Ray San Date: Tue, 17 Oct 2017 11:52:01 +0200 Subject: Add screenshot --- examples/models/models_mesh_generation.png | Bin 0 -> 27504 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/models/models_mesh_generation.png (limited to 'examples/models') diff --git a/examples/models/models_mesh_generation.png b/examples/models/models_mesh_generation.png new file mode 100644 index 00000000..d8eb3646 Binary files /dev/null and b/examples/models/models_mesh_generation.png differ -- cgit v1.2.3 From 8ace02c2ffd9dead6e67fb3faaaa8b8ad37ccd2a Mon Sep 17 00:00:00 2001 From: Ray San Date: Tue, 17 Oct 2017 13:30:41 +0200 Subject: Added new examples to build... ...and reviewed some details --- examples/Makefile | 15 ++++++++++----- examples/models/models_material_pbr.c | 12 ++++++++---- 2 files changed, 18 insertions(+), 9 deletions(-) (limited to 'examples/models') diff --git a/examples/Makefile b/examples/Makefile index b80b18fe..bd4552cb 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -82,20 +82,20 @@ endif # Define raylib release directory for compiled library ifeq ($(PLATFORM),PLATFORM_DESKTOP) ifeq ($(PLATFORM_OS),WINDOWS) - RAYLIB_RELEASE = $(RAYLIB_PATH)/release/win32/mingw32 + RAYLIB_RELEASE = $(RAYLIB_PATH)/release/libs/win32/mingw32 endif ifeq ($(PLATFORM_OS),LINUX) - RAYLIB_RELEASE = $(RAYLIB_PATH)/release/linux + RAYLIB_RELEASE = $(RAYLIB_PATH)/release/libs/linux endif ifeq ($(PLATFORM_OS),OSX) - RAYLIB_RELEASE = $(RAYLIB_PATH)/release/osx + RAYLIB_RELEASE = $(RAYLIB_PATH)/release/libs/osx endif endif ifeq ($(PLATFORM),PLATFORM_WEB) - RAYLIB_RELEASE = $(RAYLIB_PATH)/release/html5 + RAYLIB_RELEASE = $(RAYLIB_PATH)/release/libs/html5 endif ifeq ($(PLATFORM),PLATFORM_RPI) - RAYLIB_RELEASE = $(RAYLIB_PATH)/release/rpi + RAYLIB_RELEASE = $(RAYLIB_PATH)/release/libs/rpi endif # Define default C compiler: gcc @@ -263,6 +263,7 @@ EXAMPLES = \ textures/textures_particles_blending \ textures/textures_image_processing \ textures/textures_image_drawing \ + textures/textures_image_generation \ text/text_sprite_fonts \ text/text_bmfont_ttf \ text/text_raylib_fonts \ @@ -278,6 +279,10 @@ EXAMPLES = \ models/models_heightmap \ models/models_cubicmap \ models/models_mesh_picking \ + models/models_mesh_generation \ + models/models_yaw_pitch_roll \ + models/models_material_pbr \ + models/models_skybox \ shaders/shaders_model_shader \ shaders/shaders_shapes_textures \ shaders/shaders_custom_uniform \ diff --git a/examples/models/models_material_pbr.c b/examples/models/models_material_pbr.c index 1f069468..9f576348 100644 --- a/examples/models/models_material_pbr.c +++ b/examples/models/models_material_pbr.c @@ -41,10 +41,13 @@ int main() model.material = LoadMaterialPBR((Color){ 255, 255, 255, 255 }, 1.0f, 1.0f); // Define lights attributes - Light lights[MAX_LIGHTS] = { CreateLight(LIGHT_POINT, (Vector3){ LIGHT_DISTANCE, LIGHT_HEIGHT, 0.0f }, (Vector3){ 0.0f, 0.0f, 0.0f }, (Color){ 255, 0, 0, 255 }, model.material.shader), - CreateLight(LIGHT_POINT, (Vector3){ 0.0f, LIGHT_HEIGHT, LIGHT_DISTANCE }, (Vector3){ 0.0f, 0.0f, 0.0f }, (Color){ 0, 255, 0, 255 }, model.material.shader), - CreateLight(LIGHT_POINT, (Vector3){ -LIGHT_DISTANCE, LIGHT_HEIGHT, 0.0f }, (Vector3){ 0.0f, 0.0f, 0.0f }, (Color){ 0, 0, 255, 255 }, model.material.shader), - CreateLight(LIGHT_DIRECTIONAL, (Vector3){ 0.0f, LIGHT_HEIGHT*2.0f, -LIGHT_DISTANCE }, (Vector3){ 0.0f, 0.0f, 0.0f }, (Color){ 255, 0, 255, 255 }, model.material.shader) }; + // NOTE: Shader is passed to every light on creation to define shader bindings internally + Light lights[MAX_LIGHTS] = { + CreateLight(LIGHT_POINT, (Vector3){ LIGHT_DISTANCE, LIGHT_HEIGHT, 0.0f }, (Vector3){ 0.0f, 0.0f, 0.0f }, (Color){ 255, 0, 0, 255 }, model.material.shader), + CreateLight(LIGHT_POINT, (Vector3){ 0.0f, LIGHT_HEIGHT, LIGHT_DISTANCE }, (Vector3){ 0.0f, 0.0f, 0.0f }, (Color){ 0, 255, 0, 255 }, model.material.shader), + CreateLight(LIGHT_POINT, (Vector3){ -LIGHT_DISTANCE, LIGHT_HEIGHT, 0.0f }, (Vector3){ 0.0f, 0.0f, 0.0f }, (Color){ 0, 0, 255, 255 }, model.material.shader), + CreateLight(LIGHT_DIRECTIONAL, (Vector3){ 0.0f, LIGHT_HEIGHT*2.0f, -LIGHT_DISTANCE }, (Vector3){ 0.0f, 0.0f, 0.0f }, (Color){ 255, 0, 255, 255 }, model.material.shader) + }; SetCameraMode(camera, CAMERA_ORBITAL); // Set an orbital camera mode @@ -156,6 +159,7 @@ static Material LoadMaterialPBR(Color albedo, float metalness, float roughness) UnloadTexture(cubemap); UnloadTexture(texHDR); + // Unload already used shaders (to create specific textures) UnloadShader(shdrCubemap); UnloadShader(shdrIrradiance); UnloadShader(shdrPrefilter); -- cgit v1.2.3 From 037fbc571ab943d0b8efd69d674bc7408875e8be Mon Sep 17 00:00:00 2001 From: Ray San Date: Thu, 19 Oct 2017 14:37:00 +0200 Subject: Remove unused file --- examples/models/resources/pixels.png | Bin 168 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/models/resources/pixels.png (limited to 'examples/models') diff --git a/examples/models/resources/pixels.png b/examples/models/resources/pixels.png deleted file mode 100644 index c9a4134b..00000000 Binary files a/examples/models/resources/pixels.png and /dev/null differ -- cgit v1.2.3 From 1375a616b25c3ffad1cc73581b8acbdc30ef79b4 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 20 Oct 2017 00:18:21 +0200 Subject: Some examples code tweaks --- examples/Makefile | 5 ----- examples/core/core_basic_window.c | 2 +- examples/models/models_cubicmap.c | 2 +- examples/models/models_heightmap.c | 2 +- examples/shaders/shaders_postprocessing.c | 2 +- 5 files changed, 4 insertions(+), 9 deletions(-) (limited to 'examples/models') diff --git a/examples/Makefile b/examples/Makefile index bd4552cb..0dc04452 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -557,11 +557,6 @@ physac/physics_restitution: physac/physics_restitution.c # compile [physac] example - physics shatter physac/physics_shatter: physac/physics_shatter.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) $(PHYSAC_LIBS) -D$(PLATFORM) - -ifeq ($(PLATFORM),PLATFORM_ANDROID) -external/native_app_glue.o : native_app_glue.c native_app_glue.h - $(CC) -c $< $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM) -D$(SHAREDFLAG) -endif # fix dylib install path name for each executable (MAC) fix_dylib: diff --git a/examples/core/core_basic_window.c b/examples/core/core_basic_window.c index fb83400a..b30f05de 100644 --- a/examples/core/core_basic_window.c +++ b/examples/core/core_basic_window.c @@ -15,7 +15,7 @@ * This example has been created using raylib 1.0 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * -* Copyright (c) 2014 Ramon Santamaria (@raysan5) +* Copyright (c) 2013-2016 Ramon Santamaria (@raysan5) * ********************************************************************************************/ diff --git a/examples/models/models_cubicmap.c b/examples/models/models_cubicmap.c index a8faa7c0..d8be9329 100644 --- a/examples/models/models_cubicmap.c +++ b/examples/models/models_cubicmap.c @@ -2,7 +2,7 @@ * * raylib [models] example - Cubicmap loading and drawing * -* This example has been created using raylib 1.3 (www.raylib.com) +* This example has been created using raylib 1.8 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * * Copyright (c) 2015 Ramon Santamaria (@raysan5) diff --git a/examples/models/models_heightmap.c b/examples/models/models_heightmap.c index e887cea7..e476d1b7 100644 --- a/examples/models/models_heightmap.c +++ b/examples/models/models_heightmap.c @@ -2,7 +2,7 @@ * * raylib [models] example - Heightmap loading and drawing * -* This example has been created using raylib 1.3 (www.raylib.com) +* This example has been created using raylib 1.8 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * * Copyright (c) 2015 Ramon Santamaria (@raysan5) diff --git a/examples/shaders/shaders_postprocessing.c b/examples/shaders/shaders_postprocessing.c index ae77a723..4aac5f91 100644 --- a/examples/shaders/shaders_postprocessing.c +++ b/examples/shaders/shaders_postprocessing.c @@ -76,7 +76,7 @@ int main() Model dwarf = LoadModel("resources/model/dwarf.obj"); // Load OBJ model Texture2D texture = LoadTexture("resources/model/dwarf_diffuse.png"); // Load model texture (diffuse map) - dwarf.material.maps[MAP_DIFFUSE].texture = texture; // Set dwarf model diffuse texture + dwarf.material.maps[MAP_DIFFUSE].texture = texture; // Set dwarf model diffuse texture Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position -- cgit v1.2.3 From 24657ca78938469e77fc765e44dc70537dfe0e1a Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 5 Nov 2017 17:06:50 +0100 Subject: Review textures to be POT Could correct possible issues on OpenGL 1.1 --- examples/models/models_yaw_pitch_roll.c | 14 +++++++------- examples/models/resources/angle_gauge.png | Bin 11761 -> 12919 bytes examples/models/resources/plane.png | Bin 4872 -> 4810 bytes 3 files changed, 7 insertions(+), 7 deletions(-) (limited to 'examples/models') diff --git a/examples/models/models_yaw_pitch_roll.c b/examples/models/models_yaw_pitch_roll.c index 2bae2bf8..625fc554 100644 --- a/examples/models/models_yaw_pitch_roll.c +++ b/examples/models/models_yaw_pitch_roll.c @@ -119,17 +119,17 @@ int main() BeginBlendMode(BLEND_ALPHA); - DrawTexturePro(texBackground, (Rectangle){0,0,texBackground.width, texBackground.height}, + DrawTexturePro(texBackground, (Rectangle){ 0, 0, texBackground.width, texBackground.height }, (Rectangle){ centerX, centerY, texBackground.width*scaleFactor, texBackground.height*scaleFactor}, - (Vector2){texBackground.width/2*scaleFactor, texBackground.height/2*scaleFactor + pitchOffset*scaleFactor}, roll, WHITE); + (Vector2){ texBackground.width/2*scaleFactor, texBackground.height/2*scaleFactor + pitchOffset*scaleFactor }, roll, WHITE); DrawTexturePro(texPitch, (Rectangle){ 0, 0, texPitch.width, texPitch.height }, (Rectangle){ centerX, centerY, texPitch.width*scaleFactor, texPitch.height*scaleFactor }, (Vector2){ texPitch.width/2*scaleFactor, texPitch.height/2*scaleFactor + pitchOffset*scaleFactor }, roll, WHITE); - DrawTexturePro(texPlane, (Rectangle){0,0,texPlane.width, texPlane.height }, + DrawTexturePro(texPlane, (Rectangle){ 0, 0, texPlane.width, texPlane.height }, (Rectangle){ centerX, centerY, texPlane.width*scaleFactor, texPlane.height*scaleFactor }, - (Vector2){texPlane.width/2*scaleFactor, texPlane.height/2*scaleFactor }, 0, WHITE); + (Vector2){ texPlane.width/2*scaleFactor, texPlane.height/2*scaleFactor }, 0, WHITE); EndBlendMode(); @@ -144,9 +144,9 @@ int main() End3dMode(); // Draw 2D GUI stuff - DrawAngleGauge(texAngleGauge, 80, 80, roll, "roll", RED); - DrawAngleGauge(texAngleGauge, 190, 80, pitch, "pitch", GREEN); - DrawAngleGauge(texAngleGauge, 300, 80, yaw, "yaw", SKYBLUE); + DrawAngleGauge(texAngleGauge, 80, 70, roll, "roll", RED); + DrawAngleGauge(texAngleGauge, 190, 70, pitch, "pitch", GREEN); + DrawAngleGauge(texAngleGauge, 300, 70, yaw, "yaw", SKYBLUE); DrawRectangle(30, 360, 260, 70, Fade(SKYBLUE, 0.5f)); DrawRectangleLines(30, 360, 260, 70, Fade(DARKBLUE, 0.5f)); diff --git a/examples/models/resources/angle_gauge.png b/examples/models/resources/angle_gauge.png index 120f3601..f7871de6 100644 Binary files a/examples/models/resources/angle_gauge.png and b/examples/models/resources/angle_gauge.png differ diff --git a/examples/models/resources/plane.png b/examples/models/resources/plane.png index 9f28ddb0..58951ea3 100644 Binary files a/examples/models/resources/plane.png and b/examples/models/resources/plane.png differ -- cgit v1.2.3 From 6ffc8cb7990fb4ff40f205cb53bec797b10e48a2 Mon Sep 17 00:00:00 2001 From: Ahmad Fatoum Date: Thu, 22 Feb 2018 02:05:00 +0100 Subject: raymath.h: Use C99 inline semantics RAYMATH_EXTERN_INLINE was renamed to RAYMATH_HEADER_ONLY, which user code may define if they want to use it as header-only library. If multiple files in the same project define RAYMATH_HEADER_ONLY, they might each have duplicate out-of-line definitions of the same functions. By default, raymath.h exposes inline definitions, which instructs the compiler _not_ to generate out-of-line definitons, if out-of-line definitions are required, those of the file defined with RAYLIB_IMPLEMENTATION are used instead. There may be only one such file. In C++ mode, the compiler will select only one out-of-line definition automatically, so no need to define a RAYLIB_IMPLEMENTATION. Unfortunately, we have to remove raymath function declaration from raylib.h as those declarations would lead to duplicate out-of-line definitions which would yield linker errors. This problem didn't exist with GNU89 or C++, because there multiple defintions are ok, but in C99 they aren't. --- examples/models/models_skybox.c | 2 +- src/core.c | 7 +- src/raylib.h | 21 ------ src/raymath.h | 139 ++++++++-------------------------------- 4 files changed, 29 insertions(+), 140 deletions(-) (limited to 'examples/models') diff --git a/examples/models/models_skybox.c b/examples/models/models_skybox.c index 46297e41..9f0d8c17 100644 --- a/examples/models/models_skybox.c +++ b/examples/models/models_skybox.c @@ -62,7 +62,7 @@ int main() Begin3dMode(camera); - DrawModel(skybox, Vector3Zero(), 1.0f, WHITE); + DrawModel(skybox, (Vector3){0, 0, 0}, 1.0f, WHITE); DrawGrid(10, 1.0f); diff --git a/src/core.c b/src/core.c index 137c0b61..0382aacd 100644 --- a/src/core.c +++ b/src/core.c @@ -98,13 +98,12 @@ #define _POSIX_C_SOURCE 199309L // Required for CLOCK_MONOTONIC if compiled with c99 without gnu ext. #endif +#define RAYMATH_IMPLEMENTATION // Define external out-of-line implementation of raymath here +#include "raymath.h" // Required for: Vector3 and Matrix functions + #include "rlgl.h" // raylib OpenGL abstraction layer to OpenGL 1.1, 3.3+ or ES2 #include "utils.h" // Required for: fopen() Android mapping -#define RAYMATH_IMPLEMENTATION // Use raymath as a header-only library (includes implementation) -#define RAYMATH_EXTERN_INLINE // Compile raymath functions as static inline (remember, it's a compiler hint) -#include "raymath.h" // Required for: Vector3 and Matrix functions - #if defined(SUPPORT_GESTURES_SYSTEM) #define GESTURES_IMPLEMENTATION #include "gestures.h" // Gestures detection functionality diff --git a/src/raylib.h b/src/raylib.h index a740e234..66598b27 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -338,14 +338,6 @@ typedef struct Matrix { float m3, m7, m11, m15; } Matrix; -typedef struct Float3 { - float f[3]; -} Float3; - -typedef struct Float16 { - float f[16]; -} Float16; - // Color type, RGBA (32bit) typedef struct Color { unsigned char r; @@ -750,19 +742,6 @@ RLAPI Vector3 ColorToHSV(Color color); // Returns HSV RLAPI Color GetColor(int hexValue); // Returns a Color struct from hexadecimal value RLAPI Color Fade(Color color, float alpha); // Color fade-in or fade-out, alpha goes from 0.0f to 1.0f -// Math useful functions (available from raymath.h) -RLAPI Vector3 Vector3Zero(void); // Vector with components value 0.0f -RLAPI Vector3 Vector3One(void); // Vector with components value 1.0f -RLAPI Matrix MatrixIdentity(void); // Returns identity matrix -#ifndef Vector3ToFloat -#define Vector3ToFloat(vec) (Vector3ToFloat_(vec).f) // Returns Vector3 as float array -RLAPI Float3 Vector3ToFloat_(Vector3 vec); // don't use, use above -#endif -#ifndef MatrixToFloat -#define MatrixToFloat(mat) (MatrixToFloat_(mat).f) // Returns Matrix as float array -RLAPI Float16 MatrixToFloat_(Matrix mat); // don't use, use above -#endif - // Misc. functions RLAPI void ShowLogo(void); // Activate raylib logo at startup (can be done with flags) RLAPI void SetConfigFlags(unsigned char flags); // Setup window configuration flags (view FLAGS) diff --git a/src/raymath.h b/src/raymath.h index 0eb010f1..a781ec80 100644 --- a/src/raymath.h +++ b/src/raymath.h @@ -9,8 +9,9 @@ * If not defined, the library is in header only mode and can be included in other headers * or source files without problems. But only ONE file should hold the implementation. * -* #define RAYMATH_EXTERN_INLINE -* Inlines all functions code, so it runs faster. This requires lots of memory on system. +* #define RAYMATH_HEADER_ONLY +* Define static inline functions code, so #include header suffices for use. +* This may use up lots of memory. * * #define RAYMATH_STANDALONE * Avoid raylib.h header inclusion in this file. @@ -41,8 +42,8 @@ #ifndef RAYMATH_H #define RAYMATH_H -//#define RAYMATH_STANDALONE // NOTE: To use raymath as standalone lib, just uncomment this line -//#define RAYMATH_EXTERN_INLINE // NOTE: To compile functions as static inline, uncomment this line +//#define RAYMATH_STANDALONE // NOTE: To use raymath as standalone lib, just uncomment this line +//#define RAYMATH_HEADER_ONLY // NOTE: To compile functions as static inline, uncomment this line #ifndef RAYMATH_STANDALONE #include "raylib.h" // Required for structs: Vector3, Matrix @@ -51,15 +52,22 @@ #ifdef __cplusplus #define RMEXTERN extern "C" // Functions visible from other files (no name mangling of functions in C++) #else - #define RMEXTERN extern // Functions visible from other files + #define RMEXTERN // Functions visible from other files #endif -#if defined(RAYMATH_EXTERN_INLINE) - #define RMDEF RMEXTERN inline // Functions are embeded inline (compiler generated code) +#if defined RAYMATH_IMPLEMENTATION && defined RAYMATH_HEADER_ONLY + #error "Specifying both RAYMATH_IMPLEMENTATION and RAYMATH_HEADER_ONLY is contradictory" +#endif + +#ifdef RAYMATH_IMPLEMENTATION + #define RMDEF extern inline // Provide external definition +#elif defined RAYMATH_HEADER_ONLY + #define RMDEF static inline // Functions may be inlined, no external out-of-line definition #else - #define RMDEF RMEXTERN + #define RMDEF inline // Functions may be inlined or external definition used #endif + //---------------------------------------------------------------------------------- // Defines and Macros //---------------------------------------------------------------------------------- @@ -100,14 +108,16 @@ float m2, m6, m10, m14; float m3, m7, m11, m15; } Matrix; - typedef struct Float3 { - float f[3]; - } Float3; - typedef struct Float16 { - float f[16]; - } Float16; #endif +// Helper types to be used instead of array return types for *ToFloat functions +typedef struct Float3 { + float f[3]; +} Float3; +typedef struct Float16 { + float f[16]; +} Float16; + // Quaternion type typedef struct Quaternion { float x; @@ -116,105 +126,6 @@ typedef struct Quaternion { float w; } Quaternion; -#ifndef RAYMATH_EXTERN_INLINE - -//------------------------------------------------------------------------------------ -// Functions Declaration - math utils -//------------------------------------------------------------------------------------ -RMDEF float Clamp(float value, float min, float max); // Clamp float value - -//------------------------------------------------------------------------------------ -// Functions Declaration to work with Vector2 -//------------------------------------------------------------------------------------ -RMDEF Vector2 Vector2Zero(void); // Vector with components value 0.0f -RMDEF Vector2 Vector2One(void); // Vector with components value 1.0f -RMDEF Vector2 Vector2Add(Vector2 v1, Vector2 v2); // Add two vectors (v1 + v2) -RMDEF Vector2 Vector2Subtract(Vector2 v1, Vector2 v2); // Subtract two vectors (v1 - v2) -RMDEF float Vector2Length(Vector2 v); // Calculate vector length -RMDEF float Vector2DotProduct(Vector2 v1, Vector2 v2); // Calculate two vectors dot product -RMDEF float Vector2Distance(Vector2 v1, Vector2 v2); // Calculate distance between two vectors -RMDEF float Vector2Angle(Vector2 v1, Vector2 v2); // Calculate angle between two vectors in X-axis -RMDEF void Vector2Scale(Vector2 *v, float scale); // Scale vector (multiply by value) -RMDEF void Vector2Negate(Vector2 *v); // Negate vector -RMDEF void Vector2Divide(Vector2 *v, float div); // Divide vector by a float value -RMDEF void Vector2Normalize(Vector2 *v); // Normalize provided vector - -//------------------------------------------------------------------------------------ -// Functions Declaration to work with Vector3 -//------------------------------------------------------------------------------------ -RMDEF Vector3 Vector3Zero(void); // Vector with components value 0.0f -RMDEF Vector3 Vector3One(void); // Vector with components value 1.0f -RMDEF Vector3 Vector3Add(Vector3 v1, Vector3 v2); // Add two vectors -RMDEF Vector3 Vector3Multiply(Vector3 v, float scalar); // Multiply vector by scalar -RMDEF Vector3 Vector3MultiplyV(Vector3 v1, Vector3 v2); // Multiply vector by vector -RMDEF Vector3 Vector3Subtract(Vector3 v1, Vector3 v2); // Substract two vectors -RMDEF Vector3 Vector3CrossProduct(Vector3 v1, Vector3 v2); // Calculate two vectors cross product -RMDEF Vector3 Vector3Perpendicular(Vector3 v); // Calculate one vector perpendicular vector -RMDEF float Vector3Length(const Vector3 v); // Calculate vector length -RMDEF float Vector3DotProduct(Vector3 v1, Vector3 v2); // Calculate two vectors dot product -RMDEF float Vector3Distance(Vector3 v1, Vector3 v2); // Calculate distance between two points -RMDEF void Vector3Scale(Vector3 *v, float scale); // Scale provided vector -RMDEF void Vector3Negate(Vector3 *v); // Negate provided vector (invert direction) -RMDEF void Vector3Normalize(Vector3 *v); // Normalize provided vector -RMDEF void Vector3Transform(Vector3 *v, Matrix mat); // Transforms a Vector3 by a given Matrix -RMDEF Vector3 Vector3Lerp(Vector3 v1, Vector3 v2, float amount); // Calculate linear interpolation between two vectors -RMDEF Vector3 Vector3Reflect(Vector3 vector, Vector3 normal); // Calculate reflected vector to normal -RMDEF Vector3 Vector3Min(Vector3 vec1, Vector3 vec2); // Return min value for each pair of components -RMDEF Vector3 Vector3Max(Vector3 vec1, Vector3 vec2); // Return max value for each pair of components -RMDEF Vector3 Vector3Barycenter(Vector3 p, Vector3 a, Vector3 b, Vector3 c); // Barycenter coords for p in triangle abc -RMDEF Float3 Vector3ToFloat_(Vector3 vec); // Returns Vector3 as float array - -//------------------------------------------------------------------------------------ -// Functions Declaration to work with Matrix -//------------------------------------------------------------------------------------ -RMDEF float MatrixDeterminant(Matrix mat); // Compute matrix determinant -RMDEF float MatrixTrace(Matrix mat); // Returns the trace of the matrix (sum of the values along the diagonal) -RMDEF void MatrixTranspose(Matrix *mat); // Transposes provided matrix -RMDEF void MatrixInvert(Matrix *mat); // Invert provided matrix -RMDEF void MatrixNormalize(Matrix *mat); // Normalize provided matrix -RMDEF Matrix MatrixIdentity(void); // Returns identity matrix -RMDEF Matrix MatrixAdd(Matrix left, Matrix right); // Add two matrices -RMDEF Matrix MatrixSubstract(Matrix left, Matrix right); // Substract two matrices (left - right) -RMDEF Matrix MatrixTranslate(float x, float y, float z); // Returns translation matrix -RMDEF Matrix MatrixRotate(Vector3 axis, float angle); // Returns rotation matrix for an angle around an specified axis (angle in radians) -RMDEF Matrix MatrixRotateX(float angle); // Returns x-rotation matrix (angle in radians) -RMDEF Matrix MatrixRotateY(float angle); // Returns y-rotation matrix (angle in radians) -RMDEF Matrix MatrixRotateZ(float angle); // Returns z-rotation matrix (angle in radians) -RMDEF Matrix MatrixScale(float x, float y, float z); // Returns scaling matrix -RMDEF Matrix MatrixMultiply(Matrix left, Matrix right); // Returns two matrix multiplication -RMDEF Matrix MatrixFrustum(double left, double right, double bottom, double top, double near, double far); // Returns perspective projection matrix -RMDEF Matrix MatrixPerspective(double fovy, double aspect, double near, double far); // Returns perspective projection matrix -RMDEF Matrix MatrixOrtho(double left, double right, double bottom, double top, double near, double far); // Returns orthographic projection matrix -RMDEF Matrix MatrixLookAt(Vector3 position, Vector3 target, Vector3 up); // Returns camera look-at matrix (view matrix) -RMDEF Float16 MatrixToFloat_(Matrix mat); // Returns float array of Matrix data - -//------------------------------------------------------------------------------------ -// Functions Declaration to work with Quaternions -//------------------------------------------------------------------------------------ -RMDEF Quaternion QuaternionIdentity(void); // Returns identity quaternion -RMDEF float QuaternionLength(Quaternion quat); // Compute the length of a quaternion -RMDEF void QuaternionNormalize(Quaternion *q); // Normalize provided quaternion -RMDEF void QuaternionInvert(Quaternion *quat); // Invert provided quaternion -RMDEF Quaternion QuaternionMultiply(Quaternion q1, Quaternion q2); // Calculate two quaternion multiplication -RMDEF Quaternion QuaternionLerp(Quaternion q1, Quaternion q2, float amount); // Calculate linear interpolation between two quaternions -RMDEF Quaternion QuaternionNlerp(Quaternion q1, Quaternion q2, float amount); // Calculate slerp-optimized interpolation between two quaternions -RMDEF Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount); // Calculates spherical linear interpolation between two quaternions -RMDEF Quaternion QuaternionFromVector3ToVector3(Vector3 from, Vector3 to); // Calculate quaternion based on the rotation from one vector to another -RMDEF Quaternion QuaternionFromMatrix(Matrix matrix); // Returns a quaternion for a given rotation matrix -RMDEF Matrix QuaternionToMatrix(Quaternion q); // Returns a matrix for a given quaternion -RMDEF Quaternion QuaternionFromAxisAngle(Vector3 axis, float angle); // Returns rotation quaternion for an angle and axis -RMDEF void QuaternionToAxisAngle(Quaternion q, Vector3 *outAxis, float *outAngle); // Returns the rotation angle and axis for a given quaternion -RMDEF Quaternion QuaternionFromEuler(float roll, float pitch, float yaw); // Returns he quaternion equivalent to Euler angles -RMDEF Vector3 QuaternionToEuler(Quaternion q); // Return the Euler angles equivalent to quaternion (roll, pitch, yaw) -RMDEF void QuaternionTransform(Quaternion *q, Matrix mat); // Transform a quaternion given a transformation matrix - -#endif // notdef RAYMATH_EXTERN_INLINE - -#endif // RAYMATH_H -//////////////////////////////////////////////////////////////////// end of header file - -#if defined(RAYMATH_IMPLEMENTATION) || defined(RAYMATH_EXTERN_INLINE) - #include // Required for: sinf(), cosf(), tan(), fabs() //---------------------------------------------------------------------------------- @@ -1390,4 +1301,4 @@ RMDEF void QuaternionTransform(Quaternion *q, Matrix mat) q->w = mat.m3*x + mat.m7*y + mat.m11*z + mat.m15*w; } -#endif // RAYMATH_IMPLEMENTATION +#endif // RAYMATH_H -- cgit v1.2.3 From a5881fb9ccaf60ea0ff4f6afd7f3925e24330cac Mon Sep 17 00:00:00 2001 From: Ahmad Fatoum Date: Sat, 24 Feb 2018 15:38:54 +0100 Subject: Revert "raymath.h: Use C99 inline semantics" This reverts commit 6ffc8cb7990fb4ff40f205cb53bec797b10e48a2. and commit e4d7bbec1ef08279495ac41f5f8c4be359c58cf0. which I pushed by mistake... --- examples/models/models_skybox.c | 2 +- src/core.c | 7 +- src/raylib.h | 7 ++ src/raymath.h | 189 ++++++++++++++++++++++++++++------------ 4 files changed, 145 insertions(+), 60 deletions(-) (limited to 'examples/models') diff --git a/examples/models/models_skybox.c b/examples/models/models_skybox.c index 9f0d8c17..46297e41 100644 --- a/examples/models/models_skybox.c +++ b/examples/models/models_skybox.c @@ -62,7 +62,7 @@ int main() Begin3dMode(camera); - DrawModel(skybox, (Vector3){0, 0, 0}, 1.0f, WHITE); + DrawModel(skybox, Vector3Zero(), 1.0f, WHITE); DrawGrid(10, 1.0f); diff --git a/src/core.c b/src/core.c index 0382aacd..137c0b61 100644 --- a/src/core.c +++ b/src/core.c @@ -98,12 +98,13 @@ #define _POSIX_C_SOURCE 199309L // Required for CLOCK_MONOTONIC if compiled with c99 without gnu ext. #endif -#define RAYMATH_IMPLEMENTATION // Define external out-of-line implementation of raymath here -#include "raymath.h" // Required for: Vector3 and Matrix functions - #include "rlgl.h" // raylib OpenGL abstraction layer to OpenGL 1.1, 3.3+ or ES2 #include "utils.h" // Required for: fopen() Android mapping +#define RAYMATH_IMPLEMENTATION // Use raymath as a header-only library (includes implementation) +#define RAYMATH_EXTERN_INLINE // Compile raymath functions as static inline (remember, it's a compiler hint) +#include "raymath.h" // Required for: Vector3 and Matrix functions + #if defined(SUPPORT_GESTURES_SYSTEM) #define GESTURES_IMPLEMENTATION #include "gestures.h" // Gestures detection functionality diff --git a/src/raylib.h b/src/raylib.h index 66598b27..41755dc3 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -742,6 +742,13 @@ RLAPI Vector3 ColorToHSV(Color color); // Returns HSV RLAPI Color GetColor(int hexValue); // Returns a Color struct from hexadecimal value RLAPI Color Fade(Color color, float alpha); // Color fade-in or fade-out, alpha goes from 0.0f to 1.0f +// Math useful functions (available from raymath.h) +RLAPI float *Vector3ToFloat(Vector3 vec); // Returns Vector3 as float array +RLAPI float *MatrixToFloat(Matrix mat); // Returns Matrix as float array +RLAPI Vector3 Vector3Zero(void); // Vector with components value 0.0f +RLAPI Vector3 Vector3One(void); // Vector with components value 1.0f +RLAPI Matrix MatrixIdentity(void); // Returns identity matrix + // Misc. functions RLAPI void ShowLogo(void); // Activate raylib logo at startup (can be done with flags) RLAPI void SetConfigFlags(unsigned char flags); // Setup window configuration flags (view FLAGS) diff --git a/src/raymath.h b/src/raymath.h index a781ec80..c29c6b95 100644 --- a/src/raymath.h +++ b/src/raymath.h @@ -9,9 +9,8 @@ * If not defined, the library is in header only mode and can be included in other headers * or source files without problems. But only ONE file should hold the implementation. * -* #define RAYMATH_HEADER_ONLY -* Define static inline functions code, so #include header suffices for use. -* This may use up lots of memory. +* #define RAYMATH_EXTERN_INLINE +* Inlines all functions code, so it runs faster. This requires lots of memory on system. * * #define RAYMATH_STANDALONE * Avoid raylib.h header inclusion in this file. @@ -42,8 +41,8 @@ #ifndef RAYMATH_H #define RAYMATH_H -//#define RAYMATH_STANDALONE // NOTE: To use raymath as standalone lib, just uncomment this line -//#define RAYMATH_HEADER_ONLY // NOTE: To compile functions as static inline, uncomment this line +//#define RAYMATH_STANDALONE // NOTE: To use raymath as standalone lib, just uncomment this line +//#define RAYMATH_EXTERN_INLINE // NOTE: To compile functions as static inline, uncomment this line #ifndef RAYMATH_STANDALONE #include "raylib.h" // Required for structs: Vector3, Matrix @@ -52,22 +51,15 @@ #ifdef __cplusplus #define RMEXTERN extern "C" // Functions visible from other files (no name mangling of functions in C++) #else - #define RMEXTERN // Functions visible from other files + #define RMEXTERN extern // Functions visible from other files #endif -#if defined RAYMATH_IMPLEMENTATION && defined RAYMATH_HEADER_ONLY - #error "Specifying both RAYMATH_IMPLEMENTATION and RAYMATH_HEADER_ONLY is contradictory" -#endif - -#ifdef RAYMATH_IMPLEMENTATION - #define RMDEF extern inline // Provide external definition -#elif defined RAYMATH_HEADER_ONLY - #define RMDEF static inline // Functions may be inlined, no external out-of-line definition +#if defined(RAYMATH_EXTERN_INLINE) + #define RMDEF RMEXTERN inline // Functions are embeded inline (compiler generated code) #else - #define RMDEF inline // Functions may be inlined or external definition used + #define RMDEF RMEXTERN #endif - //---------------------------------------------------------------------------------- // Defines and Macros //---------------------------------------------------------------------------------- @@ -110,14 +102,6 @@ } Matrix; #endif -// Helper types to be used instead of array return types for *ToFloat functions -typedef struct Float3 { - float f[3]; -} Float3; -typedef struct Float16 { - float f[16]; -} Float16; - // Quaternion type typedef struct Quaternion { float x; @@ -126,6 +110,105 @@ typedef struct Quaternion { float w; } Quaternion; +#ifndef RAYMATH_EXTERN_INLINE + +//------------------------------------------------------------------------------------ +// Functions Declaration - math utils +//------------------------------------------------------------------------------------ +RMDEF float Clamp(float value, float min, float max); // Clamp float value + +//------------------------------------------------------------------------------------ +// Functions Declaration to work with Vector2 +//------------------------------------------------------------------------------------ +RMDEF Vector2 Vector2Zero(void); // Vector with components value 0.0f +RMDEF Vector2 Vector2One(void); // Vector with components value 1.0f +RMDEF Vector2 Vector2Add(Vector2 v1, Vector2 v2); // Add two vectors (v1 + v2) +RMDEF Vector2 Vector2Subtract(Vector2 v1, Vector2 v2); // Subtract two vectors (v1 - v2) +RMDEF float Vector2Length(Vector2 v); // Calculate vector length +RMDEF float Vector2DotProduct(Vector2 v1, Vector2 v2); // Calculate two vectors dot product +RMDEF float Vector2Distance(Vector2 v1, Vector2 v2); // Calculate distance between two vectors +RMDEF float Vector2Angle(Vector2 v1, Vector2 v2); // Calculate angle between two vectors in X-axis +RMDEF void Vector2Scale(Vector2 *v, float scale); // Scale vector (multiply by value) +RMDEF void Vector2Negate(Vector2 *v); // Negate vector +RMDEF void Vector2Divide(Vector2 *v, float div); // Divide vector by a float value +RMDEF void Vector2Normalize(Vector2 *v); // Normalize provided vector + +//------------------------------------------------------------------------------------ +// Functions Declaration to work with Vector3 +//------------------------------------------------------------------------------------ +RMDEF Vector3 Vector3Zero(void); // Vector with components value 0.0f +RMDEF Vector3 Vector3One(void); // Vector with components value 1.0f +RMDEF Vector3 Vector3Add(Vector3 v1, Vector3 v2); // Add two vectors +RMDEF Vector3 Vector3Multiply(Vector3 v, float scalar); // Multiply vector by scalar +RMDEF Vector3 Vector3MultiplyV(Vector3 v1, Vector3 v2); // Multiply vector by vector +RMDEF Vector3 Vector3Subtract(Vector3 v1, Vector3 v2); // Substract two vectors +RMDEF Vector3 Vector3CrossProduct(Vector3 v1, Vector3 v2); // Calculate two vectors cross product +RMDEF Vector3 Vector3Perpendicular(Vector3 v); // Calculate one vector perpendicular vector +RMDEF float Vector3Length(const Vector3 v); // Calculate vector length +RMDEF float Vector3DotProduct(Vector3 v1, Vector3 v2); // Calculate two vectors dot product +RMDEF float Vector3Distance(Vector3 v1, Vector3 v2); // Calculate distance between two points +RMDEF void Vector3Scale(Vector3 *v, float scale); // Scale provided vector +RMDEF void Vector3Negate(Vector3 *v); // Negate provided vector (invert direction) +RMDEF void Vector3Normalize(Vector3 *v); // Normalize provided vector +RMDEF void Vector3Transform(Vector3 *v, Matrix mat); // Transforms a Vector3 by a given Matrix +RMDEF Vector3 Vector3Lerp(Vector3 v1, Vector3 v2, float amount); // Calculate linear interpolation between two vectors +RMDEF Vector3 Vector3Reflect(Vector3 vector, Vector3 normal); // Calculate reflected vector to normal +RMDEF Vector3 Vector3Min(Vector3 vec1, Vector3 vec2); // Return min value for each pair of components +RMDEF Vector3 Vector3Max(Vector3 vec1, Vector3 vec2); // Return max value for each pair of components +RMDEF Vector3 Vector3Barycenter(Vector3 p, Vector3 a, Vector3 b, Vector3 c); // Barycenter coords for p in triangle abc +RMDEF float *Vector3ToFloat(Vector3 vec); // Returns Vector3 as float array + +//------------------------------------------------------------------------------------ +// Functions Declaration to work with Matrix +//------------------------------------------------------------------------------------ +RMDEF float MatrixDeterminant(Matrix mat); // Compute matrix determinant +RMDEF float MatrixTrace(Matrix mat); // Returns the trace of the matrix (sum of the values along the diagonal) +RMDEF void MatrixTranspose(Matrix *mat); // Transposes provided matrix +RMDEF void MatrixInvert(Matrix *mat); // Invert provided matrix +RMDEF void MatrixNormalize(Matrix *mat); // Normalize provided matrix +RMDEF Matrix MatrixIdentity(void); // Returns identity matrix +RMDEF Matrix MatrixAdd(Matrix left, Matrix right); // Add two matrices +RMDEF Matrix MatrixSubstract(Matrix left, Matrix right); // Substract two matrices (left - right) +RMDEF Matrix MatrixTranslate(float x, float y, float z); // Returns translation matrix +RMDEF Matrix MatrixRotate(Vector3 axis, float angle); // Returns rotation matrix for an angle around an specified axis (angle in radians) +RMDEF Matrix MatrixRotateX(float angle); // Returns x-rotation matrix (angle in radians) +RMDEF Matrix MatrixRotateY(float angle); // Returns y-rotation matrix (angle in radians) +RMDEF Matrix MatrixRotateZ(float angle); // Returns z-rotation matrix (angle in radians) +RMDEF Matrix MatrixScale(float x, float y, float z); // Returns scaling matrix +RMDEF Matrix MatrixMultiply(Matrix left, Matrix right); // Returns two matrix multiplication +RMDEF Matrix MatrixFrustum(double left, double right, double bottom, double top, double near, double far); // Returns perspective projection matrix +RMDEF Matrix MatrixPerspective(double fovy, double aspect, double near, double far); // Returns perspective projection matrix +RMDEF Matrix MatrixOrtho(double left, double right, double bottom, double top, double near, double far); // Returns orthographic projection matrix +RMDEF Matrix MatrixLookAt(Vector3 position, Vector3 target, Vector3 up); // Returns camera look-at matrix (view matrix) +RMDEF float *MatrixToFloat(Matrix mat); // Returns float array of Matrix data + +//------------------------------------------------------------------------------------ +// Functions Declaration to work with Quaternions +//------------------------------------------------------------------------------------ +RMDEF Quaternion QuaternionIdentity(void); // Returns identity quaternion +RMDEF float QuaternionLength(Quaternion quat); // Compute the length of a quaternion +RMDEF void QuaternionNormalize(Quaternion *q); // Normalize provided quaternion +RMDEF void QuaternionInvert(Quaternion *quat); // Invert provided quaternion +RMDEF Quaternion QuaternionMultiply(Quaternion q1, Quaternion q2); // Calculate two quaternion multiplication +RMDEF Quaternion QuaternionLerp(Quaternion q1, Quaternion q2, float amount); // Calculate linear interpolation between two quaternions +RMDEF Quaternion QuaternionNlerp(Quaternion q1, Quaternion q2, float amount); // Calculate slerp-optimized interpolation between two quaternions +RMDEF Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount); // Calculates spherical linear interpolation between two quaternions +RMDEF Quaternion QuaternionFromVector3ToVector3(Vector3 from, Vector3 to); // Calculate quaternion based on the rotation from one vector to another +RMDEF Quaternion QuaternionFromMatrix(Matrix matrix); // Returns a quaternion for a given rotation matrix +RMDEF Matrix QuaternionToMatrix(Quaternion q); // Returns a matrix for a given quaternion +RMDEF Quaternion QuaternionFromAxisAngle(Vector3 axis, float angle); // Returns rotation quaternion for an angle and axis +RMDEF void QuaternionToAxisAngle(Quaternion q, Vector3 *outAxis, float *outAngle); // Returns the rotation angle and axis for a given quaternion +RMDEF Quaternion QuaternionFromEuler(float roll, float pitch, float yaw); // Returns he quaternion equivalent to Euler angles +RMDEF Vector3 QuaternionToEuler(Quaternion q); // Return the Euler angles equivalent to quaternion (roll, pitch, yaw) +RMDEF void QuaternionTransform(Quaternion *q, Matrix mat); // Transform a quaternion given a transformation matrix + +#endif // notdef RAYMATH_EXTERN_INLINE + +#endif // RAYMATH_H +//////////////////////////////////////////////////////////////////// end of header file + +#if defined(RAYMATH_IMPLEMENTATION) || defined(RAYMATH_EXTERN_INLINE) + #include // Required for: sinf(), cosf(), tan(), fabs() //---------------------------------------------------------------------------------- @@ -465,19 +548,16 @@ RMDEF Vector3 Vector3Barycenter(Vector3 p, Vector3 a, Vector3 b, Vector3 c) } // Returns Vector3 as float array -RMDEF Float3 Vector3ToFloat_(Vector3 vec) +RMDEF float *Vector3ToFloat(Vector3 vec) { - Float3 buffer; + static float buffer[3]; - buffer.f[0] = vec.x; - buffer.f[1] = vec.y; - buffer.f[2] = vec.z; + buffer[0] = vec.x; + buffer[1] = vec.y; + buffer[2] = vec.z; return buffer; } -#ifndef Vector3ToFloat -#define Vector3ToFloat(vec) (Vector3ToFloat_(vec).f) -#endif //---------------------------------------------------------------------------------- // Module Functions Definition - Matrix math @@ -913,32 +993,29 @@ RMDEF Matrix MatrixLookAt(Vector3 eye, Vector3 target, Vector3 up) } // Returns float array of matrix data -RMDEF Float16 MatrixToFloat_(Matrix mat) -{ - Float16 buffer; - - buffer.f[0] = mat.m0; - buffer.f[1] = mat.m1; - buffer.f[2] = mat.m2; - buffer.f[3] = mat.m3; - buffer.f[4] = mat.m4; - buffer.f[5] = mat.m5; - buffer.f[6] = mat.m6; - buffer.f[7] = mat.m7; - buffer.f[8] = mat.m8; - buffer.f[9] = mat.m9; - buffer.f[10] = mat.m10; - buffer.f[11] = mat.m11; - buffer.f[12] = mat.m12; - buffer.f[13] = mat.m13; - buffer.f[14] = mat.m14; - buffer.f[15] = mat.m15; +RMDEF float *MatrixToFloat(Matrix mat) +{ + static float buffer[16]; + + buffer[0] = mat.m0; + buffer[1] = mat.m1; + buffer[2] = mat.m2; + buffer[3] = mat.m3; + buffer[4] = mat.m4; + buffer[5] = mat.m5; + buffer[6] = mat.m6; + buffer[7] = mat.m7; + buffer[8] = mat.m8; + buffer[9] = mat.m9; + buffer[10] = mat.m10; + buffer[11] = mat.m11; + buffer[12] = mat.m12; + buffer[13] = mat.m13; + buffer[14] = mat.m14; + buffer[15] = mat.m15; return buffer; } -#ifndef MatrixToFloat -#define MatrixToFloat(mat) (MatrixToFloat_(mat).f) -#endif //---------------------------------------------------------------------------------- // Module Functions Definition - Quaternion math @@ -1301,4 +1378,4 @@ RMDEF void QuaternionTransform(Quaternion *q, Matrix mat) q->w = mat.m3*x + mat.m7*y + mat.m11*z + mat.m15*w; } -#endif // RAYMATH_H +#endif // RAYMATH_IMPLEMENTATION -- cgit v1.2.3 From fd2adbe62ded6cb91ae7684331381afe0675df69 Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 26 Feb 2018 12:10:45 +0100 Subject: Renamed CalculateBoundingBox() to MeshBoundingBox() Renamed function for consistency with a possible Mesh manipulation functions (maybe added in a future). Naming follows Image*() manipulation functions. --- examples/models/models_mesh_picking.c | 2 +- src/models.c | 12 ++++++------ src/raylib.h | 6 +++++- 3 files changed, 12 insertions(+), 8 deletions(-) (limited to 'examples/models') diff --git a/examples/models/models_mesh_picking.c b/examples/models/models_mesh_picking.c index e150fe92..1cc38b45 100644 --- a/examples/models/models_mesh_picking.c +++ b/examples/models/models_mesh_picking.c @@ -38,7 +38,7 @@ int main() tower.material.maps[MAP_DIFFUSE].texture = texture; // Set model diffuse texture Vector3 towerPos = { 0.0f, 0.0f, 0.0f }; // Set model position - BoundingBox towerBBox = CalculateBoundingBox(tower.mesh); + BoundingBox towerBBox = MeshBoundingBox(tower.mesh); // Get mesh bounding box bool hitMeshBBox = false; bool hitTriangle = false; diff --git a/src/models.c b/src/models.c index 63d227e3..8e9a6586 100644 --- a/src/models.c +++ b/src/models.c @@ -2055,9 +2055,9 @@ RayHitInfo GetCollisionRayGround(Ray ray, float groundHeight) return result; } -// Calculate mesh bounding box limits +// Compute mesh bounding box limits // NOTE: minVertex and maxVertex should be transformed by model transform matrix -BoundingBox CalculateBoundingBox(Mesh mesh) +BoundingBox MeshBoundingBox(Mesh mesh) { // Get min and max vertex to construct bounds (AABB) Vector3 minVertex = { 0 }; @@ -2083,16 +2083,16 @@ BoundingBox CalculateBoundingBox(Mesh mesh) return box; } -// Compute provided mesh tangents +// Compute mesh tangents void MeshTangents(Mesh *mesh) { - // TODO: Calculate mesh tangents + // TODO: Compute mesh tangents } -// Compute provided mesh binormals +// Compute mesh binormals void MeshBinormals(Mesh *mesh) { - // TODO: Calculate mesh binormals + // TODO: Compute mesh binormals } //---------------------------------------------------------------------------------- diff --git a/src/raylib.h b/src/raylib.h index 41755dc3..c1d383fd 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -1006,6 +1006,11 @@ RLAPI void UnloadModel(Model model); RLAPI Mesh LoadMesh(const char *fileName); // Load mesh from file RLAPI void UnloadMesh(Mesh *mesh); // Unload mesh from memory (RAM and/or VRAM) +// Mesh manipulation functions +RLAPI BoundingBox MeshBoundingBox(Mesh mesh); // Compute mesh bounding box limits +RLAPI void MeshTangents(Mesh *mesh); // Compute mesh tangents +RLAPI void MeshBinormals(Mesh *mesh); // Compute mesh binormals + // Mesh generation functions RLAPI Mesh GenMeshPlane(float width, float length, int resX, int resZ); // Generate plane mesh (with subdivisions) RLAPI Mesh GenMeshCube(float width, float height, float length); // Generate cuboid mesh @@ -1035,7 +1040,6 @@ RLAPI void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle sourceRe Vector3 center, float size, Color tint); // Draw a billboard texture defined by sourceRec // Collision detection functions -RLAPI BoundingBox CalculateBoundingBox(Mesh mesh); // Calculate mesh bounding box limits RLAPI bool CheckCollisionSpheres(Vector3 centerA, float radiusA, Vector3 centerB, float radiusB); // Detect collision between two spheres RLAPI bool CheckCollisionBoxes(BoundingBox box1, BoundingBox box2); // Detect collision between two bounding boxes RLAPI bool CheckCollisionBoxSphere(BoundingBox box, Vector3 centerSphere, float radiusSphere); // Detect collision between box and sphere -- cgit v1.2.3 From 276847eca9290e71baf40c3e9e890efe441aac41 Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 4 Mar 2018 23:24:30 +0100 Subject: Correct issue with tangents --- examples/models/resources/shaders/pbr.vs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'examples/models') diff --git a/examples/models/resources/shaders/pbr.vs b/examples/models/resources/shaders/pbr.vs index e852ac1a..885cb199 100644 --- a/examples/models/resources/shaders/pbr.vs +++ b/examples/models/resources/shaders/pbr.vs @@ -12,7 +12,7 @@ in vec3 vertexPosition; in vec2 vertexTexCoord; in vec3 vertexNormal; -in vec3 vertexTangent; +in vec4 vertexTangent; // Input uniform values uniform mat4 mvp; @@ -28,7 +28,7 @@ out vec3 fragBinormal; void main() { // Calculate binormal from vertex normal and tangent - vec3 vertexBinormal = cross(vertexNormal, vertexTangent); + vec3 vertexBinormal = cross(vertexNormal, vec3(vertexTangent)); // Calculate fragment normal based on normal transformations mat3 normalMatrix = transpose(inverse(mat3(mMatrix))); @@ -39,7 +39,7 @@ void main() // Send vertex attributes to fragment shader fragTexCoord = vertexTexCoord; fragNormal = normalize(normalMatrix*vertexNormal); - fragTangent = normalize(normalMatrix*vertexTangent); + fragTangent = normalize(normalMatrix*vec3(vertexTangent)); fragTangent = normalize(fragTangent - dot(fragTangent, fragNormal)*fragNormal); fragBinormal = normalize(normalMatrix*vertexBinormal); fragBinormal = cross(fragNormal, fragTangent); -- cgit v1.2.3