From efeccfef613729cb2c47c991825b1b5f4ea3d7af Mon Sep 17 00:00:00 2001 From: JordSant <77529699+JordSant@users.noreply.github.com> Date: Tue, 9 Dec 2025 19:14:16 +0100 Subject: [PATCH] [examples] Add `textures_cellular_automata` (#5395) * [examples] Add `textures_cellular_automata` * Comparison always true. Fixed * Tabs to spaces --- .../textures/textures_cellular_automata.c | 212 +++++++ .../textures/textures_cellular_automata.png | Bin 0 -> 14803 bytes .../textures_cellular_automata.vcxproj | 569 ++++++++++++++++++ 3 files changed, 781 insertions(+) create mode 100644 examples/textures/textures_cellular_automata.c create mode 100644 examples/textures/textures_cellular_automata.png create mode 100644 projects/VS2022/examples/textures_cellular_automata.vcxproj diff --git a/examples/textures/textures_cellular_automata.c b/examples/textures/textures_cellular_automata.c new file mode 100644 index 000000000..d24104200 --- /dev/null +++ b/examples/textures/textures_cellular_automata.c @@ -0,0 +1,212 @@ +/******************************************************************************************* +* +* raylib [textures] example - one-dimensional elementary cellular automata +* +* Example complexity rating: [★★☆☆] 2/4 +* +* Example originally created with raylib 5.6, last time updated with raylib 5.6 +* +* Example contributed by Jordi Santonja (@JordSant) 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) 2025 Jordi Santonja (@JordSant) +* +********************************************************************************************/ + +#include "raylib.h" + +// Initialization constants +//-------------------------------------------------------------------------------------- +const int screenWidth = 800; +const int screenHeight = 450; +const int imageWidth = 800; +const int imageHeight = 800/2; + +// Rule button sizes and positions +const int drawRuleStartX = 585; +const int drawRuleStartY = 10; +const int drawRuleSpacing = 15; +const int drawRuleGroupSpacing = 50; +const int drawRuleSize = 14; +const int drawRuleInnerSize = 10; + +// Preset button sizes +const int presetsSizeX = 42; +const int presetsSizeY = 22; + +const int linesUpdatedPerFrame = 4; + +//---------------------------------------------------------------------------------- +// Functions +//---------------------------------------------------------------------------------- +void ComputeLine(Image *image, int line, int rule) +{ + // Compute next line pixels. Boundaries are not computed, always 0 + for (int i = 1; i < imageWidth - 1; i++) + { + // Get, from the previous line, the 3 pixels states as a binary value + const int prevValue = ((GetImageColor(*image, i - 1, line - 1).r < 5)? 4 : 0) + // Left pixel + ((GetImageColor(*image, i, line - 1).r < 5)? 2 : 0) + // Center pixel + ((GetImageColor(*image, i + 1, line - 1).r < 5)? 1 : 0); // Right pixel + // Get next value from rule bitmask + const bool currValue = (rule & (1 << prevValue)); + // Update pixel color + ImageDrawPixel(image, i, line, (currValue)? BLACK : RAYWHITE); + } +} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + InitWindow(screenWidth, screenHeight, "raylib [textures] example - elementary cellular automata"); + + // Image that contains the cellular automaton + Image image = GenImageColor(imageWidth, imageHeight, RAYWHITE); + // The top central pixel set as black + ImageDrawPixel(&image, imageWidth/2, 0, BLACK); + + Texture2D texture = LoadTextureFromImage(image); + + // Some interesting rules + const int presetValues[] = { 18, 30, 60, 86, 102, 124, 126, 150, 182, 225 }; + const int presetsCount = sizeof(presetValues)/sizeof(presetValues[0]); + + // Variables + int rule = 30; // Starting rule + int line = 1; // Line to compute, starting from line 1. One point in line 0 is already set + + SetTargetFPS(60); + //--------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + // Handle mouse + const Vector2 mouse = GetMousePosition(); + int mouseInCell = -1; // -1: outside any button; 0-7: rule cells; 8+: preset cells + + // Check mouse on rule cells + for (int i = 0; i < 8; i++) + { + const int cellX = drawRuleStartX - drawRuleGroupSpacing*i + drawRuleSpacing; + const int cellY = drawRuleStartY + drawRuleSpacing; + if ((mouse.x >= cellX) && (mouse.x <= cellX + drawRuleSize) && + (mouse.y >= cellY) && (mouse.y <= cellY + drawRuleSize)) + { + mouseInCell = i; // 0-7: rule cells + break; + } + } + + // Check mouse on preset cells + if (mouseInCell < 0) + { + for (int i = 0; i < presetsCount; i++) + { + const int cellX = 4 + (presetsSizeX + 2)*(i/2); + const int cellY = 2 + (presetsSizeY + 2)*(i%2); + if ((mouse.x >= cellX) && (mouse.x <= cellX + presetsSizeX) && + (mouse.y >= cellY) && (mouse.y <= cellY + presetsSizeY)) + { + mouseInCell = i + 8; // 8+: preset cells + break; + } + } + } + + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) && (mouseInCell >= 0)) + { + // Rule changed both by selecting a preset or toggling a bit + if (mouseInCell < 8) + rule ^= (1 << mouseInCell); + else + rule = presetValues[mouseInCell - 8]; + + // Reset image + ImageClearBackground(&image, RAYWHITE); + ImageDrawPixel(&image, imageWidth/2, 0, BLACK); + line = 1; + } + + // Compute next lines + //---------------------------------------------------------------------------------- + if (line < imageHeight) + { + for (int i = 0; (i < linesUpdatedPerFrame) && (line + i < imageHeight); i++) + ComputeLine(&image, line + i, rule); + line += linesUpdatedPerFrame; + + UpdateTexture(texture, image.data); + } + + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + ClearBackground(RAYWHITE); + + // Draw cellular automaton texture + DrawTexture(texture, 0, screenHeight - imageHeight, WHITE); + + // Draw preset values + for (int i = 0; i < presetsCount; i++) + { + DrawText(TextFormat("%i", presetValues[i]), 8 + (presetsSizeX + 2)*(i/2), 4 + (presetsSizeY + 2)*(i%2), 20, GRAY); + DrawRectangleLines(4 + (presetsSizeX + 2)*(i/2), 2 + (presetsSizeY + 2)*(i%2), presetsSizeX, presetsSizeY, BLUE); + + // If the mouse is on this preset, highlight it + if (mouseInCell == i + 8) + DrawRectangleLinesEx((Rectangle) { 2 + (presetsSizeX + 2.0f)*(i/2), + (presetsSizeY + 2.0f)*(i%2), + presetsSizeX + 4.0f, presetsSizeY + 4.0f }, 3, RED); + } + + // Draw rule bits + for (int i = 0; i < 8; i++) + { + // The three input bits + for (int j = 0; j < 3; j++) + { + DrawRectangleLines(drawRuleStartX - drawRuleGroupSpacing*i + drawRuleSpacing*j, drawRuleStartY, drawRuleSize, drawRuleSize, GRAY); + if (i & (4 >> j)) + DrawRectangle(drawRuleStartX + 2 - drawRuleGroupSpacing*i + drawRuleSpacing*j, drawRuleStartY + 2, drawRuleInnerSize, drawRuleInnerSize, BLACK); + } + + // The output bit + DrawRectangleLines(drawRuleStartX - drawRuleGroupSpacing*i + drawRuleSpacing, drawRuleStartY + drawRuleSpacing, drawRuleSize, drawRuleSize, BLUE); + if (rule & (1 << i)) + DrawRectangle(drawRuleStartX + 2 - drawRuleGroupSpacing*i + drawRuleSpacing, drawRuleStartY + 2 + drawRuleSpacing, drawRuleInnerSize, drawRuleInnerSize, BLACK); + + // If the mouse is on this rule bit, highlight it + if (mouseInCell == i) + DrawRectangleLinesEx((Rectangle){ drawRuleStartX - drawRuleGroupSpacing*i + drawRuleSpacing - 2.0f, + drawRuleStartY + drawRuleSpacing - 2.0f, + drawRuleSize + 4.0f, drawRuleSize + 4.0f }, 3, RED); + } + + DrawText(TextFormat("RULE: %i", rule), drawRuleStartX + drawRuleSpacing*4, drawRuleStartY + 1, 30, GRAY); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadImage(image); + UnloadTexture(texture); + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} + diff --git a/examples/textures/textures_cellular_automata.png b/examples/textures/textures_cellular_automata.png new file mode 100644 index 0000000000000000000000000000000000000000..2d88041d2c3641805cb5af8d4b52e059a6947ec4 GIT binary patch literal 14803 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⪚yb3S@1F18GP0lXh2 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 + + + + 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 + + + + {0A0FC982-6E31-401F-BA77-3C5E8AB02C68} + Win32Proj + textures_cellular_automata + 10.0 + textures_cellular_automata + + + + 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\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + 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;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