From 2a04317cff9dfdd7e0880dc5105ced8ca48b1eb9 Mon Sep 17 00:00:00 2001 From: JordSant <77529699+JordSant@users.noreply.github.com> Date: Wed, 15 Oct 2025 19:39:47 +0200 Subject: [PATCH] [examples] Added: `shapes_particles` (#5260) * [Examples] Added shapes_particles * Changes to follow the code conventions. Improved some things. * Fixed name * Fixed PNG name --------- Co-authored-by: Ray --- examples/shapes/shapes_simple_particles.c | 277 +++++++++ examples/shapes/shapes_simple_particles.png | Bin 0 -> 32265 bytes .../examples/shapes_simple_particles.vcxproj | 569 ++++++++++++++++++ projects/VS2022/raylib.sln | 8 + 4 files changed, 854 insertions(+) create mode 100644 examples/shapes/shapes_simple_particles.c create mode 100644 examples/shapes/shapes_simple_particles.png create mode 100644 projects/VS2022/examples/shapes_simple_particles.vcxproj diff --git a/examples/shapes/shapes_simple_particles.c b/examples/shapes/shapes_simple_particles.c new file mode 100644 index 000000000..aae85f35d --- /dev/null +++ b/examples/shapes/shapes_simple_particles.c @@ -0,0 +1,277 @@ +/******************************************************************************************* +* +* raylib [shapes] example - simple particles +* +* Example complexity rating: [★☆☆☆] 1/4 +* +* Example originally created with raylib 5.6, last time updated with raylib 5.6 +* +* Example contributed by Jordi Santonja (@JordSant) +* +* 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) 2025 Jordi Santonja (@JordSant) +* +********************************************************************************************/ + +#include "raylib.h" + +#include // Required for: calloc(), free() +#include // Required for: cosf(), sinf() + +#define MAX_PARTICLES 3000 // Max number particles + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +typedef enum ParticleType { + WATER = 0, + SMOKE, + FIRE +} ParticleType; + +static const char particleTypesChar[3][10] = { "WATER", "SMOKE", "FIRE" }; + +typedef struct Particle { + Vector2 position; // Particle position on screen + Vector2 velocity; // Particle current speed and direction + bool alive; // Particle alive: inside screen and life time + float lifeTime; // Particle life time + ParticleType type; // Particle type (WATER, SMOKE, FIRE) + float radius; // Particle radius + Color color; // Particle color +} Particle; + +typedef struct CircularBuffer { + int head; // Index for the next write + int tail; // Index for the next read + Particle *buffer; // Particle buffer array +} CircularBuffer; + +//---------------------------------------------------------------------------------- +// Module Functions Declaration +//---------------------------------------------------------------------------------- +static void EmitParticle(CircularBuffer *circularBuffer, Vector2 emitterPosition, ParticleType type); +static Particle *AddToCircularBuffer(CircularBuffer *circularBuffer); +static void UpdateParticles(CircularBuffer *circularBuffer, int screenWidth, int screenHeight); +static void UpdateCircularBuffer(CircularBuffer *circularBuffer); +static void DrawParticles(CircularBuffer *circularBuffer); + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [shapes] example - particles"); + + // Definition of particles + Particle *particles = (Particle*)RL_CALLOC(MAX_PARTICLES, sizeof(Particle)); // Particle array + CircularBuffer circularBuffer = { 0, 0, particles }; + + // Particle emitter parameters + int emissionRate = -2; // Negative: on average every -X frames. Positive: particles per frame + ParticleType currentType = WATER; + Vector2 emitterPosition = { screenWidth/2.0f, screenHeight/2.0f }; + + 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 + //---------------------------------------------------------------------------------- + // Emit new particles: when emissionRate is 1, emit every frame + if (emissionRate < 0) + { + if (rand()%(-emissionRate) == 0) + EmitParticle(&circularBuffer, emitterPosition, currentType); + } + else + { + for (int i = 0; i <= emissionRate; ++i) + EmitParticle(&circularBuffer, emitterPosition, currentType); + } + + // Update the parameters of each particle + UpdateParticles(&circularBuffer, screenWidth, screenHeight); + // Remove dead particles from the circular buffer + UpdateCircularBuffer(&circularBuffer); + + // Change Particle Emission Rate (UP/DOWN arrows) + if (IsKeyPressed(KEY_UP)) + ++emissionRate; + if (IsKeyPressed(KEY_DOWN)) + --emissionRate; + + // Change Particle Type (LEFT/RIGHT arrows) + if (IsKeyPressed(KEY_RIGHT)) + (currentType == FIRE) ? (currentType = WATER) : ++currentType; + if (IsKeyPressed(KEY_LEFT)) + (currentType == WATER) ? (currentType = FIRE) : --currentType; + + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) + emitterPosition = GetMousePosition(); + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + // Call the function with a loop to draw all particles + DrawParticles(&circularBuffer); + + // Draw UI and Instructions + DrawRectangle(5, 5, 315, 75, Fade(SKYBLUE, 0.5f)); + DrawRectangleLines(5, 5, 315, 75, BLUE); + + DrawText("CONTROLS:", 15, 15, 10, BLACK); + DrawText("UP/DOWN: Change Particle Emission Rate", 15, 35, 10, BLACK); + DrawText("LEFT/RIGHT: Change Particle Type (Water, Smoke, Fire)", 15, 55, 10, BLACK); + + if (emissionRate < 0) + DrawText(TextFormat("Particles every %d frames | Type: %s", -emissionRate, particleTypesChar[currentType]), 15, 95, 10, DARKGRAY); + else + DrawText(TextFormat("%d Particles per frame | Type: %s", emissionRate + 1, particleTypesChar[currentType]), 15, 95, 10, DARKGRAY); + + DrawFPS(screenWidth - 80, 10); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + RL_FREE(particles); // Free particles array data + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} + +//---------------------------------------------------------------------------------- +// Module Functions Definition +//---------------------------------------------------------------------------------- +static void EmitParticle(CircularBuffer *circularBuffer, Vector2 emitterPosition, ParticleType type) +{ + Particle *newParticle = AddToCircularBuffer(circularBuffer); + // If buffer is full, newParticle is NULL + if (newParticle != NULL) + { + // Fill particle properties + newParticle->position = emitterPosition; + newParticle->alive = true; + newParticle->lifeTime = 0.0f; + newParticle->type = type; + float speed = (float)(rand()%10)/5.0f; + switch (type) + { + case WATER: + newParticle->radius = 5.0f; + newParticle->color = BLUE; + break; + case SMOKE: + newParticle->radius = 7.0f; + newParticle->color = GRAY; + break; + case FIRE: + newParticle->radius = 10.0f; + newParticle->color = YELLOW; + speed /= 10.0f; + break; + default: break; + } + float direction = (float)(rand()%360); + newParticle->velocity = (Vector2){ speed*cosf(direction*DEG2RAD), speed*sinf(direction*DEG2RAD) }; + } +} + +static Particle *AddToCircularBuffer(CircularBuffer *circularBuffer) +{ + Particle *particle = NULL; + + // Check if buffer full + if (((circularBuffer->head + 1)%MAX_PARTICLES) != circularBuffer->tail) + { + // Add new particle to the head position and advance head + particle = &circularBuffer->buffer[circularBuffer->head]; + circularBuffer->head = (circularBuffer->head + 1)%MAX_PARTICLES; + } + + return particle; +} + +static void UpdateParticles(CircularBuffer *circularBuffer, int screenWidth, int screenHeight) +{ + for (int i = circularBuffer->tail; i != circularBuffer->head; i = (i + 1)%MAX_PARTICLES) + { + // Update particle life and positions + circularBuffer->buffer[i].lifeTime += 1.0f/60.0f; // 60 FPS -> 1/60 seconds per frame + + switch (circularBuffer->buffer[i].type) + { + case WATER: + circularBuffer->buffer[i].position.x += circularBuffer->buffer[i].velocity.x; + circularBuffer->buffer[i].velocity.y += 0.2f; // Gravity + circularBuffer->buffer[i].position.y += circularBuffer->buffer[i].velocity.y; + break; + case SMOKE: + circularBuffer->buffer[i].position.x += circularBuffer->buffer[i].velocity.x; + circularBuffer->buffer[i].velocity.y -= 0.05f; // Upwards + circularBuffer->buffer[i].position.y += circularBuffer->buffer[i].velocity.y; + circularBuffer->buffer[i].radius += 0.5f; // Increment radius: smoke expands + circularBuffer->buffer[i].color.a -= 4; // Decrement alpha: smoke fades + if (circularBuffer->buffer[i].color.a < 4) // If alpha transparent, particle dies + circularBuffer->buffer[i].alive = false; + break; + case FIRE: + // Add a little horizontal oscillation to fire particles + circularBuffer->buffer[i].position.x += circularBuffer->buffer[i].velocity.x + cosf(circularBuffer->buffer[i].lifeTime*215.0f); + circularBuffer->buffer[i].velocity.y -= 0.05f; // Upwards + circularBuffer->buffer[i].position.y += circularBuffer->buffer[i].velocity.y; + circularBuffer->buffer[i].radius -= 0.15f; // Decrement radius: fire shrinks + circularBuffer->buffer[i].color.g -= 3; // Decrement green: fire turns reddish starting from yellow + if (circularBuffer->buffer[i].radius <= 0.02f) // If radius too small, particle dies + circularBuffer->buffer[i].alive = false; + break; + default: break; + } + + // Disable particle when out of screen + Vector2 center = circularBuffer->buffer[i].position; + float radius = circularBuffer->buffer[i].radius; + if ((center.x < -radius) || (center.x > screenWidth + radius) || + (center.y < -radius) || (center.y > screenHeight + radius)) + circularBuffer->buffer[i].alive = false; + } +} +static void UpdateCircularBuffer(CircularBuffer *circularBuffer) +{ + // Update circular buffer: advance tail over dead particles + while ((circularBuffer->tail != circularBuffer->head) && + !circularBuffer->buffer[circularBuffer->tail].alive) + { + circularBuffer->tail = (circularBuffer->tail + 1)%MAX_PARTICLES; + } +} + +static void DrawParticles(CircularBuffer *circularBuffer) +{ + for (int i = circularBuffer->tail; i != circularBuffer->head; i = (i + 1)%MAX_PARTICLES) + { + if (circularBuffer->buffer[i].alive) + { + DrawCircleV(circularBuffer->buffer[i].position, + circularBuffer->buffer[i].radius, + circularBuffer->buffer[i].color); + } + } +} diff --git a/examples/shapes/shapes_simple_particles.png b/examples/shapes/shapes_simple_particles.png new file mode 100644 index 0000000000000000000000000000000000000000..78abece57c0dccecba54c3c679beb9e163d6460a GIT binary patch literal 32265 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 literal 0 HcmV?d00001 diff --git a/projects/VS2022/examples/shapes_simple_particles.vcxproj b/projects/VS2022/examples/shapes_simple_particles.vcxproj new file mode 100644 index 000000000..8a5270503 --- /dev/null +++ b/projects/VS2022/examples/shapes_simple_particles.vcxproj @@ -0,0 +1,569 @@ + + + + + Debug.DLL + ARM64 + + + Debug.DLL + Win32 + + + Debug.DLL + x64 + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release.DLL + ARM64 + + + Release.DLL + Win32 + + + Release.DLL + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {497FDF54-9762-4048-A833-61CC3980A0FB} + Win32Proj + shapes_simple_particles + 10.0 + shapes_simple_particles + + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shapes + WindowsLocalDebugger + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + /FS %(AdditionalOptions) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;shcore.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + /FS %(AdditionalOptions) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + Copy Debug DLL to output directory + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + Copy Debug DLL to output directory + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + Copy Debug DLL to output directory + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + + + Copy Release DLL to output directory + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + + + Copy Release DLL to output directory + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + + + Copy Release DLL to output directory + + + + + + + + + + + {e89d61ac-55de-4482-afd4-df7242ebc859} + + + + + + \ No newline at end of file diff --git a/projects/VS2022/raylib.sln b/projects/VS2022/raylib.sln index 881c489ba..48f3762dd 100644 --- a/projects/VS2022/raylib.sln +++ b/projects/VS2022/raylib.sln @@ -383,6 +383,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shapes_triangle_strip", "ex EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core_directory_files", "examples\core_directory_files.vcxproj", "{6B1A933E-71B8-4C1F-9E79-02D98830E671}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shapes_kaleidoscope", "examples\shapes_kaleidoscope.vcxproj", "{6B1A933E-71B8-4C1F-9E79-02D98830E671}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shapes_recursive_tree", "examples\shapes_recursive_tree.vcxproj", "{6B1A933E-71B8-4C1F-9E79-02D98830E671}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shapes_triangle_strip", "examples\shapes_triangle_strip.vcxproj", "{2CCCD9E4-9058-4291-BD89-39C979F0CA1E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shapes_simple_particles", "examples\shapes_simple_particles.vcxproj", "{6B1A933E-71B8-4C1F-9E79-02D98830E671}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug.DLL|ARM64 = Debug.DLL|ARM64