summaryrefslogtreecommitdiffhomepage
path: root/examples/core
diff options
context:
space:
mode:
authorCrydsch Cube <[email protected]>2023-02-14 17:47:21 +0100
committerGitHub <[email protected]>2023-02-14 17:47:21 +0100
commit73989a49817225f11f547d270598e93745bf7df0 (patch)
treec5ab826343e7b131c1e3733924156add0d445dbc /examples/core
parentf1bcabcc3799df741d54593980ac06afe2e0f081 (diff)
downloadraylib-73989a49817225f11f547d270598e93745bf7df0.tar.gz
raylib-73989a49817225f11f547d270598e93745bf7df0.zip
WIP rcamera redesign vector (#2563)
* core functionality CAMERA_FREE * fix example * add remaining camera modes * add view bobbing * view bobbing * catch curser in SetCameraMode * adjust examples * fix compilation on linux * fix example text_draw_3d * actually fix text_draw_3d * Updated camera API * Improve Vector3RotateByAxisAngle() function * remove camera.mode dependency from low-level functions * remove camera.mode from struct * fixes after rebase * adjust examples for new UpdateCamera function * adjust example models_loading_m3d --------- Co-authored-by: Ray <[email protected]>
Diffstat (limited to 'examples/core')
-rw-r--r--examples/core/core_3d_camera_first_person.c94
-rw-r--r--examples/core/core_3d_camera_free.c4
-rw-r--r--examples/core/core_3d_picking.c15
-rw-r--r--examples/core/core_vr_simulator.c6
-rw-r--r--examples/core/core_world_screen.c7
5 files changed, 102 insertions, 24 deletions
diff --git a/examples/core/core_3d_camera_first_person.c b/examples/core/core_3d_camera_first_person.c
index a7aa5f49..d98a002f 100644
--- a/examples/core/core_3d_camera_first_person.c
+++ b/examples/core/core_3d_camera_first_person.c
@@ -12,6 +12,7 @@
********************************************************************************************/
#include "raylib.h"
+#include "rcamera.h"
#define MAX_COLUMNS 20
@@ -29,11 +30,14 @@ int main(void)
// Define the camera to look into our 3d world (position, target, up vector)
Camera camera = { 0 };
- camera.position = (Vector3){ 4.0f, 2.0f, 4.0f };
- camera.target = (Vector3){ 0.0f, 1.8f, 0.0f };
+ camera.position = (Vector3){ 0.0f, 2.0f, 4.0f };
+ camera.target = (Vector3){ 0.0f, 2.0f, 0.0f };
camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };
camera.fovy = 60.0f;
camera.projection = CAMERA_PERSPECTIVE;
+ camera.swingCounter = 1; // Enable view bobbing
+
+ int cameraMode = CAMERA_FIRST_PERSON;
// Generates some random columns
float heights[MAX_COLUMNS] = { 0 };
@@ -47,8 +51,7 @@ int main(void)
colors[i] = (Color){ GetRandomValue(20, 255), GetRandomValue(10, 55), 30, 255 };
}
- SetCameraMode(camera, CAMERA_FIRST_PERSON); // Set a first person camera mode
-
+ DisableCursor(); // Catch cursor
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
@@ -57,7 +60,51 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
- UpdateCamera(&camera);
+ // Switch camera mode
+ if (IsKeyPressed(KEY_ONE)) {
+ cameraMode = CAMERA_FREE;
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll
+ }
+ if (IsKeyPressed(KEY_TWO)) {
+ cameraMode = CAMERA_FIRST_PERSON;
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll
+ }
+ if (IsKeyPressed(KEY_THREE)) {
+ cameraMode = CAMERA_THIRD_PERSON;
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll
+ }
+ if (IsKeyPressed(KEY_FOUR)) {
+ cameraMode = CAMERA_ORBITAL;
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll
+ }
+
+ // Switch camera projection
+ if (IsKeyPressed(KEY_P)) {
+ if (camera.projection == CAMERA_PERSPECTIVE) {
+ // Create isometric view
+ cameraMode = CAMERA_THIRD_PERSON;
+ // Note: The target distance is related to the render distance in the orthographic projection
+ camera.position = (Vector3){ 0.0f, 2.0f, -100.0f };
+ camera.target = (Vector3){ 0.0f, 2.0f, 0.0f };
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };
+ camera.projection = CAMERA_ORTHOGRAPHIC;
+ camera.fovy = 20.0f; // near plane width in CAMERA_ORTHOGRAPHIC
+ CameraYaw(&camera, -135 * DEG2RAD, true);
+ CameraPitch(&camera, -45 * DEG2RAD, true, true, false);
+ }
+ else if (camera.projection == CAMERA_ORTHOGRAPHIC)
+ {
+ // Reset to default view
+ cameraMode = CAMERA_THIRD_PERSON;
+ camera.position = (Vector3){ 0.0f, 2.0f, 10.0f };
+ camera.target = (Vector3){ 0.0f, 2.0f, 0.0f };
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };
+ camera.projection = CAMERA_PERSPECTIVE;
+ camera.fovy = 60.0f;
+ }
+ }
+
+ UpdateCamera(&camera, cameraMode); // Update camera
//----------------------------------------------------------------------------------
// Draw
@@ -80,14 +127,39 @@ int main(void)
DrawCubeWires(positions[i], 2.0f, heights[i], 2.0f, MAROON);
}
- EndMode3D();
+ // Draw player cube
+ if (cameraMode == CAMERA_THIRD_PERSON)
+ {
+ DrawCube(camera.target, 0.5f, 0.5f, 0.5f, PURPLE);
+ DrawCubeWires(camera.target, 0.5f, 0.5f, 0.5f, DARKPURPLE);
+ }
- DrawRectangle( 10, 10, 220, 70, Fade(SKYBLUE, 0.5f));
- DrawRectangleLines( 10, 10, 220, 70, BLUE);
+ EndMode3D();
- DrawText("First person camera default controls:", 20, 20, 10, BLACK);
- DrawText("- Move with keys: W, A, S, D", 40, 40, 10, DARKGRAY);
- DrawText("- Mouse move to look around", 40, 60, 10, DARKGRAY);
+ // Draw info boxes
+ DrawRectangle(5, 5, 330, 100, Fade(SKYBLUE, 0.5f));
+ DrawRectangleLines(5, 5, 330, 100, BLUE);
+
+ DrawText("Camera controls:", 15, 15, 10, BLACK);
+ DrawText("- Move keys: W, A, S, D, Space, Left-Ctrl", 15, 30, 10, BLACK);
+ DrawText("- Look around: arrow keys or mouse", 15, 45, 10, BLACK);
+ DrawText("- Camera mode keys: 1, 2, 3, 4", 15, 60, 10, BLACK);
+ DrawText("- Zoom keys: num-plus, num-minus or mouse scroll", 15, 75, 10, BLACK);
+ DrawText("- Camera projection key: P", 15, 90, 10, BLACK);
+
+ DrawRectangle(600, 5, 195, 100, Fade(SKYBLUE, 0.5f));
+ DrawRectangleLines(600, 5, 195, 100, BLUE);
+
+ DrawText("Camera status:", 610, 15, 10, BLACK);
+ DrawText(TextFormat("- Mode: %s", (cameraMode == CAMERA_FREE) ? "FREE" :
+ (cameraMode == CAMERA_FIRST_PERSON) ? "FIRST_PERSON" :
+ (cameraMode == CAMERA_THIRD_PERSON) ? "THIRD_PERSON" :
+ (cameraMode == CAMERA_ORBITAL) ? "ORBITAL" : "CUSTOM"), 610, 30, 10, BLACK);
+ DrawText(TextFormat("- Projection: %s", (camera.projection == CAMERA_PERSPECTIVE) ? "PERSPECTIVE" :
+ (camera.projection == CAMERA_ORTHOGRAPHIC) ? "ORTHOGRAPHIC" : "CUSTOM"), 610, 45, 10, BLACK);
+ DrawText(TextFormat("- Position: (%06.3f, %06.3f, %06.3f)", camera.position.x, camera.position.y, camera.position.z), 610, 60, 10, BLACK);
+ DrawText(TextFormat("- Target: (%06.3f, %06.3f, %06.3f)", camera.target.x, camera.target.y, camera.target.z), 610, 75, 10, BLACK);
+ DrawText(TextFormat("- Up: (%06.3f, %06.3f, %06.3f)", camera.up.x, camera.up.y, camera.up.z), 610, 90, 10, BLACK);
EndDrawing();
//----------------------------------------------------------------------------------
diff --git a/examples/core/core_3d_camera_free.c b/examples/core/core_3d_camera_free.c
index af7ab8d7..887a1df3 100644
--- a/examples/core/core_3d_camera_free.c
+++ b/examples/core/core_3d_camera_free.c
@@ -35,8 +35,6 @@ int main(void)
Vector3 cubePosition = { 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
//--------------------------------------------------------------------------------------
@@ -45,7 +43,7 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
- UpdateCamera(&camera);
+ UpdateCamera(&camera, CAMERA_FREE);
if (IsKeyDown('Z')) camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };
//----------------------------------------------------------------------------------
diff --git a/examples/core/core_3d_picking.c b/examples/core/core_3d_picking.c
index 8c0df966..0cf56f5f 100644
--- a/examples/core/core_3d_picking.c
+++ b/examples/core/core_3d_picking.c
@@ -40,7 +40,7 @@ int main(void)
RayCollision collision = { 0 };
- SetCameraMode(camera, CAMERA_FREE); // Set a free camera mode
+ EnableCursor(); // Disable camera controls
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
@@ -50,7 +50,14 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
- UpdateCamera(&camera);
+ if (IsCursorHidden()) UpdateCamera(&camera, CAMERA_FIRST_PERSON); // Update camera
+
+ // Toggle camera controls
+ if (IsMouseButtonPressed(MOUSE_BUTTON_RIGHT))
+ {
+ if (IsCursorHidden()) EnableCursor();
+ else DisableCursor();
+ }
if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT))
{
@@ -93,10 +100,12 @@ int main(void)
EndMode3D();
- DrawText("Try selecting the box with mouse!", 240, 10, 20, DARKGRAY);
+ DrawText("Try clicking on the box with your mouse!", 240, 10, 20, DARKGRAY);
if (collision.hit) DrawText("BOX SELECTED", (screenWidth - MeasureText("BOX SELECTED", 30)) / 2, (int)(screenHeight * 0.1f), 30, GREEN);
+ DrawText("Right click mouse to toggle camera controls", 10, 430, 10, GRAY);
+
DrawFPS(10, 10);
EndDrawing();
diff --git a/examples/core/core_vr_simulator.c b/examples/core/core_vr_simulator.c
index 5914897b..3024b785 100644
--- a/examples/core/core_vr_simulator.c
+++ b/examples/core/core_vr_simulator.c
@@ -96,11 +96,11 @@ int main(void)
camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector
camera.fovy = 60.0f; // Camera field-of-view Y
camera.projection = CAMERA_PERSPECTIVE; // Camera type
+ camera.swingCounter = 1; // Enable view bobbing
Vector3 cubePosition = { 0.0f, 0.0f, 0.0f };
- SetCameraMode(camera, CAMERA_FIRST_PERSON); // Set first person camera mode
-
+ DisableCursor(); // Catch cursor
SetTargetFPS(90); // Set our game to run at 90 frames-per-second
//--------------------------------------------------------------------------------------
@@ -109,7 +109,7 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
- UpdateCamera(&camera);
+ UpdateCamera(&camera, CAMERA_FIRST_PERSON);
//----------------------------------------------------------------------------------
// Draw
diff --git a/examples/core/core_world_screen.c b/examples/core/core_world_screen.c
index d86adf87..f96690ba 100644
--- a/examples/core/core_world_screen.c
+++ b/examples/core/core_world_screen.c
@@ -23,7 +23,7 @@ int main(void)
const int screenWidth = 800;
const int screenHeight = 450;
- InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera free");
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - core world screen");
// Define the camera to look into our 3d world
Camera camera = { 0 };
@@ -36,8 +36,7 @@ int main(void)
Vector3 cubePosition = { 0.0f, 0.0f, 0.0f };
Vector2 cubeScreenPosition = { 0.0f, 0.0f };
- SetCameraMode(camera, CAMERA_FREE); // Set a free camera mode
-
+ DisableCursor(); // Catch cursor
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
@@ -46,7 +45,7 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
- UpdateCamera(&camera);
+ UpdateCamera(&camera, CAMERA_THIRD_PERSON);
// Calculate cube screen space position (with a little offset to be in top)
cubeScreenPosition = GetWorldToScreen((Vector3){cubePosition.x, cubePosition.y + 2.5f, cubePosition.z}, camera);