From 1896268775e59d00b2b4f3fea0bc244eee1a1cb4 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 8 Sep 2023 13:27:13 +0200 Subject: [PATCH] Reviewed examples for consistency --- examples/Makefile | 4 +- examples/Makefile.Web | 13 +- examples/README.md | 42 ++--- examples/core/core_2d_camera_split_screen.c | 167 ++++++++++++++++++ examples/core/core_2d_camera_split_screen.png | Bin 0 -> 21543 bytes examples/core/core_3d_camera_free.c | 2 +- ...screen.c => core_3d_camera_split_screen.c} | 87 +++++---- examples/core/core_3d_camera_split_screen.png | Bin 0 -> 16165 bytes examples/core/core_camera_2d_split_screen.c | 137 -------------- examples/core/core_camera_2d_split_screen.png | Bin 20010 -> 0 bytes examples/core/core_split_screen.png | Bin 21609 -> 0 bytes examples/shapes/shapes_bouncing_ball.c | 6 +- examples/shapes/shapes_lines_bezier.c | 24 ++- examples/shapes/shapes_lines_splines.c | 155 ++++++++++++++++ ...oj => core_2d_camera_split_screen.vcxproj} | 8 +- ...oj => core_3d_camera_split_screen.vcxproj} | 8 +- projects/VS2022/raylib.sln | 57 ++++-- 17 files changed, 481 insertions(+), 229 deletions(-) create mode 100644 examples/core/core_2d_camera_split_screen.c create mode 100644 examples/core/core_2d_camera_split_screen.png rename examples/core/{core_split_screen.c => core_3d_camera_split_screen.c} (68%) create mode 100644 examples/core/core_3d_camera_split_screen.png delete mode 100644 examples/core/core_camera_2d_split_screen.c delete mode 100644 examples/core/core_camera_2d_split_screen.png delete mode 100644 examples/core/core_split_screen.png create mode 100644 examples/shapes/shapes_lines_splines.c rename projects/VS2022/examples/{core_split_screen.vcxproj => core_2d_camera_split_screen.vcxproj} (98%) rename projects/VS2022/examples/{core_camera_2d_split_screen.vcxproj => core_3d_camera_split_screen.vcxproj} (99%) diff --git a/examples/Makefile b/examples/Makefile index 911743938..cd079c312 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -370,9 +370,11 @@ CORE = \ core/core_2d_camera \ core/core_2d_camera_platformer \ core/core_2d_camera_mouse_zoom \ + core/core_2d_camera_split_screen \ core/core_3d_camera_mode \ core/core_3d_camera_free \ core/core_3d_camera_first_person \ + core/core_3d_camera_split_screen \ core/core_3d_picking \ core/core_world_screen \ core/core_custom_logging \ @@ -385,8 +387,6 @@ CORE = \ core/core_window_flags \ core/core_window_letterbox \ core/core_window_should_close \ - core/core_split_screen \ - core/core_camera_2d_split_screen \ core/core_smooth_pixelperfect \ core/core_custom_frame_control diff --git a/examples/Makefile.Web b/examples/Makefile.Web index 44ace4ee4..267e02396 100644 --- a/examples/Makefile.Web +++ b/examples/Makefile.Web @@ -346,9 +346,11 @@ CORE = \ core/core_2d_camera \ core/core_2d_camera_platformer \ core/core_2d_camera_mouse_zoom \ + core/core_2d_camera_split_screen \ core/core_3d_camera_mode \ core/core_3d_camera_free \ core/core_3d_camera_first_person \ + core/core_3d_camera_split_screen \ core/core_3d_picking \ core/core_world_screen \ core/core_custom_logging \ @@ -360,8 +362,6 @@ CORE = \ core/core_window_flags \ core/core_window_letterbox \ core/core_window_should_close \ - core/core_split_screen \ - core/core_camera_2d_split_screen \ core/core_smooth_pixelperfect \ core/core_custom_frame_control \ core/core_loading_thread @@ -529,6 +529,9 @@ core/core_2d_camera_platformer: core/core_2d_camera_platformer.c core/core_2d_camera_mouse_zoom: core/core_2d_camera_mouse_zoom.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) + +core/core_2d_camera_split_screen: core/core_2d_camera_split_screen.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) core/core_3d_camera_mode: core/core_3d_camera_mode.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) @@ -538,6 +541,9 @@ core/core_3d_camera_free: core/core_3d_camera_free.c core/core_3d_camera_first_person: core/core_3d_camera_first_person.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) + +core/core_3d_camera_split_screen: core/core_3d_camera_split_screen.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) core/core_3d_picking: core/core_3d_picking.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) @@ -570,9 +576,6 @@ core/core_vr_simulator: core/core_vr_simulator.c core/core_window_flags: core/core_window_flags.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -core/core_split_screen: core/core_split_screen.c - $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) - core/core_smooth_pixelperfect: core/core_smooth_pixelperfect.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) diff --git a/examples/README.md b/examples/README.md index 35acaa25a..82e4b7825 100644 --- a/examples/README.md +++ b/examples/README.md @@ -34,27 +34,27 @@ Examples using raylib core platform functionality like window creation, inputs, | 08 | [core_2d_camera](core/core_2d_camera.c) | core_2d_camera | ⭐️⭐️☆☆ | 1.5 | 3.0 | [Ray](https://github.com/raysan5) | | 09 | [core_2d_camera_mouse_zoom](core/core_2d_camera_mouse_zoom.c) | core_2d_camera_mouse_zoom | ⭐️⭐️☆☆ | **4.2** | **4.2** | [Jeffery Myers](https://github.com/JeffM2501) | | 10 | [core_2d_camera_platformer](core/core_2d_camera_platformer.c) | core_2d_camera_platformer | ⭐️⭐️⭐️☆ | 2.5 | 3.0 | [avyy](https://github.com/avyy) | -| 11 | [core_3d_camera_mode](core/core_3d_camera_mode.c) | core_3d_camera_mode | ⭐️☆☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) | -| 12 | [core_3d_camera_free](core/core_3d_camera_free.c) | core_3d_camera_free | ⭐️☆☆☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) | -| 13 | [core_3d_camera_first_person](core/core_3d_camera_first_person.c) | core_3d_camera_first_person | ⭐️⭐️☆☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) | -| 14 | [core_3d_picking](core/core_3d_picking.c) | core_3d_picking | ⭐️⭐️☆☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) | -| 15 | [core_world_screen](core/core_world_screen.c) | core_world_screen | ⭐️⭐️☆☆ | 1.3 | 1.4 | [Ray](https://github.com/raysan5) | -| 16 | [core_custom_logging](core/core_custom_logging.c) | core_custom_logging | ⭐️⭐️⭐️☆ | 2.5 | 2.5 | [Pablo Marcos Oltra](https://github.com/pamarcos) | -| 17 | [core_window_flags](core/core_window_flags.c) | core_window_flags | ⭐️⭐️⭐️☆ | 3.5 | 3.5 | [Ray](https://github.com/raysan5) | -| 18 | [core_window_letterbox](core/core_window_letterbox.c) | core_window_letterbox | ⭐️⭐️☆☆ | 2.5 | **4.0** | [Anata](https://github.com/anatagawa) | -| 19 | [core_window_should_close](core/core_window_should_close.c) | core_window_should_close | ⭐️☆☆☆ | **4.2** | **4.2** | [Ray](https://github.com/raysan5) | -| 20 | [core_drop_files](core/core_drop_files.c) | core_drop_files | ⭐️⭐️☆☆ | 1.3 | **4.2** | [Ray](https://github.com/raysan5) | -| 21 | [core_random_values](core/core_random_values.c) | core_random_values | ⭐️☆☆☆ | 1.1 | 1.1 | [Ray](https://github.com/raysan5) | -| 22 | [core_storage_values](core/core_storage_values.c) | core_storage_values | ⭐️⭐️☆☆ | 1.4 | **4.2** | [Ray](https://github.com/raysan5) | -| 23 | [core_vr_simulator](core/core_vr_simulator.c) | core_vr_simulator | ⭐️⭐️⭐️☆ | 2.5 | **4.0** | [Ray](https://github.com/raysan5) | -| 24 | [core_loading_thread](core/core_loading_thread.c) | core_loading_thread | ⭐️⭐️⭐️☆ | 2.5 | 3.0 | [Ray](https://github.com/raysan5) | -| 25 | [core_scissor_test](core/core_scissor_test.c) | core_scissor_test | ⭐️☆☆☆ | 2.5 | 3.0 | [Chris Dill](https://github.com/MysteriousSpace) | -| 26 | [core_basic_screen_manager](core/core_basic_screen_manager.c) | core_basic_screen_manager | ⭐️☆☆☆ | **4.0** | **4.0** | [Ray](https://github.com/raysan5) | -| 27 | [core_custom_frame_control](core/core_custom_frame_control.c) | core_custom_frame_control | ⭐️⭐️⭐️⭐️ | **4.0** | **4.0** | [Ray](https://github.com/raysan5) | -| 28 | [core_smooth_pixelperfect](core/core_smooth_pixelperfect.c) | core_smooth_pixelperfect | ⭐️⭐️⭐️☆ | 3.7 | **4.0** | [Giancamillo Alessandroni](https://github.com/NotManyIdeasDev) | -| 29 | [core_split_screen](core/core_split_screen.c) | core_split_screen | ⭐️⭐️⭐️⭐️ | 3.7 | **4.0** | [Jeffery Myers](https://github.com/JeffM2501) | -| 30 | [core_window_should_close](core/core_window_should_close.c) | core_window_should_close | ⭐️⭐️☆☆ | **4.2** | **4.2** | [Ray](https://github.com/raysan5) | -| 31 | [core_camera_2d_split_screen](core/core_camera_2d_split_screen.c) | core_camera_2d_split_screen | ⭐️⭐️⭐️⭐️ | **4.5** | **4.5** | [Jeffery Myers](https://github.com/JeffM2501) | +| 11 | [core_2d_camera_split_screen](core/core_2d_camera_split_screen.c) | core_2d_camera_split_screen | ⭐️⭐️⭐️⭐️ | **4.5** | **4.5** | [Gabriel dos Santos Sanches](https://github.com/gabrielssanches) | +| 12 | [core_3d_camera_mode](core/core_3d_camera_mode.c) | core_3d_camera_mode | ⭐️☆☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) | +| 13 | [core_3d_camera_free](core/core_3d_camera_free.c) | core_3d_camera_free | ⭐️☆☆☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) | +| 14 | [core_3d_camera_first_person](core/core_3d_camera_first_person.c) | core_3d_camera_first_person | ⭐️⭐️☆☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) | +| 15 | [core_3d_camera:split_screen](core/core_3d_camera_split_screen.c) | core_3d_camera_split_screen | ⭐️⭐️⭐️⭐️ | 3.7 | **4.0** | [Jeffery Myers](https://github.com/JeffM2501) | +| 16 | [core_3d_picking](core/core_3d_picking.c) | core_3d_picking | ⭐️⭐️☆☆ | 1.3 | **4.0** | [Ray](https://github.com/raysan5) | +| 17 | [core_world_screen](core/core_world_screen.c) | core_world_screen | ⭐️⭐️☆☆ | 1.3 | 1.4 | [Ray](https://github.com/raysan5) | +| 18 | [core_custom_logging](core/core_custom_logging.c) | core_custom_logging | ⭐️⭐️⭐️☆ | 2.5 | 2.5 | [Pablo Marcos Oltra](https://github.com/pamarcos) | +| 19 | [core_window_flags](core/core_window_flags.c) | core_window_flags | ⭐️⭐️⭐️☆ | 3.5 | 3.5 | [Ray](https://github.com/raysan5) | +| 20 | [core_window_letterbox](core/core_window_letterbox.c) | core_window_letterbox | ⭐️⭐️☆☆ | 2.5 | **4.0** | [Anata](https://github.com/anatagawa) | +| 21 | [core_window_should_close](core/core_window_should_close.c) | core_window_should_close | ⭐️☆☆☆ | **4.2** | **4.2** | [Ray](https://github.com/raysan5) | +| 22 | [core_drop_files](core/core_drop_files.c) | core_drop_files | ⭐️⭐️☆☆ | 1.3 | **4.2** | [Ray](https://github.com/raysan5) | +| 23 | [core_random_values](core/core_random_values.c) | core_random_values | ⭐️☆☆☆ | 1.1 | 1.1 | [Ray](https://github.com/raysan5) | +| 24 | [core_storage_values](core/core_storage_values.c) | core_storage_values | ⭐️⭐️☆☆ | 1.4 | **4.2** | [Ray](https://github.com/raysan5) | +| 25 | [core_vr_simulator](core/core_vr_simulator.c) | core_vr_simulator | ⭐️⭐️⭐️☆ | 2.5 | **4.0** | [Ray](https://github.com/raysan5) | +| 26 | [core_loading_thread](core/core_loading_thread.c) | core_loading_thread | ⭐️⭐️⭐️☆ | 2.5 | 3.0 | [Ray](https://github.com/raysan5) | +| 27 | [core_scissor_test](core/core_scissor_test.c) | core_scissor_test | ⭐️☆☆☆ | 2.5 | 3.0 | [Chris Dill](https://github.com/MysteriousSpace) | +| 28 | [core_basic_screen_manager](core/core_basic_screen_manager.c) | core_basic_screen_manager | ⭐️☆☆☆ | **4.0** | **4.0** | [Ray](https://github.com/raysan5) | +| 29 | [core_custom_frame_control](core/core_custom_frame_control.c) | core_custom_frame_control | ⭐️⭐️⭐️⭐️ | **4.0** | **4.0** | [Ray](https://github.com/raysan5) | +| 30 | [core_smooth_pixelperfect](core/core_smooth_pixelperfect.c) | core_smooth_pixelperfect | ⭐️⭐️⭐️☆ | 3.7 | **4.0** | [Giancamillo Alessandroni](https://github.com/NotManyIdeasDev) | +| 31 | [core_window_should_close](core/core_window_should_close.c) | core_window_should_close | ⭐️⭐️☆☆ | **4.2** | **4.2** | [Ray](https://github.com/raysan5) | ### category: shapes diff --git a/examples/core/core_2d_camera_split_screen.c b/examples/core/core_2d_camera_split_screen.c new file mode 100644 index 000000000..57a0dfd3a --- /dev/null +++ b/examples/core/core_2d_camera_split_screen.c @@ -0,0 +1,167 @@ +/******************************************************************************************* +* +* raylib [core] example - 2d camera split screen +* +* Addapted from the core_3d_camera_split_screen example: +* https://github.com/raysan5/raylib/blob/master/examples/core/core_3d_camera_split_screen.c +* +* Example originally created with raylib 4.5, last time updated with raylib 4.5 +* +* Example contributed by Gabriel dos Santos Sanches (@gabrielssanches) and reviewed by Ramon Santamaria (@raysan5) +* +* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, +* BSD-like license that allows static linking with closed source software +* +* Copyright (c) 2023 Gabriel dos Santos Sanches (@gabrielssanches) +* +********************************************************************************************/ + +#include "raylib.h" + +#define PLAYER_SIZE 40 + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 440; + + InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera split screen"); + + Rectangle player1 = { 200, 200, PLAYER_SIZE, PLAYER_SIZE }; + Rectangle player2 = { 250, 200, PLAYER_SIZE, PLAYER_SIZE }; + + Camera2D camera1 = { 0 }; + camera1.target = (Vector2){ player1.x, player1.y }; + camera1.offset = (Vector2){ 200.0f, 200.0f }; + camera1.rotation = 0.0f; + camera1.zoom = 1.0f; + + Camera2D camera2 = { 0 }; + camera2.target = (Vector2){ player2.x, player2.y }; + camera2.offset = (Vector2){ 200.0f, 200.0f }; + camera2.rotation = 0.0f; + camera2.zoom = 1.0f; + + RenderTexture screenCamera1 = LoadRenderTexture(screenWidth/2, screenHeight); + RenderTexture screenCamera2 = LoadRenderTexture(screenWidth/2, screenHeight); + + // Build a flipped rectangle the size of the split view to use for drawing later + Rectangle splitScreenRect = { 0.0f, 0.0f, (float)screenCamera1.texture.width, (float)-screenCamera1.texture.height }; + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + if (IsKeyDown(KEY_S)) player1.y += 3.0f; + else if (IsKeyDown(KEY_W)) player1.y -= 3.0f; + if (IsKeyDown(KEY_D)) player1.x += 3.0f; + else if (IsKeyDown(KEY_A)) player1.x -= 3.0f; + + if (IsKeyDown(KEY_UP)) player2.y -= 3.0f; + else if (IsKeyDown(KEY_DOWN)) player2.y += 3.0f; + if (IsKeyDown(KEY_RIGHT)) player2.x += 3.0f; + else if (IsKeyDown(KEY_LEFT)) player2.x -= 3.0f; + + camera1.target = (Vector2){ player1.x, player1.y }; + camera2.target = (Vector2){ player2.x, player2.y }; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginTextureMode(screenCamera1); + ClearBackground(RAYWHITE); + + BeginMode2D(camera1); + + // Draw full scene with first camera + for (int i = 0; i < screenWidth/PLAYER_SIZE + 1; i++) + { + DrawLineV((Vector2){PLAYER_SIZE*i, 0}, (Vector2){PLAYER_SIZE*i, screenHeight}, LIGHTGRAY); + } + + for (int i = 0; i < screenHeight/PLAYER_SIZE + 1; i++) + { + DrawLineV((Vector2){0, PLAYER_SIZE*i}, (Vector2){screenWidth, PLAYER_SIZE*i}, LIGHTGRAY); + } + + for (int i = 0; i < screenWidth/PLAYER_SIZE; i++) + { + for (int j = 0; j < screenHeight/PLAYER_SIZE; j++) + { + DrawText(TextFormat("[%i,%i]", i, j), 10 + PLAYER_SIZE*i, 15 + PLAYER_SIZE*j, 10, LIGHTGRAY); + } + } + + DrawRectangleRec(player1, RED); + DrawRectangleRec(player2, BLUE); + EndMode2D(); + + DrawRectangle(0, 0, GetScreenWidth()/2, 30, Fade(RAYWHITE, 0.6f)); + DrawText("PLAYER1: W/S/A/D to move", 10, 10, 10, MAROON); + + EndTextureMode(); + + BeginTextureMode(screenCamera2); + ClearBackground(RAYWHITE); + + BeginMode2D(camera2); + + // Draw full scene with second camera + for (int i = 0; i < screenWidth/PLAYER_SIZE + 1; i++) + { + DrawLineV((Vector2){PLAYER_SIZE*i, 0}, (Vector2){PLAYER_SIZE*i, screenHeight}, LIGHTGRAY); + } + + for (int i = 0; i < screenHeight/PLAYER_SIZE + 1; i++) + { + DrawLineV((Vector2){0, PLAYER_SIZE*i}, (Vector2){screenWidth, PLAYER_SIZE*i}, LIGHTGRAY); + } + + for (int i = 0; i < screenWidth/PLAYER_SIZE; i++) + { + for (int j = 0; j < screenHeight/PLAYER_SIZE; j++) + { + DrawText(TextFormat("[%i,%i]", i, j), 10 + PLAYER_SIZE*i, 15 + PLAYER_SIZE*j, 10, LIGHTGRAY); + } + } + + DrawRectangleRec(player1, RED); + DrawRectangleRec(player2, BLUE); + + EndMode2D(); + + DrawRectangle(0, 0, GetScreenWidth()/2, 30, Fade(RAYWHITE, 0.6f)); + DrawText("PLAYER2: UP/DOWN/LEFT/RIGHT to move", 10, 10, 10, DARKBLUE); + + EndTextureMode(); + + // Draw both views render textures to the screen side by side + BeginDrawing(); + ClearBackground(BLACK); + + DrawTextureRec(screenCamera1.texture, splitScreenRect, (Vector2){ 0, 0 }, WHITE); + DrawTextureRec(screenCamera2.texture, splitScreenRect, (Vector2){ screenWidth/2.0f, 0 }, WHITE); + + DrawRectangle(GetScreenWidth()/2 - 2, 0, 4, GetScreenHeight(), LIGHTGRAY); + EndDrawing(); + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadRenderTexture(screenCamera1); // Unload render texture + UnloadRenderTexture(screenCamera2); // Unload render texture + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/examples/core/core_2d_camera_split_screen.png b/examples/core/core_2d_camera_split_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..a441e39298f2b7962e187f6b5918915a8babff20 GIT binary patch literal 21543 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 literal 0 HcmV?d00001 diff --git a/examples/core/core_3d_camera_free.c b/examples/core/core_3d_camera_free.c index 59bd158a2..78200a642 100644 --- a/examples/core/core_3d_camera_free.c +++ b/examples/core/core_3d_camera_free.c @@ -72,7 +72,7 @@ int main(void) DrawText("- Mouse Wheel to Zoom in-out", 40, 40, 10, DARKGRAY); DrawText("- Mouse Wheel Pressed to Pan", 40, 60, 10, DARKGRAY); DrawText("- Alt + Mouse Wheel Pressed to Rotate", 40, 80, 10, DARKGRAY); - DrawText("- Alt + Ctrl + Mouse Wheel Pressed for Smooth Zoom", 40, 100, 10, DARKGRAY); + //DrawText("- Alt + Ctrl + Mouse Wheel Pressed for Smooth Zoom", 40, 100, 10, DARKGRAY); DrawText("- Z to zoom to (0, 0, 0)", 40, 120, 10, DARKGRAY); EndDrawing(); diff --git a/examples/core/core_split_screen.c b/examples/core/core_3d_camera_split_screen.c similarity index 68% rename from examples/core/core_split_screen.c rename to examples/core/core_3d_camera_split_screen.c index 50cfcf7ac..d625e1c0e 100644 --- a/examples/core/core_split_screen.c +++ b/examples/core/core_3d_camera_split_screen.c @@ -1,6 +1,6 @@ /******************************************************************************************* * -* raylib [core] example - split screen +* raylib [core] example - 3d cmaera split screen * * Example originally created with raylib 3.7, last time updated with raylib 4.0 * @@ -15,32 +15,6 @@ #include "raylib.h" -Camera cameraPlayer1 = { 0 }; -Camera cameraPlayer2 = { 0 }; - -// Scene drawing -void DrawScene(void) -{ - int count = 5; - float spacing = 4; - - // Grid of cube trees on a plane to make a "world" - DrawPlane((Vector3){ 0, 0, 0 }, (Vector2){ 50, 50 }, BEIGE); // Simple world plane - - for (float x = -count*spacing; x <= count*spacing; x += spacing) - { - for (float z = -count*spacing; z <= count*spacing; z += spacing) - { - DrawCube((Vector3) { x, 1.5f, z }, 1, 1, 1, LIME); - DrawCube((Vector3) { x, 0.5f, z }, 0.25f, 1, 0.25f, BROWN); - } - } - - // Draw a cube at each player's position - DrawCube(cameraPlayer1.position, 1, 1, 1, RED); - DrawCube(cameraPlayer2.position, 1, 1, 1, BLUE); -} - //------------------------------------------------------------------------------------ // Program main entry point //------------------------------------------------------------------------------------ @@ -51,9 +25,10 @@ int main(void) const int screenWidth = 800; const int screenHeight = 450; - InitWindow(screenWidth, screenHeight, "raylib [core] example - split screen"); + InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera split screen"); // Setup player 1 camera and screen + Camera cameraPlayer1 = { 0 }; cameraPlayer1.fovy = 45.0f; cameraPlayer1.up.y = 1.0f; cameraPlayer1.target.y = 1.0f; @@ -63,6 +38,7 @@ int main(void) RenderTexture screenPlayer1 = LoadRenderTexture(screenWidth/2, screenHeight); // Setup player two camera and screen + Camera cameraPlayer2 = { 0 }; cameraPlayer2.fovy = 45.0f; cameraPlayer2.up.y = 1.0f; cameraPlayer2.target.y = 3.0f; @@ -73,6 +49,10 @@ int main(void) // Build a flipped rectangle the size of the split view to use for drawing later Rectangle splitScreenRect = { 0.0f, 0.0f, (float)screenPlayer1.texture.width, (float)-screenPlayer1.texture.height }; + + // Grid data + int count = 5; + float spacing = 4; SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -116,26 +96,69 @@ int main(void) // Draw Player1 view to the render texture BeginTextureMode(screenPlayer1); ClearBackground(SKYBLUE); + BeginMode3D(cameraPlayer1); - DrawScene(); + + // Draw scene: grid of cube trees on a plane to make a "world" + DrawPlane((Vector3){ 0, 0, 0 }, (Vector2){ 50, 50 }, BEIGE); // Simple world plane + + for (float x = -count*spacing; x <= count*spacing; x += spacing) + { + for (float z = -count*spacing; z <= count*spacing; z += spacing) + { + DrawCube((Vector3) { x, 1.5f, z }, 1, 1, 1, LIME); + DrawCube((Vector3) { x, 0.5f, z }, 0.25f, 1, 0.25f, BROWN); + } + } + + // Draw a cube at each player's position + DrawCube(cameraPlayer1.position, 1, 1, 1, RED); + DrawCube(cameraPlayer2.position, 1, 1, 1, BLUE); + EndMode3D(); - DrawText("PLAYER1 W/S to move", 10, 10, 20, RED); + + DrawRectangle(0, 0, GetScreenWidth()/2, 40, Fade(RAYWHITE, 0.8f)); + DrawText("PLAYER1: W/S to move", 10, 10, 20, MAROON); + EndTextureMode(); // Draw Player2 view to the render texture BeginTextureMode(screenPlayer2); ClearBackground(SKYBLUE); + BeginMode3D(cameraPlayer2); - DrawScene(); + + // Draw scene: grid of cube trees on a plane to make a "world" + DrawPlane((Vector3){ 0, 0, 0 }, (Vector2){ 50, 50 }, BEIGE); // Simple world plane + + for (float x = -count*spacing; x <= count*spacing; x += spacing) + { + for (float z = -count*spacing; z <= count*spacing; z += spacing) + { + DrawCube((Vector3) { x, 1.5f, z }, 1, 1, 1, LIME); + DrawCube((Vector3) { x, 0.5f, z }, 0.25f, 1, 0.25f, BROWN); + } + } + + // Draw a cube at each player's position + DrawCube(cameraPlayer1.position, 1, 1, 1, RED); + DrawCube(cameraPlayer2.position, 1, 1, 1, BLUE); + EndMode3D(); - DrawText("PLAYER2 UP/DOWN to move", 10, 10, 20, BLUE); + + DrawRectangle(0, 0, GetScreenWidth()/2, 40, Fade(RAYWHITE, 0.8f)); + DrawText("PLAYER2: UP/DOWN to move", 10, 10, 20, DARKBLUE); + EndTextureMode(); // Draw both views render textures to the screen side by side BeginDrawing(); ClearBackground(BLACK); + DrawTextureRec(screenPlayer1.texture, splitScreenRect, (Vector2){ 0, 0 }, WHITE); DrawTextureRec(screenPlayer2.texture, splitScreenRect, (Vector2){ screenWidth/2.0f, 0 }, WHITE); + + DrawRectangle(GetScreenWidth()/2 - 2, 0, 4, GetScreenHeight(), LIGHTGRAY); EndDrawing(); } diff --git a/examples/core/core_3d_camera_split_screen.png b/examples/core/core_3d_camera_split_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..bc323d6adbb22a04677a9435398234601dd45429 GIT binary patch literal 16165 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 literal 0 HcmV?d00001 diff --git a/examples/core/core_camera_2d_split_screen.c b/examples/core/core_camera_2d_split_screen.c deleted file mode 100644 index 5f5059569..000000000 --- a/examples/core/core_camera_2d_split_screen.c +++ /dev/null @@ -1,137 +0,0 @@ -/******************************************************************************************* -* -* raylib [core] example - split screen -* -* Addapted from the Split Screen example (https://github.com/raysan5/raylib/blob/master/examples/core/core_split_screen.c) -* -* Example originally created with raylib 4.5, last time updated with raylib 4.5 -* -* Example contributed by Jeffery Myers (@JeffM2501) and reviewed by Ramon Santamaria (@raysan5) -* -* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, -* BSD-like license that allows static linking with closed source software -* -* Copyright (c) 2021-2023 Jeffery Myers (@JeffM2501) -* -********************************************************************************************/ - -#include "raylib.h" - -#include - -#define PLAYER_SIZE 40 - -//------------------------------------------------------------------------------------ -// Program main entry point -//------------------------------------------------------------------------------------ -int main(void) -{ - // Initialization - //-------------------------------------------------------------------------------------- - const int screenWidth = 800; - const int screenHeight = 440; - - InitWindow(screenWidth, screenHeight, "raylib [core] example - camera 2D split screen"); - - Rectangle player1 = { 200, 200, PLAYER_SIZE, PLAYER_SIZE }; - Rectangle player2 = { 250, 200, PLAYER_SIZE, PLAYER_SIZE }; - - Camera2D camera1 = { 0 }; - camera1.target = (Vector2){ player1.x, player1.y }; - camera1.offset = (Vector2){ 200.0f, 200.0f }; - camera1.rotation = 0.0f; - camera1.zoom = 1.0f; - - Camera2D camera2 = { 0 }; - camera2.target = (Vector2){ player2.x, player2.y }; - camera2.offset = (Vector2){ 200.0f, 200.0f }; - camera2.rotation = 0.0f; - camera2.zoom = 1.0f; - - RenderTexture screenCamera1 = LoadRenderTexture(screenWidth / 2, screenHeight); - RenderTexture screenCamera2 = LoadRenderTexture(screenWidth / 2, screenHeight); - - // Build a flipped rectangle the size of the split view to use for drawing later - Rectangle splitScreenRect = { 0.0f, 0.0f, (float)screenCamera1.texture.width, (float)-screenCamera1.texture.height }; - - SetTargetFPS(60); // Set our game to run at 60 frames-per-second - //-------------------------------------------------------------------------------------- - void DrawScene(void) { - for (int i = 0; i < screenWidth/PLAYER_SIZE + 1; i++) - { - DrawLineV((Vector2){PLAYER_SIZE*i, 0}, (Vector2){PLAYER_SIZE*i, screenHeight}, LIGHTGRAY); - } - - for (int i = 0; i < screenHeight/PLAYER_SIZE + 1; i++) - { - DrawLineV((Vector2){0, PLAYER_SIZE*i}, (Vector2){screenWidth, PLAYER_SIZE*i}, LIGHTGRAY); - } - - for (int i = 0; i < screenWidth/PLAYER_SIZE; i++) - { - for (int j = 0; j < screenHeight/PLAYER_SIZE; j++) - { - char coordinate_str[8]; - snprintf(coordinate_str, sizeof(coordinate_str), "%d,%d", i, j); - DrawText(coordinate_str, 10 + PLAYER_SIZE*i, 10 + PLAYER_SIZE*j, 10, LIGHTGRAY); - } - } - - DrawRectangleRec(player1, RED); - DrawRectangleRec(player2, BLUE); - } - - // Main game loop - while (!WindowShouldClose()) // Detect window close button or ESC key - { - // Update - //---------------------------------------------------------------------------------- - if (IsKeyDown(KEY_S)) player1.y += 3; - else if (IsKeyDown(KEY_W)) player1.y -= 3; - if (IsKeyDown(KEY_D)) player1.x += 3; - else if (IsKeyDown(KEY_A)) player1.x -= 3; - - if (IsKeyDown(KEY_UP)) player2.y += 3; - else if (IsKeyDown(KEY_DOWN)) player2.y -= 3; - if (IsKeyDown(KEY_RIGHT)) player2.x += 3; - else if (IsKeyDown(KEY_LEFT)) player2.x -= 3; - - camera1.target = (Vector2){ player1.x, player1.y }; - camera2.target = (Vector2){ player2.x, player2.y }; - - // Draw - //---------------------------------------------------------------------------------- - BeginTextureMode(screenCamera1); - ClearBackground(RAYWHITE); - BeginMode2D(camera1); - DrawScene(); - EndMode2D(); - DrawText("PLAYER1 W/S/A/D to move", 10, 10, 15, RED); - EndTextureMode(); - - BeginTextureMode(screenCamera2); - ClearBackground(RAYWHITE); - BeginMode2D(camera2); - DrawScene(); - EndMode2D(); - DrawText("PLAYER2 UP/DOWN/LEFT/RIGHT to move", 10, 10, 15, BLUE); - EndTextureMode(); - - // Draw both views render textures to the screen side by side - BeginDrawing(); - ClearBackground(BLACK); - DrawTextureRec(screenCamera1.texture, splitScreenRect, (Vector2){ 0, 0 }, WHITE); - DrawTextureRec(screenCamera2.texture, splitScreenRect, (Vector2){ screenWidth/2.0f, 0 }, WHITE); - EndDrawing(); - } - - // De-Initialization - //-------------------------------------------------------------------------------------- - UnloadRenderTexture(screenCamera1); // Unload render texture - UnloadRenderTexture(screenCamera2); // Unload render texture - - CloseWindow(); // Close window and OpenGL context - //-------------------------------------------------------------------------------------- - - return 0; -} diff --git a/examples/core/core_camera_2d_split_screen.png b/examples/core/core_camera_2d_split_screen.png deleted file mode 100644 index ed5aaa58bfc2bb8124098d2b5c583961414bc218..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20010 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 n%^R!)6;Aa6MJk2uUbP0l+XkK>Db;N diff --git a/examples/shapes/shapes_bouncing_ball.c b/examples/shapes/shapes_bouncing_ball.c index 5e43b80da..203d88a5f 100644 --- a/examples/shapes/shapes_bouncing_ball.c +++ b/examples/shapes/shapes_bouncing_ball.c @@ -23,6 +23,7 @@ int main(void) const int screenWidth = 800; const int screenHeight = 450; + SetConfigFlags(FLAG_MSAA_4X_HINT); InitWindow(screenWidth, screenHeight, "raylib [shapes] example - bouncing ball"); Vector2 ballPosition = { GetScreenWidth()/2.0f, GetScreenHeight()/2.0f }; @@ -61,11 +62,14 @@ int main(void) ClearBackground(RAYWHITE); DrawCircleV(ballPosition, (float)ballRadius, MAROON); - DrawText("PRESS SPACE to PAUSE BALL MOVEMENT", 10, GetScreenHeight() - 25, 20, LIGHTGRAY); + //DrawText("PRESS SPACE to PAUSE BALL MOVEMENT", 10, GetScreenHeight() - 25, 20, LIGHTGRAY); // On pause, we draw a blinking message if (pause && ((framesCounter/30)%2)) DrawText("PAUSED", 350, 200, 30, GRAY); + DrawCircle(400.5, 300.5, 50, BLACK); + DrawCircle(528.0, 172.0, 26, BLACK); + DrawFPS(10, 10); EndDrawing(); diff --git a/examples/shapes/shapes_lines_bezier.c b/examples/shapes/shapes_lines_bezier.c index 195281be3..f01576859 100644 --- a/examples/shapes/shapes_lines_bezier.c +++ b/examples/shapes/shapes_lines_bezier.c @@ -28,6 +28,9 @@ int main(void) Vector2 start = { 0, 0 }; Vector2 end = { (float)screenWidth, (float)screenHeight }; + + Vector2 startControl = { 100, 0 }; + Vector2 endControl = { GetScreenWidth() - 100, GetScreenHeight() }; SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -37,8 +40,16 @@ int main(void) { // Update //---------------------------------------------------------------------------------- - if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) start = GetMousePosition(); - else if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT)) end = GetMousePosition(); + if (IsKeyDown(KEY_LEFT_CONTROL)) + { + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) startControl = GetMousePosition(); + else if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT)) endControl = GetMousePosition(); + } + else + { + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) start = GetMousePosition(); + else if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT)) end = GetMousePosition(); + } //---------------------------------------------------------------------------------- // Draw @@ -49,7 +60,14 @@ int main(void) DrawText("USE MOUSE LEFT-RIGHT CLICK to DEFINE LINE START and END POINTS", 15, 20, 20, GRAY); - DrawLineBezier(start, end, 2.0f, RED); + //DrawLineBezier(start, end, 2.0f, RED); + + DrawLineBezierCubic(start, end, startControl, endControl, 2.0f, RED); + + DrawLineEx(start, startControl, 1.0, LIGHTGRAY); + DrawLineEx(end, endControl, 1.0, LIGHTGRAY); + DrawCircleV(startControl, 10, RED); + DrawCircleV(endControl, 10, RED); EndDrawing(); //---------------------------------------------------------------------------------- diff --git a/examples/shapes/shapes_lines_splines.c b/examples/shapes/shapes_lines_splines.c new file mode 100644 index 000000000..c020c60b6 --- /dev/null +++ b/examples/shapes/shapes_lines_splines.c @@ -0,0 +1,155 @@ +/******************************************************************************************* +* +* raylib [shapes] example - splines drawing +* +* Example originally created with raylib 4.6-dev, last time updated with raylib 4.6-dev +* +* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, +* BSD-like license that allows static linking with closed source software +* +* Copyright (c) 2023 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +#define MAX_CONTROL_POINTS 32 + +typedef struct { + Vector2 start; + Vector2 end; +} ControlPoint; + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + SetConfigFlags(FLAG_MSAA_4X_HINT); + InitWindow(screenWidth, screenHeight, "raylib [shapes] example - splines drawing"); + + Vector2 points[MAX_CONTROL_POINTS] = { + { 100.0f, 200.0f }, + { 300.0f, 400.0f }, + { 500.0f, 300.0f }, + { 700.0f, 100.0f }, + { 200.0f, 100.0f }, + }; + + int pointCount = 5; + int selectedPoint = -1; + + int splineType = 0; // 0-Linear, 1-BSpline, 2-CatmullRom, 3-Bezier + + // Cubic Bezier control points + ControlPoint control[MAX_CONTROL_POINTS] = { 0 }; + for (int i = 0; i < pointCount - 1; i++) + { + control[i].start = points[i]; + control[i].end = points[i + 1]; + } + + 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 + //---------------------------------------------------------------------------------- + // Points movement logic + if (IsMouseButtonPressed(MOUSE_RIGHT_BUTTON) && (pointCount < MAX_CONTROL_POINTS)) + { + points[pointCount] = GetMousePosition(); + pointCount++; + } + + for (int i = 0; i < pointCount; i++) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON) && CheckCollisionPointCircle(GetMousePosition(), points[i], 6.0f)) + { + selectedPoint = i; + break; + } + } + + if (selectedPoint >= 0) + { + points[selectedPoint] = GetMousePosition(); + if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) selectedPoint = -1; + } + + // TODO: Cubic Bezier spline control points logic + + + // Spline selection logic + if (IsKeyPressed(KEY_ONE)) splineType = 0; + else if (IsKeyPressed(KEY_TWO)) splineType = 1; + else if (IsKeyPressed(KEY_THREE)) splineType = 2; + else if (IsKeyPressed(KEY_FOUR)) splineType = 3; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + if (splineType == 0) // Linear + { + // Draw linear spline + for (int i = 0; i < pointCount - 1; i++) + { + DrawLineEx(points[i], points[i + 1], 2.0f, RED); + } + } + else if (splineType == 1) // B-Spline + { + // Draw b-spline + DrawLineBSpline(points, pointCount, 2.0f, RED); + //for (int i = 0; i < (pointCount - 3); i++) DrawLineBSplineSegment(points[i], points[i + 1], points[i + 2], points[i + 3], 24.0f, BLUE); + } + else if (splineType == 2) // CatmullRom Spline + { + // Draw spline: catmull-rom + DrawLineCatmullRom(points, pointCount, 2.0f, RED); + //for (int i = 0; i < (pointCount - 3); i++) DrawLineCatmullRomSegment(points[i], points[i + 1], points[i + 2], points[i + 3], 24.0f, Fade(BLUE, 0.4f)); + } + else if (splineType == 3) // Cubic Bezier + { + // Draw line bezier cubic (with control points) + for (int i = 0; i < pointCount - 1; i++) + { + DrawLineBezierCubic(points[i], points[i + 1], control[i].start, control[i + 1].end, 2.0f, RED); + + // TODO: Every cubic bezier point should have two control points + DrawCircleV(control[i].start, 4, GOLD); + DrawCircleV(control[i].end, 4, GOLD); + DrawLineEx(points[i], control[i].start, 1.0, LIGHTGRAY); + DrawLineEx(points[i + 1], control[i].end, 1.0, LIGHTGRAY); + } + } + + // Draw control points + for (int i = 0; i < pointCount; i++) + { + DrawCircleV(points[i], 6.0f, RED); + if ((splineType != 0) && (i < pointCount - 1)) DrawLineV(points[i], points[i + 1], GRAY); + } + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/VS2022/examples/core_split_screen.vcxproj b/projects/VS2022/examples/core_2d_camera_split_screen.vcxproj similarity index 98% rename from projects/VS2022/examples/core_split_screen.vcxproj rename to projects/VS2022/examples/core_2d_camera_split_screen.vcxproj index 1005e2eaf..98ddc9ed3 100644 --- a/projects/VS2022/examples/core_split_screen.vcxproj +++ b/projects/VS2022/examples/core_2d_camera_split_screen.vcxproj @@ -35,11 +35,11 @@ - {946A1700-C7AA-46F0-AEF2-67C98B5722AC} + {CC62F7DB-D089-4677-8575-CAB7A7815C43} Win32Proj - core_split_screen + core_2d_camera_split_screen 10.0 - core_split_screen + core_2d_camera_split_screen @@ -374,7 +374,7 @@ - + diff --git a/projects/VS2022/examples/core_camera_2d_split_screen.vcxproj b/projects/VS2022/examples/core_3d_camera_split_screen.vcxproj similarity index 99% rename from projects/VS2022/examples/core_camera_2d_split_screen.vcxproj rename to projects/VS2022/examples/core_3d_camera_split_screen.vcxproj index 1efc58a65..f39ccc205 100644 --- a/projects/VS2022/examples/core_camera_2d_split_screen.vcxproj +++ b/projects/VS2022/examples/core_3d_camera_split_screen.vcxproj @@ -37,9 +37,9 @@ {946A1700-C7AA-46F0-AEF2-67C98B5722AC} Win32Proj - core_camera_2d_split_screen + core_3d_camera_split_screen 10.0 - core_camera_2d_split_screen + core_3d_camera_split_screen @@ -374,7 +374,7 @@ - + @@ -384,4 +384,4 @@ - + \ No newline at end of file diff --git a/projects/VS2022/raylib.sln b/projects/VS2022/raylib.sln index 173637554..007f796f9 100644 --- a/projects/VS2022/raylib.sln +++ b/projects/VS2022/raylib.sln @@ -33,6 +33,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core_3d_camera_free", "exam EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core_3d_camera_mode", "examples\core_3d_camera_mode.vcxproj", "{6D1CA2F1-7FCA-4249-9220-075C2DF4F965}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core_3d_camera_split_screen", "examples\core_3d_camera_split_screen.vcxproj", "{946A1700-C7AA-46F0-AEF2-67C98B5722AC}" +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core_3d_picking", "examples\core_3d_picking.vcxproj", "{FD193822-3D5C-4161-A147-884C2ABDE483}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core_custom_logging", "examples\core_custom_logging.vcxproj", "{20AD0AC9-9159-4744-99CC-6AC5779D6B87}" @@ -233,8 +235,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "easings_testbed", "examples EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rlgl_standalone", "examples\rlgl_standalone.vcxproj", "{C8765523-58F8-4C8E-9914-693396F6F0FF}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core_split_screen", "examples\core_split_screen.vcxproj", "{946A1700-C7AA-46F0-AEF2-67C98B5722AC}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "models_loading_vox", "examples\models_loading_vox.vcxproj", "{2F1B955B-275E-4D8E-8864-06FEC44D7912}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "models_loading_gltf", "examples\models_loading_gltf.vcxproj", "{F5FC9279-DE63-4EF3-B31F-CFCEF9B11F71}" @@ -271,6 +271,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shaders_hybrid_render", "ex EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "audio_sound_multi", "examples\audio_sound_multi.vcxproj", "{F81C5819-85B4-4D2E-B6DC-104A7634461B}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core_2d_camera_split_screen", "examples\core_2d_camera_split_screen.vcxproj", "{CC62F7DB-D089-4677-8575-CAB7A7815C43}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug.DLL|x64 = Debug.DLL|x64 @@ -507,6 +509,22 @@ Global {6D1CA2F1-7FCA-4249-9220-075C2DF4F965}.Release|x64.Build.0 = Release|x64 {6D1CA2F1-7FCA-4249-9220-075C2DF4F965}.Release|x86.ActiveCfg = Release|Win32 {6D1CA2F1-7FCA-4249-9220-075C2DF4F965}.Release|x86.Build.0 = Release|Win32 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug.DLL|x64.Build.0 = Debug.DLL|x64 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug|x64.ActiveCfg = Debug|x64 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug|x64.Build.0 = Debug|x64 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug|x86.ActiveCfg = Debug|Win32 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug|x86.Build.0 = Debug|Win32 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release.DLL|x64.ActiveCfg = Release.DLL|x64 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release.DLL|x64.Build.0 = Release.DLL|x64 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release.DLL|x86.Build.0 = Release.DLL|Win32 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release|x64.ActiveCfg = Release|x64 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release|x64.Build.0 = Release|x64 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release|x86.ActiveCfg = Release|Win32 + {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release|x86.Build.0 = Release|Win32 {FD193822-3D5C-4161-A147-884C2ABDE483}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64 {FD193822-3D5C-4161-A147-884C2ABDE483}.Debug.DLL|x64.Build.0 = Debug.DLL|x64 {FD193822-3D5C-4161-A147-884C2ABDE483}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32 @@ -1975,22 +1993,6 @@ Global {C8765523-58F8-4C8E-9914-693396F6F0FF}.Release|x64.Build.0 = Release|x64 {C8765523-58F8-4C8E-9914-693396F6F0FF}.Release|x86.ActiveCfg = Release|Win32 {C8765523-58F8-4C8E-9914-693396F6F0FF}.Release|x86.Build.0 = Release|Win32 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug.DLL|x64.Build.0 = Debug.DLL|x64 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug|x64.ActiveCfg = Debug|x64 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug|x64.Build.0 = Debug|x64 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug|x86.ActiveCfg = Debug|Win32 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Debug|x86.Build.0 = Debug|Win32 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release.DLL|x64.ActiveCfg = Release.DLL|x64 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release.DLL|x64.Build.0 = Release.DLL|x64 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release.DLL|x86.Build.0 = Release.DLL|Win32 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release|x64.ActiveCfg = Release|x64 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release|x64.Build.0 = Release|x64 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release|x86.ActiveCfg = Release|Win32 - {946A1700-C7AA-46F0-AEF2-67C98B5722AC}.Release|x86.Build.0 = Release|Win32 {2F1B955B-275E-4D8E-8864-06FEC44D7912}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64 {2F1B955B-275E-4D8E-8864-06FEC44D7912}.Debug.DLL|x64.Build.0 = Debug.DLL|x64 {2F1B955B-275E-4D8E-8864-06FEC44D7912}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32 @@ -2279,6 +2281,22 @@ Global {F81C5819-85B4-4D2E-B6DC-104A7634461B}.Release|x64.Build.0 = Release|x64 {F81C5819-85B4-4D2E-B6DC-104A7634461B}.Release|x86.ActiveCfg = Release|Win32 {F81C5819-85B4-4D2E-B6DC-104A7634461B}.Release|x86.Build.0 = Release|Win32 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Debug.DLL|x64.Build.0 = Debug.DLL|x64 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Debug|x64.ActiveCfg = Debug|x64 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Debug|x64.Build.0 = Debug|x64 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Debug|x86.ActiveCfg = Debug|Win32 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Debug|x86.Build.0 = Debug|Win32 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Release.DLL|x64.ActiveCfg = Release.DLL|x64 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Release.DLL|x64.Build.0 = Release.DLL|x64 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Release.DLL|x86.Build.0 = Release.DLL|Win32 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Release|x64.ActiveCfg = Release|x64 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Release|x64.Build.0 = Release|x64 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Release|x86.ActiveCfg = Release|Win32 + {CC62F7DB-D089-4677-8575-CAB7A7815C43}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2297,6 +2315,7 @@ Global {557138B0-7BE2-4392-B2E2-B45734031A62} = {6C82BAAE-BDDF-457D-8FA8-7E2490B07035} {9EED87BB-527F-4D05-9384-6D16CFD627A8} = {6C82BAAE-BDDF-457D-8FA8-7E2490B07035} {6D1CA2F1-7FCA-4249-9220-075C2DF4F965} = {6C82BAAE-BDDF-457D-8FA8-7E2490B07035} + {946A1700-C7AA-46F0-AEF2-67C98B5722AC} = {6C82BAAE-BDDF-457D-8FA8-7E2490B07035} {FD193822-3D5C-4161-A147-884C2ABDE483} = {6C82BAAE-BDDF-457D-8FA8-7E2490B07035} {20AD0AC9-9159-4744-99CC-6AC5779D6B87} = {6C82BAAE-BDDF-457D-8FA8-7E2490B07035} {0199E349-0701-40BC-8A7F-06A54FFA3E7C} = {6C82BAAE-BDDF-457D-8FA8-7E2490B07035} @@ -2397,7 +2416,6 @@ Global {FDE6080B-E203-4066-910D-AD0302566008} = {E9D708A5-9C1F-4B84-A795-C5F191801762} {E1B6D565-9D7C-46B7-9202-ECF54974DE50} = {E9D708A5-9C1F-4B84-A795-C5F191801762} {C8765523-58F8-4C8E-9914-693396F6F0FF} = {E9D708A5-9C1F-4B84-A795-C5F191801762} - {946A1700-C7AA-46F0-AEF2-67C98B5722AC} = {6C82BAAE-BDDF-457D-8FA8-7E2490B07035} {2F1B955B-275E-4D8E-8864-06FEC44D7912} = {AF5BEC5C-1F2B-4DA8-B12D-D09FE569237C} {F5FC9279-DE63-4EF3-B31F-CFCEF9B11F71} = {AF5BEC5C-1F2B-4DA8-B12D-D09FE569237C} {F2DB2E59-76BF-4D81-859A-AFC289C046C0} = {8D3C83B7-F1E0-4C2E-9E34-EE5F6AB2502A} @@ -2416,6 +2434,7 @@ Global {70B35F59-AFC2-4D8F-8833-5314D2047A81} = {5317807F-61D4-4E0F-B6DC-2D9F12621ED9} {3755E9F4-CB48-4EC3-B561-3B85964EBDEF} = {5317807F-61D4-4E0F-B6DC-2D9F12621ED9} {F81C5819-85B4-4D2E-B6DC-104A7634461B} = {CC132A4D-D081-4C26-BFB9-AB11984054F8} + {CC62F7DB-D089-4677-8575-CAB7A7815C43} = {6C82BAAE-BDDF-457D-8FA8-7E2490B07035} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E926C768-6307-4423-A1EC-57E95B1FAB29}