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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 F{~tJM=}Z6s 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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 D;+@s` 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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 diff --git a/examples/core/core_split_screen.png b/examples/core/core_split_screen.png deleted file mode 100644 index eace9027b0710f3a743641e6ca7d4930295d5603..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21609 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 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}