Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP rcamera redesign vector #2563

Merged
merged 19 commits into from
Feb 14, 2023
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 83 additions & 11 deletions examples/core/core_3d_camera_first_person.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
********************************************************************************************/

#include "raylib.h"
#include "rcamera.h"

#define MAX_COLUMNS 20

Expand All @@ -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;
raysan5 marked this conversation as resolved.
Show resolved Hide resolved

// Generates some random columns
float heights[MAX_COLUMNS] = { 0 };
Expand All @@ -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
//--------------------------------------------------------------------------------------

Expand All @@ -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
Expand All @@ -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();
//----------------------------------------------------------------------------------
Expand Down
4 changes: 1 addition & 3 deletions examples/core/core_3d_camera_free.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
//--------------------------------------------------------------------------------------

Expand All @@ -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 };
//----------------------------------------------------------------------------------
Expand Down
15 changes: 12 additions & 3 deletions examples/core/core_3d_picking.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
//--------------------------------------------------------------------------------------
Expand All @@ -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))
{
Expand Down Expand Up @@ -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();
Expand Down
6 changes: 3 additions & 3 deletions examples/core/core_vr_simulator.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
//--------------------------------------------------------------------------------------

Expand All @@ -109,7 +109,7 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
UpdateCamera(&camera);
UpdateCamera(&camera, CAMERA_FIRST_PERSON);
//----------------------------------------------------------------------------------

// Draw
Expand Down
7 changes: 3 additions & 4 deletions examples/core/core_world_screen.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 };
Expand All @@ -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
//--------------------------------------------------------------------------------------

Expand All @@ -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);
Expand Down
5 changes: 2 additions & 3 deletions examples/models/models_animation.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,7 @@ int main(void)
ModelAnimation *anims = LoadModelAnimations("resources/models/iqm/guyanim.iqm", &animsCount);
int animFrameCounter = 0;

SetCameraMode(camera, CAMERA_FREE); // Set free camera mode

DisableCursor(); // Catch cursor
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------

Expand All @@ -64,7 +63,7 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
UpdateCamera(&camera);
UpdateCamera(&camera, CAMERA_FIRST_PERSON);

// Play animation when spacebar is held down
if (IsKeyDown(KEY_SPACE))
Expand Down
6 changes: 3 additions & 3 deletions examples/models/models_billboard.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,13 @@ int main(void)
// Here we choose to rotate around the image center
// NOTE: (-1, 1) is the range where origin.x, origin.y is inside the texture
Vector2 rotateOrigin = { 0.0f };
SetCameraMode(camera, CAMERA_ORBITAL); // Set an orbital camera mode

// Distance is needed for the correct billboard draw order
// Larger distance (further away from the camera) should be drawn prior to smaller distance.
float distanceStatic;
float distanceRotating;

float rotation = 0.0f;

SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------

Expand All @@ -64,7 +63,8 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
UpdateCamera(&camera);
UpdateCamera(&camera, CAMERA_ORBITAL);

rotation += 0.4f;
distanceStatic = Vector3Distance(camera.position, billPositionStatic);
distanceRotating = Vector3Distance(camera.position, billPositionRotating);
Expand Down
5 changes: 2 additions & 3 deletions examples/models/models_cubicmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,7 @@ int main(void)

UnloadImage(image); // Unload cubesmap image from RAM, already uploaded to VRAM

SetCameraMode(camera, CAMERA_ORBITAL); // Set an orbital camera mode

DisableCursor(); // Catch cursor
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------

Expand All @@ -52,7 +51,7 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
UpdateCamera(&camera);
UpdateCamera(&camera, CAMERA_ORBITAL);
//----------------------------------------------------------------------------------

// Draw
Expand Down
5 changes: 2 additions & 3 deletions examples/models/models_first_person_maze.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,7 @@ int main(void)

Vector3 mapPosition = { -16.0f, 0.0f, -8.0f }; // Set model position

SetCameraMode(camera, CAMERA_FIRST_PERSON); // Set camera mode

DisableCursor(); // Catch cursor
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------

Expand All @@ -57,7 +56,7 @@ int main(void)
//----------------------------------------------------------------------------------
Vector3 oldCamPos = camera.position; // Store old camera position

UpdateCamera(&camera);
UpdateCamera(&camera, CAMERA_FIRST_PERSON);

// Check player collision (we simplify to 2D collision detection)
Vector2 playerPos = { camera.position.x, camera.position.z };
Expand Down
5 changes: 2 additions & 3 deletions examples/models/models_heightmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ int main(void)

UnloadImage(image); // Unload heightmap image from RAM, already uploaded to VRAM

SetCameraMode(camera, CAMERA_ORBITAL); // Set an orbital camera mode

DisableCursor(); // Catch cursor
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------

Expand All @@ -49,7 +48,7 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
UpdateCamera(&camera);
UpdateCamera(&camera, CAMERA_ORBITAL);
//----------------------------------------------------------------------------------

// Draw
Expand Down
5 changes: 2 additions & 3 deletions examples/models/models_loading.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,9 @@ int main(void)
// NOTE: bounds are calculated from the original size of the model,
// if model is scaled on drawing, bounds must be also scaled

SetCameraMode(camera, CAMERA_FREE); // Set a free camera mode

bool selected = false; // Selected object flag

DisableCursor(); // Catch cursor
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------

Expand All @@ -69,7 +68,7 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
UpdateCamera(&camera);
UpdateCamera(&camera, CAMERA_FIRST_PERSON);

// Load new models/textures on drag&drop
if (IsFileDropped())
Expand Down
6 changes: 1 addition & 5 deletions examples/models/models_loading_gltf.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,6 @@ int main(void)

Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position

SetCameraMode(camera, CAMERA_FREE); // Set free camera mode

SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------

Expand All @@ -61,6 +59,7 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
UpdateCamera(&camera, CAMERA_THIRD_PERSON);
// Select current animation
if (IsKeyPressed(KEY_UP)) animIndex = (animIndex + 1)%animsCount;
else if (IsKeyPressed(KEY_DOWN)) animIndex = (animIndex + animsCount - 1)%animsCount;
Expand All @@ -69,9 +68,6 @@ int main(void)
ModelAnimation anim = modelAnimations[animIndex];
animCurrentFrame = (animCurrentFrame + 1)%anim.frameCount;
UpdateModelAnimation(model, anim, animCurrentFrame);

// Update camera
UpdateCamera(&camera);
//----------------------------------------------------------------------------------

// Draw
Expand Down
Loading