From 366300aafee6270ed94e99b3a67d9085353012fa Mon Sep 17 00:00:00 2001 From: JordSant <77529699+JordSant@users.noreply.github.com> Date: Tue, 9 Dec 2025 19:13:05 +0100 Subject: [PATCH] [examples] Add `shaders_game_of_life` (#5394) * [examples] Add `shaders_game_of_life` * Declaration hides another variable same name --- .../shaders/resources/game_of_life/acorn.png | Bin 0 -> 218 bytes .../resources/game_of_life/breeder.png | Bin 0 -> 1919 bytes .../shaders/resources/game_of_life/glider.png | Bin 0 -> 216 bytes .../resources/game_of_life/glider_gun.png | Bin 0 -> 291 bytes .../resources/game_of_life/oscillators.png | Bin 0 -> 463 bytes .../resources/game_of_life/puffer_train.png | Bin 0 -> 1378 bytes .../resources/game_of_life/r_pentomino.png | Bin 0 -> 213 bytes .../resources/game_of_life/spaceships.png | Bin 0 -> 828 bytes .../resources/game_of_life/still_lifes.png | Bin 0 -> 615 bytes .../resources/shaders/glsl100/game_of_life.fs | 44 ++ .../resources/shaders/glsl120/game_of_life.fs | 42 ++ .../resources/shaders/glsl330/game_of_life.fs | 45 ++ examples/shaders/shaders_game_of_life.c | 350 +++++++++++ examples/shaders/shaders_game_of_life.png | Bin 0 -> 13793 bytes .../examples/shaders_game_of_life.vcxproj | 569 ++++++++++++++++++ 15 files changed, 1050 insertions(+) create mode 100644 examples/shaders/resources/game_of_life/acorn.png create mode 100644 examples/shaders/resources/game_of_life/breeder.png create mode 100644 examples/shaders/resources/game_of_life/glider.png create mode 100644 examples/shaders/resources/game_of_life/glider_gun.png create mode 100644 examples/shaders/resources/game_of_life/oscillators.png create mode 100644 examples/shaders/resources/game_of_life/puffer_train.png create mode 100644 examples/shaders/resources/game_of_life/r_pentomino.png create mode 100644 examples/shaders/resources/game_of_life/spaceships.png create mode 100644 examples/shaders/resources/game_of_life/still_lifes.png create mode 100644 examples/shaders/resources/shaders/glsl100/game_of_life.fs create mode 100644 examples/shaders/resources/shaders/glsl120/game_of_life.fs create mode 100644 examples/shaders/resources/shaders/glsl330/game_of_life.fs create mode 100644 examples/shaders/shaders_game_of_life.c create mode 100644 examples/shaders/shaders_game_of_life.png create mode 100644 projects/VS2022/examples/shaders_game_of_life.vcxproj diff --git a/examples/shaders/resources/game_of_life/acorn.png b/examples/shaders/resources/game_of_life/acorn.png new file mode 100644 index 0000000000000000000000000000000000000000..58ea0b4d1c588535bc857e5ef7cb3b474260c014 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0y~yU;wdMIoKE&7-~{#GZ+{c7>k44ofvPP)Tw7+U|>mi z^mSxl*x1kgCy|wbfk7eJBgmJ5p-PQ`p`nF=;THn~L&FOOhEf9thF1v;3|2E37{m+a z>NSs54@6p}rHd>I(3)EF2VS{N99F)%PRykKA`HDF+PmB7GYHG_dc zykO3*KpO@I2F?PH$YKTtJ!KGPtXOJa#=yY9UgGKN%Knmvg~!~4e~Eb{0|VPtPZ!6K zid%1EJvZG^;3?I3U-N%))!a3^x|DdFGPW%7z4UcAZ`<+94FdJ|zW=RWx+La$Xc0${ z5Rc}4_QRiTu79?%+!(?s0_< zwvI1qlO%;@PU_?`hh&?1SLyKTM$)nZs0>1fr5R z9M{{L)xp&oBxtsx(P~5iz4Q4x!jqlzVENk%CWaSvV~^IjNjI zCaY*slfxXzsu20w50}#dOfD65-(GO`!sWB}hxxJ|6jq2{e9LZ{mcbsWw27ngpZ*7t zi$_hSpLf_ORL!_F_CTs#bD_Afk>QOUPP=Awo!Mah;6jRU7v~v^=0vv{zCrpucYg0* zTE3CX>~a>9(2_%Jn|AbG-lo5LfBRQ8gOa^Qf2ywSpQ8RDS-~TyCsqGwsFO}xnrTSu z^&hSuSy)b-x*SocE4`NI&K60Ym+wWE-)l*|{vrEg$D_in)!c&BC)eu8h3{_Vd3mi( z^6T<{^GY3dq_Al}$VryD(7Qn(;epMAPtrN3r`%>*wEcJH&3y{r)%@b3l$SRKrG7Cx zX;W!xex0jR<*V4v=Y=^Ku)Of+8N&GfKdpy2EAUEPr;Y5d=k7N?7xoIYXGGRs>RPdVQ>In^T7%QWpnnsrU1VR%{lDa|)#)iB@tuq;a-@B3=<|aFv_l76C8+)SP-Q`nX z-`Zvxk}O%|nLV7V?B3cf-?r4v zEcEmS)N8b4y|O$+p8@SbCW0P*A(RrlcH$%t1*7w0&DqRIef3# zc7uIn=MIz`@TEX*1k6S{VZ0dT; zJWUVI?L0Dds_xBq8o^vuW-g}}JKW@n`B$Ldd$)SGty#m8&;1dHL?pH_DaYNuyOM*M zk#G5oGmU4~zS(@cL?PX`s`lhwPR0HQPZ|uL9T0qSA>g;=W1cfw%lu;RpX`3{Au8;x zy2K2Lhfm(9Y%}?E>RN>4vXyEgk2u3lE8UM{52-dP4`149!Q?&X;Ovjvyx*@*E?fOL zFDg#h#q{jH;^^3gv()FLzxTPSzh<{ZHQSSrpFXyCCmfu#XYagM8Fp8u=L?6gl{T;EAz`}q-{nQ~m;cqh)}RpCDH^=x@S=-8rfIJV+vIA47s!0B_MhHe*ipq| zbeiq;vG`XT_nTTDu4SDt?cMV@6ZLIJ&$tP(H$OR2^Kw<=z25!1YYR4Kd)BftmTvIb zz0bt8I;~vybCpu{bzxCo1qZI6$T@#5|6re%s9|>E%xcbT)xYiuPdV(PliZC@>Q2+M zo~p%|ERZ&NvzwtM3^0L zQDOE+l?5#BYV#F*Fy6C1j8&ZnyKY}SuDoo6!|AZa%a5K) zaaLPr#*(f+!F}o1H1Vpram+K;sVWPEu_=k#u2-vWpD4uR#IUgBXIYX!d^&S5+Y-@c zu4rq+gAQ*dd$Y6z%~{boH+H|r7Fjl)-K^TGkJ$npmrFI;tPMQ!FmQ`ugU9kC_WN6F zqb^_UYLvdV^-02f$*=2U&TE_r*tg-+Li62gUb(w|Pw6UGNOeMqZFtDUM z`Z_W&Z0zU$lL%6&kn9oU%fL{j#=y|f!ocv0fq|jn1p`B=0RzLU1O^7H84L{K1#@-< z+AuIMa29w(7BevDDT6R$#Zvn+1_lQ95>H=O_Ln>??5u2RVRta*LXa`PQShLXc!mmKpm)!gFjszU7=f?~TF7#J8l MUHx3vIVCg!0B%S(p8x;= literal 0 HcmV?d00001 diff --git a/examples/shaders/resources/game_of_life/glider_gun.png b/examples/shaders/resources/game_of_life/glider_gun.png new file mode 100644 index 0000000000000000000000000000000000000000..29b65d3de8ae04baa7be9ae31a29d9704cc1eab5 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0y~yU{GUVVBqFpV_;wq=Kt@;z`(#*9OUlAc=M!AJp%&+ zOS+@4BLl<6e(pbstPBhc3dtTpz6=aiY77hwEes657#J8DUNA6}8Za=tN?>5Hn!&&z zUNC1@pbY~9180FpWHAGSo-znCRxGtIV_;xlFY)wsWq--T!eb^FyZcf+0|P^)r;B5V z#p$ylj(iOU9MY%r{{9cHz9!7ZdyF&V+GQiLj9Yw)JGZi4{4c?jpqnJ<)HPAkqi9v# z_jMtL482bbbryGBkN*9YLz8>b(kFghk;^Xf+}y0Ss(ka_wZbbuM1S2QUQnW`VGuAY>t=Do35YFz`(%Z>FVdQ&MBb@0Hfqy>;M1& literal 0 HcmV?d00001 diff --git a/examples/shaders/resources/game_of_life/oscillators.png b/examples/shaders/resources/game_of_life/oscillators.png new file mode 100644 index 0000000000000000000000000000000000000000..badd6a92d45df39a017930934edb6e6d61ecc241 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0y~yU~pn!V36ftV_;yA>)CaRfq{XsILO_J@#aaLdIkmt zmUKs7M+SzC{oH>NSs54@6p}rHd>I(3)EF2VS{N99F)%PRykKA`HDF+PmB7GYHG_dc zykO3*KpO@I2F?PH$YKTtJ!KGPtXOJa#=yY9UgGKN%Knmvg~!19Lew691_nk|PZ!6K zh{JCq9Qh6#aAYsP^W%ST?LEIh!9|f=CJVEQ?uaPpNu1$(uzT(1+D+^pF4BU!3T|^J z**Y-1XLFj?EIJ{J{Xk|XqeX*)lK8JXok#n4B5r*+X0D@b@o1u>`>m{-nvt(|e%Cuc zXT>Mxf|B0AB_`U^a-P#Ro%zwei+jeF*kl%cn^m<{jG0@{m_}-)_Y1_PFEN|+X4StJT-*RE_>FvQXNzq^i@VB>m_5n6x*_(_TbH9WJYzz4-0ni!)z8 RVPIfj@O1TaS?83{1ORVJvg`l= literal 0 HcmV?d00001 diff --git a/examples/shaders/resources/game_of_life/puffer_train.png b/examples/shaders/resources/game_of_life/puffer_train.png new file mode 100644 index 0000000000000000000000000000000000000000..8d77219b024579726c05be0bb520d0193da6e920 GIT binary patch literal 1378 zcmeAS@N?(olHy`uVBq!ia0y~yV9;Y=U|7h(#=yX^Bfi&)fq{XsILO_J@#aaLdIkmt zmUKs7M+SzC{oH>NSs54@6p}rHd>I(3)EF2VS{N99F)%PRykKA`HDF+PmB7GYHG_dc zykO3*KpO@I2F?PH$YKTtJ!KGPtXOJa#=yY9UgGKN%Knmvg~wET!>kBB1_qWLo-U3d z6}R5Tp4{})wpR0SU2W`mzL=RZGx&b|KI=cVDZ z9_-)0f7w^t;Oxa8&VN3V{YTVc@zLj%R}Sr(dFr!Gmav5Rg2>yEOy~U_R{37JW*=9u zLQpR9x(&;<8-FVL(_+70`{diK{hRN)#iNwZQ7bE#KK$`pB|xXVbI#&t{)hI=SN8L9 zoI3TJiqsaDbMqEvo_!YMoBF5FCF96U>B~2jBp)sJQd-!%rT6dS$m`{d4$bw*hq)XwzvcwSsuZM94_V{hNy z-OF8Px3i`CeZM?+^33dc6+RJcTewVSX&tDkPrtFrbE&_bkn>}SMpvw;Me`RKZn8gw_-$lnNB8O(N|qGbpk`nw>b-9_Lzk4 zwB1@1qq?N}(B#!UYCDANmYjJr(WhnF%(aXimuw4HM^(B%E{ah#VW@OFb9ZKd<+@E> zyxP_Jr$aOD3J1ox-m(oeVxHu3Z&D2FyLk?rg2r!F?^a(`F!cgY#`k8qyTW-fspT2g zhnGz`*0%6ec!~cVfu%X$TTDJ{Ubo#Sw6ElQi&@F^m-8-6n|Zp#-y?W?(Ou!~ZOxzV z3hxfv`{}N*`I)aT=4n)_=>44cX=U_@+2L!9Hn$i~^SOIym->vA(HY-cj!&%c_|9Tn z%KdiUgd$PxxeLnuD>&B{`Aspd&Whq`4|@J7?|yK(f5ydwtIyP&nl~#YkS$zN@nXoy zOM9-QaJuE)6;}ToDO#f=ZK26scQfko0l9#i5oH;s8x0N$rkyCc^K5Bm=CuB}rR-cS zS3^~{<<*+b(Av@RWAod&cJBjLRlauBugY5Hvy6Z0wIwl9dLqjTPalZ&HCe{p$D`~z z*QC}@%*xZc^uas5hkVjny?l4>sw!wYFTJ=a=2So?i{vSusc!7=mhnwZ%P}imVWQ;m zDj+kYL&$llAmcy&so%~u`DI_q(6uVq?sBekS^f#OOYH9!J?+}kxO?-qVD)|LTXrqY zUvccRP^YN0kE~X&RrIfb%#;UulYDC4%1bWgyW=`dnmH+?% literal 0 HcmV?d00001 diff --git a/examples/shaders/resources/game_of_life/r_pentomino.png b/examples/shaders/resources/game_of_life/r_pentomino.png new file mode 100644 index 0000000000000000000000000000000000000000..1707f3c12d561bf0aad93a9de91a60aa452f6829 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0y~yU|eMqZFtDUM z`Z_W&Z0zU$lL%6&kn9oU%fL{j#=y|f!ocv0fq|jn1p`B=0RzLU1O^7H84L{K1#@-< z+AuIMa29w(7BevDDT6R$#Zvn+1_lQ95>H=O_Ln>?JSI{<;xj`T7#OrYT^vI=uE(BS z$je~BbHu^?%J2SPJ6t=jNX+w}bb1v-$QAj?7m7E$j+ADQ+f&H%;$@p#6$1kUgQu&X J%Q~loCICNuI-~#q literal 0 HcmV?d00001 diff --git a/examples/shaders/resources/game_of_life/spaceships.png b/examples/shaders/resources/game_of_life/spaceships.png new file mode 100644 index 0000000000000000000000000000000000000000..867f6fea32e5dbc5a62f3b52c78a2b762dae507c GIT binary patch literal 828 zcmeAS@N?(olHy`uVBq!ia0y~yU=UznV0gm8#=yWZ@xzil1_lPk;vjb?#+xT~>KPaq zSkfJR9T^xl_H+M9WMyDrP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs( z@q#(K0&N%=7&r?&B8wRq^pruEv0|xx83O|Ydx@v7EBi|x7G4fX;dE_v1_q`{o-U3d z8TZ~spYA)Xz~dvZ{onuPMd#wYjw;>mIlkp)yY|{EYiAw2@mT#!&e~Y_2ca|C<@()u z7Hs{-qmqX(~MdNCe3*g3Z9QvO;nj1@+C3TdaY?pXQFJ5;w25w`uK@^&oAo#r6DKm zb*G_IB{Io7&SLRjCLfiv_AxGtDhu+nqFt8?MauSdhDB&kOmGs;TvGbc&f|M;bcaf0 zi{AIURu`JQQbjxjHLv{2dYI$wa!N{*u}+gA_F1OrX>e$2JbyX+zB0W}vmkJIQmRtT&U& zfki=E-5R_bZZfaE@!;Dr$vp}`17@xKdj8H;E0xAA;nzjnySnqO&DLELo4^q}Glzv) zA;)B@hU(?>6^oBDUl$WNy<@wdyRAGs`X3cha-lJB@=*MY@XDR=k&Dj-0aW*{Ov$t1|k& zxHn~`J!kP~n9tzAI^}AQ<(}3Ly(_xvX8!uhP&D)S)>d8j=Ot;ER2Hg9MDxAZl)bPr z_u9VSVG^cHkvHvC4u+|=)i(u3inVQX_}%pT()XIBmt=)iKcAhr)5!3^({rD@F4z>V kHqTnLTRZfu_I`%%m9h!H`|l((FfcH9y85}Sb4q9e09tZm2><{9 literal 0 HcmV?d00001 diff --git a/examples/shaders/resources/game_of_life/still_lifes.png b/examples/shaders/resources/game_of_life/still_lifes.png new file mode 100644 index 0000000000000000000000000000000000000000..ac184ac49bf3bc21bd93715e11a3e93bb31a7abc GIT binary patch literal 615 zcmeAS@N?(olHy`uVBq!ia0y~yU@&H2V9?@VV_;yAt4OY7U|?V@4sv&5ym?Zmo`HdZ zCEd~2k%3`jKlh(RRt5$Jg=CK)Uj~LMH3o);76yi23=9knFBlj~4Hy_+B``2p&0t^< zFPO6{(1wA5fwRCPvY3HEPZ@+6E0)@qF)%Q&mw5WRvcKeE;V~9eIHM-Tz`(fI)5S3) zcJ=ZS6SP5T#mAZJ&ko+Prhz5?p+wZQD-X8a>-k# ztMjVDOuE9ST`W&{J*|4`set`Tji_@o)Z~1n$l1?5Wl`LIPnMmKPW`e}c;z3B z1QUn)uC!%)PvmXY^- 1)) || (mouseWheelMove != 0.0f)) + { + FreeImageToDraw(&imageToDraw); // Zoom change: free the image to draw to be recreated again + + const float centerX = offsetX + (windowWidth/2.0f)/zoom; + const float centerY = offsetY + (windowHeight/2.0f)/zoom; + if (buttonZoomIn || (mouseWheelMove > 0.0f)) + zoom *= 2; + if ((buttonZomOut || (mouseWheelMove < 0.0f)) && (zoom > 1)) + zoom /= 2; + offsetX = centerX - (windowWidth/2.0f)/zoom; + offsetY = centerY - (windowHeight/2.0f)/zoom; + } + + // Change speed: number of frames per step + if (buttonFaster && framesPerStep > 1) framesPerStep--; + if (buttonSlower) framesPerStep++; + + // Mouse management + //---------------------------------------------------------------------------------- + if ((mode == MODE_RUN) || (mode == MODE_PAUSE)) + { + FreeImageToDraw(&imageToDraw); // Free the image to draw: no longer needed in these modes + + // Pan with mouse left button + static Vector2 previousMousePosition = { 0.0f, 0.0f }; + const Vector2 mousePosition = GetMousePosition(); + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT) && (mousePosition.x < windowWidth)) + { + offsetX -= (mousePosition.x - previousMousePosition.x)/zoom; + offsetY -= (mousePosition.y - previousMousePosition.y)/zoom; + } + previousMousePosition = mousePosition; + } + else // MODE_DRAW + { + const float offsetDecimalX = offsetX - floorf(offsetX); + const float offsetDecimalY = offsetY - floorf(offsetY); + int sizeInWorldX = (int)(ceilf((float)(windowWidth + offsetDecimalX*zoom)/zoom)); + int sizeInWorldY = (int)(ceilf((float)(windowHeight + offsetDecimalY*zoom)/zoom)); + if (offsetX + sizeInWorldX >= worldWidth) + sizeInWorldX = worldWidth - (int)floorf(offsetX); + if (offsetY + sizeInWorldY >= worldHeight) + sizeInWorldY = worldHeight - (int)floorf(offsetY); + + // Create image to draw if not created yet + if (imageToDraw == NULL) + { + RenderTexture2D worldOnScreen = LoadRenderTexture(sizeInWorldX, sizeInWorldY); + BeginTextureMode(worldOnScreen); + DrawTexturePro(currentWorld->texture, (Rectangle) { floorf(offsetX), floorf(offsetY), (float)(sizeInWorldX), -(float)(sizeInWorldY) }, + (Rectangle) { 0, 0, (float)(sizeInWorldX), (float)(sizeInWorldY) }, (Vector2) { 0, 0 }, 0.0f, WHITE); + EndTextureMode(); + imageToDraw = (Image*)RL_MALLOC(sizeof(Image)); + *imageToDraw = LoadImageFromTexture(worldOnScreen.texture); + UnloadRenderTexture(worldOnScreen); + } + + const Vector2 mousePosition = GetMousePosition(); + static int firstColor = -1; + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT) && (mousePosition.x < windowWidth)) + { + int mouseX = (int)(mousePosition.x + offsetDecimalX*zoom)/zoom; + int mouseY = (int)(mousePosition.y + offsetDecimalY*zoom)/zoom; + if (mouseX >= sizeInWorldX) + mouseX = sizeInWorldX - 1; + if (mouseY >= sizeInWorldY) + mouseY = sizeInWorldY - 1; + if (firstColor == -1) + firstColor = (GetImageColor(*imageToDraw, mouseX, mouseY).r < 5)? 0 : 1; + const int prevColor = (GetImageColor(*imageToDraw, mouseX, mouseY).r < 5)? 0 : 1; + ImageDrawPixel(imageToDraw, mouseX, mouseY, (firstColor) ? BLACK : RAYWHITE); + if (prevColor != firstColor) + UpdateTextureRec(currentWorld->texture, (Rectangle){ floorf(offsetX), floorf(offsetY), (float)(sizeInWorldX), (float)(sizeInWorldY) }, imageToDraw->data); + } + else + firstColor = -1; + } + + // Load selected preset + //---------------------------------------------------------------------------------- + if (preset >= 0) + { + Image pattern; + if (preset < numberOfPresets - 1) // Preset with pattern image lo load + { + pattern = LoadImage(TextFormat("resources/game_of_life/%s.png", presetPatterns[preset].fileName)); + BeginTextureMode(*currentWorld); + ClearBackground(RAYWHITE); + EndTextureMode(); + UpdateTextureRec(currentWorld->texture, (Rectangle){ worldWidth*presetPatterns[preset].position.x - pattern.width/2.0f, + worldHeight*presetPatterns[preset].position.y - pattern.height/2.0f, + (float)(pattern.width), (float)(pattern.height) }, pattern.data); + } + else // Last preset: Random values + { + pattern = GenImageColor(worldWidth/randomTiles, worldHeight/randomTiles, RAYWHITE); + for (int i = 0; i < randomTiles; i++) + { + for (int j = 0; j < randomTiles; j++) + { + ImageClearBackground(&pattern, RAYWHITE); + for (int x = 0; x < pattern.width; x++) + for (int y = 0; y < pattern.height; y++) + if (GetRandomValue(0, 100) < 15) + ImageDrawPixel(&pattern, x, y, BLACK); + UpdateTextureRec(currentWorld->texture, + (Rectangle){ (float)(pattern.width*i), (float)(pattern.height*j), + (float)(pattern.width), (float)(pattern.height) }, pattern.data); + } + } + } + + UnloadImage(pattern); + mode = MODE_PAUSE; + offsetX = worldWidth * presetPatterns[preset].position.x - windowWidth/zoom/2.0f; + offsetY = worldHeight * presetPatterns[preset].position.y - windowHeight/zoom/2.0f; + } + + // Check window draw inside world limits + if (offsetX < 0) offsetX = 0; + if (offsetY < 0) offsetY = 0; + if (offsetX > worldWidth - (float)(windowWidth)/zoom) + offsetX = worldWidth - (float)(windowWidth)/zoom; + if (offsetY > worldHeight - (float)(windowHeight)/zoom) + offsetY = worldHeight - (float)(windowHeight)/zoom; + + // Rectangles for drawing texture portion to screen + //---------------------------------------------------------------------------------- + const Rectangle textureSourceToScreen = { offsetX, offsetY, (float)windowWidth/zoom, (float)windowHeight/zoom }; + + // Draw to texture + //---------------------------------------------------------------------------------- + if ((mode == MODE_RUN) && ((frame % framesPerStep) == 0)) + { + // Swap worlds + RenderTexture2D *tempWorld = currentWorld; + currentWorld = previousWorld; + previousWorld = tempWorld; + + // Draw to texture + BeginTextureMode(*currentWorld); + BeginShaderMode(shdrGameOfLife); + DrawTexturePro(previousWorld->texture, worldRectSource, worldRectDest, (Vector2){ 0, 0 }, 0.0f, RAYWHITE); + EndShaderMode(); + EndTextureMode(); + } + + // Draw to screen + //---------------------------------------------------------------------------------- + BeginDrawing(); + DrawTexturePro(currentWorld->texture, textureSourceToScreen, textureOnScreen, (Vector2){ 0, 0 }, 0.0f, WHITE); + + DrawLine(windowWidth, 0, windowWidth, screenHeight, (Color){ 218, 218, 218, 255 }); + DrawRectangle(windowWidth, 0, screenWidth - windowWidth, screenHeight, (Color){ 232, 232, 232, 255 }); + + DrawText("Conway's", 704, 4, 20, DARKBLUE); + DrawText(" game of", 704, 19, 20, DARKBLUE); + DrawText(" life", 708, 34, 20, DARKBLUE); + DrawText("in raylib", 757, 42, 6, BLACK); + + DrawText("Presets", 710, 58, 8, GRAY); + preset = -1; + for (int i = 0; i < numberOfPresets; i++) + if (GuiButton((Rectangle){ 710.0f, 70.0f + 18*i, 80.0f, 16.0f }, presetPatterns[i].name)) + preset = i; + + GuiToggleGroup((Rectangle){ 710, 258, 80, 16 }, "Run\nPause\nDraw", &mode); + + DrawText(TextFormat("Zoom: %ix", zoom), 710, 316, 8, GRAY); + buttonZoomIn = GuiButton((Rectangle){ 710, 328, 80, 16 }, "Zoom in"); + buttonZomOut = GuiButton((Rectangle){ 710, 346, 80, 16 }, "Zoom out"); + + DrawText(TextFormat("Speed: %i frame%s", framesPerStep, (framesPerStep > 1)? "s" : ""), 710, 370, 8, GRAY); + buttonFaster = GuiButton((Rectangle){ 710, 382, 80, 16 }, "Faster"); + buttonSlower = GuiButton((Rectangle){ 710, 400, 80, 16 }, "Slower"); + + //------------------------------------------------------------------------------ + + DrawFPS(712, 426); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadShader(shdrGameOfLife); + UnloadRenderTexture(world1); + UnloadRenderTexture(world2); + + FreeImageToDraw(&imageToDraw); + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} + +//---------------------------------------------------------------------------------- +// Functions definition +//---------------------------------------------------------------------------------- +void FreeImageToDraw(Image **imageToDraw) +{ + if (*imageToDraw != NULL) + { + UnloadImage(**imageToDraw); + RL_FREE(*imageToDraw); + *imageToDraw = NULL; + } +} diff --git a/examples/shaders/shaders_game_of_life.png b/examples/shaders/shaders_game_of_life.png new file mode 100644 index 0000000000000000000000000000000000000000..8ebc2c12e6920fdab2ba0a85139fb4531b4180c6 GIT binary patch literal 13793 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 literal 0 HcmV?d00001 diff --git a/projects/VS2022/examples/shaders_game_of_life.vcxproj b/projects/VS2022/examples/shaders_game_of_life.vcxproj new file mode 100644 index 000000000..0ede87cda --- /dev/null +++ b/projects/VS2022/examples/shaders_game_of_life.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 + + + + {071E64F3-1396-4A97-97CA-98CAC059B168} + Win32Proj + shaders_game_of_life + 10.0 + shaders_game_of_life + + + + 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\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\shaders + 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 + _CRT_SECURE_NO_WARNINGS;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 + _CRT_SECURE_NO_WARNINGS;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 + _CRT_SECURE_NO_WARNINGS;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 + _CRT_SECURE_NO_WARNINGS;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