From 00b7db0b39a8d4cc6ef5e8a30cbd373cd3b76730 Mon Sep 17 00:00:00 2001 From: Sara Date: Mon, 15 Sep 2025 19:35:36 +0200 Subject: [PATCH 01/87] feat: setup git and build system --- .gitignore | 3 +++ justfile | 10 ++++++++++ premake5.lua | 21 +++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 .gitignore create mode 100644 justfile create mode 100644 premake5.lua diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d294ec1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +bin/ +build/ +Makefile diff --git a/justfile b/justfile new file mode 100644 index 0000000..f412b58 --- /dev/null +++ b/justfile @@ -0,0 +1,10 @@ +build: + # BUILDING + make + +run: + bin/DiceGui + +configure: + # CONFIGURING WITH PREMAKE + premake5 gmake diff --git a/premake5.lua b/premake5.lua new file mode 100644 index 0000000..0aee051 --- /dev/null +++ b/premake5.lua @@ -0,0 +1,21 @@ +workspace "DiceGui" + configurations { "debug", "release" } + location "." + +project "Dice" + kind "ConsoleApp" + language "C" + cdialect "c23" + location "build/" + files { "src/**.c" } + links { "m", "stdc++" } + buildoptions { "-Wall" } + targetdir "bin/" + filter "configurations:debug" + defines { "DEBUG" } + symbols "On" + optimize "Off" + filter "configurations:release" + defines { "NDEBUG" } + optimize "On" + symbols "Off" From e92f6188b62ee7d4e59c37347b00cd1661e501de Mon Sep 17 00:00:00 2001 From: Sara Date: Mon, 15 Sep 2025 19:37:45 +0200 Subject: [PATCH 02/87] feat: added clay submodule --- .gitmodules | 3 +++ vendor/clay | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 vendor/clay diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..86db4e8 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "vendor/clay"] + path = vendor/clay + url = https://github.com/nicbarker/clay.git diff --git a/vendor/clay b/vendor/clay new file mode 160000 index 0000000..0d6969c --- /dev/null +++ b/vendor/clay @@ -0,0 +1 @@ +Subproject commit 0d6969c8c31375dab40c9cd0b0ad525eb50f3a29 From 2078a074d8ba31f9c504d70fc7ca7c2e0efc9ddf Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 13:34:16 +0200 Subject: [PATCH 03/87] feat: added Adwaita Sans Regular font --- assets/AdwaitaSans-Regular.ttf | Bin 0 -> 879796 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/AdwaitaSans-Regular.ttf diff --git a/assets/AdwaitaSans-Regular.ttf b/assets/AdwaitaSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6fcafd9b0bc750952b619bf27fbddc769867bb72 GIT binary patch literal 879796 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%0AY|GP=4@dU|B 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%0AbMD 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

A#u;n4Du^W(D~YbU!pR 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�gJOV}fBB!*Yhn3|$P(47H$U7gG&GJ?KObDZfTW_aYaDUNG!o=w{;Q zWoj0jy&HVc|Es;L_g}j9?%`&Jca6-y1oXKZIn^wrIoP=Q*cg5^3;q=Zjjc*Z2yu!^ zDe?UN$e;>3u|tTfkyBNgot>S7^W*1#1jgz?m&G%QGAsc#3!XF7gD5kGcOXiYK^1T7 z;1Bq!cqV&@-o+5T%n-fI1oW~)^uB@U{SDFk6QY*`MK5R+mz@FmrrS>-y-g6EW)Phx zAUfY-)rsi&Tte5`1kuNfq7Qw2Rs$0oNM8e!F~m+*h@CeedKn4m{SVQr2GRQzqW2C& zuLJ?TSnY-Sm6L#8K8U@3DE4lJ*eggt?`w!&P_k}qU|J7x^I?cyX99XJL-c-y*!vcu z_di6hHUYh_AbK4kdLKaaLc^JbfZp>Ey<8BzcOZH{LhMz*(2H^!1d}pEuN_#g187q# zI3KKq=zfEt8#O(0Lv%ZUbu-iw;3G%*EBZBt(W}z;mG8_SZkNZHD}%1$ zZQ;Il{N5iqRcV%6KOAD+7@8QiFkE4{$FPQB9zz#nX^Im=8^Z>MiM(D$V(+e9HZ(Q0 zbZ`!da$wlr;J`4av4QFP*~QNP>;9MgFZ!R$`5tt5>$jWxZIhfCni$#`nix9S1=;@m z`NN^+2)eH~k9jiqzTTq$=`9-9zcPIK%gxOF{_&0HfByXB;1cIyVE-?zVWuo7AjHD* zer(hJMh2(5?K8jJNh3x%-QWkzLV9h5603d6;V7oDA*IiBo+jhL7&T)1%g^0_NF?b);E;MoVicz77@>{`5d@$Ah{p3Ix4 zug`6ro}RA5udDmrtgf!k@YBhk1_lNU{~H^aUj1fn=KJ;K&z~hbksduF@* zul!&9zwUqO|H4Lw2GCiLCEUv|F&P^huU@_St&FcTsP+b7(69;UTGUUUKE4F)7v*!Q z0-Z3sfMEthr*eSs%a<=Dy?k80eS81@-TP0UKD~eU{{7qcpFe+o|K>C35OC08w+#PV z`TzfyH_{Xa-4Ocm!PCFu!i|hfKO04U{rdIiALulvKY#xGX9Qhy#m>sqVk##mCoeB2 zCN3^6F0H6xV5}`GEG#A_rf06GsH`j_BP}g2FE1l4BO@gPK3_yZNkv5kbUrx4|5oAu z|NnCcNr>^ifBE9gm#>UWUthfa*eLSs-FGY&K~{~x&K&}s`)kd>#9+q2$RMewA|(Y{ zYapjC!OQ#dojB;oSWZq}UIw8?aSo0j-!5Oi{pQ!NU*A4`|I5K}`7*=7Lx&DFOa2uX z6&3C8??3zG?CK>w^KNl)G&TMI-_gO)-N*)NIVmc3Is7lrOgiiOW3=1?b>zZ$Pv&~7k~GX#k;q5gANdT z`*#0+h82w>zXVjd-@jKglwxP);$>s}!SMb)10(3l3Bg-W9zA;W?c28(_n&fbe|>%S z&6`Hn|NkF9W_Z#l^6wu9*YoGPGJJe|`~n}p{9}0joZ)LD!&gXq6LiwKF9Qoh1_LvL zF9Q>U4+A5E>VpRl?p(WY`pAI;2acXO_wmP_Q`fFtIC1>+>C;D#UA%hn)TvV!uP`iV zY*2b~>+FdWC(hh>^!^_U3(J%1pFcDF`SbeT!

(Uc7ki?!zY^|1_&=XlO|MeQ{;` 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

u<+ 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 z%0A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 Mvc3XU;40Ipt7djJ3c literal 0 HcmV?d00001 From 1961e9c0b95c4ca167398df1b29e42af146cdf54 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 13:34:41 +0200 Subject: [PATCH 04/87] feat: updated clay and redirected origin to mirror on objectionable.solutions --- .gitmodules | 2 +- vendor/clay | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 86db4e8..50fb0d4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "vendor/clay"] path = vendor/clay - url = https://github.com/nicbarker/clay.git + url = https://git.objectionable.solutions/Sara/clay.git diff --git a/vendor/clay b/vendor/clay index 0d6969c..3767508 160000 --- a/vendor/clay +++ b/vendor/clay @@ -1 +1 @@ -Subproject commit 0d6969c8c31375dab40c9cd0b0ad525eb50f3a29 +Subproject commit 37675089e33632173606bfccab554ad6e6970d4c From 6e178d23ef0cbd8e4cbfbdb2f7d75a2f762ae49d Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 13:34:56 +0200 Subject: [PATCH 05/87] feat: added `just clean` command --- justfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/justfile b/justfile index f412b58..19f869e 100644 --- a/justfile +++ b/justfile @@ -8,3 +8,7 @@ run: configure: # CONFIGURING WITH PREMAKE premake5 gmake + +clean: + rm -r bin/** + rm -r build/** From 9ffee27be66c2bbfbb71ac83aa33126385fb402b Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 13:35:09 +0200 Subject: [PATCH 06/87] feat: added dependencies to premake5 --- premake5.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/premake5.lua b/premake5.lua index 0aee051..6120e30 100644 --- a/premake5.lua +++ b/premake5.lua @@ -8,9 +8,11 @@ project "Dice" cdialect "c23" location "build/" files { "src/**.c" } - links { "m", "stdc++" } + includedirs { "vendor/" } + links { "m", "stdc++", "SDL3", "SDL3_ttf", "SDL3_image" } buildoptions { "-Wall" } targetdir "bin/" + postbuildcommands { "{COPYDIR} %{wks.location}/assets/ %{cfg.targetdir}/assets/" } filter "configurations:debug" defines { "DEBUG" } symbols "On" From 7ff11ded25151cda5750c837b0435f188a8e974e Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 13:35:21 +0200 Subject: [PATCH 07/87] feat: added .clangd --- .clangd | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .clangd diff --git a/.clangd b/.clangd new file mode 100644 index 0000000..9734fce --- /dev/null +++ b/.clangd @@ -0,0 +1,2 @@ +CompileFlags: + Add: [ -Wall, --std=c23, -xc, -Ivendor/ ] From 41a53ee52b7f90f034fea1419f0bacaf2900693f Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 13:35:38 +0200 Subject: [PATCH 08/87] git: added clangd cache files to gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index d294ec1..85942ff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ bin/ build/ Makefile +.cache/ +compile_commands.json From 317ebb755bd97d7c168e573c7fab0a23a2957961 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 13:35:50 +0200 Subject: [PATCH 09/87] feat: started defining UI logic --- src/application.c | 74 ++++++++++++++++++++++++ src/application.h | 10 ++++ src/defs.h | 19 ++++++ src/main.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++ src/style.c | 1 + src/style.h | 31 ++++++++++ 6 files changed, 279 insertions(+) create mode 100644 src/application.c create mode 100644 src/application.h create mode 100644 src/defs.h create mode 100644 src/main.c create mode 100644 src/style.c create mode 100644 src/style.h diff --git a/src/application.c b/src/application.c new file mode 100644 index 0000000..9865492 --- /dev/null +++ b/src/application.c @@ -0,0 +1,74 @@ +#include "application.h" + +#include "defs.h" +#include "style.h" +#include + +static inline +void DiceContainer() { + CLAY({ .id = CLAY_ID("DiceContainer"), + .layout = { + .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_PERCENT(0.2) }, + .padding = CLAY_PADDING_ALL(16), + }, + .backgroundColor = containerColors[0], + .cornerRadius = CLAY_CORNER_RADIUS(cornerRadius) + }) { + CLAY_TEXT(CLAY_STRING("Text data"), CLAY_TEXT_CONFIG({ + .textColor = textColors[0], + .fontId = FONT_DEFAULT, + .fontSize = 24, + })); + } +} + +static inline +void DiceLogContainer() { + CLAY({ .id = CLAY_ID("LogContainer"), + .layout = { + .sizing = layoutExpand, + .padding = CLAY_PADDING_ALL(16), + }, + .backgroundColor = containerColors[0], + .cornerRadius = cornerRadiusAll + }) {} +} + +static inline +void InitiativeListContainer() { + CLAY({ .id = CLAY_ID("InitiativeListContainer"), + .layout = { + .sizing = layoutExpand, + .padding = CLAY_PADDING_ALL(16), + }, + .backgroundColor = containerColors[0], + .cornerRadius = cornerRadiusAll, + }) {} +} + +Clay_RenderCommandArray RenderApplication() { + Clay_BeginLayout(); + CLAY({ .id = CLAY_ID("OuterContainer"), + .layout = { + .layoutDirection = CLAY_TOP_TO_BOTTOM, + .sizing = layoutExpand, + .padding = CLAY_PADDING_ALL(windowPadding), + .childGap = containerGap + } + }) { + DiceContainer(); + CLAY({ .id = CLAY_ID("LowerSplitContainer"), + .layout = { + .sizing = layoutExpand, + .childGap = containerGap + }, + }) { + DiceLogContainer(); + InitiativeListContainer(); + } + } + return Clay_EndLayout(); +} + +void HandleEvent(SDL_Event event) { +} diff --git a/src/application.h b/src/application.h new file mode 100644 index 0000000..0dce16d --- /dev/null +++ b/src/application.h @@ -0,0 +1,10 @@ +#ifndef APPLICATION_H +#define APPLICATION_H + +#include +#include + +extern Clay_RenderCommandArray RenderApplication(); +extern void HandleEvent(SDL_Event evt); + +#endif // !APPLICATION_H diff --git a/src/defs.h b/src/defs.h new file mode 100644 index 0000000..d5e3dc1 --- /dev/null +++ b/src/defs.h @@ -0,0 +1,19 @@ +#ifndef DEFS_H +#define DEFS_H + +#include + +#include +#include + +enum Font { + FONT_DEFAULT = 0, + FONT_MAX +}; + +extern SDL_Window *window; +extern SDL_Renderer *renderer; +extern TTF_Font *fonts[FONT_MAX]; +extern TTF_TextEngine *textEngine; + +#endif // !DEFS_H diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..5e88483 --- /dev/null +++ b/src/main.c @@ -0,0 +1,144 @@ +#include +#define CLAY_IMPLEMENTATION +#include +#include + +#include "application.h" +#include "defs.h" + +#define SDL_MAIN_HANDLED +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +SDL_Window *window = nullptr; +SDL_Renderer *renderer = nullptr; +int screenWidth = 1920, screenHeight = 1080; +bool running = true; +uint64_t clayMemorySize = 0; + +Clay_Arena clayPrimaryArena; +TTF_Font *fonts[FONT_MAX]; +TTF_TextEngine *textEngine = nullptr; + +Clay_SDL3RendererData backendData = { + .renderer = nullptr, + .fonts = nullptr, + .textEngine = nullptr +}; + +static inline +Clay_Dimensions MeasureText(Clay_StringSlice text, Clay_TextElementConfig *config, void *userData) { + TTF_Font **fonts = userData; + TTF_Font *font = fonts[config->fontId]; + int width, height; + TTF_SetFontSize(font, config->fontSize); + if (!TTF_GetStringSize(font, text.chars, text.length, &width, &height)) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "MeasureText failed to measure text %s", SDL_GetError()); + } + return (Clay_Dimensions) { + .width = text.length * config->fontSize, + .height = config->fontSize + }; +} + +static +void HandleClayErrors(Clay_ErrorData data) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "%s", data.errorText.chars); +} + +static inline +void InitSDL() { + if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS)) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "SDL_Init failed: %s", SDL_GetError()); + exit(1); + } + if ((window = SDL_CreateWindow("Window", screenWidth, screenHeight, SDL_WINDOW_RESIZABLE)) == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "SDL_CreateWindow failed: %s", SDL_GetError()); + exit(2); + } + if((renderer = SDL_CreateRenderer(window, NULL)) == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "SDL_CreateRenderer failed: %s", SDL_GetError()); + exit(3); + } + if (!TTF_Init()) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_Init failed: %s", SDL_GetError()); + exit(4); + } + if((textEngine = TTF_CreateRendererTextEngine(renderer)) == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_CreateRendererTextEngine failed: %s", SDL_GetError()); + exit(5); + } + fonts[FONT_DEFAULT] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", 24.f); + if (fonts[FONT_DEFAULT] == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load adwaita sans: %s", SDL_GetError()); + } +} + +static +void InitClay() { + clayMemorySize = Clay_MinMemorySize(); + clayPrimaryArena = Clay_CreateArenaWithCapacityAndMemory(clayMemorySize, SDL_malloc(clayMemorySize)); + Clay_Initialize(clayPrimaryArena, (Clay_Dimensions) { screenWidth, screenHeight }, (Clay_ErrorHandler) { HandleClayErrors }); + Clay_SetMeasureTextFunction(MeasureText, fonts); + Clay_SetLayoutDimensions((Clay_Dimensions) { screenWidth, screenHeight }); +} + +extern Clay_RenderCommandArray RenderApplication(); +extern void HandleEvent(SDL_Event event); + +int main(int argc, char *argv[]) { + InitSDL(); + InitClay(); + backendData = (Clay_SDL3RendererData) { + .renderer = renderer, + .fonts = fonts, + .textEngine = textEngine, + }; + SDL_Event event; + while (running) { + while (SDL_PollEvent(&event)) { + HandleEvent(event); + switch (event.type) { + case SDL_EVENT_QUIT: + running = false; + break; + case SDL_EVENT_WINDOW_RESIZED: + Clay_SetLayoutDimensions((Clay_Dimensions){ + event.window.data1, + event.window.data2 + }); + break; + case SDL_EVENT_MOUSE_WHEEL: + Clay_UpdateScrollContainers(true, (Clay_Vector2){ event.wheel.x, event.wheel.y }, 0.01f); + break; + case SDL_EVENT_MOUSE_MOTION: + Clay_SetPointerState((Clay_Vector2) { event.motion.x, event.motion.y }, event.motion.state & SDL_BUTTON_LEFT); + break; + case SDL_EVENT_MOUSE_BUTTON_DOWN: + Clay_SetPointerState((Clay_Vector2) { event.button.x, event.button.y }, event.button.button == SDL_BUTTON_LEFT); + default: + break; + } + } + SDL_SetRenderDrawColor(renderer, 10, 10, 10, 255); + SDL_RenderClear(renderer); + Clay_RenderCommandArray array = RenderApplication(); + SDL_Clay_RenderClayCommands(&backendData, &array); + SDL_RenderPresent(renderer); + } + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return 0; +} diff --git a/src/style.c b/src/style.c new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/style.c @@ -0,0 +1 @@ + diff --git a/src/style.h b/src/style.h new file mode 100644 index 0000000..28e094d --- /dev/null +++ b/src/style.h @@ -0,0 +1,31 @@ +#ifndef STYLE_H +#define STYLE_H + +#include + +constexpr float cornerRadius = 3.f; +constexpr Clay_CornerRadius cornerRadiusAll = CLAY_CORNER_RADIUS(cornerRadius); +constexpr float containerGap = 3.f; +constexpr float windowPadding = 0.f; + +constexpr Clay_Color windowBackground = { + 210, 210, 210, 255 +}; +constexpr Clay_Color containerColors[] = { + { 200, 200, 200, 255 }, + { 170, 170, 170, 255 }, + { 140, 140, 140, 255 }, +}; + +constexpr Clay_Color textColors[] = { + { 0, 0, 0, 255 }, + { 15, 15, 15, 255 }, + { 30, 30, 30, 255 }, +}; + +constexpr Clay_Sizing layoutExpand = { + .width = CLAY_SIZING_GROW(0), + .height = CLAY_SIZING_GROW(0) +}; + +#endif // !STYLE_H From 8cdcb40f262199adceec0a45f545b3d5b928a7e2 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 19:30:38 +0200 Subject: [PATCH 10/87] feat: forked clay SDL3 renderer and added separate corner radii --- include/clay/clay.h | 4446 +++++++++++++++++++++++++++++ src/main.c | 5 +- src/renderer/clay_renderer_SDL3.c | 261 ++ src/renderer/clay_renderer_SDL3.h | 16 + vendor/clay | 1 - 5 files changed, 4725 insertions(+), 4 deletions(-) create mode 100644 include/clay/clay.h create mode 100644 src/renderer/clay_renderer_SDL3.c create mode 100644 src/renderer/clay_renderer_SDL3.h delete mode 160000 vendor/clay diff --git a/include/clay/clay.h b/include/clay/clay.h new file mode 100644 index 0000000..7adf9ea --- /dev/null +++ b/include/clay/clay.h @@ -0,0 +1,4446 @@ +// VERSION: 0.14 + +/* + NOTE: In order to use this library you must define + the following macro in exactly one file, _before_ including clay.h: + + #define CLAY_IMPLEMENTATION + #include "clay.h" + + See the examples folder for details. +*/ + +#include +#include +#include + +// SIMD includes on supported platforms +#if !defined(CLAY_DISABLE_SIMD) && (defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64)) +#include +#elif !defined(CLAY_DISABLE_SIMD) && defined(__aarch64__) +#include +#endif + +// ----------------------------------------- +// HEADER DECLARATIONS --------------------- +// ----------------------------------------- + +#ifndef CLAY_HEADER +#define CLAY_HEADER + +#if !( \ + (defined(__cplusplus) && __cplusplus >= 202002L) || \ + (defined(__STDC__) && __STDC__ == 1 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ + defined(_MSC_VER) || \ + defined(__OBJC__) \ +) +#error "Clay requires C99, C++20, or MSVC" +#endif + +#ifdef CLAY_WASM +#define CLAY_WASM_EXPORT(name) __attribute__((export_name(name))) +#else +#define CLAY_WASM_EXPORT(null) +#endif + +#ifdef CLAY_DLL +#define CLAY_DLL_EXPORT __declspec(dllexport) __stdcall +#else +#define CLAY_DLL_EXPORT +#endif + +// Public Macro API ------------------------ + +#define CLAY__MAX(x, y) (((x) > (y)) ? (x) : (y)) +#define CLAY__MIN(x, y) (((x) < (y)) ? (x) : (y)) + +#define CLAY_TEXT_CONFIG(...) Clay__StoreTextElementConfig(CLAY__CONFIG_WRAPPER(Clay_TextElementConfig, __VA_ARGS__)) + +#define CLAY_BORDER_OUTSIDE(widthValue) {widthValue, widthValue, widthValue, widthValue, 0} + +#define CLAY_BORDER_ALL(widthValue) {widthValue, widthValue, widthValue, widthValue, widthValue} + +#define CLAY_CORNER_RADIUS(radius) (CLAY__INIT(Clay_CornerRadius) { radius, radius, radius, radius }) + +#define CLAY_PADDING_ALL(padding) CLAY__CONFIG_WRAPPER(Clay_Padding, { padding, padding, padding, padding }) + +#define CLAY_SIZING_FIT(...) (CLAY__INIT(Clay_SizingAxis) { .size = { .minMax = { __VA_ARGS__ } }, .type = CLAY__SIZING_TYPE_FIT }) + +#define CLAY_SIZING_GROW(...) (CLAY__INIT(Clay_SizingAxis) { .size = { .minMax = { __VA_ARGS__ } }, .type = CLAY__SIZING_TYPE_GROW }) + +#define CLAY_SIZING_FIXED(fixedSize) (CLAY__INIT(Clay_SizingAxis) { .size = { .minMax = { fixedSize, fixedSize } }, .type = CLAY__SIZING_TYPE_FIXED }) + +#define CLAY_SIZING_PERCENT(percentOfParent) (CLAY__INIT(Clay_SizingAxis) { .size = { .percent = (percentOfParent) }, .type = CLAY__SIZING_TYPE_PERCENT }) + +// Note: If a compile error led you here, you might be trying to use CLAY_ID with something other than a string literal. To construct an ID with a dynamic string, use CLAY_SID instead. +#define CLAY_ID(label) CLAY_SID(CLAY_STRING(label)) + +#define CLAY_SID(label) Clay__HashString(label, 0) + +// Note: If a compile error led you here, you might be trying to use CLAY_IDI with something other than a string literal. To construct an ID with a dynamic string, use CLAY_SIDI instead. +#define CLAY_IDI(label, index) CLAY_SIDI(CLAY_STRING(label), index) + +#define CLAY_SIDI(label, index) Clay__HashStringWithOffset(label, index, 0) + +// Note: If a compile error led you here, you might be trying to use CLAY_ID_LOCAL with something other than a string literal. To construct an ID with a dynamic string, use CLAY_SID_LOCAL instead. +#define CLAY_ID_LOCAL(label) CLAY_SID_LOCAL(CLAY_STRING(label)) + +#define CLAY_SID_LOCAL(label) Clay__HashString(label, Clay__GetParentElementId()) + +// Note: If a compile error led you here, you might be trying to use CLAY_IDI_LOCAL with something other than a string literal. To construct an ID with a dynamic string, use CLAY_SIDI_LOCAL instead. +#define CLAY_IDI_LOCAL(label, index) CLAY_SIDI_LOCAL(CLAY_STRING(label), index) + +#define CLAY_SIDI_LOCAL(label, index) Clay__HashStringWithOffset(label, index, Clay__GetParentElementId()) + +#define CLAY__STRING_LENGTH(s) ((sizeof(s) / sizeof((s)[0])) - sizeof((s)[0])) + +#define CLAY__ENSURE_STRING_LITERAL(x) ("" x "") + +// Note: If an error led you here, it's because CLAY_STRING can only be used with string literals, i.e. CLAY_STRING("SomeString") and not CLAY_STRING(yourString) +#define CLAY_STRING(string) (CLAY__INIT(Clay_String) { .isStaticallyAllocated = true, .length = CLAY__STRING_LENGTH(CLAY__ENSURE_STRING_LITERAL(string)), .chars = (string) }) + +#define CLAY_STRING_CONST(string) { .isStaticallyAllocated = true, .length = CLAY__STRING_LENGTH(CLAY__ENSURE_STRING_LITERAL(string)), .chars = (string) } + +static uint8_t CLAY__ELEMENT_DEFINITION_LATCH; + +// GCC marks the above CLAY__ELEMENT_DEFINITION_LATCH as an unused variable for files that include clay.h but don't declare any layout +// This is to suppress that warning +static inline void Clay__SuppressUnusedLatchDefinitionVariableWarning(void) { (void) CLAY__ELEMENT_DEFINITION_LATCH; } + +// Publicly visible layout element macros ----------------------------------------------------- + +/* This macro looks scary on the surface, but is actually quite simple. + It turns a macro call like this: + + CLAY({ + .id = CLAY_ID("Container"), + .backgroundColor = { 255, 200, 200, 255 } + }) { + ...children declared here + } + + Into calls like this: + + Clay__OpenElement(); + Clay__ConfigureOpenElement((Clay_ElementDeclaration) { + .id = CLAY_ID("Container"), + .backgroundColor = { 255, 200, 200, 255 } + }); + ...children declared here + Clay__CloseElement(); + + The for loop will only ever run a single iteration, putting Clay__CloseElement() in the increment of the loop + means that it will run after the body - where the children are declared. It just exists to make sure you don't forget + to call Clay_CloseElement(). +*/ +#define CLAY_AUTO_ID(...) \ + for ( \ + CLAY__ELEMENT_DEFINITION_LATCH = (Clay__OpenElement(), Clay__ConfigureOpenElement(CLAY__CONFIG_WRAPPER(Clay_ElementDeclaration, __VA_ARGS__)), 0); \ + CLAY__ELEMENT_DEFINITION_LATCH < 1; \ + CLAY__ELEMENT_DEFINITION_LATCH=1, Clay__CloseElement() \ + ) + +#define CLAY(id, ...) \ + for ( \ + CLAY__ELEMENT_DEFINITION_LATCH = (Clay__OpenElementWithId(id), Clay__ConfigureOpenElement(CLAY__CONFIG_WRAPPER(Clay_ElementDeclaration, __VA_ARGS__)), 0); \ + CLAY__ELEMENT_DEFINITION_LATCH < 1; \ + CLAY__ELEMENT_DEFINITION_LATCH=1, Clay__CloseElement() \ + ) + +// These macros exist to allow the CLAY() macro to be called both with an inline struct definition, such as +// CLAY({ .id = something... }); +// As well as by passing a predefined declaration struct +// Clay_ElementDeclaration declarationStruct = ... +// CLAY(declarationStruct); +#define CLAY__WRAPPER_TYPE(type) Clay__##type##Wrapper +#define CLAY__WRAPPER_STRUCT(type) typedef struct { type wrapped; } CLAY__WRAPPER_TYPE(type) +#define CLAY__CONFIG_WRAPPER(type, ...) (CLAY__INIT(CLAY__WRAPPER_TYPE(type)) { __VA_ARGS__ }).wrapped + +#define CLAY_TEXT(text, textConfig) Clay__OpenTextElement(text, textConfig) + +#ifdef __cplusplus + +#define CLAY__INIT(type) type + +#define CLAY_PACKED_ENUM enum : uint8_t + +#define CLAY__DEFAULT_STRUCT {} + +#else + +#define CLAY__INIT(type) (type) + +#if defined(_MSC_VER) && !defined(__clang__) +#define CLAY_PACKED_ENUM __pragma(pack(push, 1)) enum __pragma(pack(pop)) +#else +#define CLAY_PACKED_ENUM enum __attribute__((__packed__)) +#endif + +#if __STDC_VERSION__ >= 202311L +#define CLAY__DEFAULT_STRUCT {} +#else +#define CLAY__DEFAULT_STRUCT {0} +#endif + +#endif // __cplusplus + +#ifdef __cplusplus +extern "C" { +#endif + +// Utility Structs ------------------------- + +// Note: Clay_String is not guaranteed to be null terminated. It may be if created from a literal C string, +// but it is also used to represent slices. +typedef struct Clay_String { + // Set this boolean to true if the char* data underlying this string will live for the entire lifetime of the program. + // This will automatically be set for strings created with CLAY_STRING, as the macro requires a string literal. + bool isStaticallyAllocated; + int32_t length; + // The underlying character memory. Note: this will not be copied and will not extend the lifetime of the underlying memory. + const char *chars; +} Clay_String; + +// Clay_StringSlice is used to represent non owning string slices, and includes +// a baseChars field which points to the string this slice is derived from. +typedef struct Clay_StringSlice { + int32_t length; + const char *chars; + const char *baseChars; // The source string / char* that this slice was derived from +} Clay_StringSlice; + +typedef struct Clay_Context Clay_Context; + +// Clay_Arena is a memory arena structure that is used by clay to manage its internal allocations. +// Rather than creating it by hand, it's easier to use Clay_CreateArenaWithCapacityAndMemory() +typedef struct Clay_Arena { + uintptr_t nextAllocation; + size_t capacity; + char *memory; +} Clay_Arena; + +typedef struct Clay_Dimensions { + float width, height; +} Clay_Dimensions; + +typedef struct Clay_Vector2 { + float x, y; +} Clay_Vector2; + +// Internally clay conventionally represents colors as 0-255, but interpretation is up to the renderer. +typedef struct Clay_Color { + float r, g, b, a; +} Clay_Color; + +typedef struct Clay_BoundingBox { + float x, y, width, height; +} Clay_BoundingBox; + +// Primarily created via the CLAY_ID(), CLAY_IDI(), CLAY_ID_LOCAL() and CLAY_IDI_LOCAL() macros. +// Represents a hashed string ID used for identifying and finding specific clay UI elements, required +// by functions such as Clay_PointerOver() and Clay_GetElementData(). +typedef struct Clay_ElementId { + uint32_t id; // The resulting hash generated from the other fields. + uint32_t offset; // A numerical offset applied after computing the hash from stringId. + uint32_t baseId; // A base hash value to start from, for example the parent element ID is used when calculating CLAY_ID_LOCAL(). + Clay_String stringId; // The string id to hash. +} Clay_ElementId; + +// A sized array of Clay_ElementId. +typedef struct +{ + int32_t capacity; + int32_t length; + Clay_ElementId *internalArray; +} Clay_ElementIdArray; + +// Controls the "radius", or corner rounding of elements, including rectangles, borders and images. +// The rounding is determined by drawing a circle inset into the element corner by (radius, radius) pixels. +typedef struct Clay_CornerRadius { + float topLeft; + float topRight; + float bottomLeft; + float bottomRight; +} Clay_CornerRadius; + +// Element Configs --------------------------- + +// Controls the direction in which child elements will be automatically laid out. +typedef CLAY_PACKED_ENUM { + // (Default) Lays out child elements from left to right with increasing x. + CLAY_LEFT_TO_RIGHT, + // Lays out child elements from top to bottom with increasing y. + CLAY_TOP_TO_BOTTOM, +} Clay_LayoutDirection; + +// Controls the alignment along the x axis (horizontal) of child elements. +typedef CLAY_PACKED_ENUM { + // (Default) Aligns child elements to the left hand side of this element, offset by padding.width.left + CLAY_ALIGN_X_LEFT, + // Aligns child elements to the right hand side of this element, offset by padding.width.right + CLAY_ALIGN_X_RIGHT, + // Aligns child elements horizontally to the center of this element + CLAY_ALIGN_X_CENTER, +} Clay_LayoutAlignmentX; + +// Controls the alignment along the y axis (vertical) of child elements. +typedef CLAY_PACKED_ENUM { + // (Default) Aligns child elements to the top of this element, offset by padding.width.top + CLAY_ALIGN_Y_TOP, + // Aligns child elements to the bottom of this element, offset by padding.width.bottom + CLAY_ALIGN_Y_BOTTOM, + // Aligns child elements vertically to the center of this element + CLAY_ALIGN_Y_CENTER, +} Clay_LayoutAlignmentY; + +// Controls how the element takes up space inside its parent container. +typedef CLAY_PACKED_ENUM { + // (default) Wraps tightly to the size of the element's contents. + CLAY__SIZING_TYPE_FIT, + // Expands along this axis to fill available space in the parent element, sharing it with other GROW elements. + CLAY__SIZING_TYPE_GROW, + // Expects 0-1 range. Clamps the axis size to a percent of the parent container's axis size minus padding and child gaps. + CLAY__SIZING_TYPE_PERCENT, + // Clamps the axis size to an exact size in pixels. + CLAY__SIZING_TYPE_FIXED, +} Clay__SizingType; + +// Controls how child elements are aligned on each axis. +typedef struct Clay_ChildAlignment { + Clay_LayoutAlignmentX x; // Controls alignment of children along the x axis. + Clay_LayoutAlignmentY y; // Controls alignment of children along the y axis. +} Clay_ChildAlignment; + +// Controls the minimum and maximum size in pixels that this element is allowed to grow or shrink to, +// overriding sizing types such as FIT or GROW. +typedef struct Clay_SizingMinMax { + float min; // The smallest final size of the element on this axis will be this value in pixels. + float max; // The largest final size of the element on this axis will be this value in pixels. +} Clay_SizingMinMax; + +// Controls the sizing of this element along one axis inside its parent container. +typedef struct Clay_SizingAxis { + union { + Clay_SizingMinMax minMax; // Controls the minimum and maximum size in pixels that this element is allowed to grow or shrink to, overriding sizing types such as FIT or GROW. + float percent; // Expects 0-1 range. Clamps the axis size to a percent of the parent container's axis size minus padding and child gaps. + } size; + Clay__SizingType type; // Controls how the element takes up space inside its parent container. +} Clay_SizingAxis; + +// Controls the sizing of this element along one axis inside its parent container. +typedef struct Clay_Sizing { + Clay_SizingAxis width; // Controls the width sizing of the element, along the x axis. + Clay_SizingAxis height; // Controls the height sizing of the element, along the y axis. +} Clay_Sizing; + +// Controls "padding" in pixels, which is a gap between the bounding box of this element and where its children +// will be placed. +typedef struct Clay_Padding { + uint16_t left; + uint16_t right; + uint16_t top; + uint16_t bottom; +} Clay_Padding; + +CLAY__WRAPPER_STRUCT(Clay_Padding); + +// Controls various settings that affect the size and position of an element, as well as the sizes and positions +// of any child elements. +typedef struct Clay_LayoutConfig { + Clay_Sizing sizing; // Controls the sizing of this element inside it's parent container, including FIT, GROW, PERCENT and FIXED sizing. + Clay_Padding padding; // Controls "padding" in pixels, which is a gap between the bounding box of this element and where its children will be placed. + uint16_t childGap; // Controls the gap in pixels between child elements along the layout axis (horizontal gap for LEFT_TO_RIGHT, vertical gap for TOP_TO_BOTTOM). + Clay_ChildAlignment childAlignment; // Controls how child elements are aligned on each axis. + Clay_LayoutDirection layoutDirection; // Controls the direction in which child elements will be automatically laid out. +} Clay_LayoutConfig; + +CLAY__WRAPPER_STRUCT(Clay_LayoutConfig); + +extern Clay_LayoutConfig CLAY_LAYOUT_DEFAULT; + +// Controls how text "wraps", that is how it is broken into multiple lines when there is insufficient horizontal space. +typedef CLAY_PACKED_ENUM { + // (default) breaks on whitespace characters. + CLAY_TEXT_WRAP_WORDS, + // Don't break on space characters, only on newlines. + CLAY_TEXT_WRAP_NEWLINES, + // Disable text wrapping entirely. + CLAY_TEXT_WRAP_NONE, +} Clay_TextElementConfigWrapMode; + +// Controls how wrapped lines of text are horizontally aligned within the outer text bounding box. +typedef CLAY_PACKED_ENUM { + // (default) Horizontally aligns wrapped lines of text to the left hand side of their bounding box. + CLAY_TEXT_ALIGN_LEFT, + // Horizontally aligns wrapped lines of text to the center of their bounding box. + CLAY_TEXT_ALIGN_CENTER, + // Horizontally aligns wrapped lines of text to the right hand side of their bounding box. + CLAY_TEXT_ALIGN_RIGHT, +} Clay_TextAlignment; + +// Controls various functionality related to text elements. +typedef struct Clay_TextElementConfig { + // A pointer that will be transparently passed through to the resulting render command. + void *userData; + // The RGBA color of the font to render, conventionally specified as 0-255. + Clay_Color textColor; + // An integer transparently passed to Clay_MeasureText to identify the font to use. + // The debug view will pass fontId = 0 for its internal text. + uint16_t fontId; + // Controls the size of the font. Handled by the function provided to Clay_MeasureText. + uint16_t fontSize; + // Controls extra horizontal spacing between characters. Handled by the function provided to Clay_MeasureText. + uint16_t letterSpacing; + // Controls additional vertical space between wrapped lines of text. + uint16_t lineHeight; + // Controls how text "wraps", that is how it is broken into multiple lines when there is insufficient horizontal space. + // CLAY_TEXT_WRAP_WORDS (default) breaks on whitespace characters. + // CLAY_TEXT_WRAP_NEWLINES doesn't break on space characters, only on newlines. + // CLAY_TEXT_WRAP_NONE disables wrapping entirely. + Clay_TextElementConfigWrapMode wrapMode; + // Controls how wrapped lines of text are horizontally aligned within the outer text bounding box. + // CLAY_TEXT_ALIGN_LEFT (default) - Horizontally aligns wrapped lines of text to the left hand side of their bounding box. + // CLAY_TEXT_ALIGN_CENTER - Horizontally aligns wrapped lines of text to the center of their bounding box. + // CLAY_TEXT_ALIGN_RIGHT - Horizontally aligns wrapped lines of text to the right hand side of their bounding box. + Clay_TextAlignment textAlignment; +} Clay_TextElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_TextElementConfig); + +// Aspect Ratio -------------------------------- + +// Controls various settings related to aspect ratio scaling element. +typedef struct Clay_AspectRatioElementConfig { + float aspectRatio; // A float representing the target "Aspect ratio" for an element, which is its final width divided by its final height. +} Clay_AspectRatioElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_AspectRatioElementConfig); + +// Image -------------------------------- + +// Controls various settings related to image elements. +typedef struct Clay_ImageElementConfig { + void* imageData; // A transparent pointer used to pass image data through to the renderer. +} Clay_ImageElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_ImageElementConfig); + +// Floating ----------------------------- + +// Controls where a floating element is offset relative to its parent element. +// Note: see https://github.com/user-attachments/assets/b8c6dfaa-c1b1-41a4-be55-013473e4a6ce for a visual explanation. +typedef CLAY_PACKED_ENUM { + CLAY_ATTACH_POINT_LEFT_TOP, + CLAY_ATTACH_POINT_LEFT_CENTER, + CLAY_ATTACH_POINT_LEFT_BOTTOM, + CLAY_ATTACH_POINT_CENTER_TOP, + CLAY_ATTACH_POINT_CENTER_CENTER, + CLAY_ATTACH_POINT_CENTER_BOTTOM, + CLAY_ATTACH_POINT_RIGHT_TOP, + CLAY_ATTACH_POINT_RIGHT_CENTER, + CLAY_ATTACH_POINT_RIGHT_BOTTOM, +} Clay_FloatingAttachPointType; + +// Controls where a floating element is offset relative to its parent element. +typedef struct Clay_FloatingAttachPoints { + Clay_FloatingAttachPointType element; // Controls the origin point on a floating element that attaches to its parent. + Clay_FloatingAttachPointType parent; // Controls the origin point on the parent element that the floating element attaches to. +} Clay_FloatingAttachPoints; + +// Controls how mouse pointer events like hover and click are captured or passed through to elements underneath a floating element. +typedef CLAY_PACKED_ENUM { + // (default) "Capture" the pointer event and don't allow events like hover and click to pass through to elements underneath. + CLAY_POINTER_CAPTURE_MODE_CAPTURE, + // CLAY_POINTER_CAPTURE_MODE_PARENT, TODO pass pointer through to attached parent + + // Transparently pass through pointer events like hover and click to elements underneath the floating element. + CLAY_POINTER_CAPTURE_MODE_PASSTHROUGH, +} Clay_PointerCaptureMode; + +// Controls which element a floating element is "attached" to (i.e. relative offset from). +typedef CLAY_PACKED_ENUM { + // (default) Disables floating for this element. + CLAY_ATTACH_TO_NONE, + // Attaches this floating element to its parent, positioned based on the .attachPoints and .offset fields. + CLAY_ATTACH_TO_PARENT, + // Attaches this floating element to an element with a specific ID, specified with the .parentId field. positioned based on the .attachPoints and .offset fields. + CLAY_ATTACH_TO_ELEMENT_WITH_ID, + // Attaches this floating element to the root of the layout, which combined with the .offset field provides functionality similar to "absolute positioning". + CLAY_ATTACH_TO_ROOT, +} Clay_FloatingAttachToElement; + +// Controls whether or not a floating element is clipped to the same clipping rectangle as the element it's attached to. +typedef CLAY_PACKED_ENUM { + // (default) - The floating element does not inherit clipping. + CLAY_CLIP_TO_NONE, + // The floating element is clipped to the same clipping rectangle as the element it's attached to. + CLAY_CLIP_TO_ATTACHED_PARENT +} Clay_FloatingClipToElement; + +// Controls various settings related to "floating" elements, which are elements that "float" above other elements, potentially overlapping their boundaries, +// and not affecting the layout of sibling or parent elements. +typedef struct Clay_FloatingElementConfig { + // Offsets this floating element by the provided x,y coordinates from its attachPoints. + Clay_Vector2 offset; + // Expands the boundaries of the outer floating element without affecting its children. + Clay_Dimensions expand; + // When used in conjunction with .attachTo = CLAY_ATTACH_TO_ELEMENT_WITH_ID, attaches this floating element to the element in the hierarchy with the provided ID. + // Hint: attach the ID to the other element with .id = CLAY_ID("yourId"), and specify the id the same way, with .parentId = CLAY_ID("yourId").id + uint32_t parentId; + // Controls the z index of this floating element and all its children. Floating elements are sorted in ascending z order before output. + // zIndex is also passed to the renderer for all elements contained within this floating element. + int16_t zIndex; + // Controls how mouse pointer events like hover and click are captured or passed through to elements underneath / behind a floating element. + // Enum is of the form CLAY_ATTACH_POINT_foo_bar. See Clay_FloatingAttachPoints for more details. + // Note: see for a visual explanation. + Clay_FloatingAttachPoints attachPoints; + // Controls how mouse pointer events like hover and click are captured or passed through to elements underneath a floating element. + // CLAY_POINTER_CAPTURE_MODE_CAPTURE (default) - "Capture" the pointer event and don't allow events like hover and click to pass through to elements underneath. + // CLAY_POINTER_CAPTURE_MODE_PASSTHROUGH - Transparently pass through pointer events like hover and click to elements underneath the floating element. + Clay_PointerCaptureMode pointerCaptureMode; + // Controls which element a floating element is "attached" to (i.e. relative offset from). + // CLAY_ATTACH_TO_NONE (default) - Disables floating for this element. + // CLAY_ATTACH_TO_PARENT - Attaches this floating element to its parent, positioned based on the .attachPoints and .offset fields. + // CLAY_ATTACH_TO_ELEMENT_WITH_ID - Attaches this floating element to an element with a specific ID, specified with the .parentId field. positioned based on the .attachPoints and .offset fields. + // CLAY_ATTACH_TO_ROOT - Attaches this floating element to the root of the layout, which combined with the .offset field provides functionality similar to "absolute positioning". + Clay_FloatingAttachToElement attachTo; + // Controls whether or not a floating element is clipped to the same clipping rectangle as the element it's attached to. + // CLAY_CLIP_TO_NONE (default) - The floating element does not inherit clipping. + // CLAY_CLIP_TO_ATTACHED_PARENT - The floating element is clipped to the same clipping rectangle as the element it's attached to. + Clay_FloatingClipToElement clipTo; +} Clay_FloatingElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_FloatingElementConfig); + +// Custom ----------------------------- + +// Controls various settings related to custom elements. +typedef struct Clay_CustomElementConfig { + // A transparent pointer through which you can pass custom data to the renderer. + // Generates CUSTOM render commands. + void* customData; +} Clay_CustomElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_CustomElementConfig); + +// Scroll ----------------------------- + +// Controls the axis on which an element switches to "scrolling", which clips the contents and allows scrolling in that direction. +typedef struct Clay_ClipElementConfig { + bool horizontal; // Clip overflowing elements on the X axis. + bool vertical; // Clip overflowing elements on the Y axis. + Clay_Vector2 childOffset; // Offsets the x,y positions of all child elements. Used primarily for scrolling containers. +} Clay_ClipElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_ClipElementConfig); + +// Border ----------------------------- + +// Controls the widths of individual element borders. +typedef struct Clay_BorderWidth { + uint16_t left; + uint16_t right; + uint16_t top; + uint16_t bottom; + // Creates borders between each child element, depending on the .layoutDirection. + // e.g. for LEFT_TO_RIGHT, borders will be vertical lines, and for TOP_TO_BOTTOM borders will be horizontal lines. + // .betweenChildren borders will result in individual RECTANGLE render commands being generated. + uint16_t betweenChildren; +} Clay_BorderWidth; + +// Controls settings related to element borders. +typedef struct Clay_BorderElementConfig { + Clay_Color color; // Controls the color of all borders with width > 0. Conventionally represented as 0-255, but interpretation is up to the renderer. + Clay_BorderWidth width; // Controls the widths of individual borders. At least one of these should be > 0 for a BORDER render command to be generated. +} Clay_BorderElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_BorderElementConfig); + +// Render Command Data ----------------------------- + +// Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_TEXT +typedef struct Clay_TextRenderData { + // A string slice containing the text to be rendered. + // Note: this is not guaranteed to be null terminated. + Clay_StringSlice stringContents; + // Conventionally represented as 0-255 for each channel, but interpretation is up to the renderer. + Clay_Color textColor; + // An integer representing the font to use to render this text, transparently passed through from the text declaration. + uint16_t fontId; + uint16_t fontSize; + // Specifies the extra whitespace gap in pixels between each character. + uint16_t letterSpacing; + // The height of the bounding box for this line of text. + uint16_t lineHeight; +} Clay_TextRenderData; + +// Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_RECTANGLE +typedef struct Clay_RectangleRenderData { + // The solid background color to fill this rectangle with. Conventionally represented as 0-255 for each channel, but interpretation is up to the renderer. + Clay_Color backgroundColor; + // Controls the "radius", or corner rounding of elements, including rectangles, borders and images. + // The rounding is determined by drawing a circle inset into the element corner by (radius, radius) pixels. + Clay_CornerRadius cornerRadius; +} Clay_RectangleRenderData; + +// Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_IMAGE +typedef struct Clay_ImageRenderData { + // The tint color for this image. Note that the default value is 0,0,0,0 and should likely be interpreted + // as "untinted". + // Conventionally represented as 0-255 for each channel, but interpretation is up to the renderer. + Clay_Color backgroundColor; + // Controls the "radius", or corner rounding of this image. + // The rounding is determined by drawing a circle inset into the element corner by (radius, radius) pixels. + Clay_CornerRadius cornerRadius; + // A pointer transparently passed through from the original element definition, typically used to represent image data. + void* imageData; +} Clay_ImageRenderData; + +// Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_CUSTOM +typedef struct Clay_CustomRenderData { + // Passed through from .backgroundColor in the original element declaration. + // Conventionally represented as 0-255 for each channel, but interpretation is up to the renderer. + Clay_Color backgroundColor; + // Controls the "radius", or corner rounding of this custom element. + // The rounding is determined by drawing a circle inset into the element corner by (radius, radius) pixels. + Clay_CornerRadius cornerRadius; + // A pointer transparently passed through from the original element definition. + void* customData; +} Clay_CustomRenderData; + +// Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_SCISSOR_START || commandType == CLAY_RENDER_COMMAND_TYPE_SCISSOR_END +typedef struct Clay_ScrollRenderData { + bool horizontal; + bool vertical; +} Clay_ClipRenderData; + +// Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_BORDER +typedef struct Clay_BorderRenderData { + // Controls a shared color for all this element's borders. + // Conventionally represented as 0-255 for each channel, but interpretation is up to the renderer. + Clay_Color color; + // Specifies the "radius", or corner rounding of this border element. + // The rounding is determined by drawing a circle inset into the element corner by (radius, radius) pixels. + Clay_CornerRadius cornerRadius; + // Controls individual border side widths. + Clay_BorderWidth width; +} Clay_BorderRenderData; + +// A struct union containing data specific to this command's .commandType +typedef union Clay_RenderData { + // Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_RECTANGLE + Clay_RectangleRenderData rectangle; + // Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_TEXT + Clay_TextRenderData text; + // Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_IMAGE + Clay_ImageRenderData image; + // Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_CUSTOM + Clay_CustomRenderData custom; + // Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_BORDER + Clay_BorderRenderData border; + // Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_SCISSOR_START|END + Clay_ClipRenderData clip; +} Clay_RenderData; + +// Miscellaneous Structs & Enums --------------------------------- + +// Data representing the current internal state of a scrolling element. +typedef struct Clay_ScrollContainerData { + // Note: This is a pointer to the real internal scroll position, mutating it may cause a change in final layout. + // Intended for use with external functionality that modifies scroll position, such as scroll bars or auto scrolling. + Clay_Vector2 *scrollPosition; + // The bounding box of the scroll element. + Clay_Dimensions scrollContainerDimensions; + // The outer dimensions of the inner scroll container content, including the padding of the parent scroll container. + Clay_Dimensions contentDimensions; + // The config that was originally passed to the clip element. + Clay_ClipElementConfig config; + // Indicates whether an actual scroll container matched the provided ID or if the default struct was returned. + bool found; +} Clay_ScrollContainerData; + +// Bounding box and other data for a specific UI element. +typedef struct Clay_ElementData { + // The rectangle that encloses this UI element, with the position relative to the root of the layout. + Clay_BoundingBox boundingBox; + // Indicates whether an actual Element matched the provided ID or if the default struct was returned. + bool found; +} Clay_ElementData; + +// Used by renderers to determine specific handling for each render command. +typedef CLAY_PACKED_ENUM { + // This command type should be skipped. + CLAY_RENDER_COMMAND_TYPE_NONE, + // The renderer should draw a solid color rectangle. + CLAY_RENDER_COMMAND_TYPE_RECTANGLE, + // The renderer should draw a colored border inset into the bounding box. + CLAY_RENDER_COMMAND_TYPE_BORDER, + // The renderer should draw text. + CLAY_RENDER_COMMAND_TYPE_TEXT, + // The renderer should draw an image. + CLAY_RENDER_COMMAND_TYPE_IMAGE, + // The renderer should begin clipping all future draw commands, only rendering content that falls within the provided boundingBox. + CLAY_RENDER_COMMAND_TYPE_SCISSOR_START, + // The renderer should finish any previously active clipping, and begin rendering elements in full again. + CLAY_RENDER_COMMAND_TYPE_SCISSOR_END, + // The renderer should provide a custom implementation for handling this render command based on its .customData + CLAY_RENDER_COMMAND_TYPE_CUSTOM, +} Clay_RenderCommandType; + +typedef struct Clay_RenderCommand { + // A rectangular box that fully encloses this UI element, with the position relative to the root of the layout. + Clay_BoundingBox boundingBox; + // A struct union containing data specific to this command's commandType. + Clay_RenderData renderData; + // A pointer transparently passed through from the original element declaration. + void *userData; + // The id of this element, transparently passed through from the original element declaration. + uint32_t id; + // The z order required for drawing this command correctly. + // Note: the render command array is already sorted in ascending order, and will produce correct results if drawn in naive order. + // This field is intended for use in batching renderers for improved performance. + int16_t zIndex; + // Specifies how to handle rendering of this command. + // CLAY_RENDER_COMMAND_TYPE_RECTANGLE - The renderer should draw a solid color rectangle. + // CLAY_RENDER_COMMAND_TYPE_BORDER - The renderer should draw a colored border inset into the bounding box. + // CLAY_RENDER_COMMAND_TYPE_TEXT - The renderer should draw text. + // CLAY_RENDER_COMMAND_TYPE_IMAGE - The renderer should draw an image. + // CLAY_RENDER_COMMAND_TYPE_SCISSOR_START - The renderer should begin clipping all future draw commands, only rendering content that falls within the provided boundingBox. + // CLAY_RENDER_COMMAND_TYPE_SCISSOR_END - The renderer should finish any previously active clipping, and begin rendering elements in full again. + // CLAY_RENDER_COMMAND_TYPE_CUSTOM - The renderer should provide a custom implementation for handling this render command based on its .customData + Clay_RenderCommandType commandType; +} Clay_RenderCommand; + +// A sized array of render commands. +typedef struct Clay_RenderCommandArray { + // The underlying max capacity of the array, not necessarily all initialized. + int32_t capacity; + // The number of initialized elements in this array. Used for loops and iteration. + int32_t length; + // A pointer to the first element in the internal array. + Clay_RenderCommand* internalArray; +} Clay_RenderCommandArray; + +// Represents the current state of interaction with clay this frame. +typedef CLAY_PACKED_ENUM { + // A left mouse click, or touch occurred this frame. + CLAY_POINTER_DATA_PRESSED_THIS_FRAME, + // The left mouse button click or touch happened at some point in the past, and is still currently held down this frame. + CLAY_POINTER_DATA_PRESSED, + // The left mouse button click or touch was released this frame. + CLAY_POINTER_DATA_RELEASED_THIS_FRAME, + // The left mouse button click or touch is not currently down / was released at some point in the past. + CLAY_POINTER_DATA_RELEASED, +} Clay_PointerDataInteractionState; + +// Information on the current state of pointer interactions this frame. +typedef struct Clay_PointerData { + // The position of the mouse / touch / pointer relative to the root of the layout. + Clay_Vector2 position; + // Represents the current state of interaction with clay this frame. + // CLAY_POINTER_DATA_PRESSED_THIS_FRAME - A left mouse click, or touch occurred this frame. + // CLAY_POINTER_DATA_PRESSED - The left mouse button click or touch happened at some point in the past, and is still currently held down this frame. + // CLAY_POINTER_DATA_RELEASED_THIS_FRAME - The left mouse button click or touch was released this frame. + // CLAY_POINTER_DATA_RELEASED - The left mouse button click or touch is not currently down / was released at some point in the past. + Clay_PointerDataInteractionState state; +} Clay_PointerData; + +typedef struct Clay_ElementDeclaration { + // Controls various settings that affect the size and position of an element, as well as the sizes and positions of any child elements. + Clay_LayoutConfig layout; + // Controls the background color of the resulting element. + // By convention specified as 0-255, but interpretation is up to the renderer. + // If no other config is specified, .backgroundColor will generate a RECTANGLE render command, otherwise it will be passed as a property to IMAGE or CUSTOM render commands. + Clay_Color backgroundColor; + // Controls the "radius", or corner rounding of elements, including rectangles, borders and images. + Clay_CornerRadius cornerRadius; + // Controls settings related to aspect ratio scaling. + Clay_AspectRatioElementConfig aspectRatio; + // Controls settings related to image elements. + Clay_ImageElementConfig image; + // Controls whether and how an element "floats", which means it layers over the top of other elements in z order, and doesn't affect the position and size of siblings or parent elements. + // Note: in order to activate floating, .floating.attachTo must be set to something other than the default value. + Clay_FloatingElementConfig floating; + // Used to create CUSTOM render commands, usually to render element types not supported by Clay. + Clay_CustomElementConfig custom; + // Controls whether an element should clip its contents, as well as providing child x,y offset configuration for scrolling. + Clay_ClipElementConfig clip; + // Controls settings related to element borders, and will generate BORDER render commands. + Clay_BorderElementConfig border; + // A pointer that will be transparently passed through to resulting render commands. + void *userData; +} Clay_ElementDeclaration; + +CLAY__WRAPPER_STRUCT(Clay_ElementDeclaration); + +// Represents the type of error clay encountered while computing layout. +typedef CLAY_PACKED_ENUM { + // A text measurement function wasn't provided using Clay_SetMeasureTextFunction(), or the provided function was null. + CLAY_ERROR_TYPE_TEXT_MEASUREMENT_FUNCTION_NOT_PROVIDED, + // Clay attempted to allocate its internal data structures but ran out of space. + // The arena passed to Clay_Initialize was created with a capacity smaller than that required by Clay_MinMemorySize(). + CLAY_ERROR_TYPE_ARENA_CAPACITY_EXCEEDED, + // Clay ran out of capacity in its internal array for storing elements. This limit can be increased with Clay_SetMaxElementCount(). + CLAY_ERROR_TYPE_ELEMENTS_CAPACITY_EXCEEDED, + // Clay ran out of capacity in its internal array for storing elements. This limit can be increased with Clay_SetMaxMeasureTextCacheWordCount(). + CLAY_ERROR_TYPE_TEXT_MEASUREMENT_CAPACITY_EXCEEDED, + // Two elements were declared with exactly the same ID within one layout. + CLAY_ERROR_TYPE_DUPLICATE_ID, + // A floating element was declared using CLAY_ATTACH_TO_ELEMENT_ID and either an invalid .parentId was provided or no element with the provided .parentId was found. + CLAY_ERROR_TYPE_FLOATING_CONTAINER_PARENT_NOT_FOUND, + // An element was declared that using CLAY_SIZING_PERCENT but the percentage value was over 1. Percentage values are expected to be in the 0-1 range. + CLAY_ERROR_TYPE_PERCENTAGE_OVER_1, + // Clay encountered an internal error. It would be wonderful if you could report this so we can fix it! + CLAY_ERROR_TYPE_INTERNAL_ERROR, + // Clay__OpenElement was called more times than Clay__CloseElement, so there were still remaining open elements when the layout ended. + CLAY_ERROR_TYPE_UNBALANCED_OPEN_CLOSE, +} Clay_ErrorType; + +// Data to identify the error that clay has encountered. +typedef struct Clay_ErrorData { + // Represents the type of error clay encountered while computing layout. + // CLAY_ERROR_TYPE_TEXT_MEASUREMENT_FUNCTION_NOT_PROVIDED - A text measurement function wasn't provided using Clay_SetMeasureTextFunction(), or the provided function was null. + // CLAY_ERROR_TYPE_ARENA_CAPACITY_EXCEEDED - Clay attempted to allocate its internal data structures but ran out of space. The arena passed to Clay_Initialize was created with a capacity smaller than that required by Clay_MinMemorySize(). + // CLAY_ERROR_TYPE_ELEMENTS_CAPACITY_EXCEEDED - Clay ran out of capacity in its internal array for storing elements. This limit can be increased with Clay_SetMaxElementCount(). + // CLAY_ERROR_TYPE_TEXT_MEASUREMENT_CAPACITY_EXCEEDED - Clay ran out of capacity in its internal array for storing elements. This limit can be increased with Clay_SetMaxMeasureTextCacheWordCount(). + // CLAY_ERROR_TYPE_DUPLICATE_ID - Two elements were declared with exactly the same ID within one layout. + // CLAY_ERROR_TYPE_FLOATING_CONTAINER_PARENT_NOT_FOUND - A floating element was declared using CLAY_ATTACH_TO_ELEMENT_ID and either an invalid .parentId was provided or no element with the provided .parentId was found. + // CLAY_ERROR_TYPE_PERCENTAGE_OVER_1 - An element was declared that using CLAY_SIZING_PERCENT but the percentage value was over 1. Percentage values are expected to be in the 0-1 range. + // CLAY_ERROR_TYPE_INTERNAL_ERROR - Clay encountered an internal error. It would be wonderful if you could report this so we can fix it! + Clay_ErrorType errorType; + // A string containing human-readable error text that explains the error in more detail. + Clay_String errorText; + // A transparent pointer passed through from when the error handler was first provided. + void *userData; +} Clay_ErrorData; + +// A wrapper struct around Clay's error handler function. +typedef struct { + // A user provided function to call when Clay encounters an error during layout. + void (*errorHandlerFunction)(Clay_ErrorData errorText); + // A pointer that will be transparently passed through to the error handler when it is called. + void *userData; +} Clay_ErrorHandler; + +// Function Forward Declarations --------------------------------- + +// Public API functions ------------------------------------------ + +// Returns the size, in bytes, of the minimum amount of memory Clay requires to operate at its current settings. +CLAY_DLL_EXPORT uint32_t Clay_MinMemorySize(void); +// Creates an arena for clay to use for its internal allocations, given a certain capacity in bytes and a pointer to an allocation of at least that size. +// Intended to be used with Clay_MinMemorySize in the following way: +// uint32_t minMemoryRequired = Clay_MinMemorySize(); +// Clay_Arena clayMemory = Clay_CreateArenaWithCapacityAndMemory(minMemoryRequired, malloc(minMemoryRequired)); +CLAY_DLL_EXPORT Clay_Arena Clay_CreateArenaWithCapacityAndMemory(size_t capacity, void *memory); +// Sets the state of the "pointer" (i.e. the mouse or touch) in Clay's internal data. Used for detecting and responding to mouse events in the debug view, +// as well as for Clay_Hovered() and scroll element handling. +CLAY_DLL_EXPORT void Clay_SetPointerState(Clay_Vector2 position, bool pointerDown); +// Initialize Clay's internal arena and setup required data before layout can begin. Only needs to be called once. +// - arena can be created using Clay_CreateArenaWithCapacityAndMemory() +// - layoutDimensions are the initial bounding dimensions of the layout (i.e. the screen width and height for a full screen layout) +// - errorHandler is used by Clay to inform you if something has gone wrong in configuration or layout. +CLAY_DLL_EXPORT Clay_Context* Clay_Initialize(Clay_Arena arena, Clay_Dimensions layoutDimensions, Clay_ErrorHandler errorHandler); +// Returns the Context that clay is currently using. Used when using multiple instances of clay simultaneously. +CLAY_DLL_EXPORT Clay_Context* Clay_GetCurrentContext(void); +// Sets the context that clay will use to compute the layout. +// Used to restore a context saved from Clay_GetCurrentContext when using multiple instances of clay simultaneously. +CLAY_DLL_EXPORT void Clay_SetCurrentContext(Clay_Context* context); +// Updates the state of Clay's internal scroll data, updating scroll content positions if scrollDelta is non zero, and progressing momentum scrolling. +// - enableDragScrolling when set to true will enable mobile device like "touch drag" scroll of scroll containers, including momentum scrolling after the touch has ended. +// - scrollDelta is the amount to scroll this frame on each axis in pixels. +// - deltaTime is the time in seconds since the last "frame" (scroll update) +CLAY_DLL_EXPORT void Clay_UpdateScrollContainers(bool enableDragScrolling, Clay_Vector2 scrollDelta, float deltaTime); +// Returns the internally stored scroll offset for the currently open element. +// Generally intended for use with clip elements to create scrolling containers. +CLAY_DLL_EXPORT Clay_Vector2 Clay_GetScrollOffset(void); +// Updates the layout dimensions in response to the window or outer container being resized. +CLAY_DLL_EXPORT void Clay_SetLayoutDimensions(Clay_Dimensions dimensions); +// Called before starting any layout declarations. +CLAY_DLL_EXPORT void Clay_BeginLayout(void); +// Called when all layout declarations are finished. +// Computes the layout and generates and returns the array of render commands to draw. +CLAY_DLL_EXPORT Clay_RenderCommandArray Clay_EndLayout(void); +// Calculates a hash ID from the given idString. +// Generally only used for dynamic strings when CLAY_ID("stringLiteral") can't be used. +CLAY_DLL_EXPORT Clay_ElementId Clay_GetElementId(Clay_String idString); +// Calculates a hash ID from the given idString and index. +// - index is used to avoid constructing dynamic ID strings in loops. +// Generally only used for dynamic strings when CLAY_IDI("stringLiteral", index) can't be used. +CLAY_DLL_EXPORT Clay_ElementId Clay_GetElementIdWithIndex(Clay_String idString, uint32_t index); +// Returns layout data such as the final calculated bounding box for an element with a given ID. +// The returned Clay_ElementData contains a `found` bool that will be true if an element with the provided ID was found. +// This ID can be calculated either with CLAY_ID() for string literal IDs, or Clay_GetElementId for dynamic strings. +CLAY_DLL_EXPORT Clay_ElementData Clay_GetElementData(Clay_ElementId id); +// Returns true if the pointer position provided by Clay_SetPointerState is within the current element's bounding box. +// Works during element declaration, e.g. CLAY({ .backgroundColor = Clay_Hovered() ? BLUE : RED }); +CLAY_DLL_EXPORT bool Clay_Hovered(void); +// Bind a callback that will be called when the pointer position provided by Clay_SetPointerState is within the current element's bounding box. +// - onHoverFunction is a function pointer to a user defined function. +// - userData is a pointer that will be transparently passed through when the onHoverFunction is called. +CLAY_DLL_EXPORT void Clay_OnHover(void (*onHoverFunction)(Clay_ElementId elementId, Clay_PointerData pointerData, intptr_t userData), intptr_t userData); +// An imperative function that returns true if the pointer position provided by Clay_SetPointerState is within the element with the provided ID's bounding box. +// This ID can be calculated either with CLAY_ID() for string literal IDs, or Clay_GetElementId for dynamic strings. +CLAY_DLL_EXPORT bool Clay_PointerOver(Clay_ElementId elementId); +// Returns the array of element IDs that the pointer is currently over. +CLAY_DLL_EXPORT Clay_ElementIdArray Clay_GetPointerOverIds(void); +// Returns data representing the state of the scrolling element with the provided ID. +// The returned Clay_ScrollContainerData contains a `found` bool that will be true if a scroll element was found with the provided ID. +// An imperative function that returns true if the pointer position provided by Clay_SetPointerState is within the element with the provided ID's bounding box. +// This ID can be calculated either with CLAY_ID() for string literal IDs, or Clay_GetElementId for dynamic strings. +CLAY_DLL_EXPORT Clay_ScrollContainerData Clay_GetScrollContainerData(Clay_ElementId id); +// Binds a callback function that Clay will call to determine the dimensions of a given string slice. +// - measureTextFunction is a user provided function that adheres to the interface Clay_Dimensions (Clay_StringSlice text, Clay_TextElementConfig *config, void *userData); +// - userData is a pointer that will be transparently passed through when the measureTextFunction is called. +CLAY_DLL_EXPORT void Clay_SetMeasureTextFunction(Clay_Dimensions (*measureTextFunction)(Clay_StringSlice text, Clay_TextElementConfig *config, void *userData), void *userData); +// Experimental - Used in cases where Clay needs to integrate with a system that manages its own scrolling containers externally. +// Please reach out if you plan to use this function, as it may be subject to change. +CLAY_DLL_EXPORT void Clay_SetQueryScrollOffsetFunction(Clay_Vector2 (*queryScrollOffsetFunction)(uint32_t elementId, void *userData), void *userData); +// A bounds-checked "get" function for the Clay_RenderCommandArray returned from Clay_EndLayout(). +CLAY_DLL_EXPORT Clay_RenderCommand * Clay_RenderCommandArray_Get(Clay_RenderCommandArray* array, int32_t index); +// Enables and disables Clay's internal debug tools. +// This state is retained and does not need to be set each frame. +CLAY_DLL_EXPORT void Clay_SetDebugModeEnabled(bool enabled); +// Returns true if Clay's internal debug tools are currently enabled. +CLAY_DLL_EXPORT bool Clay_IsDebugModeEnabled(void); +// Enables and disables visibility culling. By default, Clay will not generate render commands for elements whose bounding box is entirely outside the screen. +CLAY_DLL_EXPORT void Clay_SetCullingEnabled(bool enabled); +// Returns the maximum number of UI elements supported by Clay's current configuration. +CLAY_DLL_EXPORT int32_t Clay_GetMaxElementCount(void); +// Modifies the maximum number of UI elements supported by Clay's current configuration. +// This may require reallocating additional memory, and re-calling Clay_Initialize(); +CLAY_DLL_EXPORT void Clay_SetMaxElementCount(int32_t maxElementCount); +// Returns the maximum number of measured "words" (whitespace seperated runs of characters) that Clay can store in its internal text measurement cache. +CLAY_DLL_EXPORT int32_t Clay_GetMaxMeasureTextCacheWordCount(void); +// Modifies the maximum number of measured "words" (whitespace seperated runs of characters) that Clay can store in its internal text measurement cache. +// This may require reallocating additional memory, and re-calling Clay_Initialize(); +CLAY_DLL_EXPORT void Clay_SetMaxMeasureTextCacheWordCount(int32_t maxMeasureTextCacheWordCount); +// Resets Clay's internal text measurement cache. Useful if font mappings have changed or fonts have been reloaded. +CLAY_DLL_EXPORT void Clay_ResetMeasureTextCache(void); + +// Internal API functions required by macros ---------------------- + +CLAY_DLL_EXPORT void Clay__OpenElement(void); +CLAY_DLL_EXPORT void Clay__OpenElementWithId(Clay_ElementId elementId); +CLAY_DLL_EXPORT void Clay__ConfigureOpenElement(const Clay_ElementDeclaration config); +CLAY_DLL_EXPORT void Clay__ConfigureOpenElementPtr(const Clay_ElementDeclaration *config); +CLAY_DLL_EXPORT void Clay__CloseElement(void); +CLAY_DLL_EXPORT Clay_ElementId Clay__HashString(Clay_String key, uint32_t seed); +CLAY_DLL_EXPORT Clay_ElementId Clay__HashStringWithOffset(Clay_String key, uint32_t offset, uint32_t seed); +CLAY_DLL_EXPORT void Clay__OpenTextElement(Clay_String text, Clay_TextElementConfig *textConfig); +CLAY_DLL_EXPORT Clay_TextElementConfig *Clay__StoreTextElementConfig(Clay_TextElementConfig config); +CLAY_DLL_EXPORT uint32_t Clay__GetParentElementId(void); + +extern Clay_Color Clay__debugViewHighlightColor; +extern uint32_t Clay__debugViewWidth; + +#ifdef __cplusplus +} +#endif + +#endif // CLAY_HEADER + +// ----------------------------------------- +// IMPLEMENTATION -------------------------- +// ----------------------------------------- +#ifdef CLAY_IMPLEMENTATION +#undef CLAY_IMPLEMENTATION + +#ifndef CLAY__NULL +#define CLAY__NULL 0 +#endif + +#ifndef CLAY__MAXFLOAT +#define CLAY__MAXFLOAT 3.40282346638528859812e+38F +#endif + +Clay_LayoutConfig CLAY_LAYOUT_DEFAULT = CLAY__DEFAULT_STRUCT; + +Clay_Color Clay__Color_DEFAULT = CLAY__DEFAULT_STRUCT; +Clay_CornerRadius Clay__CornerRadius_DEFAULT = CLAY__DEFAULT_STRUCT; +Clay_BorderWidth Clay__BorderWidth_DEFAULT = CLAY__DEFAULT_STRUCT; + +// The below functions define array bounds checking and convenience functions for a provided type. +#define CLAY__ARRAY_DEFINE_FUNCTIONS(typeName, arrayName) \ + \ +typedef struct \ +{ \ + int32_t length; \ + typeName *internalArray; \ +} arrayName##Slice; \ + \ +typeName typeName##_DEFAULT = CLAY__DEFAULT_STRUCT; \ + \ +arrayName arrayName##_Allocate_Arena(int32_t capacity, Clay_Arena *arena) { \ + return CLAY__INIT(arrayName){.capacity = capacity, .length = 0, \ + .internalArray = (typeName *)Clay__Array_Allocate_Arena(capacity, sizeof(typeName), arena)}; \ +} \ + \ +typeName *arrayName##_Get(arrayName *array, int32_t index) { \ + return Clay__Array_RangeCheck(index, array->length) ? &array->internalArray[index] : &typeName##_DEFAULT; \ +} \ + \ +typeName arrayName##_GetValue(arrayName *array, int32_t index) { \ + return Clay__Array_RangeCheck(index, array->length) ? array->internalArray[index] : typeName##_DEFAULT; \ +} \ + \ +typeName *arrayName##_Add(arrayName *array, typeName item) { \ + if (Clay__Array_AddCapacityCheck(array->length, array->capacity)) { \ + array->internalArray[array->length++] = item; \ + return &array->internalArray[array->length - 1]; \ + } \ + return &typeName##_DEFAULT; \ +} \ + \ +typeName *arrayName##Slice_Get(arrayName##Slice *slice, int32_t index) { \ + return Clay__Array_RangeCheck(index, slice->length) ? &slice->internalArray[index] : &typeName##_DEFAULT; \ +} \ + \ +typeName arrayName##_RemoveSwapback(arrayName *array, int32_t index) { \ + if (Clay__Array_RangeCheck(index, array->length)) { \ + array->length--; \ + typeName removed = array->internalArray[index]; \ + array->internalArray[index] = array->internalArray[array->length]; \ + return removed; \ + } \ + return typeName##_DEFAULT; \ +} \ + \ +void arrayName##_Set(arrayName *array, int32_t index, typeName value) { \ + if (Clay__Array_RangeCheck(index, array->capacity)) { \ + array->internalArray[index] = value; \ + array->length = index < array->length ? array->length : index + 1; \ + } \ +} \ + +#define CLAY__ARRAY_DEFINE(typeName, arrayName) \ +typedef struct \ +{ \ + int32_t capacity; \ + int32_t length; \ + typeName *internalArray; \ +} arrayName; \ + \ +CLAY__ARRAY_DEFINE_FUNCTIONS(typeName, arrayName) \ + +Clay_Context *Clay__currentContext; +int32_t Clay__defaultMaxElementCount = 8192; +int32_t Clay__defaultMaxMeasureTextWordCacheCount = 16384; + +void Clay__ErrorHandlerFunctionDefault(Clay_ErrorData errorText) { + (void) errorText; +} + +Clay_String CLAY__SPACECHAR = { .length = 1, .chars = " " }; +Clay_String CLAY__STRING_DEFAULT = { .length = 0, .chars = NULL }; + +typedef struct { + bool maxElementsExceeded; + bool maxRenderCommandsExceeded; + bool maxTextMeasureCacheExceeded; + bool textMeasurementFunctionNotSet; +} Clay_BooleanWarnings; + +typedef struct { + Clay_String baseMessage; + Clay_String dynamicMessage; +} Clay__Warning; + +Clay__Warning CLAY__WARNING_DEFAULT = CLAY__DEFAULT_STRUCT; + +typedef struct { + int32_t capacity; + int32_t length; + Clay__Warning *internalArray; +} Clay__WarningArray; + +typedef struct { + Clay_Color backgroundColor; + Clay_CornerRadius cornerRadius; + void* userData; +} Clay_SharedElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_SharedElementConfig); + +Clay__WarningArray Clay__WarningArray_Allocate_Arena(int32_t capacity, Clay_Arena *arena); +Clay__Warning *Clay__WarningArray_Add(Clay__WarningArray *array, Clay__Warning item); +void* Clay__Array_Allocate_Arena(int32_t capacity, uint32_t itemSize, Clay_Arena *arena); +bool Clay__Array_RangeCheck(int32_t index, int32_t length); +bool Clay__Array_AddCapacityCheck(int32_t length, int32_t capacity); + +CLAY__ARRAY_DEFINE(bool, Clay__boolArray) +CLAY__ARRAY_DEFINE(int32_t, Clay__int32_tArray) +CLAY__ARRAY_DEFINE(char, Clay__charArray) +CLAY__ARRAY_DEFINE_FUNCTIONS(Clay_ElementId, Clay_ElementIdArray) +CLAY__ARRAY_DEFINE(Clay_LayoutConfig, Clay__LayoutConfigArray) +CLAY__ARRAY_DEFINE(Clay_TextElementConfig, Clay__TextElementConfigArray) +CLAY__ARRAY_DEFINE(Clay_AspectRatioElementConfig, Clay__AspectRatioElementConfigArray) +CLAY__ARRAY_DEFINE(Clay_ImageElementConfig, Clay__ImageElementConfigArray) +CLAY__ARRAY_DEFINE(Clay_FloatingElementConfig, Clay__FloatingElementConfigArray) +CLAY__ARRAY_DEFINE(Clay_CustomElementConfig, Clay__CustomElementConfigArray) +CLAY__ARRAY_DEFINE(Clay_ClipElementConfig, Clay__ClipElementConfigArray) +CLAY__ARRAY_DEFINE(Clay_BorderElementConfig, Clay__BorderElementConfigArray) +CLAY__ARRAY_DEFINE(Clay_String, Clay__StringArray) +CLAY__ARRAY_DEFINE(Clay_SharedElementConfig, Clay__SharedElementConfigArray) +CLAY__ARRAY_DEFINE_FUNCTIONS(Clay_RenderCommand, Clay_RenderCommandArray) + +typedef CLAY_PACKED_ENUM { + CLAY__ELEMENT_CONFIG_TYPE_NONE, + CLAY__ELEMENT_CONFIG_TYPE_BORDER, + CLAY__ELEMENT_CONFIG_TYPE_FLOATING, + CLAY__ELEMENT_CONFIG_TYPE_CLIP, + CLAY__ELEMENT_CONFIG_TYPE_ASPECT, + CLAY__ELEMENT_CONFIG_TYPE_IMAGE, + CLAY__ELEMENT_CONFIG_TYPE_TEXT, + CLAY__ELEMENT_CONFIG_TYPE_CUSTOM, + CLAY__ELEMENT_CONFIG_TYPE_SHARED, +} Clay__ElementConfigType; + +typedef union { + Clay_TextElementConfig *textElementConfig; + Clay_AspectRatioElementConfig *aspectRatioElementConfig; + Clay_ImageElementConfig *imageElementConfig; + Clay_FloatingElementConfig *floatingElementConfig; + Clay_CustomElementConfig *customElementConfig; + Clay_ClipElementConfig *clipElementConfig; + Clay_BorderElementConfig *borderElementConfig; + Clay_SharedElementConfig *sharedElementConfig; +} Clay_ElementConfigUnion; + +typedef struct { + Clay__ElementConfigType type; + Clay_ElementConfigUnion config; +} Clay_ElementConfig; + +CLAY__ARRAY_DEFINE(Clay_ElementConfig, Clay__ElementConfigArray) + +typedef struct { + Clay_Dimensions dimensions; + Clay_String line; +} Clay__WrappedTextLine; + +CLAY__ARRAY_DEFINE(Clay__WrappedTextLine, Clay__WrappedTextLineArray) + +typedef struct { + Clay_String text; + Clay_Dimensions preferredDimensions; + int32_t elementIndex; + Clay__WrappedTextLineArraySlice wrappedLines; +} Clay__TextElementData; + +CLAY__ARRAY_DEFINE(Clay__TextElementData, Clay__TextElementDataArray) + +typedef struct { + int32_t *elements; + uint16_t length; +} Clay__LayoutElementChildren; + +typedef struct { + union { + Clay__LayoutElementChildren children; + Clay__TextElementData *textElementData; + } childrenOrTextContent; + Clay_Dimensions dimensions; + Clay_Dimensions minDimensions; + Clay_LayoutConfig *layoutConfig; + Clay__ElementConfigArraySlice elementConfigs; + uint32_t id; +} Clay_LayoutElement; + +CLAY__ARRAY_DEFINE(Clay_LayoutElement, Clay_LayoutElementArray) + +typedef struct { + Clay_LayoutElement *layoutElement; + Clay_BoundingBox boundingBox; + Clay_Dimensions contentSize; + Clay_Vector2 scrollOrigin; + Clay_Vector2 pointerOrigin; + Clay_Vector2 scrollMomentum; + Clay_Vector2 scrollPosition; + Clay_Vector2 previousDelta; + float momentumTime; + uint32_t elementId; + bool openThisFrame; + bool pointerScrollActive; +} Clay__ScrollContainerDataInternal; + +CLAY__ARRAY_DEFINE(Clay__ScrollContainerDataInternal, Clay__ScrollContainerDataInternalArray) + +typedef struct { + bool collision; + bool collapsed; +} Clay__DebugElementData; + +CLAY__ARRAY_DEFINE(Clay__DebugElementData, Clay__DebugElementDataArray) + +typedef struct { // todo get this struct into a single cache line + Clay_BoundingBox boundingBox; + Clay_ElementId elementId; + Clay_LayoutElement* layoutElement; + void (*onHoverFunction)(Clay_ElementId elementId, Clay_PointerData pointerInfo, intptr_t userData); + intptr_t hoverFunctionUserData; + int32_t nextIndex; + uint32_t generation; + Clay__DebugElementData *debugData; +} Clay_LayoutElementHashMapItem; + +CLAY__ARRAY_DEFINE(Clay_LayoutElementHashMapItem, Clay__LayoutElementHashMapItemArray) + +typedef struct { + int32_t startOffset; + int32_t length; + float width; + int32_t next; +} Clay__MeasuredWord; + +CLAY__ARRAY_DEFINE(Clay__MeasuredWord, Clay__MeasuredWordArray) + +typedef struct { + Clay_Dimensions unwrappedDimensions; + int32_t measuredWordsStartIndex; + float minWidth; + bool containsNewlines; + // Hash map data + uint32_t id; + int32_t nextIndex; + uint32_t generation; +} Clay__MeasureTextCacheItem; + +CLAY__ARRAY_DEFINE(Clay__MeasureTextCacheItem, Clay__MeasureTextCacheItemArray) + +typedef struct { + Clay_LayoutElement *layoutElement; + Clay_Vector2 position; + Clay_Vector2 nextChildOffset; +} Clay__LayoutElementTreeNode; + +CLAY__ARRAY_DEFINE(Clay__LayoutElementTreeNode, Clay__LayoutElementTreeNodeArray) + +typedef struct { + int32_t layoutElementIndex; + uint32_t parentId; // This can be zero in the case of the root layout tree + uint32_t clipElementId; // This can be zero if there is no clip element + int16_t zIndex; + Clay_Vector2 pointerOffset; // Only used when scroll containers are managed externally +} Clay__LayoutElementTreeRoot; + +CLAY__ARRAY_DEFINE(Clay__LayoutElementTreeRoot, Clay__LayoutElementTreeRootArray) + +struct Clay_Context { + int32_t maxElementCount; + int32_t maxMeasureTextCacheWordCount; + bool warningsEnabled; + Clay_ErrorHandler errorHandler; + Clay_BooleanWarnings booleanWarnings; + Clay__WarningArray warnings; + + Clay_PointerData pointerInfo; + Clay_Dimensions layoutDimensions; + Clay_ElementId dynamicElementIndexBaseHash; + uint32_t dynamicElementIndex; + bool debugModeEnabled; + bool disableCulling; + bool externalScrollHandlingEnabled; + uint32_t debugSelectedElementId; + uint32_t generation; + uintptr_t arenaResetOffset; + void *measureTextUserData; + void *queryScrollOffsetUserData; + Clay_Arena internalArena; + // Layout Elements / Render Commands + Clay_LayoutElementArray layoutElements; + Clay_RenderCommandArray renderCommands; + Clay__int32_tArray openLayoutElementStack; + Clay__int32_tArray layoutElementChildren; + Clay__int32_tArray layoutElementChildrenBuffer; + Clay__TextElementDataArray textElementData; + Clay__int32_tArray aspectRatioElementIndexes; + Clay__int32_tArray reusableElementIndexBuffer; + Clay__int32_tArray layoutElementClipElementIds; + // Configs + Clay__LayoutConfigArray layoutConfigs; + Clay__ElementConfigArray elementConfigs; + Clay__TextElementConfigArray textElementConfigs; + Clay__AspectRatioElementConfigArray aspectRatioElementConfigs; + Clay__ImageElementConfigArray imageElementConfigs; + Clay__FloatingElementConfigArray floatingElementConfigs; + Clay__ClipElementConfigArray clipElementConfigs; + Clay__CustomElementConfigArray customElementConfigs; + Clay__BorderElementConfigArray borderElementConfigs; + Clay__SharedElementConfigArray sharedElementConfigs; + // Misc Data Structures + Clay__StringArray layoutElementIdStrings; + Clay__WrappedTextLineArray wrappedTextLines; + Clay__LayoutElementTreeNodeArray layoutElementTreeNodeArray1; + Clay__LayoutElementTreeRootArray layoutElementTreeRoots; + Clay__LayoutElementHashMapItemArray layoutElementsHashMapInternal; + Clay__int32_tArray layoutElementsHashMap; + Clay__MeasureTextCacheItemArray measureTextHashMapInternal; + Clay__int32_tArray measureTextHashMapInternalFreeList; + Clay__int32_tArray measureTextHashMap; + Clay__MeasuredWordArray measuredWords; + Clay__int32_tArray measuredWordsFreeList; + Clay__int32_tArray openClipElementStack; + Clay_ElementIdArray pointerOverIds; + Clay__ScrollContainerDataInternalArray scrollContainerDatas; + Clay__boolArray treeNodeVisited; + Clay__charArray dynamicStringData; + Clay__DebugElementDataArray debugElementData; +}; + +Clay_Context* Clay__Context_Allocate_Arena(Clay_Arena *arena) { + size_t totalSizeBytes = sizeof(Clay_Context); + if (totalSizeBytes > arena->capacity) + { + return NULL; + } + arena->nextAllocation += totalSizeBytes; + return (Clay_Context*)(arena->memory); +} + +Clay_String Clay__WriteStringToCharBuffer(Clay__charArray *buffer, Clay_String string) { + for (int32_t i = 0; i < string.length; i++) { + buffer->internalArray[buffer->length + i] = string.chars[i]; + } + buffer->length += string.length; + return CLAY__INIT(Clay_String) { .length = string.length, .chars = (const char *)(buffer->internalArray + buffer->length - string.length) }; +} + +#ifdef CLAY_WASM + __attribute__((import_module("clay"), import_name("measureTextFunction"))) Clay_Dimensions Clay__MeasureText(Clay_StringSlice text, Clay_TextElementConfig *config, void *userData); + __attribute__((import_module("clay"), import_name("queryScrollOffsetFunction"))) Clay_Vector2 Clay__QueryScrollOffset(uint32_t elementId, void *userData); +#else + Clay_Dimensions (*Clay__MeasureText)(Clay_StringSlice text, Clay_TextElementConfig *config, void *userData); + Clay_Vector2 (*Clay__QueryScrollOffset)(uint32_t elementId, void *userData); +#endif + +Clay_LayoutElement* Clay__GetOpenLayoutElement(void) { + Clay_Context* context = Clay_GetCurrentContext(); + return Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&context->openLayoutElementStack, context->openLayoutElementStack.length - 1)); +} + +uint32_t Clay__GetParentElementId(void) { + Clay_Context* context = Clay_GetCurrentContext(); + return Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&context->openLayoutElementStack, context->openLayoutElementStack.length - 2))->id; +} + +Clay_LayoutConfig * Clay__StoreLayoutConfig(Clay_LayoutConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &CLAY_LAYOUT_DEFAULT : Clay__LayoutConfigArray_Add(&Clay_GetCurrentContext()->layoutConfigs, config); } +Clay_TextElementConfig * Clay__StoreTextElementConfig(Clay_TextElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_TextElementConfig_DEFAULT : Clay__TextElementConfigArray_Add(&Clay_GetCurrentContext()->textElementConfigs, config); } +Clay_AspectRatioElementConfig * Clay__StoreAspectRatioElementConfig(Clay_AspectRatioElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_AspectRatioElementConfig_DEFAULT : Clay__AspectRatioElementConfigArray_Add(&Clay_GetCurrentContext()->aspectRatioElementConfigs, config); } +Clay_ImageElementConfig * Clay__StoreImageElementConfig(Clay_ImageElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_ImageElementConfig_DEFAULT : Clay__ImageElementConfigArray_Add(&Clay_GetCurrentContext()->imageElementConfigs, config); } +Clay_FloatingElementConfig * Clay__StoreFloatingElementConfig(Clay_FloatingElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_FloatingElementConfig_DEFAULT : Clay__FloatingElementConfigArray_Add(&Clay_GetCurrentContext()->floatingElementConfigs, config); } +Clay_CustomElementConfig * Clay__StoreCustomElementConfig(Clay_CustomElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_CustomElementConfig_DEFAULT : Clay__CustomElementConfigArray_Add(&Clay_GetCurrentContext()->customElementConfigs, config); } +Clay_ClipElementConfig * Clay__StoreClipElementConfig(Clay_ClipElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_ClipElementConfig_DEFAULT : Clay__ClipElementConfigArray_Add(&Clay_GetCurrentContext()->clipElementConfigs, config); } +Clay_BorderElementConfig * Clay__StoreBorderElementConfig(Clay_BorderElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_BorderElementConfig_DEFAULT : Clay__BorderElementConfigArray_Add(&Clay_GetCurrentContext()->borderElementConfigs, config); } +Clay_SharedElementConfig * Clay__StoreSharedElementConfig(Clay_SharedElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_SharedElementConfig_DEFAULT : Clay__SharedElementConfigArray_Add(&Clay_GetCurrentContext()->sharedElementConfigs, config); } + +Clay_ElementConfig Clay__AttachElementConfig(Clay_ElementConfigUnion config, Clay__ElementConfigType type) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->booleanWarnings.maxElementsExceeded) { + return CLAY__INIT(Clay_ElementConfig) CLAY__DEFAULT_STRUCT; + } + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + openLayoutElement->elementConfigs.length++; + return *Clay__ElementConfigArray_Add(&context->elementConfigs, CLAY__INIT(Clay_ElementConfig) { .type = type, .config = config }); +} + +Clay_ElementConfigUnion Clay__FindElementConfigWithType(Clay_LayoutElement *element, Clay__ElementConfigType type) { + for (int32_t i = 0; i < element->elementConfigs.length; i++) { + Clay_ElementConfig *config = Clay__ElementConfigArraySlice_Get(&element->elementConfigs, i); + if (config->type == type) { + return config->config; + } + } + return CLAY__INIT(Clay_ElementConfigUnion) { NULL }; +} + +Clay_ElementId Clay__HashNumber(const uint32_t offset, const uint32_t seed) { + uint32_t hash = seed; + hash += (offset + 48); + hash += (hash << 10); + hash ^= (hash >> 6); + + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + return CLAY__INIT(Clay_ElementId) { .id = hash + 1, .offset = offset, .baseId = seed, .stringId = CLAY__STRING_DEFAULT }; // Reserve the hash result of zero as "null id" +} + +Clay_ElementId Clay__HashString(Clay_String key, const uint32_t seed) { + uint32_t hash = seed; + + for (int32_t i = 0; i < key.length; i++) { + hash += key.chars[i]; + hash += (hash << 10); + hash ^= (hash >> 6); + } + + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + return CLAY__INIT(Clay_ElementId) { .id = hash + 1, .offset = 0, .baseId = hash + 1, .stringId = key }; // Reserve the hash result of zero as "null id" +} + +Clay_ElementId Clay__HashStringWithOffset(Clay_String key, const uint32_t offset, const uint32_t seed) { + uint32_t hash = 0; + uint32_t base = seed; + + for (int32_t i = 0; i < key.length; i++) { + base += key.chars[i]; + base += (base << 10); + base ^= (base >> 6); + } + hash = base; + hash += offset; + hash += (hash << 10); + hash ^= (hash >> 6); + + hash += (hash << 3); + base += (base << 3); + hash ^= (hash >> 11); + base ^= (base >> 11); + hash += (hash << 15); + base += (base << 15); + return CLAY__INIT(Clay_ElementId) { .id = hash + 1, .offset = offset, .baseId = base + 1, .stringId = key }; // Reserve the hash result of zero as "null id" +} + +#if !defined(CLAY_DISABLE_SIMD) && (defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64)) +static inline __m128i Clay__SIMDRotateLeft(__m128i x, int r) { + return _mm_or_si128(_mm_slli_epi64(x, r), _mm_srli_epi64(x, 64 - r)); +} + +static inline void Clay__SIMDARXMix(__m128i* a, __m128i* b) { + *a = _mm_add_epi64(*a, *b); + *b = _mm_xor_si128(Clay__SIMDRotateLeft(*b, 17), *a); +} + +uint64_t Clay__HashData(const uint8_t* data, size_t length) { + // Pinched these constants from the BLAKE implementation + __m128i v0 = _mm_set1_epi64x(0x6a09e667f3bcc908ULL); + __m128i v1 = _mm_set1_epi64x(0xbb67ae8584caa73bULL); + __m128i v2 = _mm_set1_epi64x(0x3c6ef372fe94f82bULL); + __m128i v3 = _mm_set1_epi64x(0xa54ff53a5f1d36f1ULL); + + uint8_t overflowBuffer[16] = { 0 }; // Temporary buffer for small inputs + + while (length > 0) { + __m128i msg; + if (length >= 16) { + msg = _mm_loadu_si128((const __m128i*)data); + data += 16; + length -= 16; + } + else { + for (size_t i = 0; i < length; i++) { + overflowBuffer[i] = data[i]; + } + msg = _mm_loadu_si128((const __m128i*)overflowBuffer); + length = 0; + } + + v0 = _mm_xor_si128(v0, msg); + Clay__SIMDARXMix(&v0, &v1); + Clay__SIMDARXMix(&v2, &v3); + + v0 = _mm_add_epi64(v0, v2); + v1 = _mm_add_epi64(v1, v3); + } + + Clay__SIMDARXMix(&v0, &v1); + Clay__SIMDARXMix(&v2, &v3); + v0 = _mm_add_epi64(v0, v2); + v1 = _mm_add_epi64(v1, v3); + v0 = _mm_add_epi64(v0, v1); + + uint64_t result[2]; + _mm_storeu_si128((__m128i*)result, v0); + + return result[0] ^ result[1]; +} +#elif !defined(CLAY_DISABLE_SIMD) && defined(__aarch64__) +static inline void Clay__SIMDARXMix(uint64x2_t* a, uint64x2_t* b) { + *a = vaddq_u64(*a, *b); + *b = veorq_u64(vorrq_u64(vshlq_n_u64(*b, 17), vshrq_n_u64(*b, 64 - 17)), *a); +} + +uint64_t Clay__HashData(const uint8_t* data, size_t length) { + // Pinched these constants from the BLAKE implementation + uint64x2_t v0 = vdupq_n_u64(0x6a09e667f3bcc908ULL); + uint64x2_t v1 = vdupq_n_u64(0xbb67ae8584caa73bULL); + uint64x2_t v2 = vdupq_n_u64(0x3c6ef372fe94f82bULL); + uint64x2_t v3 = vdupq_n_u64(0xa54ff53a5f1d36f1ULL); + + uint8_t overflowBuffer[8] = { 0 }; + + while (length > 0) { + uint64x2_t msg; + if (length > 16) { + msg = vld1q_u64((const uint64_t*)data); + data += 16; + length -= 16; + } + else if (length > 8) { + msg = vcombine_u64(vld1_u64((const uint64_t*)data), vdup_n_u64(0)); + data += 8; + length -= 8; + } + else { + for (size_t i = 0; i < length; i++) { + overflowBuffer[i] = data[i]; + } + uint8x8_t lower = vld1_u8(overflowBuffer); + msg = vreinterpretq_u64_u8(vcombine_u8(lower, vdup_n_u8(0))); + length = 0; + } + v0 = veorq_u64(v0, msg); + Clay__SIMDARXMix(&v0, &v1); + Clay__SIMDARXMix(&v2, &v3); + + v0 = vaddq_u64(v0, v2); + v1 = vaddq_u64(v1, v3); + } + + Clay__SIMDARXMix(&v0, &v1); + Clay__SIMDARXMix(&v2, &v3); + v0 = vaddq_u64(v0, v2); + v1 = vaddq_u64(v1, v3); + v0 = vaddq_u64(v0, v1); + + uint64_t result[2]; + vst1q_u64(result, v0); + + return result[0] ^ result[1]; +} +#else +uint64_t Clay__HashData(const uint8_t* data, size_t length) { + uint64_t hash = 0; + + for (size_t i = 0; i < length; i++) { + hash += data[i]; + hash += (hash << 10); + hash ^= (hash >> 6); + } + return hash; +} +#endif + +uint32_t Clay__HashStringContentsWithConfig(Clay_String *text, Clay_TextElementConfig *config) { + uint32_t hash = 0; + if (text->isStaticallyAllocated) { + hash += (uintptr_t)text->chars; + hash += (hash << 10); + hash ^= (hash >> 6); + hash += text->length; + hash += (hash << 10); + hash ^= (hash >> 6); + } else { + hash = Clay__HashData((const uint8_t *)text->chars, text->length) % UINT32_MAX; + } + + hash += config->fontId; + hash += (hash << 10); + hash ^= (hash >> 6); + + hash += config->fontSize; + hash += (hash << 10); + hash ^= (hash >> 6); + + hash += config->letterSpacing; + hash += (hash << 10); + hash ^= (hash >> 6); + + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + return hash + 1; // Reserve the hash result of zero as "null id" +} + +Clay__MeasuredWord *Clay__AddMeasuredWord(Clay__MeasuredWord word, Clay__MeasuredWord *previousWord) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->measuredWordsFreeList.length > 0) { + uint32_t newItemIndex = Clay__int32_tArray_GetValue(&context->measuredWordsFreeList, (int)context->measuredWordsFreeList.length - 1); + context->measuredWordsFreeList.length--; + Clay__MeasuredWordArray_Set(&context->measuredWords, (int)newItemIndex, word); + previousWord->next = (int32_t)newItemIndex; + return Clay__MeasuredWordArray_Get(&context->measuredWords, (int)newItemIndex); + } else { + previousWord->next = (int32_t)context->measuredWords.length; + return Clay__MeasuredWordArray_Add(&context->measuredWords, word); + } +} + +Clay__MeasureTextCacheItem *Clay__MeasureTextCached(Clay_String *text, Clay_TextElementConfig *config) { + Clay_Context* context = Clay_GetCurrentContext(); + #ifndef CLAY_WASM + if (!Clay__MeasureText) { + if (!context->booleanWarnings.textMeasurementFunctionNotSet) { + context->booleanWarnings.textMeasurementFunctionNotSet = true; + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_TEXT_MEASUREMENT_FUNCTION_NOT_PROVIDED, + .errorText = CLAY_STRING("Clay's internal MeasureText function is null. You may have forgotten to call Clay_SetMeasureTextFunction(), or passed a NULL function pointer by mistake."), + .userData = context->errorHandler.userData }); + } + return &Clay__MeasureTextCacheItem_DEFAULT; + } + #endif + uint32_t id = Clay__HashStringContentsWithConfig(text, config); + uint32_t hashBucket = id % (context->maxMeasureTextCacheWordCount / 32); + int32_t elementIndexPrevious = 0; + int32_t elementIndex = context->measureTextHashMap.internalArray[hashBucket]; + while (elementIndex != 0) { + Clay__MeasureTextCacheItem *hashEntry = Clay__MeasureTextCacheItemArray_Get(&context->measureTextHashMapInternal, elementIndex); + if (hashEntry->id == id) { + hashEntry->generation = context->generation; + return hashEntry; + } + // This element hasn't been seen in a few frames, delete the hash map item + if (context->generation - hashEntry->generation > 2) { + // Add all the measured words that were included in this measurement to the freelist + int32_t nextWordIndex = hashEntry->measuredWordsStartIndex; + while (nextWordIndex != -1) { + Clay__MeasuredWord *measuredWord = Clay__MeasuredWordArray_Get(&context->measuredWords, nextWordIndex); + Clay__int32_tArray_Add(&context->measuredWordsFreeList, nextWordIndex); + nextWordIndex = measuredWord->next; + } + + int32_t nextIndex = hashEntry->nextIndex; + Clay__MeasureTextCacheItemArray_Set(&context->measureTextHashMapInternal, elementIndex, CLAY__INIT(Clay__MeasureTextCacheItem) { .measuredWordsStartIndex = -1 }); + Clay__int32_tArray_Add(&context->measureTextHashMapInternalFreeList, elementIndex); + if (elementIndexPrevious == 0) { + context->measureTextHashMap.internalArray[hashBucket] = nextIndex; + } else { + Clay__MeasureTextCacheItem *previousHashEntry = Clay__MeasureTextCacheItemArray_Get(&context->measureTextHashMapInternal, elementIndexPrevious); + previousHashEntry->nextIndex = nextIndex; + } + elementIndex = nextIndex; + } else { + elementIndexPrevious = elementIndex; + elementIndex = hashEntry->nextIndex; + } + } + + int32_t newItemIndex = 0; + Clay__MeasureTextCacheItem newCacheItem = { .measuredWordsStartIndex = -1, .id = id, .generation = context->generation }; + Clay__MeasureTextCacheItem *measured = NULL; + if (context->measureTextHashMapInternalFreeList.length > 0) { + newItemIndex = Clay__int32_tArray_GetValue(&context->measureTextHashMapInternalFreeList, context->measureTextHashMapInternalFreeList.length - 1); + context->measureTextHashMapInternalFreeList.length--; + Clay__MeasureTextCacheItemArray_Set(&context->measureTextHashMapInternal, newItemIndex, newCacheItem); + measured = Clay__MeasureTextCacheItemArray_Get(&context->measureTextHashMapInternal, newItemIndex); + } else { + if (context->measureTextHashMapInternal.length == context->measureTextHashMapInternal.capacity - 1) { + if (!context->booleanWarnings.maxTextMeasureCacheExceeded) { + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_ELEMENTS_CAPACITY_EXCEEDED, + .errorText = CLAY_STRING("Clay ran out of capacity while attempting to measure text elements. Try using Clay_SetMaxElementCount() with a higher value."), + .userData = context->errorHandler.userData }); + context->booleanWarnings.maxTextMeasureCacheExceeded = true; + } + return &Clay__MeasureTextCacheItem_DEFAULT; + } + measured = Clay__MeasureTextCacheItemArray_Add(&context->measureTextHashMapInternal, newCacheItem); + newItemIndex = context->measureTextHashMapInternal.length - 1; + } + + int32_t start = 0; + int32_t end = 0; + float lineWidth = 0; + float measuredWidth = 0; + float measuredHeight = 0; + float spaceWidth = Clay__MeasureText(CLAY__INIT(Clay_StringSlice) { .length = 1, .chars = CLAY__SPACECHAR.chars, .baseChars = CLAY__SPACECHAR.chars }, config, context->measureTextUserData).width; + Clay__MeasuredWord tempWord = { .next = -1 }; + Clay__MeasuredWord *previousWord = &tempWord; + while (end < text->length) { + if (context->measuredWords.length == context->measuredWords.capacity - 1) { + if (!context->booleanWarnings.maxTextMeasureCacheExceeded) { + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_TEXT_MEASUREMENT_CAPACITY_EXCEEDED, + .errorText = CLAY_STRING("Clay has run out of space in it's internal text measurement cache. Try using Clay_SetMaxMeasureTextCacheWordCount() (default 16384, with 1 unit storing 1 measured word)."), + .userData = context->errorHandler.userData }); + context->booleanWarnings.maxTextMeasureCacheExceeded = true; + } + return &Clay__MeasureTextCacheItem_DEFAULT; + } + char current = text->chars[end]; + if (current == ' ' || current == '\n') { + int32_t length = end - start; + Clay_Dimensions dimensions = CLAY__DEFAULT_STRUCT; + if (length > 0) { + dimensions = Clay__MeasureText(CLAY__INIT(Clay_StringSlice) {.length = length, .chars = &text->chars[start], .baseChars = text->chars}, config, context->measureTextUserData); + } + measured->minWidth = CLAY__MAX(dimensions.width, measured->minWidth); + measuredHeight = CLAY__MAX(measuredHeight, dimensions.height); + if (current == ' ') { + dimensions.width += spaceWidth; + previousWord = Clay__AddMeasuredWord(CLAY__INIT(Clay__MeasuredWord) { .startOffset = start, .length = length + 1, .width = dimensions.width, .next = -1 }, previousWord); + lineWidth += dimensions.width; + } + if (current == '\n') { + if (length > 0) { + previousWord = Clay__AddMeasuredWord(CLAY__INIT(Clay__MeasuredWord) { .startOffset = start, .length = length, .width = dimensions.width, .next = -1 }, previousWord); + } + previousWord = Clay__AddMeasuredWord(CLAY__INIT(Clay__MeasuredWord) { .startOffset = end + 1, .length = 0, .width = 0, .next = -1 }, previousWord); + lineWidth += dimensions.width; + measuredWidth = CLAY__MAX(lineWidth, measuredWidth); + measured->containsNewlines = true; + lineWidth = 0; + } + start = end + 1; + } + end++; + } + if (end - start > 0) { + Clay_Dimensions dimensions = Clay__MeasureText(CLAY__INIT(Clay_StringSlice) { .length = end - start, .chars = &text->chars[start], .baseChars = text->chars }, config, context->measureTextUserData); + Clay__AddMeasuredWord(CLAY__INIT(Clay__MeasuredWord) { .startOffset = start, .length = end - start, .width = dimensions.width, .next = -1 }, previousWord); + lineWidth += dimensions.width; + measuredHeight = CLAY__MAX(measuredHeight, dimensions.height); + measured->minWidth = CLAY__MAX(dimensions.width, measured->minWidth); + } + measuredWidth = CLAY__MAX(lineWidth, measuredWidth) - config->letterSpacing; + + measured->measuredWordsStartIndex = tempWord.next; + measured->unwrappedDimensions.width = measuredWidth; + measured->unwrappedDimensions.height = measuredHeight; + + if (elementIndexPrevious != 0) { + Clay__MeasureTextCacheItemArray_Get(&context->measureTextHashMapInternal, elementIndexPrevious)->nextIndex = newItemIndex; + } else { + context->measureTextHashMap.internalArray[hashBucket] = newItemIndex; + } + return measured; +} + +bool Clay__PointIsInsideRect(Clay_Vector2 point, Clay_BoundingBox rect) { + return point.x >= rect.x && point.x <= rect.x + rect.width && point.y >= rect.y && point.y <= rect.y + rect.height; +} + +Clay_LayoutElementHashMapItem* Clay__AddHashMapItem(Clay_ElementId elementId, Clay_LayoutElement* layoutElement) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->layoutElementsHashMapInternal.length == context->layoutElementsHashMapInternal.capacity - 1) { + return NULL; + } + Clay_LayoutElementHashMapItem item = { .elementId = elementId, .layoutElement = layoutElement, .nextIndex = -1, .generation = context->generation + 1 }; + uint32_t hashBucket = elementId.id % context->layoutElementsHashMap.capacity; + int32_t hashItemPrevious = -1; + int32_t hashItemIndex = context->layoutElementsHashMap.internalArray[hashBucket]; + while (hashItemIndex != -1) { // Just replace collision, not a big deal - leave it up to the end user + Clay_LayoutElementHashMapItem *hashItem = Clay__LayoutElementHashMapItemArray_Get(&context->layoutElementsHashMapInternal, hashItemIndex); + if (hashItem->elementId.id == elementId.id) { // Collision - resolve based on generation + item.nextIndex = hashItem->nextIndex; + if (hashItem->generation <= context->generation) { // First collision - assume this is the "same" element + hashItem->elementId = elementId; // Make sure to copy this across. If the stringId reference has changed, we should update the hash item to use the new one. + hashItem->generation = context->generation + 1; + hashItem->layoutElement = layoutElement; + hashItem->debugData->collision = false; + hashItem->onHoverFunction = NULL; + hashItem->hoverFunctionUserData = 0; + } else { // Multiple collisions this frame - two elements have the same ID + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_DUPLICATE_ID, + .errorText = CLAY_STRING("An element with this ID was already previously declared during this layout."), + .userData = context->errorHandler.userData }); + if (context->debugModeEnabled) { + hashItem->debugData->collision = true; + } + } + return hashItem; + } + hashItemPrevious = hashItemIndex; + hashItemIndex = hashItem->nextIndex; + } + Clay_LayoutElementHashMapItem *hashItem = Clay__LayoutElementHashMapItemArray_Add(&context->layoutElementsHashMapInternal, item); + hashItem->debugData = Clay__DebugElementDataArray_Add(&context->debugElementData, CLAY__INIT(Clay__DebugElementData) CLAY__DEFAULT_STRUCT); + if (hashItemPrevious != -1) { + Clay__LayoutElementHashMapItemArray_Get(&context->layoutElementsHashMapInternal, hashItemPrevious)->nextIndex = (int32_t)context->layoutElementsHashMapInternal.length - 1; + } else { + context->layoutElementsHashMap.internalArray[hashBucket] = (int32_t)context->layoutElementsHashMapInternal.length - 1; + } + return hashItem; +} + +Clay_LayoutElementHashMapItem *Clay__GetHashMapItem(uint32_t id) { + Clay_Context* context = Clay_GetCurrentContext(); + uint32_t hashBucket = id % context->layoutElementsHashMap.capacity; + int32_t elementIndex = context->layoutElementsHashMap.internalArray[hashBucket]; + while (elementIndex != -1) { + Clay_LayoutElementHashMapItem *hashEntry = Clay__LayoutElementHashMapItemArray_Get(&context->layoutElementsHashMapInternal, elementIndex); + if (hashEntry->elementId.id == id) { + return hashEntry; + } + elementIndex = hashEntry->nextIndex; + } + return &Clay_LayoutElementHashMapItem_DEFAULT; +} + +Clay_ElementId Clay__GenerateIdForAnonymousElement(Clay_LayoutElement *openLayoutElement) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay_LayoutElement *parentElement = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&context->openLayoutElementStack, context->openLayoutElementStack.length - 2)); + Clay_ElementId elementId = Clay__HashNumber(parentElement->childrenOrTextContent.children.length, parentElement->id); + openLayoutElement->id = elementId.id; + Clay__AddHashMapItem(elementId, openLayoutElement); + Clay__StringArray_Add(&context->layoutElementIdStrings, elementId.stringId); + return elementId; +} + +bool Clay__ElementHasConfig(Clay_LayoutElement *layoutElement, Clay__ElementConfigType type) { + for (int32_t i = 0; i < layoutElement->elementConfigs.length; i++) { + if (Clay__ElementConfigArraySlice_Get(&layoutElement->elementConfigs, i)->type == type) { + return true; + } + } + return false; +} + +void Clay__UpdateAspectRatioBox(Clay_LayoutElement *layoutElement) { + for (int32_t j = 0; j < layoutElement->elementConfigs.length; j++) { + Clay_ElementConfig *config = Clay__ElementConfigArraySlice_Get(&layoutElement->elementConfigs, j); + if (config->type == CLAY__ELEMENT_CONFIG_TYPE_ASPECT) { + Clay_AspectRatioElementConfig *aspectConfig = config->config.aspectRatioElementConfig; + if (aspectConfig->aspectRatio == 0) { + break; + } + if (layoutElement->dimensions.width == 0 && layoutElement->dimensions.height != 0) { + layoutElement->dimensions.width = layoutElement->dimensions.height * aspectConfig->aspectRatio; + } else if (layoutElement->dimensions.width != 0 && layoutElement->dimensions.height == 0) { + layoutElement->dimensions.height = layoutElement->dimensions.width * (1 / aspectConfig->aspectRatio); + } + break; + } + } +} + +void Clay__CloseElement(void) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->booleanWarnings.maxElementsExceeded) { + return; + } + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + Clay_LayoutConfig *layoutConfig = openLayoutElement->layoutConfig; + if (!layoutConfig) { + openLayoutElement->layoutConfig = &Clay_LayoutConfig_DEFAULT; + layoutConfig = &Clay_LayoutConfig_DEFAULT; + } + bool elementHasClipHorizontal = false; + bool elementHasClipVertical = false; + for (int32_t i = 0; i < openLayoutElement->elementConfigs.length; i++) { + Clay_ElementConfig *config = Clay__ElementConfigArraySlice_Get(&openLayoutElement->elementConfigs, i); + if (config->type == CLAY__ELEMENT_CONFIG_TYPE_CLIP) { + elementHasClipHorizontal = config->config.clipElementConfig->horizontal; + elementHasClipVertical = config->config.clipElementConfig->vertical; + context->openClipElementStack.length--; + break; + } else if (config->type == CLAY__ELEMENT_CONFIG_TYPE_FLOATING) { + context->openClipElementStack.length--; + } + } + + float leftRightPadding = (float)(layoutConfig->padding.left + layoutConfig->padding.right); + float topBottomPadding = (float)(layoutConfig->padding.top + layoutConfig->padding.bottom); + + // Attach children to the current open element + openLayoutElement->childrenOrTextContent.children.elements = &context->layoutElementChildren.internalArray[context->layoutElementChildren.length]; + if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { + openLayoutElement->dimensions.width = leftRightPadding; + openLayoutElement->minDimensions.width = leftRightPadding; + for (int32_t i = 0; i < openLayoutElement->childrenOrTextContent.children.length; i++) { + int32_t childIndex = Clay__int32_tArray_GetValue(&context->layoutElementChildrenBuffer, (int)context->layoutElementChildrenBuffer.length - openLayoutElement->childrenOrTextContent.children.length + i); + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&context->layoutElements, childIndex); + openLayoutElement->dimensions.width += child->dimensions.width; + openLayoutElement->dimensions.height = CLAY__MAX(openLayoutElement->dimensions.height, child->dimensions.height + topBottomPadding); + // Minimum size of child elements doesn't matter to clip containers as they can shrink and hide their contents + if (!elementHasClipHorizontal) { + openLayoutElement->minDimensions.width += child->minDimensions.width; + } + if (!elementHasClipVertical) { + openLayoutElement->minDimensions.height = CLAY__MAX(openLayoutElement->minDimensions.height, child->minDimensions.height + topBottomPadding); + } + Clay__int32_tArray_Add(&context->layoutElementChildren, childIndex); + } + float childGap = (float)(CLAY__MAX(openLayoutElement->childrenOrTextContent.children.length - 1, 0) * layoutConfig->childGap); + openLayoutElement->dimensions.width += childGap; + if (!elementHasClipHorizontal) { + openLayoutElement->minDimensions.width += childGap; + } + } + else if (layoutConfig->layoutDirection == CLAY_TOP_TO_BOTTOM) { + openLayoutElement->dimensions.height = topBottomPadding; + openLayoutElement->minDimensions.height = topBottomPadding; + for (int32_t i = 0; i < openLayoutElement->childrenOrTextContent.children.length; i++) { + int32_t childIndex = Clay__int32_tArray_GetValue(&context->layoutElementChildrenBuffer, (int)context->layoutElementChildrenBuffer.length - openLayoutElement->childrenOrTextContent.children.length + i); + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&context->layoutElements, childIndex); + openLayoutElement->dimensions.height += child->dimensions.height; + openLayoutElement->dimensions.width = CLAY__MAX(openLayoutElement->dimensions.width, child->dimensions.width + leftRightPadding); + // Minimum size of child elements doesn't matter to clip containers as they can shrink and hide their contents + if (!elementHasClipVertical) { + openLayoutElement->minDimensions.height += child->minDimensions.height; + } + if (!elementHasClipHorizontal) { + openLayoutElement->minDimensions.width = CLAY__MAX(openLayoutElement->minDimensions.width, child->minDimensions.width + leftRightPadding); + } + Clay__int32_tArray_Add(&context->layoutElementChildren, childIndex); + } + float childGap = (float)(CLAY__MAX(openLayoutElement->childrenOrTextContent.children.length - 1, 0) * layoutConfig->childGap); + openLayoutElement->dimensions.height += childGap; + if (!elementHasClipVertical) { + openLayoutElement->minDimensions.height += childGap; + } + } + + context->layoutElementChildrenBuffer.length -= openLayoutElement->childrenOrTextContent.children.length; + + // Clamp element min and max width to the values configured in the layout + if (layoutConfig->sizing.width.type != CLAY__SIZING_TYPE_PERCENT) { + if (layoutConfig->sizing.width.size.minMax.max <= 0) { // Set the max size if the user didn't specify, makes calculations easier + layoutConfig->sizing.width.size.minMax.max = CLAY__MAXFLOAT; + } + openLayoutElement->dimensions.width = CLAY__MIN(CLAY__MAX(openLayoutElement->dimensions.width, layoutConfig->sizing.width.size.minMax.min), layoutConfig->sizing.width.size.minMax.max); + openLayoutElement->minDimensions.width = CLAY__MIN(CLAY__MAX(openLayoutElement->minDimensions.width, layoutConfig->sizing.width.size.minMax.min), layoutConfig->sizing.width.size.minMax.max); + } else { + openLayoutElement->dimensions.width = 0; + } + + // Clamp element min and max height to the values configured in the layout + if (layoutConfig->sizing.height.type != CLAY__SIZING_TYPE_PERCENT) { + if (layoutConfig->sizing.height.size.minMax.max <= 0) { // Set the max size if the user didn't specify, makes calculations easier + layoutConfig->sizing.height.size.minMax.max = CLAY__MAXFLOAT; + } + openLayoutElement->dimensions.height = CLAY__MIN(CLAY__MAX(openLayoutElement->dimensions.height, layoutConfig->sizing.height.size.minMax.min), layoutConfig->sizing.height.size.minMax.max); + openLayoutElement->minDimensions.height = CLAY__MIN(CLAY__MAX(openLayoutElement->minDimensions.height, layoutConfig->sizing.height.size.minMax.min), layoutConfig->sizing.height.size.minMax.max); + } else { + openLayoutElement->dimensions.height = 0; + } + + Clay__UpdateAspectRatioBox(openLayoutElement); + + bool elementIsFloating = Clay__ElementHasConfig(openLayoutElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING); + + // Close the currently open element + int32_t closingElementIndex = Clay__int32_tArray_RemoveSwapback(&context->openLayoutElementStack, (int)context->openLayoutElementStack.length - 1); + openLayoutElement = Clay__GetOpenLayoutElement(); + + if (!elementIsFloating && context->openLayoutElementStack.length > 1) { + openLayoutElement->childrenOrTextContent.children.length++; + Clay__int32_tArray_Add(&context->layoutElementChildrenBuffer, closingElementIndex); + } +} + +bool Clay__MemCmp(const char *s1, const char *s2, int32_t length); +#if !defined(CLAY_DISABLE_SIMD) && (defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64)) + bool Clay__MemCmp(const char *s1, const char *s2, int32_t length) { + while (length >= 16) { + __m128i v1 = _mm_loadu_si128((const __m128i *)s1); + __m128i v2 = _mm_loadu_si128((const __m128i *)s2); + + if (_mm_movemask_epi8(_mm_cmpeq_epi8(v1, v2)) != 0xFFFF) { // If any byte differs + return false; + } + + s1 += 16; + s2 += 16; + length -= 16; + } + + // Handle remaining bytes + while (length--) { + if (*s1 != *s2) { + return false; + } + s1++; + s2++; + } + + return true; + } +#elif !defined(CLAY_DISABLE_SIMD) && defined(__aarch64__) + bool Clay__MemCmp(const char *s1, const char *s2, int32_t length) { + while (length >= 16) { + uint8x16_t v1 = vld1q_u8((const uint8_t *)s1); + uint8x16_t v2 = vld1q_u8((const uint8_t *)s2); + + // Compare vectors + if (vminvq_u32(vreinterpretq_u32_u8(vceqq_u8(v1, v2))) != 0xFFFFFFFF) { // If there's a difference + return false; + } + + s1 += 16; + s2 += 16; + length -= 16; + } + + // Handle remaining bytes + while (length--) { + if (*s1 != *s2) { + return false; + } + s1++; + s2++; + } + + return true; + } +#else + bool Clay__MemCmp(const char *s1, const char *s2, int32_t length) { + for (int32_t i = 0; i < length; i++) { + if (s1[i] != s2[i]) { + return false; + } + } + return true; + } +#endif + +void Clay__OpenElement(void) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->layoutElements.length == context->layoutElements.capacity - 1 || context->booleanWarnings.maxElementsExceeded) { + context->booleanWarnings.maxElementsExceeded = true; + return; + } + Clay_LayoutElement layoutElement = CLAY__DEFAULT_STRUCT; + Clay_LayoutElement* openLayoutElement = Clay_LayoutElementArray_Add(&context->layoutElements, layoutElement); + Clay__int32_tArray_Add(&context->openLayoutElementStack, context->layoutElements.length - 1); + Clay__GenerateIdForAnonymousElement(openLayoutElement); + if (context->openClipElementStack.length > 0) { + Clay__int32_tArray_Set(&context->layoutElementClipElementIds, context->layoutElements.length - 1, Clay__int32_tArray_GetValue(&context->openClipElementStack, (int)context->openClipElementStack.length - 1)); + } else { + Clay__int32_tArray_Set(&context->layoutElementClipElementIds, context->layoutElements.length - 1, 0); + } +} + +void Clay__OpenElementWithId(Clay_ElementId elementId) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->layoutElements.length == context->layoutElements.capacity - 1 || context->booleanWarnings.maxElementsExceeded) { + context->booleanWarnings.maxElementsExceeded = true; + return; + } + Clay_LayoutElement layoutElement = CLAY__DEFAULT_STRUCT; + layoutElement.id = elementId.id; + Clay_LayoutElement * openLayoutElement = Clay_LayoutElementArray_Add(&context->layoutElements, layoutElement); + Clay__int32_tArray_Add(&context->openLayoutElementStack, context->layoutElements.length - 1); + Clay__AddHashMapItem(elementId, openLayoutElement); + Clay__StringArray_Add(&context->layoutElementIdStrings, elementId.stringId); + if (context->openClipElementStack.length > 0) { + Clay__int32_tArray_Set(&context->layoutElementClipElementIds, context->layoutElements.length - 1, Clay__int32_tArray_GetValue(&context->openClipElementStack, (int)context->openClipElementStack.length - 1)); + } else { + Clay__int32_tArray_Set(&context->layoutElementClipElementIds, context->layoutElements.length - 1, 0); + } +} + +void Clay__OpenTextElement(Clay_String text, Clay_TextElementConfig *textConfig) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->layoutElements.length == context->layoutElements.capacity - 1 || context->booleanWarnings.maxElementsExceeded) { + context->booleanWarnings.maxElementsExceeded = true; + return; + } + Clay_LayoutElement *parentElement = Clay__GetOpenLayoutElement(); + + Clay_LayoutElement layoutElement = CLAY__DEFAULT_STRUCT; + Clay_LayoutElement *textElement = Clay_LayoutElementArray_Add(&context->layoutElements, layoutElement); + if (context->openClipElementStack.length > 0) { + Clay__int32_tArray_Set(&context->layoutElementClipElementIds, context->layoutElements.length - 1, Clay__int32_tArray_GetValue(&context->openClipElementStack, (int)context->openClipElementStack.length - 1)); + } else { + Clay__int32_tArray_Set(&context->layoutElementClipElementIds, context->layoutElements.length - 1, 0); + } + + Clay__int32_tArray_Add(&context->layoutElementChildrenBuffer, context->layoutElements.length - 1); + Clay__MeasureTextCacheItem *textMeasured = Clay__MeasureTextCached(&text, textConfig); + Clay_ElementId elementId = Clay__HashNumber(parentElement->childrenOrTextContent.children.length, parentElement->id); + textElement->id = elementId.id; + Clay__AddHashMapItem(elementId, textElement); + Clay__StringArray_Add(&context->layoutElementIdStrings, elementId.stringId); + Clay_Dimensions textDimensions = { .width = textMeasured->unwrappedDimensions.width, .height = textConfig->lineHeight > 0 ? (float)textConfig->lineHeight : textMeasured->unwrappedDimensions.height }; + textElement->dimensions = textDimensions; + textElement->minDimensions = CLAY__INIT(Clay_Dimensions) { .width = textMeasured->minWidth, .height = textDimensions.height }; + textElement->childrenOrTextContent.textElementData = Clay__TextElementDataArray_Add(&context->textElementData, CLAY__INIT(Clay__TextElementData) { .text = text, .preferredDimensions = textMeasured->unwrappedDimensions, .elementIndex = context->layoutElements.length - 1 }); + textElement->elementConfigs = CLAY__INIT(Clay__ElementConfigArraySlice) { + .length = 1, + .internalArray = Clay__ElementConfigArray_Add(&context->elementConfigs, CLAY__INIT(Clay_ElementConfig) { .type = CLAY__ELEMENT_CONFIG_TYPE_TEXT, .config = { .textElementConfig = textConfig }}) + }; + textElement->layoutConfig = &CLAY_LAYOUT_DEFAULT; + parentElement->childrenOrTextContent.children.length++; +} + +void Clay__ConfigureOpenElementPtr(const Clay_ElementDeclaration *declaration) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + openLayoutElement->layoutConfig = Clay__StoreLayoutConfig(declaration->layout); + if ((declaration->layout.sizing.width.type == CLAY__SIZING_TYPE_PERCENT && declaration->layout.sizing.width.size.percent > 1) || (declaration->layout.sizing.height.type == CLAY__SIZING_TYPE_PERCENT && declaration->layout.sizing.height.size.percent > 1)) { + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_PERCENTAGE_OVER_1, + .errorText = CLAY_STRING("An element was configured with CLAY_SIZING_PERCENT, but the provided percentage value was over 1.0. Clay expects a value between 0 and 1, i.e. 20% is 0.2."), + .userData = context->errorHandler.userData }); + } + + openLayoutElement->elementConfigs.internalArray = &context->elementConfigs.internalArray[context->elementConfigs.length]; + Clay_SharedElementConfig *sharedConfig = NULL; + if (declaration->backgroundColor.a > 0) { + sharedConfig = Clay__StoreSharedElementConfig(CLAY__INIT(Clay_SharedElementConfig) { .backgroundColor = declaration->backgroundColor }); + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .sharedElementConfig = sharedConfig }, CLAY__ELEMENT_CONFIG_TYPE_SHARED); + } + if (!Clay__MemCmp((char *)(&declaration->cornerRadius), (char *)(&Clay__CornerRadius_DEFAULT), sizeof(Clay_CornerRadius))) { + if (sharedConfig) { + sharedConfig->cornerRadius = declaration->cornerRadius; + } else { + sharedConfig = Clay__StoreSharedElementConfig(CLAY__INIT(Clay_SharedElementConfig) { .cornerRadius = declaration->cornerRadius }); + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .sharedElementConfig = sharedConfig }, CLAY__ELEMENT_CONFIG_TYPE_SHARED); + } + } + if (declaration->userData != 0) { + if (sharedConfig) { + sharedConfig->userData = declaration->userData; + } else { + sharedConfig = Clay__StoreSharedElementConfig(CLAY__INIT(Clay_SharedElementConfig) { .userData = declaration->userData }); + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .sharedElementConfig = sharedConfig }, CLAY__ELEMENT_CONFIG_TYPE_SHARED); + } + } + if (declaration->image.imageData) { + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .imageElementConfig = Clay__StoreImageElementConfig(declaration->image) }, CLAY__ELEMENT_CONFIG_TYPE_IMAGE); + } + if (declaration->aspectRatio.aspectRatio > 0) { + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .aspectRatioElementConfig = Clay__StoreAspectRatioElementConfig(declaration->aspectRatio) }, CLAY__ELEMENT_CONFIG_TYPE_ASPECT); + Clay__int32_tArray_Add(&context->aspectRatioElementIndexes, context->layoutElements.length - 1); + } + if (declaration->floating.attachTo != CLAY_ATTACH_TO_NONE) { + Clay_FloatingElementConfig floatingConfig = declaration->floating; + // This looks dodgy but because of the auto generated root element the depth of the tree will always be at least 2 here + Clay_LayoutElement *hierarchicalParent = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&context->openLayoutElementStack, context->openLayoutElementStack.length - 2)); + if (hierarchicalParent) { + uint32_t clipElementId = 0; + if (declaration->floating.attachTo == CLAY_ATTACH_TO_PARENT) { + // Attach to the element's direct hierarchical parent + floatingConfig.parentId = hierarchicalParent->id; + if (context->openClipElementStack.length > 0) { + clipElementId = Clay__int32_tArray_GetValue(&context->openClipElementStack, (int)context->openClipElementStack.length - 1); + } + } else if (declaration->floating.attachTo == CLAY_ATTACH_TO_ELEMENT_WITH_ID) { + Clay_LayoutElementHashMapItem *parentItem = Clay__GetHashMapItem(floatingConfig.parentId); + if (parentItem == &Clay_LayoutElementHashMapItem_DEFAULT) { + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_FLOATING_CONTAINER_PARENT_NOT_FOUND, + .errorText = CLAY_STRING("A floating element was declared with a parentId, but no element with that ID was found."), + .userData = context->errorHandler.userData }); + } else { + clipElementId = Clay__int32_tArray_GetValue(&context->layoutElementClipElementIds, (int32_t)(parentItem->layoutElement - context->layoutElements.internalArray)); + } + } else if (declaration->floating.attachTo == CLAY_ATTACH_TO_ROOT) { + floatingConfig.parentId = Clay__HashString(CLAY_STRING("Clay__RootContainer"), 0).id; + } + if (declaration->floating.clipTo == CLAY_CLIP_TO_NONE) { + clipElementId = 0; + } + int32_t currentElementIndex = Clay__int32_tArray_GetValue(&context->openLayoutElementStack, context->openLayoutElementStack.length - 1); + Clay__int32_tArray_Set(&context->layoutElementClipElementIds, currentElementIndex, clipElementId); + Clay__int32_tArray_Add(&context->openClipElementStack, clipElementId); + Clay__LayoutElementTreeRootArray_Add(&context->layoutElementTreeRoots, CLAY__INIT(Clay__LayoutElementTreeRoot) { + .layoutElementIndex = Clay__int32_tArray_GetValue(&context->openLayoutElementStack, context->openLayoutElementStack.length - 1), + .parentId = floatingConfig.parentId, + .clipElementId = clipElementId, + .zIndex = floatingConfig.zIndex, + }); + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .floatingElementConfig = Clay__StoreFloatingElementConfig(floatingConfig) }, CLAY__ELEMENT_CONFIG_TYPE_FLOATING); + } + } + if (declaration->custom.customData) { + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .customElementConfig = Clay__StoreCustomElementConfig(declaration->custom) }, CLAY__ELEMENT_CONFIG_TYPE_CUSTOM); + } + + if (declaration->clip.horizontal | declaration->clip.vertical) { + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .clipElementConfig = Clay__StoreClipElementConfig(declaration->clip) }, CLAY__ELEMENT_CONFIG_TYPE_CLIP); + Clay__int32_tArray_Add(&context->openClipElementStack, (int)openLayoutElement->id); + // Retrieve or create cached data to track scroll position across frames + Clay__ScrollContainerDataInternal *scrollOffset = CLAY__NULL; + for (int32_t i = 0; i < context->scrollContainerDatas.length; i++) { + Clay__ScrollContainerDataInternal *mapping = Clay__ScrollContainerDataInternalArray_Get(&context->scrollContainerDatas, i); + if (openLayoutElement->id == mapping->elementId) { + scrollOffset = mapping; + scrollOffset->layoutElement = openLayoutElement; + scrollOffset->openThisFrame = true; + } + } + if (!scrollOffset) { + scrollOffset = Clay__ScrollContainerDataInternalArray_Add(&context->scrollContainerDatas, CLAY__INIT(Clay__ScrollContainerDataInternal){.layoutElement = openLayoutElement, .scrollOrigin = {-1,-1}, .elementId = openLayoutElement->id, .openThisFrame = true}); + } + if (context->externalScrollHandlingEnabled) { + scrollOffset->scrollPosition = Clay__QueryScrollOffset(scrollOffset->elementId, context->queryScrollOffsetUserData); + } + } + if (!Clay__MemCmp((char *)(&declaration->border.width), (char *)(&Clay__BorderWidth_DEFAULT), sizeof(Clay_BorderWidth))) { + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .borderElementConfig = Clay__StoreBorderElementConfig(declaration->border) }, CLAY__ELEMENT_CONFIG_TYPE_BORDER); + } +} + +void Clay__ConfigureOpenElement(const Clay_ElementDeclaration declaration) { + Clay__ConfigureOpenElementPtr(&declaration); +} + +void Clay__InitializeEphemeralMemory(Clay_Context* context) { + int32_t maxElementCount = context->maxElementCount; + // Ephemeral Memory - reset every frame + Clay_Arena *arena = &context->internalArena; + arena->nextAllocation = context->arenaResetOffset; + + context->layoutElementChildrenBuffer = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->layoutElements = Clay_LayoutElementArray_Allocate_Arena(maxElementCount, arena); + context->warnings = Clay__WarningArray_Allocate_Arena(100, arena); + + context->layoutConfigs = Clay__LayoutConfigArray_Allocate_Arena(maxElementCount, arena); + context->elementConfigs = Clay__ElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->textElementConfigs = Clay__TextElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->aspectRatioElementConfigs = Clay__AspectRatioElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->imageElementConfigs = Clay__ImageElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->floatingElementConfigs = Clay__FloatingElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->clipElementConfigs = Clay__ClipElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->customElementConfigs = Clay__CustomElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->borderElementConfigs = Clay__BorderElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->sharedElementConfigs = Clay__SharedElementConfigArray_Allocate_Arena(maxElementCount, arena); + + context->layoutElementIdStrings = Clay__StringArray_Allocate_Arena(maxElementCount, arena); + context->wrappedTextLines = Clay__WrappedTextLineArray_Allocate_Arena(maxElementCount, arena); + context->layoutElementTreeNodeArray1 = Clay__LayoutElementTreeNodeArray_Allocate_Arena(maxElementCount, arena); + context->layoutElementTreeRoots = Clay__LayoutElementTreeRootArray_Allocate_Arena(maxElementCount, arena); + context->layoutElementChildren = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->openLayoutElementStack = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->textElementData = Clay__TextElementDataArray_Allocate_Arena(maxElementCount, arena); + context->aspectRatioElementIndexes = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->renderCommands = Clay_RenderCommandArray_Allocate_Arena(maxElementCount, arena); + context->treeNodeVisited = Clay__boolArray_Allocate_Arena(maxElementCount, arena); + context->treeNodeVisited.length = context->treeNodeVisited.capacity; // This array is accessed directly rather than behaving as a list + context->openClipElementStack = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->reusableElementIndexBuffer = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->layoutElementClipElementIds = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->dynamicStringData = Clay__charArray_Allocate_Arena(maxElementCount, arena); +} + +void Clay__InitializePersistentMemory(Clay_Context* context) { + // Persistent memory - initialized once and not reset + int32_t maxElementCount = context->maxElementCount; + int32_t maxMeasureTextCacheWordCount = context->maxMeasureTextCacheWordCount; + Clay_Arena *arena = &context->internalArena; + + context->scrollContainerDatas = Clay__ScrollContainerDataInternalArray_Allocate_Arena(100, arena); + context->layoutElementsHashMapInternal = Clay__LayoutElementHashMapItemArray_Allocate_Arena(maxElementCount, arena); + context->layoutElementsHashMap = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->measureTextHashMapInternal = Clay__MeasureTextCacheItemArray_Allocate_Arena(maxElementCount, arena); + context->measureTextHashMapInternalFreeList = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->measuredWordsFreeList = Clay__int32_tArray_Allocate_Arena(maxMeasureTextCacheWordCount, arena); + context->measureTextHashMap = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->measuredWords = Clay__MeasuredWordArray_Allocate_Arena(maxMeasureTextCacheWordCount, arena); + context->pointerOverIds = Clay_ElementIdArray_Allocate_Arena(maxElementCount, arena); + context->debugElementData = Clay__DebugElementDataArray_Allocate_Arena(maxElementCount, arena); + context->arenaResetOffset = arena->nextAllocation; +} + +const float CLAY__EPSILON = 0.01; + +bool Clay__FloatEqual(float left, float right) { + float subtracted = left - right; + return subtracted < CLAY__EPSILON && subtracted > -CLAY__EPSILON; +} + +void Clay__SizeContainersAlongAxis(bool xAxis) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay__int32_tArray bfsBuffer = context->layoutElementChildrenBuffer; + Clay__int32_tArray resizableContainerBuffer = context->openLayoutElementStack; + for (int32_t rootIndex = 0; rootIndex < context->layoutElementTreeRoots.length; ++rootIndex) { + bfsBuffer.length = 0; + Clay__LayoutElementTreeRoot *root = Clay__LayoutElementTreeRootArray_Get(&context->layoutElementTreeRoots, rootIndex); + Clay_LayoutElement *rootElement = Clay_LayoutElementArray_Get(&context->layoutElements, (int)root->layoutElementIndex); + Clay__int32_tArray_Add(&bfsBuffer, (int32_t)root->layoutElementIndex); + + // Size floating containers to their parents + if (Clay__ElementHasConfig(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING)) { + Clay_FloatingElementConfig *floatingElementConfig = Clay__FindElementConfigWithType(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING).floatingElementConfig; + Clay_LayoutElementHashMapItem *parentItem = Clay__GetHashMapItem(floatingElementConfig->parentId); + if (parentItem && parentItem != &Clay_LayoutElementHashMapItem_DEFAULT) { + Clay_LayoutElement *parentLayoutElement = parentItem->layoutElement; + switch (rootElement->layoutConfig->sizing.width.type) { + case CLAY__SIZING_TYPE_GROW: { + rootElement->dimensions.width = parentLayoutElement->dimensions.width; + break; + } + case CLAY__SIZING_TYPE_PERCENT: { + rootElement->dimensions.width = parentLayoutElement->dimensions.width * rootElement->layoutConfig->sizing.width.size.percent; + break; + } + default: break; + } + switch (rootElement->layoutConfig->sizing.height.type) { + case CLAY__SIZING_TYPE_GROW: { + rootElement->dimensions.height = parentLayoutElement->dimensions.height; + break; + } + case CLAY__SIZING_TYPE_PERCENT: { + rootElement->dimensions.height = parentLayoutElement->dimensions.height * rootElement->layoutConfig->sizing.height.size.percent; + break; + } + default: break; + } + } + } + + if (rootElement->layoutConfig->sizing.width.type != CLAY__SIZING_TYPE_PERCENT) { + rootElement->dimensions.width = CLAY__MIN(CLAY__MAX(rootElement->dimensions.width, rootElement->layoutConfig->sizing.width.size.minMax.min), rootElement->layoutConfig->sizing.width.size.minMax.max); + } + if (rootElement->layoutConfig->sizing.height.type != CLAY__SIZING_TYPE_PERCENT) { + rootElement->dimensions.height = CLAY__MIN(CLAY__MAX(rootElement->dimensions.height, rootElement->layoutConfig->sizing.height.size.minMax.min), rootElement->layoutConfig->sizing.height.size.minMax.max); + } + + for (int32_t i = 0; i < bfsBuffer.length; ++i) { + int32_t parentIndex = Clay__int32_tArray_GetValue(&bfsBuffer, i); + Clay_LayoutElement *parent = Clay_LayoutElementArray_Get(&context->layoutElements, parentIndex); + Clay_LayoutConfig *parentStyleConfig = parent->layoutConfig; + int32_t growContainerCount = 0; + float parentSize = xAxis ? parent->dimensions.width : parent->dimensions.height; + float parentPadding = (float)(xAxis ? (parent->layoutConfig->padding.left + parent->layoutConfig->padding.right) : (parent->layoutConfig->padding.top + parent->layoutConfig->padding.bottom)); + float innerContentSize = 0, totalPaddingAndChildGaps = parentPadding; + bool sizingAlongAxis = (xAxis && parentStyleConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) || (!xAxis && parentStyleConfig->layoutDirection == CLAY_TOP_TO_BOTTOM); + resizableContainerBuffer.length = 0; + float parentChildGap = parentStyleConfig->childGap; + + for (int32_t childOffset = 0; childOffset < parent->childrenOrTextContent.children.length; childOffset++) { + int32_t childElementIndex = parent->childrenOrTextContent.children.elements[childOffset]; + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, childElementIndex); + Clay_SizingAxis childSizing = xAxis ? childElement->layoutConfig->sizing.width : childElement->layoutConfig->sizing.height; + float childSize = xAxis ? childElement->dimensions.width : childElement->dimensions.height; + + if (!Clay__ElementHasConfig(childElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) && childElement->childrenOrTextContent.children.length > 0) { + Clay__int32_tArray_Add(&bfsBuffer, childElementIndex); + } + + if (childSizing.type != CLAY__SIZING_TYPE_PERCENT + && childSizing.type != CLAY__SIZING_TYPE_FIXED + && (!Clay__ElementHasConfig(childElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) || (Clay__FindElementConfigWithType(childElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT).textElementConfig->wrapMode == CLAY_TEXT_WRAP_WORDS)) // todo too many loops +// && (xAxis || !Clay__ElementHasConfig(childElement, CLAY__ELEMENT_CONFIG_TYPE_ASPECT)) + ) { + Clay__int32_tArray_Add(&resizableContainerBuffer, childElementIndex); + } + + if (sizingAlongAxis) { + innerContentSize += (childSizing.type == CLAY__SIZING_TYPE_PERCENT ? 0 : childSize); + if (childSizing.type == CLAY__SIZING_TYPE_GROW) { + growContainerCount++; + } + if (childOffset > 0) { + innerContentSize += parentChildGap; // For children after index 0, the childAxisOffset is the gap from the previous child + totalPaddingAndChildGaps += parentChildGap; + } + } else { + innerContentSize = CLAY__MAX(childSize, innerContentSize); + } + } + + // Expand percentage containers to size + for (int32_t childOffset = 0; childOffset < parent->childrenOrTextContent.children.length; childOffset++) { + int32_t childElementIndex = parent->childrenOrTextContent.children.elements[childOffset]; + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, childElementIndex); + Clay_SizingAxis childSizing = xAxis ? childElement->layoutConfig->sizing.width : childElement->layoutConfig->sizing.height; + float *childSize = xAxis ? &childElement->dimensions.width : &childElement->dimensions.height; + if (childSizing.type == CLAY__SIZING_TYPE_PERCENT) { + *childSize = (parentSize - totalPaddingAndChildGaps) * childSizing.size.percent; + if (sizingAlongAxis) { + innerContentSize += *childSize; + } + Clay__UpdateAspectRatioBox(childElement); + } + } + + if (sizingAlongAxis) { + float sizeToDistribute = parentSize - parentPadding - innerContentSize; + // The content is too large, compress the children as much as possible + if (sizeToDistribute < 0) { + // If the parent clips content in this axis direction, don't compress children, just leave them alone + Clay_ClipElementConfig *clipElementConfig = Clay__FindElementConfigWithType(parent, CLAY__ELEMENT_CONFIG_TYPE_CLIP).clipElementConfig; + if (clipElementConfig) { + if (((xAxis && clipElementConfig->horizontal) || (!xAxis && clipElementConfig->vertical))) { + continue; + } + } + // Scrolling containers preferentially compress before others + while (sizeToDistribute < -CLAY__EPSILON && resizableContainerBuffer.length > 0) { + float largest = 0; + float secondLargest = 0; + float widthToAdd = sizeToDistribute; + for (int childIndex = 0; childIndex < resizableContainerBuffer.length; childIndex++) { + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&resizableContainerBuffer, childIndex)); + float childSize = xAxis ? child->dimensions.width : child->dimensions.height; + if (Clay__FloatEqual(childSize, largest)) { continue; } + if (childSize > largest) { + secondLargest = largest; + largest = childSize; + } + if (childSize < largest) { + secondLargest = CLAY__MAX(secondLargest, childSize); + widthToAdd = secondLargest - largest; + } + } + + widthToAdd = CLAY__MAX(widthToAdd, sizeToDistribute / resizableContainerBuffer.length); + + for (int childIndex = 0; childIndex < resizableContainerBuffer.length; childIndex++) { + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&resizableContainerBuffer, childIndex)); + float *childSize = xAxis ? &child->dimensions.width : &child->dimensions.height; + float minSize = xAxis ? child->minDimensions.width : child->minDimensions.height; + float previousWidth = *childSize; + if (Clay__FloatEqual(*childSize, largest)) { + *childSize += widthToAdd; + if (*childSize <= minSize) { + *childSize = minSize; + Clay__int32_tArray_RemoveSwapback(&resizableContainerBuffer, childIndex--); + } + sizeToDistribute -= (*childSize - previousWidth); + } + } + } + // The content is too small, allow SIZING_GROW containers to expand + } else if (sizeToDistribute > 0 && growContainerCount > 0) { + for (int childIndex = 0; childIndex < resizableContainerBuffer.length; childIndex++) { + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&resizableContainerBuffer, childIndex)); + Clay__SizingType childSizing = xAxis ? child->layoutConfig->sizing.width.type : child->layoutConfig->sizing.height.type; + if (childSizing != CLAY__SIZING_TYPE_GROW) { + Clay__int32_tArray_RemoveSwapback(&resizableContainerBuffer, childIndex--); + } + } + while (sizeToDistribute > CLAY__EPSILON && resizableContainerBuffer.length > 0) { + float smallest = CLAY__MAXFLOAT; + float secondSmallest = CLAY__MAXFLOAT; + float widthToAdd = sizeToDistribute; + for (int childIndex = 0; childIndex < resizableContainerBuffer.length; childIndex++) { + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&resizableContainerBuffer, childIndex)); + float childSize = xAxis ? child->dimensions.width : child->dimensions.height; + if (Clay__FloatEqual(childSize, smallest)) { continue; } + if (childSize < smallest) { + secondSmallest = smallest; + smallest = childSize; + } + if (childSize > smallest) { + secondSmallest = CLAY__MIN(secondSmallest, childSize); + widthToAdd = secondSmallest - smallest; + } + } + + widthToAdd = CLAY__MIN(widthToAdd, sizeToDistribute / resizableContainerBuffer.length); + + for (int childIndex = 0; childIndex < resizableContainerBuffer.length; childIndex++) { + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&resizableContainerBuffer, childIndex)); + float *childSize = xAxis ? &child->dimensions.width : &child->dimensions.height; + float maxSize = xAxis ? child->layoutConfig->sizing.width.size.minMax.max : child->layoutConfig->sizing.height.size.minMax.max; + float previousWidth = *childSize; + if (Clay__FloatEqual(*childSize, smallest)) { + *childSize += widthToAdd; + if (*childSize >= maxSize) { + *childSize = maxSize; + Clay__int32_tArray_RemoveSwapback(&resizableContainerBuffer, childIndex--); + } + sizeToDistribute -= (*childSize - previousWidth); + } + } + } + } + // Sizing along the non layout axis ("off axis") + } else { + for (int32_t childOffset = 0; childOffset < resizableContainerBuffer.length; childOffset++) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&resizableContainerBuffer, childOffset)); + Clay_SizingAxis childSizing = xAxis ? childElement->layoutConfig->sizing.width : childElement->layoutConfig->sizing.height; + float minSize = xAxis ? childElement->minDimensions.width : childElement->minDimensions.height; + float *childSize = xAxis ? &childElement->dimensions.width : &childElement->dimensions.height; + + float maxSize = parentSize - parentPadding; + // If we're laying out the children of a scroll panel, grow containers expand to the size of the inner content, not the outer container + if (Clay__ElementHasConfig(parent, CLAY__ELEMENT_CONFIG_TYPE_CLIP)) { + Clay_ClipElementConfig *clipElementConfig = Clay__FindElementConfigWithType(parent, CLAY__ELEMENT_CONFIG_TYPE_CLIP).clipElementConfig; + if (((xAxis && clipElementConfig->horizontal) || (!xAxis && clipElementConfig->vertical))) { + maxSize = CLAY__MAX(maxSize, innerContentSize); + } + } + if (childSizing.type == CLAY__SIZING_TYPE_GROW) { + *childSize = CLAY__MIN(maxSize, childSizing.size.minMax.max); + } + *childSize = CLAY__MAX(minSize, CLAY__MIN(*childSize, maxSize)); + } + } + } + } +} + +Clay_String Clay__IntToString(int32_t integer) { + if (integer == 0) { + return CLAY__INIT(Clay_String) { .length = 1, .chars = "0" }; + } + Clay_Context* context = Clay_GetCurrentContext(); + char *chars = (char *)(context->dynamicStringData.internalArray + context->dynamicStringData.length); + int32_t length = 0; + int32_t sign = integer; + + if (integer < 0) { + integer = -integer; + } + while (integer > 0) { + chars[length++] = (char)(integer % 10 + '0'); + integer /= 10; + } + + if (sign < 0) { + chars[length++] = '-'; + } + + // Reverse the string to get the correct order + for (int32_t j = 0, k = length - 1; j < k; j++, k--) { + char temp = chars[j]; + chars[j] = chars[k]; + chars[k] = temp; + } + context->dynamicStringData.length += length; + return CLAY__INIT(Clay_String) { .length = length, .chars = chars }; +} + +void Clay__AddRenderCommand(Clay_RenderCommand renderCommand) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->renderCommands.length < context->renderCommands.capacity - 1) { + Clay_RenderCommandArray_Add(&context->renderCommands, renderCommand); + } else { + if (!context->booleanWarnings.maxRenderCommandsExceeded) { + context->booleanWarnings.maxRenderCommandsExceeded = true; + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_ELEMENTS_CAPACITY_EXCEEDED, + .errorText = CLAY_STRING("Clay ran out of capacity while attempting to create render commands. This is usually caused by a large amount of wrapping text elements while close to the max element capacity. Try using Clay_SetMaxElementCount() with a higher value."), + .userData = context->errorHandler.userData }); + } + } +} + +bool Clay__ElementIsOffscreen(Clay_BoundingBox *boundingBox) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->disableCulling) { + return false; + } + + return (boundingBox->x > (float)context->layoutDimensions.width) || + (boundingBox->y > (float)context->layoutDimensions.height) || + (boundingBox->x + boundingBox->width < 0) || + (boundingBox->y + boundingBox->height < 0); +} + +void Clay__CalculateFinalLayout(void) { + Clay_Context* context = Clay_GetCurrentContext(); + // Calculate sizing along the X axis + Clay__SizeContainersAlongAxis(true); + + // Wrap text + for (int32_t textElementIndex = 0; textElementIndex < context->textElementData.length; ++textElementIndex) { + Clay__TextElementData *textElementData = Clay__TextElementDataArray_Get(&context->textElementData, textElementIndex); + textElementData->wrappedLines = CLAY__INIT(Clay__WrappedTextLineArraySlice) { .length = 0, .internalArray = &context->wrappedTextLines.internalArray[context->wrappedTextLines.length] }; + Clay_LayoutElement *containerElement = Clay_LayoutElementArray_Get(&context->layoutElements, (int)textElementData->elementIndex); + Clay_TextElementConfig *textConfig = Clay__FindElementConfigWithType(containerElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT).textElementConfig; + Clay__MeasureTextCacheItem *measureTextCacheItem = Clay__MeasureTextCached(&textElementData->text, textConfig); + float lineWidth = 0; + float lineHeight = textConfig->lineHeight > 0 ? (float)textConfig->lineHeight : textElementData->preferredDimensions.height; + int32_t lineLengthChars = 0; + int32_t lineStartOffset = 0; + if (!measureTextCacheItem->containsNewlines && textElementData->preferredDimensions.width <= containerElement->dimensions.width) { + Clay__WrappedTextLineArray_Add(&context->wrappedTextLines, CLAY__INIT(Clay__WrappedTextLine) { containerElement->dimensions, textElementData->text }); + textElementData->wrappedLines.length++; + continue; + } + float spaceWidth = Clay__MeasureText(CLAY__INIT(Clay_StringSlice) { .length = 1, .chars = CLAY__SPACECHAR.chars, .baseChars = CLAY__SPACECHAR.chars }, textConfig, context->measureTextUserData).width; + int32_t wordIndex = measureTextCacheItem->measuredWordsStartIndex; + while (wordIndex != -1) { + if (context->wrappedTextLines.length > context->wrappedTextLines.capacity - 1) { + break; + } + Clay__MeasuredWord *measuredWord = Clay__MeasuredWordArray_Get(&context->measuredWords, wordIndex); + // Only word on the line is too large, just render it anyway + if (lineLengthChars == 0 && lineWidth + measuredWord->width > containerElement->dimensions.width) { + Clay__WrappedTextLineArray_Add(&context->wrappedTextLines, CLAY__INIT(Clay__WrappedTextLine) { { measuredWord->width, lineHeight }, { .length = measuredWord->length, .chars = &textElementData->text.chars[measuredWord->startOffset] } }); + textElementData->wrappedLines.length++; + wordIndex = measuredWord->next; + lineStartOffset = measuredWord->startOffset + measuredWord->length; + } + // measuredWord->length == 0 means a newline character + else if (measuredWord->length == 0 || lineWidth + measuredWord->width > containerElement->dimensions.width) { + // Wrapped text lines list has overflowed, just render out the line + bool finalCharIsSpace = textElementData->text.chars[CLAY__MAX(lineStartOffset + lineLengthChars - 1, 0)] == ' '; + Clay__WrappedTextLineArray_Add(&context->wrappedTextLines, CLAY__INIT(Clay__WrappedTextLine) { { lineWidth + (finalCharIsSpace ? -spaceWidth : 0), lineHeight }, { .length = lineLengthChars + (finalCharIsSpace ? -1 : 0), .chars = &textElementData->text.chars[lineStartOffset] } }); + textElementData->wrappedLines.length++; + if (lineLengthChars == 0 || measuredWord->length == 0) { + wordIndex = measuredWord->next; + } + lineWidth = 0; + lineLengthChars = 0; + lineStartOffset = measuredWord->startOffset; + } else { + lineWidth += measuredWord->width + textConfig->letterSpacing; + lineLengthChars += measuredWord->length; + wordIndex = measuredWord->next; + } + } + if (lineLengthChars > 0) { + Clay__WrappedTextLineArray_Add(&context->wrappedTextLines, CLAY__INIT(Clay__WrappedTextLine) { { lineWidth - textConfig->letterSpacing, lineHeight }, {.length = lineLengthChars, .chars = &textElementData->text.chars[lineStartOffset] } }); + textElementData->wrappedLines.length++; + } + containerElement->dimensions.height = lineHeight * (float)textElementData->wrappedLines.length; + } + + // Scale vertical heights according to aspect ratio + for (int32_t i = 0; i < context->aspectRatioElementIndexes.length; ++i) { + Clay_LayoutElement* aspectElement = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&context->aspectRatioElementIndexes, i)); + Clay_AspectRatioElementConfig *config = Clay__FindElementConfigWithType(aspectElement, CLAY__ELEMENT_CONFIG_TYPE_ASPECT).aspectRatioElementConfig; + aspectElement->dimensions.height = (1 / config->aspectRatio) * aspectElement->dimensions.width; + aspectElement->layoutConfig->sizing.height.size.minMax.max = aspectElement->dimensions.height; + } + + // Propagate effect of text wrapping, aspect scaling etc. on height of parents + Clay__LayoutElementTreeNodeArray dfsBuffer = context->layoutElementTreeNodeArray1; + dfsBuffer.length = 0; + for (int32_t i = 0; i < context->layoutElementTreeRoots.length; ++i) { + Clay__LayoutElementTreeRoot *root = Clay__LayoutElementTreeRootArray_Get(&context->layoutElementTreeRoots, i); + context->treeNodeVisited.internalArray[dfsBuffer.length] = false; + Clay__LayoutElementTreeNodeArray_Add(&dfsBuffer, CLAY__INIT(Clay__LayoutElementTreeNode) { .layoutElement = Clay_LayoutElementArray_Get(&context->layoutElements, (int)root->layoutElementIndex) }); + } + while (dfsBuffer.length > 0) { + Clay__LayoutElementTreeNode *currentElementTreeNode = Clay__LayoutElementTreeNodeArray_Get(&dfsBuffer, (int)dfsBuffer.length - 1); + Clay_LayoutElement *currentElement = currentElementTreeNode->layoutElement; + if (!context->treeNodeVisited.internalArray[dfsBuffer.length - 1]) { + context->treeNodeVisited.internalArray[dfsBuffer.length - 1] = true; + // If the element has no children or is the container for a text element, don't bother inspecting it + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) || currentElement->childrenOrTextContent.children.length == 0) { + dfsBuffer.length--; + continue; + } + // Add the children to the DFS buffer (needs to be pushed in reverse so that stack traversal is in correct layout order) + for (int32_t i = 0; i < currentElement->childrenOrTextContent.children.length; i++) { + context->treeNodeVisited.internalArray[dfsBuffer.length] = false; + Clay__LayoutElementTreeNodeArray_Add(&dfsBuffer, CLAY__INIT(Clay__LayoutElementTreeNode) { .layoutElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[i]) }); + } + continue; + } + dfsBuffer.length--; + + // DFS node has been visited, this is on the way back up to the root + Clay_LayoutConfig *layoutConfig = currentElement->layoutConfig; + if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { + // Resize any parent containers that have grown in height along their non layout axis + for (int32_t j = 0; j < currentElement->childrenOrTextContent.children.length; ++j) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[j]); + float childHeightWithPadding = CLAY__MAX(childElement->dimensions.height + layoutConfig->padding.top + layoutConfig->padding.bottom, currentElement->dimensions.height); + currentElement->dimensions.height = CLAY__MIN(CLAY__MAX(childHeightWithPadding, layoutConfig->sizing.height.size.minMax.min), layoutConfig->sizing.height.size.minMax.max); + } + } else if (layoutConfig->layoutDirection == CLAY_TOP_TO_BOTTOM) { + // Resizing along the layout axis + float contentHeight = (float)(layoutConfig->padding.top + layoutConfig->padding.bottom); + for (int32_t j = 0; j < currentElement->childrenOrTextContent.children.length; ++j) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[j]); + contentHeight += childElement->dimensions.height; + } + contentHeight += (float)(CLAY__MAX(currentElement->childrenOrTextContent.children.length - 1, 0) * layoutConfig->childGap); + currentElement->dimensions.height = CLAY__MIN(CLAY__MAX(contentHeight, layoutConfig->sizing.height.size.minMax.min), layoutConfig->sizing.height.size.minMax.max); + } + } + + // Calculate sizing along the Y axis + Clay__SizeContainersAlongAxis(false); + + // Scale horizontal widths according to aspect ratio + for (int32_t i = 0; i < context->aspectRatioElementIndexes.length; ++i) { + Clay_LayoutElement* aspectElement = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&context->aspectRatioElementIndexes, i)); + Clay_AspectRatioElementConfig *config = Clay__FindElementConfigWithType(aspectElement, CLAY__ELEMENT_CONFIG_TYPE_ASPECT).aspectRatioElementConfig; + aspectElement->dimensions.width = config->aspectRatio * aspectElement->dimensions.height; + } + + // Sort tree roots by z-index + int32_t sortMax = context->layoutElementTreeRoots.length - 1; + while (sortMax > 0) { // todo dumb bubble sort + for (int32_t i = 0; i < sortMax; ++i) { + Clay__LayoutElementTreeRoot current = *Clay__LayoutElementTreeRootArray_Get(&context->layoutElementTreeRoots, i); + Clay__LayoutElementTreeRoot next = *Clay__LayoutElementTreeRootArray_Get(&context->layoutElementTreeRoots, i + 1); + if (next.zIndex < current.zIndex) { + Clay__LayoutElementTreeRootArray_Set(&context->layoutElementTreeRoots, i, next); + Clay__LayoutElementTreeRootArray_Set(&context->layoutElementTreeRoots, i + 1, current); + } + } + sortMax--; + } + + // Calculate final positions and generate render commands + context->renderCommands.length = 0; + dfsBuffer.length = 0; + for (int32_t rootIndex = 0; rootIndex < context->layoutElementTreeRoots.length; ++rootIndex) { + dfsBuffer.length = 0; + Clay__LayoutElementTreeRoot *root = Clay__LayoutElementTreeRootArray_Get(&context->layoutElementTreeRoots, rootIndex); + Clay_LayoutElement *rootElement = Clay_LayoutElementArray_Get(&context->layoutElements, (int)root->layoutElementIndex); + Clay_Vector2 rootPosition = CLAY__DEFAULT_STRUCT; + Clay_LayoutElementHashMapItem *parentHashMapItem = Clay__GetHashMapItem(root->parentId); + // Position root floating containers + if (Clay__ElementHasConfig(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING) && parentHashMapItem) { + Clay_FloatingElementConfig *config = Clay__FindElementConfigWithType(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING).floatingElementConfig; + Clay_Dimensions rootDimensions = rootElement->dimensions; + Clay_BoundingBox parentBoundingBox = parentHashMapItem->boundingBox; + // Set X position + Clay_Vector2 targetAttachPosition = CLAY__DEFAULT_STRUCT; + switch (config->attachPoints.parent) { + case CLAY_ATTACH_POINT_LEFT_TOP: + case CLAY_ATTACH_POINT_LEFT_CENTER: + case CLAY_ATTACH_POINT_LEFT_BOTTOM: targetAttachPosition.x = parentBoundingBox.x; break; + case CLAY_ATTACH_POINT_CENTER_TOP: + case CLAY_ATTACH_POINT_CENTER_CENTER: + case CLAY_ATTACH_POINT_CENTER_BOTTOM: targetAttachPosition.x = parentBoundingBox.x + (parentBoundingBox.width / 2); break; + case CLAY_ATTACH_POINT_RIGHT_TOP: + case CLAY_ATTACH_POINT_RIGHT_CENTER: + case CLAY_ATTACH_POINT_RIGHT_BOTTOM: targetAttachPosition.x = parentBoundingBox.x + parentBoundingBox.width; break; + } + switch (config->attachPoints.element) { + case CLAY_ATTACH_POINT_LEFT_TOP: + case CLAY_ATTACH_POINT_LEFT_CENTER: + case CLAY_ATTACH_POINT_LEFT_BOTTOM: break; + case CLAY_ATTACH_POINT_CENTER_TOP: + case CLAY_ATTACH_POINT_CENTER_CENTER: + case CLAY_ATTACH_POINT_CENTER_BOTTOM: targetAttachPosition.x -= (rootDimensions.width / 2); break; + case CLAY_ATTACH_POINT_RIGHT_TOP: + case CLAY_ATTACH_POINT_RIGHT_CENTER: + case CLAY_ATTACH_POINT_RIGHT_BOTTOM: targetAttachPosition.x -= rootDimensions.width; break; + } + switch (config->attachPoints.parent) { // I know I could merge the x and y switch statements, but this is easier to read + case CLAY_ATTACH_POINT_LEFT_TOP: + case CLAY_ATTACH_POINT_RIGHT_TOP: + case CLAY_ATTACH_POINT_CENTER_TOP: targetAttachPosition.y = parentBoundingBox.y; break; + case CLAY_ATTACH_POINT_LEFT_CENTER: + case CLAY_ATTACH_POINT_CENTER_CENTER: + case CLAY_ATTACH_POINT_RIGHT_CENTER: targetAttachPosition.y = parentBoundingBox.y + (parentBoundingBox.height / 2); break; + case CLAY_ATTACH_POINT_LEFT_BOTTOM: + case CLAY_ATTACH_POINT_CENTER_BOTTOM: + case CLAY_ATTACH_POINT_RIGHT_BOTTOM: targetAttachPosition.y = parentBoundingBox.y + parentBoundingBox.height; break; + } + switch (config->attachPoints.element) { + case CLAY_ATTACH_POINT_LEFT_TOP: + case CLAY_ATTACH_POINT_RIGHT_TOP: + case CLAY_ATTACH_POINT_CENTER_TOP: break; + case CLAY_ATTACH_POINT_LEFT_CENTER: + case CLAY_ATTACH_POINT_CENTER_CENTER: + case CLAY_ATTACH_POINT_RIGHT_CENTER: targetAttachPosition.y -= (rootDimensions.height / 2); break; + case CLAY_ATTACH_POINT_LEFT_BOTTOM: + case CLAY_ATTACH_POINT_CENTER_BOTTOM: + case CLAY_ATTACH_POINT_RIGHT_BOTTOM: targetAttachPosition.y -= rootDimensions.height; break; + } + targetAttachPosition.x += config->offset.x; + targetAttachPosition.y += config->offset.y; + rootPosition = targetAttachPosition; + } + if (root->clipElementId) { + Clay_LayoutElementHashMapItem *clipHashMapItem = Clay__GetHashMapItem(root->clipElementId); + if (clipHashMapItem) { + // Floating elements that are attached to scrolling contents won't be correctly positioned if external scroll handling is enabled, fix here + if (context->externalScrollHandlingEnabled) { + Clay_ClipElementConfig *clipConfig = Clay__FindElementConfigWithType(clipHashMapItem->layoutElement, CLAY__ELEMENT_CONFIG_TYPE_CLIP).clipElementConfig; + if (clipConfig->horizontal) { + rootPosition.x += clipConfig->childOffset.x; + } + if (clipConfig->vertical) { + rootPosition.y += clipConfig->childOffset.y; + } + } + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) { + .boundingBox = clipHashMapItem->boundingBox, + .userData = 0, + .id = Clay__HashNumber(rootElement->id, rootElement->childrenOrTextContent.children.length + 10).id, // TODO need a better strategy for managing derived ids + .zIndex = root->zIndex, + .commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_START, + }); + } + } + Clay__LayoutElementTreeNodeArray_Add(&dfsBuffer, CLAY__INIT(Clay__LayoutElementTreeNode) { .layoutElement = rootElement, .position = rootPosition, .nextChildOffset = { .x = (float)rootElement->layoutConfig->padding.left, .y = (float)rootElement->layoutConfig->padding.top } }); + + context->treeNodeVisited.internalArray[0] = false; + while (dfsBuffer.length > 0) { + Clay__LayoutElementTreeNode *currentElementTreeNode = Clay__LayoutElementTreeNodeArray_Get(&dfsBuffer, (int)dfsBuffer.length - 1); + Clay_LayoutElement *currentElement = currentElementTreeNode->layoutElement; + Clay_LayoutConfig *layoutConfig = currentElement->layoutConfig; + Clay_Vector2 scrollOffset = CLAY__DEFAULT_STRUCT; + + // This will only be run a single time for each element in downwards DFS order + if (!context->treeNodeVisited.internalArray[dfsBuffer.length - 1]) { + context->treeNodeVisited.internalArray[dfsBuffer.length - 1] = true; + + Clay_BoundingBox currentElementBoundingBox = { currentElementTreeNode->position.x, currentElementTreeNode->position.y, currentElement->dimensions.width, currentElement->dimensions.height }; + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING)) { + Clay_FloatingElementConfig *floatingElementConfig = Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING).floatingElementConfig; + Clay_Dimensions expand = floatingElementConfig->expand; + currentElementBoundingBox.x -= expand.width; + currentElementBoundingBox.width += expand.width * 2; + currentElementBoundingBox.y -= expand.height; + currentElementBoundingBox.height += expand.height * 2; + } + + Clay__ScrollContainerDataInternal *scrollContainerData = CLAY__NULL; + // Apply scroll offsets to container + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_CLIP)) { + Clay_ClipElementConfig *clipConfig = Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_CLIP).clipElementConfig; + + // This linear scan could theoretically be slow under very strange conditions, but I can't imagine a real UI with more than a few 10's of scroll containers + for (int32_t i = 0; i < context->scrollContainerDatas.length; i++) { + Clay__ScrollContainerDataInternal *mapping = Clay__ScrollContainerDataInternalArray_Get(&context->scrollContainerDatas, i); + if (mapping->layoutElement == currentElement) { + scrollContainerData = mapping; + mapping->boundingBox = currentElementBoundingBox; + scrollOffset = clipConfig->childOffset; + if (context->externalScrollHandlingEnabled) { + scrollOffset = CLAY__INIT(Clay_Vector2) CLAY__DEFAULT_STRUCT; + } + break; + } + } + } + + Clay_LayoutElementHashMapItem *hashMapItem = Clay__GetHashMapItem(currentElement->id); + if (hashMapItem) { + hashMapItem->boundingBox = currentElementBoundingBox; + } + + int32_t sortedConfigIndexes[20]; + for (int32_t elementConfigIndex = 0; elementConfigIndex < currentElement->elementConfigs.length; ++elementConfigIndex) { + sortedConfigIndexes[elementConfigIndex] = elementConfigIndex; + } + sortMax = currentElement->elementConfigs.length - 1; + while (sortMax > 0) { // todo dumb bubble sort + for (int32_t i = 0; i < sortMax; ++i) { + int32_t current = sortedConfigIndexes[i]; + int32_t next = sortedConfigIndexes[i + 1]; + Clay__ElementConfigType currentType = Clay__ElementConfigArraySlice_Get(¤tElement->elementConfigs, current)->type; + Clay__ElementConfigType nextType = Clay__ElementConfigArraySlice_Get(¤tElement->elementConfigs, next)->type; + if (nextType == CLAY__ELEMENT_CONFIG_TYPE_CLIP || currentType == CLAY__ELEMENT_CONFIG_TYPE_BORDER) { + sortedConfigIndexes[i] = next; + sortedConfigIndexes[i + 1] = current; + } + } + sortMax--; + } + + bool emitRectangle = false; + // Create the render commands for this element + Clay_SharedElementConfig *sharedConfig = Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_SHARED).sharedElementConfig; + if (sharedConfig && sharedConfig->backgroundColor.a > 0) { + emitRectangle = true; + } + else if (!sharedConfig) { + emitRectangle = false; + sharedConfig = &Clay_SharedElementConfig_DEFAULT; + } + for (int32_t elementConfigIndex = 0; elementConfigIndex < currentElement->elementConfigs.length; ++elementConfigIndex) { + Clay_ElementConfig *elementConfig = Clay__ElementConfigArraySlice_Get(¤tElement->elementConfigs, sortedConfigIndexes[elementConfigIndex]); + Clay_RenderCommand renderCommand = { + .boundingBox = currentElementBoundingBox, + .userData = sharedConfig->userData, + .id = currentElement->id, + }; + + bool offscreen = Clay__ElementIsOffscreen(¤tElementBoundingBox); + // Culling - Don't bother to generate render commands for rectangles entirely outside the screen - this won't stop their children from being rendered if they overflow + bool shouldRender = !offscreen; + switch (elementConfig->type) { + case CLAY__ELEMENT_CONFIG_TYPE_ASPECT: + case CLAY__ELEMENT_CONFIG_TYPE_FLOATING: + case CLAY__ELEMENT_CONFIG_TYPE_SHARED: + case CLAY__ELEMENT_CONFIG_TYPE_BORDER: { + shouldRender = false; + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_CLIP: { + renderCommand.commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_START; + renderCommand.renderData = CLAY__INIT(Clay_RenderData) { + .clip = { + .horizontal = elementConfig->config.clipElementConfig->horizontal, + .vertical = elementConfig->config.clipElementConfig->vertical, + } + }; + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_IMAGE: { + renderCommand.commandType = CLAY_RENDER_COMMAND_TYPE_IMAGE; + renderCommand.renderData = CLAY__INIT(Clay_RenderData) { + .image = { + .backgroundColor = sharedConfig->backgroundColor, + .cornerRadius = sharedConfig->cornerRadius, + .imageData = elementConfig->config.imageElementConfig->imageData, + } + }; + emitRectangle = false; + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_TEXT: { + if (!shouldRender) { + break; + } + shouldRender = false; + Clay_ElementConfigUnion configUnion = elementConfig->config; + Clay_TextElementConfig *textElementConfig = configUnion.textElementConfig; + float naturalLineHeight = currentElement->childrenOrTextContent.textElementData->preferredDimensions.height; + float finalLineHeight = textElementConfig->lineHeight > 0 ? (float)textElementConfig->lineHeight : naturalLineHeight; + float lineHeightOffset = (finalLineHeight - naturalLineHeight) / 2; + float yPosition = lineHeightOffset; + for (int32_t lineIndex = 0; lineIndex < currentElement->childrenOrTextContent.textElementData->wrappedLines.length; ++lineIndex) { + Clay__WrappedTextLine *wrappedLine = Clay__WrappedTextLineArraySlice_Get(¤tElement->childrenOrTextContent.textElementData->wrappedLines, lineIndex); + if (wrappedLine->line.length == 0) { + yPosition += finalLineHeight; + continue; + } + float offset = (currentElementBoundingBox.width - wrappedLine->dimensions.width); + if (textElementConfig->textAlignment == CLAY_TEXT_ALIGN_LEFT) { + offset = 0; + } + if (textElementConfig->textAlignment == CLAY_TEXT_ALIGN_CENTER) { + offset /= 2; + } + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) { + .boundingBox = { currentElementBoundingBox.x + offset, currentElementBoundingBox.y + yPosition, wrappedLine->dimensions.width, wrappedLine->dimensions.height }, + .renderData = { .text = { + .stringContents = CLAY__INIT(Clay_StringSlice) { .length = wrappedLine->line.length, .chars = wrappedLine->line.chars, .baseChars = currentElement->childrenOrTextContent.textElementData->text.chars }, + .textColor = textElementConfig->textColor, + .fontId = textElementConfig->fontId, + .fontSize = textElementConfig->fontSize, + .letterSpacing = textElementConfig->letterSpacing, + .lineHeight = textElementConfig->lineHeight, + }}, + .userData = textElementConfig->userData, + .id = Clay__HashNumber(lineIndex, currentElement->id).id, + .zIndex = root->zIndex, + .commandType = CLAY_RENDER_COMMAND_TYPE_TEXT, + }); + yPosition += finalLineHeight; + + if (!context->disableCulling && (currentElementBoundingBox.y + yPosition > context->layoutDimensions.height)) { + break; + } + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_CUSTOM: { + renderCommand.commandType = CLAY_RENDER_COMMAND_TYPE_CUSTOM; + renderCommand.renderData = CLAY__INIT(Clay_RenderData) { + .custom = { + .backgroundColor = sharedConfig->backgroundColor, + .cornerRadius = sharedConfig->cornerRadius, + .customData = elementConfig->config.customElementConfig->customData, + } + }; + emitRectangle = false; + break; + } + default: break; + } + if (shouldRender) { + Clay__AddRenderCommand(renderCommand); + } + if (offscreen) { + // NOTE: You may be tempted to try an early return / continue if an element is off screen. Why bother calculating layout for its children, right? + // Unfortunately, a FLOATING_CONTAINER may be defined that attaches to a child or grandchild of this element, which is large enough to still + // be on screen, even if this element isn't. That depends on this element and it's children being laid out correctly (even if they are entirely off screen) + } + } + + if (emitRectangle) { + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) { + .boundingBox = currentElementBoundingBox, + .renderData = { .rectangle = { + .backgroundColor = sharedConfig->backgroundColor, + .cornerRadius = sharedConfig->cornerRadius, + }}, + .userData = sharedConfig->userData, + .id = currentElement->id, + .zIndex = root->zIndex, + .commandType = CLAY_RENDER_COMMAND_TYPE_RECTANGLE, + }); + } + + // Setup initial on-axis alignment + if (!Clay__ElementHasConfig(currentElementTreeNode->layoutElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT)) { + Clay_Dimensions contentSize = {0,0}; + if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { + for (int32_t i = 0; i < currentElement->childrenOrTextContent.children.length; ++i) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[i]); + contentSize.width += childElement->dimensions.width; + contentSize.height = CLAY__MAX(contentSize.height, childElement->dimensions.height); + } + contentSize.width += (float)(CLAY__MAX(currentElement->childrenOrTextContent.children.length - 1, 0) * layoutConfig->childGap); + float extraSpace = currentElement->dimensions.width - (float)(layoutConfig->padding.left + layoutConfig->padding.right) - contentSize.width; + switch (layoutConfig->childAlignment.x) { + case CLAY_ALIGN_X_LEFT: extraSpace = 0; break; + case CLAY_ALIGN_X_CENTER: extraSpace /= 2; break; + default: break; + } + currentElementTreeNode->nextChildOffset.x += extraSpace; + extraSpace = CLAY__MAX(0, extraSpace); + } else { + for (int32_t i = 0; i < currentElement->childrenOrTextContent.children.length; ++i) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[i]); + contentSize.width = CLAY__MAX(contentSize.width, childElement->dimensions.width); + contentSize.height += childElement->dimensions.height; + } + contentSize.height += (float)(CLAY__MAX(currentElement->childrenOrTextContent.children.length - 1, 0) * layoutConfig->childGap); + float extraSpace = currentElement->dimensions.height - (float)(layoutConfig->padding.top + layoutConfig->padding.bottom) - contentSize.height; + switch (layoutConfig->childAlignment.y) { + case CLAY_ALIGN_Y_TOP: extraSpace = 0; break; + case CLAY_ALIGN_Y_CENTER: extraSpace /= 2; break; + default: break; + } + extraSpace = CLAY__MAX(0, extraSpace); + currentElementTreeNode->nextChildOffset.y += extraSpace; + } + + if (scrollContainerData) { + scrollContainerData->contentSize = CLAY__INIT(Clay_Dimensions) { contentSize.width + (float)(layoutConfig->padding.left + layoutConfig->padding.right), contentSize.height + (float)(layoutConfig->padding.top + layoutConfig->padding.bottom) }; + } + } + } + else { + // DFS is returning upwards backwards + bool closeClipElement = false; + Clay_ClipElementConfig *clipConfig = Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_CLIP).clipElementConfig; + if (clipConfig) { + closeClipElement = true; + for (int32_t i = 0; i < context->scrollContainerDatas.length; i++) { + Clay__ScrollContainerDataInternal *mapping = Clay__ScrollContainerDataInternalArray_Get(&context->scrollContainerDatas, i); + if (mapping->layoutElement == currentElement) { + scrollOffset = clipConfig->childOffset; + if (context->externalScrollHandlingEnabled) { + scrollOffset = CLAY__INIT(Clay_Vector2) CLAY__DEFAULT_STRUCT; + } + break; + } + } + } + + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_BORDER)) { + Clay_LayoutElementHashMapItem *currentElementData = Clay__GetHashMapItem(currentElement->id); + Clay_BoundingBox currentElementBoundingBox = currentElementData->boundingBox; + + // Culling - Don't bother to generate render commands for rectangles entirely outside the screen - this won't stop their children from being rendered if they overflow + if (!Clay__ElementIsOffscreen(¤tElementBoundingBox)) { + Clay_SharedElementConfig *sharedConfig = Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_SHARED) ? Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_SHARED).sharedElementConfig : &Clay_SharedElementConfig_DEFAULT; + Clay_BorderElementConfig *borderConfig = Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_BORDER).borderElementConfig; + Clay_RenderCommand renderCommand = { + .boundingBox = currentElementBoundingBox, + .renderData = { .border = { + .color = borderConfig->color, + .cornerRadius = sharedConfig->cornerRadius, + .width = borderConfig->width + }}, + .userData = sharedConfig->userData, + .id = Clay__HashNumber(currentElement->id, currentElement->childrenOrTextContent.children.length).id, + .commandType = CLAY_RENDER_COMMAND_TYPE_BORDER, + }; + Clay__AddRenderCommand(renderCommand); + if (borderConfig->width.betweenChildren > 0 && borderConfig->color.a > 0) { + float halfGap = layoutConfig->childGap / 2; + Clay_Vector2 borderOffset = { (float)layoutConfig->padding.left - halfGap, (float)layoutConfig->padding.top - halfGap }; + if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { + for (int32_t i = 0; i < currentElement->childrenOrTextContent.children.length; ++i) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[i]); + if (i > 0) { + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) { + .boundingBox = { currentElementBoundingBox.x + borderOffset.x + scrollOffset.x, currentElementBoundingBox.y + scrollOffset.y, (float)borderConfig->width.betweenChildren, currentElement->dimensions.height }, + .renderData = { .rectangle = { + .backgroundColor = borderConfig->color, + } }, + .userData = sharedConfig->userData, + .id = Clay__HashNumber(currentElement->id, currentElement->childrenOrTextContent.children.length + 1 + i).id, + .commandType = CLAY_RENDER_COMMAND_TYPE_RECTANGLE, + }); + } + borderOffset.x += (childElement->dimensions.width + (float)layoutConfig->childGap); + } + } else { + for (int32_t i = 0; i < currentElement->childrenOrTextContent.children.length; ++i) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[i]); + if (i > 0) { + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) { + .boundingBox = { currentElementBoundingBox.x + scrollOffset.x, currentElementBoundingBox.y + borderOffset.y + scrollOffset.y, currentElement->dimensions.width, (float)borderConfig->width.betweenChildren }, + .renderData = { .rectangle = { + .backgroundColor = borderConfig->color, + } }, + .userData = sharedConfig->userData, + .id = Clay__HashNumber(currentElement->id, currentElement->childrenOrTextContent.children.length + 1 + i).id, + .commandType = CLAY_RENDER_COMMAND_TYPE_RECTANGLE, + }); + } + borderOffset.y += (childElement->dimensions.height + (float)layoutConfig->childGap); + } + } + } + } + } + // This exists because the scissor needs to end _after_ borders between elements + if (closeClipElement) { + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) { + .id = Clay__HashNumber(currentElement->id, rootElement->childrenOrTextContent.children.length + 11).id, + .commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_END, + }); + } + + dfsBuffer.length--; + continue; + } + + // Add children to the DFS buffer + if (!Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT)) { + dfsBuffer.length += currentElement->childrenOrTextContent.children.length; + for (int32_t i = 0; i < currentElement->childrenOrTextContent.children.length; ++i) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[i]); + // Alignment along non layout axis + if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { + currentElementTreeNode->nextChildOffset.y = currentElement->layoutConfig->padding.top; + float whiteSpaceAroundChild = currentElement->dimensions.height - (float)(layoutConfig->padding.top + layoutConfig->padding.bottom) - childElement->dimensions.height; + switch (layoutConfig->childAlignment.y) { + case CLAY_ALIGN_Y_TOP: break; + case CLAY_ALIGN_Y_CENTER: currentElementTreeNode->nextChildOffset.y += whiteSpaceAroundChild / 2; break; + case CLAY_ALIGN_Y_BOTTOM: currentElementTreeNode->nextChildOffset.y += whiteSpaceAroundChild; break; + } + } else { + currentElementTreeNode->nextChildOffset.x = currentElement->layoutConfig->padding.left; + float whiteSpaceAroundChild = currentElement->dimensions.width - (float)(layoutConfig->padding.left + layoutConfig->padding.right) - childElement->dimensions.width; + switch (layoutConfig->childAlignment.x) { + case CLAY_ALIGN_X_LEFT: break; + case CLAY_ALIGN_X_CENTER: currentElementTreeNode->nextChildOffset.x += whiteSpaceAroundChild / 2; break; + case CLAY_ALIGN_X_RIGHT: currentElementTreeNode->nextChildOffset.x += whiteSpaceAroundChild; break; + } + } + + Clay_Vector2 childPosition = { + currentElementTreeNode->position.x + currentElementTreeNode->nextChildOffset.x + scrollOffset.x, + currentElementTreeNode->position.y + currentElementTreeNode->nextChildOffset.y + scrollOffset.y, + }; + + // DFS buffer elements need to be added in reverse because stack traversal happens backwards + uint32_t newNodeIndex = dfsBuffer.length - 1 - i; + dfsBuffer.internalArray[newNodeIndex] = CLAY__INIT(Clay__LayoutElementTreeNode) { + .layoutElement = childElement, + .position = { childPosition.x, childPosition.y }, + .nextChildOffset = { .x = (float)childElement->layoutConfig->padding.left, .y = (float)childElement->layoutConfig->padding.top }, + }; + context->treeNodeVisited.internalArray[newNodeIndex] = false; + + // Update parent offsets + if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { + currentElementTreeNode->nextChildOffset.x += childElement->dimensions.width + (float)layoutConfig->childGap; + } else { + currentElementTreeNode->nextChildOffset.y += childElement->dimensions.height + (float)layoutConfig->childGap; + } + } + } + } + + if (root->clipElementId) { + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) { .id = Clay__HashNumber(rootElement->id, rootElement->childrenOrTextContent.children.length + 11).id, .commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_END }); + } + } +} + +CLAY_WASM_EXPORT("Clay_GetPointerOverIds") +CLAY_DLL_EXPORT Clay_ElementIdArray Clay_GetPointerOverIds(void) { + return Clay_GetCurrentContext()->pointerOverIds; +} + +#pragma region DebugTools +Clay_Color CLAY__DEBUGVIEW_COLOR_1 = {58, 56, 52, 255}; +Clay_Color CLAY__DEBUGVIEW_COLOR_2 = {62, 60, 58, 255}; +Clay_Color CLAY__DEBUGVIEW_COLOR_3 = {141, 133, 135, 255}; +Clay_Color CLAY__DEBUGVIEW_COLOR_4 = {238, 226, 231, 255}; +Clay_Color CLAY__DEBUGVIEW_COLOR_SELECTED_ROW = {102, 80, 78, 255}; +const int32_t CLAY__DEBUGVIEW_ROW_HEIGHT = 30; +const int32_t CLAY__DEBUGVIEW_OUTER_PADDING = 10; +const int32_t CLAY__DEBUGVIEW_INDENT_WIDTH = 16; +Clay_TextElementConfig Clay__DebugView_TextNameConfig = {.textColor = {238, 226, 231, 255}, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE }; +Clay_LayoutConfig Clay__DebugView_ScrollViewItemLayoutConfig = CLAY__DEFAULT_STRUCT; + +typedef struct { + Clay_String label; + Clay_Color color; +} Clay__DebugElementConfigTypeLabelConfig; + +Clay__DebugElementConfigTypeLabelConfig Clay__DebugGetElementConfigTypeLabel(Clay__ElementConfigType type) { + switch (type) { + case CLAY__ELEMENT_CONFIG_TYPE_SHARED: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Shared"), {243,134,48,255} }; + case CLAY__ELEMENT_CONFIG_TYPE_TEXT: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Text"), {105,210,231,255} }; + case CLAY__ELEMENT_CONFIG_TYPE_ASPECT: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Aspect"), {101,149,194,255} }; + case CLAY__ELEMENT_CONFIG_TYPE_IMAGE: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Image"), {121,189,154,255} }; + case CLAY__ELEMENT_CONFIG_TYPE_FLOATING: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Floating"), {250,105,0,255} }; + case CLAY__ELEMENT_CONFIG_TYPE_CLIP: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) {CLAY_STRING("Scroll"), {242, 196, 90, 255} }; + case CLAY__ELEMENT_CONFIG_TYPE_BORDER: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) {CLAY_STRING("Border"), {108, 91, 123, 255} }; + case CLAY__ELEMENT_CONFIG_TYPE_CUSTOM: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Custom"), {11,72,107,255} }; + default: break; + } + return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Error"), {0,0,0,255} }; +} + +typedef struct { + int32_t rowCount; + int32_t selectedElementRowIndex; +} Clay__RenderDebugLayoutData; + +// Returns row count +Clay__RenderDebugLayoutData Clay__RenderDebugLayoutElementsList(int32_t initialRootsLength, int32_t highlightedRowIndex) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay__int32_tArray dfsBuffer = context->reusableElementIndexBuffer; + Clay__DebugView_ScrollViewItemLayoutConfig = CLAY__INIT(Clay_LayoutConfig) { .sizing = { .height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT) }, .childGap = 6, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER }}; + Clay__RenderDebugLayoutData layoutData = CLAY__DEFAULT_STRUCT; + + uint32_t highlightedElementId = 0; + + for (int32_t rootIndex = 0; rootIndex < initialRootsLength; ++rootIndex) { + dfsBuffer.length = 0; + Clay__LayoutElementTreeRoot *root = Clay__LayoutElementTreeRootArray_Get(&context->layoutElementTreeRoots, rootIndex); + Clay__int32_tArray_Add(&dfsBuffer, (int32_t)root->layoutElementIndex); + context->treeNodeVisited.internalArray[0] = false; + if (rootIndex > 0) { + CLAY(CLAY_IDI("Clay__DebugView_EmptyRowOuter", rootIndex), { .layout = { .sizing = {.width = CLAY_SIZING_GROW(0)}, .padding = {CLAY__DEBUGVIEW_INDENT_WIDTH / 2, 0, 0, 0} } }) { + CLAY(CLAY_IDI("Clay__DebugView_EmptyRow", rootIndex), { .layout = { .sizing = { .width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED((float)CLAY__DEBUGVIEW_ROW_HEIGHT) }}, .border = { .color = CLAY__DEBUGVIEW_COLOR_3, .width = { .top = 1 } } }) {} + } + layoutData.rowCount++; + } + while (dfsBuffer.length > 0) { + int32_t currentElementIndex = Clay__int32_tArray_GetValue(&dfsBuffer, (int)dfsBuffer.length - 1); + Clay_LayoutElement *currentElement = Clay_LayoutElementArray_Get(&context->layoutElements, (int)currentElementIndex); + if (context->treeNodeVisited.internalArray[dfsBuffer.length - 1]) { + if (!Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) && currentElement->childrenOrTextContent.children.length > 0) { + Clay__CloseElement(); + Clay__CloseElement(); + Clay__CloseElement(); + } + dfsBuffer.length--; + continue; + } + + if (highlightedRowIndex == layoutData.rowCount) { + if (context->pointerInfo.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + context->debugSelectedElementId = currentElement->id; + } + highlightedElementId = currentElement->id; + } + + context->treeNodeVisited.internalArray[dfsBuffer.length - 1] = true; + Clay_LayoutElementHashMapItem *currentElementData = Clay__GetHashMapItem(currentElement->id); + bool offscreen = Clay__ElementIsOffscreen(¤tElementData->boundingBox); + if (context->debugSelectedElementId == currentElement->id) { + layoutData.selectedElementRowIndex = layoutData.rowCount; + } + CLAY(CLAY_IDI("Clay__DebugView_ElementOuter", currentElement->id), { .layout = Clay__DebugView_ScrollViewItemLayoutConfig }) { + // Collapse icon / button + if (!(Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) || currentElement->childrenOrTextContent.children.length == 0)) { + CLAY(CLAY_IDI("Clay__DebugView_CollapseElement", currentElement->id), { + .layout = { .sizing = {CLAY_SIZING_FIXED(16), CLAY_SIZING_FIXED(16)}, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER} }, + .cornerRadius = CLAY_CORNER_RADIUS(4), + .border = { .color = CLAY__DEBUGVIEW_COLOR_3, .width = {1, 1, 1, 1, 0} }, + }) { + CLAY_TEXT((currentElementData && currentElementData->debugData->collapsed) ? CLAY_STRING("+") : CLAY_STRING("-"), CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); + } + } else { // Square dot for empty containers + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_FIXED(16), CLAY_SIZING_FIXED(16)}, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER } } }) { + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_FIXED(8), CLAY_SIZING_FIXED(8)} }, .backgroundColor = CLAY__DEBUGVIEW_COLOR_3, .cornerRadius = CLAY_CORNER_RADIUS(2) }) {} + } + } + // Collisions and offscreen info + if (currentElementData) { + if (currentElementData->debugData->collision) { + CLAY_AUTO_ID({ .layout = { .padding = { 8, 8, 2, 2 }}, .border = { .color = {177, 147, 8, 255}, .width = {1, 1, 1, 1, 0} } }) { + CLAY_TEXT(CLAY_STRING("Duplicate ID"), CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16 })); + } + } + if (offscreen) { + CLAY_AUTO_ID({ .layout = { .padding = { 8, 8, 2, 2 } }, .border = { .color = CLAY__DEBUGVIEW_COLOR_3, .width = { 1, 1, 1, 1, 0} } }) { + CLAY_TEXT(CLAY_STRING("Offscreen"), CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16 })); + } + } + } + Clay_String idString = context->layoutElementIdStrings.internalArray[currentElementIndex]; + if (idString.length > 0) { + CLAY_TEXT(idString, offscreen ? CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16 }) : &Clay__DebugView_TextNameConfig); + } + for (int32_t elementConfigIndex = 0; elementConfigIndex < currentElement->elementConfigs.length; ++elementConfigIndex) { + Clay_ElementConfig *elementConfig = Clay__ElementConfigArraySlice_Get(¤tElement->elementConfigs, elementConfigIndex); + if (elementConfig->type == CLAY__ELEMENT_CONFIG_TYPE_SHARED) { + Clay_Color labelColor = {243,134,48,90}; + labelColor.a = 90; + Clay_Color backgroundColor = elementConfig->config.sharedElementConfig->backgroundColor; + Clay_CornerRadius radius = elementConfig->config.sharedElementConfig->cornerRadius; + if (backgroundColor.a > 0) { + CLAY_AUTO_ID({ .layout = { .padding = { 8, 8, 2, 2 } }, .backgroundColor = labelColor, .cornerRadius = CLAY_CORNER_RADIUS(4), .border = { .color = labelColor, .width = { 1, 1, 1, 1, 0} } }) { + CLAY_TEXT(CLAY_STRING("Color"), CLAY_TEXT_CONFIG({ .textColor = offscreen ? CLAY__DEBUGVIEW_COLOR_3 : CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); + } + } + if (radius.bottomLeft > 0) { + CLAY_AUTO_ID({ .layout = { .padding = { 8, 8, 2, 2 } }, .backgroundColor = labelColor, .cornerRadius = CLAY_CORNER_RADIUS(4), .border = { .color = labelColor, .width = { 1, 1, 1, 1, 0 } } }) { + CLAY_TEXT(CLAY_STRING("Radius"), CLAY_TEXT_CONFIG({ .textColor = offscreen ? CLAY__DEBUGVIEW_COLOR_3 : CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); + } + } + continue; + } + Clay__DebugElementConfigTypeLabelConfig config = Clay__DebugGetElementConfigTypeLabel(elementConfig->type); + Clay_Color backgroundColor = config.color; + backgroundColor.a = 90; + CLAY_AUTO_ID({ .layout = { .padding = { 8, 8, 2, 2 } }, .backgroundColor = backgroundColor, .cornerRadius = CLAY_CORNER_RADIUS(4), .border = { .color = config.color, .width = { 1, 1, 1, 1, 0 } } }) { + CLAY_TEXT(config.label, CLAY_TEXT_CONFIG({ .textColor = offscreen ? CLAY__DEBUGVIEW_COLOR_3 : CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); + } + } + } + + // Render the text contents below the element as a non-interactive row + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT)) { + layoutData.rowCount++; + Clay__TextElementData *textElementData = currentElement->childrenOrTextContent.textElementData; + Clay_TextElementConfig *rawTextConfig = offscreen ? CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16 }) : &Clay__DebugView_TextNameConfig; + CLAY_AUTO_ID({ .layout = { .sizing = { .height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER } } }) { + CLAY_AUTO_ID({ .layout = { .sizing = {.width = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_INDENT_WIDTH + 16) } } }) {} + CLAY_TEXT(CLAY_STRING("\""), rawTextConfig); + CLAY_TEXT(textElementData->text.length > 40 ? (CLAY__INIT(Clay_String) { .length = 40, .chars = textElementData->text.chars }) : textElementData->text, rawTextConfig); + if (textElementData->text.length > 40) { + CLAY_TEXT(CLAY_STRING("..."), rawTextConfig); + } + CLAY_TEXT(CLAY_STRING("\""), rawTextConfig); + } + } else if (currentElement->childrenOrTextContent.children.length > 0) { + Clay__OpenElement(); + Clay__ConfigureOpenElement(CLAY__INIT(Clay_ElementDeclaration) { .layout = { .padding = { .left = 8 } } }); + Clay__OpenElement(); + Clay__ConfigureOpenElement(CLAY__INIT(Clay_ElementDeclaration) { .layout = { .padding = { .left = CLAY__DEBUGVIEW_INDENT_WIDTH }}, .border = { .color = CLAY__DEBUGVIEW_COLOR_3, .width = { .left = 1 } }}); + Clay__OpenElement(); + Clay__ConfigureOpenElement(CLAY__INIT(Clay_ElementDeclaration) { .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM } }); + } + + layoutData.rowCount++; + if (!(Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) || (currentElementData && currentElementData->debugData->collapsed))) { + for (int32_t i = currentElement->childrenOrTextContent.children.length - 1; i >= 0; --i) { + Clay__int32_tArray_Add(&dfsBuffer, currentElement->childrenOrTextContent.children.elements[i]); + context->treeNodeVisited.internalArray[dfsBuffer.length - 1] = false; // TODO needs to be ranged checked + } + } + } + } + + if (context->pointerInfo.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + Clay_ElementId collapseButtonId = Clay__HashString(CLAY_STRING("Clay__DebugView_CollapseElement"), 0); + for (int32_t i = (int)context->pointerOverIds.length - 1; i >= 0; i--) { + Clay_ElementId *elementId = Clay_ElementIdArray_Get(&context->pointerOverIds, i); + if (elementId->baseId == collapseButtonId.baseId) { + Clay_LayoutElementHashMapItem *highlightedItem = Clay__GetHashMapItem(elementId->offset); + highlightedItem->debugData->collapsed = !highlightedItem->debugData->collapsed; + break; + } + } + } + + if (highlightedElementId) { + CLAY(CLAY_ID("Clay__DebugView_ElementHighlight"), { .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0)} }, .floating = { .parentId = highlightedElementId, .zIndex = 32767, .pointerCaptureMode = CLAY_POINTER_CAPTURE_MODE_PASSTHROUGH, .attachTo = CLAY_ATTACH_TO_ELEMENT_WITH_ID } }) { + CLAY(CLAY_ID("Clay__DebugView_ElementHighlightRectangle"), { .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0)} }, .backgroundColor = Clay__debugViewHighlightColor }) {} + } + } + return layoutData; +} + +void Clay__RenderDebugLayoutSizing(Clay_SizingAxis sizing, Clay_TextElementConfig *infoTextConfig) { + Clay_String sizingLabel = CLAY_STRING("GROW"); + if (sizing.type == CLAY__SIZING_TYPE_FIT) { + sizingLabel = CLAY_STRING("FIT"); + } else if (sizing.type == CLAY__SIZING_TYPE_PERCENT) { + sizingLabel = CLAY_STRING("PERCENT"); + } else if (sizing.type == CLAY__SIZING_TYPE_FIXED) { + sizingLabel = CLAY_STRING("FIXED"); + } + CLAY_TEXT(sizingLabel, infoTextConfig); + if (sizing.type == CLAY__SIZING_TYPE_GROW || sizing.type == CLAY__SIZING_TYPE_FIT || sizing.type == CLAY__SIZING_TYPE_FIXED) { + CLAY_TEXT(CLAY_STRING("("), infoTextConfig); + if (sizing.size.minMax.min != 0) { + CLAY_TEXT(CLAY_STRING("min: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(sizing.size.minMax.min), infoTextConfig); + if (sizing.size.minMax.max != CLAY__MAXFLOAT) { + CLAY_TEXT(CLAY_STRING(", "), infoTextConfig); + } + } + if (sizing.size.minMax.max != CLAY__MAXFLOAT) { + CLAY_TEXT(CLAY_STRING("max: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(sizing.size.minMax.max), infoTextConfig); + } + CLAY_TEXT(CLAY_STRING(")"), infoTextConfig); + } else if (sizing.type == CLAY__SIZING_TYPE_PERCENT) { + CLAY_TEXT(CLAY_STRING("("), infoTextConfig); + CLAY_TEXT(Clay__IntToString(sizing.size.percent * 100), infoTextConfig); + CLAY_TEXT(CLAY_STRING("%)"), infoTextConfig); + } +} + +void Clay__RenderDebugViewElementConfigHeader(Clay_String elementId, Clay__ElementConfigType type) { + Clay__DebugElementConfigTypeLabelConfig config = Clay__DebugGetElementConfigTypeLabel(type); + Clay_Color backgroundColor = config.color; + backgroundColor.a = 90; + CLAY_AUTO_ID({ .layout = { .sizing = { .width = CLAY_SIZING_GROW(0) }, .padding = CLAY_PADDING_ALL(CLAY__DEBUGVIEW_OUTER_PADDING), .childAlignment = { .y = CLAY_ALIGN_Y_CENTER } } }) { + CLAY_AUTO_ID({ .layout = { .padding = { 8, 8, 2, 2 } }, .backgroundColor = backgroundColor, .cornerRadius = CLAY_CORNER_RADIUS(4), .border = { .color = config.color, .width = { 1, 1, 1, 1, 0 } } }) { + CLAY_TEXT(config.label, CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); + } + CLAY_AUTO_ID({ .layout = { .sizing = { .width = CLAY_SIZING_GROW(0) } } }) {} + CLAY_TEXT(elementId, CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE })); + } +} + +void Clay__RenderDebugViewColor(Clay_Color color, Clay_TextElementConfig *textConfig) { + CLAY_AUTO_ID({ .layout = { .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} } }) { + CLAY_TEXT(CLAY_STRING("{ r: "), textConfig); + CLAY_TEXT(Clay__IntToString(color.r), textConfig); + CLAY_TEXT(CLAY_STRING(", g: "), textConfig); + CLAY_TEXT(Clay__IntToString(color.g), textConfig); + CLAY_TEXT(CLAY_STRING(", b: "), textConfig); + CLAY_TEXT(Clay__IntToString(color.b), textConfig); + CLAY_TEXT(CLAY_STRING(", a: "), textConfig); + CLAY_TEXT(Clay__IntToString(color.a), textConfig); + CLAY_TEXT(CLAY_STRING(" }"), textConfig); + CLAY_AUTO_ID({ .layout = { .sizing = { .width = CLAY_SIZING_FIXED(10) } } }) {} + CLAY_AUTO_ID({ .layout = { .sizing = { CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8)} }, .backgroundColor = color, .cornerRadius = CLAY_CORNER_RADIUS(4), .border = { .color = CLAY__DEBUGVIEW_COLOR_4, .width = { 1, 1, 1, 1, 0 } } }) {} + } +} + +void Clay__RenderDebugViewCornerRadius(Clay_CornerRadius cornerRadius, Clay_TextElementConfig *textConfig) { + CLAY_AUTO_ID({ .layout = { .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} } }) { + CLAY_TEXT(CLAY_STRING("{ topLeft: "), textConfig); + CLAY_TEXT(Clay__IntToString(cornerRadius.topLeft), textConfig); + CLAY_TEXT(CLAY_STRING(", topRight: "), textConfig); + CLAY_TEXT(Clay__IntToString(cornerRadius.topRight), textConfig); + CLAY_TEXT(CLAY_STRING(", bottomLeft: "), textConfig); + CLAY_TEXT(Clay__IntToString(cornerRadius.bottomLeft), textConfig); + CLAY_TEXT(CLAY_STRING(", bottomRight: "), textConfig); + CLAY_TEXT(Clay__IntToString(cornerRadius.bottomRight), textConfig); + CLAY_TEXT(CLAY_STRING(" }"), textConfig); + } +} + +void HandleDebugViewCloseButtonInteraction(Clay_ElementId elementId, Clay_PointerData pointerInfo, intptr_t userData) { + Clay_Context* context = Clay_GetCurrentContext(); + (void) elementId; (void) pointerInfo; (void) userData; + if (pointerInfo.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + context->debugModeEnabled = false; + } +} + +void Clay__RenderDebugView(void) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay_ElementId closeButtonId = Clay__HashString(CLAY_STRING("Clay__DebugViewTopHeaderCloseButtonOuter"), 0); + if (context->pointerInfo.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + for (int32_t i = 0; i < context->pointerOverIds.length; ++i) { + Clay_ElementId *elementId = Clay_ElementIdArray_Get(&context->pointerOverIds, i); + if (elementId->id == closeButtonId.id) { + context->debugModeEnabled = false; + return; + } + } + } + + uint32_t initialRootsLength = context->layoutElementTreeRoots.length; + uint32_t initialElementsLength = context->layoutElements.length; + Clay_TextElementConfig *infoTextConfig = CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE }); + Clay_TextElementConfig *infoTitleConfig = CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE }); + Clay_ElementId scrollId = Clay__HashString(CLAY_STRING("Clay__DebugViewOuterScrollPane"), 0); + float scrollYOffset = 0; + bool pointerInDebugView = context->pointerInfo.position.y < context->layoutDimensions.height - 300; + for (int32_t i = 0; i < context->scrollContainerDatas.length; ++i) { + Clay__ScrollContainerDataInternal *scrollContainerData = Clay__ScrollContainerDataInternalArray_Get(&context->scrollContainerDatas, i); + if (scrollContainerData->elementId == scrollId.id) { + if (!context->externalScrollHandlingEnabled) { + scrollYOffset = scrollContainerData->scrollPosition.y; + } else { + pointerInDebugView = context->pointerInfo.position.y + scrollContainerData->scrollPosition.y < context->layoutDimensions.height - 300; + } + break; + } + } + int32_t highlightedRow = pointerInDebugView + ? (int32_t)((context->pointerInfo.position.y - scrollYOffset) / (float)CLAY__DEBUGVIEW_ROW_HEIGHT) - 1 + : -1; + if (context->pointerInfo.position.x < context->layoutDimensions.width - (float)Clay__debugViewWidth) { + highlightedRow = -1; + } + Clay__RenderDebugLayoutData layoutData = CLAY__DEFAULT_STRUCT; + CLAY(CLAY_ID("Clay__DebugView"), { + .layout = { .sizing = { CLAY_SIZING_FIXED((float)Clay__debugViewWidth) , CLAY_SIZING_FIXED(context->layoutDimensions.height) }, .layoutDirection = CLAY_TOP_TO_BOTTOM }, + .floating = { .zIndex = 32765, .attachPoints = { .element = CLAY_ATTACH_POINT_LEFT_CENTER, .parent = CLAY_ATTACH_POINT_RIGHT_CENTER }, .attachTo = CLAY_ATTACH_TO_ROOT, .clipTo = CLAY_CLIP_TO_ATTACHED_PARENT }, + .border = { .color = CLAY__DEBUGVIEW_COLOR_3, .width = { .bottom = 1 } } + }) { + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, CLAY__DEBUGVIEW_OUTER_PADDING, 0, 0 }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} }, .backgroundColor = CLAY__DEBUGVIEW_COLOR_2 }) { + CLAY_TEXT(CLAY_STRING("Clay Debug Tools"), infoTextConfig); + CLAY_AUTO_ID({ .layout = { .sizing = { .width = CLAY_SIZING_GROW(0) } } }) {} + // Close button + CLAY_AUTO_ID({ + .layout = { .sizing = {CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 10), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 10)}, .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER} }, + .backgroundColor = {217,91,67,80}, + .cornerRadius = CLAY_CORNER_RADIUS(4), + .border = { .color = { 217,91,67,255 }, .width = { 1, 1, 1, 1, 0 } }, + }) { + Clay_OnHover(HandleDebugViewCloseButtonInteraction, 0); + CLAY_TEXT(CLAY_STRING("x"), CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); + } + } + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(1)} }, .backgroundColor = CLAY__DEBUGVIEW_COLOR_3 } ) {} + CLAY(scrollId, { .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0)} }, .clip = { .horizontal = true, .vertical = true, .childOffset = Clay_GetScrollOffset() } }) { + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0)}, .layoutDirection = CLAY_TOP_TO_BOTTOM }, .backgroundColor = ((initialElementsLength + initialRootsLength) & 1) == 0 ? CLAY__DEBUGVIEW_COLOR_2 : CLAY__DEBUGVIEW_COLOR_1 }) { + Clay_ElementId panelContentsId = Clay__HashString(CLAY_STRING("Clay__DebugViewPaneOuter"), 0); + // Element list + CLAY(panelContentsId, { .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0)} }, .floating = { .zIndex = 32766, .pointerCaptureMode = CLAY_POINTER_CAPTURE_MODE_PASSTHROUGH, .attachTo = CLAY_ATTACH_TO_PARENT, .clipTo = CLAY_CLIP_TO_ATTACHED_PARENT } }) { + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0)}, .padding = { CLAY__DEBUGVIEW_OUTER_PADDING, CLAY__DEBUGVIEW_OUTER_PADDING, 0, 0 }, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + layoutData = Clay__RenderDebugLayoutElementsList((int32_t)initialRootsLength, highlightedRow); + } + } + float contentWidth = Clay__GetHashMapItem(panelContentsId.id)->layoutElement->dimensions.width; + CLAY_AUTO_ID({ .layout = { .sizing = {.width = CLAY_SIZING_FIXED(contentWidth) }, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) {} + for (int32_t i = 0; i < layoutData.rowCount; i++) { + Clay_Color rowColor = (i & 1) == 0 ? CLAY__DEBUGVIEW_COLOR_2 : CLAY__DEBUGVIEW_COLOR_1; + if (i == layoutData.selectedElementRowIndex) { + rowColor = CLAY__DEBUGVIEW_COLOR_SELECTED_ROW; + } + if (i == highlightedRow) { + rowColor.r *= 1.25f; + rowColor.g *= 1.25f; + rowColor.b *= 1.25f; + } + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .layoutDirection = CLAY_TOP_TO_BOTTOM }, .backgroundColor = rowColor } ) {} + } + } + } + CLAY_AUTO_ID({ .layout = { .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(1)} }, .backgroundColor = CLAY__DEBUGVIEW_COLOR_3 }) {} + if (context->debugSelectedElementId != 0) { + Clay_LayoutElementHashMapItem *selectedItem = Clay__GetHashMapItem(context->debugSelectedElementId); + CLAY_AUTO_ID({ + .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(300)}, .layoutDirection = CLAY_TOP_TO_BOTTOM }, + .backgroundColor = CLAY__DEBUGVIEW_COLOR_2 , + .clip = { .vertical = true, .childOffset = Clay_GetScrollOffset() }, + .border = { .color = CLAY__DEBUGVIEW_COLOR_3, .width = { .betweenChildren = 1 } } + }) { + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT + 8)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, CLAY__DEBUGVIEW_OUTER_PADDING, 0, 0 }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} } }) { + CLAY_TEXT(CLAY_STRING("Layout Config"), infoTextConfig); + CLAY_AUTO_ID({ .layout = { .sizing = { .width = CLAY_SIZING_GROW(0) } } }) {} + if (selectedItem->elementId.stringId.length != 0) { + CLAY_TEXT(selectedItem->elementId.stringId, infoTitleConfig); + if (selectedItem->elementId.offset != 0) { + CLAY_TEXT(CLAY_STRING(" ("), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(selectedItem->elementId.offset), infoTitleConfig); + CLAY_TEXT(CLAY_STRING(")"), infoTitleConfig); + } + } + } + Clay_Padding attributeConfigPadding = {CLAY__DEBUGVIEW_OUTER_PADDING, CLAY__DEBUGVIEW_OUTER_PADDING, 8, 8}; + // Clay_LayoutConfig debug info + CLAY_AUTO_ID({ .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + // .boundingBox + CLAY_TEXT(CLAY_STRING("Bounding Box"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(selectedItem->boundingBox.x), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", y: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(selectedItem->boundingBox.y), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", width: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(selectedItem->boundingBox.width), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", height: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(selectedItem->boundingBox.height), infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + // .layoutDirection + CLAY_TEXT(CLAY_STRING("Layout Direction"), infoTitleConfig); + Clay_LayoutConfig *layoutConfig = selectedItem->layoutElement->layoutConfig; + CLAY_TEXT(layoutConfig->layoutDirection == CLAY_TOP_TO_BOTTOM ? CLAY_STRING("TOP_TO_BOTTOM") : CLAY_STRING("LEFT_TO_RIGHT"), infoTextConfig); + // .sizing + CLAY_TEXT(CLAY_STRING("Sizing"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("width: "), infoTextConfig); + Clay__RenderDebugLayoutSizing(layoutConfig->sizing.width, infoTextConfig); + } + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("height: "), infoTextConfig); + Clay__RenderDebugLayoutSizing(layoutConfig->sizing.height, infoTextConfig); + } + // .padding + CLAY_TEXT(CLAY_STRING("Padding"), infoTitleConfig); + CLAY(CLAY_ID("Clay__DebugViewElementInfoPadding"), { }) { + CLAY_TEXT(CLAY_STRING("{ left: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(layoutConfig->padding.left), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", right: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(layoutConfig->padding.right), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", top: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(layoutConfig->padding.top), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", bottom: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(layoutConfig->padding.bottom), infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + // .childGap + CLAY_TEXT(CLAY_STRING("Child Gap"), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(layoutConfig->childGap), infoTextConfig); + // .childAlignment + CLAY_TEXT(CLAY_STRING("Child Alignment"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig); + Clay_String alignX = CLAY_STRING("LEFT"); + if (layoutConfig->childAlignment.x == CLAY_ALIGN_X_CENTER) { + alignX = CLAY_STRING("CENTER"); + } else if (layoutConfig->childAlignment.x == CLAY_ALIGN_X_RIGHT) { + alignX = CLAY_STRING("RIGHT"); + } + CLAY_TEXT(alignX, infoTextConfig); + CLAY_TEXT(CLAY_STRING(", y: "), infoTextConfig); + Clay_String alignY = CLAY_STRING("TOP"); + if (layoutConfig->childAlignment.y == CLAY_ALIGN_Y_CENTER) { + alignY = CLAY_STRING("CENTER"); + } else if (layoutConfig->childAlignment.y == CLAY_ALIGN_Y_BOTTOM) { + alignY = CLAY_STRING("BOTTOM"); + } + CLAY_TEXT(alignY, infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + } + for (int32_t elementConfigIndex = 0; elementConfigIndex < selectedItem->layoutElement->elementConfigs.length; ++elementConfigIndex) { + Clay_ElementConfig *elementConfig = Clay__ElementConfigArraySlice_Get(&selectedItem->layoutElement->elementConfigs, elementConfigIndex); + Clay__RenderDebugViewElementConfigHeader(selectedItem->elementId.stringId, elementConfig->type); + switch (elementConfig->type) { + case CLAY__ELEMENT_CONFIG_TYPE_SHARED: { + Clay_SharedElementConfig *sharedConfig = elementConfig->config.sharedElementConfig; + CLAY_AUTO_ID({ .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM }}) { + // .backgroundColor + CLAY_TEXT(CLAY_STRING("Background Color"), infoTitleConfig); + Clay__RenderDebugViewColor(sharedConfig->backgroundColor, infoTextConfig); + // .cornerRadius + CLAY_TEXT(CLAY_STRING("Corner Radius"), infoTitleConfig); + Clay__RenderDebugViewCornerRadius(sharedConfig->cornerRadius, infoTextConfig); + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_TEXT: { + Clay_TextElementConfig *textConfig = elementConfig->config.textElementConfig; + CLAY_AUTO_ID({ .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + // .fontSize + CLAY_TEXT(CLAY_STRING("Font Size"), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(textConfig->fontSize), infoTextConfig); + // .fontId + CLAY_TEXT(CLAY_STRING("Font ID"), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(textConfig->fontId), infoTextConfig); + // .lineHeight + CLAY_TEXT(CLAY_STRING("Line Height"), infoTitleConfig); + CLAY_TEXT(textConfig->lineHeight == 0 ? CLAY_STRING("auto") : Clay__IntToString(textConfig->lineHeight), infoTextConfig); + // .letterSpacing + CLAY_TEXT(CLAY_STRING("Letter Spacing"), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(textConfig->letterSpacing), infoTextConfig); + // .wrapMode + CLAY_TEXT(CLAY_STRING("Wrap Mode"), infoTitleConfig); + Clay_String wrapMode = CLAY_STRING("WORDS"); + if (textConfig->wrapMode == CLAY_TEXT_WRAP_NONE) { + wrapMode = CLAY_STRING("NONE"); + } else if (textConfig->wrapMode == CLAY_TEXT_WRAP_NEWLINES) { + wrapMode = CLAY_STRING("NEWLINES"); + } + CLAY_TEXT(wrapMode, infoTextConfig); + // .textAlignment + CLAY_TEXT(CLAY_STRING("Text Alignment"), infoTitleConfig); + Clay_String textAlignment = CLAY_STRING("LEFT"); + if (textConfig->textAlignment == CLAY_TEXT_ALIGN_CENTER) { + textAlignment = CLAY_STRING("CENTER"); + } else if (textConfig->textAlignment == CLAY_TEXT_ALIGN_RIGHT) { + textAlignment = CLAY_STRING("RIGHT"); + } + CLAY_TEXT(textAlignment, infoTextConfig); + // .textColor + CLAY_TEXT(CLAY_STRING("Text Color"), infoTitleConfig); + Clay__RenderDebugViewColor(textConfig->textColor, infoTextConfig); + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_ASPECT: { + Clay_AspectRatioElementConfig *aspectRatioConfig = elementConfig->config.aspectRatioElementConfig; + CLAY(CLAY_ID("Clay__DebugViewElementInfoAspectRatioBody"), { .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + CLAY_TEXT(CLAY_STRING("Aspect Ratio"), infoTitleConfig); + // Aspect Ratio + CLAY(CLAY_ID("Clay__DebugViewElementInfoAspectRatio"), { }) { + CLAY_TEXT(Clay__IntToString(aspectRatioConfig->aspectRatio), infoTextConfig); + CLAY_TEXT(CLAY_STRING("."), infoTextConfig); + float frac = aspectRatioConfig->aspectRatio - (int)(aspectRatioConfig->aspectRatio); + frac *= 100; + if ((int)frac < 10) { + CLAY_TEXT(CLAY_STRING("0"), infoTextConfig); + } + CLAY_TEXT(Clay__IntToString(frac), infoTextConfig); + } + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_IMAGE: { + Clay_ImageElementConfig *imageConfig = elementConfig->config.imageElementConfig; + Clay_AspectRatioElementConfig aspectConfig = { 1 }; + if (Clay__ElementHasConfig(selectedItem->layoutElement, CLAY__ELEMENT_CONFIG_TYPE_ASPECT)) { + aspectConfig = *Clay__FindElementConfigWithType(selectedItem->layoutElement, CLAY__ELEMENT_CONFIG_TYPE_ASPECT).aspectRatioElementConfig; + } + CLAY(CLAY_ID("Clay__DebugViewElementInfoImageBody"), { .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + // Image Preview + CLAY_TEXT(CLAY_STRING("Preview"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .sizing = { .width = CLAY_SIZING_GROW(64, 128), .height = CLAY_SIZING_GROW(64, 128) }}, .aspectRatio = aspectConfig, .image = *imageConfig }) {} + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_CLIP: { + Clay_ClipElementConfig *clipConfig = elementConfig->config.clipElementConfig; + CLAY_AUTO_ID({ .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + // .vertical + CLAY_TEXT(CLAY_STRING("Vertical"), infoTitleConfig); + CLAY_TEXT(clipConfig->vertical ? CLAY_STRING("true") : CLAY_STRING("false") , infoTextConfig); + // .horizontal + CLAY_TEXT(CLAY_STRING("Horizontal"), infoTitleConfig); + CLAY_TEXT(clipConfig->horizontal ? CLAY_STRING("true") : CLAY_STRING("false") , infoTextConfig); + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_FLOATING: { + Clay_FloatingElementConfig *floatingConfig = elementConfig->config.floatingElementConfig; + CLAY_AUTO_ID({ .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + // .offset + CLAY_TEXT(CLAY_STRING("Offset"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(floatingConfig->offset.x), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", y: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(floatingConfig->offset.y), infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + // .expand + CLAY_TEXT(CLAY_STRING("Expand"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("{ width: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(floatingConfig->expand.width), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", height: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(floatingConfig->expand.height), infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + // .zIndex + CLAY_TEXT(CLAY_STRING("z-index"), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(floatingConfig->zIndex), infoTextConfig); + // .parentId + CLAY_TEXT(CLAY_STRING("Parent"), infoTitleConfig); + Clay_LayoutElementHashMapItem *hashItem = Clay__GetHashMapItem(floatingConfig->parentId); + CLAY_TEXT(hashItem->elementId.stringId, infoTextConfig); + // .attachPoints + CLAY_TEXT(CLAY_STRING("Attach Points"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("{ element: "), infoTextConfig); + Clay_String attachPointElement = CLAY_STRING("LEFT_TOP"); + if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_LEFT_CENTER) { + attachPointElement = CLAY_STRING("LEFT_CENTER"); + } else if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_LEFT_BOTTOM) { + attachPointElement = CLAY_STRING("LEFT_BOTTOM"); + } else if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_CENTER_TOP) { + attachPointElement = CLAY_STRING("CENTER_TOP"); + } else if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_CENTER_CENTER) { + attachPointElement = CLAY_STRING("CENTER_CENTER"); + } else if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_CENTER_BOTTOM) { + attachPointElement = CLAY_STRING("CENTER_BOTTOM"); + } else if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_RIGHT_TOP) { + attachPointElement = CLAY_STRING("RIGHT_TOP"); + } else if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_RIGHT_CENTER) { + attachPointElement = CLAY_STRING("RIGHT_CENTER"); + } else if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_RIGHT_BOTTOM) { + attachPointElement = CLAY_STRING("RIGHT_BOTTOM"); + } + CLAY_TEXT(attachPointElement, infoTextConfig); + Clay_String attachPointParent = CLAY_STRING("LEFT_TOP"); + if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_LEFT_CENTER) { + attachPointParent = CLAY_STRING("LEFT_CENTER"); + } else if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_LEFT_BOTTOM) { + attachPointParent = CLAY_STRING("LEFT_BOTTOM"); + } else if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_CENTER_TOP) { + attachPointParent = CLAY_STRING("CENTER_TOP"); + } else if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_CENTER_CENTER) { + attachPointParent = CLAY_STRING("CENTER_CENTER"); + } else if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_CENTER_BOTTOM) { + attachPointParent = CLAY_STRING("CENTER_BOTTOM"); + } else if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_RIGHT_TOP) { + attachPointParent = CLAY_STRING("RIGHT_TOP"); + } else if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_RIGHT_CENTER) { + attachPointParent = CLAY_STRING("RIGHT_CENTER"); + } else if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_RIGHT_BOTTOM) { + attachPointParent = CLAY_STRING("RIGHT_BOTTOM"); + } + CLAY_TEXT(CLAY_STRING(", parent: "), infoTextConfig); + CLAY_TEXT(attachPointParent, infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + // .pointerCaptureMode + CLAY_TEXT(CLAY_STRING("Pointer Capture Mode"), infoTitleConfig); + Clay_String pointerCaptureMode = CLAY_STRING("NONE"); + if (floatingConfig->pointerCaptureMode == CLAY_POINTER_CAPTURE_MODE_PASSTHROUGH) { + pointerCaptureMode = CLAY_STRING("PASSTHROUGH"); + } + CLAY_TEXT(pointerCaptureMode, infoTextConfig); + // .attachTo + CLAY_TEXT(CLAY_STRING("Attach To"), infoTitleConfig); + Clay_String attachTo = CLAY_STRING("NONE"); + if (floatingConfig->attachTo == CLAY_ATTACH_TO_PARENT) { + attachTo = CLAY_STRING("PARENT"); + } else if (floatingConfig->attachTo == CLAY_ATTACH_TO_ELEMENT_WITH_ID) { + attachTo = CLAY_STRING("ELEMENT_WITH_ID"); + } else if (floatingConfig->attachTo == CLAY_ATTACH_TO_ROOT) { + attachTo = CLAY_STRING("ROOT"); + } + CLAY_TEXT(attachTo, infoTextConfig); + // .clipTo + CLAY_TEXT(CLAY_STRING("Clip To"), infoTitleConfig); + Clay_String clipTo = CLAY_STRING("ATTACHED_PARENT"); + if (floatingConfig->clipTo == CLAY_CLIP_TO_NONE) { + clipTo = CLAY_STRING("NONE"); + } + CLAY_TEXT(clipTo, infoTextConfig); + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_BORDER: { + Clay_BorderElementConfig *borderConfig = elementConfig->config.borderElementConfig; + CLAY(CLAY_ID("Clay__DebugViewElementInfoBorderBody"), { .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + CLAY_TEXT(CLAY_STRING("Border Widths"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("{ left: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(borderConfig->width.left), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", right: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(borderConfig->width.right), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", top: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(borderConfig->width.top), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", bottom: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(borderConfig->width.bottom), infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + // .textColor + CLAY_TEXT(CLAY_STRING("Border Color"), infoTitleConfig); + Clay__RenderDebugViewColor(borderConfig->color, infoTextConfig); + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_CUSTOM: + default: break; + } + } + } + } else { + CLAY(CLAY_ID("Clay__DebugViewWarningsScrollPane"), { .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(300)}, .childGap = 6, .layoutDirection = CLAY_TOP_TO_BOTTOM }, .backgroundColor = CLAY__DEBUGVIEW_COLOR_2, .clip = { .horizontal = true, .vertical = true, .childOffset = Clay_GetScrollOffset() } }) { + Clay_TextElementConfig *warningConfig = CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE }); + CLAY(CLAY_ID("Clay__DebugViewWarningItemHeader"), { .layout = { .sizing = {.height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, CLAY__DEBUGVIEW_OUTER_PADDING, 0, 0 }, .childGap = 8, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} } }) { + CLAY_TEXT(CLAY_STRING("Warnings"), warningConfig); + } + CLAY(CLAY_ID("Clay__DebugViewWarningsTopBorder"), { .layout = { .sizing = { .width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(1)} }, .backgroundColor = {200, 200, 200, 255} }) {} + int32_t previousWarningsLength = context->warnings.length; + for (int32_t i = 0; i < previousWarningsLength; i++) { + Clay__Warning warning = context->warnings.internalArray[i]; + CLAY(CLAY_IDI("Clay__DebugViewWarningItem", i), { .layout = { .sizing = {.height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, CLAY__DEBUGVIEW_OUTER_PADDING, 0, 0 }, .childGap = 8, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} } }) { + CLAY_TEXT(warning.baseMessage, warningConfig); + if (warning.dynamicMessage.length > 0) { + CLAY_TEXT(warning.dynamicMessage, warningConfig); + } + } + } + } + } + } +} +#pragma endregion + +uint32_t Clay__debugViewWidth = 400; +Clay_Color Clay__debugViewHighlightColor = { 168, 66, 28, 100 }; + +Clay__WarningArray Clay__WarningArray_Allocate_Arena(int32_t capacity, Clay_Arena *arena) { + size_t totalSizeBytes = capacity * sizeof(Clay_String); + Clay__WarningArray array = {.capacity = capacity, .length = 0}; + uintptr_t nextAllocOffset = arena->nextAllocation + (64 - (arena->nextAllocation % 64)); + if (nextAllocOffset + totalSizeBytes <= arena->capacity) { + array.internalArray = (Clay__Warning*)((uintptr_t)arena->memory + (uintptr_t)nextAllocOffset); + arena->nextAllocation = nextAllocOffset + totalSizeBytes; + } + else { + Clay__currentContext->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_ARENA_CAPACITY_EXCEEDED, + .errorText = CLAY_STRING("Clay attempted to allocate memory in its arena, but ran out of capacity. Try increasing the capacity of the arena passed to Clay_Initialize()"), + .userData = Clay__currentContext->errorHandler.userData }); + } + return array; +} + +Clay__Warning *Clay__WarningArray_Add(Clay__WarningArray *array, Clay__Warning item) +{ + if (array->length < array->capacity) { + array->internalArray[array->length++] = item; + return &array->internalArray[array->length - 1]; + } + return &CLAY__WARNING_DEFAULT; +} + +void* Clay__Array_Allocate_Arena(int32_t capacity, uint32_t itemSize, Clay_Arena *arena) +{ + size_t totalSizeBytes = capacity * itemSize; + uintptr_t nextAllocOffset = arena->nextAllocation + ((64 - (arena->nextAllocation % 64)) & 63); + if (nextAllocOffset + totalSizeBytes <= arena->capacity) { + arena->nextAllocation = nextAllocOffset + totalSizeBytes; + return (void*)((uintptr_t)arena->memory + (uintptr_t)nextAllocOffset); + } + else { + Clay__currentContext->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_ARENA_CAPACITY_EXCEEDED, + .errorText = CLAY_STRING("Clay attempted to allocate memory in its arena, but ran out of capacity. Try increasing the capacity of the arena passed to Clay_Initialize()"), + .userData = Clay__currentContext->errorHandler.userData }); + } + return CLAY__NULL; +} + +bool Clay__Array_RangeCheck(int32_t index, int32_t length) +{ + if (index < length && index >= 0) { + return true; + } + Clay_Context* context = Clay_GetCurrentContext(); + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_INTERNAL_ERROR, + .errorText = CLAY_STRING("Clay attempted to make an out of bounds array access. This is an internal error and is likely a bug."), + .userData = context->errorHandler.userData }); + return false; +} + +bool Clay__Array_AddCapacityCheck(int32_t length, int32_t capacity) +{ + if (length < capacity) { + return true; + } + Clay_Context* context = Clay_GetCurrentContext(); + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_INTERNAL_ERROR, + .errorText = CLAY_STRING("Clay attempted to make an out of bounds array access. This is an internal error and is likely a bug."), + .userData = context->errorHandler.userData }); + return false; +} + +// PUBLIC API FROM HERE --------------------------------------- + +CLAY_WASM_EXPORT("Clay_MinMemorySize") +uint32_t Clay_MinMemorySize(void) { + Clay_Context fakeContext = { + .maxElementCount = Clay__defaultMaxElementCount, + .maxMeasureTextCacheWordCount = Clay__defaultMaxMeasureTextWordCacheCount, + .internalArena = { + .capacity = SIZE_MAX, + .memory = NULL, + } + }; + Clay_Context* currentContext = Clay_GetCurrentContext(); + if (currentContext) { + fakeContext.maxElementCount = currentContext->maxElementCount; + fakeContext.maxMeasureTextCacheWordCount = currentContext->maxMeasureTextCacheWordCount; + } + // Reserve space in the arena for the context, important for calculating min memory size correctly + Clay__Context_Allocate_Arena(&fakeContext.internalArena); + Clay__InitializePersistentMemory(&fakeContext); + Clay__InitializeEphemeralMemory(&fakeContext); + return (uint32_t)fakeContext.internalArena.nextAllocation + 128; +} + +CLAY_WASM_EXPORT("Clay_CreateArenaWithCapacityAndMemory") +Clay_Arena Clay_CreateArenaWithCapacityAndMemory(size_t capacity, void *memory) { + Clay_Arena arena = { + .capacity = capacity, + .memory = (char *)memory + }; + return arena; +} + +#ifndef CLAY_WASM +void Clay_SetMeasureTextFunction(Clay_Dimensions (*measureTextFunction)(Clay_StringSlice text, Clay_TextElementConfig *config, void *userData), void *userData) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay__MeasureText = measureTextFunction; + context->measureTextUserData = userData; +} +void Clay_SetQueryScrollOffsetFunction(Clay_Vector2 (*queryScrollOffsetFunction)(uint32_t elementId, void *userData), void *userData) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay__QueryScrollOffset = queryScrollOffsetFunction; + context->queryScrollOffsetUserData = userData; +} +#endif + +CLAY_WASM_EXPORT("Clay_SetLayoutDimensions") +void Clay_SetLayoutDimensions(Clay_Dimensions dimensions) { + Clay_GetCurrentContext()->layoutDimensions = dimensions; +} + +CLAY_WASM_EXPORT("Clay_SetPointerState") +void Clay_SetPointerState(Clay_Vector2 position, bool isPointerDown) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->booleanWarnings.maxElementsExceeded) { + return; + } + context->pointerInfo.position = position; + context->pointerOverIds.length = 0; + Clay__int32_tArray dfsBuffer = context->layoutElementChildrenBuffer; + for (int32_t rootIndex = context->layoutElementTreeRoots.length - 1; rootIndex >= 0; --rootIndex) { + dfsBuffer.length = 0; + Clay__LayoutElementTreeRoot *root = Clay__LayoutElementTreeRootArray_Get(&context->layoutElementTreeRoots, rootIndex); + Clay__int32_tArray_Add(&dfsBuffer, (int32_t)root->layoutElementIndex); + context->treeNodeVisited.internalArray[0] = false; + bool found = false; + while (dfsBuffer.length > 0) { + if (context->treeNodeVisited.internalArray[dfsBuffer.length - 1]) { + dfsBuffer.length--; + continue; + } + context->treeNodeVisited.internalArray[dfsBuffer.length - 1] = true; + Clay_LayoutElement *currentElement = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&dfsBuffer, (int)dfsBuffer.length - 1)); + Clay_LayoutElementHashMapItem *mapItem = Clay__GetHashMapItem(currentElement->id); // TODO think of a way around this, maybe the fact that it's essentially a binary tree limits the cost, but the worst case is not great + int32_t clipElementId = Clay__int32_tArray_GetValue(&context->layoutElementClipElementIds, (int32_t)(currentElement - context->layoutElements.internalArray)); + Clay_LayoutElementHashMapItem *clipItem = Clay__GetHashMapItem(clipElementId); + if (mapItem) { + Clay_BoundingBox elementBox = mapItem->boundingBox; + elementBox.x -= root->pointerOffset.x; + elementBox.y -= root->pointerOffset.y; + if ((Clay__PointIsInsideRect(position, elementBox)) && (clipElementId == 0 || (Clay__PointIsInsideRect(position, clipItem->boundingBox)) || context->externalScrollHandlingEnabled)) { + if (mapItem->onHoverFunction) { + mapItem->onHoverFunction(mapItem->elementId, context->pointerInfo, mapItem->hoverFunctionUserData); + } + Clay_ElementIdArray_Add(&context->pointerOverIds, mapItem->elementId); + found = true; + } + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT)) { + dfsBuffer.length--; + continue; + } + for (int32_t i = currentElement->childrenOrTextContent.children.length - 1; i >= 0; --i) { + Clay__int32_tArray_Add(&dfsBuffer, currentElement->childrenOrTextContent.children.elements[i]); + context->treeNodeVisited.internalArray[dfsBuffer.length - 1] = false; // TODO needs to be ranged checked + } + } else { + dfsBuffer.length--; + } + } + + Clay_LayoutElement *rootElement = Clay_LayoutElementArray_Get(&context->layoutElements, root->layoutElementIndex); + if (found && Clay__ElementHasConfig(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING) && + Clay__FindElementConfigWithType(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING).floatingElementConfig->pointerCaptureMode == CLAY_POINTER_CAPTURE_MODE_CAPTURE) { + break; + } + } + + if (isPointerDown) { + if (context->pointerInfo.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + context->pointerInfo.state = CLAY_POINTER_DATA_PRESSED; + } else if (context->pointerInfo.state != CLAY_POINTER_DATA_PRESSED) { + context->pointerInfo.state = CLAY_POINTER_DATA_PRESSED_THIS_FRAME; + } + } else { + if (context->pointerInfo.state == CLAY_POINTER_DATA_RELEASED_THIS_FRAME) { + context->pointerInfo.state = CLAY_POINTER_DATA_RELEASED; + } else if (context->pointerInfo.state != CLAY_POINTER_DATA_RELEASED) { + context->pointerInfo.state = CLAY_POINTER_DATA_RELEASED_THIS_FRAME; + } + } +} + +CLAY_WASM_EXPORT("Clay_Initialize") +Clay_Context* Clay_Initialize(Clay_Arena arena, Clay_Dimensions layoutDimensions, Clay_ErrorHandler errorHandler) { + // Cacheline align memory passed in + uintptr_t baseOffset = 64 - ((uintptr_t)arena.memory % 64); + baseOffset = baseOffset == 64 ? 0 : baseOffset; + arena.memory += baseOffset; + Clay_Context *context = Clay__Context_Allocate_Arena(&arena); + if (context == NULL) return NULL; + // DEFAULTS + Clay_Context *oldContext = Clay_GetCurrentContext(); + *context = CLAY__INIT(Clay_Context) { + .maxElementCount = oldContext ? oldContext->maxElementCount : Clay__defaultMaxElementCount, + .maxMeasureTextCacheWordCount = oldContext ? oldContext->maxMeasureTextCacheWordCount : Clay__defaultMaxMeasureTextWordCacheCount, + .errorHandler = errorHandler.errorHandlerFunction ? errorHandler : CLAY__INIT(Clay_ErrorHandler) { Clay__ErrorHandlerFunctionDefault, 0 }, + .layoutDimensions = layoutDimensions, + .internalArena = arena, + }; + Clay_SetCurrentContext(context); + Clay__InitializePersistentMemory(context); + Clay__InitializeEphemeralMemory(context); + for (int32_t i = 0; i < context->layoutElementsHashMap.capacity; ++i) { + context->layoutElementsHashMap.internalArray[i] = -1; + } + for (int32_t i = 0; i < context->measureTextHashMap.capacity; ++i) { + context->measureTextHashMap.internalArray[i] = 0; + } + context->measureTextHashMapInternal.length = 1; // Reserve the 0 value to mean "no next element" + context->layoutDimensions = layoutDimensions; + return context; +} + +CLAY_WASM_EXPORT("Clay_GetCurrentContext") +Clay_Context* Clay_GetCurrentContext(void) { + return Clay__currentContext; +} + +CLAY_WASM_EXPORT("Clay_SetCurrentContext") +void Clay_SetCurrentContext(Clay_Context* context) { + Clay__currentContext = context; +} + +CLAY_WASM_EXPORT("Clay_GetScrollOffset") +Clay_Vector2 Clay_GetScrollOffset(void) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->booleanWarnings.maxElementsExceeded) { + return CLAY__INIT(Clay_Vector2) CLAY__DEFAULT_STRUCT; + } + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + // If the element has no id attached at this point, we need to generate one + if (openLayoutElement->id == 0) { + Clay__GenerateIdForAnonymousElement(openLayoutElement); + } + for (int32_t i = 0; i < context->scrollContainerDatas.length; i++) { + Clay__ScrollContainerDataInternal *mapping = Clay__ScrollContainerDataInternalArray_Get(&context->scrollContainerDatas, i); + if (mapping->layoutElement == openLayoutElement) { + return mapping->scrollPosition; + } + } + return CLAY__INIT(Clay_Vector2) CLAY__DEFAULT_STRUCT; +} + +CLAY_WASM_EXPORT("Clay_UpdateScrollContainers") +void Clay_UpdateScrollContainers(bool enableDragScrolling, Clay_Vector2 scrollDelta, float deltaTime) { + Clay_Context* context = Clay_GetCurrentContext(); + bool isPointerActive = enableDragScrolling && (context->pointerInfo.state == CLAY_POINTER_DATA_PRESSED || context->pointerInfo.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME); + // Don't apply scroll events to ancestors of the inner element + int32_t highestPriorityElementIndex = -1; + Clay__ScrollContainerDataInternal *highestPriorityScrollData = CLAY__NULL; + for (int32_t i = 0; i < context->scrollContainerDatas.length; i++) { + Clay__ScrollContainerDataInternal *scrollData = Clay__ScrollContainerDataInternalArray_Get(&context->scrollContainerDatas, i); + if (!scrollData->openThisFrame) { + Clay__ScrollContainerDataInternalArray_RemoveSwapback(&context->scrollContainerDatas, i); + continue; + } + scrollData->openThisFrame = false; + Clay_LayoutElementHashMapItem *hashMapItem = Clay__GetHashMapItem(scrollData->elementId); + // Element isn't rendered this frame but scroll offset has been retained + if (!hashMapItem) { + Clay__ScrollContainerDataInternalArray_RemoveSwapback(&context->scrollContainerDatas, i); + continue; + } + + // Touch / click is released + if (!isPointerActive && scrollData->pointerScrollActive) { + float xDiff = scrollData->scrollPosition.x - scrollData->scrollOrigin.x; + if (xDiff < -10 || xDiff > 10) { + scrollData->scrollMomentum.x = (scrollData->scrollPosition.x - scrollData->scrollOrigin.x) / (scrollData->momentumTime * 25); + } + float yDiff = scrollData->scrollPosition.y - scrollData->scrollOrigin.y; + if (yDiff < -10 || yDiff > 10) { + scrollData->scrollMomentum.y = (scrollData->scrollPosition.y - scrollData->scrollOrigin.y) / (scrollData->momentumTime * 25); + } + scrollData->pointerScrollActive = false; + + scrollData->pointerOrigin = CLAY__INIT(Clay_Vector2){0,0}; + scrollData->scrollOrigin = CLAY__INIT(Clay_Vector2){0,0}; + scrollData->momentumTime = 0; + } + + // Apply existing momentum + scrollData->scrollPosition.x += scrollData->scrollMomentum.x; + scrollData->scrollMomentum.x *= 0.95f; + bool scrollOccurred = scrollDelta.x != 0 || scrollDelta.y != 0; + if ((scrollData->scrollMomentum.x > -0.1f && scrollData->scrollMomentum.x < 0.1f) || scrollOccurred) { + scrollData->scrollMomentum.x = 0; + } + scrollData->scrollPosition.x = CLAY__MIN(CLAY__MAX(scrollData->scrollPosition.x, -(CLAY__MAX(scrollData->contentSize.width - scrollData->layoutElement->dimensions.width, 0))), 0); + + scrollData->scrollPosition.y += scrollData->scrollMomentum.y; + scrollData->scrollMomentum.y *= 0.95f; + if ((scrollData->scrollMomentum.y > -0.1f && scrollData->scrollMomentum.y < 0.1f) || scrollOccurred) { + scrollData->scrollMomentum.y = 0; + } + scrollData->scrollPosition.y = CLAY__MIN(CLAY__MAX(scrollData->scrollPosition.y, -(CLAY__MAX(scrollData->contentSize.height - scrollData->layoutElement->dimensions.height, 0))), 0); + + for (int32_t j = 0; j < context->pointerOverIds.length; ++j) { // TODO n & m are small here but this being n*m gives me the creeps + if (scrollData->layoutElement->id == Clay_ElementIdArray_Get(&context->pointerOverIds, j)->id) { + highestPriorityElementIndex = j; + highestPriorityScrollData = scrollData; + } + } + } + + if (highestPriorityElementIndex > -1 && highestPriorityScrollData) { + Clay_LayoutElement *scrollElement = highestPriorityScrollData->layoutElement; + Clay_ClipElementConfig *clipConfig = Clay__FindElementConfigWithType(scrollElement, CLAY__ELEMENT_CONFIG_TYPE_CLIP).clipElementConfig; + bool canScrollVertically = clipConfig->vertical && highestPriorityScrollData->contentSize.height > scrollElement->dimensions.height; + bool canScrollHorizontally = clipConfig->horizontal && highestPriorityScrollData->contentSize.width > scrollElement->dimensions.width; + // Handle wheel scroll + if (canScrollVertically) { + highestPriorityScrollData->scrollPosition.y = highestPriorityScrollData->scrollPosition.y + scrollDelta.y * 10; + } + if (canScrollHorizontally) { + highestPriorityScrollData->scrollPosition.x = highestPriorityScrollData->scrollPosition.x + scrollDelta.x * 10; + } + // Handle click / touch scroll + if (isPointerActive) { + highestPriorityScrollData->scrollMomentum = CLAY__INIT(Clay_Vector2)CLAY__DEFAULT_STRUCT; + if (!highestPriorityScrollData->pointerScrollActive) { + highestPriorityScrollData->pointerOrigin = context->pointerInfo.position; + highestPriorityScrollData->scrollOrigin = highestPriorityScrollData->scrollPosition; + highestPriorityScrollData->pointerScrollActive = true; + } else { + float scrollDeltaX = 0, scrollDeltaY = 0; + if (canScrollHorizontally) { + float oldXScrollPosition = highestPriorityScrollData->scrollPosition.x; + highestPriorityScrollData->scrollPosition.x = highestPriorityScrollData->scrollOrigin.x + (context->pointerInfo.position.x - highestPriorityScrollData->pointerOrigin.x); + highestPriorityScrollData->scrollPosition.x = CLAY__MAX(CLAY__MIN(highestPriorityScrollData->scrollPosition.x, 0), -(highestPriorityScrollData->contentSize.width - highestPriorityScrollData->boundingBox.width)); + scrollDeltaX = highestPriorityScrollData->scrollPosition.x - oldXScrollPosition; + } + if (canScrollVertically) { + float oldYScrollPosition = highestPriorityScrollData->scrollPosition.y; + highestPriorityScrollData->scrollPosition.y = highestPriorityScrollData->scrollOrigin.y + (context->pointerInfo.position.y - highestPriorityScrollData->pointerOrigin.y); + highestPriorityScrollData->scrollPosition.y = CLAY__MAX(CLAY__MIN(highestPriorityScrollData->scrollPosition.y, 0), -(highestPriorityScrollData->contentSize.height - highestPriorityScrollData->boundingBox.height)); + scrollDeltaY = highestPriorityScrollData->scrollPosition.y - oldYScrollPosition; + } + if (scrollDeltaX > -0.1f && scrollDeltaX < 0.1f && scrollDeltaY > -0.1f && scrollDeltaY < 0.1f && highestPriorityScrollData->momentumTime > 0.15f) { + highestPriorityScrollData->momentumTime = 0; + highestPriorityScrollData->pointerOrigin = context->pointerInfo.position; + highestPriorityScrollData->scrollOrigin = highestPriorityScrollData->scrollPosition; + } else { + highestPriorityScrollData->momentumTime += deltaTime; + } + } + } + // Clamp any changes to scroll position to the maximum size of the contents + if (canScrollVertically) { + highestPriorityScrollData->scrollPosition.y = CLAY__MAX(CLAY__MIN(highestPriorityScrollData->scrollPosition.y, 0), -(highestPriorityScrollData->contentSize.height - scrollElement->dimensions.height)); + } + if (canScrollHorizontally) { + highestPriorityScrollData->scrollPosition.x = CLAY__MAX(CLAY__MIN(highestPriorityScrollData->scrollPosition.x, 0), -(highestPriorityScrollData->contentSize.width - scrollElement->dimensions.width)); + } + } +} + +CLAY_WASM_EXPORT("Clay_BeginLayout") +void Clay_BeginLayout(void) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay__InitializeEphemeralMemory(context); + context->generation++; + context->dynamicElementIndex = 0; + // Set up the root container that covers the entire window + Clay_Dimensions rootDimensions = {context->layoutDimensions.width, context->layoutDimensions.height}; + if (context->debugModeEnabled) { + rootDimensions.width -= (float)Clay__debugViewWidth; + } + context->booleanWarnings = CLAY__INIT(Clay_BooleanWarnings) CLAY__DEFAULT_STRUCT; + Clay__OpenElementWithId(CLAY_ID("Clay__RootContainer")); + Clay__ConfigureOpenElement(CLAY__INIT(Clay_ElementDeclaration) { + .layout = { .sizing = {CLAY_SIZING_FIXED((rootDimensions.width)), CLAY_SIZING_FIXED(rootDimensions.height)} } + }); + Clay__int32_tArray_Add(&context->openLayoutElementStack, 0); + Clay__LayoutElementTreeRootArray_Add(&context->layoutElementTreeRoots, CLAY__INIT(Clay__LayoutElementTreeRoot) { .layoutElementIndex = 0 }); +} + +CLAY_WASM_EXPORT("Clay_EndLayout") +Clay_RenderCommandArray Clay_EndLayout(void) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay__CloseElement(); + bool elementsExceededBeforeDebugView = context->booleanWarnings.maxElementsExceeded; + if (context->debugModeEnabled && !elementsExceededBeforeDebugView) { + context->warningsEnabled = false; + Clay__RenderDebugView(); + context->warningsEnabled = true; + } + if (context->booleanWarnings.maxElementsExceeded) { + Clay_String message; + if (!elementsExceededBeforeDebugView) { + message = CLAY_STRING("Clay Error: Layout elements exceeded Clay__maxElementCount after adding the debug-view to the layout."); + } else { + message = CLAY_STRING("Clay Error: Layout elements exceeded Clay__maxElementCount"); + } + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand ) { + .boundingBox = { context->layoutDimensions.width / 2 - 59 * 4, context->layoutDimensions.height / 2, 0, 0 }, + .renderData = { .text = { .stringContents = CLAY__INIT(Clay_StringSlice) { .length = message.length, .chars = message.chars, .baseChars = message.chars }, .textColor = {255, 0, 0, 255}, .fontSize = 16 } }, + .commandType = CLAY_RENDER_COMMAND_TYPE_TEXT + }); + } + if (context->openLayoutElementStack.length > 1) { + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_UNBALANCED_OPEN_CLOSE, + .errorText = CLAY_STRING("There were still open layout elements when EndLayout was called. This results from an unequal number of calls to Clay__OpenElement and Clay__CloseElement."), + .userData = context->errorHandler.userData }); + } + Clay__CalculateFinalLayout(); + return context->renderCommands; +} + +CLAY_WASM_EXPORT("Clay_GetElementId") +Clay_ElementId Clay_GetElementId(Clay_String idString) { + return Clay__HashString(idString, 0); +} + +CLAY_WASM_EXPORT("Clay_GetElementIdWithIndex") +Clay_ElementId Clay_GetElementIdWithIndex(Clay_String idString, uint32_t index) { + return Clay__HashStringWithOffset(idString, index, 0); +} + +bool Clay_Hovered(void) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->booleanWarnings.maxElementsExceeded) { + return false; + } + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + // If the element has no id attached at this point, we need to generate one + if (openLayoutElement->id == 0) { + Clay__GenerateIdForAnonymousElement(openLayoutElement); + } + for (int32_t i = 0; i < context->pointerOverIds.length; ++i) { + if (Clay_ElementIdArray_Get(&context->pointerOverIds, i)->id == openLayoutElement->id) { + return true; + } + } + return false; +} + +void Clay_OnHover(void (*onHoverFunction)(Clay_ElementId elementId, Clay_PointerData pointerInfo, intptr_t userData), intptr_t userData) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->booleanWarnings.maxElementsExceeded) { + return; + } + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + if (openLayoutElement->id == 0) { + Clay__GenerateIdForAnonymousElement(openLayoutElement); + } + Clay_LayoutElementHashMapItem *hashMapItem = Clay__GetHashMapItem(openLayoutElement->id); + hashMapItem->onHoverFunction = onHoverFunction; + hashMapItem->hoverFunctionUserData = userData; +} + +CLAY_WASM_EXPORT("Clay_PointerOver") +bool Clay_PointerOver(Clay_ElementId elementId) { // TODO return priority for separating multiple results + Clay_Context* context = Clay_GetCurrentContext(); + for (int32_t i = 0; i < context->pointerOverIds.length; ++i) { + if (Clay_ElementIdArray_Get(&context->pointerOverIds, i)->id == elementId.id) { + return true; + } + } + return false; +} + +CLAY_WASM_EXPORT("Clay_GetScrollContainerData") +Clay_ScrollContainerData Clay_GetScrollContainerData(Clay_ElementId id) { + Clay_Context* context = Clay_GetCurrentContext(); + for (int32_t i = 0; i < context->scrollContainerDatas.length; ++i) { + Clay__ScrollContainerDataInternal *scrollContainerData = Clay__ScrollContainerDataInternalArray_Get(&context->scrollContainerDatas, i); + if (scrollContainerData->elementId == id.id) { + Clay_ClipElementConfig *clipElementConfig = Clay__FindElementConfigWithType(scrollContainerData->layoutElement, CLAY__ELEMENT_CONFIG_TYPE_CLIP).clipElementConfig; + if (!clipElementConfig) { // This can happen on the first frame before a scroll container is declared + return CLAY__INIT(Clay_ScrollContainerData) CLAY__DEFAULT_STRUCT; + } + return CLAY__INIT(Clay_ScrollContainerData) { + .scrollPosition = &scrollContainerData->scrollPosition, + .scrollContainerDimensions = { scrollContainerData->boundingBox.width, scrollContainerData->boundingBox.height }, + .contentDimensions = scrollContainerData->contentSize, + .config = *clipElementConfig, + .found = true + }; + } + } + return CLAY__INIT(Clay_ScrollContainerData) CLAY__DEFAULT_STRUCT; +} + +CLAY_WASM_EXPORT("Clay_GetElementData") +Clay_ElementData Clay_GetElementData(Clay_ElementId id){ + Clay_LayoutElementHashMapItem * item = Clay__GetHashMapItem(id.id); + if(item == &Clay_LayoutElementHashMapItem_DEFAULT) { + return CLAY__INIT(Clay_ElementData) CLAY__DEFAULT_STRUCT; + } + + return CLAY__INIT(Clay_ElementData){ + .boundingBox = item->boundingBox, + .found = true + }; +} + +CLAY_WASM_EXPORT("Clay_SetDebugModeEnabled") +void Clay_SetDebugModeEnabled(bool enabled) { + Clay_Context* context = Clay_GetCurrentContext(); + context->debugModeEnabled = enabled; +} + +CLAY_WASM_EXPORT("Clay_IsDebugModeEnabled") +bool Clay_IsDebugModeEnabled(void) { + Clay_Context* context = Clay_GetCurrentContext(); + return context->debugModeEnabled; +} + +CLAY_WASM_EXPORT("Clay_SetCullingEnabled") +void Clay_SetCullingEnabled(bool enabled) { + Clay_Context* context = Clay_GetCurrentContext(); + context->disableCulling = !enabled; +} + +CLAY_WASM_EXPORT("Clay_SetExternalScrollHandlingEnabled") +void Clay_SetExternalScrollHandlingEnabled(bool enabled) { + Clay_Context* context = Clay_GetCurrentContext(); + context->externalScrollHandlingEnabled = enabled; +} + +CLAY_WASM_EXPORT("Clay_GetMaxElementCount") +int32_t Clay_GetMaxElementCount(void) { + Clay_Context* context = Clay_GetCurrentContext(); + return context->maxElementCount; +} + +CLAY_WASM_EXPORT("Clay_SetMaxElementCount") +void Clay_SetMaxElementCount(int32_t maxElementCount) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context) { + context->maxElementCount = maxElementCount; + } else { + Clay__defaultMaxElementCount = maxElementCount; // TODO: Fix this + Clay__defaultMaxMeasureTextWordCacheCount = maxElementCount * 2; + } +} + +CLAY_WASM_EXPORT("Clay_GetMaxMeasureTextCacheWordCount") +int32_t Clay_GetMaxMeasureTextCacheWordCount(void) { + Clay_Context* context = Clay_GetCurrentContext(); + return context->maxMeasureTextCacheWordCount; +} + +CLAY_WASM_EXPORT("Clay_SetMaxMeasureTextCacheWordCount") +void Clay_SetMaxMeasureTextCacheWordCount(int32_t maxMeasureTextCacheWordCount) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context) { + Clay__currentContext->maxMeasureTextCacheWordCount = maxMeasureTextCacheWordCount; + } else { + Clay__defaultMaxMeasureTextWordCacheCount = maxMeasureTextCacheWordCount; // TODO: Fix this + } +} + +CLAY_WASM_EXPORT("Clay_ResetMeasureTextCache") +void Clay_ResetMeasureTextCache(void) { + Clay_Context* context = Clay_GetCurrentContext(); + context->measureTextHashMapInternal.length = 0; + context->measureTextHashMapInternalFreeList.length = 0; + context->measureTextHashMap.length = 0; + context->measuredWords.length = 0; + context->measuredWordsFreeList.length = 0; + + for (int32_t i = 0; i < context->measureTextHashMap.capacity; ++i) { + context->measureTextHashMap.internalArray[i] = 0; + } + context->measureTextHashMapInternal.length = 1; // Reserve the 0 value to mean "no next element" +} + +#endif // CLAY_IMPLEMENTATION + +/* +LICENSE +zlib/libpng license + +Copyright (c) 2024 Nic Barker + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the +use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software in a + product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ diff --git a/src/main.c b/src/main.c index 5e88483..11eaf95 100644 --- a/src/main.c +++ b/src/main.c @@ -1,7 +1,5 @@ -#include -#define CLAY_IMPLEMENTATION #include -#include +#include "renderer/clay_renderer_SDL3.h" #include "application.h" #include "defs.h" @@ -12,6 +10,7 @@ #include #include #include +#include #include #include #include diff --git a/src/renderer/clay_renderer_SDL3.c b/src/renderer/clay_renderer_SDL3.c new file mode 100644 index 0000000..b101ab7 --- /dev/null +++ b/src/renderer/clay_renderer_SDL3.c @@ -0,0 +1,261 @@ +#include "clay_renderer_SDL3.h" + +#define CLAY_IMPLEMENTATION +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Global for convenience. Even in 4K this is enough for smooth curves (low radius or rect size coupled with + * no AA or low resolution might make it appear as jagged curves) */ +static int NUM_CIRCLE_SEGMENTS = 16; + +static void SDL_Clay_GenerateRoundedRectCorner(SDL_Vertex *vertices, size_t begin, size_t count, SDL_FPoint origin, SDL_FPoint offset, SDL_FColor color, SDL_FPoint texel, float radius) { + assert(count > 0); + if (count == 1) { + vertices[begin] = (SDL_Vertex){ { origin.x, origin.y }, color, texel }; + } else { + constexpr double quarterCircleRadians = SDL_PI_D / 2.0; + for (size_t i = 0; i < count; ++i) { + double const angle = (quarterCircleRadians / ((double)count-1)) * i; + vertices[begin + i] = (SDL_Vertex) { .position = { + origin.x + (radius * (offset.x * SDL_cos(angle) - offset.y * SDL_sin(angle))), + origin.y + (radius * (offset.x * SDL_sin(angle) + offset.y * SDL_cos(angle))) + }, + .color = color, .tex_coord = texel + }; + } + } +} + +//all rendering is performed by a single SDL call, avoiding multiple RenderRect + plumbing choice for circles. +static void SDL_Clay_RenderFillRoundedRect(Clay_SDL3RendererData *rendererData, const SDL_FRect rect, const Clay_CornerRadius cornerRadius, const Clay_Color clayColor) { + static constexpr SDL_FPoint topLeftTexel = { 0, 0 }; + static constexpr SDL_FPoint topRightTexel = { 1, 0 }; + static constexpr SDL_FPoint bottomRightTexel = { 1, 1 }; + static constexpr SDL_FPoint bottomLeftTexel = { 0, 1 }; + SDL_FColor const color = { clayColor.r/255, clayColor.g/255, clayColor.b/255, clayColor.a/255 }; + + const float maxRadius = SDL_min(rect.w, rect.h) / 2.0f; + float radii[4] = { + SDL_min(cornerRadius.topLeft, maxRadius), + SDL_min(cornerRadius.topRight, maxRadius), + SDL_min(cornerRadius.bottomLeft, maxRadius), + SDL_min(cornerRadius.bottomRight, maxRadius), + }; + int numCircleSegments[4] = { 1, 1, 1, 1 }; + int totalVertices = 0; + for (int i = 0; i < 4; ++i) { + numCircleSegments[i] = SDL_clamp((int)radii[i] / 2, 1, NUM_CIRCLE_SEGMENTS); + SDL_Log("num segments %d: %d", i, numCircleSegments[i]); + SDL_Log("radius %d: %f", i, radii[i]); + totalVertices += numCircleSegments[i]; + } + + size_t vindex = 0; + // generate topleft corner + SDL_FPoint origin = { + rect.x + radii[0], + rect.y + radii[0] + }; + SDL_FPoint offset = { -1, 0 }; + SDL_Vertex vertices[totalVertices]; + SDL_Clay_GenerateRoundedRectCorner(vertices, vindex, numCircleSegments[0], origin, offset, color, topLeftTexel, radii[0]); + vindex += numCircleSegments[0]; + origin = (SDL_FPoint) { + rect.x + rect.w - radii[1], + rect.y + radii[1] + }; + offset = (SDL_FPoint) { 0, -1 }; + SDL_Clay_GenerateRoundedRectCorner(vertices, vindex, numCircleSegments[1], origin, offset, color, topRightTexel, radii[1]); + vindex += numCircleSegments[1]; + origin = (SDL_FPoint) { + rect.x + rect.w - radii[2], + rect.y + rect.h - radii[2] + }; + offset = (SDL_FPoint) { 1, 0 }; + SDL_Clay_GenerateRoundedRectCorner(vertices, vindex, numCircleSegments[2], origin, offset, color, bottomRightTexel, radii[2]); + vindex += numCircleSegments[2]; + origin = (SDL_FPoint) { + rect.x + radii[3], + rect.y + rect.h - radii[3] + }; + offset = (SDL_FPoint) { 0, 1 }; + SDL_Clay_GenerateRoundedRectCorner(vertices, vindex, numCircleSegments[3], origin, offset, color, bottomLeftTexel, radii[3]); + vindex += numCircleSegments[3]; + + assert(vindex == totalVertices); + size_t totalTris = totalVertices - 2; + int totalIndeces = totalTris * 3; + int indeces[totalTris * 3]; + for (size_t i = 0; i < totalTris; ++i) { + int *tri = indeces + (i * 3); + tri[0] = i + 1; + tri[1] = i + 2; + tri[2] = 0; + } + + // Render everything + SDL_RenderGeometry(rendererData->renderer, NULL, vertices, totalVertices, indeces, totalIndeces); + // Render debug info +#if 1 + for (size_t i = 0; i < totalTris; ++i) { + SDL_SetRenderDrawColor(rendererData->renderer, 255, 255, 255, 255); + SDL_RenderLine(rendererData->renderer, vertices[0].position.x, vertices[0].position.y, vertices[i+2].position.x, vertices[i+2].position.y); + SDL_RenderLine(rendererData->renderer, vertices[0].position.x, vertices[0].position.y, vertices[i+1].position.x, vertices[i+1].position.y); + SDL_RenderLine(rendererData->renderer, vertices[i+1].position.x, vertices[i+1].position.y, vertices[i+2].position.x, vertices[i+2].position.y); + } +#endif +} + +static void SDL_Clay_RenderArc(Clay_SDL3RendererData *rendererData, const SDL_FPoint center, const float radius, const float startAngle, const float endAngle, const float thickness, const Clay_Color color) { + SDL_SetRenderDrawColor(rendererData->renderer, color.r, color.g, color.b, color.a); + + const float radStart = startAngle * (SDL_PI_F / 180.0f); + const float radEnd = endAngle * (SDL_PI_F / 180.0f); + + const int numCircleSegments = SDL_max(NUM_CIRCLE_SEGMENTS, (int)(radius * 1.5f)); //increase circle segments for larger circles, 1.5 is arbitrary. + + const float angleStep = (radEnd - radStart) / (float)numCircleSegments; + const float thicknessStep = 0.4f; //arbitrary value to avoid overlapping lines. Changing THICKNESS_STEP or numCircleSegments might cause artifacts. + + for (float t = thicknessStep; t < thickness - thicknessStep; t += thicknessStep) { + SDL_FPoint points[numCircleSegments + 1]; + const float clampedRadius = SDL_max(radius - t, 1.0f); + + for (int i = 0; i <= numCircleSegments; i++) { + const float angle = radStart + i * angleStep; + points[i] = (SDL_FPoint){ + SDL_roundf(center.x + SDL_cosf(angle) * clampedRadius), + SDL_roundf(center.y + SDL_sinf(angle) * clampedRadius) }; + } + SDL_RenderLines(rendererData->renderer, points, numCircleSegments + 1); + } +} + +SDL_Rect currentClippingRectangle; + +void SDL_Clay_RenderClayCommands(Clay_SDL3RendererData *rendererData, Clay_RenderCommandArray *rcommands) +{ + for (size_t i = 0; i < rcommands->length; i++) { + Clay_RenderCommand *rcmd = Clay_RenderCommandArray_Get(rcommands, i); + const Clay_BoundingBox bounding_box = rcmd->boundingBox; + const SDL_FRect rect = { (int)bounding_box.x, (int)bounding_box.y, (int)bounding_box.width, (int)bounding_box.height }; + + switch (rcmd->commandType) { + case CLAY_RENDER_COMMAND_TYPE_RECTANGLE: { + Clay_RectangleRenderData *config = &rcmd->renderData.rectangle; + SDL_SetRenderDrawBlendMode(rendererData->renderer, SDL_BLENDMODE_BLEND); + SDL_SetRenderDrawColor(rendererData->renderer, config->backgroundColor.r, config->backgroundColor.g, config->backgroundColor.b, config->backgroundColor.a); + if (config->cornerRadius.topLeft > 0) { + SDL_Clay_RenderFillRoundedRect(rendererData, rect, config->cornerRadius, config->backgroundColor); + } else { + SDL_RenderFillRect(rendererData->renderer, &rect); + } + } break; + case CLAY_RENDER_COMMAND_TYPE_TEXT: { + Clay_TextRenderData *config = &rcmd->renderData.text; + TTF_Font *font = rendererData->fonts[config->fontId]; + TTF_SetFontSize(font, config->fontSize); + TTF_Text *text = TTF_CreateText(rendererData->textEngine, font, config->stringContents.chars, config->stringContents.length); + TTF_SetTextColor(text, config->textColor.r, config->textColor.g, config->textColor.b, config->textColor.a); + TTF_DrawRendererText(text, rect.x, rect.y); + TTF_DestroyText(text); + } break; + case CLAY_RENDER_COMMAND_TYPE_BORDER: { + Clay_BorderRenderData *config = &rcmd->renderData.border; + + const float minRadius = SDL_min(rect.w, rect.h) / 2.0f; + const Clay_CornerRadius clampedRadii = { + .topLeft = SDL_min(config->cornerRadius.topLeft, minRadius), + .topRight = SDL_min(config->cornerRadius.topRight, minRadius), + .bottomLeft = SDL_min(config->cornerRadius.bottomLeft, minRadius), + .bottomRight = SDL_min(config->cornerRadius.bottomRight, minRadius) + }; + //edges + SDL_SetRenderDrawColor(rendererData->renderer, config->color.r, config->color.g, config->color.b, config->color.a); + if (config->width.left > 0) { + const float starting_y = rect.y + clampedRadii.topLeft; + const float length = rect.h - clampedRadii.topLeft - clampedRadii.bottomLeft; + SDL_FRect line = { rect.x - 1, starting_y, config->width.left, length }; + SDL_RenderFillRect(rendererData->renderer, &line); + } + if (config->width.right > 0) { + const float starting_x = rect.x + rect.w - (float)config->width.right + 1; + const float starting_y = rect.y + clampedRadii.topRight; + const float length = rect.h - clampedRadii.topRight - clampedRadii.bottomRight; + SDL_FRect line = { starting_x, starting_y, config->width.right, length }; + SDL_RenderFillRect(rendererData->renderer, &line); + } + if (config->width.top > 0) { + const float starting_x = rect.x + clampedRadii.topLeft; + const float length = rect.w - clampedRadii.topLeft - clampedRadii.topRight; + SDL_FRect line = { starting_x, rect.y - 1, length, config->width.top }; + SDL_RenderFillRect(rendererData->renderer, &line); + } + if (config->width.bottom > 0) { + const float starting_x = rect.x + clampedRadii.bottomLeft; + const float starting_y = rect.y + rect.h - (float)config->width.bottom + 1; + const float length = rect.w - clampedRadii.bottomLeft - clampedRadii.bottomRight; + SDL_FRect line = { starting_x, starting_y, length, config->width.bottom }; + SDL_SetRenderDrawColor(rendererData->renderer, config->color.r, config->color.g, config->color.b, config->color.a); + SDL_RenderFillRect(rendererData->renderer, &line); + } + //corners + if (config->cornerRadius.topLeft > 0) { + const float centerX = rect.x + clampedRadii.topLeft -1; + const float centerY = rect.y + clampedRadii.topLeft - 1; + SDL_Clay_RenderArc(rendererData, (SDL_FPoint){centerX, centerY}, clampedRadii.topLeft, + 180.0f, 270.0f, config->width.top, config->color); + } + if (config->cornerRadius.topRight > 0) { + const float centerX = rect.x + rect.w - clampedRadii.topRight; + const float centerY = rect.y + clampedRadii.topRight - 1; + SDL_Clay_RenderArc(rendererData, (SDL_FPoint){centerX, centerY}, clampedRadii.topRight, + 270.0f, 360.0f, config->width.top, config->color); + } + if (config->cornerRadius.bottomLeft > 0) { + const float centerX = rect.x + clampedRadii.bottomLeft -1; + const float centerY = rect.y + rect.h - clampedRadii.bottomLeft; + SDL_Clay_RenderArc(rendererData, (SDL_FPoint){centerX, centerY}, clampedRadii.bottomLeft, + 90.0f, 180.0f, config->width.bottom, config->color); + } + if (config->cornerRadius.bottomRight > 0) { + const float centerX = rect.x + rect.w - clampedRadii.bottomRight; + const float centerY = rect.y + rect.h - clampedRadii.bottomRight; + SDL_Clay_RenderArc(rendererData, (SDL_FPoint){centerX, centerY}, clampedRadii.bottomRight, + 0.0f, 90.0f, config->width.bottom, config->color); + } + + } break; + case CLAY_RENDER_COMMAND_TYPE_SCISSOR_START: { + Clay_BoundingBox boundingBox = rcmd->boundingBox; + currentClippingRectangle = (SDL_Rect) { + .x = boundingBox.x, + .y = boundingBox.y, + .w = boundingBox.width, + .h = boundingBox.height, + }; + SDL_SetRenderClipRect(rendererData->renderer, ¤tClippingRectangle); + break; + } + case CLAY_RENDER_COMMAND_TYPE_SCISSOR_END: { + SDL_SetRenderClipRect(rendererData->renderer, NULL); + break; + } + case CLAY_RENDER_COMMAND_TYPE_IMAGE: { + SDL_Texture *texture = (SDL_Texture *)rcmd->renderData.image.imageData; + const SDL_FRect dest = { rect.x, rect.y, rect.w, rect.h }; + SDL_RenderTexture(rendererData->renderer, texture, NULL, &dest); + break; + } + default: + SDL_Log("Unknown render command type: %d", rcmd->commandType); + } + } +} diff --git a/src/renderer/clay_renderer_SDL3.h b/src/renderer/clay_renderer_SDL3.h new file mode 100644 index 0000000..f75558d --- /dev/null +++ b/src/renderer/clay_renderer_SDL3.h @@ -0,0 +1,16 @@ +#ifndef CLAY_RENDERER_SDL3_H +#define CLAY_RENDERER_SDL3_H + +#include +#include +#include + +typedef struct { + SDL_Renderer *renderer; + TTF_TextEngine *textEngine; + TTF_Font **fonts; +} Clay_SDL3RendererData; + +extern void SDL_Clay_RenderClayCommands(Clay_SDL3RendererData *rendererData, Clay_RenderCommandArray *rcommands); + +#endif // !CLAY_RENDERER_SDL3_H diff --git a/vendor/clay b/vendor/clay deleted file mode 160000 index 3767508..0000000 --- a/vendor/clay +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 37675089e33632173606bfccab554ad6e6970d4c From 1fe25fb235aab6cf1022ca0c158985596b0ce24e Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 19:42:48 +0200 Subject: [PATCH 11/87] feat: disabled wireframe for rounded rectangle geometry --- src/renderer/clay_renderer_SDL3.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/clay_renderer_SDL3.c b/src/renderer/clay_renderer_SDL3.c index b101ab7..05a7f47 100644 --- a/src/renderer/clay_renderer_SDL3.c +++ b/src/renderer/clay_renderer_SDL3.c @@ -102,8 +102,8 @@ static void SDL_Clay_RenderFillRoundedRect(Clay_SDL3RendererData *rendererData, // Render everything SDL_RenderGeometry(rendererData->renderer, NULL, vertices, totalVertices, indeces, totalIndeces); - // Render debug info -#if 1 +#if 0 + // Render debug wireframe for (size_t i = 0; i < totalTris; ++i) { SDL_SetRenderDrawColor(rendererData->renderer, 255, 255, 255, 255); SDL_RenderLine(rendererData->renderer, vertices[0].position.x, vertices[0].position.y, vertices[i+2].position.x, vertices[i+2].position.y); From ed28b55f8a78840a7c80c8083b035fcc093753d5 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 19:45:03 +0200 Subject: [PATCH 12/87] fix: removed leftover debug logs --- src/renderer/clay_renderer_SDL3.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/renderer/clay_renderer_SDL3.c b/src/renderer/clay_renderer_SDL3.c index 05a7f47..1c36a2f 100644 --- a/src/renderer/clay_renderer_SDL3.c +++ b/src/renderer/clay_renderer_SDL3.c @@ -52,8 +52,6 @@ static void SDL_Clay_RenderFillRoundedRect(Clay_SDL3RendererData *rendererData, int totalVertices = 0; for (int i = 0; i < 4; ++i) { numCircleSegments[i] = SDL_clamp((int)radii[i] / 2, 1, NUM_CIRCLE_SEGMENTS); - SDL_Log("num segments %d: %d", i, numCircleSegments[i]); - SDL_Log("radius %d: %f", i, radii[i]); totalVertices += numCircleSegments[i]; } From e9de2dab75643e9feb086d9e3f39e80f4d3b9af2 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 19:45:24 +0200 Subject: [PATCH 13/87] fix: all corners are now considered when choosing between rounded and unrounded rectangle render functions --- src/renderer/clay_renderer_SDL3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/clay_renderer_SDL3.c b/src/renderer/clay_renderer_SDL3.c index 1c36a2f..2be479a 100644 --- a/src/renderer/clay_renderer_SDL3.c +++ b/src/renderer/clay_renderer_SDL3.c @@ -150,7 +150,7 @@ void SDL_Clay_RenderClayCommands(Clay_SDL3RendererData *rendererData, Clay_Rende Clay_RectangleRenderData *config = &rcmd->renderData.rectangle; SDL_SetRenderDrawBlendMode(rendererData->renderer, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawColor(rendererData->renderer, config->backgroundColor.r, config->backgroundColor.g, config->backgroundColor.b, config->backgroundColor.a); - if (config->cornerRadius.topLeft > 0) { + if (config->cornerRadius.topLeft > 0 || config->cornerRadius.topRight > 0 || config->cornerRadius.bottomLeft > 0 || config->cornerRadius.bottomRight > 0) { SDL_Clay_RenderFillRoundedRect(rendererData, rect, config->cornerRadius, config->backgroundColor); } else { SDL_RenderFillRect(rendererData->renderer, &rect); From 1e5989b5c675468a37c62289b70098b99e37693d Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 19:45:37 +0200 Subject: [PATCH 14/87] feat: changed colours --- src/style.h | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/style.h b/src/style.h index 28e094d..7b9ea20 100644 --- a/src/style.h +++ b/src/style.h @@ -3,24 +3,27 @@ #include -constexpr float cornerRadius = 3.f; -constexpr Clay_CornerRadius cornerRadiusAll = CLAY_CORNER_RADIUS(cornerRadius); -constexpr float containerGap = 3.f; -constexpr float windowPadding = 0.f; +constexpr float cornerRadius = 20.f; +constexpr Clay_CornerRadius cornerRadiusAll = { + cornerRadius, cornerRadius, + cornerRadius, cornerRadius +}; +constexpr float containerGap = 10.f; +constexpr float windowPadding = 10.f; constexpr Clay_Color windowBackground = { - 210, 210, 210, 255 + 255*0.35, 255*0.35, 255*0.35, 255 }; constexpr Clay_Color containerColors[] = { - { 200, 200, 200, 255 }, - { 170, 170, 170, 255 }, - { 140, 140, 140, 255 }, + { 255*0.25, 255*0.25, 255*0.25, 255 }, + { 255*0.2, 255*0.2, 255*0.2, 255 }, + { 255*0.1, 255*0.1, 255*0.1, 255 }, }; constexpr Clay_Color textColors[] = { - { 0, 0, 0, 255 }, - { 15, 15, 15, 255 }, - { 30, 30, 30, 255 }, + { 250, 250, 250, 255 }, + { 250, 250, 250, 255 }, + { 250, 250, 250, 255 }, }; constexpr Clay_Sizing layoutExpand = { From 456921e66bac3793c64ae8dfad0dd86964a1531e Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 19:45:56 +0200 Subject: [PATCH 15/87] fix: premake5 now adds include/ to build ipv vendor/ --- premake5.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/premake5.lua b/premake5.lua index 6120e30..d592297 100644 --- a/premake5.lua +++ b/premake5.lua @@ -8,7 +8,7 @@ project "Dice" cdialect "c23" location "build/" files { "src/**.c" } - includedirs { "vendor/" } + includedirs { "include/" } links { "m", "stdc++", "SDL3", "SDL3_ttf", "SDL3_image" } buildoptions { "-Wall" } targetdir "bin/" From a98a67024bc20c4ad217cd6a6529af496cad1e77 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 20:08:44 +0200 Subject: [PATCH 16/87] feat: adjusted layout and styling logic --- src/application.c | 27 ++++++++++++++------------- src/style.h | 21 +++++++++++++++------ 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/application.c b/src/application.c index 9865492..ce2a115 100644 --- a/src/application.c +++ b/src/application.c @@ -3,61 +3,62 @@ #include "defs.h" #include "style.h" #include +#include static inline void DiceContainer() { - CLAY({ .id = CLAY_ID("DiceContainer"), + CLAY(CLAY_ID("DiceContainer"), { .layout = { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_PERCENT(0.2) }, .padding = CLAY_PADDING_ALL(16), }, .backgroundColor = containerColors[0], - .cornerRadius = CLAY_CORNER_RADIUS(cornerRadius) + .cornerRadius = defaultRadiusAll, }) { CLAY_TEXT(CLAY_STRING("Text data"), CLAY_TEXT_CONFIG({ - .textColor = textColors[0], - .fontId = FONT_DEFAULT, - .fontSize = 24, + TEXT_BODY, + .textColor = textColors[0] })); } } static inline void DiceLogContainer() { - CLAY({ .id = CLAY_ID("LogContainer"), + CLAY(CLAY_ID("LogContainer"), { .layout = { .sizing = layoutExpand, .padding = CLAY_PADDING_ALL(16), }, .backgroundColor = containerColors[0], - .cornerRadius = cornerRadiusAll + .cornerRadius = defaultRadiusAll }) {} } static inline void InitiativeListContainer() { - CLAY({ .id = CLAY_ID("InitiativeListContainer"), + CLAY(CLAY_ID("InitiativeListContainer"), { .layout = { .sizing = layoutExpand, .padding = CLAY_PADDING_ALL(16), }, .backgroundColor = containerColors[0], - .cornerRadius = cornerRadiusAll, + .cornerRadius = defaultRadiusAll, }) {} } Clay_RenderCommandArray RenderApplication() { Clay_BeginLayout(); - CLAY({ .id = CLAY_ID("OuterContainer"), + CLAY(CLAY_ID("OuterContainer"), { .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = layoutExpand, .padding = CLAY_PADDING_ALL(windowPadding), - .childGap = containerGap - } + .childGap = containerGap, + }, + .backgroundColor = windowBackground }) { DiceContainer(); - CLAY({ .id = CLAY_ID("LowerSplitContainer"), + CLAY(CLAY_ID("LowerSplitContainer"), { .layout = { .sizing = layoutExpand, .childGap = containerGap diff --git a/src/style.h b/src/style.h index 7b9ea20..a82c03a 100644 --- a/src/style.h +++ b/src/style.h @@ -1,15 +1,24 @@ #ifndef STYLE_H #define STYLE_H +#include "defs.h" #include -constexpr float cornerRadius = 20.f; -constexpr Clay_CornerRadius cornerRadiusAll = { - cornerRadius, cornerRadius, - cornerRadius, cornerRadius +constexpr float defaultRadius = 5.f; +constexpr Clay_CornerRadius defaultRadiusAll = { + defaultRadius, defaultRadius, + defaultRadius, defaultRadius }; -constexpr float containerGap = 10.f; -constexpr float windowPadding = 10.f; +constexpr float containerGap = 5.f; +constexpr float windowPadding = 5.f; + + +#define TEXT_BODY\ + .fontId = FONT_DEFAULT,\ + .fontSize = 15 +#define TEXT_H1\ + .fontId = FONT_BOLD,\ + .fontSize = 20 constexpr Clay_Color windowBackground = { 255*0.35, 255*0.35, 255*0.35, 255 From 89f21718cad3ed2ea4eaf14fade5a0ff0b57df12 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 21:31:45 +0200 Subject: [PATCH 17/87] feat: added BOLD --- src/defs.h | 1 + src/main.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/defs.h b/src/defs.h index d5e3dc1..30e23ad 100644 --- a/src/defs.h +++ b/src/defs.h @@ -8,6 +8,7 @@ enum Font { FONT_DEFAULT = 0, + FONT_BOLD = 1, FONT_MAX }; diff --git a/src/main.c b/src/main.c index 11eaf95..a2da402 100644 --- a/src/main.c +++ b/src/main.c @@ -1,8 +1,10 @@ +#include #include #include "renderer/clay_renderer_SDL3.h" #include "application.h" #include "defs.h" +#include "style.h" #define SDL_MAIN_HANDLED #include @@ -58,6 +60,7 @@ void HandleClayErrors(Clay_ErrorData data) { static inline void InitSDL() { + SDL_SetHint(SDL_HINT_RENDER_LINE_METHOD, "3"); if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS)) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "SDL_Init failed: %s", SDL_GetError()); exit(1); @@ -78,9 +81,17 @@ void InitSDL() { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_CreateRendererTextEngine failed: %s", SDL_GetError()); exit(5); } - fonts[FONT_DEFAULT] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", 24.f); + fonts[FONT_DEFAULT] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", baseFontSize * 5); if (fonts[FONT_DEFAULT] == nullptr) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load adwaita sans: %s", SDL_GetError()); + exit(6); + } + fonts[FONT_BOLD] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", baseFontSize * 5); + if (fonts[FONT_BOLD] == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load adwaita sans bold: %s", SDL_GetError()); + exit(6); + } else { + TTF_SetFontStyle(fonts[FONT_BOLD], TTF_STYLE_BOLD); } } From 0ee1962a16d3ee3f18136c87ec10bec6086a11d7 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 21:49:42 +0200 Subject: [PATCH 18/87] feat: redesigned styling system --- src/style.h | 84 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 64 insertions(+), 20 deletions(-) diff --git a/src/style.h b/src/style.h index a82c03a..d290fa0 100644 --- a/src/style.h +++ b/src/style.h @@ -3,25 +3,16 @@ #include "defs.h" #include +#include -constexpr float defaultRadius = 5.f; -constexpr Clay_CornerRadius defaultRadiusAll = { - defaultRadius, defaultRadius, - defaultRadius, defaultRadius -}; -constexpr float containerGap = 5.f; -constexpr float windowPadding = 5.f; +//////////////////////////////////// +// CONTAINER STYLE +//////////////////////////////////// - -#define TEXT_BODY\ - .fontId = FONT_DEFAULT,\ - .fontSize = 15 -#define TEXT_H1\ - .fontId = FONT_BOLD,\ - .fontSize = 20 - -constexpr Clay_Color windowBackground = { - 255*0.35, 255*0.35, 255*0.35, 255 +constexpr uint16_t containerGap = 5; +constexpr Clay_Padding containerPadding = { + 32, 32, + 16, 16 }; constexpr Clay_Color containerColors[] = { { 255*0.25, 255*0.25, 255*0.25, 255 }, @@ -29,15 +20,68 @@ constexpr Clay_Color containerColors[] = { { 255*0.1, 255*0.1, 255*0.1, 255 }, }; +constexpr Clay_Sizing layoutExpand = { + .width = CLAY_SIZING_GROW(0), + .height = CLAY_SIZING_GROW(0) +}; + +constexpr float defaultRadius = 5.f; +constexpr Clay_CornerRadius defaultRadiusAll = { + defaultRadius, defaultRadius, + defaultRadius, defaultRadius +}; + +#define INNER_CONTAINER(depth_) \ +backgroundColor = containerColors[depth_],\ +.cornerRadius = defaultRadiusAll + + +//////////////////////////////////// +// WINDOW STYLE +//////////////////////////////////// + +constexpr float windowPadding = 5; +constexpr Clay_Color windowBackground = { + 255*0.35, 255*0.35, 255*0.35, 255 +}; +constexpr Clay_ElementDeclaration windowStyle = { + .layout = { + .layoutDirection = CLAY_TOP_TO_BOTTOM, + .sizing = layoutExpand, + .padding = CLAY_PADDING_ALL(windowPadding), + .childGap = containerGap, + }, + .backgroundColor = windowBackground +}; + +//////////////////////////////////// +// TEXT STYLE +//////////////////////////////////// + +constexpr float paragraphGap = 10; +constexpr uint16_t baseFontSize = 16; + constexpr Clay_Color textColors[] = { { 250, 250, 250, 255 }, { 250, 250, 250, 255 }, { 250, 250, 250, 255 }, }; -constexpr Clay_Sizing layoutExpand = { - .width = CLAY_SIZING_GROW(0), - .height = CLAY_SIZING_GROW(0) +constexpr uint16_t headerSizes[] = { + 64, 32, 28, 16 }; +#define TEXT_STYLE(color_)\ + textColor = textColors[color_] + +#define BODY(color_)\ + fontId = FONT_DEFAULT,\ + .fontSize = baseFontSize,\ + .TEXT_STYLE(color_) + +#define H(level_, color_)\ + fontId = FONT_BOLD,\ + .fontSize = headerSizes[(level_)-1],\ + .TEXT_STYLE(color_) + #endif // !STYLE_H From 04a612e0c1e60dd2e721aff32dbe53d775f5b921 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 21:49:53 +0200 Subject: [PATCH 19/87] feat: added more containers --- src/application.c | 71 ++++++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 28 deletions(-) diff --git a/src/application.c b/src/application.c index ce2a115..925dbbf 100644 --- a/src/application.c +++ b/src/application.c @@ -1,62 +1,77 @@ #include "application.h" -#include "defs.h" #include "style.h" #include #include -static inline -void DiceContainer() { - CLAY(CLAY_ID("DiceContainer"), { +static inline void DiceSelectorContainer() { + CLAY(CLAY_ID("DiceSelector"), { .layout = { - .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_PERCENT(0.2) }, - .padding = CLAY_PADDING_ALL(16), + .layoutDirection = CLAY_TOP_TO_BOTTOM, + .sizing = { CLAY_SIZING_FIXED(300), CLAY_SIZING_GROW(0) }, + .padding = containerPadding, + .childGap = paragraphGap, }, - .backgroundColor = containerColors[0], - .cornerRadius = defaultRadiusAll, + .INNER_CONTAINER(0) }) { - CLAY_TEXT(CLAY_STRING("Text data"), CLAY_TEXT_CONFIG({ - TEXT_BODY, - .textColor = textColors[0] + } +} + +static inline void ActiveDiceContainer() { + CLAY(CLAY_ID("ActiveDice"), { + .layout = { + .layoutDirection = CLAY_TOP_TO_BOTTOM, + .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, + .padding = containerPadding, + .childGap = paragraphGap, + }, + .INNER_CONTAINER(0) + }) { + CLAY_TEXT(CLAY_STRING("Header Text"), CLAY_TEXT_CONFIG({ + .H(1, 0), + })); + CLAY_TEXT(CLAY_STRING("Content text"), CLAY_TEXT_CONFIG({ + .BODY(0), })); } } -static inline -void DiceLogContainer() { +static inline void DiceContainer() { + CLAY(CLAY_ID("DiceContainer"), { + .layout = { + .layoutDirection = CLAY_LEFT_TO_RIGHT, + .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_PERCENT(0.4) }, + .childGap = containerGap + }, + }) { + DiceSelectorContainer(); + ActiveDiceContainer(); + } +} + +static inline void DiceLogContainer() { CLAY(CLAY_ID("LogContainer"), { .layout = { .sizing = layoutExpand, .padding = CLAY_PADDING_ALL(16), }, - .backgroundColor = containerColors[0], - .cornerRadius = defaultRadiusAll + .INNER_CONTAINER(0) }) {} } -static inline -void InitiativeListContainer() { +static inline void InitiativeListContainer() { CLAY(CLAY_ID("InitiativeListContainer"), { .layout = { .sizing = layoutExpand, .padding = CLAY_PADDING_ALL(16), }, - .backgroundColor = containerColors[0], - .cornerRadius = defaultRadiusAll, + .INNER_CONTAINER(0) }) {} } Clay_RenderCommandArray RenderApplication() { Clay_BeginLayout(); - CLAY(CLAY_ID("OuterContainer"), { - .layout = { - .layoutDirection = CLAY_TOP_TO_BOTTOM, - .sizing = layoutExpand, - .padding = CLAY_PADDING_ALL(windowPadding), - .childGap = containerGap, - }, - .backgroundColor = windowBackground - }) { + CLAY(CLAY_ID("OuterContainer"), windowStyle) { DiceContainer(); CLAY(CLAY_ID("LowerSplitContainer"), { .layout = { From e7d11d45510ed008532d972a11ebf55c9fb30a12 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 22:47:48 +0200 Subject: [PATCH 20/87] feat: added renderscale and reorganized initialisation --- src/main.c | 46 +++++++++++++++++++++++++++++----------------- src/style.h | 19 +++++++++++-------- 2 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/main.c b/src/main.c index a2da402..a89542b 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,5 @@ #include +#include #include #include "renderer/clay_renderer_SDL3.h" @@ -22,6 +23,8 @@ #include #include +constexpr SDL_InitFlags sdlInitFlags = SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIGH_PIXEL_DENSITY; + SDL_Window *window = nullptr; SDL_Renderer *renderer = nullptr; int screenWidth = 1920, screenHeight = 1080; @@ -58,6 +61,22 @@ void HandleClayErrors(Clay_ErrorData data) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "%s", data.errorText.chars); } +static inline void InitFonts() { + fonts[FONT_DEFAULT] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", baseFontSize * 5); + if (fonts[FONT_DEFAULT] == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load adwaita sans: %s", SDL_GetError()); + exit(6); + } + TTF_SetFontHinting(fonts[FONT_DEFAULT], TTF_HINTING_LIGHT_SUBPIXEL); + fonts[FONT_BOLD] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", baseFontSize * 5); + if (fonts[FONT_BOLD] == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load adwaita sans bold: %s", SDL_GetError()); + exit(7); + } + TTF_SetFontHinting(fonts[FONT_BOLD], TTF_HINTING_LIGHT_SUBPIXEL); + TTF_SetFontStyle(fonts[FONT_BOLD], TTF_STYLE_BOLD); +} + static inline void InitSDL() { SDL_SetHint(SDL_HINT_RENDER_LINE_METHOD, "3"); @@ -65,11 +84,11 @@ void InitSDL() { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "SDL_Init failed: %s", SDL_GetError()); exit(1); } - if ((window = SDL_CreateWindow("Window", screenWidth, screenHeight, SDL_WINDOW_RESIZABLE)) == nullptr) { + if ((window = SDL_CreateWindow("Window", screenWidth, screenHeight, sdlInitFlags)) == nullptr) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "SDL_CreateWindow failed: %s", SDL_GetError()); exit(2); } - if((renderer = SDL_CreateRenderer(window, NULL)) == nullptr) { + if ((renderer = SDL_CreateRenderer(window, NULL)) == nullptr) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "SDL_CreateRenderer failed: %s", SDL_GetError()); exit(3); } @@ -77,22 +96,15 @@ void InitSDL() { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_Init failed: %s", SDL_GetError()); exit(4); } - if((textEngine = TTF_CreateRendererTextEngine(renderer)) == nullptr) { + if ((textEngine = TTF_CreateRendererTextEngine(renderer)) == nullptr) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_CreateRendererTextEngine failed: %s", SDL_GetError()); exit(5); } - fonts[FONT_DEFAULT] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", baseFontSize * 5); - if (fonts[FONT_DEFAULT] == nullptr) { - SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load adwaita sans: %s", SDL_GetError()); - exit(6); - } - fonts[FONT_BOLD] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", baseFontSize * 5); - if (fonts[FONT_BOLD] == nullptr) { - SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load adwaita sans bold: %s", SDL_GetError()); - exit(6); - } else { - TTF_SetFontStyle(fonts[FONT_BOLD], TTF_STYLE_BOLD); - } + SDL_SetRenderScale(renderer, 1.0/renderScale, 1.0/renderScale); + InitFonts(); + int w, h; + SDL_GetCurrentRenderOutputSize(renderer, &w, &h); + SDL_Log("output size: %i, %d", w, h); } static @@ -125,8 +137,8 @@ int main(int argc, char *argv[]) { break; case SDL_EVENT_WINDOW_RESIZED: Clay_SetLayoutDimensions((Clay_Dimensions){ - event.window.data1, - event.window.data2 + event.window.data1 * (double)renderScale, + event.window.data2 * (double)renderScale }); break; case SDL_EVENT_MOUSE_WHEEL: diff --git a/src/style.h b/src/style.h index d290fa0..25d846f 100644 --- a/src/style.h +++ b/src/style.h @@ -5,14 +5,16 @@ #include #include +constexpr int renderScale = 1; + //////////////////////////////////// // CONTAINER STYLE //////////////////////////////////// -constexpr uint16_t containerGap = 5; +constexpr uint16_t containerGap = 5 * renderScale; constexpr Clay_Padding containerPadding = { - 32, 32, - 16, 16 + 32 * renderScale, 32 * renderScale, + 16 * renderScale, 16 * renderScale }; constexpr Clay_Color containerColors[] = { { 255*0.25, 255*0.25, 255*0.25, 255 }, @@ -25,7 +27,7 @@ constexpr Clay_Sizing layoutExpand = { .height = CLAY_SIZING_GROW(0) }; -constexpr float defaultRadius = 5.f; +constexpr double defaultRadius = 5.0 * renderScale; constexpr Clay_CornerRadius defaultRadiusAll = { defaultRadius, defaultRadius, defaultRadius, defaultRadius @@ -40,7 +42,7 @@ backgroundColor = containerColors[depth_],\ // WINDOW STYLE //////////////////////////////////// -constexpr float windowPadding = 5; +constexpr uint16_t windowPadding = containerGap; constexpr Clay_Color windowBackground = { 255*0.35, 255*0.35, 255*0.35, 255 }; @@ -58,8 +60,8 @@ constexpr Clay_ElementDeclaration windowStyle = { // TEXT STYLE //////////////////////////////////// -constexpr float paragraphGap = 10; -constexpr uint16_t baseFontSize = 16; +constexpr float paragraphGap = 10 * renderScale; +constexpr uint16_t baseFontSize = 16 * renderScale; constexpr Clay_Color textColors[] = { { 250, 250, 250, 255 }, @@ -68,7 +70,8 @@ constexpr Clay_Color textColors[] = { }; constexpr uint16_t headerSizes[] = { - 64, 32, 28, 16 + 64 * renderScale, 32 * renderScale, + 28 * renderScale, 16 * renderScale }; #define TEXT_STYLE(color_)\ From 7f3e831027d2aa10a3e2ebdc5b3382c62e58a43f Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 23:28:59 +0200 Subject: [PATCH 21/87] chore: extracted logging output size to separate function --- src/main.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main.c b/src/main.c index a89542b..969351f 100644 --- a/src/main.c +++ b/src/main.c @@ -41,6 +41,13 @@ Clay_SDL3RendererData backendData = { .textEngine = nullptr }; +static inline +void LogOutputResolution() { + int w, h; + SDL_GetCurrentRenderOutputSize(renderer, &w, &h); + SDL_Log("output size: %i, %d", w, h); +} + static inline Clay_Dimensions MeasureText(Clay_StringSlice text, Clay_TextElementConfig *config, void *userData) { TTF_Font **fonts = userData; @@ -102,9 +109,7 @@ void InitSDL() { } SDL_SetRenderScale(renderer, 1.0/renderScale, 1.0/renderScale); InitFonts(); - int w, h; - SDL_GetCurrentRenderOutputSize(renderer, &w, &h); - SDL_Log("output size: %i, %d", w, h); + LogOutputResolution(); } static @@ -140,6 +145,7 @@ int main(int argc, char *argv[]) { event.window.data1 * (double)renderScale, event.window.data2 * (double)renderScale }); + LogOutputResolution(); break; case SDL_EVENT_MOUSE_WHEEL: Clay_UpdateScrollContainers(true, (Clay_Vector2){ event.wheel.x, event.wheel.y }, 0.01f); From 36d768bb6f5b73663df000337355464e1bbd3470 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 16 Sep 2025 23:36:28 +0200 Subject: [PATCH 22/87] feat: added TODO.txt --- TODO.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 TODO.txt diff --git a/TODO.txt b/TODO.txt new file mode 100644 index 0000000..e044783 --- /dev/null +++ b/TODO.txt @@ -0,0 +1,11 @@ +Design representation of internal state of dice tray + +Buttons for adding dice to active set + +Buttons for removing dice from active set + +Roll modifier editor + +Button to roll the active set + +Design representation of internal state of initiative tracker From 88e6358346553f1587a2d4b6159126c59a0301e9 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 14:10:54 +0200 Subject: [PATCH 23/87] chore: adjusted formatting for application.h --- src/application.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/application.c b/src/application.c index 925dbbf..7f148ca 100644 --- a/src/application.c +++ b/src/application.c @@ -4,20 +4,22 @@ #include #include -static inline void DiceSelectorContainer() { +static inline +void DiceSelectorContainer() { CLAY(CLAY_ID("DiceSelector"), { .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, - .sizing = { CLAY_SIZING_FIXED(300), CLAY_SIZING_GROW(0) }, + .sizing = { CLAY_SIZING_PERCENT(0.15), CLAY_SIZING_GROW(0) }, .padding = containerPadding, .childGap = paragraphGap, }, - .INNER_CONTAINER(0) + .INNER_CONTAINER(0), }) { } } -static inline void ActiveDiceContainer() { +static inline +void ActiveDiceContainer() { CLAY(CLAY_ID("ActiveDice"), { .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, @@ -25,7 +27,7 @@ static inline void ActiveDiceContainer() { .padding = containerPadding, .childGap = paragraphGap, }, - .INNER_CONTAINER(0) + .INNER_CONTAINER(0), }) { CLAY_TEXT(CLAY_STRING("Header Text"), CLAY_TEXT_CONFIG({ .H(1, 0), @@ -36,7 +38,8 @@ static inline void ActiveDiceContainer() { } } -static inline void DiceContainer() { +static inline +void DiceContainer() { CLAY(CLAY_ID("DiceContainer"), { .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT, @@ -49,23 +52,25 @@ static inline void DiceContainer() { } } -static inline void DiceLogContainer() { +static inline +void DiceLogContainer() { CLAY(CLAY_ID("LogContainer"), { .layout = { .sizing = layoutExpand, .padding = CLAY_PADDING_ALL(16), }, - .INNER_CONTAINER(0) + .INNER_CONTAINER(0), }) {} } -static inline void InitiativeListContainer() { +static inline +void InitiativeListContainer() { CLAY(CLAY_ID("InitiativeListContainer"), { .layout = { .sizing = layoutExpand, .padding = CLAY_PADDING_ALL(16), }, - .INNER_CONTAINER(0) + .INNER_CONTAINER(0), }) {} } From ee8fc5391bda727fcd8a8a525d9210601bd2bcb8 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 16:45:12 +0200 Subject: [PATCH 24/87] chore: moved dice container UI code to separate file --- src/application.c | 52 +----------------------- src/dice_container.c | 42 +++++++++++++++++++ src/dice_container.h | 6 +++ src/style.c | 44 ++++++++++++++++++++ src/style.h | 97 +++++++++++++++++++++++--------------------- 5 files changed, 145 insertions(+), 96 deletions(-) create mode 100644 src/dice_container.c create mode 100644 src/dice_container.h diff --git a/src/application.c b/src/application.c index 7f148ca..da46b26 100644 --- a/src/application.c +++ b/src/application.c @@ -1,57 +1,9 @@ #include "application.h" - +#include "dice_container.h" #include "style.h" #include #include -static inline -void DiceSelectorContainer() { - CLAY(CLAY_ID("DiceSelector"), { - .layout = { - .layoutDirection = CLAY_TOP_TO_BOTTOM, - .sizing = { CLAY_SIZING_PERCENT(0.15), CLAY_SIZING_GROW(0) }, - .padding = containerPadding, - .childGap = paragraphGap, - }, - .INNER_CONTAINER(0), - }) { - } -} - -static inline -void ActiveDiceContainer() { - CLAY(CLAY_ID("ActiveDice"), { - .layout = { - .layoutDirection = CLAY_TOP_TO_BOTTOM, - .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, - .padding = containerPadding, - .childGap = paragraphGap, - }, - .INNER_CONTAINER(0), - }) { - CLAY_TEXT(CLAY_STRING("Header Text"), CLAY_TEXT_CONFIG({ - .H(1, 0), - })); - CLAY_TEXT(CLAY_STRING("Content text"), CLAY_TEXT_CONFIG({ - .BODY(0), - })); - } -} - -static inline -void DiceContainer() { - CLAY(CLAY_ID("DiceContainer"), { - .layout = { - .layoutDirection = CLAY_LEFT_TO_RIGHT, - .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_PERCENT(0.4) }, - .childGap = containerGap - }, - }) { - DiceSelectorContainer(); - ActiveDiceContainer(); - } -} - static inline void DiceLogContainer() { CLAY(CLAY_ID("LogContainer"), { @@ -76,7 +28,7 @@ void InitiativeListContainer() { Clay_RenderCommandArray RenderApplication() { Clay_BeginLayout(); - CLAY(CLAY_ID("OuterContainer"), windowStyle) { + CLAY(CLAY_ID("OuterContainer"), WindowStyle()) { DiceContainer(); CLAY(CLAY_ID("LowerSplitContainer"), { .layout = { diff --git a/src/dice_container.c b/src/dice_container.c new file mode 100644 index 0000000..187a09b --- /dev/null +++ b/src/dice_container.c @@ -0,0 +1,42 @@ +#include "dice_container.h" +#include +#include "style.h" + +static inline +void DiceSelectorContainer() { + CLAY(CLAY_ID("DiceSelector"), { + .layout = { + .layoutDirection = CLAY_TOP_TO_BOTTOM, + .sizing = { CLAY_SIZING_PERCENT(0.15), CLAY_SIZING_GROW(0) }, + .padding = containerPadding, + .childGap = paragraphGap, + }, + .INNER_CONTAINER(0), + }) { } +} + +static inline +void ActiveDiceContainer() { + CLAY(CLAY_ID("ActiveDice"), { + .layout = { + .layoutDirection = CLAY_TOP_TO_BOTTOM, + .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, + .padding = containerPadding, + .childGap = paragraphGap, + }, + .INNER_CONTAINER(0), + }) { } +} + +void DiceContainer() { + CLAY(CLAY_ID("DiceContainer"), { + .layout = { + .layoutDirection = CLAY_LEFT_TO_RIGHT, + .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_PERCENT(0.4) }, + .childGap = containerGap + }, + }) { + DiceSelectorContainer(); + ActiveDiceContainer(); + } +} diff --git a/src/dice_container.h b/src/dice_container.h new file mode 100644 index 0000000..0be5062 --- /dev/null +++ b/src/dice_container.h @@ -0,0 +1,6 @@ +#ifndef DICE_CONTAINER_H +#define DICE_CONTAINER_H + +extern void DiceContainer(); + +#endif // !DICE_CONTAINER_H diff --git a/src/style.c b/src/style.c index 8b13789..eefd5d8 100644 --- a/src/style.c +++ b/src/style.c @@ -1 +1,45 @@ +#include "style.h" +#include "defs.h" +Clay_Color ContainerBackgrounds(size_t idx) { + return (Clay_Color) { + 255*containerBackgrounds[idx], + 255*containerBackgrounds[idx], + 255*containerBackgrounds[idx], + 255 + }; +} + +Clay_Color ContainerBorders(size_t idx) { + return (Clay_Color) { + 255*containerBorders[idx], + 255*containerBorders[idx], + 255*containerBorders[idx], + 255 + }; +} + +Clay_Color TextColors(size_t idx) { + return (Clay_Color) { + 255*textColorsP[idx], + 255*textColorsP[idx], + 255*textColorsP[idx], + 255 + }; +} + +Clay_Color WindowBackground() { + return (Clay_Color) { 255*windowBackground, 255*windowBackground, 255*windowBackground, 255 }; +} + +Clay_ElementDeclaration WindowStyle() { + return (Clay_ElementDeclaration) { + .layout = { + .layoutDirection = CLAY_TOP_TO_BOTTOM, + .sizing = layoutExpand, + .padding = CLAY_PADDING_ALL(windowPadding), + .childGap = containerGap, + }, + .backgroundColor = WindowBackground() + }; +} diff --git a/src/style.h b/src/style.h index 25d846f..53de3aa 100644 --- a/src/style.h +++ b/src/style.h @@ -5,37 +5,33 @@ #include #include -constexpr int renderScale = 1; - //////////////////////////////////// // CONTAINER STYLE //////////////////////////////////// -constexpr uint16_t containerGap = 5 * renderScale; +constexpr uint16_t containerGap = 10; +constexpr double defaultRadius = 5.; + +constexpr float containerBackgrounds[] = { + .2f, + .3f, + .4f +}; +constexpr float containerBorders[] = { + .3f, + .4f, + .5f +}; + constexpr Clay_Padding containerPadding = { - 32 * renderScale, 32 * renderScale, - 16 * renderScale, 16 * renderScale -}; -constexpr Clay_Color containerColors[] = { - { 255*0.25, 255*0.25, 255*0.25, 255 }, - { 255*0.2, 255*0.2, 255*0.2, 255 }, - { 255*0.1, 255*0.1, 255*0.1, 255 }, + 32, 32, + 16, 16 }; -constexpr Clay_Sizing layoutExpand = { - .width = CLAY_SIZING_GROW(0), - .height = CLAY_SIZING_GROW(0) -}; - -constexpr double defaultRadius = 5.0 * renderScale; -constexpr Clay_CornerRadius defaultRadiusAll = { - defaultRadius, defaultRadius, - defaultRadius, defaultRadius -}; - -#define INNER_CONTAINER(depth_) \ -backgroundColor = containerColors[depth_],\ -.cornerRadius = defaultRadiusAll +#define INNER_CONTAINER(depth_)\ + backgroundColor = ContainerBackgrounds(depth_),\ + .border = { ContainerBorders(depth_), CLAY_BORDER_ALL(2) },\ + .cornerRadius = defaultRadiusAll //////////////////////////////////// @@ -43,39 +39,27 @@ backgroundColor = containerColors[depth_],\ //////////////////////////////////// constexpr uint16_t windowPadding = containerGap; -constexpr Clay_Color windowBackground = { - 255*0.35, 255*0.35, 255*0.35, 255 -}; -constexpr Clay_ElementDeclaration windowStyle = { - .layout = { - .layoutDirection = CLAY_TOP_TO_BOTTOM, - .sizing = layoutExpand, - .padding = CLAY_PADDING_ALL(windowPadding), - .childGap = containerGap, - }, - .backgroundColor = windowBackground -}; +constexpr float windowBackground = .18f; //////////////////////////////////// // TEXT STYLE //////////////////////////////////// -constexpr float paragraphGap = 10 * renderScale; -constexpr uint16_t baseFontSize = 16 * renderScale; - -constexpr Clay_Color textColors[] = { - { 250, 250, 250, 255 }, - { 250, 250, 250, 255 }, - { 250, 250, 250, 255 }, +constexpr float paragraphGap = 10; +constexpr uint16_t baseFontSize = 16; +constexpr float textColorsP[] = { + 0.9f, + 0.9f, + 0.9f }; constexpr uint16_t headerSizes[] = { - 64 * renderScale, 32 * renderScale, - 28 * renderScale, 16 * renderScale + 64, 32, + 28, 16 }; #define TEXT_STYLE(color_)\ - textColor = textColors[color_] + textColor = TextColors(color_) #define BODY(color_)\ fontId = FONT_DEFAULT,\ @@ -87,4 +71,25 @@ constexpr uint16_t headerSizes[] = { .fontSize = headerSizes[(level_)-1],\ .TEXT_STYLE(color_) +//////////////////////////////////// +// COMPILATIONS +// | Functions and expressions that combine styling data from the settings above. +//////////////////////////////////// + +extern Clay_Color ContainerBackgrounds(size_t idx); +extern Clay_Color ContainerBorders(size_t idx); +extern Clay_Color TextColors(size_t idx); +extern Clay_Color WindowBackground(); +extern Clay_ElementDeclaration WindowStyle(); + +constexpr Clay_Sizing layoutExpand = { + .width = CLAY_SIZING_GROW(0), + .height = CLAY_SIZING_GROW(0) +}; + +constexpr Clay_CornerRadius defaultRadiusAll = { + defaultRadius, defaultRadius, + defaultRadius, defaultRadius +}; + #endif // !STYLE_H From 827b96b0a3371fa0f012a8926e1970d513d62463 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 16:45:21 +0200 Subject: [PATCH 25/87] feat: defined dice logic and types --- src/dice.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/dice.h | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 src/dice.c create mode 100644 src/dice.h diff --git a/src/dice.c b/src/dice.c new file mode 100644 index 0000000..50acdf4 --- /dev/null +++ b/src/dice.c @@ -0,0 +1,44 @@ +#include "dice.h" +#include +#include + +int roll_die(enum die_type die) { + int const max = die - 1; + return (rand() % max) + 1; +} + +static int current_active_count = 0; +static enum die_type active_dice_set[MAX_ACTIVE_DICE]; + +enum die_type const *get_active_dice_set(size_t *out_length) { + if (out_length != nullptr) { + *out_length = current_active_count; + } + return active_dice_set; +} + +size_t add_die_to_active(enum die_type die) { + if (current_active_count >= MAX_ACTIVE_DICE) { + return MAX_ACTIVE_DICE; + } + active_dice_set[current_active_count] = die; + return current_active_count++; +} + +void remove_die_from_active(size_t index) { + memmove(active_dice_set + index + 1, active_dice_set + index, MAX_ACTIVE_DICE - index - 1); +} + +struct roll_result_type roll_active_dice_set(enum die_type die) { + struct roll_result_type results = { + .individual_result_count = MAX_ACTIVE_DICE, + .total = 0 + }; + for (size_t i = 0; i < current_active_count; ++i) { + results.individual_results[i] = roll_die(active_dice_set[i]); + results.total += results.individual_results[i]; + } + + return results; +} + diff --git a/src/dice.h b/src/dice.h new file mode 100644 index 0000000..370edac --- /dev/null +++ b/src/dice.h @@ -0,0 +1,33 @@ +#ifndef DICE_H +#define DICE_H + +#include + +#ifndef MAX_ACTIVE_DICE +#define MAX_ACTIVE_DICE 5 +#endif + +enum die_type { + COIN = 2, + D4 = 4, + D8 = 8, + D10 = 10, + D12 = 12, + D20 = 20, + D100 = 100 +}; + +struct roll_result_type { + size_t individual_result_count; + int individual_results[MAX_ACTIVE_DICE]; + int total; +}; + +extern int roll_die(enum die_type die); + +extern enum die_type const *get_active_dice_set(size_t *out_length); +extern size_t add_die_to_active(enum die_type die); +extern void remove_die_from_active(size_t index); +extern struct roll_result_type roll_active_dice_set(enum die_type die); + +#endif // !DICE_H From ce213c9777b7b4f108f6583bccb26dbce6e4eaae Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 16:45:43 +0200 Subject: [PATCH 26/87] feat: removed renderScale --- src/main.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main.c b/src/main.c index 969351f..c912efd 100644 --- a/src/main.c +++ b/src/main.c @@ -107,9 +107,6 @@ void InitSDL() { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_CreateRendererTextEngine failed: %s", SDL_GetError()); exit(5); } - SDL_SetRenderScale(renderer, 1.0/renderScale, 1.0/renderScale); - InitFonts(); - LogOutputResolution(); } static @@ -126,6 +123,8 @@ extern void HandleEvent(SDL_Event event); int main(int argc, char *argv[]) { InitSDL(); + InitFonts(); + LogOutputResolution(); InitClay(); backendData = (Clay_SDL3RendererData) { .renderer = renderer, @@ -142,8 +141,8 @@ int main(int argc, char *argv[]) { break; case SDL_EVENT_WINDOW_RESIZED: Clay_SetLayoutDimensions((Clay_Dimensions){ - event.window.data1 * (double)renderScale, - event.window.data2 * (double)renderScale + event.window.data1, + event.window.data2 }); LogOutputResolution(); break; From 2cd5a953c94097cf4559002093bdb2de1568eec4 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 16:46:27 +0200 Subject: [PATCH 27/87] fix: changed clay SDL3 renderer to increase circle count --- src/renderer/clay_renderer_SDL3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/clay_renderer_SDL3.c b/src/renderer/clay_renderer_SDL3.c index 2be479a..0353608 100644 --- a/src/renderer/clay_renderer_SDL3.c +++ b/src/renderer/clay_renderer_SDL3.c @@ -51,7 +51,7 @@ static void SDL_Clay_RenderFillRoundedRect(Clay_SDL3RendererData *rendererData, int numCircleSegments[4] = { 1, 1, 1, 1 }; int totalVertices = 0; for (int i = 0; i < 4; ++i) { - numCircleSegments[i] = SDL_clamp((int)radii[i] / 2, 1, NUM_CIRCLE_SEGMENTS); + numCircleSegments[i] = SDL_clamp((int)radii[i], 1, NUM_CIRCLE_SEGMENTS); totalVertices += numCircleSegments[i]; } From 57a3bec8ad9b994d6decea8e9ffe39c2e9a5f535 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 21:58:06 +0200 Subject: [PATCH 28/87] feat: added die colors and adjusted styles --- src/style.c | 27 +++++++++++++++++++++++++ src/style.h | 57 +++++++++++++++++++++++++---------------------------- 2 files changed, 54 insertions(+), 30 deletions(-) diff --git a/src/style.c b/src/style.c index eefd5d8..54b4c01 100644 --- a/src/style.c +++ b/src/style.c @@ -1,5 +1,7 @@ #include "style.h" +#include "application.h" #include "defs.h" +#include "dice.h" Clay_Color ContainerBackgrounds(size_t idx) { return (Clay_Color) { @@ -43,3 +45,28 @@ Clay_ElementDeclaration WindowStyle() { .backgroundColor = WindowBackground() }; } + +Clay_Color DieColor(enum die_type die) { + switch(die) { + case COIN: return (Clay_Color) { 230, 184, 48, 255 }; + case D4: return (Clay_Color) { 177, 56, 52, 255 }; + case D6: return (Clay_Color) { 115, 177, 52, 255 }; + case D8: return (Clay_Color) { 52, 177, 125, 255 }; + case D10: return (Clay_Color) { 52, 177, 176, 255 }; + case D12: return (Clay_Color) { 52, 93, 177, 255 }; + case D20: return (Clay_Color) { 177, 52, 140, 255 }; + case D100: return (Clay_Color) { 95, 52, 177, 255 }; + default: return (Clay_Color) { 0, 0, 0, 255 }; + } +} + +Clay_Color DieButtonColor(enum die_type die, bool selected) { + Clay_Color color = DieColor(die); + if (selected) { + float avg = (color.r + color.g + color.b) / 3.f; + color.r = (color.r - avg) * 0.8f + avg - 30; + color.g = (color.g - avg) * 0.8f + avg - 30; + color.b = (color.b - avg) * 0.8f + avg - 30; + } + return color; +} diff --git a/src/style.h b/src/style.h index 53de3aa..124e042 100644 --- a/src/style.h +++ b/src/style.h @@ -2,15 +2,23 @@ #define STYLE_H #include "defs.h" +#include "dice.h" #include #include +//////////////////////////////////// +// WINDOW STYLE +//////////////////////////////////// + +constexpr uint16_t windowPadding = 10; +constexpr float windowBackground = 0.15f; + //////////////////////////////////// // CONTAINER STYLE //////////////////////////////////// constexpr uint16_t containerGap = 10; -constexpr double defaultRadius = 5.; +constexpr double defaultRadius = 5.0; constexpr float containerBackgrounds[] = { .2f, @@ -24,22 +32,14 @@ constexpr float containerBorders[] = { }; constexpr Clay_Padding containerPadding = { - 32, 32, - 16, 16 + 24, 24, + 24, 24, }; -#define INNER_CONTAINER(depth_)\ - backgroundColor = ContainerBackgrounds(depth_),\ - .border = { ContainerBorders(depth_), CLAY_BORDER_ALL(2) },\ - .cornerRadius = defaultRadiusAll - - -//////////////////////////////////// -// WINDOW STYLE -//////////////////////////////////// - -constexpr uint16_t windowPadding = containerGap; -constexpr float windowBackground = .18f; +#define CONTAINER(depth_)\ +backgroundColor = ContainerBackgrounds(depth_),\ +.border = { ContainerBorders(depth_), CLAY_BORDER_ALL(2) },\ +.cornerRadius = defaultRadiusAll //////////////////////////////////// // TEXT STYLE @@ -58,30 +58,19 @@ constexpr uint16_t headerSizes[] = { 28, 16 }; -#define TEXT_STYLE(color_)\ - textColor = TextColors(color_) - #define BODY(color_)\ fontId = FONT_DEFAULT,\ - .fontSize = baseFontSize,\ - .TEXT_STYLE(color_) + .fontSize = baseFontSize -#define H(level_, color_)\ - fontId = FONT_BOLD,\ - .fontSize = headerSizes[(level_)-1],\ - .TEXT_STYLE(color_) +#define H(level_)\ +fontId = FONT_BOLD,\ +.fontSize = headerSizes[(level_)-1] //////////////////////////////////// // COMPILATIONS // | Functions and expressions that combine styling data from the settings above. //////////////////////////////////// -extern Clay_Color ContainerBackgrounds(size_t idx); -extern Clay_Color ContainerBorders(size_t idx); -extern Clay_Color TextColors(size_t idx); -extern Clay_Color WindowBackground(); -extern Clay_ElementDeclaration WindowStyle(); - constexpr Clay_Sizing layoutExpand = { .width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_GROW(0) @@ -92,4 +81,12 @@ constexpr Clay_CornerRadius defaultRadiusAll = { defaultRadius, defaultRadius }; +extern Clay_Color ContainerBackgrounds(size_t idx); +extern Clay_Color ContainerBorders(size_t idx); +extern Clay_Color TextColors(size_t idx); +extern Clay_Color WindowBackground(); +extern Clay_ElementDeclaration WindowStyle(); +extern Clay_Color DieColor(enum die_type die); +extern Clay_Color DieButtonColor(enum die_type die, bool selected); + #endif // !STYLE_H From 62ec32d9b7fb00dd101762c2234228221f9674b9 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 21:58:27 +0200 Subject: [PATCH 29/87] feat: added scroll motion shifting and delta time --- src/main.c | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/main.c b/src/main.c index c912efd..2c3a563 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,5 @@ #include +#include #include #include #include "renderer/clay_renderer_SDL3.h" @@ -48,7 +49,7 @@ void LogOutputResolution() { SDL_Log("output size: %i, %d", w, h); } -static inline +static Clay_Dimensions MeasureText(Clay_StringSlice text, Clay_TextElementConfig *config, void *userData) { TTF_Font **fonts = userData; TTF_Font *font = fonts[config->fontId]; @@ -57,10 +58,7 @@ Clay_Dimensions MeasureText(Clay_StringSlice text, Clay_TextElementConfig *confi if (!TTF_GetStringSize(font, text.chars, text.length, &width, &height)) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "MeasureText failed to measure text %s", SDL_GetError()); } - return (Clay_Dimensions) { - .width = text.length * config->fontSize, - .height = config->fontSize - }; + return (Clay_Dimensions) { width, height }; } static @@ -132,7 +130,14 @@ int main(int argc, char *argv[]) { .textEngine = textEngine, }; SDL_Event event; + uint64_t startFrameTime = SDL_GetTicksNS(); + double deltaTime = 0.0; + bool mouseButtonDown = false; + bool shiftDown = false; while (running) { + deltaTime = SDL_GetTicksNS() - startFrameTime; + startFrameTime = SDL_GetTicksNS(); + Clay_Vector2 scrollMotion = { 0, 0 }; while (SDL_PollEvent(&event)) { HandleEvent(event); switch (event.type) { @@ -147,17 +152,32 @@ int main(int argc, char *argv[]) { LogOutputResolution(); break; case SDL_EVENT_MOUSE_WHEEL: - Clay_UpdateScrollContainers(true, (Clay_Vector2){ event.wheel.x, event.wheel.y }, 0.01f); + if (shiftDown) { + scrollMotion = (Clay_Vector2) { event.wheel.y * 2.f, event.wheel.x * 2.f }; + } else { + scrollMotion = (Clay_Vector2) { event.wheel.x * 2.f, event.wheel.y * 2.f }; + } break; case SDL_EVENT_MOUSE_MOTION: - Clay_SetPointerState((Clay_Vector2) { event.motion.x, event.motion.y }, event.motion.state & SDL_BUTTON_LEFT); + Clay_SetPointerState((Clay_Vector2) { event.motion.x, event.motion.y }, mouseButtonDown); break; case SDL_EVENT_MOUSE_BUTTON_DOWN: - Clay_SetPointerState((Clay_Vector2) { event.button.x, event.button.y }, event.button.button == SDL_BUTTON_LEFT); - default: + case SDL_EVENT_MOUSE_BUTTON_UP: + if (event.button.button == SDL_BUTTON_LEFT) { + mouseButtonDown = event.button.down; + Clay_SetPointerState((Clay_Vector2) { event.button.x, event.button.y }, mouseButtonDown); + } break; + case SDL_EVENT_KEY_DOWN: + case SDL_EVENT_KEY_UP: + if (event.key.key == SDLK_LSHIFT || event.key.key == SDLK_RSHIFT) { + shiftDown = event.key.down; + } + break; + default: break; } } + Clay_UpdateScrollContainers(true, scrollMotion, deltaTime); SDL_SetRenderDrawColor(renderer, 10, 10, 10, 255); SDL_RenderClear(renderer); Clay_RenderCommandArray array = RenderApplication(); From a8c79ebac5f1d1e7d317ce8c0e228544e9d34d5e Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 21:59:25 +0200 Subject: [PATCH 30/87] feat: added logic for dice adding and removing from active set --- src/dice_container.c | 114 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 101 insertions(+), 13 deletions(-) diff --git a/src/dice_container.c b/src/dice_container.c index 187a09b..aa98c8b 100644 --- a/src/dice_container.c +++ b/src/dice_container.c @@ -1,38 +1,126 @@ #include "dice_container.h" +#include #include +#include #include "style.h" +#include "dice.h" + +static +void HandleAddDieButtonInteraction(Clay_ElementId element, Clay_PointerData pointer, intptr_t die) { + if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + add_die_to_active((enum die_type)die); + } +} + +static inline +void AddDieButton(enum die_type die) { + CLAY(CLAY_IDI("AddDieButton", die), { + .layout = { + .sizing = { CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100) }, + .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, + }, + .backgroundColor = DieButtonColor(die, Clay_Hovered()), + }) { + Clay_OnHover(&HandleAddDieButtonInteraction, die); + CLAY_TEXT(die_to_str(die), CLAY_TEXT_CONFIG({ + .textColor = TextColors(0), + .H(2), + })); + } +} static inline void DiceSelectorContainer() { CLAY(CLAY_ID("DiceSelector"), { + .CONTAINER(0), .layout = { - .layoutDirection = CLAY_TOP_TO_BOTTOM, - .sizing = { CLAY_SIZING_PERCENT(0.15), CLAY_SIZING_GROW(0) }, - .padding = containerPadding, - .childGap = paragraphGap, + .sizing = { CLAY_SIZING_FIT(), CLAY_SIZING_GROW() }, + .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, }, - .INNER_CONTAINER(0), - }) { } + }) { + CLAY(CLAY_ID("DiceSelectorInner"), { + .layout = { + .layoutDirection = CLAY_TOP_TO_BOTTOM, + .childGap = paragraphGap, + .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, + .sizing = { CLAY_SIZING_FIT(), CLAY_SIZING_FIT() }, + .padding = containerPadding, + }, + .clip = { + false, true, Clay_GetScrollOffset(), + }, + }) { + AddDieButton(COIN); + AddDieButton(D4); + AddDieButton(D6); + AddDieButton(D8); + AddDieButton(D10); + AddDieButton(D12); + AddDieButton(D20); + AddDieButton(D100); + } + } +} + +static +void HandleRemoveDieButtonInteraction(Clay_ElementId element, Clay_PointerData pointer, intptr_t index) { + if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + remove_die_from_active(index); + } +} + +static inline +void RemoveDieButton(enum die_type die, int index) { + CLAY(CLAY_IDI("RemoveDieButton", index), { + .layout = { + .sizing = { CLAY_SIZING_FIXED(200), CLAY_SIZING_FIXED(200) }, + .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, + }, + .backgroundColor = DieButtonColor(die, Clay_Hovered()), + }) { + Clay_OnHover(&HandleRemoveDieButtonInteraction, index); + CLAY_TEXT(die_to_str(die), CLAY_TEXT_CONFIG({ + .H(1), + .textColor = TextColors(0) + })); + } } static inline void ActiveDiceContainer() { CLAY(CLAY_ID("ActiveDice"), { .layout = { - .layoutDirection = CLAY_TOP_TO_BOTTOM, - .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0) }, - .padding = containerPadding, - .childGap = paragraphGap, + .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, }, - .INNER_CONTAINER(0), - }) { } + .clip = { + true, true, + { Clay_GetScrollOffset().x, 0 }, + }, + .CONTAINER(0), + }) { + CLAY(CLAY_ID("ActiveDiceInner"), { + .layout = { + .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, + .layoutDirection = CLAY_LEFT_TO_RIGHT, + .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, + .childGap = 16, + .padding = { 100, 100, 0, 0 }, + }, + }) { + size_t dice_count = 0; + enum die_type const *dice = get_active_dice_set(&dice_count); + for (size_t i = 0; i < dice_count; ++i) { + RemoveDieButton(dice[i], i); + } + } + } } void DiceContainer() { CLAY(CLAY_ID("DiceContainer"), { .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT, - .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_PERCENT(0.4) }, + .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_PERCENT(0.4) }, .childGap = containerGap }, }) { From 36e34c2a0f7ed2ab0c2f5dd49825f8103aa62b53 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 21:59:43 +0200 Subject: [PATCH 31/87] feat: increased maximum active dice --- src/dice.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dice.h b/src/dice.h index 370edac..c153f7c 100644 --- a/src/dice.h +++ b/src/dice.h @@ -4,7 +4,7 @@ #include #ifndef MAX_ACTIVE_DICE -#define MAX_ACTIVE_DICE 5 +#define MAX_ACTIVE_DICE 20 #endif enum die_type { From 1d0ce38e65baa39188416e13fd71711ed2f918c5 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 21:59:48 +0200 Subject: [PATCH 32/87] fix: added D6 --- src/dice.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dice.h b/src/dice.h index c153f7c..fe0bc23 100644 --- a/src/dice.h +++ b/src/dice.h @@ -10,6 +10,7 @@ enum die_type { COIN = 2, D4 = 4, + D6 = 6, D8 = 8, D10 = 10, D12 = 12, From 718bf61d0c2b4400c9b8338fa67137f4e0ba225d Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 22:00:07 +0200 Subject: [PATCH 33/87] feat: added die_to_str --- src/dice.c | 12 ++++++++++++ src/dice.h | 3 +++ 2 files changed, 15 insertions(+) diff --git a/src/dice.c b/src/dice.c index 50acdf4..9da3369 100644 --- a/src/dice.c +++ b/src/dice.c @@ -42,3 +42,15 @@ struct roll_result_type roll_active_dice_set(enum die_type die) { return results; } +Clay_String die_to_str(enum die_type die) { + switch (die) { + case COIN: return CLAY_STRING("C"); + case D4: return CLAY_STRING("4"); + case D6: return CLAY_STRING("6"); + case D8: return CLAY_STRING("8"); + case D10: return CLAY_STRING("10"); + case D12: return CLAY_STRING("12"); + case D20: return CLAY_STRING("20"); + case D100: return CLAY_STRING("100"); + } +} diff --git a/src/dice.h b/src/dice.h index fe0bc23..27d19bf 100644 --- a/src/dice.h +++ b/src/dice.h @@ -1,6 +1,7 @@ #ifndef DICE_H #define DICE_H +#include "renderer/clay_renderer_SDL3.h" #include #ifndef MAX_ACTIVE_DICE @@ -31,4 +32,6 @@ extern size_t add_die_to_active(enum die_type die); extern void remove_die_from_active(size_t index); extern struct roll_result_type roll_active_dice_set(enum die_type die); +extern Clay_String die_to_str(enum die_type die); + #endif // !DICE_H From f99d414667a36f9d460d257cd78af4a55d5c19fc Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 22:00:43 +0200 Subject: [PATCH 34/87] fix: remove_die_from_active now copies data backwards and decrements active count --- src/dice.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dice.c b/src/dice.c index 9da3369..a2d6053 100644 --- a/src/dice.c +++ b/src/dice.c @@ -26,7 +26,8 @@ size_t add_die_to_active(enum die_type die) { } void remove_die_from_active(size_t index) { - memmove(active_dice_set + index + 1, active_dice_set + index, MAX_ACTIVE_DICE - index - 1); + memcpy(active_dice_set + index, active_dice_set + index + 1, MAX_ACTIVE_DICE - index - 1); + --current_active_count; } struct roll_result_type roll_active_dice_set(enum die_type die) { From 4c9cafdff5c798e0153abe24da8799858d3c76ed Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 22:01:09 +0200 Subject: [PATCH 35/87] fix: renamed INNER_CONTAINER to CONTAINER --- src/application.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/application.c b/src/application.c index da46b26..75f40cb 100644 --- a/src/application.c +++ b/src/application.c @@ -11,7 +11,7 @@ void DiceLogContainer() { .sizing = layoutExpand, .padding = CLAY_PADDING_ALL(16), }, - .INNER_CONTAINER(0), + .CONTAINER(0), }) {} } @@ -22,7 +22,7 @@ void InitiativeListContainer() { .sizing = layoutExpand, .padding = CLAY_PADDING_ALL(16), }, - .INNER_CONTAINER(0), + .CONTAINER(0), }) {} } From 98fd90ff4d565a50443e355b251efda6b4d9bfce Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 22:44:58 +0200 Subject: [PATCH 36/87] fix: cursor state is now initialized on startup --- src/main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main.c b/src/main.c index 2c3a563..f4f20b2 100644 --- a/src/main.c +++ b/src/main.c @@ -114,6 +114,9 @@ void InitClay() { Clay_Initialize(clayPrimaryArena, (Clay_Dimensions) { screenWidth, screenHeight }, (Clay_ErrorHandler) { HandleClayErrors }); Clay_SetMeasureTextFunction(MeasureText, fonts); Clay_SetLayoutDimensions((Clay_Dimensions) { screenWidth, screenHeight }); + float x, y; + SDL_GetMouseState(&x, &y); + Clay_SetPointerState((Clay_Vector2) { x, y }, false); } extern Clay_RenderCommandArray RenderApplication(); From b7063d99ee8f1267ded5bf0ce3e6fb7d18f192f4 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 22:45:09 +0200 Subject: [PATCH 37/87] tweak: increased scroll speed --- src/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index f4f20b2..8036212 100644 --- a/src/main.c +++ b/src/main.c @@ -156,9 +156,9 @@ int main(int argc, char *argv[]) { break; case SDL_EVENT_MOUSE_WHEEL: if (shiftDown) { - scrollMotion = (Clay_Vector2) { event.wheel.y * 2.f, event.wheel.x * 2.f }; + scrollMotion = (Clay_Vector2) { event.wheel.y * 5.f, event.wheel.x * 5.f }; } else { - scrollMotion = (Clay_Vector2) { event.wheel.x * 2.f, event.wheel.y * 2.f }; + scrollMotion = (Clay_Vector2) { event.wheel.x * 5.f, event.wheel.y * 5.f }; } break; case SDL_EVENT_MOUSE_MOTION: From 7e44029c1dc8257d0c63d84f3d5c8c4884695fde Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 22:45:32 +0200 Subject: [PATCH 38/87] feat: work on implementing dice rolls --- src/dice.c | 19 ++++++++++--------- src/dice.h | 17 ++++++++++++----- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/dice.c b/src/dice.c index a2d6053..46d70f9 100644 --- a/src/dice.c +++ b/src/dice.c @@ -1,4 +1,5 @@ #include "dice.h" +#include #include #include @@ -10,6 +11,11 @@ int roll_die(enum die_type die) { static int current_active_count = 0; static enum die_type active_dice_set[MAX_ACTIVE_DICE]; +static struct roll_result_type roll_results[MAX_ACTIVE_DICE]; +static struct roll_result_type roll_total = { + .roll = 0, .string_len = 0 +}; + enum die_type const *get_active_dice_set(size_t *out_length) { if (out_length != nullptr) { *out_length = current_active_count; @@ -30,17 +36,12 @@ void remove_die_from_active(size_t index) { --current_active_count; } -struct roll_result_type roll_active_dice_set(enum die_type die) { - struct roll_result_type results = { - .individual_result_count = MAX_ACTIVE_DICE, - .total = 0 - }; +void roll_active_dice_set(enum die_type die) { for (size_t i = 0; i < current_active_count; ++i) { - results.individual_results[i] = roll_die(active_dice_set[i]); - results.total += results.individual_results[i]; + roll_results[i].roll = roll_die(active_dice_set[i]); + snprintf(roll_results[i].string, MAX_ROLL_STR_LEN, "%d", roll_results[i].roll); + roll_total.roll += roll_results[i].roll; } - - return results; } Clay_String die_to_str(enum die_type die) { diff --git a/src/dice.h b/src/dice.h index 27d19bf..3c6b380 100644 --- a/src/dice.h +++ b/src/dice.h @@ -5,7 +5,11 @@ #include #ifndef MAX_ACTIVE_DICE -#define MAX_ACTIVE_DICE 20 + #define MAX_ACTIVE_DICE 20 +#endif + +#ifndef MAX_ROLL_STR_LEN + #define MAX_ROLL_STR_LEN 5 #endif enum die_type { @@ -20,9 +24,9 @@ enum die_type { }; struct roll_result_type { - size_t individual_result_count; - int individual_results[MAX_ACTIVE_DICE]; - int total; + int roll; + size_t string_len; + char string[MAX_ROLL_STR_LEN]; }; extern int roll_die(enum die_type die); @@ -30,7 +34,10 @@ extern int roll_die(enum die_type die); extern enum die_type const *get_active_dice_set(size_t *out_length); extern size_t add_die_to_active(enum die_type die); extern void remove_die_from_active(size_t index); -extern struct roll_result_type roll_active_dice_set(enum die_type die); + +extern struct roll_result_type *current_state(size_t *out_length); + +extern void roll_active_dice_set(enum die_type die); extern Clay_String die_to_str(enum die_type die); From 11e7e23962b57775bfa38e6ac32eb2618c9b4240 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 17 Sep 2025 22:45:56 +0200 Subject: [PATCH 39/87] chore: updated TODO.txt --- TODO.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/TODO.txt b/TODO.txt index e044783..32058f2 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,11 +1,11 @@ -Design representation of internal state of dice tray - -Buttons for adding dice to active set - -Buttons for removing dice from active set - Roll modifier editor Button to roll the active set Design representation of internal state of initiative tracker + +x Design representation of internal state of dice tray + +x Buttons for adding dice to active set + +x Buttons for removing dice from active set From 9e8933f2f18e8ca48cd152476b3eef67c8c8be78 Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 10:03:46 +0200 Subject: [PATCH 40/87] feat: fully implemented roll button --- src/application.c | 4 ++-- src/dice.c | 18 +++++++++++++----- src/dice.h | 4 ++-- src/dice_container.c | 45 ++++++++++++++++++++++++++++++++++++-------- src/elements.c | 20 ++++++++++++++++++++ src/elements.h | 10 ++++++++++ src/style.c | 31 +++++++++++++++--------------- src/style.h | 34 ++++++++++++++++++++++++--------- 8 files changed, 125 insertions(+), 41 deletions(-) create mode 100644 src/elements.c create mode 100644 src/elements.h diff --git a/src/application.c b/src/application.c index 75f40cb..b4b3cc8 100644 --- a/src/application.c +++ b/src/application.c @@ -11,7 +11,7 @@ void DiceLogContainer() { .sizing = layoutExpand, .padding = CLAY_PADDING_ALL(16), }, - .CONTAINER(0), + .PANEL(0), }) {} } @@ -22,7 +22,7 @@ void InitiativeListContainer() { .sizing = layoutExpand, .padding = CLAY_PADDING_ALL(16), }, - .CONTAINER(0), + .PANEL(0) }) {} } diff --git a/src/dice.c b/src/dice.c index 46d70f9..5f86558 100644 --- a/src/dice.c +++ b/src/dice.c @@ -1,10 +1,8 @@ #include "dice.h" -#include -#include #include int roll_die(enum die_type die) { - int const max = die - 1; + int const max = die; return (rand() % max) + 1; } @@ -28,6 +26,8 @@ size_t add_die_to_active(enum die_type die) { return MAX_ACTIVE_DICE; } active_dice_set[current_active_count] = die; + roll_results[current_active_count].roll = die; + roll_results[current_active_count].string_len = SDL_snprintf(roll_results[current_active_count].string, MAX_ROLL_STR_LEN, "%d", die); return current_active_count++; } @@ -36,12 +36,20 @@ void remove_die_from_active(size_t index) { --current_active_count; } -void roll_active_dice_set(enum die_type die) { +void roll_active_dice_set() { for (size_t i = 0; i < current_active_count; ++i) { roll_results[i].roll = roll_die(active_dice_set[i]); - snprintf(roll_results[i].string, MAX_ROLL_STR_LEN, "%d", roll_results[i].roll); + roll_results[i].string_len = SDL_snprintf(roll_results[i].string, MAX_ROLL_STR_LEN, "%d", roll_results[i].roll); roll_total.roll += roll_results[i].roll; } + roll_total.string_len = SDL_snprintf(roll_total.string, MAX_ROLL_STR_LEN, "%d", roll_total.roll); +} + +struct roll_result_type *get_current_results(size_t *out_length) { + if (out_length != nullptr) { + *out_length = current_active_count; + } + return roll_results; } Clay_String die_to_str(enum die_type die) { diff --git a/src/dice.h b/src/dice.h index 3c6b380..4826d11 100644 --- a/src/dice.h +++ b/src/dice.h @@ -35,9 +35,9 @@ extern enum die_type const *get_active_dice_set(size_t *out_length); extern size_t add_die_to_active(enum die_type die); extern void remove_die_from_active(size_t index); -extern struct roll_result_type *current_state(size_t *out_length); +extern struct roll_result_type *get_current_results(size_t *out_length); -extern void roll_active_dice_set(enum die_type die); +extern void roll_active_dice_set(); extern Clay_String die_to_str(enum die_type die); diff --git a/src/dice_container.c b/src/dice_container.c index aa98c8b..d691b3d 100644 --- a/src/dice_container.c +++ b/src/dice_container.c @@ -2,9 +2,28 @@ #include #include #include +#include "elements.h" #include "style.h" #include "dice.h" +static +void HandleRollSetButtonInteraction(Clay_ElementId element, Clay_PointerData pointer, intptr_t data) { + if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + roll_active_dice_set(); + } +} + +static inline +void RollSetButton() { + CLAY(CLAY_ID("RollSetButton"), { + .layout = { + .padding = { 30, 30, 10, 10 }, + } + }) { + TextButton(CLAY_STRING("Roll"), buttonBackground, &HandleRollSetButtonInteraction, 0); + } +} + static void HandleAddDieButtonInteraction(Clay_ElementId element, Clay_PointerData pointer, intptr_t die) { if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { @@ -32,7 +51,7 @@ void AddDieButton(enum die_type die) { static inline void DiceSelectorContainer() { CLAY(CLAY_ID("DiceSelector"), { - .CONTAINER(0), + .PANEL(0), .layout = { .sizing = { CLAY_SIZING_FIT(), CLAY_SIZING_GROW() }, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, @@ -44,7 +63,7 @@ void DiceSelectorContainer() { .childGap = paragraphGap, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, .sizing = { CLAY_SIZING_FIT(), CLAY_SIZING_FIT() }, - .padding = containerPadding, + .padding = panelPadding, }, .clip = { false, true, Clay_GetScrollOffset(), @@ -78,8 +97,15 @@ void RemoveDieButton(enum die_type die, int index) { }, .backgroundColor = DieButtonColor(die, Clay_Hovered()), }) { + size_t result_length; + struct roll_result_type const *result = get_current_results(&result_length); + Clay_String string = { + .chars = result[index].string, + .length = result[index].string_len, + .isStaticallyAllocated = true + }; Clay_OnHover(&HandleRemoveDieButtonInteraction, index); - CLAY_TEXT(die_to_str(die), CLAY_TEXT_CONFIG({ + CLAY_TEXT(string, CLAY_TEXT_CONFIG({ .H(1), .textColor = TextColors(0) })); @@ -90,13 +116,11 @@ static inline void ActiveDiceContainer() { CLAY(CLAY_ID("ActiveDice"), { .layout = { + .layoutDirection = CLAY_TOP_TO_BOTTOM, + .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, }, - .clip = { - true, true, - { Clay_GetScrollOffset().x, 0 }, - }, - .CONTAINER(0), + .PANEL(0), }) { CLAY(CLAY_ID("ActiveDiceInner"), { .layout = { @@ -106,6 +130,10 @@ void ActiveDiceContainer() { .childGap = 16, .padding = { 100, 100, 0, 0 }, }, + .clip = { + true, true, + { Clay_GetScrollOffset().x, 0 }, + }, }) { size_t dice_count = 0; enum die_type const *dice = get_active_dice_set(&dice_count); @@ -113,6 +141,7 @@ void ActiveDiceContainer() { RemoveDieButton(dice[i], i); } } + RollSetButton(); } } diff --git a/src/elements.c b/src/elements.c new file mode 100644 index 0000000..190b6fe --- /dev/null +++ b/src/elements.c @@ -0,0 +1,20 @@ +#include "elements.h" +#include "style.h" + +void TextButton(Clay_String text, Clay_Color color, OnHoveredFn onHovered, intptr_t onHoveredData) { + CLAY_AUTO_ID({ + .layout = { + .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, + .padding = buttonPadding, + }, + .cornerRadius = buttonRadii, + .backgroundColor = Clay_Hovered() ? ToHoveredColor(color) : color, + }) { + CLAY_TEXT(text, CLAY_TEXT_CONFIG({ + .BODY(), + .textColor = TextColors(0), + })); + Clay_OnHover(onHovered, onHoveredData); + } +} + diff --git a/src/elements.h b/src/elements.h new file mode 100644 index 0000000..f48acce --- /dev/null +++ b/src/elements.h @@ -0,0 +1,10 @@ +#ifndef ELEMENTS_H +#define ELEMENTS_H + +#include + +typedef void(*OnHoveredFn)(Clay_ElementId element, Clay_PointerData pointer, intptr_t data); + +extern void TextButton(Clay_String text, Clay_Color color, OnHoveredFn onHovered, intptr_t onHoveredData); + +#endif // !ELEMENTS_H diff --git a/src/style.c b/src/style.c index 54b4c01..7edaa61 100644 --- a/src/style.c +++ b/src/style.c @@ -3,20 +3,20 @@ #include "defs.h" #include "dice.h" -Clay_Color ContainerBackgrounds(size_t idx) { +Clay_Color PanelBackground(size_t idx) { return (Clay_Color) { - 255*containerBackgrounds[idx], - 255*containerBackgrounds[idx], - 255*containerBackgrounds[idx], + 255*panelBackground[idx], + 255*panelBackground[idx], + 255*panelBackground[idx], 255 }; } -Clay_Color ContainerBorders(size_t idx) { +Clay_Color PanelBorder(size_t idx) { return (Clay_Color) { - 255*containerBorders[idx], - 255*containerBorders[idx], - 255*containerBorders[idx], + 255*panelBorder[idx], + 255*panelBorder[idx], + 255*panelBorder[idx], 255 }; } @@ -61,12 +61,13 @@ Clay_Color DieColor(enum die_type die) { } Clay_Color DieButtonColor(enum die_type die, bool selected) { - Clay_Color color = DieColor(die); - if (selected) { - float avg = (color.r + color.g + color.b) / 3.f; - color.r = (color.r - avg) * 0.8f + avg - 30; - color.g = (color.g - avg) * 0.8f + avg - 30; - color.b = (color.b - avg) * 0.8f + avg - 30; - } + return selected ? ToHoveredColor(DieColor(die)) : DieColor(die); +} + +Clay_Color ToHoveredColor(Clay_Color color) { + float avg = (color.r + color.g + color.b) / 3.f; + color.r = (color.r - avg) * 0.8f + avg - 30; + color.g = (color.g - avg) * 0.8f + avg - 30; + color.b = (color.b - avg) * 0.8f + avg - 30; return color; } diff --git a/src/style.h b/src/style.h index 124e042..743f65e 100644 --- a/src/style.h +++ b/src/style.h @@ -20,25 +20,25 @@ constexpr float windowBackground = 0.15f; constexpr uint16_t containerGap = 10; constexpr double defaultRadius = 5.0; -constexpr float containerBackgrounds[] = { +constexpr float panelBackground[] = { .2f, .3f, .4f }; -constexpr float containerBorders[] = { +constexpr float panelBorder[] = { .3f, .4f, .5f }; -constexpr Clay_Padding containerPadding = { +constexpr Clay_Padding panelPadding = { 24, 24, 24, 24, }; -#define CONTAINER(depth_)\ -backgroundColor = ContainerBackgrounds(depth_),\ -.border = { ContainerBorders(depth_), CLAY_BORDER_ALL(2) },\ +#define PANEL(depth_)\ +backgroundColor = PanelBackground(depth_),\ +.border = { PanelBackground(depth_), CLAY_BORDER_ALL(2) },\ .cornerRadius = defaultRadiusAll //////////////////////////////////// @@ -58,7 +58,7 @@ constexpr uint16_t headerSizes[] = { 28, 16 }; -#define BODY(color_)\ +#define BODY()\ fontId = FONT_DEFAULT,\ .fontSize = baseFontSize @@ -66,6 +66,21 @@ constexpr uint16_t headerSizes[] = { fontId = FONT_BOLD,\ .fontSize = headerSizes[(level_)-1] +//////////////////////////////////// +// BUTTONS +//////////////////////////////////// + +constexpr Clay_Color buttonBackground = { + 177, 56, 52, 255 +}; +constexpr Clay_Padding buttonPadding = { + 24, 24, + 4, 4, +}; +constexpr Clay_CornerRadius buttonRadii = { + 3, 3, 3, 3 +}; + //////////////////////////////////// // COMPILATIONS // | Functions and expressions that combine styling data from the settings above. @@ -81,12 +96,13 @@ constexpr Clay_CornerRadius defaultRadiusAll = { defaultRadius, defaultRadius }; -extern Clay_Color ContainerBackgrounds(size_t idx); -extern Clay_Color ContainerBorders(size_t idx); +extern Clay_Color PanelBackground(size_t idx); +extern Clay_Color PanelBackground(size_t idx); extern Clay_Color TextColors(size_t idx); extern Clay_Color WindowBackground(); extern Clay_ElementDeclaration WindowStyle(); extern Clay_Color DieColor(enum die_type die); extern Clay_Color DieButtonColor(enum die_type die, bool selected); +extern Clay_Color ToHoveredColor(Clay_Color color); #endif // !STYLE_H From 23cb2487a6a34f223c87dda5579e78197d58372f Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 10:34:22 +0200 Subject: [PATCH 41/87] feat: added dice icons --- asset-src/dice_icons.svg | 172 +++++++++++++++++++++++++++++++++++++++ assets/icons/d10.svg | 18 ++++ assets/icons/d12.svg | 19 +++++ assets/icons/d2.svg | 19 +++++ assets/icons/d20.svg | 19 +++++ assets/icons/d4.svg | 19 +++++ assets/icons/d6.svg | 22 +++++ assets/icons/d8.svg | 19 +++++ 8 files changed, 307 insertions(+) create mode 100644 asset-src/dice_icons.svg create mode 100644 assets/icons/d10.svg create mode 100644 assets/icons/d12.svg create mode 100644 assets/icons/d2.svg create mode 100644 assets/icons/d20.svg create mode 100644 assets/icons/d4.svg create mode 100644 assets/icons/d6.svg create mode 100644 assets/icons/d8.svg diff --git a/asset-src/dice_icons.svg b/asset-src/dice_icons.svg new file mode 100644 index 0000000..53876a3 --- /dev/null +++ b/asset-src/dice_icons.svg @@ -0,0 +1,172 @@ + + + + diff --git a/assets/icons/d10.svg b/assets/icons/d10.svg new file mode 100644 index 0000000..c2c64be --- /dev/null +++ b/assets/icons/d10.svg @@ -0,0 +1,18 @@ + + + + diff --git a/assets/icons/d12.svg b/assets/icons/d12.svg new file mode 100644 index 0000000..6a84fbf --- /dev/null +++ b/assets/icons/d12.svg @@ -0,0 +1,19 @@ + + + + diff --git a/assets/icons/d2.svg b/assets/icons/d2.svg new file mode 100644 index 0000000..5513535 --- /dev/null +++ b/assets/icons/d2.svg @@ -0,0 +1,19 @@ + + + + diff --git a/assets/icons/d20.svg b/assets/icons/d20.svg new file mode 100644 index 0000000..512bab2 --- /dev/null +++ b/assets/icons/d20.svg @@ -0,0 +1,19 @@ + + + + diff --git a/assets/icons/d4.svg b/assets/icons/d4.svg new file mode 100644 index 0000000..84996e0 --- /dev/null +++ b/assets/icons/d4.svg @@ -0,0 +1,19 @@ + + + + diff --git a/assets/icons/d6.svg b/assets/icons/d6.svg new file mode 100644 index 0000000..7606270 --- /dev/null +++ b/assets/icons/d6.svg @@ -0,0 +1,22 @@ + + + + diff --git a/assets/icons/d8.svg b/assets/icons/d8.svg new file mode 100644 index 0000000..090235d --- /dev/null +++ b/assets/icons/d8.svg @@ -0,0 +1,19 @@ + + + + From b159e23d9a0df9d15b55283aa44200d818f85fdf Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 10:34:37 +0200 Subject: [PATCH 42/87] fix: removed unneeded include --- src/style.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/style.c b/src/style.c index 7edaa61..8a2e6f8 100644 --- a/src/style.c +++ b/src/style.c @@ -1,5 +1,4 @@ #include "style.h" -#include "application.h" #include "defs.h" #include "dice.h" From bdca66b4fd71b9636fd83308c413e49ead5ad94c Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 11:46:43 +0200 Subject: [PATCH 43/87] feat: adjusted size of icons --- asset-src/dice_icons.svg | 45 ++++++++++++++++++++++------------------ assets/icons/d12.svg | 2 +- assets/icons/d4.svg | 2 +- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/asset-src/dice_icons.svg b/asset-src/dice_icons.svg index 53876a3..deda4e0 100644 --- a/asset-src/dice_icons.svg +++ b/asset-src/dice_icons.svg @@ -10,6 +10,8 @@ inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)" sodipodi:docname="dice_icons.svg" xml:space="preserve" + inkscape:export-batch-path="../assets/icons" + inkscape:export-batch-name="" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" @@ -23,9 +25,9 @@ inkscape:pagecheckerboard="true" inkscape:deskcolor="#d1d1d1" inkscape:document-units="mm" - inkscape:zoom="0.079655828" - inkscape:cx="1719.8993" - inkscape:cy="-1010.5977" + inkscape:zoom="0.089092089" + inkscape:cx="2575.9863" + inkscape:cy="-836.21342" inkscape:current-layer="layer1"> + r="49.017395" /> diff --git a/assets/icons/d12.svg b/assets/icons/d12.svg index 6a84fbf..5cebfc1 100644 --- a/assets/icons/d12.svg +++ b/assets/icons/d12.svg @@ -16,4 +16,4 @@ style="fill:#ffffff;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round" id="path7" d="M 72.788858,-0.84280396 136.71632,45.603221 112.2982,120.75446 l -79.018692,0 L 8.861391,45.603217 Z" - transform="matrix(1.0406455,0,0,1.0406455,719.31923,5.3954644)" /> + transform="matrix(0.9748178,0,0,0.9748178,724.11075,4.3394261)" /> diff --git a/assets/icons/d4.svg b/assets/icons/d4.svg index 84996e0..8f0249c 100644 --- a/assets/icons/d4.svg +++ b/assets/icons/d4.svg @@ -16,4 +16,4 @@ style="fill:#ffffff;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round" id="path8" d="M 72.788858,-0.84280396 131.00076,99.983171 l -116.423807,-3e-6 z" - transform="matrix(1.1232098,0,0,1.1232098,131.44283,8.1537074)" /> + transform="matrix(-1.1132862,0,0,-1.1132862,294.23482,132.96171)" /> From f9234dc9a2fe22fb561247c4ded3be23d251940e Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 12:11:13 +0200 Subject: [PATCH 44/87] feat: implemented die images --- src/defs.h | 7 ---- src/dice.c | 43 ++++++++++++++------- src/dice.h | 21 ++++++----- src/dice_container.c | 21 ++++++----- src/main.c | 21 +---------- src/resources.c | 89 ++++++++++++++++++++++++++++++++++++++++++++ src/resources.h | 34 +++++++++++++++++ src/style.c | 20 +++++----- src/style.h | 17 +++++++-- 9 files changed, 200 insertions(+), 73 deletions(-) create mode 100644 src/resources.c create mode 100644 src/resources.h diff --git a/src/defs.h b/src/defs.h index 30e23ad..8349ec7 100644 --- a/src/defs.h +++ b/src/defs.h @@ -6,15 +6,8 @@ #include #include -enum Font { - FONT_DEFAULT = 0, - FONT_BOLD = 1, - FONT_MAX -}; extern SDL_Window *window; extern SDL_Renderer *renderer; -extern TTF_Font *fonts[FONT_MAX]; -extern TTF_TextEngine *textEngine; #endif // !DEFS_H diff --git a/src/dice.c b/src/dice.c index 5f86558..77c4607 100644 --- a/src/dice.c +++ b/src/dice.c @@ -1,58 +1,73 @@ #include "dice.h" #include -int roll_die(enum die_type die) { +int Die_Roll(enum Die_Dice die) { int const max = die; return (rand() % max) + 1; } static int current_active_count = 0; -static enum die_type active_dice_set[MAX_ACTIVE_DICE]; +static enum Die_Dice active_dice_set[MAX_ACTIVE_DICE]; -static struct roll_result_type roll_results[MAX_ACTIVE_DICE]; -static struct roll_result_type roll_total = { +static struct Die_ResultType roll_results[MAX_ACTIVE_DICE]; +static struct Die_ResultType roll_total = { .roll = 0, .string_len = 0 }; -enum die_type const *get_active_dice_set(size_t *out_length) { +static +struct Die_ResultType Die_RollToResultType(int roll, enum Die_Dice die) { + struct Die_ResultType result = { }; + result.roll = roll; + if (die == COIN) { + result.string_len = SDL_snprintf(result.string, MAX_ROLL_STR_LEN, roll == 1 ? "H" : "T"); + } else { + result.string_len = SDL_snprintf(result.string, MAX_ROLL_STR_LEN, "%d", roll); + } + result.clay_string = (Clay_String) { + .chars = result.string, + .length = result.string_len, + .isStaticallyAllocated = false + }; + return result; +} + +enum Die_Dice const *Die_GetActiveSet(size_t *out_length) { if (out_length != nullptr) { *out_length = current_active_count; } return active_dice_set; } -size_t add_die_to_active(enum die_type die) { +size_t Die_AddToActiveSet(enum Die_Dice die) { if (current_active_count >= MAX_ACTIVE_DICE) { return MAX_ACTIVE_DICE; } active_dice_set[current_active_count] = die; - roll_results[current_active_count].roll = die; - roll_results[current_active_count].string_len = SDL_snprintf(roll_results[current_active_count].string, MAX_ROLL_STR_LEN, "%d", die); + roll_results[current_active_count] = Die_RollToResultType(die, die); return current_active_count++; } -void remove_die_from_active(size_t index) { +void Die_RemoveFromActiveSet(size_t index) { memcpy(active_dice_set + index, active_dice_set + index + 1, MAX_ACTIVE_DICE - index - 1); --current_active_count; } -void roll_active_dice_set() { +void Die_RollActiveSet() { for (size_t i = 0; i < current_active_count; ++i) { - roll_results[i].roll = roll_die(active_dice_set[i]); - roll_results[i].string_len = SDL_snprintf(roll_results[i].string, MAX_ROLL_STR_LEN, "%d", roll_results[i].roll); + roll_results[i] = Die_RollToResultType(Die_Roll(active_dice_set[i]), active_dice_set[i]); roll_total.roll += roll_results[i].roll; } roll_total.string_len = SDL_snprintf(roll_total.string, MAX_ROLL_STR_LEN, "%d", roll_total.roll); } -struct roll_result_type *get_current_results(size_t *out_length) { +struct Die_ResultType *Die_GetLastResult(size_t *out_length) { if (out_length != nullptr) { *out_length = current_active_count; } return roll_results; } -Clay_String die_to_str(enum die_type die) { +Clay_String Die_ToString(enum Die_Dice die) { switch (die) { case COIN: return CLAY_STRING("C"); case D4: return CLAY_STRING("4"); diff --git a/src/dice.h b/src/dice.h index 4826d11..fc2874f 100644 --- a/src/dice.h +++ b/src/dice.h @@ -9,10 +9,10 @@ #endif #ifndef MAX_ROLL_STR_LEN - #define MAX_ROLL_STR_LEN 5 + #define MAX_ROLL_STR_LEN 10 #endif -enum die_type { +enum Die_Dice { COIN = 2, D4 = 4, D6 = 6, @@ -23,22 +23,23 @@ enum die_type { D100 = 100 }; -struct roll_result_type { +struct Die_ResultType { int roll; size_t string_len; char string[MAX_ROLL_STR_LEN]; + Clay_String clay_string; }; -extern int roll_die(enum die_type die); +extern int Die_Roll(enum Die_Dice die); -extern enum die_type const *get_active_dice_set(size_t *out_length); -extern size_t add_die_to_active(enum die_type die); -extern void remove_die_from_active(size_t index); +extern enum Die_Dice const *Die_GetActiveSet(size_t *out_length); +extern size_t Die_AddToActiveSet(enum Die_Dice die); +extern void Die_RemoveFromActiveSet(size_t index); -extern struct roll_result_type *get_current_results(size_t *out_length); +extern struct Die_ResultType *Die_GetLastResult(size_t *out_length); -extern void roll_active_dice_set(); +extern void Die_RollActiveSet(); -extern Clay_String die_to_str(enum die_type die); +extern Clay_String Die_ToString(enum Die_Dice die); #endif // !DICE_H diff --git a/src/dice_container.c b/src/dice_container.c index d691b3d..64917ba 100644 --- a/src/dice_container.c +++ b/src/dice_container.c @@ -1,5 +1,6 @@ #include "dice_container.h" #include +#include #include #include #include "elements.h" @@ -9,7 +10,7 @@ static void HandleRollSetButtonInteraction(Clay_ElementId element, Clay_PointerData pointer, intptr_t data) { if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { - roll_active_dice_set(); + Die_RollActiveSet(); } } @@ -27,21 +28,21 @@ void RollSetButton() { static void HandleAddDieButtonInteraction(Clay_ElementId element, Clay_PointerData pointer, intptr_t die) { if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { - add_die_to_active((enum die_type)die); + Die_AddToActiveSet((enum Die_Dice)die); } } static inline -void AddDieButton(enum die_type die) { +void AddDieButton(enum Die_Dice die) { CLAY(CLAY_IDI("AddDieButton", die), { .layout = { .sizing = { CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100) }, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, }, - .backgroundColor = DieButtonColor(die, Clay_Hovered()), + .image = { GetDiceImage(die) } }) { Clay_OnHover(&HandleAddDieButtonInteraction, die); - CLAY_TEXT(die_to_str(die), CLAY_TEXT_CONFIG({ + CLAY_TEXT(Die_ToString(die), CLAY_TEXT_CONFIG({ .textColor = TextColors(0), .H(2), })); @@ -84,21 +85,21 @@ void DiceSelectorContainer() { static void HandleRemoveDieButtonInteraction(Clay_ElementId element, Clay_PointerData pointer, intptr_t index) { if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { - remove_die_from_active(index); + Die_RemoveFromActiveSet(index); } } static inline -void RemoveDieButton(enum die_type die, int index) { +void RemoveDieButton(enum Die_Dice die, int index) { CLAY(CLAY_IDI("RemoveDieButton", index), { .layout = { .sizing = { CLAY_SIZING_FIXED(200), CLAY_SIZING_FIXED(200) }, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, }, - .backgroundColor = DieButtonColor(die, Clay_Hovered()), + .image = { GetDiceImage(die) }, }) { size_t result_length; - struct roll_result_type const *result = get_current_results(&result_length); + struct Die_ResultType const *result = Die_GetLastResult(&result_length); Clay_String string = { .chars = result[index].string, .length = result[index].string_len, @@ -136,7 +137,7 @@ void ActiveDiceContainer() { }, }) { size_t dice_count = 0; - enum die_type const *dice = get_active_dice_set(&dice_count); + enum Die_Dice const *dice = Die_GetActiveSet(&dice_count); for (size_t i = 0; i < dice_count; ++i) { RemoveDieButton(dice[i], i); } diff --git a/src/main.c b/src/main.c index 8036212..9cbbbde 100644 --- a/src/main.c +++ b/src/main.c @@ -7,6 +7,7 @@ #include "application.h" #include "defs.h" #include "style.h" +#include "resources.h" #define SDL_MAIN_HANDLED #include @@ -33,8 +34,6 @@ bool running = true; uint64_t clayMemorySize = 0; Clay_Arena clayPrimaryArena; -TTF_Font *fonts[FONT_MAX]; -TTF_TextEngine *textEngine = nullptr; Clay_SDL3RendererData backendData = { .renderer = nullptr, @@ -66,22 +65,6 @@ void HandleClayErrors(Clay_ErrorData data) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "%s", data.errorText.chars); } -static inline void InitFonts() { - fonts[FONT_DEFAULT] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", baseFontSize * 5); - if (fonts[FONT_DEFAULT] == nullptr) { - SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load adwaita sans: %s", SDL_GetError()); - exit(6); - } - TTF_SetFontHinting(fonts[FONT_DEFAULT], TTF_HINTING_LIGHT_SUBPIXEL); - fonts[FONT_BOLD] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", baseFontSize * 5); - if (fonts[FONT_BOLD] == nullptr) { - SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load adwaita sans bold: %s", SDL_GetError()); - exit(7); - } - TTF_SetFontHinting(fonts[FONT_BOLD], TTF_HINTING_LIGHT_SUBPIXEL); - TTF_SetFontStyle(fonts[FONT_BOLD], TTF_STYLE_BOLD); -} - static inline void InitSDL() { SDL_SetHint(SDL_HINT_RENDER_LINE_METHOD, "3"); @@ -124,7 +107,7 @@ extern void HandleEvent(SDL_Event event); int main(int argc, char *argv[]) { InitSDL(); - InitFonts(); + LoadResources(); LogOutputResolution(); InitClay(); backendData = (Clay_SDL3RendererData) { diff --git a/src/resources.c b/src/resources.c new file mode 100644 index 0000000..335e8e5 --- /dev/null +++ b/src/resources.c @@ -0,0 +1,89 @@ +#include "resources.h" +#include "defs.h" +#include "style.h" +#include +#include +#include + +TTF_Font *fonts[FONT_MAX]; +SDL_Texture *diceImages[DICE_IMAGE_MAX]; +TTF_TextEngine *textEngine = nullptr; + +static inline +void LoadFonts() { + fonts[FONT_DEFAULT] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", baseFontSize * 5); + if (fonts[FONT_DEFAULT] == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load adwaita sans: %s", SDL_GetError()); + exit(6); + } + TTF_SetFontHinting(fonts[FONT_DEFAULT], TTF_HINTING_LIGHT_SUBPIXEL); + fonts[FONT_BOLD] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", baseFontSize * 5); + if (fonts[FONT_BOLD] == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load adwaita sans bold: %s", SDL_GetError()); + exit(6); + } + TTF_SetFontHinting(fonts[FONT_BOLD], TTF_HINTING_LIGHT_SUBPIXEL); + TTF_SetFontStyle(fonts[FONT_BOLD], TTF_STYLE_BOLD); +} + +static inline +void LoadDiceImages() { + if(!(diceImages[COIN_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d2.svg"))) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "IMG_LoadTexture Failed to load die texture: %s", SDL_GetError()); + exit(7); + } + if(!(diceImages[D4_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d4.svg"))) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "IMG_LoadTexture Failed to load die texture: %s", SDL_GetError()); + exit(7); + } + if(!(diceImages[D6_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d6.svg"))) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "IMG_LoadTexture Failed to load die texture: %s", SDL_GetError()); + exit(7); + } + if(!(diceImages[D8_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d8.svg"))) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "IMG_LoadTexture Failed to load die texture: %s", SDL_GetError()); + exit(7); + } + if(!(diceImages[D10_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d10.svg"))) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "IMG_LoadTexture Failed to load die texture: %s", SDL_GetError()); + exit(7); + } + if(!(diceImages[D12_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d12.svg"))) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "IMG_LoadTexture Failed to load die texture: %s", SDL_GetError()); + exit(7); + } + if(!(diceImages[D20_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d20.svg"))) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "IMG_LoadTexture Failed to load die texture: %s", SDL_GetError()); + exit(7); + } + for (size_t i = 0; i < DICE_IMAGE_MAX; ++i) { + Clay_Color color = dieColors[i]; + SDL_SetTextureColorMod(diceImages[i], color.r, color.g, color.b); + } +} + +void LoadResources() { + LoadFonts(); + LoadDiceImages(); +} + +SDL_Texture *GetDiceImage(enum Die_Dice die) { + switch (die) { + case COIN: + return diceImages[COIN_IMAGE]; + case D4: + return diceImages[D4_IMAGE]; + case D6: + return diceImages[D6_IMAGE]; + case D8: + return diceImages[D8_IMAGE]; + case D10: + return diceImages[D10_IMAGE]; + case D12: + return diceImages[D12_IMAGE]; + case D20: + return diceImages[D20_IMAGE]; + case D100: + return diceImages[D10_IMAGE]; + } +} diff --git a/src/resources.h b/src/resources.h new file mode 100644 index 0000000..061e0c0 --- /dev/null +++ b/src/resources.h @@ -0,0 +1,34 @@ +#ifndef RESOURCES_H +#define RESOURCES_H + +#include "dice.h" +#include +#include + +enum Font { + FONT_DEFAULT = 0, + FONT_BOLD = 1, + FONT_MAX +}; + +enum DiceImages { + COIN_IMAGE = 0, + D4_IMAGE = 1, + D6_IMAGE, + D8_IMAGE, + D10_IMAGE, + D12_IMAGE, + D20_IMAGE, + + DICE_IMAGE_MAX +}; + +extern TTF_TextEngine *textEngine; +extern TTF_Font *fonts[FONT_MAX]; +extern SDL_Texture *diceImages[DICE_IMAGE_MAX]; + +extern void LoadResources(); + +extern SDL_Texture *GetDiceImage(enum Die_Dice die); + +#endif // !RESOURCES_H diff --git a/src/style.c b/src/style.c index 8a2e6f8..f300e9b 100644 --- a/src/style.c +++ b/src/style.c @@ -45,21 +45,21 @@ Clay_ElementDeclaration WindowStyle() { }; } -Clay_Color DieColor(enum die_type die) { +Clay_Color DieColor(enum Die_Dice die) { switch(die) { - case COIN: return (Clay_Color) { 230, 184, 48, 255 }; - case D4: return (Clay_Color) { 177, 56, 52, 255 }; - case D6: return (Clay_Color) { 115, 177, 52, 255 }; - case D8: return (Clay_Color) { 52, 177, 125, 255 }; - case D10: return (Clay_Color) { 52, 177, 176, 255 }; - case D12: return (Clay_Color) { 52, 93, 177, 255 }; - case D20: return (Clay_Color) { 177, 52, 140, 255 }; - case D100: return (Clay_Color) { 95, 52, 177, 255 }; + case COIN: return dieColors[0]; + case D4: return dieColors[1]; + case D6: return dieColors[2]; + case D8: return dieColors[3]; + case D10: return dieColors[4]; + case D12: return dieColors[5]; + case D20: return dieColors[6]; + case D100: return dieColors[7]; default: return (Clay_Color) { 0, 0, 0, 255 }; } } -Clay_Color DieButtonColor(enum die_type die, bool selected) { +Clay_Color DieButtonColor(enum Die_Dice die, bool selected) { return selected ? ToHoveredColor(DieColor(die)) : DieColor(die); } diff --git a/src/style.h b/src/style.h index 743f65e..ee01d42 100644 --- a/src/style.h +++ b/src/style.h @@ -2,7 +2,7 @@ #define STYLE_H #include "defs.h" -#include "dice.h" +#include "resources.h" #include #include @@ -81,6 +81,17 @@ constexpr Clay_CornerRadius buttonRadii = { 3, 3, 3, 3 }; +constexpr Clay_Color dieColors[] = { + { 230, 184, 48, 255 }, + { 177, 56, 52, 255 }, + { 115, 177, 52, 255 }, + { 52, 177, 125, 255 }, + { 52, 177, 176, 255 }, + { 52, 93, 177, 255 }, + { 177, 52, 140, 255 }, + { 95, 52, 177, 255 }, +}; + //////////////////////////////////// // COMPILATIONS // | Functions and expressions that combine styling data from the settings above. @@ -101,8 +112,8 @@ extern Clay_Color PanelBackground(size_t idx); extern Clay_Color TextColors(size_t idx); extern Clay_Color WindowBackground(); extern Clay_ElementDeclaration WindowStyle(); -extern Clay_Color DieColor(enum die_type die); -extern Clay_Color DieButtonColor(enum die_type die, bool selected); +extern Clay_Color DieColor(enum Die_Dice die); +extern Clay_Color DieButtonColor(enum Die_Dice die, bool selected); extern Clay_Color ToHoveredColor(Clay_Color color); #endif // !STYLE_H From 420f4e5244860969560b0794b7cf80f4c74a5d9c Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 12:11:37 +0200 Subject: [PATCH 45/87] fix: deleting bin/assets/ before copying --- premake5.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/premake5.lua b/premake5.lua index d592297..193f93a 100644 --- a/premake5.lua +++ b/premake5.lua @@ -12,7 +12,7 @@ project "Dice" links { "m", "stdc++", "SDL3", "SDL3_ttf", "SDL3_image" } buildoptions { "-Wall" } targetdir "bin/" - postbuildcommands { "{COPYDIR} %{wks.location}/assets/ %{cfg.targetdir}/assets/" } + postbuildcommands { "{RMDIR} %{cfg.targetdir}/assets", "{COPYDIR} %{wks.location}/assets/ %{cfg.targetdir}/assets/" } filter "configurations:debug" defines { "DEBUG" } symbols "On" From 9dc64ba962200f17658b0c367a0a4a32f00946c4 Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 14:57:05 +0200 Subject: [PATCH 46/87] feat: renamed Die namespace to Dice --- src/dice.c | 92 +++++++++++++++++++++++++++++--------------- src/dice.h | 22 ++++++----- src/dice_container.c | 54 +++++++++++++++++--------- src/elements.c | 1 + src/resources.c | 2 +- src/resources.h | 2 +- src/style.c | 4 +- src/style.h | 4 +- 8 files changed, 114 insertions(+), 67 deletions(-) diff --git a/src/dice.c b/src/dice.c index 77c4607..6674647 100644 --- a/src/dice.c +++ b/src/dice.c @@ -1,22 +1,27 @@ #include "dice.h" #include -int Die_Roll(enum Die_Dice die) { - int const max = die; - return (rand() % max) + 1; +int Dice_Roll(enum Dice_Die die) { + if (die == COIN) { + return (rand() % 2); + } else { + int const max = die; + return (rand() % max) + 1; + } } -static int current_active_count = 0; -static enum Die_Dice active_dice_set[MAX_ACTIVE_DICE]; +static int activeDiceCount = 0; +static enum Dice_Die activeDice[MAX_ACTIVE_DICE]; -static struct Die_ResultType roll_results[MAX_ACTIVE_DICE]; -static struct Die_ResultType roll_total = { - .roll = 0, .string_len = 0 +static struct Dice_ResultType rollResult[MAX_ACTIVE_DICE]; +static struct Dice_ResultType rollTotal = { + .string = "0", + .roll = 0, .string_len = 1, }; static -struct Die_ResultType Die_RollToResultType(int roll, enum Die_Dice die) { - struct Die_ResultType result = { }; +struct Dice_ResultType Dice_RollToResultType(int roll, enum Dice_Die die) { + struct Dice_ResultType result = { }; result.roll = roll; if (die == COIN) { result.string_len = SDL_snprintf(result.string, MAX_ROLL_STR_LEN, roll == 1 ? "H" : "T"); @@ -31,43 +36,66 @@ struct Die_ResultType Die_RollToResultType(int roll, enum Die_Dice die) { return result; } -enum Die_Dice const *Die_GetActiveSet(size_t *out_length) { +enum Dice_Die const *Dice_GetActiveSet(size_t *out_length) { if (out_length != nullptr) { - *out_length = current_active_count; + *out_length = activeDiceCount; } - return active_dice_set; + return activeDice; } -size_t Die_AddToActiveSet(enum Die_Dice die) { - if (current_active_count >= MAX_ACTIVE_DICE) { +size_t Dice_AddToActiveSet(enum Dice_Die die) { + if (activeDiceCount >= MAX_ACTIVE_DICE) { return MAX_ACTIVE_DICE; } - active_dice_set[current_active_count] = die; - roll_results[current_active_count] = Die_RollToResultType(die, die); - return current_active_count++; + activeDice[activeDiceCount] = die; + rollResult[activeDiceCount] = Dice_RollToResultType(die, die); + rollTotal.roll += die; + rollTotal = Dice_RollToResultType(rollTotal.roll, 0); + return activeDiceCount++; } -void Die_RemoveFromActiveSet(size_t index) { - memcpy(active_dice_set + index, active_dice_set + index + 1, MAX_ACTIVE_DICE - index - 1); - --current_active_count; -} - -void Die_RollActiveSet() { - for (size_t i = 0; i < current_active_count; ++i) { - roll_results[i] = Die_RollToResultType(Die_Roll(active_dice_set[i]), active_dice_set[i]); - roll_total.roll += roll_results[i].roll; +void Dice_RemoveFromActiveSet(size_t index) { + if (index >= MAX_ACTIVE_DICE) { + return; } - roll_total.string_len = SDL_snprintf(roll_total.string, MAX_ROLL_STR_LEN, "%d", roll_total.roll); + rollTotal.roll -= rollResult[index].roll; + rollTotal = Dice_RollToResultType(rollTotal.roll, 0); + memcpy(activeDice + index, activeDice + index + 1, MAX_ACTIVE_DICE - index - 1); + --activeDiceCount; } -struct Die_ResultType *Die_GetLastResult(size_t *out_length) { +void Dice_ClearActiveSet() { + rollTotal.roll = 0; + rollTotal = Dice_RollToResultType(rollTotal.roll, 0); + activeDiceCount = 0; +} + +void Dice_RollActiveSet() { + int total = 0; + for (size_t i = 0; i < activeDiceCount; ++i) { + rollResult[i] = Dice_RollToResultType(Dice_Roll(activeDice[i]), activeDice[i]); + total += rollResult[i].roll; + } + rollTotal = Dice_RollToResultType(total, 0); +} + +struct Dice_ResultType *Dice_GetLastResult(size_t *out_length) { if (out_length != nullptr) { - *out_length = current_active_count; + *out_length = activeDiceCount; } - return roll_results; + return rollResult; } -Clay_String Die_ToString(enum Die_Dice die) { +struct Dice_ResultType *Dice_GetLastResultTotal() { + rollTotal.clay_string = (Clay_String) { + .chars = rollTotal.string, + .length = rollTotal.string_len, + .isStaticallyAllocated = false + }; + return &rollTotal; +} + +Clay_String Dice_ToString(enum Dice_Die die) { switch (die) { case COIN: return CLAY_STRING("C"); case D4: return CLAY_STRING("4"); diff --git a/src/dice.h b/src/dice.h index fc2874f..dd01437 100644 --- a/src/dice.h +++ b/src/dice.h @@ -12,8 +12,8 @@ #define MAX_ROLL_STR_LEN 10 #endif -enum Die_Dice { - COIN = 2, +enum Dice_Die { + COIN = 1, D4 = 4, D6 = 6, D8 = 8, @@ -23,23 +23,25 @@ enum Die_Dice { D100 = 100 }; -struct Die_ResultType { +struct Dice_ResultType { int roll; size_t string_len; char string[MAX_ROLL_STR_LEN]; Clay_String clay_string; }; -extern int Die_Roll(enum Die_Dice die); +extern int Dice_Roll(enum Dice_Die die); -extern enum Die_Dice const *Die_GetActiveSet(size_t *out_length); -extern size_t Die_AddToActiveSet(enum Die_Dice die); -extern void Die_RemoveFromActiveSet(size_t index); +extern enum Dice_Die const *Dice_GetActiveSet(size_t *out_length); +extern size_t Dice_AddToActiveSet(enum Dice_Die die); +extern void Dice_RemoveFromActiveSet(size_t index); +extern void Dice_ClearActiveSet(); -extern struct Die_ResultType *Die_GetLastResult(size_t *out_length); +extern struct Dice_ResultType *Dice_GetLastResult(size_t *out_length); +extern struct Dice_ResultType *Dice_GetLastResultTotal(); -extern void Die_RollActiveSet(); +extern void Dice_RollActiveSet(); -extern Clay_String Die_ToString(enum Die_Dice die); +extern Clay_String Dice_ToString(enum Dice_Die die); #endif // !DICE_H diff --git a/src/dice_container.c b/src/dice_container.c index 64917ba..90e66b2 100644 --- a/src/dice_container.c +++ b/src/dice_container.c @@ -10,30 +10,26 @@ static void HandleRollSetButtonInteraction(Clay_ElementId element, Clay_PointerData pointer, intptr_t data) { if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { - Die_RollActiveSet(); + Dice_RollActiveSet(); } } -static inline -void RollSetButton() { - CLAY(CLAY_ID("RollSetButton"), { - .layout = { - .padding = { 30, 30, 10, 10 }, - } - }) { - TextButton(CLAY_STRING("Roll"), buttonBackground, &HandleRollSetButtonInteraction, 0); +static +void HandleClearSetButtonInteraction(Clay_ElementId element, Clay_PointerData pointer, intptr_t data) { + if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + Dice_ClearActiveSet(); } } static void HandleAddDieButtonInteraction(Clay_ElementId element, Clay_PointerData pointer, intptr_t die) { if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { - Die_AddToActiveSet((enum Die_Dice)die); + Dice_AddToActiveSet((enum Dice_Die)die); } } static inline -void AddDieButton(enum Die_Dice die) { +void AddDieButton(enum Dice_Die die) { CLAY(CLAY_IDI("AddDieButton", die), { .layout = { .sizing = { CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100) }, @@ -42,9 +38,10 @@ void AddDieButton(enum Die_Dice die) { .image = { GetDiceImage(die) } }) { Clay_OnHover(&HandleAddDieButtonInteraction, die); - CLAY_TEXT(Die_ToString(die), CLAY_TEXT_CONFIG({ + CLAY_TEXT(Dice_ToString(die), CLAY_TEXT_CONFIG({ .textColor = TextColors(0), .H(2), + .textAlignment = CLAY_TEXT_ALIGN_CENTER })); } } @@ -67,7 +64,7 @@ void DiceSelectorContainer() { .padding = panelPadding, }, .clip = { - false, true, Clay_GetScrollOffset(), + true, true, Clay_GetScrollOffset(), }, }) { AddDieButton(COIN); @@ -85,12 +82,12 @@ void DiceSelectorContainer() { static void HandleRemoveDieButtonInteraction(Clay_ElementId element, Clay_PointerData pointer, intptr_t index) { if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { - Die_RemoveFromActiveSet(index); + Dice_RemoveFromActiveSet(index); } } static inline -void RemoveDieButton(enum Die_Dice die, int index) { +void RemoveDieButton(enum Dice_Die die, int index) { CLAY(CLAY_IDI("RemoveDieButton", index), { .layout = { .sizing = { CLAY_SIZING_FIXED(200), CLAY_SIZING_FIXED(200) }, @@ -99,7 +96,7 @@ void RemoveDieButton(enum Die_Dice die, int index) { .image = { GetDiceImage(die) }, }) { size_t result_length; - struct Die_ResultType const *result = Die_GetLastResult(&result_length); + struct Dice_ResultType const *result = Dice_GetLastResult(&result_length); Clay_String string = { .chars = result[index].string, .length = result[index].string_len, @@ -108,7 +105,8 @@ void RemoveDieButton(enum Die_Dice die, int index) { Clay_OnHover(&HandleRemoveDieButtonInteraction, index); CLAY_TEXT(string, CLAY_TEXT_CONFIG({ .H(1), - .textColor = TextColors(0) + .textColor = TextColors(0), + .textAlignment = CLAY_TEXT_ALIGN_CENTER, })); } } @@ -137,12 +135,30 @@ void ActiveDiceContainer() { }, }) { size_t dice_count = 0; - enum Die_Dice const *dice = Die_GetActiveSet(&dice_count); + enum Dice_Die const *dice = Dice_GetActiveSet(&dice_count); for (size_t i = 0; i < dice_count; ++i) { RemoveDieButton(dice[i], i); } } - RollSetButton(); + CLAY(CLAY_ID("ActiveDiceControls"), { + .layout = { + .layoutDirection = CLAY_LEFT_TO_RIGHT, + .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, + .childGap = 20, + .padding = { 0, 0, 0, 10 }, + }, + }) { + CLAY_AUTO_ID({ + .layout.padding = { 10, 10, 10, 10 } + }) { + CLAY_TEXT(Dice_GetLastResultTotal()->clay_string, CLAY_TEXT_CONFIG({ + .BODY(), + .textColor = TextColors(0), + })); + } + TextButton(CLAY_STRING("Roll"), buttonBackground, &HandleRollSetButtonInteraction, 0); + TextButton(CLAY_STRING("Clear"), buttonBackground, &HandleClearSetButtonInteraction, 0); + } } } diff --git a/src/elements.c b/src/elements.c index 190b6fe..91819c1 100644 --- a/src/elements.c +++ b/src/elements.c @@ -13,6 +13,7 @@ void TextButton(Clay_String text, Clay_Color color, OnHoveredFn onHovered, intpt CLAY_TEXT(text, CLAY_TEXT_CONFIG({ .BODY(), .textColor = TextColors(0), + .textAlignment = CLAY_TEXT_ALIGN_CENTER, })); Clay_OnHover(onHovered, onHoveredData); } diff --git a/src/resources.c b/src/resources.c index 335e8e5..02d2249 100644 --- a/src/resources.c +++ b/src/resources.c @@ -67,7 +67,7 @@ void LoadResources() { LoadDiceImages(); } -SDL_Texture *GetDiceImage(enum Die_Dice die) { +SDL_Texture *GetDiceImage(enum Dice_Die die) { switch (die) { case COIN: return diceImages[COIN_IMAGE]; diff --git a/src/resources.h b/src/resources.h index 061e0c0..3935e39 100644 --- a/src/resources.h +++ b/src/resources.h @@ -29,6 +29,6 @@ extern SDL_Texture *diceImages[DICE_IMAGE_MAX]; extern void LoadResources(); -extern SDL_Texture *GetDiceImage(enum Die_Dice die); +extern SDL_Texture *GetDiceImage(enum Dice_Die die); #endif // !RESOURCES_H diff --git a/src/style.c b/src/style.c index f300e9b..f357c10 100644 --- a/src/style.c +++ b/src/style.c @@ -45,7 +45,7 @@ Clay_ElementDeclaration WindowStyle() { }; } -Clay_Color DieColor(enum Die_Dice die) { +Clay_Color DieColor(enum Dice_Die die) { switch(die) { case COIN: return dieColors[0]; case D4: return dieColors[1]; @@ -59,7 +59,7 @@ Clay_Color DieColor(enum Die_Dice die) { } } -Clay_Color DieButtonColor(enum Die_Dice die, bool selected) { +Clay_Color DieButtonColor(enum Dice_Die die, bool selected) { return selected ? ToHoveredColor(DieColor(die)) : DieColor(die); } diff --git a/src/style.h b/src/style.h index ee01d42..8d791d2 100644 --- a/src/style.h +++ b/src/style.h @@ -112,8 +112,8 @@ extern Clay_Color PanelBackground(size_t idx); extern Clay_Color TextColors(size_t idx); extern Clay_Color WindowBackground(); extern Clay_ElementDeclaration WindowStyle(); -extern Clay_Color DieColor(enum Die_Dice die); -extern Clay_Color DieButtonColor(enum Die_Dice die, bool selected); +extern Clay_Color DieColor(enum Dice_Die die); +extern Clay_Color DieButtonColor(enum Dice_Die die, bool selected); extern Clay_Color ToHoveredColor(Clay_Color color); #endif // !STYLE_H From bbc42fad1cbcdb4bc1b199a93b94661fbc9b60d7 Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 15:00:01 +0200 Subject: [PATCH 47/87] chore: placed max length macros closer to relevant elements --- src/dice.h | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/dice.h b/src/dice.h index dd01437..45405ad 100644 --- a/src/dice.h +++ b/src/dice.h @@ -4,14 +4,6 @@ #include "renderer/clay_renderer_SDL3.h" #include -#ifndef MAX_ACTIVE_DICE - #define MAX_ACTIVE_DICE 20 -#endif - -#ifndef MAX_ROLL_STR_LEN - #define MAX_ROLL_STR_LEN 10 -#endif - enum Dice_Die { COIN = 1, D4 = 4, @@ -23,6 +15,9 @@ enum Dice_Die { D100 = 100 }; +#ifndef MAX_ROLL_STR_LEN +#define MAX_ROLL_STR_LEN 10 +#endif struct Dice_ResultType { int roll; size_t string_len; @@ -30,6 +25,10 @@ struct Dice_ResultType { Clay_String clay_string; }; +#ifndef MAX_ACTIVE_DICE +#define MAX_ACTIVE_DICE 20 +#endif + extern int Dice_Roll(enum Dice_Die die); extern enum Dice_Die const *Dice_GetActiveSet(size_t *out_length); From a379de4374a9797729a785165243cccee0ffa291 Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 15:32:20 +0200 Subject: [PATCH 48/87] feat: adjusted dice icons --- asset-src/dice_icons.svg | 27 +++++++++++++++------------ assets/icons/d10.svg | 2 +- assets/icons/d12.svg | 2 +- assets/icons/d2.svg | 2 +- assets/icons/d20.svg | 2 +- assets/icons/d4.svg | 2 +- assets/icons/d6.svg | 8 ++++---- assets/icons/d8.svg | 2 +- 8 files changed, 25 insertions(+), 22 deletions(-) diff --git a/asset-src/dice_icons.svg b/asset-src/dice_icons.svg index deda4e0..3f9e82f 100644 --- a/asset-src/dice_icons.svg +++ b/asset-src/dice_icons.svg @@ -12,6 +12,9 @@ xml:space="preserve" inkscape:export-batch-path="../assets/icons" inkscape:export-batch-name="" + inkscape:export-filename="dice_icons.svg" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" @@ -25,9 +28,9 @@ inkscape:pagecheckerboard="true" inkscape:deskcolor="#d1d1d1" inkscape:document-units="mm" - inkscape:zoom="0.089092089" - inkscape:cx="2575.9863" - inkscape:cy="-836.21342" + inkscape:zoom="0.28641836" + inkscape:cx="2646.4784" + inkscape:cy="677.33087" inkscape:current-layer="layer1"> + d="m 649.59996,11.868888 49.16646,39.571907 V 87.171717 L 649.59996,123.59777 600.4335,87.171714 V 51.440793 Z" /> diff --git a/assets/icons/d12.svg b/assets/icons/d12.svg index 5cebfc1..7bede80 100644 --- a/assets/icons/d12.svg +++ b/assets/icons/d12.svg @@ -16,4 +16,4 @@ style="fill:#ffffff;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round" id="path7" d="M 72.788858,-0.84280396 136.71632,45.603221 112.2982,120.75446 l -79.018692,0 L 8.861391,45.603217 Z" - transform="matrix(0.9748178,0,0,0.9748178,724.11075,4.3394261)" /> + transform="matrix(0.77072736,0,0,0.77072736,738.96626,16.635767)" /> diff --git a/assets/icons/d2.svg b/assets/icons/d2.svg index 5513535..0530e3b 100644 --- a/assets/icons/d2.svg +++ b/assets/icons/d2.svg @@ -16,4 +16,4 @@ id="path9" cx="67.73333" cy="67.73333" - r="60.523819" /> + r="49.017395" /> diff --git a/assets/icons/d20.svg b/assets/icons/d20.svg index 512bab2..a956625 100644 --- a/assets/icons/d20.svg +++ b/assets/icons/d20.svg @@ -16,4 +16,4 @@ style="fill:#ffffff;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round" id="path1" d="m 72.788858,-0.84280396 58.211902,33.60865896 0,67.217316 -58.211905,33.608659 -58.211902,-33.608662 1e-6,-67.217316 z" - transform="matrix(0.99238809,0,0,0.99238809,868.2985,1.9723317)" /> + transform="matrix(0.72805306,0,0,0.72805306,887.53916,19.409163)" /> diff --git a/assets/icons/d4.svg b/assets/icons/d4.svg index 8f0249c..53e4406 100644 --- a/assets/icons/d4.svg +++ b/assets/icons/d4.svg @@ -16,4 +16,4 @@ style="fill:#ffffff;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round" id="path8" d="M 72.788858,-0.84280396 131.00076,99.983171 l -116.423807,-3e-6 z" - transform="matrix(-1.1132862,0,0,-1.1132862,294.23482,132.96171)" /> + transform="matrix(0.94002452,0,0,0.94002452,144.77667,10.368405)" /> diff --git a/assets/icons/d6.svg b/assets/icons/d6.svg index 7606270..8be22fb 100644 --- a/assets/icons/d6.svg +++ b/assets/icons/d6.svg @@ -15,8 +15,8 @@ transform="translate(-290.93332)"> diff --git a/assets/icons/d8.svg b/assets/icons/d8.svg index 090235d..d93b168 100644 --- a/assets/icons/d8.svg +++ b/assets/icons/d8.svg @@ -16,4 +16,4 @@ style="fill:#ffffff;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round" id="path5" d="M 72.788858,-0.84280396 140.00617,66.374514 72.788855,133.59183 5.5715408,66.37451 Z" - transform="translate(431.34446,1.3588174)" /> + transform="matrix(0.80174873,0,0,0.80174873,445.77495,14.517649)" /> From f379ed1b86efe73e1eecb871f6f1c53745956d93 Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 15:32:55 +0200 Subject: [PATCH 49/87] chore: moved Dice_Roll to location that matches with the header --- src/dice.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/dice.c b/src/dice.c index 6674647..f9e47c0 100644 --- a/src/dice.c +++ b/src/dice.c @@ -1,15 +1,6 @@ #include "dice.h" #include -int Dice_Roll(enum Dice_Die die) { - if (die == COIN) { - return (rand() % 2); - } else { - int const max = die; - return (rand() % max) + 1; - } -} - static int activeDiceCount = 0; static enum Dice_Die activeDice[MAX_ACTIVE_DICE]; @@ -19,6 +10,15 @@ static struct Dice_ResultType rollTotal = { .roll = 0, .string_len = 1, }; +int Dice_Roll(enum Dice_Die die) { + if (die == COIN) { + return (rand() % 2); + } else { + int const max = die; + return (rand() % max) + 1; + } +} + static struct Dice_ResultType Dice_RollToResultType(int roll, enum Dice_Die die) { struct Dice_ResultType result = { }; From f214f4728bfd722364d6b1026559c7a9f17c0059 Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 15:33:24 +0200 Subject: [PATCH 50/87] chore: moved add coint button to the bottom of the list --- src/dice_container.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dice_container.c b/src/dice_container.c index 90e66b2..a63b40c 100644 --- a/src/dice_container.c +++ b/src/dice_container.c @@ -67,7 +67,6 @@ void DiceSelectorContainer() { true, true, Clay_GetScrollOffset(), }, }) { - AddDieButton(COIN); AddDieButton(D4); AddDieButton(D6); AddDieButton(D8); @@ -75,6 +74,7 @@ void DiceSelectorContainer() { AddDieButton(D12); AddDieButton(D20); AddDieButton(D100); + AddDieButton(COIN); } } } From b63449319a3e073c79e5c13fca847dcbca151f5f Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 15:34:01 +0200 Subject: [PATCH 51/87] feat: removed unneeded container and moved roll total between clear and roll button --- src/dice_container.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/dice_container.c b/src/dice_container.c index a63b40c..171d60c 100644 --- a/src/dice_container.c +++ b/src/dice_container.c @@ -148,16 +148,12 @@ void ActiveDiceContainer() { .padding = { 0, 0, 0, 10 }, }, }) { - CLAY_AUTO_ID({ - .layout.padding = { 10, 10, 10, 10 } - }) { - CLAY_TEXT(Dice_GetLastResultTotal()->clay_string, CLAY_TEXT_CONFIG({ - .BODY(), - .textColor = TextColors(0), - })); - } - TextButton(CLAY_STRING("Roll"), buttonBackground, &HandleRollSetButtonInteraction, 0); - TextButton(CLAY_STRING("Clear"), buttonBackground, &HandleClearSetButtonInteraction, 0); + TextButton(CLAY_STRING("Roll"), proceedButton, &HandleRollSetButtonInteraction, 0); + CLAY_TEXT(Dice_GetLastResultTotal()->clay_string, CLAY_TEXT_CONFIG({ + .H(3), + .textColor = TextColors(0), + })); + TextButton(CLAY_STRING("Clear"), warningButton, &HandleClearSetButtonInteraction, 0); } } } From 461a233eb2bf082c971d38554fd07a7b962f65fa Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 15:36:32 +0200 Subject: [PATCH 52/87] feat: separated button style into warning and proceed --- src/style.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/style.h b/src/style.h index 8d791d2..ebe5cb7 100644 --- a/src/style.h +++ b/src/style.h @@ -70,9 +70,12 @@ fontId = FONT_BOLD,\ // BUTTONS //////////////////////////////////// -constexpr Clay_Color buttonBackground = { +constexpr Clay_Color warningButton = { 177, 56, 52, 255 }; +constexpr Clay_Color proceedButton = { + 49, 181, 99, 255 +}; constexpr Clay_Padding buttonPadding = { 24, 24, 4, 4, From e3638788e5f32dbddb5daa113a8dc69aa97e46bc Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 15:36:42 +0200 Subject: [PATCH 53/87] feat: added border to TextButton --- src/elements.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/elements.c b/src/elements.c index 91819c1..30704a4 100644 --- a/src/elements.c +++ b/src/elements.c @@ -2,13 +2,15 @@ #include "style.h" void TextButton(Clay_String text, Clay_Color color, OnHoveredFn onHovered, intptr_t onHoveredData) { + Clay_Color hovered = ToHoveredColor(color); CLAY_AUTO_ID({ .layout = { .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, .padding = buttonPadding, }, .cornerRadius = buttonRadii, - .backgroundColor = Clay_Hovered() ? ToHoveredColor(color) : color, + .backgroundColor = Clay_Hovered() ? hovered : color, + .border = { ToHoveredColor(Clay_Hovered() ? hovered : color), CLAY_BORDER_ALL(1) } }) { CLAY_TEXT(text, CLAY_TEXT_CONFIG({ .BODY(), From 033597f4c91a84b6681a379f5622b4bdf6bdedc6 Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 17:04:29 +0200 Subject: [PATCH 54/87] chore: added explanation to seemingly unneeded include of "resources.h" --- src/style.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/style.h b/src/style.h index ebe5cb7..59ff1fb 100644 --- a/src/style.h +++ b/src/style.h @@ -2,7 +2,7 @@ #define STYLE_H #include "defs.h" -#include "resources.h" +#include "resources.h" // needed for macros #include #include From df86dd586c759c52d504f0992993472967669760 Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 18 Sep 2025 21:04:38 +0200 Subject: [PATCH 55/87] feat: increased size of dice icons --- asset-src/dice_icons.svg | 46 ++++++++++++++++++++-------------------- assets/icons/d10.svg | 2 +- assets/icons/d12.svg | 2 +- assets/icons/d2.svg | 2 +- assets/icons/d20.svg | 2 +- assets/icons/d4.svg | 2 +- assets/icons/d6.svg | 8 +++---- assets/icons/d8.svg | 2 +- 8 files changed, 33 insertions(+), 33 deletions(-) diff --git a/asset-src/dice_icons.svg b/asset-src/dice_icons.svg index 3f9e82f..2987abc 100644 --- a/asset-src/dice_icons.svg +++ b/asset-src/dice_icons.svg @@ -28,9 +28,9 @@ inkscape:pagecheckerboard="true" inkscape:deskcolor="#d1d1d1" inkscape:document-units="mm" - inkscape:zoom="0.28641836" - inkscape:cx="2646.4784" - inkscape:cy="677.33087" + inkscape:zoom="0.59185669" + inkscape:cx="3482.2619" + inkscape:cy="419.02035" inkscape:current-layer="layer1"> + r="57.958187" /> diff --git a/assets/icons/d10.svg b/assets/icons/d10.svg index 245c2a9..d151e8d 100644 --- a/assets/icons/d10.svg +++ b/assets/icons/d10.svg @@ -15,4 +15,4 @@ transform="translate(-581.86667)"> + d="M 649.59993,5.6855819 703.25785,48.872462 V 87.867475 L 649.59993,127.62112 595.94202,87.867472 V 48.87246 Z" /> diff --git a/assets/icons/d12.svg b/assets/icons/d12.svg index 7bede80..4028926 100644 --- a/assets/icons/d12.svg +++ b/assets/icons/d12.svg @@ -16,4 +16,4 @@ style="fill:#ffffff;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round" id="path7" d="M 72.788858,-0.84280396 136.71632,45.603221 112.2982,120.75446 l -79.018692,0 L 8.861391,45.603217 Z" - transform="matrix(0.77072736,0,0,0.77072736,738.96626,16.635767)" /> + transform="matrix(0.89550761,0,0,0.89550761,729.88365,7.3795082)" /> diff --git a/assets/icons/d2.svg b/assets/icons/d2.svg index 0530e3b..9d90323 100644 --- a/assets/icons/d2.svg +++ b/assets/icons/d2.svg @@ -16,4 +16,4 @@ id="path9" cx="67.73333" cy="67.73333" - r="49.017395" /> + r="57.958187" /> diff --git a/assets/icons/d20.svg b/assets/icons/d20.svg index a956625..df1a4cd 100644 --- a/assets/icons/d20.svg +++ b/assets/icons/d20.svg @@ -16,4 +16,4 @@ style="fill:#ffffff;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round" id="path1" d="m 72.788858,-0.84280396 58.211902,33.60865896 0,67.217316 -58.211905,33.608659 -58.211902,-33.608662 1e-6,-67.217316 z" - transform="matrix(0.72805306,0,0,0.72805306,887.53916,19.409163)" /> + transform="matrix(0.90520643,0,0,0.90520643,874.64437,5.1307506)" /> diff --git a/assets/icons/d4.svg b/assets/icons/d4.svg index 53e4406..feed6a9 100644 --- a/assets/icons/d4.svg +++ b/assets/icons/d4.svg @@ -16,4 +16,4 @@ style="fill:#ffffff;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round" id="path8" d="M 72.788858,-0.84280396 131.00076,99.983171 l -116.423807,-3e-6 z" - transform="matrix(0.94002452,0,0,0.94002452,144.77667,10.368405)" /> + transform="matrix(1.0686039,0,0,1.0686039,135.41752,2.8771004)" /> diff --git a/assets/icons/d6.svg b/assets/icons/d6.svg index 8be22fb..3324024 100644 --- a/assets/icons/d6.svg +++ b/assets/icons/d6.svg @@ -15,8 +15,8 @@ transform="translate(-290.93332)"> diff --git a/assets/icons/d8.svg b/assets/icons/d8.svg index d93b168..722aca5 100644 --- a/assets/icons/d8.svg +++ b/assets/icons/d8.svg @@ -16,4 +16,4 @@ style="fill:#ffffff;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round" id="path5" d="M 72.788858,-0.84280396 140.00617,66.374514 72.788855,133.59183 5.5715408,66.37451 Z" - transform="matrix(0.80174873,0,0,0.80174873,445.77495,14.517649)" /> + transform="matrix(0.88610748,0,0,0.88610748,439.63457,7.7184047)" /> From 3b2ea85fe786d0dfcfa6ae74f0997ebfe775c6c3 Mon Sep 17 00:00:00 2001 From: Sara Date: Fri, 19 Sep 2025 12:30:02 +0200 Subject: [PATCH 56/87] feat: added recoloured 'selected' dice button alternatives --- src/dice_container.c | 12 ++++++++---- src/resources.c | 31 ++++++++++++++++++++----------- src/resources.h | 3 ++- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/dice_container.c b/src/dice_container.c index 171d60c..472d4e3 100644 --- a/src/dice_container.c +++ b/src/dice_container.c @@ -35,13 +35,17 @@ void AddDieButton(enum Dice_Die die) { .sizing = { CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100) }, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, }, - .image = { GetDiceImage(die) } + .image = { GetDiceImage(die, Clay_Hovered()) }, + .border = { + PanelBorder(0), + CLAY_BORDER_ALL(1), + } }) { Clay_OnHover(&HandleAddDieButtonInteraction, die); CLAY_TEXT(Dice_ToString(die), CLAY_TEXT_CONFIG({ - .textColor = TextColors(0), .H(2), - .textAlignment = CLAY_TEXT_ALIGN_CENTER + .textColor = TextColors(0), + .textAlignment = CLAY_TEXT_ALIGN_CENTER, })); } } @@ -93,7 +97,7 @@ void RemoveDieButton(enum Dice_Die die, int index) { .sizing = { CLAY_SIZING_FIXED(200), CLAY_SIZING_FIXED(200) }, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, }, - .image = { GetDiceImage(die) }, + .image = { GetDiceImage(die, Clay_Hovered()) }, }) { size_t result_length; struct Dice_ResultType const *result = Dice_GetLastResult(&result_length); diff --git a/src/resources.c b/src/resources.c index 02d2249..be4889d 100644 --- a/src/resources.c +++ b/src/resources.c @@ -7,6 +7,7 @@ TTF_Font *fonts[FONT_MAX]; SDL_Texture *diceImages[DICE_IMAGE_MAX]; +SDL_Texture *diceImagesSelected[DICE_IMAGE_MAX]; TTF_TextEngine *textEngine = nullptr; static inline @@ -32,33 +33,42 @@ void LoadDiceImages() { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "IMG_LoadTexture Failed to load die texture: %s", SDL_GetError()); exit(7); } + diceImagesSelected[COIN_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d2.svg"); if(!(diceImages[D4_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d4.svg"))) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "IMG_LoadTexture Failed to load die texture: %s", SDL_GetError()); exit(7); } + diceImagesSelected[D4_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d4.svg"); if(!(diceImages[D6_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d6.svg"))) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "IMG_LoadTexture Failed to load die texture: %s", SDL_GetError()); exit(7); } + diceImagesSelected[D6_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d6.svg"); if(!(diceImages[D8_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d8.svg"))) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "IMG_LoadTexture Failed to load die texture: %s", SDL_GetError()); exit(7); } + diceImagesSelected[D8_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d8.svg"); if(!(diceImages[D10_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d10.svg"))) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "IMG_LoadTexture Failed to load die texture: %s", SDL_GetError()); exit(7); } + diceImagesSelected[D10_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d10.svg"); if(!(diceImages[D12_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d12.svg"))) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "IMG_LoadTexture Failed to load die texture: %s", SDL_GetError()); exit(7); } + diceImagesSelected[D12_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d12.svg"); if(!(diceImages[D20_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d20.svg"))) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "IMG_LoadTexture Failed to load die texture: %s", SDL_GetError()); exit(7); } + diceImagesSelected[D20_IMAGE] = IMG_LoadTexture(renderer, "assets/icons/d20.svg"); for (size_t i = 0; i < DICE_IMAGE_MAX; ++i) { Clay_Color color = dieColors[i]; SDL_SetTextureColorMod(diceImages[i], color.r, color.g, color.b); + color = ToHoveredColor(dieColors[i]); + SDL_SetTextureColorMod(diceImagesSelected[i], color.r, color.g, color.b); } } @@ -67,23 +77,22 @@ void LoadResources() { LoadDiceImages(); } -SDL_Texture *GetDiceImage(enum Dice_Die die) { +SDL_Texture *GetDiceImage(enum Dice_Die die, bool selected) { switch (die) { case COIN: - return diceImages[COIN_IMAGE]; + return selected ? diceImagesSelected[COIN_IMAGE] : diceImages[COIN_IMAGE]; case D4: - return diceImages[D4_IMAGE]; + return selected ? diceImagesSelected[D4_IMAGE] : diceImages[D4_IMAGE]; case D6: - return diceImages[D6_IMAGE]; + return selected ? diceImagesSelected[D6_IMAGE] : diceImages[D6_IMAGE]; case D8: - return diceImages[D8_IMAGE]; + return selected ? diceImagesSelected[D8_IMAGE] : diceImages[D8_IMAGE]; case D10: - return diceImages[D10_IMAGE]; - case D12: - return diceImages[D12_IMAGE]; - case D20: - return diceImages[D20_IMAGE]; case D100: - return diceImages[D10_IMAGE]; + return selected ? diceImagesSelected[D10_IMAGE] : diceImages[D10_IMAGE]; + case D12: + return selected ? diceImagesSelected[D12_IMAGE] : diceImages[D12_IMAGE]; + case D20: + return selected ? diceImagesSelected[D20_IMAGE] : diceImages[D20_IMAGE]; } } diff --git a/src/resources.h b/src/resources.h index 3935e39..ce89368 100644 --- a/src/resources.h +++ b/src/resources.h @@ -26,9 +26,10 @@ enum DiceImages { extern TTF_TextEngine *textEngine; extern TTF_Font *fonts[FONT_MAX]; extern SDL_Texture *diceImages[DICE_IMAGE_MAX]; +extern SDL_Texture *diceImagesSelected[DICE_IMAGE_MAX]; extern void LoadResources(); -extern SDL_Texture *GetDiceImage(enum Dice_Die die); +extern SDL_Texture *GetDiceImage(enum Dice_Die die, bool selected); #endif // !RESOURCES_H From f4bfca547021c7c19a5a3ece6d772157a05225d3 Mon Sep 17 00:00:00 2001 From: Sara Date: Fri, 19 Sep 2025 12:32:43 +0200 Subject: [PATCH 57/87] chore: compacted dice selector --- src/dice_container.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/dice_container.c b/src/dice_container.c index 472d4e3..c6d6f38 100644 --- a/src/dice_container.c +++ b/src/dice_container.c @@ -62,10 +62,9 @@ void DiceSelectorContainer() { CLAY(CLAY_ID("DiceSelectorInner"), { .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, - .childGap = paragraphGap, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, .sizing = { CLAY_SIZING_FIT(), CLAY_SIZING_FIT() }, - .padding = panelPadding, + .padding = { 2, 2, 5, 5 }, }, .clip = { true, true, Clay_GetScrollOffset(), From e2c7a2262985944f2a8d4758383d765d044e0c2d Mon Sep 17 00:00:00 2001 From: Sara Date: Fri, 19 Sep 2025 12:33:20 +0200 Subject: [PATCH 58/87] fix: active dice set container now shows all dice properly --- src/dice_container.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/dice_container.c b/src/dice_container.c index c6d6f38..9608891 100644 --- a/src/dice_container.c +++ b/src/dice_container.c @@ -126,16 +126,15 @@ void ActiveDiceContainer() { }) { CLAY(CLAY_ID("ActiveDiceInner"), { .layout = { - .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, + .sizing = { CLAY_SIZING_FIT(), CLAY_SIZING_GROW() }, .layoutDirection = CLAY_LEFT_TO_RIGHT, - .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, + .childAlignment = { CLAY_ALIGN_X_LEFT, CLAY_ALIGN_Y_CENTER }, .childGap = 16, .padding = { 100, 100, 0, 0 }, }, .clip = { - true, true, - { Clay_GetScrollOffset().x, 0 }, - }, + true, true, { Clay_GetScrollOffset().x, 0 } + } }) { size_t dice_count = 0; enum Dice_Die const *dice = Dice_GetActiveSet(&dice_count); From 98e96f5672923a2419e58d28ab4ea7ee34b3ec7e Mon Sep 17 00:00:00 2001 From: Sara Date: Fri, 19 Sep 2025 12:33:53 +0200 Subject: [PATCH 59/87] chore: lowereds scroll speed --- src/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index 9cbbbde..d71deb1 100644 --- a/src/main.c +++ b/src/main.c @@ -139,9 +139,9 @@ int main(int argc, char *argv[]) { break; case SDL_EVENT_MOUSE_WHEEL: if (shiftDown) { - scrollMotion = (Clay_Vector2) { event.wheel.y * 5.f, event.wheel.x * 5.f }; + scrollMotion = (Clay_Vector2) { event.wheel.y * 2.f, -event.wheel.x * 5.f }; } else { - scrollMotion = (Clay_Vector2) { event.wheel.x * 5.f, event.wheel.y * 5.f }; + scrollMotion = (Clay_Vector2) { -event.wheel.x * 2.f, event.wheel.y * 5.f }; } break; case SDL_EVENT_MOUSE_MOTION: From 1e93025bf3446fd31bfecaa9e3e5184fda75c0a6 Mon Sep 17 00:00:00 2001 From: Sara Date: Fri, 19 Sep 2025 12:34:21 +0200 Subject: [PATCH 60/87] feat: added a 10ms delay to each frame to avoid using too much CPU --- src/main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.c b/src/main.c index d71deb1..755a89d 100644 --- a/src/main.c +++ b/src/main.c @@ -169,6 +169,7 @@ int main(int argc, char *argv[]) { Clay_RenderCommandArray array = RenderApplication(); SDL_Clay_RenderClayCommands(&backendData, &array); SDL_RenderPresent(renderer); + SDL_Delay(10); } SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); From 2c4d9db441a85576cf0bbc03bb06f2e724e07486 Mon Sep 17 00:00:00 2001 From: Sara Date: Fri, 19 Sep 2025 12:34:55 +0200 Subject: [PATCH 61/87] chore: adjusted formatting in style.c --- src/style.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/style.c b/src/style.c index f357c10..8283649 100644 --- a/src/style.c +++ b/src/style.c @@ -30,7 +30,12 @@ Clay_Color TextColors(size_t idx) { } Clay_Color WindowBackground() { - return (Clay_Color) { 255*windowBackground, 255*windowBackground, 255*windowBackground, 255 }; + return (Clay_Color) { + 255*windowBackground, + 255*windowBackground, + 255*windowBackground, + 255 + }; } Clay_ElementDeclaration WindowStyle() { From e5591a18d800109d8959aa7c560e6877a92e2245 Mon Sep 17 00:00:00 2001 From: Sara Date: Fri, 19 Sep 2025 12:35:12 +0200 Subject: [PATCH 62/87] fix: PanelBorder header declaration spelling --- src/style.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/style.h b/src/style.h index 59ff1fb..9603d91 100644 --- a/src/style.h +++ b/src/style.h @@ -111,7 +111,7 @@ constexpr Clay_CornerRadius defaultRadiusAll = { }; extern Clay_Color PanelBackground(size_t idx); -extern Clay_Color PanelBackground(size_t idx); +extern Clay_Color PanelBorder(size_t idx); extern Clay_Color TextColors(size_t idx); extern Clay_Color WindowBackground(); extern Clay_ElementDeclaration WindowStyle(); From 9cf17fe2b923a7dd551c6924708f7d794a1cf0a6 Mon Sep 17 00:00:00 2001 From: Sara Date: Fri, 19 Sep 2025 14:12:26 +0200 Subject: [PATCH 63/87] feat: separated panel and list container styles --- src/dice_container.c | 18 +++++++----------- src/style.h | 6 +++++- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/dice_container.c b/src/dice_container.c index 9608891..d73f874 100644 --- a/src/dice_container.c +++ b/src/dice_container.c @@ -36,10 +36,6 @@ void AddDieButton(enum Dice_Die die) { .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, }, .image = { GetDiceImage(die, Clay_Hovered()) }, - .border = { - PanelBorder(0), - CLAY_BORDER_ALL(1), - } }) { Clay_OnHover(&HandleAddDieButtonInteraction, die); CLAY_TEXT(Dice_ToString(die), CLAY_TEXT_CONFIG({ @@ -53,22 +49,22 @@ void AddDieButton(enum Dice_Die die) { static inline void DiceSelectorContainer() { CLAY(CLAY_ID("DiceSelector"), { - .PANEL(0), .layout = { .sizing = { CLAY_SIZING_FIT(), CLAY_SIZING_GROW() }, - .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, }, + .PANEL(0), }) { - CLAY(CLAY_ID("DiceSelectorInner"), { + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, - .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, - .sizing = { CLAY_SIZING_FIT(), CLAY_SIZING_FIT() }, + .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, .padding = { 2, 2, 5, 5 }, + .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_TOP }, }, .clip = { - true, true, Clay_GetScrollOffset(), + false, true, Clay_GetScrollOffset(), }, + .LISTCONTAINER(0), }) { AddDieButton(D4); AddDieButton(D6); @@ -118,9 +114,9 @@ static inline void ActiveDiceContainer() { CLAY(CLAY_ID("ActiveDice"), { .layout = { + .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, - .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, }, .PANEL(0), }) { diff --git a/src/style.h b/src/style.h index 9603d91..7bdfea6 100644 --- a/src/style.h +++ b/src/style.h @@ -36,9 +36,13 @@ constexpr Clay_Padding panelPadding = { 24, 24, }; +#define LISTCONTAINER(depth_)\ +border = { PanelBorder(depth_), CLAY_BORDER_ALL(2) },\ +.cornerRadius = defaultRadiusAll + #define PANEL(depth_)\ backgroundColor = PanelBackground(depth_),\ -.border = { PanelBackground(depth_), CLAY_BORDER_ALL(2) },\ +.border = { PanelBorder(depth_), CLAY_BORDER_OUTSIDE(2) },\ .cornerRadius = defaultRadiusAll //////////////////////////////////// From 00569f2ef1a78fd1e89071b22bc793774eb0f4a3 Mon Sep 17 00:00:00 2001 From: Sara Date: Fri, 19 Sep 2025 14:13:03 +0200 Subject: [PATCH 64/87] chore: formatting fix in style.h --- src/style.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/style.h b/src/style.h index 7bdfea6..9199112 100644 --- a/src/style.h +++ b/src/style.h @@ -63,8 +63,8 @@ constexpr uint16_t headerSizes[] = { }; #define BODY()\ - fontId = FONT_DEFAULT,\ - .fontSize = baseFontSize +fontId = FONT_DEFAULT,\ +.fontSize = baseFontSize #define H(level_)\ fontId = FONT_BOLD,\ From 9b2ae482f1fd6ecd75b9a5cbb81f61b730e13bc5 Mon Sep 17 00:00:00 2001 From: Sara Date: Mon, 22 Sep 2025 00:06:01 +0200 Subject: [PATCH 65/87] feat: setup template feat: implemented game of life feat: implemented automatic stepping fix: operator< Cell Cell now sorts by y first, then x fix: equalized scroll x/y fix: removed unused code path fix: marked simulation::living as static since it's no longer forward declared tweak: decreased number of cells on random initialization feat: defined Toggle element feat: added debug information toggle to UI feat: implemented simulation multithreading feat: improved simulation frame delta controls feat: inverted direction of panel colours fix: removed leftover die colors feat: reorganized and cleaned up style namespace chore: increased button border width feat: added SDL3 submodule feat: added SDL3_ttf submodule feat: moved clay to vendor (rather than include) feat: replaced premake5 with CMake to vendor SDL3 chore: translated more C stuff to C++ in main.cpp fix: stepping being inconsistent while running feat: fixed incorrect behaviour on simulation and added benchmarking code feat: minor adjustments to UI layout feat: increased thread count for pool feat: improved simulation benchmarking feat: simulation tasks can now be subdivided into separate workloads for separate threads feat: improved task counting thread safety chore: massively increased random field fix: target delta time is now enforced feat: added toggle for locked framerate fix: replaced manual .lock()/.unlock() calls with std::scoped_lock fix: benchmarking code was off by a magnitude of 1 feat: separated cell state checking into separate function in case another algo is faster than .contains chore: some comments on variables in simulation.cpp feat: set task split to hardware_concurrency() feat: added basic culling to cell renderer feat: implemented simulation threading toggle chore: lowered random button's field size chore: reduced padding on panel containers chore: minor formatting adjustment feat: added README.md fix: inverted x scroll feat: converted project to template feat: added .clangd --- .clangd | 2 + .gitignore | 7 + .gitmodules | 6 + CMakeLists.txt | 25 + README.md | 119 + assets/AdwaitaSans-Regular.ttf | Bin 0 -> 879796 bytes justfile | 19 + src/application.cpp | 28 + src/application.h | 12 + src/elements.cpp | 84 + src/elements.h | 14 + src/input.cpp | 39 + src/input.h | 15 + src/main.cpp | 144 + src/resources.cpp | 32 + src/resources.h | 19 + src/style.cpp | 87 + src/style.h | 104 + src/thread_pool.cpp | 54 + src/thread_pool.h | 30 + vendor/SDL3 | 1 + vendor/SDL3_ttf | 1 + vendor/clay/clay.h | 4446 ++++++++++++++++++++++++++ vendor/renderer/clay_renderer_SDL3.c | 259 ++ vendor/renderer/clay_renderer_SDL3.h | 22 + vendor/renderer/ui_data.c | 30 + vendor/renderer/ui_data.h | 23 + 27 files changed, 5622 insertions(+) create mode 100644 .clangd create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100644 assets/AdwaitaSans-Regular.ttf create mode 100644 justfile create mode 100644 src/application.cpp create mode 100644 src/application.h create mode 100644 src/elements.cpp create mode 100644 src/elements.h create mode 100644 src/input.cpp create mode 100644 src/input.h create mode 100644 src/main.cpp create mode 100644 src/resources.cpp create mode 100644 src/resources.h create mode 100644 src/style.cpp create mode 100644 src/style.h create mode 100644 src/thread_pool.cpp create mode 100644 src/thread_pool.h create mode 160000 vendor/SDL3 create mode 160000 vendor/SDL3_ttf create mode 100644 vendor/clay/clay.h create mode 100644 vendor/renderer/clay_renderer_SDL3.c create mode 100644 vendor/renderer/clay_renderer_SDL3.h create mode 100644 vendor/renderer/ui_data.c create mode 100644 vendor/renderer/ui_data.h diff --git a/.clangd b/.clangd new file mode 100644 index 0000000..5b3daa0 --- /dev/null +++ b/.clangd @@ -0,0 +1,2 @@ +CompileFlags: + Add: [ -Ivendor/, -Ivendor/SDL3/include, -Ivendor/SDL3_ttf/include ] diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e2ff821 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +bin/ +build/ +Makefile +.cache/ +compile_commands.json +.kdev4 +game-of-life.kdev4 diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..01eb3de --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "vendor/SDL3"] + path = vendor/SDL3 + url = https://github.com/libsdl-org/SDL.git +[submodule "vendor/SDL3_ttf"] + path = vendor/SDL3_ttf + url = https://github.com/libsdl-org/SDL_ttf.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..9340897 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 3.21) +project(CHANGEME) + +set(CMAKE_BINARY_DIR "${CMAKE_SOURCE_DIR}/bin") +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}") +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}") + +set(CMAKE_CXX_STANDARD 23) +set(CMAKE_C_STANDARD 23) + +file(GLOB_RECURSE source_files . src/**.cpp src/**.c vendor/renderer/**.c) +include_directories(vendor/) + +add_subdirectory(vendor/SDL3/ EXCLUDE_FROM_ALL) +set(SDLTTF_VENDORED ON) +add_subdirectory(vendor/SDL3_ttf/ EXCLUDE_FROM_ALL) + +add_executable(CHANGEME ${source_files}) +target_link_libraries(CHANGEME PRIVATE SDL3_ttf::SDL3_ttf SDL3::SDL3) + +add_custom_target(copy_assets + COMMAND ${CMAKE_COMMAND} -E + copy_directory ${CMAKE_SOURCE_DIR}/assets/ ${CMAKE_BINARY_DIR}/assets +) +add_dependencies(CHANGEME copy_assets) diff --git a/README.md b/README.md new file mode 100644 index 0000000..7e63075 --- /dev/null +++ b/README.md @@ -0,0 +1,119 @@ +# Clay SDL3 Template + +## Using Template + +### Just use [`just`](https://just.systems/man/en/) + +Run `just set-project-name {project name}` first. + +And remember to `git remote set-url origin {repo}`. + +### Otherwise + +Modify the CMakeLists.txt manually, just replace CHANGEME with whatever your binary should be called. + +## Compiling + +> Remember to `git submodule update --init --recursive`! + +### Just again + +`just configure` runs cmake configuration and generates a `compile_commands.json`. + +`just build` runs the cmake build. + +### CMake works too, I guess + +`cmake -S. -Bbuild` + +`cmake --build build` + +Same as always + +## Files + +### thread_pool.h/cpp + +Thread pool used for parallel GoL generation ticking. + +### application.h/cpp + +UI and layout logic. + +### style.h/cpp + +Reusable UI styling + +### resources.h/cpp + +Font loading. + +### elements.h/cpp + +Reusable UI elements + +### input.h/cpp + +Handling of input events. + +### main.cpp: + +Entrypoint, setup, and main application loop. + +## Prerequisites + +* CMake 3.21 or higher + +* Compiler capable of C++23 and C23. + +## Dependencies + +### SDL3 + +Included as git submodule at `vendor/SDL3/` and dynamically linked. + +### SDL3_ttf + +Included as git submodule at `vendor/SDL3_ttf/` and dynamically linked. + +### Clay + +Included as files in `vendor/clay/clay.h`; Single header library. + +### Clay SDL3 renderer + +Included as files in `vendor/renderer/` and compiled as part of the project. + +> Note: Mildly modified from the official Clay_SDL3_renderer to enable more advanced styling. + +## Code Standards + +* Keep program structure as simple as possible. No `class Application {` class or other Java-isms. Prefer namespaces with static lifetime variables. + +* Use STL where possible. Don't reinvent the wheel. + +* K&R brackets. With notable exceptions(1) + +* camelCase for variables, PascalCase for types and functions (that's what SDL and Clay do). + +* In class member functions, always use `this->` to access member variables. + +* const applies to the name to it's left, so it goes after the type, not `const int x;` but `int const x`. + +* \* and & flush with the declaration name. `Type const &Function(Type &inRef)` + +> (1) Bracket exceptions: +> * using scoped_lock in arbitrary blocks, prefer tailed lisp brackets + +``` +struct Data { + int x{ 0 }, y{ 0 }; +}; +void MyFunction(Data const &data) { // K&R here + DoAsynchronousThings(); + { scoped_lock lock{ myMutex }; + myVariable++; + } // not quite lisp, lisp with a tail + DoMoreAsynchronousThings(); +} +``` diff --git a/assets/AdwaitaSans-Regular.ttf b/assets/AdwaitaSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6fcafd9b0bc750952b619bf27fbddc769867bb72 GIT binary patch literal 879796 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%0AY|GP=4@dU|B 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%0AbMD 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

A#u;n4Du^W(D~YbU!pR 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�gJOV}fBB!*Yhn3|$P(47H$U7gG&GJ?KObDZfTW_aYaDUNG!o=w{;Q zWoj0jy&HVc|Es;L_g}j9?%`&Jca6-y1oXKZIn^wrIoP=Q*cg5^3;q=Zjjc*Z2yu!^ zDe?UN$e;>3u|tTfkyBNgot>S7^W*1#1jgz?m&G%QGAsc#3!XF7gD5kGcOXiYK^1T7 z;1Bq!cqV&@-o+5T%n-fI1oW~)^uB@U{SDFk6QY*`MK5R+mz@FmrrS>-y-g6EW)Phx zAUfY-)rsi&Tte5`1kuNfq7Qw2Rs$0oNM8e!F~m+*h@CeedKn4m{SVQr2GRQzqW2C& zuLJ?TSnY-Sm6L#8K8U@3DE4lJ*eggt?`w!&P_k}qU|J7x^I?cyX99XJL-c-y*!vcu z_di6hHUYh_AbK4kdLKaaLc^JbfZp>Ey<8BzcOZH{LhMz*(2H^!1d}pEuN_#g187q# zI3KKq=zfEt8#O(0Lv%ZUbu-iw;3G%*EBZBt(W}z;mG8_SZkNZHD}%1$ zZQ;Il{N5iqRcV%6KOAD+7@8QiFkE4{$FPQB9zz#nX^Im=8^Z>MiM(D$V(+e9HZ(Q0 zbZ`!da$wlr;J`4av4QFP*~QNP>;9MgFZ!R$`5tt5>$jWxZIhfCni$#`nix9S1=;@m z`NN^+2)eH~k9jiqzTTq$=`9-9zcPIK%gxOF{_&0HfByXB;1cIyVE-?zVWuo7AjHD* zer(hJMh2(5?K8jJNh3x%-QWkzLV9h5603d6;V7oDA*IiBo+jhL7&T)1%g^0_NF?b);E;MoVicz77@>{`5d@$Ah{p3Ix4 zug`6ro}RA5udDmrtgf!k@YBhk1_lNU{~H^aUj1fn=KJ;K&z~hbksduF@* zul!&9zwUqO|H4Lw2GCiLCEUv|F&P^huU@_St&FcTsP+b7(69;UTGUUUKE4F)7v*!Q z0-Z3sfMEthr*eSs%a<=Dy?k80eS81@-TP0UKD~eU{{7qcpFe+o|K>C35OC08w+#PV z`TzfyH_{Xa-4Ocm!PCFu!i|hfKO04U{rdIiALulvKY#xGX9Qhy#m>sqVk##mCoeB2 zCN3^6F0H6xV5}`GEG#A_rf06GsH`j_BP}g2FE1l4BO@gPK3_yZNkv5kbUrx4|5oAu z|NnCcNr>^ifBE9gm#>UWUthfa*eLSs-FGY&K~{~x&K&}s`)kd>#9+q2$RMewA|(Y{ zYapjC!OQ#dojB;oSWZq}UIw8?aSo0j-!5Oi{pQ!NU*A4`|I5K}`7*=7Lx&DFOa2uX z6&3C8??3zG?CK>w^KNl)G&TMI-_gO)-N*)NIVmc3Is7lrOgiiOW3=1?b>zZ$Pv&~7k~GX#k;q5gANdT z`*#0+h82w>zXVjd-@jKglwxP);$>s}!SMb)10(3l3Bg-W9zA;W?c28(_n&fbe|>%S z&6`Hn|NkF9W_Z#l^6wu9*YoGPGJJe|`~n}p{9}0joZ)LD!&gXq6LiwKF9Qoh1_LvL zF9Q>U4+A5E>VpRl?p(WY`pAI;2acXO_wmP_Q`fFtIC1>+>C;D#UA%hn)TvV!uP`iV zY*2b~>+FdWC(hh>^!^_U3(J%1pFcDF`SbeT!

(Uc7ki?!zY^|1_&=XlO|MeQ{;` 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

u<+ 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 z%0A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 Mvc3XU;40Ipt7djJ3c literal 0 HcmV?d00001 diff --git a/justfile b/justfile new file mode 100644 index 0000000..a106e4d --- /dev/null +++ b/justfile @@ -0,0 +1,19 @@ +build: + # BUILDING + cmake --build build + +run: + cd bin/ && CHANGEME + +configure: + # CONFIGURING WITH PREMAKE + cmake -S. -Bbuild -DCMAKE_EXPORT_COMPILE_COMMANDS=ON + +clean: + # CLEANING BUILD ARTEFACTS + rm -r bin/** + rm -r build/** + +set-project-name projectname: clean + git remote set-url origin "" + sed -i "s/CHANGEME/{{projectname}}/g" ./CMakeLists.txt ./justfile diff --git a/src/application.cpp b/src/application.cpp new file mode 100644 index 0000000..decafbb --- /dev/null +++ b/src/application.cpp @@ -0,0 +1,28 @@ +#include "application.h" +#include "style.h" +#include "elements.h" +#include +#include + +namespace application { +static void SampleHeader() { + elements::Header(CLAY_STRING("Left Panel"), 2, { + .textColor = style::color::white + }); +} + +Clay_RenderCommandArray RenderApplication() { + Clay_BeginLayout(); + CLAY(CLAY_ID("OuterContainer"), style::Window()) { + CLAY_AUTO_ID(style::PanelContainer(0, { + .layout = { .sizing = { CLAY_SIZING_PERCENT(0.15), CLAY_SIZING_GROW() } } + })) { + SampleHeader(); + } + } + return Clay_EndLayout(); +} + +void HandleEvent(SDL_Event event) { +} +} diff --git a/src/application.h b/src/application.h new file mode 100644 index 0000000..9d74ea0 --- /dev/null +++ b/src/application.h @@ -0,0 +1,12 @@ +#ifndef APPLICATION_H +#define APPLICATION_H + +#include +#include + +namespace application { +Clay_RenderCommandArray RenderApplication(); +void HandleEvent(SDL_Event event); +} + +#endif // !APPLICATION_H diff --git a/src/elements.cpp b/src/elements.cpp new file mode 100644 index 0000000..b261a97 --- /dev/null +++ b/src/elements.cpp @@ -0,0 +1,84 @@ +#include "elements.h" +#include "style.h" +#include "resources.h" + +namespace elements { +void TextButton(Clay_String text, Clay_Color color, OnHoveredFn onHovered, intptr_t onHoveredData) { + Clay_Color hovered{ style::ToHoveredColor(color) }; + CLAY_AUTO_ID({ + .layout = { + .padding = style::buttonPadding, + .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, + }, + .backgroundColor = Clay_Hovered() + ? hovered + : color, + .cornerRadius = style::buttonRadii, + .border = { + style::ToHoveredColor(Clay_Hovered() ? hovered : color), + CLAY_BORDER_ALL(2) + }, + }) { + Clay_OnHover(onHovered, onHoveredData); + elements::Body(text, { + .textColor = style::TextColor(0), + .textAlignment = CLAY_TEXT_ALIGN_CENTER, + }); + } +} + +void ToggleHovered(Clay_ElementId element, Clay_PointerData pointer, intptr_t data) { + bool *hovered{ (bool*)data }; + if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + *hovered = !(*hovered); + } +} + + +void Toggle(Clay_String label, Clay_Color selected, bool &state) { + CLAY_AUTO_ID({ + .layout = { + .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, + .childGap = 10, + .childAlignment = { CLAY_ALIGN_X_LEFT, CLAY_ALIGN_Y_CENTER }, + }, + }) { + Clay_Color color{Clay_Hovered() + ? style::ToHoveredColor(selected) + : selected + }; + Clay_OnHover(&ToggleHovered, (intptr_t)(&state)); + CLAY_AUTO_ID({ + .layout = { + .sizing = { + CLAY_SIZING_FIXED(20), CLAY_SIZING_FIXED(20) + } + }, + .backgroundColor = (state + ? selected + : style::color::transparent + ), + .cornerRadius = style::buttonRadii, + .border = { + color, + CLAY_BORDER_OUTSIDE(3) + }, + }) { } + Body(label, { + .textColor = style::TextColor(0) + }); + } +} + +void Body(Clay_String string, Clay_TextElementConfig baseCfg) { + baseCfg.fontId = resources::FONT_DEFAULT; + baseCfg.fontSize = style::baseFontSize; + CLAY_TEXT(string, CLAY_TEXT_CONFIG(baseCfg)); +} + +void Header(Clay_String string, size_t header, Clay_TextElementConfig baseCfg) { + baseCfg.fontId = resources::FONT_BOLD; + baseCfg.fontSize = style::headerSizes[(header)-1]; + CLAY_TEXT(string, CLAY_TEXT_CONFIG(baseCfg)); +} +} diff --git a/src/elements.h b/src/elements.h new file mode 100644 index 0000000..1f5269e --- /dev/null +++ b/src/elements.h @@ -0,0 +1,14 @@ +#ifndef ELEMENTS_H +#define ELEMENTS_H + +#include + +namespace elements { +typedef void(*OnHoveredFn)(Clay_ElementId element, Clay_PointerData pointer, intptr_t data); +void TextButton(Clay_String text, Clay_Color color, OnHoveredFn onHovered, intptr_t onHoveredData = 0); +void Toggle(Clay_String label, Clay_Color selected, bool &state); +void Body(Clay_String string, Clay_TextElementConfig baseCfg = {}); +void Header(Clay_String string, size_t header, Clay_TextElementConfig baseCfg = {}); +} + +#endif // !ELEMENTS_H diff --git a/src/input.cpp b/src/input.cpp new file mode 100644 index 0000000..c04da10 --- /dev/null +++ b/src/input.cpp @@ -0,0 +1,39 @@ +#include "input.h" + +namespace input { +Clay_Vector2 scrollMotion{ 0, 0 }; +bool shiftDown{ false }; +bool mouseButtonDown{ false }; + +void FrameStart() { + scrollMotion = { 0, 0 }; +} + +void HandleEvent(SDL_Event const &event) { + switch (event.type) { + case SDL_EVENT_MOUSE_WHEEL: + if (shiftDown) { + scrollMotion = (Clay_Vector2) { event.wheel.y * 4.f, -event.wheel.x * -4.f }; + } else { + scrollMotion = (Clay_Vector2) { -event.wheel.x * -4.f, event.wheel.y * 4.f }; + } + break; + case SDL_EVENT_MOUSE_MOTION: + Clay_SetPointerState((Clay_Vector2) { event.motion.x, event.motion.y }, mouseButtonDown); + break; + case SDL_EVENT_MOUSE_BUTTON_DOWN: + case SDL_EVENT_MOUSE_BUTTON_UP: + if (event.button.button == SDL_BUTTON_LEFT) { + mouseButtonDown = event.button.down; + Clay_SetPointerState((Clay_Vector2) { event.button.x, event.button.y }, mouseButtonDown); + } + break; + case SDL_EVENT_KEY_DOWN: + case SDL_EVENT_KEY_UP: + if (event.key.key == SDLK_LSHIFT || event.key.key == SDLK_RSHIFT) { + shiftDown = event.key.down; + } + break; + } +} +} diff --git a/src/input.h b/src/input.h new file mode 100644 index 0000000..ddd2c09 --- /dev/null +++ b/src/input.h @@ -0,0 +1,15 @@ +#ifndef INPUT_H +#define INPUT_H + +#include +#include + +namespace input { +extern Clay_Vector2 scrollMotion; +extern bool shiftDown; +extern bool mouseButtonDown; +void FrameStart(); +void HandleEvent(SDL_Event const &event); +} + +#endif // !INPUT_H diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..543d5f0 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,144 @@ +#define SDL_MAIN_HANDLED + +#include "application.h" +#include "input.h" +#include "resources.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +constexpr SDL_InitFlags sdlInitFlags = SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIGH_PIXEL_DENSITY; + +SDL_Window *window = nullptr; +SDL_Renderer *renderer = nullptr; +int screenWidth = 1920, screenHeight = 1080; +bool running = true; +uint64_t clayMemorySize = 0; + +Clay_Arena clayPrimaryArena; + +Clay_SDL3RendererData backendData = { + nullptr, nullptr, nullptr +}; + +static +Clay_Dimensions MeasureText(Clay_StringSlice text, Clay_TextElementConfig *config, void *userData) { + TTF_Font **fonts = (TTF_Font**)userData; + TTF_Font *font = fonts[config->fontId]; + int width, height; + TTF_SetFontSize(font, config->fontSize); + if (!TTF_GetStringSize(font, text.chars, text.length, &width, &height)) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "MeasureText failed to measure text %s", SDL_GetError()); + } + return (Clay_Dimensions) { (float)width, (float)height }; +} + +static +void HandleClayErrors(Clay_ErrorData data) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "%s", data.errorText.chars); +} + +static inline +void LogOutputResolution() { + int w, h; + SDL_GetCurrentRenderOutputSize(renderer, &w, &h); + SDL_Log("output size: %i, %d", w, h); +} + +static inline +void InitSDL() { + SDL_SetHint(SDL_HINT_RENDER_LINE_METHOD, "3"); + if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS)) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "SDL_Init failed: %s", SDL_GetError()); + exit(1); + } + if ((window = SDL_CreateWindow("Window", screenWidth, screenHeight, sdlInitFlags)) == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "SDL_CreateWindow failed: %s", SDL_GetError()); + exit(2); + } + if ((renderer = SDL_CreateRenderer(window, NULL)) == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "SDL_CreateRenderer failed: %s", SDL_GetError()); + exit(3); + } + if (!TTF_Init()) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_Init failed: %s", SDL_GetError()); + exit(4); + } + if ((resources::textEngine = TTF_CreateRendererTextEngine(renderer)) == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_CreateRendererTextEngine failed: %s", SDL_GetError()); + exit(5); + } +} + +static +void InitClay() { + clayMemorySize = Clay_MinMemorySize(); + clayPrimaryArena = Clay_CreateArenaWithCapacityAndMemory(clayMemorySize, SDL_malloc(clayMemorySize)); + Clay_Initialize(clayPrimaryArena, { (float)screenWidth, (float)screenHeight }, { HandleClayErrors }); + Clay_SetMeasureTextFunction(MeasureText, resources::fonts); + Clay_SetLayoutDimensions({ (float)screenWidth, (float)screenHeight }); + float x{ 0 }, y{ 0 }; + SDL_GetMouseState(&x, &y); + Clay_SetPointerState((Clay_Vector2) { x, y }, false); +} + +int main(int argc, char *argv[]) { + InitSDL(); + resources::LoadResources(); + LogOutputResolution(); + InitClay(); + backendData = { renderer, resources::textEngine, resources::fonts }; + SDL_Event event; + uint64_t startFrameTime = SDL_GetTicksNS(); + double deltaTime = 0.0; + while (running) { + std::srand(SDL_GetTicksNS()); + deltaTime = SDL_GetTicksNS() - startFrameTime; + startFrameTime = SDL_GetTicksNS(); + UiData_Clear(); + input::FrameStart(); + while (SDL_PollEvent(&event)) { + application::HandleEvent(event); + input::HandleEvent(event); + switch (event.type) { + case SDL_EVENT_QUIT: + running = false; + break; + case SDL_EVENT_WINDOW_RESIZED: + Clay_SetLayoutDimensions({ + (float)event.window.data1, + (float)event.window.data2 + }); + LogOutputResolution(); + break; + default: break; + } + } + Clay_UpdateScrollContainers(true, input::scrollMotion, deltaTime); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_RenderClear(renderer); + Clay_RenderCommandArray commands{ application::RenderApplication() }; + SDL_Clay_RenderClayCommands(&backendData, &commands); + SDL_RenderPresent(renderer); + SDL_Delay(10); + } + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return 0; +} diff --git a/src/resources.cpp b/src/resources.cpp new file mode 100644 index 0000000..845ef9f --- /dev/null +++ b/src/resources.cpp @@ -0,0 +1,32 @@ +#include "resources.h" +#include "style.h" +#include +#include +#include +#include + +namespace resources { +TTF_Font *fonts[FONT_MAX]; +TTF_TextEngine *textEngine = nullptr; + +static inline void LoadFonts() { + fonts[FONT_DEFAULT] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", style::baseFontSize * 5); + if (fonts[FONT_DEFAULT] == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load adwaita sans: %s", SDL_GetError()); + exit(6); + } + TTF_SetFontHinting(fonts[FONT_DEFAULT], TTF_HINTING_LIGHT_SUBPIXEL); + fonts[FONT_BOLD] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", style::baseFontSize * 5); + if (fonts[FONT_BOLD] == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load adwaita sans bold: %s", SDL_GetError()); + exit(6); + } + TTF_SetFontHinting(fonts[FONT_BOLD], TTF_HINTING_LIGHT_SUBPIXEL); + TTF_SetFontStyle(fonts[FONT_BOLD], TTF_STYLE_BOLD); + SDL_Log("LoadFonts: Success"); +} + +void LoadResources() { + LoadFonts(); +} +} diff --git a/src/resources.h b/src/resources.h new file mode 100644 index 0000000..ef12346 --- /dev/null +++ b/src/resources.h @@ -0,0 +1,19 @@ +#ifndef RESOURCES_H +#define RESOURCES_H + +#include + +namespace resources { +enum Font { + FONT_DEFAULT = 0, + FONT_BOLD = 1, + FONT_MAX +}; + +extern TTF_TextEngine *textEngine; +extern TTF_Font *fonts[FONT_MAX]; + +void LoadResources(); +} + +#endif // !RESOURCES_H diff --git a/src/style.cpp b/src/style.cpp new file mode 100644 index 0000000..7fab4b6 --- /dev/null +++ b/src/style.cpp @@ -0,0 +1,87 @@ +#include "style.h" +#include "resources.h" +#include + +namespace style { +Clay_ElementDeclaration ListContainer(size_t depth, Clay_ElementDeclaration baseCfg) { + baseCfg.border = { + PanelBorder(depth), + CLAY_BORDER_ALL(2) + }; + baseCfg.cornerRadius = defaultRadiusAll; + return baseCfg; +} + +Clay_ElementDeclaration PanelContainer(size_t depth, Clay_ElementDeclaration baseCfg) { + baseCfg.backgroundColor = PanelBackground(depth); + baseCfg.border = { + PanelBorder(depth), + CLAY_BORDER_OUTSIDE(2) + }; + baseCfg.cornerRadius = defaultRadiusAll; + baseCfg.layout.padding = CLAY_PADDING_ALL(8); + return baseCfg; +} + +Clay_ElementDeclaration LeftPanelContainer(size_t depth, Clay_ElementDeclaration baseCfg) { + baseCfg = PanelContainer(depth, baseCfg); + baseCfg.border.width = { 0, 2, 2, 2, 0 }; + baseCfg.cornerRadius = { 0, defaultRadius, 0, defaultRadius }; + baseCfg.layout.sizing.height = CLAY_SIZING_GROW(); + return baseCfg; +} + +Clay_ElementDeclaration RightPanelContainer(size_t depth, Clay_ElementDeclaration baseCfg) { + baseCfg = PanelContainer(depth, baseCfg); + baseCfg.border.width = { 2, 0, 2, 2, 0 }; + baseCfg.cornerRadius = { defaultRadius, 0, defaultRadius, 0 }; + baseCfg.layout.sizing.height = CLAY_SIZING_GROW(); + return baseCfg; +} + +Clay_Color PanelBackground(size_t idx) { + return { + 255*panelBackground[idx], + 255*panelBackground[idx], + 255*panelBackground[idx], + 255 + }; +} + +Clay_Color PanelBorder(size_t idx) { + return { + 255*panelBorder[idx], + 255*panelBorder[idx], + 255*panelBorder[idx], + 255 + }; +} + +Clay_Color TextColor(size_t idx) { + return { + 255*textColorsP[idx], + 255*textColorsP[idx], + 255*textColorsP[idx], + 255 + }; +} + +Clay_ElementDeclaration Window() { + return { + .layout = { + .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, + .padding = CLAY_PADDING_ALL(0), + .childGap = 0, + .layoutDirection = CLAY_LEFT_TO_RIGHT, + }, + }; +} + +Clay_Color ToHoveredColor(Clay_Color color) { + float avg = (color.r + color.g + color.b) / 3.f; + color.r = (color.r - avg) * 0.8f + avg - 30; + color.g = (color.g - avg) * 0.8f + avg - 30; + color.b = (color.b - avg) * 0.8f + avg - 30; + return color; +} +} diff --git a/src/style.h b/src/style.h new file mode 100644 index 0000000..9ba6024 --- /dev/null +++ b/src/style.h @@ -0,0 +1,104 @@ +#ifndef STYLE_H +#define STYLE_H + +#include +#include + +namespace style { +//////////////////////////////////// +// WINDOW STYLE +//////////////////////////////////// + +constexpr uint16_t windowPadding{ 10 }; + +//////////////////////////////////// +// CONTAINER STYLE +//////////////////////////////////// + +constexpr uint16_t containerGap{ 10 }; +constexpr double defaultRadius{ 5.0 }; + +constexpr float panelBackground[] = { + .4f, .3f, .2f +}; +constexpr float panelBorder[] = { + .5f, .4f, .3f +}; + +constexpr Clay_Padding panelPadding = { + 24, 24, + 24, 24, +}; + +Clay_ElementDeclaration ListContainer(size_t depth, Clay_ElementDeclaration baseCfg); +Clay_ElementDeclaration PanelContainer(size_t depth, Clay_ElementDeclaration baseCfg); +Clay_ElementDeclaration LeftPanelContainer(size_t depth, Clay_ElementDeclaration baseCfg); +Clay_ElementDeclaration RightPanelContainer(size_t depth, Clay_ElementDeclaration baseCfg); +Clay_Color PanelBackground(size_t idx); +Clay_Color PanelBorder(size_t idx); +Clay_ElementDeclaration Window(); + +//////////////////////////////////// +// TEXT STYLE +//////////////////////////////////// + +constexpr float paragraphGap = 10; +constexpr uint16_t baseFontSize = 16; +constexpr float textColorsP[] = { + 0.9f, 0.9f, 0.9f +}; + +constexpr uint16_t headerSizes[] = { + 64, 32, + 28, 16 +}; + +Clay_Color TextColor(size_t idx); + +//////////////////////////////////// +// BUTTONS +//////////////////////////////////// + +constexpr Clay_Color warningButton = { + 177, 56, 52, 255 +}; +constexpr Clay_Color proceedButton = { + 49, 181, 99, 255 +}; +constexpr Clay_Color actionButton = { + 49, 142, 181, 255 +}; + +constexpr Clay_Padding buttonPadding = { + 24, 24, + 4, 4, +}; +constexpr Clay_CornerRadius buttonRadii = { + 3, 3, 3, 3 +}; + +Clay_Color ToHoveredColor(Clay_Color color); + +//////////////////////////////////// +// COMPILATIONS +// | Functions and expressions that combine styling data from the settings above. +//////////////////////////////////// + +constexpr Clay_Sizing layoutExpand = { + .width = CLAY_SIZING_GROW(0), + .height = CLAY_SIZING_GROW(0) +}; + +constexpr Clay_CornerRadius defaultRadiusAll = { + defaultRadius, defaultRadius, + defaultRadius, defaultRadius +}; + +namespace color { +constexpr Clay_Color transparent{ 255, 255, 255, 0 }; +constexpr Clay_Color black{ 0, 0, 0, 255 }; +constexpr Clay_Color white{ 255, 255, 255, 255 }; +} +} + +#endif // !STYLE_H diff --git a/src/thread_pool.cpp b/src/thread_pool.cpp new file mode 100644 index 0000000..48e4d25 --- /dev/null +++ b/src/thread_pool.cpp @@ -0,0 +1,54 @@ +#include "thread_pool.h" +#include +#include +#include + +namespace threading { +ThreadPool::ThreadPool() { + size_t const thread_count{ std::max(std::thread::hardware_concurrency() - 1, 1u) }; + this->threads.reserve(thread_count); + for (size_t i{ 0 }; i < thread_count; ++i) { + this->threads.emplace_back(std::bind(&ThreadPool::ThreadFn, this)); + } +} + +ThreadPool::~ThreadPool() { + { std::scoped_lock lock{ this->lock }; + this->shutdown = true; + this->threadNotifier.notify_all(); + } + for (std::thread &thread : this->threads) { + thread.join(); + } +} + +size_t ThreadPool::GetThreadCount() { + return this->threads.size(); +} + +void ThreadPool::ScheduleTask(TaskFunc fn) { + std::scoped_lock lock{ this->lock }; + this->taskQueue.emplace(std::move(fn)); + this->threadNotifier.notify_one(); +} + +void ThreadPool::ThreadFn() { + TaskFunc function; + for(;;) { + { std::unique_lock lock{ this->lock }; + while (!this->shutdown && this->taskQueue.empty()) { + this->threadNotifier.wait(lock); + } + if (this->taskQueue.empty()) { + return; + } + function = std::move(this->taskQueue.front()); + this->taskQueue.pop(); + } + + function.operator()(); + } +} + +ThreadPool tasks{}; +} diff --git a/src/thread_pool.h b/src/thread_pool.h new file mode 100644 index 0000000..eb55962 --- /dev/null +++ b/src/thread_pool.h @@ -0,0 +1,30 @@ +#ifndef THREAD_POOL_H +#define THREAD_POOL_H + +#include +#include +#include +#include +#include + +namespace threading { +typedef std::function TaskFunc; + +class ThreadPool { +public: ThreadPool(); + ~ThreadPool(); + void ScheduleTask(TaskFunc jobs); + size_t GetThreadCount(); +private: + void ThreadFn(); + std::queue taskQueue{}; + std::vector threads{}; + std::mutex lock{}; + std::condition_variable threadNotifier{}; + bool shutdown{ false }; +}; + +extern ThreadPool tasks; +} + +#endif // !THREAD_POOL_H diff --git a/vendor/SDL3 b/vendor/SDL3 new file mode 160000 index 0000000..137b0b2 --- /dev/null +++ b/vendor/SDL3 @@ -0,0 +1 @@ +Subproject commit 137b0b2bee2bb9dd76e2c260970ccf7ff0621692 diff --git a/vendor/SDL3_ttf b/vendor/SDL3_ttf new file mode 160000 index 0000000..6b6bd58 --- /dev/null +++ b/vendor/SDL3_ttf @@ -0,0 +1 @@ +Subproject commit 6b6bd588e8646360b08f624fb601cc2ec75c6ada diff --git a/vendor/clay/clay.h b/vendor/clay/clay.h new file mode 100644 index 0000000..7adf9ea --- /dev/null +++ b/vendor/clay/clay.h @@ -0,0 +1,4446 @@ +// VERSION: 0.14 + +/* + NOTE: In order to use this library you must define + the following macro in exactly one file, _before_ including clay.h: + + #define CLAY_IMPLEMENTATION + #include "clay.h" + + See the examples folder for details. +*/ + +#include +#include +#include + +// SIMD includes on supported platforms +#if !defined(CLAY_DISABLE_SIMD) && (defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64)) +#include +#elif !defined(CLAY_DISABLE_SIMD) && defined(__aarch64__) +#include +#endif + +// ----------------------------------------- +// HEADER DECLARATIONS --------------------- +// ----------------------------------------- + +#ifndef CLAY_HEADER +#define CLAY_HEADER + +#if !( \ + (defined(__cplusplus) && __cplusplus >= 202002L) || \ + (defined(__STDC__) && __STDC__ == 1 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ + defined(_MSC_VER) || \ + defined(__OBJC__) \ +) +#error "Clay requires C99, C++20, or MSVC" +#endif + +#ifdef CLAY_WASM +#define CLAY_WASM_EXPORT(name) __attribute__((export_name(name))) +#else +#define CLAY_WASM_EXPORT(null) +#endif + +#ifdef CLAY_DLL +#define CLAY_DLL_EXPORT __declspec(dllexport) __stdcall +#else +#define CLAY_DLL_EXPORT +#endif + +// Public Macro API ------------------------ + +#define CLAY__MAX(x, y) (((x) > (y)) ? (x) : (y)) +#define CLAY__MIN(x, y) (((x) < (y)) ? (x) : (y)) + +#define CLAY_TEXT_CONFIG(...) Clay__StoreTextElementConfig(CLAY__CONFIG_WRAPPER(Clay_TextElementConfig, __VA_ARGS__)) + +#define CLAY_BORDER_OUTSIDE(widthValue) {widthValue, widthValue, widthValue, widthValue, 0} + +#define CLAY_BORDER_ALL(widthValue) {widthValue, widthValue, widthValue, widthValue, widthValue} + +#define CLAY_CORNER_RADIUS(radius) (CLAY__INIT(Clay_CornerRadius) { radius, radius, radius, radius }) + +#define CLAY_PADDING_ALL(padding) CLAY__CONFIG_WRAPPER(Clay_Padding, { padding, padding, padding, padding }) + +#define CLAY_SIZING_FIT(...) (CLAY__INIT(Clay_SizingAxis) { .size = { .minMax = { __VA_ARGS__ } }, .type = CLAY__SIZING_TYPE_FIT }) + +#define CLAY_SIZING_GROW(...) (CLAY__INIT(Clay_SizingAxis) { .size = { .minMax = { __VA_ARGS__ } }, .type = CLAY__SIZING_TYPE_GROW }) + +#define CLAY_SIZING_FIXED(fixedSize) (CLAY__INIT(Clay_SizingAxis) { .size = { .minMax = { fixedSize, fixedSize } }, .type = CLAY__SIZING_TYPE_FIXED }) + +#define CLAY_SIZING_PERCENT(percentOfParent) (CLAY__INIT(Clay_SizingAxis) { .size = { .percent = (percentOfParent) }, .type = CLAY__SIZING_TYPE_PERCENT }) + +// Note: If a compile error led you here, you might be trying to use CLAY_ID with something other than a string literal. To construct an ID with a dynamic string, use CLAY_SID instead. +#define CLAY_ID(label) CLAY_SID(CLAY_STRING(label)) + +#define CLAY_SID(label) Clay__HashString(label, 0) + +// Note: If a compile error led you here, you might be trying to use CLAY_IDI with something other than a string literal. To construct an ID with a dynamic string, use CLAY_SIDI instead. +#define CLAY_IDI(label, index) CLAY_SIDI(CLAY_STRING(label), index) + +#define CLAY_SIDI(label, index) Clay__HashStringWithOffset(label, index, 0) + +// Note: If a compile error led you here, you might be trying to use CLAY_ID_LOCAL with something other than a string literal. To construct an ID with a dynamic string, use CLAY_SID_LOCAL instead. +#define CLAY_ID_LOCAL(label) CLAY_SID_LOCAL(CLAY_STRING(label)) + +#define CLAY_SID_LOCAL(label) Clay__HashString(label, Clay__GetParentElementId()) + +// Note: If a compile error led you here, you might be trying to use CLAY_IDI_LOCAL with something other than a string literal. To construct an ID with a dynamic string, use CLAY_SIDI_LOCAL instead. +#define CLAY_IDI_LOCAL(label, index) CLAY_SIDI_LOCAL(CLAY_STRING(label), index) + +#define CLAY_SIDI_LOCAL(label, index) Clay__HashStringWithOffset(label, index, Clay__GetParentElementId()) + +#define CLAY__STRING_LENGTH(s) ((sizeof(s) / sizeof((s)[0])) - sizeof((s)[0])) + +#define CLAY__ENSURE_STRING_LITERAL(x) ("" x "") + +// Note: If an error led you here, it's because CLAY_STRING can only be used with string literals, i.e. CLAY_STRING("SomeString") and not CLAY_STRING(yourString) +#define CLAY_STRING(string) (CLAY__INIT(Clay_String) { .isStaticallyAllocated = true, .length = CLAY__STRING_LENGTH(CLAY__ENSURE_STRING_LITERAL(string)), .chars = (string) }) + +#define CLAY_STRING_CONST(string) { .isStaticallyAllocated = true, .length = CLAY__STRING_LENGTH(CLAY__ENSURE_STRING_LITERAL(string)), .chars = (string) } + +static uint8_t CLAY__ELEMENT_DEFINITION_LATCH; + +// GCC marks the above CLAY__ELEMENT_DEFINITION_LATCH as an unused variable for files that include clay.h but don't declare any layout +// This is to suppress that warning +static inline void Clay__SuppressUnusedLatchDefinitionVariableWarning(void) { (void) CLAY__ELEMENT_DEFINITION_LATCH; } + +// Publicly visible layout element macros ----------------------------------------------------- + +/* This macro looks scary on the surface, but is actually quite simple. + It turns a macro call like this: + + CLAY({ + .id = CLAY_ID("Container"), + .backgroundColor = { 255, 200, 200, 255 } + }) { + ...children declared here + } + + Into calls like this: + + Clay__OpenElement(); + Clay__ConfigureOpenElement((Clay_ElementDeclaration) { + .id = CLAY_ID("Container"), + .backgroundColor = { 255, 200, 200, 255 } + }); + ...children declared here + Clay__CloseElement(); + + The for loop will only ever run a single iteration, putting Clay__CloseElement() in the increment of the loop + means that it will run after the body - where the children are declared. It just exists to make sure you don't forget + to call Clay_CloseElement(). +*/ +#define CLAY_AUTO_ID(...) \ + for ( \ + CLAY__ELEMENT_DEFINITION_LATCH = (Clay__OpenElement(), Clay__ConfigureOpenElement(CLAY__CONFIG_WRAPPER(Clay_ElementDeclaration, __VA_ARGS__)), 0); \ + CLAY__ELEMENT_DEFINITION_LATCH < 1; \ + CLAY__ELEMENT_DEFINITION_LATCH=1, Clay__CloseElement() \ + ) + +#define CLAY(id, ...) \ + for ( \ + CLAY__ELEMENT_DEFINITION_LATCH = (Clay__OpenElementWithId(id), Clay__ConfigureOpenElement(CLAY__CONFIG_WRAPPER(Clay_ElementDeclaration, __VA_ARGS__)), 0); \ + CLAY__ELEMENT_DEFINITION_LATCH < 1; \ + CLAY__ELEMENT_DEFINITION_LATCH=1, Clay__CloseElement() \ + ) + +// These macros exist to allow the CLAY() macro to be called both with an inline struct definition, such as +// CLAY({ .id = something... }); +// As well as by passing a predefined declaration struct +// Clay_ElementDeclaration declarationStruct = ... +// CLAY(declarationStruct); +#define CLAY__WRAPPER_TYPE(type) Clay__##type##Wrapper +#define CLAY__WRAPPER_STRUCT(type) typedef struct { type wrapped; } CLAY__WRAPPER_TYPE(type) +#define CLAY__CONFIG_WRAPPER(type, ...) (CLAY__INIT(CLAY__WRAPPER_TYPE(type)) { __VA_ARGS__ }).wrapped + +#define CLAY_TEXT(text, textConfig) Clay__OpenTextElement(text, textConfig) + +#ifdef __cplusplus + +#define CLAY__INIT(type) type + +#define CLAY_PACKED_ENUM enum : uint8_t + +#define CLAY__DEFAULT_STRUCT {} + +#else + +#define CLAY__INIT(type) (type) + +#if defined(_MSC_VER) && !defined(__clang__) +#define CLAY_PACKED_ENUM __pragma(pack(push, 1)) enum __pragma(pack(pop)) +#else +#define CLAY_PACKED_ENUM enum __attribute__((__packed__)) +#endif + +#if __STDC_VERSION__ >= 202311L +#define CLAY__DEFAULT_STRUCT {} +#else +#define CLAY__DEFAULT_STRUCT {0} +#endif + +#endif // __cplusplus + +#ifdef __cplusplus +extern "C" { +#endif + +// Utility Structs ------------------------- + +// Note: Clay_String is not guaranteed to be null terminated. It may be if created from a literal C string, +// but it is also used to represent slices. +typedef struct Clay_String { + // Set this boolean to true if the char* data underlying this string will live for the entire lifetime of the program. + // This will automatically be set for strings created with CLAY_STRING, as the macro requires a string literal. + bool isStaticallyAllocated; + int32_t length; + // The underlying character memory. Note: this will not be copied and will not extend the lifetime of the underlying memory. + const char *chars; +} Clay_String; + +// Clay_StringSlice is used to represent non owning string slices, and includes +// a baseChars field which points to the string this slice is derived from. +typedef struct Clay_StringSlice { + int32_t length; + const char *chars; + const char *baseChars; // The source string / char* that this slice was derived from +} Clay_StringSlice; + +typedef struct Clay_Context Clay_Context; + +// Clay_Arena is a memory arena structure that is used by clay to manage its internal allocations. +// Rather than creating it by hand, it's easier to use Clay_CreateArenaWithCapacityAndMemory() +typedef struct Clay_Arena { + uintptr_t nextAllocation; + size_t capacity; + char *memory; +} Clay_Arena; + +typedef struct Clay_Dimensions { + float width, height; +} Clay_Dimensions; + +typedef struct Clay_Vector2 { + float x, y; +} Clay_Vector2; + +// Internally clay conventionally represents colors as 0-255, but interpretation is up to the renderer. +typedef struct Clay_Color { + float r, g, b, a; +} Clay_Color; + +typedef struct Clay_BoundingBox { + float x, y, width, height; +} Clay_BoundingBox; + +// Primarily created via the CLAY_ID(), CLAY_IDI(), CLAY_ID_LOCAL() and CLAY_IDI_LOCAL() macros. +// Represents a hashed string ID used for identifying and finding specific clay UI elements, required +// by functions such as Clay_PointerOver() and Clay_GetElementData(). +typedef struct Clay_ElementId { + uint32_t id; // The resulting hash generated from the other fields. + uint32_t offset; // A numerical offset applied after computing the hash from stringId. + uint32_t baseId; // A base hash value to start from, for example the parent element ID is used when calculating CLAY_ID_LOCAL(). + Clay_String stringId; // The string id to hash. +} Clay_ElementId; + +// A sized array of Clay_ElementId. +typedef struct +{ + int32_t capacity; + int32_t length; + Clay_ElementId *internalArray; +} Clay_ElementIdArray; + +// Controls the "radius", or corner rounding of elements, including rectangles, borders and images. +// The rounding is determined by drawing a circle inset into the element corner by (radius, radius) pixels. +typedef struct Clay_CornerRadius { + float topLeft; + float topRight; + float bottomLeft; + float bottomRight; +} Clay_CornerRadius; + +// Element Configs --------------------------- + +// Controls the direction in which child elements will be automatically laid out. +typedef CLAY_PACKED_ENUM { + // (Default) Lays out child elements from left to right with increasing x. + CLAY_LEFT_TO_RIGHT, + // Lays out child elements from top to bottom with increasing y. + CLAY_TOP_TO_BOTTOM, +} Clay_LayoutDirection; + +// Controls the alignment along the x axis (horizontal) of child elements. +typedef CLAY_PACKED_ENUM { + // (Default) Aligns child elements to the left hand side of this element, offset by padding.width.left + CLAY_ALIGN_X_LEFT, + // Aligns child elements to the right hand side of this element, offset by padding.width.right + CLAY_ALIGN_X_RIGHT, + // Aligns child elements horizontally to the center of this element + CLAY_ALIGN_X_CENTER, +} Clay_LayoutAlignmentX; + +// Controls the alignment along the y axis (vertical) of child elements. +typedef CLAY_PACKED_ENUM { + // (Default) Aligns child elements to the top of this element, offset by padding.width.top + CLAY_ALIGN_Y_TOP, + // Aligns child elements to the bottom of this element, offset by padding.width.bottom + CLAY_ALIGN_Y_BOTTOM, + // Aligns child elements vertically to the center of this element + CLAY_ALIGN_Y_CENTER, +} Clay_LayoutAlignmentY; + +// Controls how the element takes up space inside its parent container. +typedef CLAY_PACKED_ENUM { + // (default) Wraps tightly to the size of the element's contents. + CLAY__SIZING_TYPE_FIT, + // Expands along this axis to fill available space in the parent element, sharing it with other GROW elements. + CLAY__SIZING_TYPE_GROW, + // Expects 0-1 range. Clamps the axis size to a percent of the parent container's axis size minus padding and child gaps. + CLAY__SIZING_TYPE_PERCENT, + // Clamps the axis size to an exact size in pixels. + CLAY__SIZING_TYPE_FIXED, +} Clay__SizingType; + +// Controls how child elements are aligned on each axis. +typedef struct Clay_ChildAlignment { + Clay_LayoutAlignmentX x; // Controls alignment of children along the x axis. + Clay_LayoutAlignmentY y; // Controls alignment of children along the y axis. +} Clay_ChildAlignment; + +// Controls the minimum and maximum size in pixels that this element is allowed to grow or shrink to, +// overriding sizing types such as FIT or GROW. +typedef struct Clay_SizingMinMax { + float min; // The smallest final size of the element on this axis will be this value in pixels. + float max; // The largest final size of the element on this axis will be this value in pixels. +} Clay_SizingMinMax; + +// Controls the sizing of this element along one axis inside its parent container. +typedef struct Clay_SizingAxis { + union { + Clay_SizingMinMax minMax; // Controls the minimum and maximum size in pixels that this element is allowed to grow or shrink to, overriding sizing types such as FIT or GROW. + float percent; // Expects 0-1 range. Clamps the axis size to a percent of the parent container's axis size minus padding and child gaps. + } size; + Clay__SizingType type; // Controls how the element takes up space inside its parent container. +} Clay_SizingAxis; + +// Controls the sizing of this element along one axis inside its parent container. +typedef struct Clay_Sizing { + Clay_SizingAxis width; // Controls the width sizing of the element, along the x axis. + Clay_SizingAxis height; // Controls the height sizing of the element, along the y axis. +} Clay_Sizing; + +// Controls "padding" in pixels, which is a gap between the bounding box of this element and where its children +// will be placed. +typedef struct Clay_Padding { + uint16_t left; + uint16_t right; + uint16_t top; + uint16_t bottom; +} Clay_Padding; + +CLAY__WRAPPER_STRUCT(Clay_Padding); + +// Controls various settings that affect the size and position of an element, as well as the sizes and positions +// of any child elements. +typedef struct Clay_LayoutConfig { + Clay_Sizing sizing; // Controls the sizing of this element inside it's parent container, including FIT, GROW, PERCENT and FIXED sizing. + Clay_Padding padding; // Controls "padding" in pixels, which is a gap between the bounding box of this element and where its children will be placed. + uint16_t childGap; // Controls the gap in pixels between child elements along the layout axis (horizontal gap for LEFT_TO_RIGHT, vertical gap for TOP_TO_BOTTOM). + Clay_ChildAlignment childAlignment; // Controls how child elements are aligned on each axis. + Clay_LayoutDirection layoutDirection; // Controls the direction in which child elements will be automatically laid out. +} Clay_LayoutConfig; + +CLAY__WRAPPER_STRUCT(Clay_LayoutConfig); + +extern Clay_LayoutConfig CLAY_LAYOUT_DEFAULT; + +// Controls how text "wraps", that is how it is broken into multiple lines when there is insufficient horizontal space. +typedef CLAY_PACKED_ENUM { + // (default) breaks on whitespace characters. + CLAY_TEXT_WRAP_WORDS, + // Don't break on space characters, only on newlines. + CLAY_TEXT_WRAP_NEWLINES, + // Disable text wrapping entirely. + CLAY_TEXT_WRAP_NONE, +} Clay_TextElementConfigWrapMode; + +// Controls how wrapped lines of text are horizontally aligned within the outer text bounding box. +typedef CLAY_PACKED_ENUM { + // (default) Horizontally aligns wrapped lines of text to the left hand side of their bounding box. + CLAY_TEXT_ALIGN_LEFT, + // Horizontally aligns wrapped lines of text to the center of their bounding box. + CLAY_TEXT_ALIGN_CENTER, + // Horizontally aligns wrapped lines of text to the right hand side of their bounding box. + CLAY_TEXT_ALIGN_RIGHT, +} Clay_TextAlignment; + +// Controls various functionality related to text elements. +typedef struct Clay_TextElementConfig { + // A pointer that will be transparently passed through to the resulting render command. + void *userData; + // The RGBA color of the font to render, conventionally specified as 0-255. + Clay_Color textColor; + // An integer transparently passed to Clay_MeasureText to identify the font to use. + // The debug view will pass fontId = 0 for its internal text. + uint16_t fontId; + // Controls the size of the font. Handled by the function provided to Clay_MeasureText. + uint16_t fontSize; + // Controls extra horizontal spacing between characters. Handled by the function provided to Clay_MeasureText. + uint16_t letterSpacing; + // Controls additional vertical space between wrapped lines of text. + uint16_t lineHeight; + // Controls how text "wraps", that is how it is broken into multiple lines when there is insufficient horizontal space. + // CLAY_TEXT_WRAP_WORDS (default) breaks on whitespace characters. + // CLAY_TEXT_WRAP_NEWLINES doesn't break on space characters, only on newlines. + // CLAY_TEXT_WRAP_NONE disables wrapping entirely. + Clay_TextElementConfigWrapMode wrapMode; + // Controls how wrapped lines of text are horizontally aligned within the outer text bounding box. + // CLAY_TEXT_ALIGN_LEFT (default) - Horizontally aligns wrapped lines of text to the left hand side of their bounding box. + // CLAY_TEXT_ALIGN_CENTER - Horizontally aligns wrapped lines of text to the center of their bounding box. + // CLAY_TEXT_ALIGN_RIGHT - Horizontally aligns wrapped lines of text to the right hand side of their bounding box. + Clay_TextAlignment textAlignment; +} Clay_TextElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_TextElementConfig); + +// Aspect Ratio -------------------------------- + +// Controls various settings related to aspect ratio scaling element. +typedef struct Clay_AspectRatioElementConfig { + float aspectRatio; // A float representing the target "Aspect ratio" for an element, which is its final width divided by its final height. +} Clay_AspectRatioElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_AspectRatioElementConfig); + +// Image -------------------------------- + +// Controls various settings related to image elements. +typedef struct Clay_ImageElementConfig { + void* imageData; // A transparent pointer used to pass image data through to the renderer. +} Clay_ImageElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_ImageElementConfig); + +// Floating ----------------------------- + +// Controls where a floating element is offset relative to its parent element. +// Note: see https://github.com/user-attachments/assets/b8c6dfaa-c1b1-41a4-be55-013473e4a6ce for a visual explanation. +typedef CLAY_PACKED_ENUM { + CLAY_ATTACH_POINT_LEFT_TOP, + CLAY_ATTACH_POINT_LEFT_CENTER, + CLAY_ATTACH_POINT_LEFT_BOTTOM, + CLAY_ATTACH_POINT_CENTER_TOP, + CLAY_ATTACH_POINT_CENTER_CENTER, + CLAY_ATTACH_POINT_CENTER_BOTTOM, + CLAY_ATTACH_POINT_RIGHT_TOP, + CLAY_ATTACH_POINT_RIGHT_CENTER, + CLAY_ATTACH_POINT_RIGHT_BOTTOM, +} Clay_FloatingAttachPointType; + +// Controls where a floating element is offset relative to its parent element. +typedef struct Clay_FloatingAttachPoints { + Clay_FloatingAttachPointType element; // Controls the origin point on a floating element that attaches to its parent. + Clay_FloatingAttachPointType parent; // Controls the origin point on the parent element that the floating element attaches to. +} Clay_FloatingAttachPoints; + +// Controls how mouse pointer events like hover and click are captured or passed through to elements underneath a floating element. +typedef CLAY_PACKED_ENUM { + // (default) "Capture" the pointer event and don't allow events like hover and click to pass through to elements underneath. + CLAY_POINTER_CAPTURE_MODE_CAPTURE, + // CLAY_POINTER_CAPTURE_MODE_PARENT, TODO pass pointer through to attached parent + + // Transparently pass through pointer events like hover and click to elements underneath the floating element. + CLAY_POINTER_CAPTURE_MODE_PASSTHROUGH, +} Clay_PointerCaptureMode; + +// Controls which element a floating element is "attached" to (i.e. relative offset from). +typedef CLAY_PACKED_ENUM { + // (default) Disables floating for this element. + CLAY_ATTACH_TO_NONE, + // Attaches this floating element to its parent, positioned based on the .attachPoints and .offset fields. + CLAY_ATTACH_TO_PARENT, + // Attaches this floating element to an element with a specific ID, specified with the .parentId field. positioned based on the .attachPoints and .offset fields. + CLAY_ATTACH_TO_ELEMENT_WITH_ID, + // Attaches this floating element to the root of the layout, which combined with the .offset field provides functionality similar to "absolute positioning". + CLAY_ATTACH_TO_ROOT, +} Clay_FloatingAttachToElement; + +// Controls whether or not a floating element is clipped to the same clipping rectangle as the element it's attached to. +typedef CLAY_PACKED_ENUM { + // (default) - The floating element does not inherit clipping. + CLAY_CLIP_TO_NONE, + // The floating element is clipped to the same clipping rectangle as the element it's attached to. + CLAY_CLIP_TO_ATTACHED_PARENT +} Clay_FloatingClipToElement; + +// Controls various settings related to "floating" elements, which are elements that "float" above other elements, potentially overlapping their boundaries, +// and not affecting the layout of sibling or parent elements. +typedef struct Clay_FloatingElementConfig { + // Offsets this floating element by the provided x,y coordinates from its attachPoints. + Clay_Vector2 offset; + // Expands the boundaries of the outer floating element without affecting its children. + Clay_Dimensions expand; + // When used in conjunction with .attachTo = CLAY_ATTACH_TO_ELEMENT_WITH_ID, attaches this floating element to the element in the hierarchy with the provided ID. + // Hint: attach the ID to the other element with .id = CLAY_ID("yourId"), and specify the id the same way, with .parentId = CLAY_ID("yourId").id + uint32_t parentId; + // Controls the z index of this floating element and all its children. Floating elements are sorted in ascending z order before output. + // zIndex is also passed to the renderer for all elements contained within this floating element. + int16_t zIndex; + // Controls how mouse pointer events like hover and click are captured or passed through to elements underneath / behind a floating element. + // Enum is of the form CLAY_ATTACH_POINT_foo_bar. See Clay_FloatingAttachPoints for more details. + // Note: see for a visual explanation. + Clay_FloatingAttachPoints attachPoints; + // Controls how mouse pointer events like hover and click are captured or passed through to elements underneath a floating element. + // CLAY_POINTER_CAPTURE_MODE_CAPTURE (default) - "Capture" the pointer event and don't allow events like hover and click to pass through to elements underneath. + // CLAY_POINTER_CAPTURE_MODE_PASSTHROUGH - Transparently pass through pointer events like hover and click to elements underneath the floating element. + Clay_PointerCaptureMode pointerCaptureMode; + // Controls which element a floating element is "attached" to (i.e. relative offset from). + // CLAY_ATTACH_TO_NONE (default) - Disables floating for this element. + // CLAY_ATTACH_TO_PARENT - Attaches this floating element to its parent, positioned based on the .attachPoints and .offset fields. + // CLAY_ATTACH_TO_ELEMENT_WITH_ID - Attaches this floating element to an element with a specific ID, specified with the .parentId field. positioned based on the .attachPoints and .offset fields. + // CLAY_ATTACH_TO_ROOT - Attaches this floating element to the root of the layout, which combined with the .offset field provides functionality similar to "absolute positioning". + Clay_FloatingAttachToElement attachTo; + // Controls whether or not a floating element is clipped to the same clipping rectangle as the element it's attached to. + // CLAY_CLIP_TO_NONE (default) - The floating element does not inherit clipping. + // CLAY_CLIP_TO_ATTACHED_PARENT - The floating element is clipped to the same clipping rectangle as the element it's attached to. + Clay_FloatingClipToElement clipTo; +} Clay_FloatingElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_FloatingElementConfig); + +// Custom ----------------------------- + +// Controls various settings related to custom elements. +typedef struct Clay_CustomElementConfig { + // A transparent pointer through which you can pass custom data to the renderer. + // Generates CUSTOM render commands. + void* customData; +} Clay_CustomElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_CustomElementConfig); + +// Scroll ----------------------------- + +// Controls the axis on which an element switches to "scrolling", which clips the contents and allows scrolling in that direction. +typedef struct Clay_ClipElementConfig { + bool horizontal; // Clip overflowing elements on the X axis. + bool vertical; // Clip overflowing elements on the Y axis. + Clay_Vector2 childOffset; // Offsets the x,y positions of all child elements. Used primarily for scrolling containers. +} Clay_ClipElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_ClipElementConfig); + +// Border ----------------------------- + +// Controls the widths of individual element borders. +typedef struct Clay_BorderWidth { + uint16_t left; + uint16_t right; + uint16_t top; + uint16_t bottom; + // Creates borders between each child element, depending on the .layoutDirection. + // e.g. for LEFT_TO_RIGHT, borders will be vertical lines, and for TOP_TO_BOTTOM borders will be horizontal lines. + // .betweenChildren borders will result in individual RECTANGLE render commands being generated. + uint16_t betweenChildren; +} Clay_BorderWidth; + +// Controls settings related to element borders. +typedef struct Clay_BorderElementConfig { + Clay_Color color; // Controls the color of all borders with width > 0. Conventionally represented as 0-255, but interpretation is up to the renderer. + Clay_BorderWidth width; // Controls the widths of individual borders. At least one of these should be > 0 for a BORDER render command to be generated. +} Clay_BorderElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_BorderElementConfig); + +// Render Command Data ----------------------------- + +// Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_TEXT +typedef struct Clay_TextRenderData { + // A string slice containing the text to be rendered. + // Note: this is not guaranteed to be null terminated. + Clay_StringSlice stringContents; + // Conventionally represented as 0-255 for each channel, but interpretation is up to the renderer. + Clay_Color textColor; + // An integer representing the font to use to render this text, transparently passed through from the text declaration. + uint16_t fontId; + uint16_t fontSize; + // Specifies the extra whitespace gap in pixels between each character. + uint16_t letterSpacing; + // The height of the bounding box for this line of text. + uint16_t lineHeight; +} Clay_TextRenderData; + +// Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_RECTANGLE +typedef struct Clay_RectangleRenderData { + // The solid background color to fill this rectangle with. Conventionally represented as 0-255 for each channel, but interpretation is up to the renderer. + Clay_Color backgroundColor; + // Controls the "radius", or corner rounding of elements, including rectangles, borders and images. + // The rounding is determined by drawing a circle inset into the element corner by (radius, radius) pixels. + Clay_CornerRadius cornerRadius; +} Clay_RectangleRenderData; + +// Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_IMAGE +typedef struct Clay_ImageRenderData { + // The tint color for this image. Note that the default value is 0,0,0,0 and should likely be interpreted + // as "untinted". + // Conventionally represented as 0-255 for each channel, but interpretation is up to the renderer. + Clay_Color backgroundColor; + // Controls the "radius", or corner rounding of this image. + // The rounding is determined by drawing a circle inset into the element corner by (radius, radius) pixels. + Clay_CornerRadius cornerRadius; + // A pointer transparently passed through from the original element definition, typically used to represent image data. + void* imageData; +} Clay_ImageRenderData; + +// Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_CUSTOM +typedef struct Clay_CustomRenderData { + // Passed through from .backgroundColor in the original element declaration. + // Conventionally represented as 0-255 for each channel, but interpretation is up to the renderer. + Clay_Color backgroundColor; + // Controls the "radius", or corner rounding of this custom element. + // The rounding is determined by drawing a circle inset into the element corner by (radius, radius) pixels. + Clay_CornerRadius cornerRadius; + // A pointer transparently passed through from the original element definition. + void* customData; +} Clay_CustomRenderData; + +// Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_SCISSOR_START || commandType == CLAY_RENDER_COMMAND_TYPE_SCISSOR_END +typedef struct Clay_ScrollRenderData { + bool horizontal; + bool vertical; +} Clay_ClipRenderData; + +// Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_BORDER +typedef struct Clay_BorderRenderData { + // Controls a shared color for all this element's borders. + // Conventionally represented as 0-255 for each channel, but interpretation is up to the renderer. + Clay_Color color; + // Specifies the "radius", or corner rounding of this border element. + // The rounding is determined by drawing a circle inset into the element corner by (radius, radius) pixels. + Clay_CornerRadius cornerRadius; + // Controls individual border side widths. + Clay_BorderWidth width; +} Clay_BorderRenderData; + +// A struct union containing data specific to this command's .commandType +typedef union Clay_RenderData { + // Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_RECTANGLE + Clay_RectangleRenderData rectangle; + // Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_TEXT + Clay_TextRenderData text; + // Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_IMAGE + Clay_ImageRenderData image; + // Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_CUSTOM + Clay_CustomRenderData custom; + // Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_BORDER + Clay_BorderRenderData border; + // Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_SCISSOR_START|END + Clay_ClipRenderData clip; +} Clay_RenderData; + +// Miscellaneous Structs & Enums --------------------------------- + +// Data representing the current internal state of a scrolling element. +typedef struct Clay_ScrollContainerData { + // Note: This is a pointer to the real internal scroll position, mutating it may cause a change in final layout. + // Intended for use with external functionality that modifies scroll position, such as scroll bars or auto scrolling. + Clay_Vector2 *scrollPosition; + // The bounding box of the scroll element. + Clay_Dimensions scrollContainerDimensions; + // The outer dimensions of the inner scroll container content, including the padding of the parent scroll container. + Clay_Dimensions contentDimensions; + // The config that was originally passed to the clip element. + Clay_ClipElementConfig config; + // Indicates whether an actual scroll container matched the provided ID or if the default struct was returned. + bool found; +} Clay_ScrollContainerData; + +// Bounding box and other data for a specific UI element. +typedef struct Clay_ElementData { + // The rectangle that encloses this UI element, with the position relative to the root of the layout. + Clay_BoundingBox boundingBox; + // Indicates whether an actual Element matched the provided ID or if the default struct was returned. + bool found; +} Clay_ElementData; + +// Used by renderers to determine specific handling for each render command. +typedef CLAY_PACKED_ENUM { + // This command type should be skipped. + CLAY_RENDER_COMMAND_TYPE_NONE, + // The renderer should draw a solid color rectangle. + CLAY_RENDER_COMMAND_TYPE_RECTANGLE, + // The renderer should draw a colored border inset into the bounding box. + CLAY_RENDER_COMMAND_TYPE_BORDER, + // The renderer should draw text. + CLAY_RENDER_COMMAND_TYPE_TEXT, + // The renderer should draw an image. + CLAY_RENDER_COMMAND_TYPE_IMAGE, + // The renderer should begin clipping all future draw commands, only rendering content that falls within the provided boundingBox. + CLAY_RENDER_COMMAND_TYPE_SCISSOR_START, + // The renderer should finish any previously active clipping, and begin rendering elements in full again. + CLAY_RENDER_COMMAND_TYPE_SCISSOR_END, + // The renderer should provide a custom implementation for handling this render command based on its .customData + CLAY_RENDER_COMMAND_TYPE_CUSTOM, +} Clay_RenderCommandType; + +typedef struct Clay_RenderCommand { + // A rectangular box that fully encloses this UI element, with the position relative to the root of the layout. + Clay_BoundingBox boundingBox; + // A struct union containing data specific to this command's commandType. + Clay_RenderData renderData; + // A pointer transparently passed through from the original element declaration. + void *userData; + // The id of this element, transparently passed through from the original element declaration. + uint32_t id; + // The z order required for drawing this command correctly. + // Note: the render command array is already sorted in ascending order, and will produce correct results if drawn in naive order. + // This field is intended for use in batching renderers for improved performance. + int16_t zIndex; + // Specifies how to handle rendering of this command. + // CLAY_RENDER_COMMAND_TYPE_RECTANGLE - The renderer should draw a solid color rectangle. + // CLAY_RENDER_COMMAND_TYPE_BORDER - The renderer should draw a colored border inset into the bounding box. + // CLAY_RENDER_COMMAND_TYPE_TEXT - The renderer should draw text. + // CLAY_RENDER_COMMAND_TYPE_IMAGE - The renderer should draw an image. + // CLAY_RENDER_COMMAND_TYPE_SCISSOR_START - The renderer should begin clipping all future draw commands, only rendering content that falls within the provided boundingBox. + // CLAY_RENDER_COMMAND_TYPE_SCISSOR_END - The renderer should finish any previously active clipping, and begin rendering elements in full again. + // CLAY_RENDER_COMMAND_TYPE_CUSTOM - The renderer should provide a custom implementation for handling this render command based on its .customData + Clay_RenderCommandType commandType; +} Clay_RenderCommand; + +// A sized array of render commands. +typedef struct Clay_RenderCommandArray { + // The underlying max capacity of the array, not necessarily all initialized. + int32_t capacity; + // The number of initialized elements in this array. Used for loops and iteration. + int32_t length; + // A pointer to the first element in the internal array. + Clay_RenderCommand* internalArray; +} Clay_RenderCommandArray; + +// Represents the current state of interaction with clay this frame. +typedef CLAY_PACKED_ENUM { + // A left mouse click, or touch occurred this frame. + CLAY_POINTER_DATA_PRESSED_THIS_FRAME, + // The left mouse button click or touch happened at some point in the past, and is still currently held down this frame. + CLAY_POINTER_DATA_PRESSED, + // The left mouse button click or touch was released this frame. + CLAY_POINTER_DATA_RELEASED_THIS_FRAME, + // The left mouse button click or touch is not currently down / was released at some point in the past. + CLAY_POINTER_DATA_RELEASED, +} Clay_PointerDataInteractionState; + +// Information on the current state of pointer interactions this frame. +typedef struct Clay_PointerData { + // The position of the mouse / touch / pointer relative to the root of the layout. + Clay_Vector2 position; + // Represents the current state of interaction with clay this frame. + // CLAY_POINTER_DATA_PRESSED_THIS_FRAME - A left mouse click, or touch occurred this frame. + // CLAY_POINTER_DATA_PRESSED - The left mouse button click or touch happened at some point in the past, and is still currently held down this frame. + // CLAY_POINTER_DATA_RELEASED_THIS_FRAME - The left mouse button click or touch was released this frame. + // CLAY_POINTER_DATA_RELEASED - The left mouse button click or touch is not currently down / was released at some point in the past. + Clay_PointerDataInteractionState state; +} Clay_PointerData; + +typedef struct Clay_ElementDeclaration { + // Controls various settings that affect the size and position of an element, as well as the sizes and positions of any child elements. + Clay_LayoutConfig layout; + // Controls the background color of the resulting element. + // By convention specified as 0-255, but interpretation is up to the renderer. + // If no other config is specified, .backgroundColor will generate a RECTANGLE render command, otherwise it will be passed as a property to IMAGE or CUSTOM render commands. + Clay_Color backgroundColor; + // Controls the "radius", or corner rounding of elements, including rectangles, borders and images. + Clay_CornerRadius cornerRadius; + // Controls settings related to aspect ratio scaling. + Clay_AspectRatioElementConfig aspectRatio; + // Controls settings related to image elements. + Clay_ImageElementConfig image; + // Controls whether and how an element "floats", which means it layers over the top of other elements in z order, and doesn't affect the position and size of siblings or parent elements. + // Note: in order to activate floating, .floating.attachTo must be set to something other than the default value. + Clay_FloatingElementConfig floating; + // Used to create CUSTOM render commands, usually to render element types not supported by Clay. + Clay_CustomElementConfig custom; + // Controls whether an element should clip its contents, as well as providing child x,y offset configuration for scrolling. + Clay_ClipElementConfig clip; + // Controls settings related to element borders, and will generate BORDER render commands. + Clay_BorderElementConfig border; + // A pointer that will be transparently passed through to resulting render commands. + void *userData; +} Clay_ElementDeclaration; + +CLAY__WRAPPER_STRUCT(Clay_ElementDeclaration); + +// Represents the type of error clay encountered while computing layout. +typedef CLAY_PACKED_ENUM { + // A text measurement function wasn't provided using Clay_SetMeasureTextFunction(), or the provided function was null. + CLAY_ERROR_TYPE_TEXT_MEASUREMENT_FUNCTION_NOT_PROVIDED, + // Clay attempted to allocate its internal data structures but ran out of space. + // The arena passed to Clay_Initialize was created with a capacity smaller than that required by Clay_MinMemorySize(). + CLAY_ERROR_TYPE_ARENA_CAPACITY_EXCEEDED, + // Clay ran out of capacity in its internal array for storing elements. This limit can be increased with Clay_SetMaxElementCount(). + CLAY_ERROR_TYPE_ELEMENTS_CAPACITY_EXCEEDED, + // Clay ran out of capacity in its internal array for storing elements. This limit can be increased with Clay_SetMaxMeasureTextCacheWordCount(). + CLAY_ERROR_TYPE_TEXT_MEASUREMENT_CAPACITY_EXCEEDED, + // Two elements were declared with exactly the same ID within one layout. + CLAY_ERROR_TYPE_DUPLICATE_ID, + // A floating element was declared using CLAY_ATTACH_TO_ELEMENT_ID and either an invalid .parentId was provided or no element with the provided .parentId was found. + CLAY_ERROR_TYPE_FLOATING_CONTAINER_PARENT_NOT_FOUND, + // An element was declared that using CLAY_SIZING_PERCENT but the percentage value was over 1. Percentage values are expected to be in the 0-1 range. + CLAY_ERROR_TYPE_PERCENTAGE_OVER_1, + // Clay encountered an internal error. It would be wonderful if you could report this so we can fix it! + CLAY_ERROR_TYPE_INTERNAL_ERROR, + // Clay__OpenElement was called more times than Clay__CloseElement, so there were still remaining open elements when the layout ended. + CLAY_ERROR_TYPE_UNBALANCED_OPEN_CLOSE, +} Clay_ErrorType; + +// Data to identify the error that clay has encountered. +typedef struct Clay_ErrorData { + // Represents the type of error clay encountered while computing layout. + // CLAY_ERROR_TYPE_TEXT_MEASUREMENT_FUNCTION_NOT_PROVIDED - A text measurement function wasn't provided using Clay_SetMeasureTextFunction(), or the provided function was null. + // CLAY_ERROR_TYPE_ARENA_CAPACITY_EXCEEDED - Clay attempted to allocate its internal data structures but ran out of space. The arena passed to Clay_Initialize was created with a capacity smaller than that required by Clay_MinMemorySize(). + // CLAY_ERROR_TYPE_ELEMENTS_CAPACITY_EXCEEDED - Clay ran out of capacity in its internal array for storing elements. This limit can be increased with Clay_SetMaxElementCount(). + // CLAY_ERROR_TYPE_TEXT_MEASUREMENT_CAPACITY_EXCEEDED - Clay ran out of capacity in its internal array for storing elements. This limit can be increased with Clay_SetMaxMeasureTextCacheWordCount(). + // CLAY_ERROR_TYPE_DUPLICATE_ID - Two elements were declared with exactly the same ID within one layout. + // CLAY_ERROR_TYPE_FLOATING_CONTAINER_PARENT_NOT_FOUND - A floating element was declared using CLAY_ATTACH_TO_ELEMENT_ID and either an invalid .parentId was provided or no element with the provided .parentId was found. + // CLAY_ERROR_TYPE_PERCENTAGE_OVER_1 - An element was declared that using CLAY_SIZING_PERCENT but the percentage value was over 1. Percentage values are expected to be in the 0-1 range. + // CLAY_ERROR_TYPE_INTERNAL_ERROR - Clay encountered an internal error. It would be wonderful if you could report this so we can fix it! + Clay_ErrorType errorType; + // A string containing human-readable error text that explains the error in more detail. + Clay_String errorText; + // A transparent pointer passed through from when the error handler was first provided. + void *userData; +} Clay_ErrorData; + +// A wrapper struct around Clay's error handler function. +typedef struct { + // A user provided function to call when Clay encounters an error during layout. + void (*errorHandlerFunction)(Clay_ErrorData errorText); + // A pointer that will be transparently passed through to the error handler when it is called. + void *userData; +} Clay_ErrorHandler; + +// Function Forward Declarations --------------------------------- + +// Public API functions ------------------------------------------ + +// Returns the size, in bytes, of the minimum amount of memory Clay requires to operate at its current settings. +CLAY_DLL_EXPORT uint32_t Clay_MinMemorySize(void); +// Creates an arena for clay to use for its internal allocations, given a certain capacity in bytes and a pointer to an allocation of at least that size. +// Intended to be used with Clay_MinMemorySize in the following way: +// uint32_t minMemoryRequired = Clay_MinMemorySize(); +// Clay_Arena clayMemory = Clay_CreateArenaWithCapacityAndMemory(minMemoryRequired, malloc(minMemoryRequired)); +CLAY_DLL_EXPORT Clay_Arena Clay_CreateArenaWithCapacityAndMemory(size_t capacity, void *memory); +// Sets the state of the "pointer" (i.e. the mouse or touch) in Clay's internal data. Used for detecting and responding to mouse events in the debug view, +// as well as for Clay_Hovered() and scroll element handling. +CLAY_DLL_EXPORT void Clay_SetPointerState(Clay_Vector2 position, bool pointerDown); +// Initialize Clay's internal arena and setup required data before layout can begin. Only needs to be called once. +// - arena can be created using Clay_CreateArenaWithCapacityAndMemory() +// - layoutDimensions are the initial bounding dimensions of the layout (i.e. the screen width and height for a full screen layout) +// - errorHandler is used by Clay to inform you if something has gone wrong in configuration or layout. +CLAY_DLL_EXPORT Clay_Context* Clay_Initialize(Clay_Arena arena, Clay_Dimensions layoutDimensions, Clay_ErrorHandler errorHandler); +// Returns the Context that clay is currently using. Used when using multiple instances of clay simultaneously. +CLAY_DLL_EXPORT Clay_Context* Clay_GetCurrentContext(void); +// Sets the context that clay will use to compute the layout. +// Used to restore a context saved from Clay_GetCurrentContext when using multiple instances of clay simultaneously. +CLAY_DLL_EXPORT void Clay_SetCurrentContext(Clay_Context* context); +// Updates the state of Clay's internal scroll data, updating scroll content positions if scrollDelta is non zero, and progressing momentum scrolling. +// - enableDragScrolling when set to true will enable mobile device like "touch drag" scroll of scroll containers, including momentum scrolling after the touch has ended. +// - scrollDelta is the amount to scroll this frame on each axis in pixels. +// - deltaTime is the time in seconds since the last "frame" (scroll update) +CLAY_DLL_EXPORT void Clay_UpdateScrollContainers(bool enableDragScrolling, Clay_Vector2 scrollDelta, float deltaTime); +// Returns the internally stored scroll offset for the currently open element. +// Generally intended for use with clip elements to create scrolling containers. +CLAY_DLL_EXPORT Clay_Vector2 Clay_GetScrollOffset(void); +// Updates the layout dimensions in response to the window or outer container being resized. +CLAY_DLL_EXPORT void Clay_SetLayoutDimensions(Clay_Dimensions dimensions); +// Called before starting any layout declarations. +CLAY_DLL_EXPORT void Clay_BeginLayout(void); +// Called when all layout declarations are finished. +// Computes the layout and generates and returns the array of render commands to draw. +CLAY_DLL_EXPORT Clay_RenderCommandArray Clay_EndLayout(void); +// Calculates a hash ID from the given idString. +// Generally only used for dynamic strings when CLAY_ID("stringLiteral") can't be used. +CLAY_DLL_EXPORT Clay_ElementId Clay_GetElementId(Clay_String idString); +// Calculates a hash ID from the given idString and index. +// - index is used to avoid constructing dynamic ID strings in loops. +// Generally only used for dynamic strings when CLAY_IDI("stringLiteral", index) can't be used. +CLAY_DLL_EXPORT Clay_ElementId Clay_GetElementIdWithIndex(Clay_String idString, uint32_t index); +// Returns layout data such as the final calculated bounding box for an element with a given ID. +// The returned Clay_ElementData contains a `found` bool that will be true if an element with the provided ID was found. +// This ID can be calculated either with CLAY_ID() for string literal IDs, or Clay_GetElementId for dynamic strings. +CLAY_DLL_EXPORT Clay_ElementData Clay_GetElementData(Clay_ElementId id); +// Returns true if the pointer position provided by Clay_SetPointerState is within the current element's bounding box. +// Works during element declaration, e.g. CLAY({ .backgroundColor = Clay_Hovered() ? BLUE : RED }); +CLAY_DLL_EXPORT bool Clay_Hovered(void); +// Bind a callback that will be called when the pointer position provided by Clay_SetPointerState is within the current element's bounding box. +// - onHoverFunction is a function pointer to a user defined function. +// - userData is a pointer that will be transparently passed through when the onHoverFunction is called. +CLAY_DLL_EXPORT void Clay_OnHover(void (*onHoverFunction)(Clay_ElementId elementId, Clay_PointerData pointerData, intptr_t userData), intptr_t userData); +// An imperative function that returns true if the pointer position provided by Clay_SetPointerState is within the element with the provided ID's bounding box. +// This ID can be calculated either with CLAY_ID() for string literal IDs, or Clay_GetElementId for dynamic strings. +CLAY_DLL_EXPORT bool Clay_PointerOver(Clay_ElementId elementId); +// Returns the array of element IDs that the pointer is currently over. +CLAY_DLL_EXPORT Clay_ElementIdArray Clay_GetPointerOverIds(void); +// Returns data representing the state of the scrolling element with the provided ID. +// The returned Clay_ScrollContainerData contains a `found` bool that will be true if a scroll element was found with the provided ID. +// An imperative function that returns true if the pointer position provided by Clay_SetPointerState is within the element with the provided ID's bounding box. +// This ID can be calculated either with CLAY_ID() for string literal IDs, or Clay_GetElementId for dynamic strings. +CLAY_DLL_EXPORT Clay_ScrollContainerData Clay_GetScrollContainerData(Clay_ElementId id); +// Binds a callback function that Clay will call to determine the dimensions of a given string slice. +// - measureTextFunction is a user provided function that adheres to the interface Clay_Dimensions (Clay_StringSlice text, Clay_TextElementConfig *config, void *userData); +// - userData is a pointer that will be transparently passed through when the measureTextFunction is called. +CLAY_DLL_EXPORT void Clay_SetMeasureTextFunction(Clay_Dimensions (*measureTextFunction)(Clay_StringSlice text, Clay_TextElementConfig *config, void *userData), void *userData); +// Experimental - Used in cases where Clay needs to integrate with a system that manages its own scrolling containers externally. +// Please reach out if you plan to use this function, as it may be subject to change. +CLAY_DLL_EXPORT void Clay_SetQueryScrollOffsetFunction(Clay_Vector2 (*queryScrollOffsetFunction)(uint32_t elementId, void *userData), void *userData); +// A bounds-checked "get" function for the Clay_RenderCommandArray returned from Clay_EndLayout(). +CLAY_DLL_EXPORT Clay_RenderCommand * Clay_RenderCommandArray_Get(Clay_RenderCommandArray* array, int32_t index); +// Enables and disables Clay's internal debug tools. +// This state is retained and does not need to be set each frame. +CLAY_DLL_EXPORT void Clay_SetDebugModeEnabled(bool enabled); +// Returns true if Clay's internal debug tools are currently enabled. +CLAY_DLL_EXPORT bool Clay_IsDebugModeEnabled(void); +// Enables and disables visibility culling. By default, Clay will not generate render commands for elements whose bounding box is entirely outside the screen. +CLAY_DLL_EXPORT void Clay_SetCullingEnabled(bool enabled); +// Returns the maximum number of UI elements supported by Clay's current configuration. +CLAY_DLL_EXPORT int32_t Clay_GetMaxElementCount(void); +// Modifies the maximum number of UI elements supported by Clay's current configuration. +// This may require reallocating additional memory, and re-calling Clay_Initialize(); +CLAY_DLL_EXPORT void Clay_SetMaxElementCount(int32_t maxElementCount); +// Returns the maximum number of measured "words" (whitespace seperated runs of characters) that Clay can store in its internal text measurement cache. +CLAY_DLL_EXPORT int32_t Clay_GetMaxMeasureTextCacheWordCount(void); +// Modifies the maximum number of measured "words" (whitespace seperated runs of characters) that Clay can store in its internal text measurement cache. +// This may require reallocating additional memory, and re-calling Clay_Initialize(); +CLAY_DLL_EXPORT void Clay_SetMaxMeasureTextCacheWordCount(int32_t maxMeasureTextCacheWordCount); +// Resets Clay's internal text measurement cache. Useful if font mappings have changed or fonts have been reloaded. +CLAY_DLL_EXPORT void Clay_ResetMeasureTextCache(void); + +// Internal API functions required by macros ---------------------- + +CLAY_DLL_EXPORT void Clay__OpenElement(void); +CLAY_DLL_EXPORT void Clay__OpenElementWithId(Clay_ElementId elementId); +CLAY_DLL_EXPORT void Clay__ConfigureOpenElement(const Clay_ElementDeclaration config); +CLAY_DLL_EXPORT void Clay__ConfigureOpenElementPtr(const Clay_ElementDeclaration *config); +CLAY_DLL_EXPORT void Clay__CloseElement(void); +CLAY_DLL_EXPORT Clay_ElementId Clay__HashString(Clay_String key, uint32_t seed); +CLAY_DLL_EXPORT Clay_ElementId Clay__HashStringWithOffset(Clay_String key, uint32_t offset, uint32_t seed); +CLAY_DLL_EXPORT void Clay__OpenTextElement(Clay_String text, Clay_TextElementConfig *textConfig); +CLAY_DLL_EXPORT Clay_TextElementConfig *Clay__StoreTextElementConfig(Clay_TextElementConfig config); +CLAY_DLL_EXPORT uint32_t Clay__GetParentElementId(void); + +extern Clay_Color Clay__debugViewHighlightColor; +extern uint32_t Clay__debugViewWidth; + +#ifdef __cplusplus +} +#endif + +#endif // CLAY_HEADER + +// ----------------------------------------- +// IMPLEMENTATION -------------------------- +// ----------------------------------------- +#ifdef CLAY_IMPLEMENTATION +#undef CLAY_IMPLEMENTATION + +#ifndef CLAY__NULL +#define CLAY__NULL 0 +#endif + +#ifndef CLAY__MAXFLOAT +#define CLAY__MAXFLOAT 3.40282346638528859812e+38F +#endif + +Clay_LayoutConfig CLAY_LAYOUT_DEFAULT = CLAY__DEFAULT_STRUCT; + +Clay_Color Clay__Color_DEFAULT = CLAY__DEFAULT_STRUCT; +Clay_CornerRadius Clay__CornerRadius_DEFAULT = CLAY__DEFAULT_STRUCT; +Clay_BorderWidth Clay__BorderWidth_DEFAULT = CLAY__DEFAULT_STRUCT; + +// The below functions define array bounds checking and convenience functions for a provided type. +#define CLAY__ARRAY_DEFINE_FUNCTIONS(typeName, arrayName) \ + \ +typedef struct \ +{ \ + int32_t length; \ + typeName *internalArray; \ +} arrayName##Slice; \ + \ +typeName typeName##_DEFAULT = CLAY__DEFAULT_STRUCT; \ + \ +arrayName arrayName##_Allocate_Arena(int32_t capacity, Clay_Arena *arena) { \ + return CLAY__INIT(arrayName){.capacity = capacity, .length = 0, \ + .internalArray = (typeName *)Clay__Array_Allocate_Arena(capacity, sizeof(typeName), arena)}; \ +} \ + \ +typeName *arrayName##_Get(arrayName *array, int32_t index) { \ + return Clay__Array_RangeCheck(index, array->length) ? &array->internalArray[index] : &typeName##_DEFAULT; \ +} \ + \ +typeName arrayName##_GetValue(arrayName *array, int32_t index) { \ + return Clay__Array_RangeCheck(index, array->length) ? array->internalArray[index] : typeName##_DEFAULT; \ +} \ + \ +typeName *arrayName##_Add(arrayName *array, typeName item) { \ + if (Clay__Array_AddCapacityCheck(array->length, array->capacity)) { \ + array->internalArray[array->length++] = item; \ + return &array->internalArray[array->length - 1]; \ + } \ + return &typeName##_DEFAULT; \ +} \ + \ +typeName *arrayName##Slice_Get(arrayName##Slice *slice, int32_t index) { \ + return Clay__Array_RangeCheck(index, slice->length) ? &slice->internalArray[index] : &typeName##_DEFAULT; \ +} \ + \ +typeName arrayName##_RemoveSwapback(arrayName *array, int32_t index) { \ + if (Clay__Array_RangeCheck(index, array->length)) { \ + array->length--; \ + typeName removed = array->internalArray[index]; \ + array->internalArray[index] = array->internalArray[array->length]; \ + return removed; \ + } \ + return typeName##_DEFAULT; \ +} \ + \ +void arrayName##_Set(arrayName *array, int32_t index, typeName value) { \ + if (Clay__Array_RangeCheck(index, array->capacity)) { \ + array->internalArray[index] = value; \ + array->length = index < array->length ? array->length : index + 1; \ + } \ +} \ + +#define CLAY__ARRAY_DEFINE(typeName, arrayName) \ +typedef struct \ +{ \ + int32_t capacity; \ + int32_t length; \ + typeName *internalArray; \ +} arrayName; \ + \ +CLAY__ARRAY_DEFINE_FUNCTIONS(typeName, arrayName) \ + +Clay_Context *Clay__currentContext; +int32_t Clay__defaultMaxElementCount = 8192; +int32_t Clay__defaultMaxMeasureTextWordCacheCount = 16384; + +void Clay__ErrorHandlerFunctionDefault(Clay_ErrorData errorText) { + (void) errorText; +} + +Clay_String CLAY__SPACECHAR = { .length = 1, .chars = " " }; +Clay_String CLAY__STRING_DEFAULT = { .length = 0, .chars = NULL }; + +typedef struct { + bool maxElementsExceeded; + bool maxRenderCommandsExceeded; + bool maxTextMeasureCacheExceeded; + bool textMeasurementFunctionNotSet; +} Clay_BooleanWarnings; + +typedef struct { + Clay_String baseMessage; + Clay_String dynamicMessage; +} Clay__Warning; + +Clay__Warning CLAY__WARNING_DEFAULT = CLAY__DEFAULT_STRUCT; + +typedef struct { + int32_t capacity; + int32_t length; + Clay__Warning *internalArray; +} Clay__WarningArray; + +typedef struct { + Clay_Color backgroundColor; + Clay_CornerRadius cornerRadius; + void* userData; +} Clay_SharedElementConfig; + +CLAY__WRAPPER_STRUCT(Clay_SharedElementConfig); + +Clay__WarningArray Clay__WarningArray_Allocate_Arena(int32_t capacity, Clay_Arena *arena); +Clay__Warning *Clay__WarningArray_Add(Clay__WarningArray *array, Clay__Warning item); +void* Clay__Array_Allocate_Arena(int32_t capacity, uint32_t itemSize, Clay_Arena *arena); +bool Clay__Array_RangeCheck(int32_t index, int32_t length); +bool Clay__Array_AddCapacityCheck(int32_t length, int32_t capacity); + +CLAY__ARRAY_DEFINE(bool, Clay__boolArray) +CLAY__ARRAY_DEFINE(int32_t, Clay__int32_tArray) +CLAY__ARRAY_DEFINE(char, Clay__charArray) +CLAY__ARRAY_DEFINE_FUNCTIONS(Clay_ElementId, Clay_ElementIdArray) +CLAY__ARRAY_DEFINE(Clay_LayoutConfig, Clay__LayoutConfigArray) +CLAY__ARRAY_DEFINE(Clay_TextElementConfig, Clay__TextElementConfigArray) +CLAY__ARRAY_DEFINE(Clay_AspectRatioElementConfig, Clay__AspectRatioElementConfigArray) +CLAY__ARRAY_DEFINE(Clay_ImageElementConfig, Clay__ImageElementConfigArray) +CLAY__ARRAY_DEFINE(Clay_FloatingElementConfig, Clay__FloatingElementConfigArray) +CLAY__ARRAY_DEFINE(Clay_CustomElementConfig, Clay__CustomElementConfigArray) +CLAY__ARRAY_DEFINE(Clay_ClipElementConfig, Clay__ClipElementConfigArray) +CLAY__ARRAY_DEFINE(Clay_BorderElementConfig, Clay__BorderElementConfigArray) +CLAY__ARRAY_DEFINE(Clay_String, Clay__StringArray) +CLAY__ARRAY_DEFINE(Clay_SharedElementConfig, Clay__SharedElementConfigArray) +CLAY__ARRAY_DEFINE_FUNCTIONS(Clay_RenderCommand, Clay_RenderCommandArray) + +typedef CLAY_PACKED_ENUM { + CLAY__ELEMENT_CONFIG_TYPE_NONE, + CLAY__ELEMENT_CONFIG_TYPE_BORDER, + CLAY__ELEMENT_CONFIG_TYPE_FLOATING, + CLAY__ELEMENT_CONFIG_TYPE_CLIP, + CLAY__ELEMENT_CONFIG_TYPE_ASPECT, + CLAY__ELEMENT_CONFIG_TYPE_IMAGE, + CLAY__ELEMENT_CONFIG_TYPE_TEXT, + CLAY__ELEMENT_CONFIG_TYPE_CUSTOM, + CLAY__ELEMENT_CONFIG_TYPE_SHARED, +} Clay__ElementConfigType; + +typedef union { + Clay_TextElementConfig *textElementConfig; + Clay_AspectRatioElementConfig *aspectRatioElementConfig; + Clay_ImageElementConfig *imageElementConfig; + Clay_FloatingElementConfig *floatingElementConfig; + Clay_CustomElementConfig *customElementConfig; + Clay_ClipElementConfig *clipElementConfig; + Clay_BorderElementConfig *borderElementConfig; + Clay_SharedElementConfig *sharedElementConfig; +} Clay_ElementConfigUnion; + +typedef struct { + Clay__ElementConfigType type; + Clay_ElementConfigUnion config; +} Clay_ElementConfig; + +CLAY__ARRAY_DEFINE(Clay_ElementConfig, Clay__ElementConfigArray) + +typedef struct { + Clay_Dimensions dimensions; + Clay_String line; +} Clay__WrappedTextLine; + +CLAY__ARRAY_DEFINE(Clay__WrappedTextLine, Clay__WrappedTextLineArray) + +typedef struct { + Clay_String text; + Clay_Dimensions preferredDimensions; + int32_t elementIndex; + Clay__WrappedTextLineArraySlice wrappedLines; +} Clay__TextElementData; + +CLAY__ARRAY_DEFINE(Clay__TextElementData, Clay__TextElementDataArray) + +typedef struct { + int32_t *elements; + uint16_t length; +} Clay__LayoutElementChildren; + +typedef struct { + union { + Clay__LayoutElementChildren children; + Clay__TextElementData *textElementData; + } childrenOrTextContent; + Clay_Dimensions dimensions; + Clay_Dimensions minDimensions; + Clay_LayoutConfig *layoutConfig; + Clay__ElementConfigArraySlice elementConfigs; + uint32_t id; +} Clay_LayoutElement; + +CLAY__ARRAY_DEFINE(Clay_LayoutElement, Clay_LayoutElementArray) + +typedef struct { + Clay_LayoutElement *layoutElement; + Clay_BoundingBox boundingBox; + Clay_Dimensions contentSize; + Clay_Vector2 scrollOrigin; + Clay_Vector2 pointerOrigin; + Clay_Vector2 scrollMomentum; + Clay_Vector2 scrollPosition; + Clay_Vector2 previousDelta; + float momentumTime; + uint32_t elementId; + bool openThisFrame; + bool pointerScrollActive; +} Clay__ScrollContainerDataInternal; + +CLAY__ARRAY_DEFINE(Clay__ScrollContainerDataInternal, Clay__ScrollContainerDataInternalArray) + +typedef struct { + bool collision; + bool collapsed; +} Clay__DebugElementData; + +CLAY__ARRAY_DEFINE(Clay__DebugElementData, Clay__DebugElementDataArray) + +typedef struct { // todo get this struct into a single cache line + Clay_BoundingBox boundingBox; + Clay_ElementId elementId; + Clay_LayoutElement* layoutElement; + void (*onHoverFunction)(Clay_ElementId elementId, Clay_PointerData pointerInfo, intptr_t userData); + intptr_t hoverFunctionUserData; + int32_t nextIndex; + uint32_t generation; + Clay__DebugElementData *debugData; +} Clay_LayoutElementHashMapItem; + +CLAY__ARRAY_DEFINE(Clay_LayoutElementHashMapItem, Clay__LayoutElementHashMapItemArray) + +typedef struct { + int32_t startOffset; + int32_t length; + float width; + int32_t next; +} Clay__MeasuredWord; + +CLAY__ARRAY_DEFINE(Clay__MeasuredWord, Clay__MeasuredWordArray) + +typedef struct { + Clay_Dimensions unwrappedDimensions; + int32_t measuredWordsStartIndex; + float minWidth; + bool containsNewlines; + // Hash map data + uint32_t id; + int32_t nextIndex; + uint32_t generation; +} Clay__MeasureTextCacheItem; + +CLAY__ARRAY_DEFINE(Clay__MeasureTextCacheItem, Clay__MeasureTextCacheItemArray) + +typedef struct { + Clay_LayoutElement *layoutElement; + Clay_Vector2 position; + Clay_Vector2 nextChildOffset; +} Clay__LayoutElementTreeNode; + +CLAY__ARRAY_DEFINE(Clay__LayoutElementTreeNode, Clay__LayoutElementTreeNodeArray) + +typedef struct { + int32_t layoutElementIndex; + uint32_t parentId; // This can be zero in the case of the root layout tree + uint32_t clipElementId; // This can be zero if there is no clip element + int16_t zIndex; + Clay_Vector2 pointerOffset; // Only used when scroll containers are managed externally +} Clay__LayoutElementTreeRoot; + +CLAY__ARRAY_DEFINE(Clay__LayoutElementTreeRoot, Clay__LayoutElementTreeRootArray) + +struct Clay_Context { + int32_t maxElementCount; + int32_t maxMeasureTextCacheWordCount; + bool warningsEnabled; + Clay_ErrorHandler errorHandler; + Clay_BooleanWarnings booleanWarnings; + Clay__WarningArray warnings; + + Clay_PointerData pointerInfo; + Clay_Dimensions layoutDimensions; + Clay_ElementId dynamicElementIndexBaseHash; + uint32_t dynamicElementIndex; + bool debugModeEnabled; + bool disableCulling; + bool externalScrollHandlingEnabled; + uint32_t debugSelectedElementId; + uint32_t generation; + uintptr_t arenaResetOffset; + void *measureTextUserData; + void *queryScrollOffsetUserData; + Clay_Arena internalArena; + // Layout Elements / Render Commands + Clay_LayoutElementArray layoutElements; + Clay_RenderCommandArray renderCommands; + Clay__int32_tArray openLayoutElementStack; + Clay__int32_tArray layoutElementChildren; + Clay__int32_tArray layoutElementChildrenBuffer; + Clay__TextElementDataArray textElementData; + Clay__int32_tArray aspectRatioElementIndexes; + Clay__int32_tArray reusableElementIndexBuffer; + Clay__int32_tArray layoutElementClipElementIds; + // Configs + Clay__LayoutConfigArray layoutConfigs; + Clay__ElementConfigArray elementConfigs; + Clay__TextElementConfigArray textElementConfigs; + Clay__AspectRatioElementConfigArray aspectRatioElementConfigs; + Clay__ImageElementConfigArray imageElementConfigs; + Clay__FloatingElementConfigArray floatingElementConfigs; + Clay__ClipElementConfigArray clipElementConfigs; + Clay__CustomElementConfigArray customElementConfigs; + Clay__BorderElementConfigArray borderElementConfigs; + Clay__SharedElementConfigArray sharedElementConfigs; + // Misc Data Structures + Clay__StringArray layoutElementIdStrings; + Clay__WrappedTextLineArray wrappedTextLines; + Clay__LayoutElementTreeNodeArray layoutElementTreeNodeArray1; + Clay__LayoutElementTreeRootArray layoutElementTreeRoots; + Clay__LayoutElementHashMapItemArray layoutElementsHashMapInternal; + Clay__int32_tArray layoutElementsHashMap; + Clay__MeasureTextCacheItemArray measureTextHashMapInternal; + Clay__int32_tArray measureTextHashMapInternalFreeList; + Clay__int32_tArray measureTextHashMap; + Clay__MeasuredWordArray measuredWords; + Clay__int32_tArray measuredWordsFreeList; + Clay__int32_tArray openClipElementStack; + Clay_ElementIdArray pointerOverIds; + Clay__ScrollContainerDataInternalArray scrollContainerDatas; + Clay__boolArray treeNodeVisited; + Clay__charArray dynamicStringData; + Clay__DebugElementDataArray debugElementData; +}; + +Clay_Context* Clay__Context_Allocate_Arena(Clay_Arena *arena) { + size_t totalSizeBytes = sizeof(Clay_Context); + if (totalSizeBytes > arena->capacity) + { + return NULL; + } + arena->nextAllocation += totalSizeBytes; + return (Clay_Context*)(arena->memory); +} + +Clay_String Clay__WriteStringToCharBuffer(Clay__charArray *buffer, Clay_String string) { + for (int32_t i = 0; i < string.length; i++) { + buffer->internalArray[buffer->length + i] = string.chars[i]; + } + buffer->length += string.length; + return CLAY__INIT(Clay_String) { .length = string.length, .chars = (const char *)(buffer->internalArray + buffer->length - string.length) }; +} + +#ifdef CLAY_WASM + __attribute__((import_module("clay"), import_name("measureTextFunction"))) Clay_Dimensions Clay__MeasureText(Clay_StringSlice text, Clay_TextElementConfig *config, void *userData); + __attribute__((import_module("clay"), import_name("queryScrollOffsetFunction"))) Clay_Vector2 Clay__QueryScrollOffset(uint32_t elementId, void *userData); +#else + Clay_Dimensions (*Clay__MeasureText)(Clay_StringSlice text, Clay_TextElementConfig *config, void *userData); + Clay_Vector2 (*Clay__QueryScrollOffset)(uint32_t elementId, void *userData); +#endif + +Clay_LayoutElement* Clay__GetOpenLayoutElement(void) { + Clay_Context* context = Clay_GetCurrentContext(); + return Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&context->openLayoutElementStack, context->openLayoutElementStack.length - 1)); +} + +uint32_t Clay__GetParentElementId(void) { + Clay_Context* context = Clay_GetCurrentContext(); + return Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&context->openLayoutElementStack, context->openLayoutElementStack.length - 2))->id; +} + +Clay_LayoutConfig * Clay__StoreLayoutConfig(Clay_LayoutConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &CLAY_LAYOUT_DEFAULT : Clay__LayoutConfigArray_Add(&Clay_GetCurrentContext()->layoutConfigs, config); } +Clay_TextElementConfig * Clay__StoreTextElementConfig(Clay_TextElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_TextElementConfig_DEFAULT : Clay__TextElementConfigArray_Add(&Clay_GetCurrentContext()->textElementConfigs, config); } +Clay_AspectRatioElementConfig * Clay__StoreAspectRatioElementConfig(Clay_AspectRatioElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_AspectRatioElementConfig_DEFAULT : Clay__AspectRatioElementConfigArray_Add(&Clay_GetCurrentContext()->aspectRatioElementConfigs, config); } +Clay_ImageElementConfig * Clay__StoreImageElementConfig(Clay_ImageElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_ImageElementConfig_DEFAULT : Clay__ImageElementConfigArray_Add(&Clay_GetCurrentContext()->imageElementConfigs, config); } +Clay_FloatingElementConfig * Clay__StoreFloatingElementConfig(Clay_FloatingElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_FloatingElementConfig_DEFAULT : Clay__FloatingElementConfigArray_Add(&Clay_GetCurrentContext()->floatingElementConfigs, config); } +Clay_CustomElementConfig * Clay__StoreCustomElementConfig(Clay_CustomElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_CustomElementConfig_DEFAULT : Clay__CustomElementConfigArray_Add(&Clay_GetCurrentContext()->customElementConfigs, config); } +Clay_ClipElementConfig * Clay__StoreClipElementConfig(Clay_ClipElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_ClipElementConfig_DEFAULT : Clay__ClipElementConfigArray_Add(&Clay_GetCurrentContext()->clipElementConfigs, config); } +Clay_BorderElementConfig * Clay__StoreBorderElementConfig(Clay_BorderElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_BorderElementConfig_DEFAULT : Clay__BorderElementConfigArray_Add(&Clay_GetCurrentContext()->borderElementConfigs, config); } +Clay_SharedElementConfig * Clay__StoreSharedElementConfig(Clay_SharedElementConfig config) { return Clay_GetCurrentContext()->booleanWarnings.maxElementsExceeded ? &Clay_SharedElementConfig_DEFAULT : Clay__SharedElementConfigArray_Add(&Clay_GetCurrentContext()->sharedElementConfigs, config); } + +Clay_ElementConfig Clay__AttachElementConfig(Clay_ElementConfigUnion config, Clay__ElementConfigType type) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->booleanWarnings.maxElementsExceeded) { + return CLAY__INIT(Clay_ElementConfig) CLAY__DEFAULT_STRUCT; + } + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + openLayoutElement->elementConfigs.length++; + return *Clay__ElementConfigArray_Add(&context->elementConfigs, CLAY__INIT(Clay_ElementConfig) { .type = type, .config = config }); +} + +Clay_ElementConfigUnion Clay__FindElementConfigWithType(Clay_LayoutElement *element, Clay__ElementConfigType type) { + for (int32_t i = 0; i < element->elementConfigs.length; i++) { + Clay_ElementConfig *config = Clay__ElementConfigArraySlice_Get(&element->elementConfigs, i); + if (config->type == type) { + return config->config; + } + } + return CLAY__INIT(Clay_ElementConfigUnion) { NULL }; +} + +Clay_ElementId Clay__HashNumber(const uint32_t offset, const uint32_t seed) { + uint32_t hash = seed; + hash += (offset + 48); + hash += (hash << 10); + hash ^= (hash >> 6); + + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + return CLAY__INIT(Clay_ElementId) { .id = hash + 1, .offset = offset, .baseId = seed, .stringId = CLAY__STRING_DEFAULT }; // Reserve the hash result of zero as "null id" +} + +Clay_ElementId Clay__HashString(Clay_String key, const uint32_t seed) { + uint32_t hash = seed; + + for (int32_t i = 0; i < key.length; i++) { + hash += key.chars[i]; + hash += (hash << 10); + hash ^= (hash >> 6); + } + + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + return CLAY__INIT(Clay_ElementId) { .id = hash + 1, .offset = 0, .baseId = hash + 1, .stringId = key }; // Reserve the hash result of zero as "null id" +} + +Clay_ElementId Clay__HashStringWithOffset(Clay_String key, const uint32_t offset, const uint32_t seed) { + uint32_t hash = 0; + uint32_t base = seed; + + for (int32_t i = 0; i < key.length; i++) { + base += key.chars[i]; + base += (base << 10); + base ^= (base >> 6); + } + hash = base; + hash += offset; + hash += (hash << 10); + hash ^= (hash >> 6); + + hash += (hash << 3); + base += (base << 3); + hash ^= (hash >> 11); + base ^= (base >> 11); + hash += (hash << 15); + base += (base << 15); + return CLAY__INIT(Clay_ElementId) { .id = hash + 1, .offset = offset, .baseId = base + 1, .stringId = key }; // Reserve the hash result of zero as "null id" +} + +#if !defined(CLAY_DISABLE_SIMD) && (defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64)) +static inline __m128i Clay__SIMDRotateLeft(__m128i x, int r) { + return _mm_or_si128(_mm_slli_epi64(x, r), _mm_srli_epi64(x, 64 - r)); +} + +static inline void Clay__SIMDARXMix(__m128i* a, __m128i* b) { + *a = _mm_add_epi64(*a, *b); + *b = _mm_xor_si128(Clay__SIMDRotateLeft(*b, 17), *a); +} + +uint64_t Clay__HashData(const uint8_t* data, size_t length) { + // Pinched these constants from the BLAKE implementation + __m128i v0 = _mm_set1_epi64x(0x6a09e667f3bcc908ULL); + __m128i v1 = _mm_set1_epi64x(0xbb67ae8584caa73bULL); + __m128i v2 = _mm_set1_epi64x(0x3c6ef372fe94f82bULL); + __m128i v3 = _mm_set1_epi64x(0xa54ff53a5f1d36f1ULL); + + uint8_t overflowBuffer[16] = { 0 }; // Temporary buffer for small inputs + + while (length > 0) { + __m128i msg; + if (length >= 16) { + msg = _mm_loadu_si128((const __m128i*)data); + data += 16; + length -= 16; + } + else { + for (size_t i = 0; i < length; i++) { + overflowBuffer[i] = data[i]; + } + msg = _mm_loadu_si128((const __m128i*)overflowBuffer); + length = 0; + } + + v0 = _mm_xor_si128(v0, msg); + Clay__SIMDARXMix(&v0, &v1); + Clay__SIMDARXMix(&v2, &v3); + + v0 = _mm_add_epi64(v0, v2); + v1 = _mm_add_epi64(v1, v3); + } + + Clay__SIMDARXMix(&v0, &v1); + Clay__SIMDARXMix(&v2, &v3); + v0 = _mm_add_epi64(v0, v2); + v1 = _mm_add_epi64(v1, v3); + v0 = _mm_add_epi64(v0, v1); + + uint64_t result[2]; + _mm_storeu_si128((__m128i*)result, v0); + + return result[0] ^ result[1]; +} +#elif !defined(CLAY_DISABLE_SIMD) && defined(__aarch64__) +static inline void Clay__SIMDARXMix(uint64x2_t* a, uint64x2_t* b) { + *a = vaddq_u64(*a, *b); + *b = veorq_u64(vorrq_u64(vshlq_n_u64(*b, 17), vshrq_n_u64(*b, 64 - 17)), *a); +} + +uint64_t Clay__HashData(const uint8_t* data, size_t length) { + // Pinched these constants from the BLAKE implementation + uint64x2_t v0 = vdupq_n_u64(0x6a09e667f3bcc908ULL); + uint64x2_t v1 = vdupq_n_u64(0xbb67ae8584caa73bULL); + uint64x2_t v2 = vdupq_n_u64(0x3c6ef372fe94f82bULL); + uint64x2_t v3 = vdupq_n_u64(0xa54ff53a5f1d36f1ULL); + + uint8_t overflowBuffer[8] = { 0 }; + + while (length > 0) { + uint64x2_t msg; + if (length > 16) { + msg = vld1q_u64((const uint64_t*)data); + data += 16; + length -= 16; + } + else if (length > 8) { + msg = vcombine_u64(vld1_u64((const uint64_t*)data), vdup_n_u64(0)); + data += 8; + length -= 8; + } + else { + for (size_t i = 0; i < length; i++) { + overflowBuffer[i] = data[i]; + } + uint8x8_t lower = vld1_u8(overflowBuffer); + msg = vreinterpretq_u64_u8(vcombine_u8(lower, vdup_n_u8(0))); + length = 0; + } + v0 = veorq_u64(v0, msg); + Clay__SIMDARXMix(&v0, &v1); + Clay__SIMDARXMix(&v2, &v3); + + v0 = vaddq_u64(v0, v2); + v1 = vaddq_u64(v1, v3); + } + + Clay__SIMDARXMix(&v0, &v1); + Clay__SIMDARXMix(&v2, &v3); + v0 = vaddq_u64(v0, v2); + v1 = vaddq_u64(v1, v3); + v0 = vaddq_u64(v0, v1); + + uint64_t result[2]; + vst1q_u64(result, v0); + + return result[0] ^ result[1]; +} +#else +uint64_t Clay__HashData(const uint8_t* data, size_t length) { + uint64_t hash = 0; + + for (size_t i = 0; i < length; i++) { + hash += data[i]; + hash += (hash << 10); + hash ^= (hash >> 6); + } + return hash; +} +#endif + +uint32_t Clay__HashStringContentsWithConfig(Clay_String *text, Clay_TextElementConfig *config) { + uint32_t hash = 0; + if (text->isStaticallyAllocated) { + hash += (uintptr_t)text->chars; + hash += (hash << 10); + hash ^= (hash >> 6); + hash += text->length; + hash += (hash << 10); + hash ^= (hash >> 6); + } else { + hash = Clay__HashData((const uint8_t *)text->chars, text->length) % UINT32_MAX; + } + + hash += config->fontId; + hash += (hash << 10); + hash ^= (hash >> 6); + + hash += config->fontSize; + hash += (hash << 10); + hash ^= (hash >> 6); + + hash += config->letterSpacing; + hash += (hash << 10); + hash ^= (hash >> 6); + + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + return hash + 1; // Reserve the hash result of zero as "null id" +} + +Clay__MeasuredWord *Clay__AddMeasuredWord(Clay__MeasuredWord word, Clay__MeasuredWord *previousWord) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->measuredWordsFreeList.length > 0) { + uint32_t newItemIndex = Clay__int32_tArray_GetValue(&context->measuredWordsFreeList, (int)context->measuredWordsFreeList.length - 1); + context->measuredWordsFreeList.length--; + Clay__MeasuredWordArray_Set(&context->measuredWords, (int)newItemIndex, word); + previousWord->next = (int32_t)newItemIndex; + return Clay__MeasuredWordArray_Get(&context->measuredWords, (int)newItemIndex); + } else { + previousWord->next = (int32_t)context->measuredWords.length; + return Clay__MeasuredWordArray_Add(&context->measuredWords, word); + } +} + +Clay__MeasureTextCacheItem *Clay__MeasureTextCached(Clay_String *text, Clay_TextElementConfig *config) { + Clay_Context* context = Clay_GetCurrentContext(); + #ifndef CLAY_WASM + if (!Clay__MeasureText) { + if (!context->booleanWarnings.textMeasurementFunctionNotSet) { + context->booleanWarnings.textMeasurementFunctionNotSet = true; + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_TEXT_MEASUREMENT_FUNCTION_NOT_PROVIDED, + .errorText = CLAY_STRING("Clay's internal MeasureText function is null. You may have forgotten to call Clay_SetMeasureTextFunction(), or passed a NULL function pointer by mistake."), + .userData = context->errorHandler.userData }); + } + return &Clay__MeasureTextCacheItem_DEFAULT; + } + #endif + uint32_t id = Clay__HashStringContentsWithConfig(text, config); + uint32_t hashBucket = id % (context->maxMeasureTextCacheWordCount / 32); + int32_t elementIndexPrevious = 0; + int32_t elementIndex = context->measureTextHashMap.internalArray[hashBucket]; + while (elementIndex != 0) { + Clay__MeasureTextCacheItem *hashEntry = Clay__MeasureTextCacheItemArray_Get(&context->measureTextHashMapInternal, elementIndex); + if (hashEntry->id == id) { + hashEntry->generation = context->generation; + return hashEntry; + } + // This element hasn't been seen in a few frames, delete the hash map item + if (context->generation - hashEntry->generation > 2) { + // Add all the measured words that were included in this measurement to the freelist + int32_t nextWordIndex = hashEntry->measuredWordsStartIndex; + while (nextWordIndex != -1) { + Clay__MeasuredWord *measuredWord = Clay__MeasuredWordArray_Get(&context->measuredWords, nextWordIndex); + Clay__int32_tArray_Add(&context->measuredWordsFreeList, nextWordIndex); + nextWordIndex = measuredWord->next; + } + + int32_t nextIndex = hashEntry->nextIndex; + Clay__MeasureTextCacheItemArray_Set(&context->measureTextHashMapInternal, elementIndex, CLAY__INIT(Clay__MeasureTextCacheItem) { .measuredWordsStartIndex = -1 }); + Clay__int32_tArray_Add(&context->measureTextHashMapInternalFreeList, elementIndex); + if (elementIndexPrevious == 0) { + context->measureTextHashMap.internalArray[hashBucket] = nextIndex; + } else { + Clay__MeasureTextCacheItem *previousHashEntry = Clay__MeasureTextCacheItemArray_Get(&context->measureTextHashMapInternal, elementIndexPrevious); + previousHashEntry->nextIndex = nextIndex; + } + elementIndex = nextIndex; + } else { + elementIndexPrevious = elementIndex; + elementIndex = hashEntry->nextIndex; + } + } + + int32_t newItemIndex = 0; + Clay__MeasureTextCacheItem newCacheItem = { .measuredWordsStartIndex = -1, .id = id, .generation = context->generation }; + Clay__MeasureTextCacheItem *measured = NULL; + if (context->measureTextHashMapInternalFreeList.length > 0) { + newItemIndex = Clay__int32_tArray_GetValue(&context->measureTextHashMapInternalFreeList, context->measureTextHashMapInternalFreeList.length - 1); + context->measureTextHashMapInternalFreeList.length--; + Clay__MeasureTextCacheItemArray_Set(&context->measureTextHashMapInternal, newItemIndex, newCacheItem); + measured = Clay__MeasureTextCacheItemArray_Get(&context->measureTextHashMapInternal, newItemIndex); + } else { + if (context->measureTextHashMapInternal.length == context->measureTextHashMapInternal.capacity - 1) { + if (!context->booleanWarnings.maxTextMeasureCacheExceeded) { + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_ELEMENTS_CAPACITY_EXCEEDED, + .errorText = CLAY_STRING("Clay ran out of capacity while attempting to measure text elements. Try using Clay_SetMaxElementCount() with a higher value."), + .userData = context->errorHandler.userData }); + context->booleanWarnings.maxTextMeasureCacheExceeded = true; + } + return &Clay__MeasureTextCacheItem_DEFAULT; + } + measured = Clay__MeasureTextCacheItemArray_Add(&context->measureTextHashMapInternal, newCacheItem); + newItemIndex = context->measureTextHashMapInternal.length - 1; + } + + int32_t start = 0; + int32_t end = 0; + float lineWidth = 0; + float measuredWidth = 0; + float measuredHeight = 0; + float spaceWidth = Clay__MeasureText(CLAY__INIT(Clay_StringSlice) { .length = 1, .chars = CLAY__SPACECHAR.chars, .baseChars = CLAY__SPACECHAR.chars }, config, context->measureTextUserData).width; + Clay__MeasuredWord tempWord = { .next = -1 }; + Clay__MeasuredWord *previousWord = &tempWord; + while (end < text->length) { + if (context->measuredWords.length == context->measuredWords.capacity - 1) { + if (!context->booleanWarnings.maxTextMeasureCacheExceeded) { + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_TEXT_MEASUREMENT_CAPACITY_EXCEEDED, + .errorText = CLAY_STRING("Clay has run out of space in it's internal text measurement cache. Try using Clay_SetMaxMeasureTextCacheWordCount() (default 16384, with 1 unit storing 1 measured word)."), + .userData = context->errorHandler.userData }); + context->booleanWarnings.maxTextMeasureCacheExceeded = true; + } + return &Clay__MeasureTextCacheItem_DEFAULT; + } + char current = text->chars[end]; + if (current == ' ' || current == '\n') { + int32_t length = end - start; + Clay_Dimensions dimensions = CLAY__DEFAULT_STRUCT; + if (length > 0) { + dimensions = Clay__MeasureText(CLAY__INIT(Clay_StringSlice) {.length = length, .chars = &text->chars[start], .baseChars = text->chars}, config, context->measureTextUserData); + } + measured->minWidth = CLAY__MAX(dimensions.width, measured->minWidth); + measuredHeight = CLAY__MAX(measuredHeight, dimensions.height); + if (current == ' ') { + dimensions.width += spaceWidth; + previousWord = Clay__AddMeasuredWord(CLAY__INIT(Clay__MeasuredWord) { .startOffset = start, .length = length + 1, .width = dimensions.width, .next = -1 }, previousWord); + lineWidth += dimensions.width; + } + if (current == '\n') { + if (length > 0) { + previousWord = Clay__AddMeasuredWord(CLAY__INIT(Clay__MeasuredWord) { .startOffset = start, .length = length, .width = dimensions.width, .next = -1 }, previousWord); + } + previousWord = Clay__AddMeasuredWord(CLAY__INIT(Clay__MeasuredWord) { .startOffset = end + 1, .length = 0, .width = 0, .next = -1 }, previousWord); + lineWidth += dimensions.width; + measuredWidth = CLAY__MAX(lineWidth, measuredWidth); + measured->containsNewlines = true; + lineWidth = 0; + } + start = end + 1; + } + end++; + } + if (end - start > 0) { + Clay_Dimensions dimensions = Clay__MeasureText(CLAY__INIT(Clay_StringSlice) { .length = end - start, .chars = &text->chars[start], .baseChars = text->chars }, config, context->measureTextUserData); + Clay__AddMeasuredWord(CLAY__INIT(Clay__MeasuredWord) { .startOffset = start, .length = end - start, .width = dimensions.width, .next = -1 }, previousWord); + lineWidth += dimensions.width; + measuredHeight = CLAY__MAX(measuredHeight, dimensions.height); + measured->minWidth = CLAY__MAX(dimensions.width, measured->minWidth); + } + measuredWidth = CLAY__MAX(lineWidth, measuredWidth) - config->letterSpacing; + + measured->measuredWordsStartIndex = tempWord.next; + measured->unwrappedDimensions.width = measuredWidth; + measured->unwrappedDimensions.height = measuredHeight; + + if (elementIndexPrevious != 0) { + Clay__MeasureTextCacheItemArray_Get(&context->measureTextHashMapInternal, elementIndexPrevious)->nextIndex = newItemIndex; + } else { + context->measureTextHashMap.internalArray[hashBucket] = newItemIndex; + } + return measured; +} + +bool Clay__PointIsInsideRect(Clay_Vector2 point, Clay_BoundingBox rect) { + return point.x >= rect.x && point.x <= rect.x + rect.width && point.y >= rect.y && point.y <= rect.y + rect.height; +} + +Clay_LayoutElementHashMapItem* Clay__AddHashMapItem(Clay_ElementId elementId, Clay_LayoutElement* layoutElement) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->layoutElementsHashMapInternal.length == context->layoutElementsHashMapInternal.capacity - 1) { + return NULL; + } + Clay_LayoutElementHashMapItem item = { .elementId = elementId, .layoutElement = layoutElement, .nextIndex = -1, .generation = context->generation + 1 }; + uint32_t hashBucket = elementId.id % context->layoutElementsHashMap.capacity; + int32_t hashItemPrevious = -1; + int32_t hashItemIndex = context->layoutElementsHashMap.internalArray[hashBucket]; + while (hashItemIndex != -1) { // Just replace collision, not a big deal - leave it up to the end user + Clay_LayoutElementHashMapItem *hashItem = Clay__LayoutElementHashMapItemArray_Get(&context->layoutElementsHashMapInternal, hashItemIndex); + if (hashItem->elementId.id == elementId.id) { // Collision - resolve based on generation + item.nextIndex = hashItem->nextIndex; + if (hashItem->generation <= context->generation) { // First collision - assume this is the "same" element + hashItem->elementId = elementId; // Make sure to copy this across. If the stringId reference has changed, we should update the hash item to use the new one. + hashItem->generation = context->generation + 1; + hashItem->layoutElement = layoutElement; + hashItem->debugData->collision = false; + hashItem->onHoverFunction = NULL; + hashItem->hoverFunctionUserData = 0; + } else { // Multiple collisions this frame - two elements have the same ID + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_DUPLICATE_ID, + .errorText = CLAY_STRING("An element with this ID was already previously declared during this layout."), + .userData = context->errorHandler.userData }); + if (context->debugModeEnabled) { + hashItem->debugData->collision = true; + } + } + return hashItem; + } + hashItemPrevious = hashItemIndex; + hashItemIndex = hashItem->nextIndex; + } + Clay_LayoutElementHashMapItem *hashItem = Clay__LayoutElementHashMapItemArray_Add(&context->layoutElementsHashMapInternal, item); + hashItem->debugData = Clay__DebugElementDataArray_Add(&context->debugElementData, CLAY__INIT(Clay__DebugElementData) CLAY__DEFAULT_STRUCT); + if (hashItemPrevious != -1) { + Clay__LayoutElementHashMapItemArray_Get(&context->layoutElementsHashMapInternal, hashItemPrevious)->nextIndex = (int32_t)context->layoutElementsHashMapInternal.length - 1; + } else { + context->layoutElementsHashMap.internalArray[hashBucket] = (int32_t)context->layoutElementsHashMapInternal.length - 1; + } + return hashItem; +} + +Clay_LayoutElementHashMapItem *Clay__GetHashMapItem(uint32_t id) { + Clay_Context* context = Clay_GetCurrentContext(); + uint32_t hashBucket = id % context->layoutElementsHashMap.capacity; + int32_t elementIndex = context->layoutElementsHashMap.internalArray[hashBucket]; + while (elementIndex != -1) { + Clay_LayoutElementHashMapItem *hashEntry = Clay__LayoutElementHashMapItemArray_Get(&context->layoutElementsHashMapInternal, elementIndex); + if (hashEntry->elementId.id == id) { + return hashEntry; + } + elementIndex = hashEntry->nextIndex; + } + return &Clay_LayoutElementHashMapItem_DEFAULT; +} + +Clay_ElementId Clay__GenerateIdForAnonymousElement(Clay_LayoutElement *openLayoutElement) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay_LayoutElement *parentElement = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&context->openLayoutElementStack, context->openLayoutElementStack.length - 2)); + Clay_ElementId elementId = Clay__HashNumber(parentElement->childrenOrTextContent.children.length, parentElement->id); + openLayoutElement->id = elementId.id; + Clay__AddHashMapItem(elementId, openLayoutElement); + Clay__StringArray_Add(&context->layoutElementIdStrings, elementId.stringId); + return elementId; +} + +bool Clay__ElementHasConfig(Clay_LayoutElement *layoutElement, Clay__ElementConfigType type) { + for (int32_t i = 0; i < layoutElement->elementConfigs.length; i++) { + if (Clay__ElementConfigArraySlice_Get(&layoutElement->elementConfigs, i)->type == type) { + return true; + } + } + return false; +} + +void Clay__UpdateAspectRatioBox(Clay_LayoutElement *layoutElement) { + for (int32_t j = 0; j < layoutElement->elementConfigs.length; j++) { + Clay_ElementConfig *config = Clay__ElementConfigArraySlice_Get(&layoutElement->elementConfigs, j); + if (config->type == CLAY__ELEMENT_CONFIG_TYPE_ASPECT) { + Clay_AspectRatioElementConfig *aspectConfig = config->config.aspectRatioElementConfig; + if (aspectConfig->aspectRatio == 0) { + break; + } + if (layoutElement->dimensions.width == 0 && layoutElement->dimensions.height != 0) { + layoutElement->dimensions.width = layoutElement->dimensions.height * aspectConfig->aspectRatio; + } else if (layoutElement->dimensions.width != 0 && layoutElement->dimensions.height == 0) { + layoutElement->dimensions.height = layoutElement->dimensions.width * (1 / aspectConfig->aspectRatio); + } + break; + } + } +} + +void Clay__CloseElement(void) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->booleanWarnings.maxElementsExceeded) { + return; + } + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + Clay_LayoutConfig *layoutConfig = openLayoutElement->layoutConfig; + if (!layoutConfig) { + openLayoutElement->layoutConfig = &Clay_LayoutConfig_DEFAULT; + layoutConfig = &Clay_LayoutConfig_DEFAULT; + } + bool elementHasClipHorizontal = false; + bool elementHasClipVertical = false; + for (int32_t i = 0; i < openLayoutElement->elementConfigs.length; i++) { + Clay_ElementConfig *config = Clay__ElementConfigArraySlice_Get(&openLayoutElement->elementConfigs, i); + if (config->type == CLAY__ELEMENT_CONFIG_TYPE_CLIP) { + elementHasClipHorizontal = config->config.clipElementConfig->horizontal; + elementHasClipVertical = config->config.clipElementConfig->vertical; + context->openClipElementStack.length--; + break; + } else if (config->type == CLAY__ELEMENT_CONFIG_TYPE_FLOATING) { + context->openClipElementStack.length--; + } + } + + float leftRightPadding = (float)(layoutConfig->padding.left + layoutConfig->padding.right); + float topBottomPadding = (float)(layoutConfig->padding.top + layoutConfig->padding.bottom); + + // Attach children to the current open element + openLayoutElement->childrenOrTextContent.children.elements = &context->layoutElementChildren.internalArray[context->layoutElementChildren.length]; + if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { + openLayoutElement->dimensions.width = leftRightPadding; + openLayoutElement->minDimensions.width = leftRightPadding; + for (int32_t i = 0; i < openLayoutElement->childrenOrTextContent.children.length; i++) { + int32_t childIndex = Clay__int32_tArray_GetValue(&context->layoutElementChildrenBuffer, (int)context->layoutElementChildrenBuffer.length - openLayoutElement->childrenOrTextContent.children.length + i); + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&context->layoutElements, childIndex); + openLayoutElement->dimensions.width += child->dimensions.width; + openLayoutElement->dimensions.height = CLAY__MAX(openLayoutElement->dimensions.height, child->dimensions.height + topBottomPadding); + // Minimum size of child elements doesn't matter to clip containers as they can shrink and hide their contents + if (!elementHasClipHorizontal) { + openLayoutElement->minDimensions.width += child->minDimensions.width; + } + if (!elementHasClipVertical) { + openLayoutElement->minDimensions.height = CLAY__MAX(openLayoutElement->minDimensions.height, child->minDimensions.height + topBottomPadding); + } + Clay__int32_tArray_Add(&context->layoutElementChildren, childIndex); + } + float childGap = (float)(CLAY__MAX(openLayoutElement->childrenOrTextContent.children.length - 1, 0) * layoutConfig->childGap); + openLayoutElement->dimensions.width += childGap; + if (!elementHasClipHorizontal) { + openLayoutElement->minDimensions.width += childGap; + } + } + else if (layoutConfig->layoutDirection == CLAY_TOP_TO_BOTTOM) { + openLayoutElement->dimensions.height = topBottomPadding; + openLayoutElement->minDimensions.height = topBottomPadding; + for (int32_t i = 0; i < openLayoutElement->childrenOrTextContent.children.length; i++) { + int32_t childIndex = Clay__int32_tArray_GetValue(&context->layoutElementChildrenBuffer, (int)context->layoutElementChildrenBuffer.length - openLayoutElement->childrenOrTextContent.children.length + i); + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&context->layoutElements, childIndex); + openLayoutElement->dimensions.height += child->dimensions.height; + openLayoutElement->dimensions.width = CLAY__MAX(openLayoutElement->dimensions.width, child->dimensions.width + leftRightPadding); + // Minimum size of child elements doesn't matter to clip containers as they can shrink and hide their contents + if (!elementHasClipVertical) { + openLayoutElement->minDimensions.height += child->minDimensions.height; + } + if (!elementHasClipHorizontal) { + openLayoutElement->minDimensions.width = CLAY__MAX(openLayoutElement->minDimensions.width, child->minDimensions.width + leftRightPadding); + } + Clay__int32_tArray_Add(&context->layoutElementChildren, childIndex); + } + float childGap = (float)(CLAY__MAX(openLayoutElement->childrenOrTextContent.children.length - 1, 0) * layoutConfig->childGap); + openLayoutElement->dimensions.height += childGap; + if (!elementHasClipVertical) { + openLayoutElement->minDimensions.height += childGap; + } + } + + context->layoutElementChildrenBuffer.length -= openLayoutElement->childrenOrTextContent.children.length; + + // Clamp element min and max width to the values configured in the layout + if (layoutConfig->sizing.width.type != CLAY__SIZING_TYPE_PERCENT) { + if (layoutConfig->sizing.width.size.minMax.max <= 0) { // Set the max size if the user didn't specify, makes calculations easier + layoutConfig->sizing.width.size.minMax.max = CLAY__MAXFLOAT; + } + openLayoutElement->dimensions.width = CLAY__MIN(CLAY__MAX(openLayoutElement->dimensions.width, layoutConfig->sizing.width.size.minMax.min), layoutConfig->sizing.width.size.minMax.max); + openLayoutElement->minDimensions.width = CLAY__MIN(CLAY__MAX(openLayoutElement->minDimensions.width, layoutConfig->sizing.width.size.minMax.min), layoutConfig->sizing.width.size.minMax.max); + } else { + openLayoutElement->dimensions.width = 0; + } + + // Clamp element min and max height to the values configured in the layout + if (layoutConfig->sizing.height.type != CLAY__SIZING_TYPE_PERCENT) { + if (layoutConfig->sizing.height.size.minMax.max <= 0) { // Set the max size if the user didn't specify, makes calculations easier + layoutConfig->sizing.height.size.minMax.max = CLAY__MAXFLOAT; + } + openLayoutElement->dimensions.height = CLAY__MIN(CLAY__MAX(openLayoutElement->dimensions.height, layoutConfig->sizing.height.size.minMax.min), layoutConfig->sizing.height.size.minMax.max); + openLayoutElement->minDimensions.height = CLAY__MIN(CLAY__MAX(openLayoutElement->minDimensions.height, layoutConfig->sizing.height.size.minMax.min), layoutConfig->sizing.height.size.minMax.max); + } else { + openLayoutElement->dimensions.height = 0; + } + + Clay__UpdateAspectRatioBox(openLayoutElement); + + bool elementIsFloating = Clay__ElementHasConfig(openLayoutElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING); + + // Close the currently open element + int32_t closingElementIndex = Clay__int32_tArray_RemoveSwapback(&context->openLayoutElementStack, (int)context->openLayoutElementStack.length - 1); + openLayoutElement = Clay__GetOpenLayoutElement(); + + if (!elementIsFloating && context->openLayoutElementStack.length > 1) { + openLayoutElement->childrenOrTextContent.children.length++; + Clay__int32_tArray_Add(&context->layoutElementChildrenBuffer, closingElementIndex); + } +} + +bool Clay__MemCmp(const char *s1, const char *s2, int32_t length); +#if !defined(CLAY_DISABLE_SIMD) && (defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64)) + bool Clay__MemCmp(const char *s1, const char *s2, int32_t length) { + while (length >= 16) { + __m128i v1 = _mm_loadu_si128((const __m128i *)s1); + __m128i v2 = _mm_loadu_si128((const __m128i *)s2); + + if (_mm_movemask_epi8(_mm_cmpeq_epi8(v1, v2)) != 0xFFFF) { // If any byte differs + return false; + } + + s1 += 16; + s2 += 16; + length -= 16; + } + + // Handle remaining bytes + while (length--) { + if (*s1 != *s2) { + return false; + } + s1++; + s2++; + } + + return true; + } +#elif !defined(CLAY_DISABLE_SIMD) && defined(__aarch64__) + bool Clay__MemCmp(const char *s1, const char *s2, int32_t length) { + while (length >= 16) { + uint8x16_t v1 = vld1q_u8((const uint8_t *)s1); + uint8x16_t v2 = vld1q_u8((const uint8_t *)s2); + + // Compare vectors + if (vminvq_u32(vreinterpretq_u32_u8(vceqq_u8(v1, v2))) != 0xFFFFFFFF) { // If there's a difference + return false; + } + + s1 += 16; + s2 += 16; + length -= 16; + } + + // Handle remaining bytes + while (length--) { + if (*s1 != *s2) { + return false; + } + s1++; + s2++; + } + + return true; + } +#else + bool Clay__MemCmp(const char *s1, const char *s2, int32_t length) { + for (int32_t i = 0; i < length; i++) { + if (s1[i] != s2[i]) { + return false; + } + } + return true; + } +#endif + +void Clay__OpenElement(void) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->layoutElements.length == context->layoutElements.capacity - 1 || context->booleanWarnings.maxElementsExceeded) { + context->booleanWarnings.maxElementsExceeded = true; + return; + } + Clay_LayoutElement layoutElement = CLAY__DEFAULT_STRUCT; + Clay_LayoutElement* openLayoutElement = Clay_LayoutElementArray_Add(&context->layoutElements, layoutElement); + Clay__int32_tArray_Add(&context->openLayoutElementStack, context->layoutElements.length - 1); + Clay__GenerateIdForAnonymousElement(openLayoutElement); + if (context->openClipElementStack.length > 0) { + Clay__int32_tArray_Set(&context->layoutElementClipElementIds, context->layoutElements.length - 1, Clay__int32_tArray_GetValue(&context->openClipElementStack, (int)context->openClipElementStack.length - 1)); + } else { + Clay__int32_tArray_Set(&context->layoutElementClipElementIds, context->layoutElements.length - 1, 0); + } +} + +void Clay__OpenElementWithId(Clay_ElementId elementId) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->layoutElements.length == context->layoutElements.capacity - 1 || context->booleanWarnings.maxElementsExceeded) { + context->booleanWarnings.maxElementsExceeded = true; + return; + } + Clay_LayoutElement layoutElement = CLAY__DEFAULT_STRUCT; + layoutElement.id = elementId.id; + Clay_LayoutElement * openLayoutElement = Clay_LayoutElementArray_Add(&context->layoutElements, layoutElement); + Clay__int32_tArray_Add(&context->openLayoutElementStack, context->layoutElements.length - 1); + Clay__AddHashMapItem(elementId, openLayoutElement); + Clay__StringArray_Add(&context->layoutElementIdStrings, elementId.stringId); + if (context->openClipElementStack.length > 0) { + Clay__int32_tArray_Set(&context->layoutElementClipElementIds, context->layoutElements.length - 1, Clay__int32_tArray_GetValue(&context->openClipElementStack, (int)context->openClipElementStack.length - 1)); + } else { + Clay__int32_tArray_Set(&context->layoutElementClipElementIds, context->layoutElements.length - 1, 0); + } +} + +void Clay__OpenTextElement(Clay_String text, Clay_TextElementConfig *textConfig) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->layoutElements.length == context->layoutElements.capacity - 1 || context->booleanWarnings.maxElementsExceeded) { + context->booleanWarnings.maxElementsExceeded = true; + return; + } + Clay_LayoutElement *parentElement = Clay__GetOpenLayoutElement(); + + Clay_LayoutElement layoutElement = CLAY__DEFAULT_STRUCT; + Clay_LayoutElement *textElement = Clay_LayoutElementArray_Add(&context->layoutElements, layoutElement); + if (context->openClipElementStack.length > 0) { + Clay__int32_tArray_Set(&context->layoutElementClipElementIds, context->layoutElements.length - 1, Clay__int32_tArray_GetValue(&context->openClipElementStack, (int)context->openClipElementStack.length - 1)); + } else { + Clay__int32_tArray_Set(&context->layoutElementClipElementIds, context->layoutElements.length - 1, 0); + } + + Clay__int32_tArray_Add(&context->layoutElementChildrenBuffer, context->layoutElements.length - 1); + Clay__MeasureTextCacheItem *textMeasured = Clay__MeasureTextCached(&text, textConfig); + Clay_ElementId elementId = Clay__HashNumber(parentElement->childrenOrTextContent.children.length, parentElement->id); + textElement->id = elementId.id; + Clay__AddHashMapItem(elementId, textElement); + Clay__StringArray_Add(&context->layoutElementIdStrings, elementId.stringId); + Clay_Dimensions textDimensions = { .width = textMeasured->unwrappedDimensions.width, .height = textConfig->lineHeight > 0 ? (float)textConfig->lineHeight : textMeasured->unwrappedDimensions.height }; + textElement->dimensions = textDimensions; + textElement->minDimensions = CLAY__INIT(Clay_Dimensions) { .width = textMeasured->minWidth, .height = textDimensions.height }; + textElement->childrenOrTextContent.textElementData = Clay__TextElementDataArray_Add(&context->textElementData, CLAY__INIT(Clay__TextElementData) { .text = text, .preferredDimensions = textMeasured->unwrappedDimensions, .elementIndex = context->layoutElements.length - 1 }); + textElement->elementConfigs = CLAY__INIT(Clay__ElementConfigArraySlice) { + .length = 1, + .internalArray = Clay__ElementConfigArray_Add(&context->elementConfigs, CLAY__INIT(Clay_ElementConfig) { .type = CLAY__ELEMENT_CONFIG_TYPE_TEXT, .config = { .textElementConfig = textConfig }}) + }; + textElement->layoutConfig = &CLAY_LAYOUT_DEFAULT; + parentElement->childrenOrTextContent.children.length++; +} + +void Clay__ConfigureOpenElementPtr(const Clay_ElementDeclaration *declaration) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + openLayoutElement->layoutConfig = Clay__StoreLayoutConfig(declaration->layout); + if ((declaration->layout.sizing.width.type == CLAY__SIZING_TYPE_PERCENT && declaration->layout.sizing.width.size.percent > 1) || (declaration->layout.sizing.height.type == CLAY__SIZING_TYPE_PERCENT && declaration->layout.sizing.height.size.percent > 1)) { + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_PERCENTAGE_OVER_1, + .errorText = CLAY_STRING("An element was configured with CLAY_SIZING_PERCENT, but the provided percentage value was over 1.0. Clay expects a value between 0 and 1, i.e. 20% is 0.2."), + .userData = context->errorHandler.userData }); + } + + openLayoutElement->elementConfigs.internalArray = &context->elementConfigs.internalArray[context->elementConfigs.length]; + Clay_SharedElementConfig *sharedConfig = NULL; + if (declaration->backgroundColor.a > 0) { + sharedConfig = Clay__StoreSharedElementConfig(CLAY__INIT(Clay_SharedElementConfig) { .backgroundColor = declaration->backgroundColor }); + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .sharedElementConfig = sharedConfig }, CLAY__ELEMENT_CONFIG_TYPE_SHARED); + } + if (!Clay__MemCmp((char *)(&declaration->cornerRadius), (char *)(&Clay__CornerRadius_DEFAULT), sizeof(Clay_CornerRadius))) { + if (sharedConfig) { + sharedConfig->cornerRadius = declaration->cornerRadius; + } else { + sharedConfig = Clay__StoreSharedElementConfig(CLAY__INIT(Clay_SharedElementConfig) { .cornerRadius = declaration->cornerRadius }); + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .sharedElementConfig = sharedConfig }, CLAY__ELEMENT_CONFIG_TYPE_SHARED); + } + } + if (declaration->userData != 0) { + if (sharedConfig) { + sharedConfig->userData = declaration->userData; + } else { + sharedConfig = Clay__StoreSharedElementConfig(CLAY__INIT(Clay_SharedElementConfig) { .userData = declaration->userData }); + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .sharedElementConfig = sharedConfig }, CLAY__ELEMENT_CONFIG_TYPE_SHARED); + } + } + if (declaration->image.imageData) { + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .imageElementConfig = Clay__StoreImageElementConfig(declaration->image) }, CLAY__ELEMENT_CONFIG_TYPE_IMAGE); + } + if (declaration->aspectRatio.aspectRatio > 0) { + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .aspectRatioElementConfig = Clay__StoreAspectRatioElementConfig(declaration->aspectRatio) }, CLAY__ELEMENT_CONFIG_TYPE_ASPECT); + Clay__int32_tArray_Add(&context->aspectRatioElementIndexes, context->layoutElements.length - 1); + } + if (declaration->floating.attachTo != CLAY_ATTACH_TO_NONE) { + Clay_FloatingElementConfig floatingConfig = declaration->floating; + // This looks dodgy but because of the auto generated root element the depth of the tree will always be at least 2 here + Clay_LayoutElement *hierarchicalParent = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&context->openLayoutElementStack, context->openLayoutElementStack.length - 2)); + if (hierarchicalParent) { + uint32_t clipElementId = 0; + if (declaration->floating.attachTo == CLAY_ATTACH_TO_PARENT) { + // Attach to the element's direct hierarchical parent + floatingConfig.parentId = hierarchicalParent->id; + if (context->openClipElementStack.length > 0) { + clipElementId = Clay__int32_tArray_GetValue(&context->openClipElementStack, (int)context->openClipElementStack.length - 1); + } + } else if (declaration->floating.attachTo == CLAY_ATTACH_TO_ELEMENT_WITH_ID) { + Clay_LayoutElementHashMapItem *parentItem = Clay__GetHashMapItem(floatingConfig.parentId); + if (parentItem == &Clay_LayoutElementHashMapItem_DEFAULT) { + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_FLOATING_CONTAINER_PARENT_NOT_FOUND, + .errorText = CLAY_STRING("A floating element was declared with a parentId, but no element with that ID was found."), + .userData = context->errorHandler.userData }); + } else { + clipElementId = Clay__int32_tArray_GetValue(&context->layoutElementClipElementIds, (int32_t)(parentItem->layoutElement - context->layoutElements.internalArray)); + } + } else if (declaration->floating.attachTo == CLAY_ATTACH_TO_ROOT) { + floatingConfig.parentId = Clay__HashString(CLAY_STRING("Clay__RootContainer"), 0).id; + } + if (declaration->floating.clipTo == CLAY_CLIP_TO_NONE) { + clipElementId = 0; + } + int32_t currentElementIndex = Clay__int32_tArray_GetValue(&context->openLayoutElementStack, context->openLayoutElementStack.length - 1); + Clay__int32_tArray_Set(&context->layoutElementClipElementIds, currentElementIndex, clipElementId); + Clay__int32_tArray_Add(&context->openClipElementStack, clipElementId); + Clay__LayoutElementTreeRootArray_Add(&context->layoutElementTreeRoots, CLAY__INIT(Clay__LayoutElementTreeRoot) { + .layoutElementIndex = Clay__int32_tArray_GetValue(&context->openLayoutElementStack, context->openLayoutElementStack.length - 1), + .parentId = floatingConfig.parentId, + .clipElementId = clipElementId, + .zIndex = floatingConfig.zIndex, + }); + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .floatingElementConfig = Clay__StoreFloatingElementConfig(floatingConfig) }, CLAY__ELEMENT_CONFIG_TYPE_FLOATING); + } + } + if (declaration->custom.customData) { + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .customElementConfig = Clay__StoreCustomElementConfig(declaration->custom) }, CLAY__ELEMENT_CONFIG_TYPE_CUSTOM); + } + + if (declaration->clip.horizontal | declaration->clip.vertical) { + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .clipElementConfig = Clay__StoreClipElementConfig(declaration->clip) }, CLAY__ELEMENT_CONFIG_TYPE_CLIP); + Clay__int32_tArray_Add(&context->openClipElementStack, (int)openLayoutElement->id); + // Retrieve or create cached data to track scroll position across frames + Clay__ScrollContainerDataInternal *scrollOffset = CLAY__NULL; + for (int32_t i = 0; i < context->scrollContainerDatas.length; i++) { + Clay__ScrollContainerDataInternal *mapping = Clay__ScrollContainerDataInternalArray_Get(&context->scrollContainerDatas, i); + if (openLayoutElement->id == mapping->elementId) { + scrollOffset = mapping; + scrollOffset->layoutElement = openLayoutElement; + scrollOffset->openThisFrame = true; + } + } + if (!scrollOffset) { + scrollOffset = Clay__ScrollContainerDataInternalArray_Add(&context->scrollContainerDatas, CLAY__INIT(Clay__ScrollContainerDataInternal){.layoutElement = openLayoutElement, .scrollOrigin = {-1,-1}, .elementId = openLayoutElement->id, .openThisFrame = true}); + } + if (context->externalScrollHandlingEnabled) { + scrollOffset->scrollPosition = Clay__QueryScrollOffset(scrollOffset->elementId, context->queryScrollOffsetUserData); + } + } + if (!Clay__MemCmp((char *)(&declaration->border.width), (char *)(&Clay__BorderWidth_DEFAULT), sizeof(Clay_BorderWidth))) { + Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .borderElementConfig = Clay__StoreBorderElementConfig(declaration->border) }, CLAY__ELEMENT_CONFIG_TYPE_BORDER); + } +} + +void Clay__ConfigureOpenElement(const Clay_ElementDeclaration declaration) { + Clay__ConfigureOpenElementPtr(&declaration); +} + +void Clay__InitializeEphemeralMemory(Clay_Context* context) { + int32_t maxElementCount = context->maxElementCount; + // Ephemeral Memory - reset every frame + Clay_Arena *arena = &context->internalArena; + arena->nextAllocation = context->arenaResetOffset; + + context->layoutElementChildrenBuffer = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->layoutElements = Clay_LayoutElementArray_Allocate_Arena(maxElementCount, arena); + context->warnings = Clay__WarningArray_Allocate_Arena(100, arena); + + context->layoutConfigs = Clay__LayoutConfigArray_Allocate_Arena(maxElementCount, arena); + context->elementConfigs = Clay__ElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->textElementConfigs = Clay__TextElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->aspectRatioElementConfigs = Clay__AspectRatioElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->imageElementConfigs = Clay__ImageElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->floatingElementConfigs = Clay__FloatingElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->clipElementConfigs = Clay__ClipElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->customElementConfigs = Clay__CustomElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->borderElementConfigs = Clay__BorderElementConfigArray_Allocate_Arena(maxElementCount, arena); + context->sharedElementConfigs = Clay__SharedElementConfigArray_Allocate_Arena(maxElementCount, arena); + + context->layoutElementIdStrings = Clay__StringArray_Allocate_Arena(maxElementCount, arena); + context->wrappedTextLines = Clay__WrappedTextLineArray_Allocate_Arena(maxElementCount, arena); + context->layoutElementTreeNodeArray1 = Clay__LayoutElementTreeNodeArray_Allocate_Arena(maxElementCount, arena); + context->layoutElementTreeRoots = Clay__LayoutElementTreeRootArray_Allocate_Arena(maxElementCount, arena); + context->layoutElementChildren = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->openLayoutElementStack = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->textElementData = Clay__TextElementDataArray_Allocate_Arena(maxElementCount, arena); + context->aspectRatioElementIndexes = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->renderCommands = Clay_RenderCommandArray_Allocate_Arena(maxElementCount, arena); + context->treeNodeVisited = Clay__boolArray_Allocate_Arena(maxElementCount, arena); + context->treeNodeVisited.length = context->treeNodeVisited.capacity; // This array is accessed directly rather than behaving as a list + context->openClipElementStack = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->reusableElementIndexBuffer = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->layoutElementClipElementIds = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->dynamicStringData = Clay__charArray_Allocate_Arena(maxElementCount, arena); +} + +void Clay__InitializePersistentMemory(Clay_Context* context) { + // Persistent memory - initialized once and not reset + int32_t maxElementCount = context->maxElementCount; + int32_t maxMeasureTextCacheWordCount = context->maxMeasureTextCacheWordCount; + Clay_Arena *arena = &context->internalArena; + + context->scrollContainerDatas = Clay__ScrollContainerDataInternalArray_Allocate_Arena(100, arena); + context->layoutElementsHashMapInternal = Clay__LayoutElementHashMapItemArray_Allocate_Arena(maxElementCount, arena); + context->layoutElementsHashMap = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->measureTextHashMapInternal = Clay__MeasureTextCacheItemArray_Allocate_Arena(maxElementCount, arena); + context->measureTextHashMapInternalFreeList = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->measuredWordsFreeList = Clay__int32_tArray_Allocate_Arena(maxMeasureTextCacheWordCount, arena); + context->measureTextHashMap = Clay__int32_tArray_Allocate_Arena(maxElementCount, arena); + context->measuredWords = Clay__MeasuredWordArray_Allocate_Arena(maxMeasureTextCacheWordCount, arena); + context->pointerOverIds = Clay_ElementIdArray_Allocate_Arena(maxElementCount, arena); + context->debugElementData = Clay__DebugElementDataArray_Allocate_Arena(maxElementCount, arena); + context->arenaResetOffset = arena->nextAllocation; +} + +const float CLAY__EPSILON = 0.01; + +bool Clay__FloatEqual(float left, float right) { + float subtracted = left - right; + return subtracted < CLAY__EPSILON && subtracted > -CLAY__EPSILON; +} + +void Clay__SizeContainersAlongAxis(bool xAxis) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay__int32_tArray bfsBuffer = context->layoutElementChildrenBuffer; + Clay__int32_tArray resizableContainerBuffer = context->openLayoutElementStack; + for (int32_t rootIndex = 0; rootIndex < context->layoutElementTreeRoots.length; ++rootIndex) { + bfsBuffer.length = 0; + Clay__LayoutElementTreeRoot *root = Clay__LayoutElementTreeRootArray_Get(&context->layoutElementTreeRoots, rootIndex); + Clay_LayoutElement *rootElement = Clay_LayoutElementArray_Get(&context->layoutElements, (int)root->layoutElementIndex); + Clay__int32_tArray_Add(&bfsBuffer, (int32_t)root->layoutElementIndex); + + // Size floating containers to their parents + if (Clay__ElementHasConfig(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING)) { + Clay_FloatingElementConfig *floatingElementConfig = Clay__FindElementConfigWithType(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING).floatingElementConfig; + Clay_LayoutElementHashMapItem *parentItem = Clay__GetHashMapItem(floatingElementConfig->parentId); + if (parentItem && parentItem != &Clay_LayoutElementHashMapItem_DEFAULT) { + Clay_LayoutElement *parentLayoutElement = parentItem->layoutElement; + switch (rootElement->layoutConfig->sizing.width.type) { + case CLAY__SIZING_TYPE_GROW: { + rootElement->dimensions.width = parentLayoutElement->dimensions.width; + break; + } + case CLAY__SIZING_TYPE_PERCENT: { + rootElement->dimensions.width = parentLayoutElement->dimensions.width * rootElement->layoutConfig->sizing.width.size.percent; + break; + } + default: break; + } + switch (rootElement->layoutConfig->sizing.height.type) { + case CLAY__SIZING_TYPE_GROW: { + rootElement->dimensions.height = parentLayoutElement->dimensions.height; + break; + } + case CLAY__SIZING_TYPE_PERCENT: { + rootElement->dimensions.height = parentLayoutElement->dimensions.height * rootElement->layoutConfig->sizing.height.size.percent; + break; + } + default: break; + } + } + } + + if (rootElement->layoutConfig->sizing.width.type != CLAY__SIZING_TYPE_PERCENT) { + rootElement->dimensions.width = CLAY__MIN(CLAY__MAX(rootElement->dimensions.width, rootElement->layoutConfig->sizing.width.size.minMax.min), rootElement->layoutConfig->sizing.width.size.minMax.max); + } + if (rootElement->layoutConfig->sizing.height.type != CLAY__SIZING_TYPE_PERCENT) { + rootElement->dimensions.height = CLAY__MIN(CLAY__MAX(rootElement->dimensions.height, rootElement->layoutConfig->sizing.height.size.minMax.min), rootElement->layoutConfig->sizing.height.size.minMax.max); + } + + for (int32_t i = 0; i < bfsBuffer.length; ++i) { + int32_t parentIndex = Clay__int32_tArray_GetValue(&bfsBuffer, i); + Clay_LayoutElement *parent = Clay_LayoutElementArray_Get(&context->layoutElements, parentIndex); + Clay_LayoutConfig *parentStyleConfig = parent->layoutConfig; + int32_t growContainerCount = 0; + float parentSize = xAxis ? parent->dimensions.width : parent->dimensions.height; + float parentPadding = (float)(xAxis ? (parent->layoutConfig->padding.left + parent->layoutConfig->padding.right) : (parent->layoutConfig->padding.top + parent->layoutConfig->padding.bottom)); + float innerContentSize = 0, totalPaddingAndChildGaps = parentPadding; + bool sizingAlongAxis = (xAxis && parentStyleConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) || (!xAxis && parentStyleConfig->layoutDirection == CLAY_TOP_TO_BOTTOM); + resizableContainerBuffer.length = 0; + float parentChildGap = parentStyleConfig->childGap; + + for (int32_t childOffset = 0; childOffset < parent->childrenOrTextContent.children.length; childOffset++) { + int32_t childElementIndex = parent->childrenOrTextContent.children.elements[childOffset]; + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, childElementIndex); + Clay_SizingAxis childSizing = xAxis ? childElement->layoutConfig->sizing.width : childElement->layoutConfig->sizing.height; + float childSize = xAxis ? childElement->dimensions.width : childElement->dimensions.height; + + if (!Clay__ElementHasConfig(childElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) && childElement->childrenOrTextContent.children.length > 0) { + Clay__int32_tArray_Add(&bfsBuffer, childElementIndex); + } + + if (childSizing.type != CLAY__SIZING_TYPE_PERCENT + && childSizing.type != CLAY__SIZING_TYPE_FIXED + && (!Clay__ElementHasConfig(childElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) || (Clay__FindElementConfigWithType(childElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT).textElementConfig->wrapMode == CLAY_TEXT_WRAP_WORDS)) // todo too many loops +// && (xAxis || !Clay__ElementHasConfig(childElement, CLAY__ELEMENT_CONFIG_TYPE_ASPECT)) + ) { + Clay__int32_tArray_Add(&resizableContainerBuffer, childElementIndex); + } + + if (sizingAlongAxis) { + innerContentSize += (childSizing.type == CLAY__SIZING_TYPE_PERCENT ? 0 : childSize); + if (childSizing.type == CLAY__SIZING_TYPE_GROW) { + growContainerCount++; + } + if (childOffset > 0) { + innerContentSize += parentChildGap; // For children after index 0, the childAxisOffset is the gap from the previous child + totalPaddingAndChildGaps += parentChildGap; + } + } else { + innerContentSize = CLAY__MAX(childSize, innerContentSize); + } + } + + // Expand percentage containers to size + for (int32_t childOffset = 0; childOffset < parent->childrenOrTextContent.children.length; childOffset++) { + int32_t childElementIndex = parent->childrenOrTextContent.children.elements[childOffset]; + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, childElementIndex); + Clay_SizingAxis childSizing = xAxis ? childElement->layoutConfig->sizing.width : childElement->layoutConfig->sizing.height; + float *childSize = xAxis ? &childElement->dimensions.width : &childElement->dimensions.height; + if (childSizing.type == CLAY__SIZING_TYPE_PERCENT) { + *childSize = (parentSize - totalPaddingAndChildGaps) * childSizing.size.percent; + if (sizingAlongAxis) { + innerContentSize += *childSize; + } + Clay__UpdateAspectRatioBox(childElement); + } + } + + if (sizingAlongAxis) { + float sizeToDistribute = parentSize - parentPadding - innerContentSize; + // The content is too large, compress the children as much as possible + if (sizeToDistribute < 0) { + // If the parent clips content in this axis direction, don't compress children, just leave them alone + Clay_ClipElementConfig *clipElementConfig = Clay__FindElementConfigWithType(parent, CLAY__ELEMENT_CONFIG_TYPE_CLIP).clipElementConfig; + if (clipElementConfig) { + if (((xAxis && clipElementConfig->horizontal) || (!xAxis && clipElementConfig->vertical))) { + continue; + } + } + // Scrolling containers preferentially compress before others + while (sizeToDistribute < -CLAY__EPSILON && resizableContainerBuffer.length > 0) { + float largest = 0; + float secondLargest = 0; + float widthToAdd = sizeToDistribute; + for (int childIndex = 0; childIndex < resizableContainerBuffer.length; childIndex++) { + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&resizableContainerBuffer, childIndex)); + float childSize = xAxis ? child->dimensions.width : child->dimensions.height; + if (Clay__FloatEqual(childSize, largest)) { continue; } + if (childSize > largest) { + secondLargest = largest; + largest = childSize; + } + if (childSize < largest) { + secondLargest = CLAY__MAX(secondLargest, childSize); + widthToAdd = secondLargest - largest; + } + } + + widthToAdd = CLAY__MAX(widthToAdd, sizeToDistribute / resizableContainerBuffer.length); + + for (int childIndex = 0; childIndex < resizableContainerBuffer.length; childIndex++) { + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&resizableContainerBuffer, childIndex)); + float *childSize = xAxis ? &child->dimensions.width : &child->dimensions.height; + float minSize = xAxis ? child->minDimensions.width : child->minDimensions.height; + float previousWidth = *childSize; + if (Clay__FloatEqual(*childSize, largest)) { + *childSize += widthToAdd; + if (*childSize <= minSize) { + *childSize = minSize; + Clay__int32_tArray_RemoveSwapback(&resizableContainerBuffer, childIndex--); + } + sizeToDistribute -= (*childSize - previousWidth); + } + } + } + // The content is too small, allow SIZING_GROW containers to expand + } else if (sizeToDistribute > 0 && growContainerCount > 0) { + for (int childIndex = 0; childIndex < resizableContainerBuffer.length; childIndex++) { + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&resizableContainerBuffer, childIndex)); + Clay__SizingType childSizing = xAxis ? child->layoutConfig->sizing.width.type : child->layoutConfig->sizing.height.type; + if (childSizing != CLAY__SIZING_TYPE_GROW) { + Clay__int32_tArray_RemoveSwapback(&resizableContainerBuffer, childIndex--); + } + } + while (sizeToDistribute > CLAY__EPSILON && resizableContainerBuffer.length > 0) { + float smallest = CLAY__MAXFLOAT; + float secondSmallest = CLAY__MAXFLOAT; + float widthToAdd = sizeToDistribute; + for (int childIndex = 0; childIndex < resizableContainerBuffer.length; childIndex++) { + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&resizableContainerBuffer, childIndex)); + float childSize = xAxis ? child->dimensions.width : child->dimensions.height; + if (Clay__FloatEqual(childSize, smallest)) { continue; } + if (childSize < smallest) { + secondSmallest = smallest; + smallest = childSize; + } + if (childSize > smallest) { + secondSmallest = CLAY__MIN(secondSmallest, childSize); + widthToAdd = secondSmallest - smallest; + } + } + + widthToAdd = CLAY__MIN(widthToAdd, sizeToDistribute / resizableContainerBuffer.length); + + for (int childIndex = 0; childIndex < resizableContainerBuffer.length; childIndex++) { + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&resizableContainerBuffer, childIndex)); + float *childSize = xAxis ? &child->dimensions.width : &child->dimensions.height; + float maxSize = xAxis ? child->layoutConfig->sizing.width.size.minMax.max : child->layoutConfig->sizing.height.size.minMax.max; + float previousWidth = *childSize; + if (Clay__FloatEqual(*childSize, smallest)) { + *childSize += widthToAdd; + if (*childSize >= maxSize) { + *childSize = maxSize; + Clay__int32_tArray_RemoveSwapback(&resizableContainerBuffer, childIndex--); + } + sizeToDistribute -= (*childSize - previousWidth); + } + } + } + } + // Sizing along the non layout axis ("off axis") + } else { + for (int32_t childOffset = 0; childOffset < resizableContainerBuffer.length; childOffset++) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&resizableContainerBuffer, childOffset)); + Clay_SizingAxis childSizing = xAxis ? childElement->layoutConfig->sizing.width : childElement->layoutConfig->sizing.height; + float minSize = xAxis ? childElement->minDimensions.width : childElement->minDimensions.height; + float *childSize = xAxis ? &childElement->dimensions.width : &childElement->dimensions.height; + + float maxSize = parentSize - parentPadding; + // If we're laying out the children of a scroll panel, grow containers expand to the size of the inner content, not the outer container + if (Clay__ElementHasConfig(parent, CLAY__ELEMENT_CONFIG_TYPE_CLIP)) { + Clay_ClipElementConfig *clipElementConfig = Clay__FindElementConfigWithType(parent, CLAY__ELEMENT_CONFIG_TYPE_CLIP).clipElementConfig; + if (((xAxis && clipElementConfig->horizontal) || (!xAxis && clipElementConfig->vertical))) { + maxSize = CLAY__MAX(maxSize, innerContentSize); + } + } + if (childSizing.type == CLAY__SIZING_TYPE_GROW) { + *childSize = CLAY__MIN(maxSize, childSizing.size.minMax.max); + } + *childSize = CLAY__MAX(minSize, CLAY__MIN(*childSize, maxSize)); + } + } + } + } +} + +Clay_String Clay__IntToString(int32_t integer) { + if (integer == 0) { + return CLAY__INIT(Clay_String) { .length = 1, .chars = "0" }; + } + Clay_Context* context = Clay_GetCurrentContext(); + char *chars = (char *)(context->dynamicStringData.internalArray + context->dynamicStringData.length); + int32_t length = 0; + int32_t sign = integer; + + if (integer < 0) { + integer = -integer; + } + while (integer > 0) { + chars[length++] = (char)(integer % 10 + '0'); + integer /= 10; + } + + if (sign < 0) { + chars[length++] = '-'; + } + + // Reverse the string to get the correct order + for (int32_t j = 0, k = length - 1; j < k; j++, k--) { + char temp = chars[j]; + chars[j] = chars[k]; + chars[k] = temp; + } + context->dynamicStringData.length += length; + return CLAY__INIT(Clay_String) { .length = length, .chars = chars }; +} + +void Clay__AddRenderCommand(Clay_RenderCommand renderCommand) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->renderCommands.length < context->renderCommands.capacity - 1) { + Clay_RenderCommandArray_Add(&context->renderCommands, renderCommand); + } else { + if (!context->booleanWarnings.maxRenderCommandsExceeded) { + context->booleanWarnings.maxRenderCommandsExceeded = true; + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_ELEMENTS_CAPACITY_EXCEEDED, + .errorText = CLAY_STRING("Clay ran out of capacity while attempting to create render commands. This is usually caused by a large amount of wrapping text elements while close to the max element capacity. Try using Clay_SetMaxElementCount() with a higher value."), + .userData = context->errorHandler.userData }); + } + } +} + +bool Clay__ElementIsOffscreen(Clay_BoundingBox *boundingBox) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->disableCulling) { + return false; + } + + return (boundingBox->x > (float)context->layoutDimensions.width) || + (boundingBox->y > (float)context->layoutDimensions.height) || + (boundingBox->x + boundingBox->width < 0) || + (boundingBox->y + boundingBox->height < 0); +} + +void Clay__CalculateFinalLayout(void) { + Clay_Context* context = Clay_GetCurrentContext(); + // Calculate sizing along the X axis + Clay__SizeContainersAlongAxis(true); + + // Wrap text + for (int32_t textElementIndex = 0; textElementIndex < context->textElementData.length; ++textElementIndex) { + Clay__TextElementData *textElementData = Clay__TextElementDataArray_Get(&context->textElementData, textElementIndex); + textElementData->wrappedLines = CLAY__INIT(Clay__WrappedTextLineArraySlice) { .length = 0, .internalArray = &context->wrappedTextLines.internalArray[context->wrappedTextLines.length] }; + Clay_LayoutElement *containerElement = Clay_LayoutElementArray_Get(&context->layoutElements, (int)textElementData->elementIndex); + Clay_TextElementConfig *textConfig = Clay__FindElementConfigWithType(containerElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT).textElementConfig; + Clay__MeasureTextCacheItem *measureTextCacheItem = Clay__MeasureTextCached(&textElementData->text, textConfig); + float lineWidth = 0; + float lineHeight = textConfig->lineHeight > 0 ? (float)textConfig->lineHeight : textElementData->preferredDimensions.height; + int32_t lineLengthChars = 0; + int32_t lineStartOffset = 0; + if (!measureTextCacheItem->containsNewlines && textElementData->preferredDimensions.width <= containerElement->dimensions.width) { + Clay__WrappedTextLineArray_Add(&context->wrappedTextLines, CLAY__INIT(Clay__WrappedTextLine) { containerElement->dimensions, textElementData->text }); + textElementData->wrappedLines.length++; + continue; + } + float spaceWidth = Clay__MeasureText(CLAY__INIT(Clay_StringSlice) { .length = 1, .chars = CLAY__SPACECHAR.chars, .baseChars = CLAY__SPACECHAR.chars }, textConfig, context->measureTextUserData).width; + int32_t wordIndex = measureTextCacheItem->measuredWordsStartIndex; + while (wordIndex != -1) { + if (context->wrappedTextLines.length > context->wrappedTextLines.capacity - 1) { + break; + } + Clay__MeasuredWord *measuredWord = Clay__MeasuredWordArray_Get(&context->measuredWords, wordIndex); + // Only word on the line is too large, just render it anyway + if (lineLengthChars == 0 && lineWidth + measuredWord->width > containerElement->dimensions.width) { + Clay__WrappedTextLineArray_Add(&context->wrappedTextLines, CLAY__INIT(Clay__WrappedTextLine) { { measuredWord->width, lineHeight }, { .length = measuredWord->length, .chars = &textElementData->text.chars[measuredWord->startOffset] } }); + textElementData->wrappedLines.length++; + wordIndex = measuredWord->next; + lineStartOffset = measuredWord->startOffset + measuredWord->length; + } + // measuredWord->length == 0 means a newline character + else if (measuredWord->length == 0 || lineWidth + measuredWord->width > containerElement->dimensions.width) { + // Wrapped text lines list has overflowed, just render out the line + bool finalCharIsSpace = textElementData->text.chars[CLAY__MAX(lineStartOffset + lineLengthChars - 1, 0)] == ' '; + Clay__WrappedTextLineArray_Add(&context->wrappedTextLines, CLAY__INIT(Clay__WrappedTextLine) { { lineWidth + (finalCharIsSpace ? -spaceWidth : 0), lineHeight }, { .length = lineLengthChars + (finalCharIsSpace ? -1 : 0), .chars = &textElementData->text.chars[lineStartOffset] } }); + textElementData->wrappedLines.length++; + if (lineLengthChars == 0 || measuredWord->length == 0) { + wordIndex = measuredWord->next; + } + lineWidth = 0; + lineLengthChars = 0; + lineStartOffset = measuredWord->startOffset; + } else { + lineWidth += measuredWord->width + textConfig->letterSpacing; + lineLengthChars += measuredWord->length; + wordIndex = measuredWord->next; + } + } + if (lineLengthChars > 0) { + Clay__WrappedTextLineArray_Add(&context->wrappedTextLines, CLAY__INIT(Clay__WrappedTextLine) { { lineWidth - textConfig->letterSpacing, lineHeight }, {.length = lineLengthChars, .chars = &textElementData->text.chars[lineStartOffset] } }); + textElementData->wrappedLines.length++; + } + containerElement->dimensions.height = lineHeight * (float)textElementData->wrappedLines.length; + } + + // Scale vertical heights according to aspect ratio + for (int32_t i = 0; i < context->aspectRatioElementIndexes.length; ++i) { + Clay_LayoutElement* aspectElement = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&context->aspectRatioElementIndexes, i)); + Clay_AspectRatioElementConfig *config = Clay__FindElementConfigWithType(aspectElement, CLAY__ELEMENT_CONFIG_TYPE_ASPECT).aspectRatioElementConfig; + aspectElement->dimensions.height = (1 / config->aspectRatio) * aspectElement->dimensions.width; + aspectElement->layoutConfig->sizing.height.size.minMax.max = aspectElement->dimensions.height; + } + + // Propagate effect of text wrapping, aspect scaling etc. on height of parents + Clay__LayoutElementTreeNodeArray dfsBuffer = context->layoutElementTreeNodeArray1; + dfsBuffer.length = 0; + for (int32_t i = 0; i < context->layoutElementTreeRoots.length; ++i) { + Clay__LayoutElementTreeRoot *root = Clay__LayoutElementTreeRootArray_Get(&context->layoutElementTreeRoots, i); + context->treeNodeVisited.internalArray[dfsBuffer.length] = false; + Clay__LayoutElementTreeNodeArray_Add(&dfsBuffer, CLAY__INIT(Clay__LayoutElementTreeNode) { .layoutElement = Clay_LayoutElementArray_Get(&context->layoutElements, (int)root->layoutElementIndex) }); + } + while (dfsBuffer.length > 0) { + Clay__LayoutElementTreeNode *currentElementTreeNode = Clay__LayoutElementTreeNodeArray_Get(&dfsBuffer, (int)dfsBuffer.length - 1); + Clay_LayoutElement *currentElement = currentElementTreeNode->layoutElement; + if (!context->treeNodeVisited.internalArray[dfsBuffer.length - 1]) { + context->treeNodeVisited.internalArray[dfsBuffer.length - 1] = true; + // If the element has no children or is the container for a text element, don't bother inspecting it + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) || currentElement->childrenOrTextContent.children.length == 0) { + dfsBuffer.length--; + continue; + } + // Add the children to the DFS buffer (needs to be pushed in reverse so that stack traversal is in correct layout order) + for (int32_t i = 0; i < currentElement->childrenOrTextContent.children.length; i++) { + context->treeNodeVisited.internalArray[dfsBuffer.length] = false; + Clay__LayoutElementTreeNodeArray_Add(&dfsBuffer, CLAY__INIT(Clay__LayoutElementTreeNode) { .layoutElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[i]) }); + } + continue; + } + dfsBuffer.length--; + + // DFS node has been visited, this is on the way back up to the root + Clay_LayoutConfig *layoutConfig = currentElement->layoutConfig; + if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { + // Resize any parent containers that have grown in height along their non layout axis + for (int32_t j = 0; j < currentElement->childrenOrTextContent.children.length; ++j) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[j]); + float childHeightWithPadding = CLAY__MAX(childElement->dimensions.height + layoutConfig->padding.top + layoutConfig->padding.bottom, currentElement->dimensions.height); + currentElement->dimensions.height = CLAY__MIN(CLAY__MAX(childHeightWithPadding, layoutConfig->sizing.height.size.minMax.min), layoutConfig->sizing.height.size.minMax.max); + } + } else if (layoutConfig->layoutDirection == CLAY_TOP_TO_BOTTOM) { + // Resizing along the layout axis + float contentHeight = (float)(layoutConfig->padding.top + layoutConfig->padding.bottom); + for (int32_t j = 0; j < currentElement->childrenOrTextContent.children.length; ++j) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[j]); + contentHeight += childElement->dimensions.height; + } + contentHeight += (float)(CLAY__MAX(currentElement->childrenOrTextContent.children.length - 1, 0) * layoutConfig->childGap); + currentElement->dimensions.height = CLAY__MIN(CLAY__MAX(contentHeight, layoutConfig->sizing.height.size.minMax.min), layoutConfig->sizing.height.size.minMax.max); + } + } + + // Calculate sizing along the Y axis + Clay__SizeContainersAlongAxis(false); + + // Scale horizontal widths according to aspect ratio + for (int32_t i = 0; i < context->aspectRatioElementIndexes.length; ++i) { + Clay_LayoutElement* aspectElement = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&context->aspectRatioElementIndexes, i)); + Clay_AspectRatioElementConfig *config = Clay__FindElementConfigWithType(aspectElement, CLAY__ELEMENT_CONFIG_TYPE_ASPECT).aspectRatioElementConfig; + aspectElement->dimensions.width = config->aspectRatio * aspectElement->dimensions.height; + } + + // Sort tree roots by z-index + int32_t sortMax = context->layoutElementTreeRoots.length - 1; + while (sortMax > 0) { // todo dumb bubble sort + for (int32_t i = 0; i < sortMax; ++i) { + Clay__LayoutElementTreeRoot current = *Clay__LayoutElementTreeRootArray_Get(&context->layoutElementTreeRoots, i); + Clay__LayoutElementTreeRoot next = *Clay__LayoutElementTreeRootArray_Get(&context->layoutElementTreeRoots, i + 1); + if (next.zIndex < current.zIndex) { + Clay__LayoutElementTreeRootArray_Set(&context->layoutElementTreeRoots, i, next); + Clay__LayoutElementTreeRootArray_Set(&context->layoutElementTreeRoots, i + 1, current); + } + } + sortMax--; + } + + // Calculate final positions and generate render commands + context->renderCommands.length = 0; + dfsBuffer.length = 0; + for (int32_t rootIndex = 0; rootIndex < context->layoutElementTreeRoots.length; ++rootIndex) { + dfsBuffer.length = 0; + Clay__LayoutElementTreeRoot *root = Clay__LayoutElementTreeRootArray_Get(&context->layoutElementTreeRoots, rootIndex); + Clay_LayoutElement *rootElement = Clay_LayoutElementArray_Get(&context->layoutElements, (int)root->layoutElementIndex); + Clay_Vector2 rootPosition = CLAY__DEFAULT_STRUCT; + Clay_LayoutElementHashMapItem *parentHashMapItem = Clay__GetHashMapItem(root->parentId); + // Position root floating containers + if (Clay__ElementHasConfig(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING) && parentHashMapItem) { + Clay_FloatingElementConfig *config = Clay__FindElementConfigWithType(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING).floatingElementConfig; + Clay_Dimensions rootDimensions = rootElement->dimensions; + Clay_BoundingBox parentBoundingBox = parentHashMapItem->boundingBox; + // Set X position + Clay_Vector2 targetAttachPosition = CLAY__DEFAULT_STRUCT; + switch (config->attachPoints.parent) { + case CLAY_ATTACH_POINT_LEFT_TOP: + case CLAY_ATTACH_POINT_LEFT_CENTER: + case CLAY_ATTACH_POINT_LEFT_BOTTOM: targetAttachPosition.x = parentBoundingBox.x; break; + case CLAY_ATTACH_POINT_CENTER_TOP: + case CLAY_ATTACH_POINT_CENTER_CENTER: + case CLAY_ATTACH_POINT_CENTER_BOTTOM: targetAttachPosition.x = parentBoundingBox.x + (parentBoundingBox.width / 2); break; + case CLAY_ATTACH_POINT_RIGHT_TOP: + case CLAY_ATTACH_POINT_RIGHT_CENTER: + case CLAY_ATTACH_POINT_RIGHT_BOTTOM: targetAttachPosition.x = parentBoundingBox.x + parentBoundingBox.width; break; + } + switch (config->attachPoints.element) { + case CLAY_ATTACH_POINT_LEFT_TOP: + case CLAY_ATTACH_POINT_LEFT_CENTER: + case CLAY_ATTACH_POINT_LEFT_BOTTOM: break; + case CLAY_ATTACH_POINT_CENTER_TOP: + case CLAY_ATTACH_POINT_CENTER_CENTER: + case CLAY_ATTACH_POINT_CENTER_BOTTOM: targetAttachPosition.x -= (rootDimensions.width / 2); break; + case CLAY_ATTACH_POINT_RIGHT_TOP: + case CLAY_ATTACH_POINT_RIGHT_CENTER: + case CLAY_ATTACH_POINT_RIGHT_BOTTOM: targetAttachPosition.x -= rootDimensions.width; break; + } + switch (config->attachPoints.parent) { // I know I could merge the x and y switch statements, but this is easier to read + case CLAY_ATTACH_POINT_LEFT_TOP: + case CLAY_ATTACH_POINT_RIGHT_TOP: + case CLAY_ATTACH_POINT_CENTER_TOP: targetAttachPosition.y = parentBoundingBox.y; break; + case CLAY_ATTACH_POINT_LEFT_CENTER: + case CLAY_ATTACH_POINT_CENTER_CENTER: + case CLAY_ATTACH_POINT_RIGHT_CENTER: targetAttachPosition.y = parentBoundingBox.y + (parentBoundingBox.height / 2); break; + case CLAY_ATTACH_POINT_LEFT_BOTTOM: + case CLAY_ATTACH_POINT_CENTER_BOTTOM: + case CLAY_ATTACH_POINT_RIGHT_BOTTOM: targetAttachPosition.y = parentBoundingBox.y + parentBoundingBox.height; break; + } + switch (config->attachPoints.element) { + case CLAY_ATTACH_POINT_LEFT_TOP: + case CLAY_ATTACH_POINT_RIGHT_TOP: + case CLAY_ATTACH_POINT_CENTER_TOP: break; + case CLAY_ATTACH_POINT_LEFT_CENTER: + case CLAY_ATTACH_POINT_CENTER_CENTER: + case CLAY_ATTACH_POINT_RIGHT_CENTER: targetAttachPosition.y -= (rootDimensions.height / 2); break; + case CLAY_ATTACH_POINT_LEFT_BOTTOM: + case CLAY_ATTACH_POINT_CENTER_BOTTOM: + case CLAY_ATTACH_POINT_RIGHT_BOTTOM: targetAttachPosition.y -= rootDimensions.height; break; + } + targetAttachPosition.x += config->offset.x; + targetAttachPosition.y += config->offset.y; + rootPosition = targetAttachPosition; + } + if (root->clipElementId) { + Clay_LayoutElementHashMapItem *clipHashMapItem = Clay__GetHashMapItem(root->clipElementId); + if (clipHashMapItem) { + // Floating elements that are attached to scrolling contents won't be correctly positioned if external scroll handling is enabled, fix here + if (context->externalScrollHandlingEnabled) { + Clay_ClipElementConfig *clipConfig = Clay__FindElementConfigWithType(clipHashMapItem->layoutElement, CLAY__ELEMENT_CONFIG_TYPE_CLIP).clipElementConfig; + if (clipConfig->horizontal) { + rootPosition.x += clipConfig->childOffset.x; + } + if (clipConfig->vertical) { + rootPosition.y += clipConfig->childOffset.y; + } + } + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) { + .boundingBox = clipHashMapItem->boundingBox, + .userData = 0, + .id = Clay__HashNumber(rootElement->id, rootElement->childrenOrTextContent.children.length + 10).id, // TODO need a better strategy for managing derived ids + .zIndex = root->zIndex, + .commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_START, + }); + } + } + Clay__LayoutElementTreeNodeArray_Add(&dfsBuffer, CLAY__INIT(Clay__LayoutElementTreeNode) { .layoutElement = rootElement, .position = rootPosition, .nextChildOffset = { .x = (float)rootElement->layoutConfig->padding.left, .y = (float)rootElement->layoutConfig->padding.top } }); + + context->treeNodeVisited.internalArray[0] = false; + while (dfsBuffer.length > 0) { + Clay__LayoutElementTreeNode *currentElementTreeNode = Clay__LayoutElementTreeNodeArray_Get(&dfsBuffer, (int)dfsBuffer.length - 1); + Clay_LayoutElement *currentElement = currentElementTreeNode->layoutElement; + Clay_LayoutConfig *layoutConfig = currentElement->layoutConfig; + Clay_Vector2 scrollOffset = CLAY__DEFAULT_STRUCT; + + // This will only be run a single time for each element in downwards DFS order + if (!context->treeNodeVisited.internalArray[dfsBuffer.length - 1]) { + context->treeNodeVisited.internalArray[dfsBuffer.length - 1] = true; + + Clay_BoundingBox currentElementBoundingBox = { currentElementTreeNode->position.x, currentElementTreeNode->position.y, currentElement->dimensions.width, currentElement->dimensions.height }; + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING)) { + Clay_FloatingElementConfig *floatingElementConfig = Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING).floatingElementConfig; + Clay_Dimensions expand = floatingElementConfig->expand; + currentElementBoundingBox.x -= expand.width; + currentElementBoundingBox.width += expand.width * 2; + currentElementBoundingBox.y -= expand.height; + currentElementBoundingBox.height += expand.height * 2; + } + + Clay__ScrollContainerDataInternal *scrollContainerData = CLAY__NULL; + // Apply scroll offsets to container + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_CLIP)) { + Clay_ClipElementConfig *clipConfig = Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_CLIP).clipElementConfig; + + // This linear scan could theoretically be slow under very strange conditions, but I can't imagine a real UI with more than a few 10's of scroll containers + for (int32_t i = 0; i < context->scrollContainerDatas.length; i++) { + Clay__ScrollContainerDataInternal *mapping = Clay__ScrollContainerDataInternalArray_Get(&context->scrollContainerDatas, i); + if (mapping->layoutElement == currentElement) { + scrollContainerData = mapping; + mapping->boundingBox = currentElementBoundingBox; + scrollOffset = clipConfig->childOffset; + if (context->externalScrollHandlingEnabled) { + scrollOffset = CLAY__INIT(Clay_Vector2) CLAY__DEFAULT_STRUCT; + } + break; + } + } + } + + Clay_LayoutElementHashMapItem *hashMapItem = Clay__GetHashMapItem(currentElement->id); + if (hashMapItem) { + hashMapItem->boundingBox = currentElementBoundingBox; + } + + int32_t sortedConfigIndexes[20]; + for (int32_t elementConfigIndex = 0; elementConfigIndex < currentElement->elementConfigs.length; ++elementConfigIndex) { + sortedConfigIndexes[elementConfigIndex] = elementConfigIndex; + } + sortMax = currentElement->elementConfigs.length - 1; + while (sortMax > 0) { // todo dumb bubble sort + for (int32_t i = 0; i < sortMax; ++i) { + int32_t current = sortedConfigIndexes[i]; + int32_t next = sortedConfigIndexes[i + 1]; + Clay__ElementConfigType currentType = Clay__ElementConfigArraySlice_Get(¤tElement->elementConfigs, current)->type; + Clay__ElementConfigType nextType = Clay__ElementConfigArraySlice_Get(¤tElement->elementConfigs, next)->type; + if (nextType == CLAY__ELEMENT_CONFIG_TYPE_CLIP || currentType == CLAY__ELEMENT_CONFIG_TYPE_BORDER) { + sortedConfigIndexes[i] = next; + sortedConfigIndexes[i + 1] = current; + } + } + sortMax--; + } + + bool emitRectangle = false; + // Create the render commands for this element + Clay_SharedElementConfig *sharedConfig = Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_SHARED).sharedElementConfig; + if (sharedConfig && sharedConfig->backgroundColor.a > 0) { + emitRectangle = true; + } + else if (!sharedConfig) { + emitRectangle = false; + sharedConfig = &Clay_SharedElementConfig_DEFAULT; + } + for (int32_t elementConfigIndex = 0; elementConfigIndex < currentElement->elementConfigs.length; ++elementConfigIndex) { + Clay_ElementConfig *elementConfig = Clay__ElementConfigArraySlice_Get(¤tElement->elementConfigs, sortedConfigIndexes[elementConfigIndex]); + Clay_RenderCommand renderCommand = { + .boundingBox = currentElementBoundingBox, + .userData = sharedConfig->userData, + .id = currentElement->id, + }; + + bool offscreen = Clay__ElementIsOffscreen(¤tElementBoundingBox); + // Culling - Don't bother to generate render commands for rectangles entirely outside the screen - this won't stop their children from being rendered if they overflow + bool shouldRender = !offscreen; + switch (elementConfig->type) { + case CLAY__ELEMENT_CONFIG_TYPE_ASPECT: + case CLAY__ELEMENT_CONFIG_TYPE_FLOATING: + case CLAY__ELEMENT_CONFIG_TYPE_SHARED: + case CLAY__ELEMENT_CONFIG_TYPE_BORDER: { + shouldRender = false; + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_CLIP: { + renderCommand.commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_START; + renderCommand.renderData = CLAY__INIT(Clay_RenderData) { + .clip = { + .horizontal = elementConfig->config.clipElementConfig->horizontal, + .vertical = elementConfig->config.clipElementConfig->vertical, + } + }; + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_IMAGE: { + renderCommand.commandType = CLAY_RENDER_COMMAND_TYPE_IMAGE; + renderCommand.renderData = CLAY__INIT(Clay_RenderData) { + .image = { + .backgroundColor = sharedConfig->backgroundColor, + .cornerRadius = sharedConfig->cornerRadius, + .imageData = elementConfig->config.imageElementConfig->imageData, + } + }; + emitRectangle = false; + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_TEXT: { + if (!shouldRender) { + break; + } + shouldRender = false; + Clay_ElementConfigUnion configUnion = elementConfig->config; + Clay_TextElementConfig *textElementConfig = configUnion.textElementConfig; + float naturalLineHeight = currentElement->childrenOrTextContent.textElementData->preferredDimensions.height; + float finalLineHeight = textElementConfig->lineHeight > 0 ? (float)textElementConfig->lineHeight : naturalLineHeight; + float lineHeightOffset = (finalLineHeight - naturalLineHeight) / 2; + float yPosition = lineHeightOffset; + for (int32_t lineIndex = 0; lineIndex < currentElement->childrenOrTextContent.textElementData->wrappedLines.length; ++lineIndex) { + Clay__WrappedTextLine *wrappedLine = Clay__WrappedTextLineArraySlice_Get(¤tElement->childrenOrTextContent.textElementData->wrappedLines, lineIndex); + if (wrappedLine->line.length == 0) { + yPosition += finalLineHeight; + continue; + } + float offset = (currentElementBoundingBox.width - wrappedLine->dimensions.width); + if (textElementConfig->textAlignment == CLAY_TEXT_ALIGN_LEFT) { + offset = 0; + } + if (textElementConfig->textAlignment == CLAY_TEXT_ALIGN_CENTER) { + offset /= 2; + } + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) { + .boundingBox = { currentElementBoundingBox.x + offset, currentElementBoundingBox.y + yPosition, wrappedLine->dimensions.width, wrappedLine->dimensions.height }, + .renderData = { .text = { + .stringContents = CLAY__INIT(Clay_StringSlice) { .length = wrappedLine->line.length, .chars = wrappedLine->line.chars, .baseChars = currentElement->childrenOrTextContent.textElementData->text.chars }, + .textColor = textElementConfig->textColor, + .fontId = textElementConfig->fontId, + .fontSize = textElementConfig->fontSize, + .letterSpacing = textElementConfig->letterSpacing, + .lineHeight = textElementConfig->lineHeight, + }}, + .userData = textElementConfig->userData, + .id = Clay__HashNumber(lineIndex, currentElement->id).id, + .zIndex = root->zIndex, + .commandType = CLAY_RENDER_COMMAND_TYPE_TEXT, + }); + yPosition += finalLineHeight; + + if (!context->disableCulling && (currentElementBoundingBox.y + yPosition > context->layoutDimensions.height)) { + break; + } + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_CUSTOM: { + renderCommand.commandType = CLAY_RENDER_COMMAND_TYPE_CUSTOM; + renderCommand.renderData = CLAY__INIT(Clay_RenderData) { + .custom = { + .backgroundColor = sharedConfig->backgroundColor, + .cornerRadius = sharedConfig->cornerRadius, + .customData = elementConfig->config.customElementConfig->customData, + } + }; + emitRectangle = false; + break; + } + default: break; + } + if (shouldRender) { + Clay__AddRenderCommand(renderCommand); + } + if (offscreen) { + // NOTE: You may be tempted to try an early return / continue if an element is off screen. Why bother calculating layout for its children, right? + // Unfortunately, a FLOATING_CONTAINER may be defined that attaches to a child or grandchild of this element, which is large enough to still + // be on screen, even if this element isn't. That depends on this element and it's children being laid out correctly (even if they are entirely off screen) + } + } + + if (emitRectangle) { + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) { + .boundingBox = currentElementBoundingBox, + .renderData = { .rectangle = { + .backgroundColor = sharedConfig->backgroundColor, + .cornerRadius = sharedConfig->cornerRadius, + }}, + .userData = sharedConfig->userData, + .id = currentElement->id, + .zIndex = root->zIndex, + .commandType = CLAY_RENDER_COMMAND_TYPE_RECTANGLE, + }); + } + + // Setup initial on-axis alignment + if (!Clay__ElementHasConfig(currentElementTreeNode->layoutElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT)) { + Clay_Dimensions contentSize = {0,0}; + if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { + for (int32_t i = 0; i < currentElement->childrenOrTextContent.children.length; ++i) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[i]); + contentSize.width += childElement->dimensions.width; + contentSize.height = CLAY__MAX(contentSize.height, childElement->dimensions.height); + } + contentSize.width += (float)(CLAY__MAX(currentElement->childrenOrTextContent.children.length - 1, 0) * layoutConfig->childGap); + float extraSpace = currentElement->dimensions.width - (float)(layoutConfig->padding.left + layoutConfig->padding.right) - contentSize.width; + switch (layoutConfig->childAlignment.x) { + case CLAY_ALIGN_X_LEFT: extraSpace = 0; break; + case CLAY_ALIGN_X_CENTER: extraSpace /= 2; break; + default: break; + } + currentElementTreeNode->nextChildOffset.x += extraSpace; + extraSpace = CLAY__MAX(0, extraSpace); + } else { + for (int32_t i = 0; i < currentElement->childrenOrTextContent.children.length; ++i) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[i]); + contentSize.width = CLAY__MAX(contentSize.width, childElement->dimensions.width); + contentSize.height += childElement->dimensions.height; + } + contentSize.height += (float)(CLAY__MAX(currentElement->childrenOrTextContent.children.length - 1, 0) * layoutConfig->childGap); + float extraSpace = currentElement->dimensions.height - (float)(layoutConfig->padding.top + layoutConfig->padding.bottom) - contentSize.height; + switch (layoutConfig->childAlignment.y) { + case CLAY_ALIGN_Y_TOP: extraSpace = 0; break; + case CLAY_ALIGN_Y_CENTER: extraSpace /= 2; break; + default: break; + } + extraSpace = CLAY__MAX(0, extraSpace); + currentElementTreeNode->nextChildOffset.y += extraSpace; + } + + if (scrollContainerData) { + scrollContainerData->contentSize = CLAY__INIT(Clay_Dimensions) { contentSize.width + (float)(layoutConfig->padding.left + layoutConfig->padding.right), contentSize.height + (float)(layoutConfig->padding.top + layoutConfig->padding.bottom) }; + } + } + } + else { + // DFS is returning upwards backwards + bool closeClipElement = false; + Clay_ClipElementConfig *clipConfig = Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_CLIP).clipElementConfig; + if (clipConfig) { + closeClipElement = true; + for (int32_t i = 0; i < context->scrollContainerDatas.length; i++) { + Clay__ScrollContainerDataInternal *mapping = Clay__ScrollContainerDataInternalArray_Get(&context->scrollContainerDatas, i); + if (mapping->layoutElement == currentElement) { + scrollOffset = clipConfig->childOffset; + if (context->externalScrollHandlingEnabled) { + scrollOffset = CLAY__INIT(Clay_Vector2) CLAY__DEFAULT_STRUCT; + } + break; + } + } + } + + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_BORDER)) { + Clay_LayoutElementHashMapItem *currentElementData = Clay__GetHashMapItem(currentElement->id); + Clay_BoundingBox currentElementBoundingBox = currentElementData->boundingBox; + + // Culling - Don't bother to generate render commands for rectangles entirely outside the screen - this won't stop their children from being rendered if they overflow + if (!Clay__ElementIsOffscreen(¤tElementBoundingBox)) { + Clay_SharedElementConfig *sharedConfig = Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_SHARED) ? Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_SHARED).sharedElementConfig : &Clay_SharedElementConfig_DEFAULT; + Clay_BorderElementConfig *borderConfig = Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_BORDER).borderElementConfig; + Clay_RenderCommand renderCommand = { + .boundingBox = currentElementBoundingBox, + .renderData = { .border = { + .color = borderConfig->color, + .cornerRadius = sharedConfig->cornerRadius, + .width = borderConfig->width + }}, + .userData = sharedConfig->userData, + .id = Clay__HashNumber(currentElement->id, currentElement->childrenOrTextContent.children.length).id, + .commandType = CLAY_RENDER_COMMAND_TYPE_BORDER, + }; + Clay__AddRenderCommand(renderCommand); + if (borderConfig->width.betweenChildren > 0 && borderConfig->color.a > 0) { + float halfGap = layoutConfig->childGap / 2; + Clay_Vector2 borderOffset = { (float)layoutConfig->padding.left - halfGap, (float)layoutConfig->padding.top - halfGap }; + if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { + for (int32_t i = 0; i < currentElement->childrenOrTextContent.children.length; ++i) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[i]); + if (i > 0) { + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) { + .boundingBox = { currentElementBoundingBox.x + borderOffset.x + scrollOffset.x, currentElementBoundingBox.y + scrollOffset.y, (float)borderConfig->width.betweenChildren, currentElement->dimensions.height }, + .renderData = { .rectangle = { + .backgroundColor = borderConfig->color, + } }, + .userData = sharedConfig->userData, + .id = Clay__HashNumber(currentElement->id, currentElement->childrenOrTextContent.children.length + 1 + i).id, + .commandType = CLAY_RENDER_COMMAND_TYPE_RECTANGLE, + }); + } + borderOffset.x += (childElement->dimensions.width + (float)layoutConfig->childGap); + } + } else { + for (int32_t i = 0; i < currentElement->childrenOrTextContent.children.length; ++i) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[i]); + if (i > 0) { + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) { + .boundingBox = { currentElementBoundingBox.x + scrollOffset.x, currentElementBoundingBox.y + borderOffset.y + scrollOffset.y, currentElement->dimensions.width, (float)borderConfig->width.betweenChildren }, + .renderData = { .rectangle = { + .backgroundColor = borderConfig->color, + } }, + .userData = sharedConfig->userData, + .id = Clay__HashNumber(currentElement->id, currentElement->childrenOrTextContent.children.length + 1 + i).id, + .commandType = CLAY_RENDER_COMMAND_TYPE_RECTANGLE, + }); + } + borderOffset.y += (childElement->dimensions.height + (float)layoutConfig->childGap); + } + } + } + } + } + // This exists because the scissor needs to end _after_ borders between elements + if (closeClipElement) { + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) { + .id = Clay__HashNumber(currentElement->id, rootElement->childrenOrTextContent.children.length + 11).id, + .commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_END, + }); + } + + dfsBuffer.length--; + continue; + } + + // Add children to the DFS buffer + if (!Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT)) { + dfsBuffer.length += currentElement->childrenOrTextContent.children.length; + for (int32_t i = 0; i < currentElement->childrenOrTextContent.children.length; ++i) { + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&context->layoutElements, currentElement->childrenOrTextContent.children.elements[i]); + // Alignment along non layout axis + if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { + currentElementTreeNode->nextChildOffset.y = currentElement->layoutConfig->padding.top; + float whiteSpaceAroundChild = currentElement->dimensions.height - (float)(layoutConfig->padding.top + layoutConfig->padding.bottom) - childElement->dimensions.height; + switch (layoutConfig->childAlignment.y) { + case CLAY_ALIGN_Y_TOP: break; + case CLAY_ALIGN_Y_CENTER: currentElementTreeNode->nextChildOffset.y += whiteSpaceAroundChild / 2; break; + case CLAY_ALIGN_Y_BOTTOM: currentElementTreeNode->nextChildOffset.y += whiteSpaceAroundChild; break; + } + } else { + currentElementTreeNode->nextChildOffset.x = currentElement->layoutConfig->padding.left; + float whiteSpaceAroundChild = currentElement->dimensions.width - (float)(layoutConfig->padding.left + layoutConfig->padding.right) - childElement->dimensions.width; + switch (layoutConfig->childAlignment.x) { + case CLAY_ALIGN_X_LEFT: break; + case CLAY_ALIGN_X_CENTER: currentElementTreeNode->nextChildOffset.x += whiteSpaceAroundChild / 2; break; + case CLAY_ALIGN_X_RIGHT: currentElementTreeNode->nextChildOffset.x += whiteSpaceAroundChild; break; + } + } + + Clay_Vector2 childPosition = { + currentElementTreeNode->position.x + currentElementTreeNode->nextChildOffset.x + scrollOffset.x, + currentElementTreeNode->position.y + currentElementTreeNode->nextChildOffset.y + scrollOffset.y, + }; + + // DFS buffer elements need to be added in reverse because stack traversal happens backwards + uint32_t newNodeIndex = dfsBuffer.length - 1 - i; + dfsBuffer.internalArray[newNodeIndex] = CLAY__INIT(Clay__LayoutElementTreeNode) { + .layoutElement = childElement, + .position = { childPosition.x, childPosition.y }, + .nextChildOffset = { .x = (float)childElement->layoutConfig->padding.left, .y = (float)childElement->layoutConfig->padding.top }, + }; + context->treeNodeVisited.internalArray[newNodeIndex] = false; + + // Update parent offsets + if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { + currentElementTreeNode->nextChildOffset.x += childElement->dimensions.width + (float)layoutConfig->childGap; + } else { + currentElementTreeNode->nextChildOffset.y += childElement->dimensions.height + (float)layoutConfig->childGap; + } + } + } + } + + if (root->clipElementId) { + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) { .id = Clay__HashNumber(rootElement->id, rootElement->childrenOrTextContent.children.length + 11).id, .commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_END }); + } + } +} + +CLAY_WASM_EXPORT("Clay_GetPointerOverIds") +CLAY_DLL_EXPORT Clay_ElementIdArray Clay_GetPointerOverIds(void) { + return Clay_GetCurrentContext()->pointerOverIds; +} + +#pragma region DebugTools +Clay_Color CLAY__DEBUGVIEW_COLOR_1 = {58, 56, 52, 255}; +Clay_Color CLAY__DEBUGVIEW_COLOR_2 = {62, 60, 58, 255}; +Clay_Color CLAY__DEBUGVIEW_COLOR_3 = {141, 133, 135, 255}; +Clay_Color CLAY__DEBUGVIEW_COLOR_4 = {238, 226, 231, 255}; +Clay_Color CLAY__DEBUGVIEW_COLOR_SELECTED_ROW = {102, 80, 78, 255}; +const int32_t CLAY__DEBUGVIEW_ROW_HEIGHT = 30; +const int32_t CLAY__DEBUGVIEW_OUTER_PADDING = 10; +const int32_t CLAY__DEBUGVIEW_INDENT_WIDTH = 16; +Clay_TextElementConfig Clay__DebugView_TextNameConfig = {.textColor = {238, 226, 231, 255}, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE }; +Clay_LayoutConfig Clay__DebugView_ScrollViewItemLayoutConfig = CLAY__DEFAULT_STRUCT; + +typedef struct { + Clay_String label; + Clay_Color color; +} Clay__DebugElementConfigTypeLabelConfig; + +Clay__DebugElementConfigTypeLabelConfig Clay__DebugGetElementConfigTypeLabel(Clay__ElementConfigType type) { + switch (type) { + case CLAY__ELEMENT_CONFIG_TYPE_SHARED: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Shared"), {243,134,48,255} }; + case CLAY__ELEMENT_CONFIG_TYPE_TEXT: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Text"), {105,210,231,255} }; + case CLAY__ELEMENT_CONFIG_TYPE_ASPECT: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Aspect"), {101,149,194,255} }; + case CLAY__ELEMENT_CONFIG_TYPE_IMAGE: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Image"), {121,189,154,255} }; + case CLAY__ELEMENT_CONFIG_TYPE_FLOATING: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Floating"), {250,105,0,255} }; + case CLAY__ELEMENT_CONFIG_TYPE_CLIP: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) {CLAY_STRING("Scroll"), {242, 196, 90, 255} }; + case CLAY__ELEMENT_CONFIG_TYPE_BORDER: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) {CLAY_STRING("Border"), {108, 91, 123, 255} }; + case CLAY__ELEMENT_CONFIG_TYPE_CUSTOM: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Custom"), {11,72,107,255} }; + default: break; + } + return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Error"), {0,0,0,255} }; +} + +typedef struct { + int32_t rowCount; + int32_t selectedElementRowIndex; +} Clay__RenderDebugLayoutData; + +// Returns row count +Clay__RenderDebugLayoutData Clay__RenderDebugLayoutElementsList(int32_t initialRootsLength, int32_t highlightedRowIndex) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay__int32_tArray dfsBuffer = context->reusableElementIndexBuffer; + Clay__DebugView_ScrollViewItemLayoutConfig = CLAY__INIT(Clay_LayoutConfig) { .sizing = { .height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT) }, .childGap = 6, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER }}; + Clay__RenderDebugLayoutData layoutData = CLAY__DEFAULT_STRUCT; + + uint32_t highlightedElementId = 0; + + for (int32_t rootIndex = 0; rootIndex < initialRootsLength; ++rootIndex) { + dfsBuffer.length = 0; + Clay__LayoutElementTreeRoot *root = Clay__LayoutElementTreeRootArray_Get(&context->layoutElementTreeRoots, rootIndex); + Clay__int32_tArray_Add(&dfsBuffer, (int32_t)root->layoutElementIndex); + context->treeNodeVisited.internalArray[0] = false; + if (rootIndex > 0) { + CLAY(CLAY_IDI("Clay__DebugView_EmptyRowOuter", rootIndex), { .layout = { .sizing = {.width = CLAY_SIZING_GROW(0)}, .padding = {CLAY__DEBUGVIEW_INDENT_WIDTH / 2, 0, 0, 0} } }) { + CLAY(CLAY_IDI("Clay__DebugView_EmptyRow", rootIndex), { .layout = { .sizing = { .width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED((float)CLAY__DEBUGVIEW_ROW_HEIGHT) }}, .border = { .color = CLAY__DEBUGVIEW_COLOR_3, .width = { .top = 1 } } }) {} + } + layoutData.rowCount++; + } + while (dfsBuffer.length > 0) { + int32_t currentElementIndex = Clay__int32_tArray_GetValue(&dfsBuffer, (int)dfsBuffer.length - 1); + Clay_LayoutElement *currentElement = Clay_LayoutElementArray_Get(&context->layoutElements, (int)currentElementIndex); + if (context->treeNodeVisited.internalArray[dfsBuffer.length - 1]) { + if (!Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) && currentElement->childrenOrTextContent.children.length > 0) { + Clay__CloseElement(); + Clay__CloseElement(); + Clay__CloseElement(); + } + dfsBuffer.length--; + continue; + } + + if (highlightedRowIndex == layoutData.rowCount) { + if (context->pointerInfo.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + context->debugSelectedElementId = currentElement->id; + } + highlightedElementId = currentElement->id; + } + + context->treeNodeVisited.internalArray[dfsBuffer.length - 1] = true; + Clay_LayoutElementHashMapItem *currentElementData = Clay__GetHashMapItem(currentElement->id); + bool offscreen = Clay__ElementIsOffscreen(¤tElementData->boundingBox); + if (context->debugSelectedElementId == currentElement->id) { + layoutData.selectedElementRowIndex = layoutData.rowCount; + } + CLAY(CLAY_IDI("Clay__DebugView_ElementOuter", currentElement->id), { .layout = Clay__DebugView_ScrollViewItemLayoutConfig }) { + // Collapse icon / button + if (!(Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) || currentElement->childrenOrTextContent.children.length == 0)) { + CLAY(CLAY_IDI("Clay__DebugView_CollapseElement", currentElement->id), { + .layout = { .sizing = {CLAY_SIZING_FIXED(16), CLAY_SIZING_FIXED(16)}, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER} }, + .cornerRadius = CLAY_CORNER_RADIUS(4), + .border = { .color = CLAY__DEBUGVIEW_COLOR_3, .width = {1, 1, 1, 1, 0} }, + }) { + CLAY_TEXT((currentElementData && currentElementData->debugData->collapsed) ? CLAY_STRING("+") : CLAY_STRING("-"), CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); + } + } else { // Square dot for empty containers + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_FIXED(16), CLAY_SIZING_FIXED(16)}, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER } } }) { + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_FIXED(8), CLAY_SIZING_FIXED(8)} }, .backgroundColor = CLAY__DEBUGVIEW_COLOR_3, .cornerRadius = CLAY_CORNER_RADIUS(2) }) {} + } + } + // Collisions and offscreen info + if (currentElementData) { + if (currentElementData->debugData->collision) { + CLAY_AUTO_ID({ .layout = { .padding = { 8, 8, 2, 2 }}, .border = { .color = {177, 147, 8, 255}, .width = {1, 1, 1, 1, 0} } }) { + CLAY_TEXT(CLAY_STRING("Duplicate ID"), CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16 })); + } + } + if (offscreen) { + CLAY_AUTO_ID({ .layout = { .padding = { 8, 8, 2, 2 } }, .border = { .color = CLAY__DEBUGVIEW_COLOR_3, .width = { 1, 1, 1, 1, 0} } }) { + CLAY_TEXT(CLAY_STRING("Offscreen"), CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16 })); + } + } + } + Clay_String idString = context->layoutElementIdStrings.internalArray[currentElementIndex]; + if (idString.length > 0) { + CLAY_TEXT(idString, offscreen ? CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16 }) : &Clay__DebugView_TextNameConfig); + } + for (int32_t elementConfigIndex = 0; elementConfigIndex < currentElement->elementConfigs.length; ++elementConfigIndex) { + Clay_ElementConfig *elementConfig = Clay__ElementConfigArraySlice_Get(¤tElement->elementConfigs, elementConfigIndex); + if (elementConfig->type == CLAY__ELEMENT_CONFIG_TYPE_SHARED) { + Clay_Color labelColor = {243,134,48,90}; + labelColor.a = 90; + Clay_Color backgroundColor = elementConfig->config.sharedElementConfig->backgroundColor; + Clay_CornerRadius radius = elementConfig->config.sharedElementConfig->cornerRadius; + if (backgroundColor.a > 0) { + CLAY_AUTO_ID({ .layout = { .padding = { 8, 8, 2, 2 } }, .backgroundColor = labelColor, .cornerRadius = CLAY_CORNER_RADIUS(4), .border = { .color = labelColor, .width = { 1, 1, 1, 1, 0} } }) { + CLAY_TEXT(CLAY_STRING("Color"), CLAY_TEXT_CONFIG({ .textColor = offscreen ? CLAY__DEBUGVIEW_COLOR_3 : CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); + } + } + if (radius.bottomLeft > 0) { + CLAY_AUTO_ID({ .layout = { .padding = { 8, 8, 2, 2 } }, .backgroundColor = labelColor, .cornerRadius = CLAY_CORNER_RADIUS(4), .border = { .color = labelColor, .width = { 1, 1, 1, 1, 0 } } }) { + CLAY_TEXT(CLAY_STRING("Radius"), CLAY_TEXT_CONFIG({ .textColor = offscreen ? CLAY__DEBUGVIEW_COLOR_3 : CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); + } + } + continue; + } + Clay__DebugElementConfigTypeLabelConfig config = Clay__DebugGetElementConfigTypeLabel(elementConfig->type); + Clay_Color backgroundColor = config.color; + backgroundColor.a = 90; + CLAY_AUTO_ID({ .layout = { .padding = { 8, 8, 2, 2 } }, .backgroundColor = backgroundColor, .cornerRadius = CLAY_CORNER_RADIUS(4), .border = { .color = config.color, .width = { 1, 1, 1, 1, 0 } } }) { + CLAY_TEXT(config.label, CLAY_TEXT_CONFIG({ .textColor = offscreen ? CLAY__DEBUGVIEW_COLOR_3 : CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); + } + } + } + + // Render the text contents below the element as a non-interactive row + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT)) { + layoutData.rowCount++; + Clay__TextElementData *textElementData = currentElement->childrenOrTextContent.textElementData; + Clay_TextElementConfig *rawTextConfig = offscreen ? CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16 }) : &Clay__DebugView_TextNameConfig; + CLAY_AUTO_ID({ .layout = { .sizing = { .height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER } } }) { + CLAY_AUTO_ID({ .layout = { .sizing = {.width = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_INDENT_WIDTH + 16) } } }) {} + CLAY_TEXT(CLAY_STRING("\""), rawTextConfig); + CLAY_TEXT(textElementData->text.length > 40 ? (CLAY__INIT(Clay_String) { .length = 40, .chars = textElementData->text.chars }) : textElementData->text, rawTextConfig); + if (textElementData->text.length > 40) { + CLAY_TEXT(CLAY_STRING("..."), rawTextConfig); + } + CLAY_TEXT(CLAY_STRING("\""), rawTextConfig); + } + } else if (currentElement->childrenOrTextContent.children.length > 0) { + Clay__OpenElement(); + Clay__ConfigureOpenElement(CLAY__INIT(Clay_ElementDeclaration) { .layout = { .padding = { .left = 8 } } }); + Clay__OpenElement(); + Clay__ConfigureOpenElement(CLAY__INIT(Clay_ElementDeclaration) { .layout = { .padding = { .left = CLAY__DEBUGVIEW_INDENT_WIDTH }}, .border = { .color = CLAY__DEBUGVIEW_COLOR_3, .width = { .left = 1 } }}); + Clay__OpenElement(); + Clay__ConfigureOpenElement(CLAY__INIT(Clay_ElementDeclaration) { .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM } }); + } + + layoutData.rowCount++; + if (!(Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) || (currentElementData && currentElementData->debugData->collapsed))) { + for (int32_t i = currentElement->childrenOrTextContent.children.length - 1; i >= 0; --i) { + Clay__int32_tArray_Add(&dfsBuffer, currentElement->childrenOrTextContent.children.elements[i]); + context->treeNodeVisited.internalArray[dfsBuffer.length - 1] = false; // TODO needs to be ranged checked + } + } + } + } + + if (context->pointerInfo.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + Clay_ElementId collapseButtonId = Clay__HashString(CLAY_STRING("Clay__DebugView_CollapseElement"), 0); + for (int32_t i = (int)context->pointerOverIds.length - 1; i >= 0; i--) { + Clay_ElementId *elementId = Clay_ElementIdArray_Get(&context->pointerOverIds, i); + if (elementId->baseId == collapseButtonId.baseId) { + Clay_LayoutElementHashMapItem *highlightedItem = Clay__GetHashMapItem(elementId->offset); + highlightedItem->debugData->collapsed = !highlightedItem->debugData->collapsed; + break; + } + } + } + + if (highlightedElementId) { + CLAY(CLAY_ID("Clay__DebugView_ElementHighlight"), { .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0)} }, .floating = { .parentId = highlightedElementId, .zIndex = 32767, .pointerCaptureMode = CLAY_POINTER_CAPTURE_MODE_PASSTHROUGH, .attachTo = CLAY_ATTACH_TO_ELEMENT_WITH_ID } }) { + CLAY(CLAY_ID("Clay__DebugView_ElementHighlightRectangle"), { .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0)} }, .backgroundColor = Clay__debugViewHighlightColor }) {} + } + } + return layoutData; +} + +void Clay__RenderDebugLayoutSizing(Clay_SizingAxis sizing, Clay_TextElementConfig *infoTextConfig) { + Clay_String sizingLabel = CLAY_STRING("GROW"); + if (sizing.type == CLAY__SIZING_TYPE_FIT) { + sizingLabel = CLAY_STRING("FIT"); + } else if (sizing.type == CLAY__SIZING_TYPE_PERCENT) { + sizingLabel = CLAY_STRING("PERCENT"); + } else if (sizing.type == CLAY__SIZING_TYPE_FIXED) { + sizingLabel = CLAY_STRING("FIXED"); + } + CLAY_TEXT(sizingLabel, infoTextConfig); + if (sizing.type == CLAY__SIZING_TYPE_GROW || sizing.type == CLAY__SIZING_TYPE_FIT || sizing.type == CLAY__SIZING_TYPE_FIXED) { + CLAY_TEXT(CLAY_STRING("("), infoTextConfig); + if (sizing.size.minMax.min != 0) { + CLAY_TEXT(CLAY_STRING("min: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(sizing.size.minMax.min), infoTextConfig); + if (sizing.size.minMax.max != CLAY__MAXFLOAT) { + CLAY_TEXT(CLAY_STRING(", "), infoTextConfig); + } + } + if (sizing.size.minMax.max != CLAY__MAXFLOAT) { + CLAY_TEXT(CLAY_STRING("max: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(sizing.size.minMax.max), infoTextConfig); + } + CLAY_TEXT(CLAY_STRING(")"), infoTextConfig); + } else if (sizing.type == CLAY__SIZING_TYPE_PERCENT) { + CLAY_TEXT(CLAY_STRING("("), infoTextConfig); + CLAY_TEXT(Clay__IntToString(sizing.size.percent * 100), infoTextConfig); + CLAY_TEXT(CLAY_STRING("%)"), infoTextConfig); + } +} + +void Clay__RenderDebugViewElementConfigHeader(Clay_String elementId, Clay__ElementConfigType type) { + Clay__DebugElementConfigTypeLabelConfig config = Clay__DebugGetElementConfigTypeLabel(type); + Clay_Color backgroundColor = config.color; + backgroundColor.a = 90; + CLAY_AUTO_ID({ .layout = { .sizing = { .width = CLAY_SIZING_GROW(0) }, .padding = CLAY_PADDING_ALL(CLAY__DEBUGVIEW_OUTER_PADDING), .childAlignment = { .y = CLAY_ALIGN_Y_CENTER } } }) { + CLAY_AUTO_ID({ .layout = { .padding = { 8, 8, 2, 2 } }, .backgroundColor = backgroundColor, .cornerRadius = CLAY_CORNER_RADIUS(4), .border = { .color = config.color, .width = { 1, 1, 1, 1, 0 } } }) { + CLAY_TEXT(config.label, CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); + } + CLAY_AUTO_ID({ .layout = { .sizing = { .width = CLAY_SIZING_GROW(0) } } }) {} + CLAY_TEXT(elementId, CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE })); + } +} + +void Clay__RenderDebugViewColor(Clay_Color color, Clay_TextElementConfig *textConfig) { + CLAY_AUTO_ID({ .layout = { .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} } }) { + CLAY_TEXT(CLAY_STRING("{ r: "), textConfig); + CLAY_TEXT(Clay__IntToString(color.r), textConfig); + CLAY_TEXT(CLAY_STRING(", g: "), textConfig); + CLAY_TEXT(Clay__IntToString(color.g), textConfig); + CLAY_TEXT(CLAY_STRING(", b: "), textConfig); + CLAY_TEXT(Clay__IntToString(color.b), textConfig); + CLAY_TEXT(CLAY_STRING(", a: "), textConfig); + CLAY_TEXT(Clay__IntToString(color.a), textConfig); + CLAY_TEXT(CLAY_STRING(" }"), textConfig); + CLAY_AUTO_ID({ .layout = { .sizing = { .width = CLAY_SIZING_FIXED(10) } } }) {} + CLAY_AUTO_ID({ .layout = { .sizing = { CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8)} }, .backgroundColor = color, .cornerRadius = CLAY_CORNER_RADIUS(4), .border = { .color = CLAY__DEBUGVIEW_COLOR_4, .width = { 1, 1, 1, 1, 0 } } }) {} + } +} + +void Clay__RenderDebugViewCornerRadius(Clay_CornerRadius cornerRadius, Clay_TextElementConfig *textConfig) { + CLAY_AUTO_ID({ .layout = { .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} } }) { + CLAY_TEXT(CLAY_STRING("{ topLeft: "), textConfig); + CLAY_TEXT(Clay__IntToString(cornerRadius.topLeft), textConfig); + CLAY_TEXT(CLAY_STRING(", topRight: "), textConfig); + CLAY_TEXT(Clay__IntToString(cornerRadius.topRight), textConfig); + CLAY_TEXT(CLAY_STRING(", bottomLeft: "), textConfig); + CLAY_TEXT(Clay__IntToString(cornerRadius.bottomLeft), textConfig); + CLAY_TEXT(CLAY_STRING(", bottomRight: "), textConfig); + CLAY_TEXT(Clay__IntToString(cornerRadius.bottomRight), textConfig); + CLAY_TEXT(CLAY_STRING(" }"), textConfig); + } +} + +void HandleDebugViewCloseButtonInteraction(Clay_ElementId elementId, Clay_PointerData pointerInfo, intptr_t userData) { + Clay_Context* context = Clay_GetCurrentContext(); + (void) elementId; (void) pointerInfo; (void) userData; + if (pointerInfo.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + context->debugModeEnabled = false; + } +} + +void Clay__RenderDebugView(void) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay_ElementId closeButtonId = Clay__HashString(CLAY_STRING("Clay__DebugViewTopHeaderCloseButtonOuter"), 0); + if (context->pointerInfo.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + for (int32_t i = 0; i < context->pointerOverIds.length; ++i) { + Clay_ElementId *elementId = Clay_ElementIdArray_Get(&context->pointerOverIds, i); + if (elementId->id == closeButtonId.id) { + context->debugModeEnabled = false; + return; + } + } + } + + uint32_t initialRootsLength = context->layoutElementTreeRoots.length; + uint32_t initialElementsLength = context->layoutElements.length; + Clay_TextElementConfig *infoTextConfig = CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE }); + Clay_TextElementConfig *infoTitleConfig = CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE }); + Clay_ElementId scrollId = Clay__HashString(CLAY_STRING("Clay__DebugViewOuterScrollPane"), 0); + float scrollYOffset = 0; + bool pointerInDebugView = context->pointerInfo.position.y < context->layoutDimensions.height - 300; + for (int32_t i = 0; i < context->scrollContainerDatas.length; ++i) { + Clay__ScrollContainerDataInternal *scrollContainerData = Clay__ScrollContainerDataInternalArray_Get(&context->scrollContainerDatas, i); + if (scrollContainerData->elementId == scrollId.id) { + if (!context->externalScrollHandlingEnabled) { + scrollYOffset = scrollContainerData->scrollPosition.y; + } else { + pointerInDebugView = context->pointerInfo.position.y + scrollContainerData->scrollPosition.y < context->layoutDimensions.height - 300; + } + break; + } + } + int32_t highlightedRow = pointerInDebugView + ? (int32_t)((context->pointerInfo.position.y - scrollYOffset) / (float)CLAY__DEBUGVIEW_ROW_HEIGHT) - 1 + : -1; + if (context->pointerInfo.position.x < context->layoutDimensions.width - (float)Clay__debugViewWidth) { + highlightedRow = -1; + } + Clay__RenderDebugLayoutData layoutData = CLAY__DEFAULT_STRUCT; + CLAY(CLAY_ID("Clay__DebugView"), { + .layout = { .sizing = { CLAY_SIZING_FIXED((float)Clay__debugViewWidth) , CLAY_SIZING_FIXED(context->layoutDimensions.height) }, .layoutDirection = CLAY_TOP_TO_BOTTOM }, + .floating = { .zIndex = 32765, .attachPoints = { .element = CLAY_ATTACH_POINT_LEFT_CENTER, .parent = CLAY_ATTACH_POINT_RIGHT_CENTER }, .attachTo = CLAY_ATTACH_TO_ROOT, .clipTo = CLAY_CLIP_TO_ATTACHED_PARENT }, + .border = { .color = CLAY__DEBUGVIEW_COLOR_3, .width = { .bottom = 1 } } + }) { + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, CLAY__DEBUGVIEW_OUTER_PADDING, 0, 0 }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} }, .backgroundColor = CLAY__DEBUGVIEW_COLOR_2 }) { + CLAY_TEXT(CLAY_STRING("Clay Debug Tools"), infoTextConfig); + CLAY_AUTO_ID({ .layout = { .sizing = { .width = CLAY_SIZING_GROW(0) } } }) {} + // Close button + CLAY_AUTO_ID({ + .layout = { .sizing = {CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 10), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 10)}, .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER} }, + .backgroundColor = {217,91,67,80}, + .cornerRadius = CLAY_CORNER_RADIUS(4), + .border = { .color = { 217,91,67,255 }, .width = { 1, 1, 1, 1, 0 } }, + }) { + Clay_OnHover(HandleDebugViewCloseButtonInteraction, 0); + CLAY_TEXT(CLAY_STRING("x"), CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); + } + } + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(1)} }, .backgroundColor = CLAY__DEBUGVIEW_COLOR_3 } ) {} + CLAY(scrollId, { .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0)} }, .clip = { .horizontal = true, .vertical = true, .childOffset = Clay_GetScrollOffset() } }) { + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0)}, .layoutDirection = CLAY_TOP_TO_BOTTOM }, .backgroundColor = ((initialElementsLength + initialRootsLength) & 1) == 0 ? CLAY__DEBUGVIEW_COLOR_2 : CLAY__DEBUGVIEW_COLOR_1 }) { + Clay_ElementId panelContentsId = Clay__HashString(CLAY_STRING("Clay__DebugViewPaneOuter"), 0); + // Element list + CLAY(panelContentsId, { .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0)} }, .floating = { .zIndex = 32766, .pointerCaptureMode = CLAY_POINTER_CAPTURE_MODE_PASSTHROUGH, .attachTo = CLAY_ATTACH_TO_PARENT, .clipTo = CLAY_CLIP_TO_ATTACHED_PARENT } }) { + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_GROW(0)}, .padding = { CLAY__DEBUGVIEW_OUTER_PADDING, CLAY__DEBUGVIEW_OUTER_PADDING, 0, 0 }, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + layoutData = Clay__RenderDebugLayoutElementsList((int32_t)initialRootsLength, highlightedRow); + } + } + float contentWidth = Clay__GetHashMapItem(panelContentsId.id)->layoutElement->dimensions.width; + CLAY_AUTO_ID({ .layout = { .sizing = {.width = CLAY_SIZING_FIXED(contentWidth) }, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) {} + for (int32_t i = 0; i < layoutData.rowCount; i++) { + Clay_Color rowColor = (i & 1) == 0 ? CLAY__DEBUGVIEW_COLOR_2 : CLAY__DEBUGVIEW_COLOR_1; + if (i == layoutData.selectedElementRowIndex) { + rowColor = CLAY__DEBUGVIEW_COLOR_SELECTED_ROW; + } + if (i == highlightedRow) { + rowColor.r *= 1.25f; + rowColor.g *= 1.25f; + rowColor.b *= 1.25f; + } + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .layoutDirection = CLAY_TOP_TO_BOTTOM }, .backgroundColor = rowColor } ) {} + } + } + } + CLAY_AUTO_ID({ .layout = { .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(1)} }, .backgroundColor = CLAY__DEBUGVIEW_COLOR_3 }) {} + if (context->debugSelectedElementId != 0) { + Clay_LayoutElementHashMapItem *selectedItem = Clay__GetHashMapItem(context->debugSelectedElementId); + CLAY_AUTO_ID({ + .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(300)}, .layoutDirection = CLAY_TOP_TO_BOTTOM }, + .backgroundColor = CLAY__DEBUGVIEW_COLOR_2 , + .clip = { .vertical = true, .childOffset = Clay_GetScrollOffset() }, + .border = { .color = CLAY__DEBUGVIEW_COLOR_3, .width = { .betweenChildren = 1 } } + }) { + CLAY_AUTO_ID({ .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT + 8)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, CLAY__DEBUGVIEW_OUTER_PADDING, 0, 0 }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} } }) { + CLAY_TEXT(CLAY_STRING("Layout Config"), infoTextConfig); + CLAY_AUTO_ID({ .layout = { .sizing = { .width = CLAY_SIZING_GROW(0) } } }) {} + if (selectedItem->elementId.stringId.length != 0) { + CLAY_TEXT(selectedItem->elementId.stringId, infoTitleConfig); + if (selectedItem->elementId.offset != 0) { + CLAY_TEXT(CLAY_STRING(" ("), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(selectedItem->elementId.offset), infoTitleConfig); + CLAY_TEXT(CLAY_STRING(")"), infoTitleConfig); + } + } + } + Clay_Padding attributeConfigPadding = {CLAY__DEBUGVIEW_OUTER_PADDING, CLAY__DEBUGVIEW_OUTER_PADDING, 8, 8}; + // Clay_LayoutConfig debug info + CLAY_AUTO_ID({ .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + // .boundingBox + CLAY_TEXT(CLAY_STRING("Bounding Box"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(selectedItem->boundingBox.x), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", y: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(selectedItem->boundingBox.y), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", width: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(selectedItem->boundingBox.width), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", height: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(selectedItem->boundingBox.height), infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + // .layoutDirection + CLAY_TEXT(CLAY_STRING("Layout Direction"), infoTitleConfig); + Clay_LayoutConfig *layoutConfig = selectedItem->layoutElement->layoutConfig; + CLAY_TEXT(layoutConfig->layoutDirection == CLAY_TOP_TO_BOTTOM ? CLAY_STRING("TOP_TO_BOTTOM") : CLAY_STRING("LEFT_TO_RIGHT"), infoTextConfig); + // .sizing + CLAY_TEXT(CLAY_STRING("Sizing"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("width: "), infoTextConfig); + Clay__RenderDebugLayoutSizing(layoutConfig->sizing.width, infoTextConfig); + } + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("height: "), infoTextConfig); + Clay__RenderDebugLayoutSizing(layoutConfig->sizing.height, infoTextConfig); + } + // .padding + CLAY_TEXT(CLAY_STRING("Padding"), infoTitleConfig); + CLAY(CLAY_ID("Clay__DebugViewElementInfoPadding"), { }) { + CLAY_TEXT(CLAY_STRING("{ left: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(layoutConfig->padding.left), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", right: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(layoutConfig->padding.right), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", top: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(layoutConfig->padding.top), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", bottom: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(layoutConfig->padding.bottom), infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + // .childGap + CLAY_TEXT(CLAY_STRING("Child Gap"), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(layoutConfig->childGap), infoTextConfig); + // .childAlignment + CLAY_TEXT(CLAY_STRING("Child Alignment"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig); + Clay_String alignX = CLAY_STRING("LEFT"); + if (layoutConfig->childAlignment.x == CLAY_ALIGN_X_CENTER) { + alignX = CLAY_STRING("CENTER"); + } else if (layoutConfig->childAlignment.x == CLAY_ALIGN_X_RIGHT) { + alignX = CLAY_STRING("RIGHT"); + } + CLAY_TEXT(alignX, infoTextConfig); + CLAY_TEXT(CLAY_STRING(", y: "), infoTextConfig); + Clay_String alignY = CLAY_STRING("TOP"); + if (layoutConfig->childAlignment.y == CLAY_ALIGN_Y_CENTER) { + alignY = CLAY_STRING("CENTER"); + } else if (layoutConfig->childAlignment.y == CLAY_ALIGN_Y_BOTTOM) { + alignY = CLAY_STRING("BOTTOM"); + } + CLAY_TEXT(alignY, infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + } + for (int32_t elementConfigIndex = 0; elementConfigIndex < selectedItem->layoutElement->elementConfigs.length; ++elementConfigIndex) { + Clay_ElementConfig *elementConfig = Clay__ElementConfigArraySlice_Get(&selectedItem->layoutElement->elementConfigs, elementConfigIndex); + Clay__RenderDebugViewElementConfigHeader(selectedItem->elementId.stringId, elementConfig->type); + switch (elementConfig->type) { + case CLAY__ELEMENT_CONFIG_TYPE_SHARED: { + Clay_SharedElementConfig *sharedConfig = elementConfig->config.sharedElementConfig; + CLAY_AUTO_ID({ .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM }}) { + // .backgroundColor + CLAY_TEXT(CLAY_STRING("Background Color"), infoTitleConfig); + Clay__RenderDebugViewColor(sharedConfig->backgroundColor, infoTextConfig); + // .cornerRadius + CLAY_TEXT(CLAY_STRING("Corner Radius"), infoTitleConfig); + Clay__RenderDebugViewCornerRadius(sharedConfig->cornerRadius, infoTextConfig); + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_TEXT: { + Clay_TextElementConfig *textConfig = elementConfig->config.textElementConfig; + CLAY_AUTO_ID({ .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + // .fontSize + CLAY_TEXT(CLAY_STRING("Font Size"), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(textConfig->fontSize), infoTextConfig); + // .fontId + CLAY_TEXT(CLAY_STRING("Font ID"), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(textConfig->fontId), infoTextConfig); + // .lineHeight + CLAY_TEXT(CLAY_STRING("Line Height"), infoTitleConfig); + CLAY_TEXT(textConfig->lineHeight == 0 ? CLAY_STRING("auto") : Clay__IntToString(textConfig->lineHeight), infoTextConfig); + // .letterSpacing + CLAY_TEXT(CLAY_STRING("Letter Spacing"), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(textConfig->letterSpacing), infoTextConfig); + // .wrapMode + CLAY_TEXT(CLAY_STRING("Wrap Mode"), infoTitleConfig); + Clay_String wrapMode = CLAY_STRING("WORDS"); + if (textConfig->wrapMode == CLAY_TEXT_WRAP_NONE) { + wrapMode = CLAY_STRING("NONE"); + } else if (textConfig->wrapMode == CLAY_TEXT_WRAP_NEWLINES) { + wrapMode = CLAY_STRING("NEWLINES"); + } + CLAY_TEXT(wrapMode, infoTextConfig); + // .textAlignment + CLAY_TEXT(CLAY_STRING("Text Alignment"), infoTitleConfig); + Clay_String textAlignment = CLAY_STRING("LEFT"); + if (textConfig->textAlignment == CLAY_TEXT_ALIGN_CENTER) { + textAlignment = CLAY_STRING("CENTER"); + } else if (textConfig->textAlignment == CLAY_TEXT_ALIGN_RIGHT) { + textAlignment = CLAY_STRING("RIGHT"); + } + CLAY_TEXT(textAlignment, infoTextConfig); + // .textColor + CLAY_TEXT(CLAY_STRING("Text Color"), infoTitleConfig); + Clay__RenderDebugViewColor(textConfig->textColor, infoTextConfig); + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_ASPECT: { + Clay_AspectRatioElementConfig *aspectRatioConfig = elementConfig->config.aspectRatioElementConfig; + CLAY(CLAY_ID("Clay__DebugViewElementInfoAspectRatioBody"), { .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + CLAY_TEXT(CLAY_STRING("Aspect Ratio"), infoTitleConfig); + // Aspect Ratio + CLAY(CLAY_ID("Clay__DebugViewElementInfoAspectRatio"), { }) { + CLAY_TEXT(Clay__IntToString(aspectRatioConfig->aspectRatio), infoTextConfig); + CLAY_TEXT(CLAY_STRING("."), infoTextConfig); + float frac = aspectRatioConfig->aspectRatio - (int)(aspectRatioConfig->aspectRatio); + frac *= 100; + if ((int)frac < 10) { + CLAY_TEXT(CLAY_STRING("0"), infoTextConfig); + } + CLAY_TEXT(Clay__IntToString(frac), infoTextConfig); + } + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_IMAGE: { + Clay_ImageElementConfig *imageConfig = elementConfig->config.imageElementConfig; + Clay_AspectRatioElementConfig aspectConfig = { 1 }; + if (Clay__ElementHasConfig(selectedItem->layoutElement, CLAY__ELEMENT_CONFIG_TYPE_ASPECT)) { + aspectConfig = *Clay__FindElementConfigWithType(selectedItem->layoutElement, CLAY__ELEMENT_CONFIG_TYPE_ASPECT).aspectRatioElementConfig; + } + CLAY(CLAY_ID("Clay__DebugViewElementInfoImageBody"), { .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + // Image Preview + CLAY_TEXT(CLAY_STRING("Preview"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .sizing = { .width = CLAY_SIZING_GROW(64, 128), .height = CLAY_SIZING_GROW(64, 128) }}, .aspectRatio = aspectConfig, .image = *imageConfig }) {} + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_CLIP: { + Clay_ClipElementConfig *clipConfig = elementConfig->config.clipElementConfig; + CLAY_AUTO_ID({ .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + // .vertical + CLAY_TEXT(CLAY_STRING("Vertical"), infoTitleConfig); + CLAY_TEXT(clipConfig->vertical ? CLAY_STRING("true") : CLAY_STRING("false") , infoTextConfig); + // .horizontal + CLAY_TEXT(CLAY_STRING("Horizontal"), infoTitleConfig); + CLAY_TEXT(clipConfig->horizontal ? CLAY_STRING("true") : CLAY_STRING("false") , infoTextConfig); + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_FLOATING: { + Clay_FloatingElementConfig *floatingConfig = elementConfig->config.floatingElementConfig; + CLAY_AUTO_ID({ .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + // .offset + CLAY_TEXT(CLAY_STRING("Offset"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(floatingConfig->offset.x), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", y: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(floatingConfig->offset.y), infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + // .expand + CLAY_TEXT(CLAY_STRING("Expand"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("{ width: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(floatingConfig->expand.width), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", height: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(floatingConfig->expand.height), infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + // .zIndex + CLAY_TEXT(CLAY_STRING("z-index"), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(floatingConfig->zIndex), infoTextConfig); + // .parentId + CLAY_TEXT(CLAY_STRING("Parent"), infoTitleConfig); + Clay_LayoutElementHashMapItem *hashItem = Clay__GetHashMapItem(floatingConfig->parentId); + CLAY_TEXT(hashItem->elementId.stringId, infoTextConfig); + // .attachPoints + CLAY_TEXT(CLAY_STRING("Attach Points"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("{ element: "), infoTextConfig); + Clay_String attachPointElement = CLAY_STRING("LEFT_TOP"); + if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_LEFT_CENTER) { + attachPointElement = CLAY_STRING("LEFT_CENTER"); + } else if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_LEFT_BOTTOM) { + attachPointElement = CLAY_STRING("LEFT_BOTTOM"); + } else if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_CENTER_TOP) { + attachPointElement = CLAY_STRING("CENTER_TOP"); + } else if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_CENTER_CENTER) { + attachPointElement = CLAY_STRING("CENTER_CENTER"); + } else if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_CENTER_BOTTOM) { + attachPointElement = CLAY_STRING("CENTER_BOTTOM"); + } else if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_RIGHT_TOP) { + attachPointElement = CLAY_STRING("RIGHT_TOP"); + } else if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_RIGHT_CENTER) { + attachPointElement = CLAY_STRING("RIGHT_CENTER"); + } else if (floatingConfig->attachPoints.element == CLAY_ATTACH_POINT_RIGHT_BOTTOM) { + attachPointElement = CLAY_STRING("RIGHT_BOTTOM"); + } + CLAY_TEXT(attachPointElement, infoTextConfig); + Clay_String attachPointParent = CLAY_STRING("LEFT_TOP"); + if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_LEFT_CENTER) { + attachPointParent = CLAY_STRING("LEFT_CENTER"); + } else if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_LEFT_BOTTOM) { + attachPointParent = CLAY_STRING("LEFT_BOTTOM"); + } else if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_CENTER_TOP) { + attachPointParent = CLAY_STRING("CENTER_TOP"); + } else if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_CENTER_CENTER) { + attachPointParent = CLAY_STRING("CENTER_CENTER"); + } else if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_CENTER_BOTTOM) { + attachPointParent = CLAY_STRING("CENTER_BOTTOM"); + } else if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_RIGHT_TOP) { + attachPointParent = CLAY_STRING("RIGHT_TOP"); + } else if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_RIGHT_CENTER) { + attachPointParent = CLAY_STRING("RIGHT_CENTER"); + } else if (floatingConfig->attachPoints.parent == CLAY_ATTACH_POINT_RIGHT_BOTTOM) { + attachPointParent = CLAY_STRING("RIGHT_BOTTOM"); + } + CLAY_TEXT(CLAY_STRING(", parent: "), infoTextConfig); + CLAY_TEXT(attachPointParent, infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + // .pointerCaptureMode + CLAY_TEXT(CLAY_STRING("Pointer Capture Mode"), infoTitleConfig); + Clay_String pointerCaptureMode = CLAY_STRING("NONE"); + if (floatingConfig->pointerCaptureMode == CLAY_POINTER_CAPTURE_MODE_PASSTHROUGH) { + pointerCaptureMode = CLAY_STRING("PASSTHROUGH"); + } + CLAY_TEXT(pointerCaptureMode, infoTextConfig); + // .attachTo + CLAY_TEXT(CLAY_STRING("Attach To"), infoTitleConfig); + Clay_String attachTo = CLAY_STRING("NONE"); + if (floatingConfig->attachTo == CLAY_ATTACH_TO_PARENT) { + attachTo = CLAY_STRING("PARENT"); + } else if (floatingConfig->attachTo == CLAY_ATTACH_TO_ELEMENT_WITH_ID) { + attachTo = CLAY_STRING("ELEMENT_WITH_ID"); + } else if (floatingConfig->attachTo == CLAY_ATTACH_TO_ROOT) { + attachTo = CLAY_STRING("ROOT"); + } + CLAY_TEXT(attachTo, infoTextConfig); + // .clipTo + CLAY_TEXT(CLAY_STRING("Clip To"), infoTitleConfig); + Clay_String clipTo = CLAY_STRING("ATTACHED_PARENT"); + if (floatingConfig->clipTo == CLAY_CLIP_TO_NONE) { + clipTo = CLAY_STRING("NONE"); + } + CLAY_TEXT(clipTo, infoTextConfig); + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_BORDER: { + Clay_BorderElementConfig *borderConfig = elementConfig->config.borderElementConfig; + CLAY(CLAY_ID("Clay__DebugViewElementInfoBorderBody"), { .layout = { .padding = attributeConfigPadding, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { + CLAY_TEXT(CLAY_STRING("Border Widths"), infoTitleConfig); + CLAY_AUTO_ID({ .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT } }) { + CLAY_TEXT(CLAY_STRING("{ left: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(borderConfig->width.left), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", right: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(borderConfig->width.right), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", top: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(borderConfig->width.top), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", bottom: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(borderConfig->width.bottom), infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + // .textColor + CLAY_TEXT(CLAY_STRING("Border Color"), infoTitleConfig); + Clay__RenderDebugViewColor(borderConfig->color, infoTextConfig); + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_CUSTOM: + default: break; + } + } + } + } else { + CLAY(CLAY_ID("Clay__DebugViewWarningsScrollPane"), { .layout = { .sizing = {CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(300)}, .childGap = 6, .layoutDirection = CLAY_TOP_TO_BOTTOM }, .backgroundColor = CLAY__DEBUGVIEW_COLOR_2, .clip = { .horizontal = true, .vertical = true, .childOffset = Clay_GetScrollOffset() } }) { + Clay_TextElementConfig *warningConfig = CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE }); + CLAY(CLAY_ID("Clay__DebugViewWarningItemHeader"), { .layout = { .sizing = {.height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, CLAY__DEBUGVIEW_OUTER_PADDING, 0, 0 }, .childGap = 8, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} } }) { + CLAY_TEXT(CLAY_STRING("Warnings"), warningConfig); + } + CLAY(CLAY_ID("Clay__DebugViewWarningsTopBorder"), { .layout = { .sizing = { .width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(1)} }, .backgroundColor = {200, 200, 200, 255} }) {} + int32_t previousWarningsLength = context->warnings.length; + for (int32_t i = 0; i < previousWarningsLength; i++) { + Clay__Warning warning = context->warnings.internalArray[i]; + CLAY(CLAY_IDI("Clay__DebugViewWarningItem", i), { .layout = { .sizing = {.height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, CLAY__DEBUGVIEW_OUTER_PADDING, 0, 0 }, .childGap = 8, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} } }) { + CLAY_TEXT(warning.baseMessage, warningConfig); + if (warning.dynamicMessage.length > 0) { + CLAY_TEXT(warning.dynamicMessage, warningConfig); + } + } + } + } + } + } +} +#pragma endregion + +uint32_t Clay__debugViewWidth = 400; +Clay_Color Clay__debugViewHighlightColor = { 168, 66, 28, 100 }; + +Clay__WarningArray Clay__WarningArray_Allocate_Arena(int32_t capacity, Clay_Arena *arena) { + size_t totalSizeBytes = capacity * sizeof(Clay_String); + Clay__WarningArray array = {.capacity = capacity, .length = 0}; + uintptr_t nextAllocOffset = arena->nextAllocation + (64 - (arena->nextAllocation % 64)); + if (nextAllocOffset + totalSizeBytes <= arena->capacity) { + array.internalArray = (Clay__Warning*)((uintptr_t)arena->memory + (uintptr_t)nextAllocOffset); + arena->nextAllocation = nextAllocOffset + totalSizeBytes; + } + else { + Clay__currentContext->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_ARENA_CAPACITY_EXCEEDED, + .errorText = CLAY_STRING("Clay attempted to allocate memory in its arena, but ran out of capacity. Try increasing the capacity of the arena passed to Clay_Initialize()"), + .userData = Clay__currentContext->errorHandler.userData }); + } + return array; +} + +Clay__Warning *Clay__WarningArray_Add(Clay__WarningArray *array, Clay__Warning item) +{ + if (array->length < array->capacity) { + array->internalArray[array->length++] = item; + return &array->internalArray[array->length - 1]; + } + return &CLAY__WARNING_DEFAULT; +} + +void* Clay__Array_Allocate_Arena(int32_t capacity, uint32_t itemSize, Clay_Arena *arena) +{ + size_t totalSizeBytes = capacity * itemSize; + uintptr_t nextAllocOffset = arena->nextAllocation + ((64 - (arena->nextAllocation % 64)) & 63); + if (nextAllocOffset + totalSizeBytes <= arena->capacity) { + arena->nextAllocation = nextAllocOffset + totalSizeBytes; + return (void*)((uintptr_t)arena->memory + (uintptr_t)nextAllocOffset); + } + else { + Clay__currentContext->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_ARENA_CAPACITY_EXCEEDED, + .errorText = CLAY_STRING("Clay attempted to allocate memory in its arena, but ran out of capacity. Try increasing the capacity of the arena passed to Clay_Initialize()"), + .userData = Clay__currentContext->errorHandler.userData }); + } + return CLAY__NULL; +} + +bool Clay__Array_RangeCheck(int32_t index, int32_t length) +{ + if (index < length && index >= 0) { + return true; + } + Clay_Context* context = Clay_GetCurrentContext(); + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_INTERNAL_ERROR, + .errorText = CLAY_STRING("Clay attempted to make an out of bounds array access. This is an internal error and is likely a bug."), + .userData = context->errorHandler.userData }); + return false; +} + +bool Clay__Array_AddCapacityCheck(int32_t length, int32_t capacity) +{ + if (length < capacity) { + return true; + } + Clay_Context* context = Clay_GetCurrentContext(); + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_INTERNAL_ERROR, + .errorText = CLAY_STRING("Clay attempted to make an out of bounds array access. This is an internal error and is likely a bug."), + .userData = context->errorHandler.userData }); + return false; +} + +// PUBLIC API FROM HERE --------------------------------------- + +CLAY_WASM_EXPORT("Clay_MinMemorySize") +uint32_t Clay_MinMemorySize(void) { + Clay_Context fakeContext = { + .maxElementCount = Clay__defaultMaxElementCount, + .maxMeasureTextCacheWordCount = Clay__defaultMaxMeasureTextWordCacheCount, + .internalArena = { + .capacity = SIZE_MAX, + .memory = NULL, + } + }; + Clay_Context* currentContext = Clay_GetCurrentContext(); + if (currentContext) { + fakeContext.maxElementCount = currentContext->maxElementCount; + fakeContext.maxMeasureTextCacheWordCount = currentContext->maxMeasureTextCacheWordCount; + } + // Reserve space in the arena for the context, important for calculating min memory size correctly + Clay__Context_Allocate_Arena(&fakeContext.internalArena); + Clay__InitializePersistentMemory(&fakeContext); + Clay__InitializeEphemeralMemory(&fakeContext); + return (uint32_t)fakeContext.internalArena.nextAllocation + 128; +} + +CLAY_WASM_EXPORT("Clay_CreateArenaWithCapacityAndMemory") +Clay_Arena Clay_CreateArenaWithCapacityAndMemory(size_t capacity, void *memory) { + Clay_Arena arena = { + .capacity = capacity, + .memory = (char *)memory + }; + return arena; +} + +#ifndef CLAY_WASM +void Clay_SetMeasureTextFunction(Clay_Dimensions (*measureTextFunction)(Clay_StringSlice text, Clay_TextElementConfig *config, void *userData), void *userData) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay__MeasureText = measureTextFunction; + context->measureTextUserData = userData; +} +void Clay_SetQueryScrollOffsetFunction(Clay_Vector2 (*queryScrollOffsetFunction)(uint32_t elementId, void *userData), void *userData) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay__QueryScrollOffset = queryScrollOffsetFunction; + context->queryScrollOffsetUserData = userData; +} +#endif + +CLAY_WASM_EXPORT("Clay_SetLayoutDimensions") +void Clay_SetLayoutDimensions(Clay_Dimensions dimensions) { + Clay_GetCurrentContext()->layoutDimensions = dimensions; +} + +CLAY_WASM_EXPORT("Clay_SetPointerState") +void Clay_SetPointerState(Clay_Vector2 position, bool isPointerDown) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->booleanWarnings.maxElementsExceeded) { + return; + } + context->pointerInfo.position = position; + context->pointerOverIds.length = 0; + Clay__int32_tArray dfsBuffer = context->layoutElementChildrenBuffer; + for (int32_t rootIndex = context->layoutElementTreeRoots.length - 1; rootIndex >= 0; --rootIndex) { + dfsBuffer.length = 0; + Clay__LayoutElementTreeRoot *root = Clay__LayoutElementTreeRootArray_Get(&context->layoutElementTreeRoots, rootIndex); + Clay__int32_tArray_Add(&dfsBuffer, (int32_t)root->layoutElementIndex); + context->treeNodeVisited.internalArray[0] = false; + bool found = false; + while (dfsBuffer.length > 0) { + if (context->treeNodeVisited.internalArray[dfsBuffer.length - 1]) { + dfsBuffer.length--; + continue; + } + context->treeNodeVisited.internalArray[dfsBuffer.length - 1] = true; + Clay_LayoutElement *currentElement = Clay_LayoutElementArray_Get(&context->layoutElements, Clay__int32_tArray_GetValue(&dfsBuffer, (int)dfsBuffer.length - 1)); + Clay_LayoutElementHashMapItem *mapItem = Clay__GetHashMapItem(currentElement->id); // TODO think of a way around this, maybe the fact that it's essentially a binary tree limits the cost, but the worst case is not great + int32_t clipElementId = Clay__int32_tArray_GetValue(&context->layoutElementClipElementIds, (int32_t)(currentElement - context->layoutElements.internalArray)); + Clay_LayoutElementHashMapItem *clipItem = Clay__GetHashMapItem(clipElementId); + if (mapItem) { + Clay_BoundingBox elementBox = mapItem->boundingBox; + elementBox.x -= root->pointerOffset.x; + elementBox.y -= root->pointerOffset.y; + if ((Clay__PointIsInsideRect(position, elementBox)) && (clipElementId == 0 || (Clay__PointIsInsideRect(position, clipItem->boundingBox)) || context->externalScrollHandlingEnabled)) { + if (mapItem->onHoverFunction) { + mapItem->onHoverFunction(mapItem->elementId, context->pointerInfo, mapItem->hoverFunctionUserData); + } + Clay_ElementIdArray_Add(&context->pointerOverIds, mapItem->elementId); + found = true; + } + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT)) { + dfsBuffer.length--; + continue; + } + for (int32_t i = currentElement->childrenOrTextContent.children.length - 1; i >= 0; --i) { + Clay__int32_tArray_Add(&dfsBuffer, currentElement->childrenOrTextContent.children.elements[i]); + context->treeNodeVisited.internalArray[dfsBuffer.length - 1] = false; // TODO needs to be ranged checked + } + } else { + dfsBuffer.length--; + } + } + + Clay_LayoutElement *rootElement = Clay_LayoutElementArray_Get(&context->layoutElements, root->layoutElementIndex); + if (found && Clay__ElementHasConfig(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING) && + Clay__FindElementConfigWithType(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING).floatingElementConfig->pointerCaptureMode == CLAY_POINTER_CAPTURE_MODE_CAPTURE) { + break; + } + } + + if (isPointerDown) { + if (context->pointerInfo.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + context->pointerInfo.state = CLAY_POINTER_DATA_PRESSED; + } else if (context->pointerInfo.state != CLAY_POINTER_DATA_PRESSED) { + context->pointerInfo.state = CLAY_POINTER_DATA_PRESSED_THIS_FRAME; + } + } else { + if (context->pointerInfo.state == CLAY_POINTER_DATA_RELEASED_THIS_FRAME) { + context->pointerInfo.state = CLAY_POINTER_DATA_RELEASED; + } else if (context->pointerInfo.state != CLAY_POINTER_DATA_RELEASED) { + context->pointerInfo.state = CLAY_POINTER_DATA_RELEASED_THIS_FRAME; + } + } +} + +CLAY_WASM_EXPORT("Clay_Initialize") +Clay_Context* Clay_Initialize(Clay_Arena arena, Clay_Dimensions layoutDimensions, Clay_ErrorHandler errorHandler) { + // Cacheline align memory passed in + uintptr_t baseOffset = 64 - ((uintptr_t)arena.memory % 64); + baseOffset = baseOffset == 64 ? 0 : baseOffset; + arena.memory += baseOffset; + Clay_Context *context = Clay__Context_Allocate_Arena(&arena); + if (context == NULL) return NULL; + // DEFAULTS + Clay_Context *oldContext = Clay_GetCurrentContext(); + *context = CLAY__INIT(Clay_Context) { + .maxElementCount = oldContext ? oldContext->maxElementCount : Clay__defaultMaxElementCount, + .maxMeasureTextCacheWordCount = oldContext ? oldContext->maxMeasureTextCacheWordCount : Clay__defaultMaxMeasureTextWordCacheCount, + .errorHandler = errorHandler.errorHandlerFunction ? errorHandler : CLAY__INIT(Clay_ErrorHandler) { Clay__ErrorHandlerFunctionDefault, 0 }, + .layoutDimensions = layoutDimensions, + .internalArena = arena, + }; + Clay_SetCurrentContext(context); + Clay__InitializePersistentMemory(context); + Clay__InitializeEphemeralMemory(context); + for (int32_t i = 0; i < context->layoutElementsHashMap.capacity; ++i) { + context->layoutElementsHashMap.internalArray[i] = -1; + } + for (int32_t i = 0; i < context->measureTextHashMap.capacity; ++i) { + context->measureTextHashMap.internalArray[i] = 0; + } + context->measureTextHashMapInternal.length = 1; // Reserve the 0 value to mean "no next element" + context->layoutDimensions = layoutDimensions; + return context; +} + +CLAY_WASM_EXPORT("Clay_GetCurrentContext") +Clay_Context* Clay_GetCurrentContext(void) { + return Clay__currentContext; +} + +CLAY_WASM_EXPORT("Clay_SetCurrentContext") +void Clay_SetCurrentContext(Clay_Context* context) { + Clay__currentContext = context; +} + +CLAY_WASM_EXPORT("Clay_GetScrollOffset") +Clay_Vector2 Clay_GetScrollOffset(void) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->booleanWarnings.maxElementsExceeded) { + return CLAY__INIT(Clay_Vector2) CLAY__DEFAULT_STRUCT; + } + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + // If the element has no id attached at this point, we need to generate one + if (openLayoutElement->id == 0) { + Clay__GenerateIdForAnonymousElement(openLayoutElement); + } + for (int32_t i = 0; i < context->scrollContainerDatas.length; i++) { + Clay__ScrollContainerDataInternal *mapping = Clay__ScrollContainerDataInternalArray_Get(&context->scrollContainerDatas, i); + if (mapping->layoutElement == openLayoutElement) { + return mapping->scrollPosition; + } + } + return CLAY__INIT(Clay_Vector2) CLAY__DEFAULT_STRUCT; +} + +CLAY_WASM_EXPORT("Clay_UpdateScrollContainers") +void Clay_UpdateScrollContainers(bool enableDragScrolling, Clay_Vector2 scrollDelta, float deltaTime) { + Clay_Context* context = Clay_GetCurrentContext(); + bool isPointerActive = enableDragScrolling && (context->pointerInfo.state == CLAY_POINTER_DATA_PRESSED || context->pointerInfo.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME); + // Don't apply scroll events to ancestors of the inner element + int32_t highestPriorityElementIndex = -1; + Clay__ScrollContainerDataInternal *highestPriorityScrollData = CLAY__NULL; + for (int32_t i = 0; i < context->scrollContainerDatas.length; i++) { + Clay__ScrollContainerDataInternal *scrollData = Clay__ScrollContainerDataInternalArray_Get(&context->scrollContainerDatas, i); + if (!scrollData->openThisFrame) { + Clay__ScrollContainerDataInternalArray_RemoveSwapback(&context->scrollContainerDatas, i); + continue; + } + scrollData->openThisFrame = false; + Clay_LayoutElementHashMapItem *hashMapItem = Clay__GetHashMapItem(scrollData->elementId); + // Element isn't rendered this frame but scroll offset has been retained + if (!hashMapItem) { + Clay__ScrollContainerDataInternalArray_RemoveSwapback(&context->scrollContainerDatas, i); + continue; + } + + // Touch / click is released + if (!isPointerActive && scrollData->pointerScrollActive) { + float xDiff = scrollData->scrollPosition.x - scrollData->scrollOrigin.x; + if (xDiff < -10 || xDiff > 10) { + scrollData->scrollMomentum.x = (scrollData->scrollPosition.x - scrollData->scrollOrigin.x) / (scrollData->momentumTime * 25); + } + float yDiff = scrollData->scrollPosition.y - scrollData->scrollOrigin.y; + if (yDiff < -10 || yDiff > 10) { + scrollData->scrollMomentum.y = (scrollData->scrollPosition.y - scrollData->scrollOrigin.y) / (scrollData->momentumTime * 25); + } + scrollData->pointerScrollActive = false; + + scrollData->pointerOrigin = CLAY__INIT(Clay_Vector2){0,0}; + scrollData->scrollOrigin = CLAY__INIT(Clay_Vector2){0,0}; + scrollData->momentumTime = 0; + } + + // Apply existing momentum + scrollData->scrollPosition.x += scrollData->scrollMomentum.x; + scrollData->scrollMomentum.x *= 0.95f; + bool scrollOccurred = scrollDelta.x != 0 || scrollDelta.y != 0; + if ((scrollData->scrollMomentum.x > -0.1f && scrollData->scrollMomentum.x < 0.1f) || scrollOccurred) { + scrollData->scrollMomentum.x = 0; + } + scrollData->scrollPosition.x = CLAY__MIN(CLAY__MAX(scrollData->scrollPosition.x, -(CLAY__MAX(scrollData->contentSize.width - scrollData->layoutElement->dimensions.width, 0))), 0); + + scrollData->scrollPosition.y += scrollData->scrollMomentum.y; + scrollData->scrollMomentum.y *= 0.95f; + if ((scrollData->scrollMomentum.y > -0.1f && scrollData->scrollMomentum.y < 0.1f) || scrollOccurred) { + scrollData->scrollMomentum.y = 0; + } + scrollData->scrollPosition.y = CLAY__MIN(CLAY__MAX(scrollData->scrollPosition.y, -(CLAY__MAX(scrollData->contentSize.height - scrollData->layoutElement->dimensions.height, 0))), 0); + + for (int32_t j = 0; j < context->pointerOverIds.length; ++j) { // TODO n & m are small here but this being n*m gives me the creeps + if (scrollData->layoutElement->id == Clay_ElementIdArray_Get(&context->pointerOverIds, j)->id) { + highestPriorityElementIndex = j; + highestPriorityScrollData = scrollData; + } + } + } + + if (highestPriorityElementIndex > -1 && highestPriorityScrollData) { + Clay_LayoutElement *scrollElement = highestPriorityScrollData->layoutElement; + Clay_ClipElementConfig *clipConfig = Clay__FindElementConfigWithType(scrollElement, CLAY__ELEMENT_CONFIG_TYPE_CLIP).clipElementConfig; + bool canScrollVertically = clipConfig->vertical && highestPriorityScrollData->contentSize.height > scrollElement->dimensions.height; + bool canScrollHorizontally = clipConfig->horizontal && highestPriorityScrollData->contentSize.width > scrollElement->dimensions.width; + // Handle wheel scroll + if (canScrollVertically) { + highestPriorityScrollData->scrollPosition.y = highestPriorityScrollData->scrollPosition.y + scrollDelta.y * 10; + } + if (canScrollHorizontally) { + highestPriorityScrollData->scrollPosition.x = highestPriorityScrollData->scrollPosition.x + scrollDelta.x * 10; + } + // Handle click / touch scroll + if (isPointerActive) { + highestPriorityScrollData->scrollMomentum = CLAY__INIT(Clay_Vector2)CLAY__DEFAULT_STRUCT; + if (!highestPriorityScrollData->pointerScrollActive) { + highestPriorityScrollData->pointerOrigin = context->pointerInfo.position; + highestPriorityScrollData->scrollOrigin = highestPriorityScrollData->scrollPosition; + highestPriorityScrollData->pointerScrollActive = true; + } else { + float scrollDeltaX = 0, scrollDeltaY = 0; + if (canScrollHorizontally) { + float oldXScrollPosition = highestPriorityScrollData->scrollPosition.x; + highestPriorityScrollData->scrollPosition.x = highestPriorityScrollData->scrollOrigin.x + (context->pointerInfo.position.x - highestPriorityScrollData->pointerOrigin.x); + highestPriorityScrollData->scrollPosition.x = CLAY__MAX(CLAY__MIN(highestPriorityScrollData->scrollPosition.x, 0), -(highestPriorityScrollData->contentSize.width - highestPriorityScrollData->boundingBox.width)); + scrollDeltaX = highestPriorityScrollData->scrollPosition.x - oldXScrollPosition; + } + if (canScrollVertically) { + float oldYScrollPosition = highestPriorityScrollData->scrollPosition.y; + highestPriorityScrollData->scrollPosition.y = highestPriorityScrollData->scrollOrigin.y + (context->pointerInfo.position.y - highestPriorityScrollData->pointerOrigin.y); + highestPriorityScrollData->scrollPosition.y = CLAY__MAX(CLAY__MIN(highestPriorityScrollData->scrollPosition.y, 0), -(highestPriorityScrollData->contentSize.height - highestPriorityScrollData->boundingBox.height)); + scrollDeltaY = highestPriorityScrollData->scrollPosition.y - oldYScrollPosition; + } + if (scrollDeltaX > -0.1f && scrollDeltaX < 0.1f && scrollDeltaY > -0.1f && scrollDeltaY < 0.1f && highestPriorityScrollData->momentumTime > 0.15f) { + highestPriorityScrollData->momentumTime = 0; + highestPriorityScrollData->pointerOrigin = context->pointerInfo.position; + highestPriorityScrollData->scrollOrigin = highestPriorityScrollData->scrollPosition; + } else { + highestPriorityScrollData->momentumTime += deltaTime; + } + } + } + // Clamp any changes to scroll position to the maximum size of the contents + if (canScrollVertically) { + highestPriorityScrollData->scrollPosition.y = CLAY__MAX(CLAY__MIN(highestPriorityScrollData->scrollPosition.y, 0), -(highestPriorityScrollData->contentSize.height - scrollElement->dimensions.height)); + } + if (canScrollHorizontally) { + highestPriorityScrollData->scrollPosition.x = CLAY__MAX(CLAY__MIN(highestPriorityScrollData->scrollPosition.x, 0), -(highestPriorityScrollData->contentSize.width - scrollElement->dimensions.width)); + } + } +} + +CLAY_WASM_EXPORT("Clay_BeginLayout") +void Clay_BeginLayout(void) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay__InitializeEphemeralMemory(context); + context->generation++; + context->dynamicElementIndex = 0; + // Set up the root container that covers the entire window + Clay_Dimensions rootDimensions = {context->layoutDimensions.width, context->layoutDimensions.height}; + if (context->debugModeEnabled) { + rootDimensions.width -= (float)Clay__debugViewWidth; + } + context->booleanWarnings = CLAY__INIT(Clay_BooleanWarnings) CLAY__DEFAULT_STRUCT; + Clay__OpenElementWithId(CLAY_ID("Clay__RootContainer")); + Clay__ConfigureOpenElement(CLAY__INIT(Clay_ElementDeclaration) { + .layout = { .sizing = {CLAY_SIZING_FIXED((rootDimensions.width)), CLAY_SIZING_FIXED(rootDimensions.height)} } + }); + Clay__int32_tArray_Add(&context->openLayoutElementStack, 0); + Clay__LayoutElementTreeRootArray_Add(&context->layoutElementTreeRoots, CLAY__INIT(Clay__LayoutElementTreeRoot) { .layoutElementIndex = 0 }); +} + +CLAY_WASM_EXPORT("Clay_EndLayout") +Clay_RenderCommandArray Clay_EndLayout(void) { + Clay_Context* context = Clay_GetCurrentContext(); + Clay__CloseElement(); + bool elementsExceededBeforeDebugView = context->booleanWarnings.maxElementsExceeded; + if (context->debugModeEnabled && !elementsExceededBeforeDebugView) { + context->warningsEnabled = false; + Clay__RenderDebugView(); + context->warningsEnabled = true; + } + if (context->booleanWarnings.maxElementsExceeded) { + Clay_String message; + if (!elementsExceededBeforeDebugView) { + message = CLAY_STRING("Clay Error: Layout elements exceeded Clay__maxElementCount after adding the debug-view to the layout."); + } else { + message = CLAY_STRING("Clay Error: Layout elements exceeded Clay__maxElementCount"); + } + Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand ) { + .boundingBox = { context->layoutDimensions.width / 2 - 59 * 4, context->layoutDimensions.height / 2, 0, 0 }, + .renderData = { .text = { .stringContents = CLAY__INIT(Clay_StringSlice) { .length = message.length, .chars = message.chars, .baseChars = message.chars }, .textColor = {255, 0, 0, 255}, .fontSize = 16 } }, + .commandType = CLAY_RENDER_COMMAND_TYPE_TEXT + }); + } + if (context->openLayoutElementStack.length > 1) { + context->errorHandler.errorHandlerFunction(CLAY__INIT(Clay_ErrorData) { + .errorType = CLAY_ERROR_TYPE_UNBALANCED_OPEN_CLOSE, + .errorText = CLAY_STRING("There were still open layout elements when EndLayout was called. This results from an unequal number of calls to Clay__OpenElement and Clay__CloseElement."), + .userData = context->errorHandler.userData }); + } + Clay__CalculateFinalLayout(); + return context->renderCommands; +} + +CLAY_WASM_EXPORT("Clay_GetElementId") +Clay_ElementId Clay_GetElementId(Clay_String idString) { + return Clay__HashString(idString, 0); +} + +CLAY_WASM_EXPORT("Clay_GetElementIdWithIndex") +Clay_ElementId Clay_GetElementIdWithIndex(Clay_String idString, uint32_t index) { + return Clay__HashStringWithOffset(idString, index, 0); +} + +bool Clay_Hovered(void) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->booleanWarnings.maxElementsExceeded) { + return false; + } + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + // If the element has no id attached at this point, we need to generate one + if (openLayoutElement->id == 0) { + Clay__GenerateIdForAnonymousElement(openLayoutElement); + } + for (int32_t i = 0; i < context->pointerOverIds.length; ++i) { + if (Clay_ElementIdArray_Get(&context->pointerOverIds, i)->id == openLayoutElement->id) { + return true; + } + } + return false; +} + +void Clay_OnHover(void (*onHoverFunction)(Clay_ElementId elementId, Clay_PointerData pointerInfo, intptr_t userData), intptr_t userData) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context->booleanWarnings.maxElementsExceeded) { + return; + } + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + if (openLayoutElement->id == 0) { + Clay__GenerateIdForAnonymousElement(openLayoutElement); + } + Clay_LayoutElementHashMapItem *hashMapItem = Clay__GetHashMapItem(openLayoutElement->id); + hashMapItem->onHoverFunction = onHoverFunction; + hashMapItem->hoverFunctionUserData = userData; +} + +CLAY_WASM_EXPORT("Clay_PointerOver") +bool Clay_PointerOver(Clay_ElementId elementId) { // TODO return priority for separating multiple results + Clay_Context* context = Clay_GetCurrentContext(); + for (int32_t i = 0; i < context->pointerOverIds.length; ++i) { + if (Clay_ElementIdArray_Get(&context->pointerOverIds, i)->id == elementId.id) { + return true; + } + } + return false; +} + +CLAY_WASM_EXPORT("Clay_GetScrollContainerData") +Clay_ScrollContainerData Clay_GetScrollContainerData(Clay_ElementId id) { + Clay_Context* context = Clay_GetCurrentContext(); + for (int32_t i = 0; i < context->scrollContainerDatas.length; ++i) { + Clay__ScrollContainerDataInternal *scrollContainerData = Clay__ScrollContainerDataInternalArray_Get(&context->scrollContainerDatas, i); + if (scrollContainerData->elementId == id.id) { + Clay_ClipElementConfig *clipElementConfig = Clay__FindElementConfigWithType(scrollContainerData->layoutElement, CLAY__ELEMENT_CONFIG_TYPE_CLIP).clipElementConfig; + if (!clipElementConfig) { // This can happen on the first frame before a scroll container is declared + return CLAY__INIT(Clay_ScrollContainerData) CLAY__DEFAULT_STRUCT; + } + return CLAY__INIT(Clay_ScrollContainerData) { + .scrollPosition = &scrollContainerData->scrollPosition, + .scrollContainerDimensions = { scrollContainerData->boundingBox.width, scrollContainerData->boundingBox.height }, + .contentDimensions = scrollContainerData->contentSize, + .config = *clipElementConfig, + .found = true + }; + } + } + return CLAY__INIT(Clay_ScrollContainerData) CLAY__DEFAULT_STRUCT; +} + +CLAY_WASM_EXPORT("Clay_GetElementData") +Clay_ElementData Clay_GetElementData(Clay_ElementId id){ + Clay_LayoutElementHashMapItem * item = Clay__GetHashMapItem(id.id); + if(item == &Clay_LayoutElementHashMapItem_DEFAULT) { + return CLAY__INIT(Clay_ElementData) CLAY__DEFAULT_STRUCT; + } + + return CLAY__INIT(Clay_ElementData){ + .boundingBox = item->boundingBox, + .found = true + }; +} + +CLAY_WASM_EXPORT("Clay_SetDebugModeEnabled") +void Clay_SetDebugModeEnabled(bool enabled) { + Clay_Context* context = Clay_GetCurrentContext(); + context->debugModeEnabled = enabled; +} + +CLAY_WASM_EXPORT("Clay_IsDebugModeEnabled") +bool Clay_IsDebugModeEnabled(void) { + Clay_Context* context = Clay_GetCurrentContext(); + return context->debugModeEnabled; +} + +CLAY_WASM_EXPORT("Clay_SetCullingEnabled") +void Clay_SetCullingEnabled(bool enabled) { + Clay_Context* context = Clay_GetCurrentContext(); + context->disableCulling = !enabled; +} + +CLAY_WASM_EXPORT("Clay_SetExternalScrollHandlingEnabled") +void Clay_SetExternalScrollHandlingEnabled(bool enabled) { + Clay_Context* context = Clay_GetCurrentContext(); + context->externalScrollHandlingEnabled = enabled; +} + +CLAY_WASM_EXPORT("Clay_GetMaxElementCount") +int32_t Clay_GetMaxElementCount(void) { + Clay_Context* context = Clay_GetCurrentContext(); + return context->maxElementCount; +} + +CLAY_WASM_EXPORT("Clay_SetMaxElementCount") +void Clay_SetMaxElementCount(int32_t maxElementCount) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context) { + context->maxElementCount = maxElementCount; + } else { + Clay__defaultMaxElementCount = maxElementCount; // TODO: Fix this + Clay__defaultMaxMeasureTextWordCacheCount = maxElementCount * 2; + } +} + +CLAY_WASM_EXPORT("Clay_GetMaxMeasureTextCacheWordCount") +int32_t Clay_GetMaxMeasureTextCacheWordCount(void) { + Clay_Context* context = Clay_GetCurrentContext(); + return context->maxMeasureTextCacheWordCount; +} + +CLAY_WASM_EXPORT("Clay_SetMaxMeasureTextCacheWordCount") +void Clay_SetMaxMeasureTextCacheWordCount(int32_t maxMeasureTextCacheWordCount) { + Clay_Context* context = Clay_GetCurrentContext(); + if (context) { + Clay__currentContext->maxMeasureTextCacheWordCount = maxMeasureTextCacheWordCount; + } else { + Clay__defaultMaxMeasureTextWordCacheCount = maxMeasureTextCacheWordCount; // TODO: Fix this + } +} + +CLAY_WASM_EXPORT("Clay_ResetMeasureTextCache") +void Clay_ResetMeasureTextCache(void) { + Clay_Context* context = Clay_GetCurrentContext(); + context->measureTextHashMapInternal.length = 0; + context->measureTextHashMapInternalFreeList.length = 0; + context->measureTextHashMap.length = 0; + context->measuredWords.length = 0; + context->measuredWordsFreeList.length = 0; + + for (int32_t i = 0; i < context->measureTextHashMap.capacity; ++i) { + context->measureTextHashMap.internalArray[i] = 0; + } + context->measureTextHashMapInternal.length = 1; // Reserve the 0 value to mean "no next element" +} + +#endif // CLAY_IMPLEMENTATION + +/* +LICENSE +zlib/libpng license + +Copyright (c) 2024 Nic Barker + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the +use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software in a + product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ diff --git a/vendor/renderer/clay_renderer_SDL3.c b/vendor/renderer/clay_renderer_SDL3.c new file mode 100644 index 0000000..45c67a2 --- /dev/null +++ b/vendor/renderer/clay_renderer_SDL3.c @@ -0,0 +1,259 @@ +#include "clay_renderer_SDL3.h" + +#define CLAY_IMPLEMENTATION +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Global for convenience. Even in 4K this is enough for smooth curves (low radius or rect size coupled with + * no AA or low resolution might make it appear as jagged curves) */ +static int NUM_CIRCLE_SEGMENTS = 16; + +static void SDL_Clay_GenerateRoundedRectCorner(SDL_Vertex *vertices, size_t begin, size_t count, SDL_FPoint origin, SDL_FPoint offset, SDL_FColor color, SDL_FPoint texel, float radius) { + assert(count > 0); + if (count == 1) { + vertices[begin] = (SDL_Vertex){ { origin.x, origin.y }, color, texel }; + } else { + const double quarterCircleRadians = SDL_PI_D / 2.0; + for (size_t i = 0; i < count; ++i) { + double const angle = (quarterCircleRadians / ((double)count-1)) * i; + vertices[begin + i] = (SDL_Vertex) { .position = { + origin.x + (radius * (offset.x * SDL_cos(angle) - offset.y * SDL_sin(angle))), + origin.y + (radius * (offset.x * SDL_sin(angle) + offset.y * SDL_cos(angle))) + }, + .color = color, .tex_coord = texel + }; + } + } +} + +//all rendering is performed by a single SDL call, avoiding multiple RenderRect + plumbing choice for circles. +static void SDL_Clay_RenderFillRoundedRect(Clay_SDL3RendererData *rendererData, const SDL_FRect rect, const Clay_CornerRadius cornerRadius, const Clay_Color clayColor) { + static const SDL_FPoint topLeftTexel = { 0, 0 }; + static const SDL_FPoint topRightTexel = { 1, 0 }; + static const SDL_FPoint bottomRightTexel = { 1, 1 }; + static const SDL_FPoint bottomLeftTexel = { 0, 1 }; + SDL_FColor const color = { clayColor.r/255, clayColor.g/255, clayColor.b/255, clayColor.a/255 }; + + const float maxRadius = SDL_min(rect.w, rect.h) / 2.0f; + float radii[4] = { + SDL_min(cornerRadius.topLeft, maxRadius), + SDL_min(cornerRadius.topRight, maxRadius), + SDL_min(cornerRadius.bottomLeft, maxRadius), + SDL_min(cornerRadius.bottomRight, maxRadius), + }; + int numCircleSegments[4] = { 1, 1, 1, 1 }; + int totalVertices = 0; + for (int i = 0; i < 4; ++i) { + numCircleSegments[i] = SDL_clamp((int)radii[i], 1, NUM_CIRCLE_SEGMENTS); + totalVertices += numCircleSegments[i]; + } + + size_t vindex = 0; + // generate topleft corner + SDL_FPoint origin = { + rect.x + radii[0], + rect.y + radii[0] + }; + SDL_FPoint offset = { -1, 0 }; + SDL_Vertex vertices[totalVertices]; + SDL_Clay_GenerateRoundedRectCorner(vertices, vindex, numCircleSegments[0], origin, offset, color, topLeftTexel, radii[0]); + vindex += numCircleSegments[0]; + origin = (SDL_FPoint) { + rect.x + rect.w - radii[1], + rect.y + radii[1] + }; + offset = (SDL_FPoint) { 0, -1 }; + SDL_Clay_GenerateRoundedRectCorner(vertices, vindex, numCircleSegments[1], origin, offset, color, topRightTexel, radii[1]); + vindex += numCircleSegments[1]; + origin = (SDL_FPoint) { + rect.x + rect.w - radii[2], + rect.y + rect.h - radii[2] + }; + offset = (SDL_FPoint) { 1, 0 }; + SDL_Clay_GenerateRoundedRectCorner(vertices, vindex, numCircleSegments[2], origin, offset, color, bottomRightTexel, radii[2]); + vindex += numCircleSegments[2]; + origin = (SDL_FPoint) { + rect.x + radii[3], + rect.y + rect.h - radii[3] + }; + offset = (SDL_FPoint) { 0, 1 }; + SDL_Clay_GenerateRoundedRectCorner(vertices, vindex, numCircleSegments[3], origin, offset, color, bottomLeftTexel, radii[3]); + vindex += numCircleSegments[3]; + + assert(vindex == totalVertices); + size_t totalTris = totalVertices - 2; + int totalIndeces = totalTris * 3; + int indeces[totalTris * 3]; + for (size_t i = 0; i < totalTris; ++i) { + int *tri = indeces + (i * 3); + tri[0] = i + 1; + tri[1] = i + 2; + tri[2] = 0; + } + + // Render everything + SDL_RenderGeometry(rendererData->renderer, NULL, vertices, totalVertices, indeces, totalIndeces); +#if 0 + // Render debug wireframe + for (size_t i = 0; i < totalTris; ++i) { + SDL_SetRenderDrawColor(rendererData->renderer, 255, 255, 255, 255); + SDL_RenderLine(rendererData->renderer, vertices[0].position.x, vertices[0].position.y, vertices[i+2].position.x, vertices[i+2].position.y); + SDL_RenderLine(rendererData->renderer, vertices[0].position.x, vertices[0].position.y, vertices[i+1].position.x, vertices[i+1].position.y); + SDL_RenderLine(rendererData->renderer, vertices[i+1].position.x, vertices[i+1].position.y, vertices[i+2].position.x, vertices[i+2].position.y); + } +#endif +} + +static void SDL_Clay_RenderArc(Clay_SDL3RendererData *rendererData, const SDL_FPoint center, const float radius, const float startAngle, const float endAngle, const float thickness, const Clay_Color color) { + SDL_SetRenderDrawColor(rendererData->renderer, color.r, color.g, color.b, color.a); + + const float radStart = startAngle * (SDL_PI_F / 180.0f); + const float radEnd = endAngle * (SDL_PI_F / 180.0f); + + const int numCircleSegments = SDL_max(NUM_CIRCLE_SEGMENTS, (int)(radius * 1.5f)); //increase circle segments for larger circles, 1.5 is arbitrary. + + const float angleStep = (radEnd - radStart) / (float)numCircleSegments; + const float thicknessStep = 0.4f; //arbitrary value to avoid overlapping lines. Changing THICKNESS_STEP or numCircleSegments might cause artifacts. + + for (float t = thicknessStep; t < thickness - thicknessStep; t += thicknessStep) { + SDL_FPoint points[numCircleSegments + 1]; + const float clampedRadius = SDL_max(radius - t, 1.0f); + + for (int i = 0; i <= numCircleSegments; i++) { + const float angle = radStart + i * angleStep; + points[i] = (SDL_FPoint){ + SDL_roundf(center.x + SDL_cosf(angle) * clampedRadius), + SDL_roundf(center.y + SDL_sinf(angle) * clampedRadius) }; + } + SDL_RenderLines(rendererData->renderer, points, numCircleSegments + 1); + } +} + +SDL_Rect currentClippingRectangle; + +void SDL_Clay_RenderClayCommands(Clay_SDL3RendererData *rendererData, Clay_RenderCommandArray *rcommands) +{ + for (size_t i = 0; i < rcommands->length; i++) { + Clay_RenderCommand *rcmd = Clay_RenderCommandArray_Get(rcommands, i); + const Clay_BoundingBox bounding_box = rcmd->boundingBox; + const SDL_FRect rect = { (int)bounding_box.x, (int)bounding_box.y, (int)bounding_box.width, (int)bounding_box.height }; + + switch (rcmd->commandType) { + case CLAY_RENDER_COMMAND_TYPE_RECTANGLE: { + Clay_RectangleRenderData *config = &rcmd->renderData.rectangle; + SDL_SetRenderDrawBlendMode(rendererData->renderer, SDL_BLENDMODE_BLEND); + SDL_SetRenderDrawColor(rendererData->renderer, config->backgroundColor.r, config->backgroundColor.g, config->backgroundColor.b, config->backgroundColor.a); + if (config->cornerRadius.topLeft > 0 || config->cornerRadius.topRight > 0 || config->cornerRadius.bottomLeft > 0 || config->cornerRadius.bottomRight > 0) { + SDL_Clay_RenderFillRoundedRect(rendererData, rect, config->cornerRadius, config->backgroundColor); + } else { + SDL_RenderFillRect(rendererData->renderer, &rect); + } + } break; + case CLAY_RENDER_COMMAND_TYPE_TEXT: { + Clay_TextRenderData *config = &rcmd->renderData.text; + TTF_Font *font = rendererData->fonts[config->fontId]; + TTF_SetFontSize(font, config->fontSize); + TTF_Text *text = TTF_CreateText(rendererData->textEngine, font, config->stringContents.chars, config->stringContents.length); + TTF_SetTextColor(text, config->textColor.r, config->textColor.g, config->textColor.b, config->textColor.a); + TTF_DrawRendererText(text, rect.x, rect.y); + TTF_DestroyText(text); + } break; + case CLAY_RENDER_COMMAND_TYPE_BORDER: { + Clay_BorderRenderData *config = &rcmd->renderData.border; + + const float minRadius = SDL_min(rect.w, rect.h) / 2.0f; + const Clay_CornerRadius clampedRadii = { + .topLeft = SDL_min(config->cornerRadius.topLeft, minRadius), + .topRight = SDL_min(config->cornerRadius.topRight, minRadius), + .bottomLeft = SDL_min(config->cornerRadius.bottomLeft, minRadius), + .bottomRight = SDL_min(config->cornerRadius.bottomRight, minRadius) + }; + //edges + SDL_SetRenderDrawColor(rendererData->renderer, config->color.r, config->color.g, config->color.b, config->color.a); + if (config->width.left > 0) { + const float starting_y = rect.y + clampedRadii.topLeft; + const float length = rect.h - clampedRadii.topLeft - clampedRadii.bottomLeft; + SDL_FRect line = { rect.x - 1, starting_y, config->width.left, length }; + SDL_RenderFillRect(rendererData->renderer, &line); + } + if (config->width.right > 0) { + const float starting_x = rect.x + rect.w - (float)config->width.right + 1; + const float starting_y = rect.y + clampedRadii.topRight; + const float length = rect.h - clampedRadii.topRight - clampedRadii.bottomRight; + SDL_FRect line = { starting_x, starting_y, config->width.right, length }; + SDL_RenderFillRect(rendererData->renderer, &line); + } + if (config->width.top > 0) { + const float starting_x = rect.x + clampedRadii.topLeft; + const float length = rect.w - clampedRadii.topLeft - clampedRadii.topRight; + SDL_FRect line = { starting_x, rect.y - 1, length, config->width.top }; + SDL_RenderFillRect(rendererData->renderer, &line); + } + if (config->width.bottom > 0) { + const float starting_x = rect.x + clampedRadii.bottomLeft; + const float starting_y = rect.y + rect.h - (float)config->width.bottom + 1; + const float length = rect.w - clampedRadii.bottomLeft - clampedRadii.bottomRight; + SDL_FRect line = { starting_x, starting_y, length, config->width.bottom }; + SDL_SetRenderDrawColor(rendererData->renderer, config->color.r, config->color.g, config->color.b, config->color.a); + SDL_RenderFillRect(rendererData->renderer, &line); + } + //corners + if (config->cornerRadius.topLeft > 0) { + const float centerX = rect.x + clampedRadii.topLeft -1; + const float centerY = rect.y + clampedRadii.topLeft - 1; + SDL_Clay_RenderArc(rendererData, (SDL_FPoint){centerX, centerY}, clampedRadii.topLeft, + 180.0f, 270.0f, config->width.top, config->color); + } + if (config->cornerRadius.topRight > 0) { + const float centerX = rect.x + rect.w - clampedRadii.topRight; + const float centerY = rect.y + clampedRadii.topRight - 1; + SDL_Clay_RenderArc(rendererData, (SDL_FPoint){centerX, centerY}, clampedRadii.topRight, + 270.0f, 360.0f, config->width.top, config->color); + } + if (config->cornerRadius.bottomLeft > 0) { + const float centerX = rect.x + clampedRadii.bottomLeft -1; + const float centerY = rect.y + rect.h - clampedRadii.bottomLeft; + SDL_Clay_RenderArc(rendererData, (SDL_FPoint){centerX, centerY}, clampedRadii.bottomLeft, + 90.0f, 180.0f, config->width.bottom, config->color); + } + if (config->cornerRadius.bottomRight > 0) { + const float centerX = rect.x + rect.w - clampedRadii.bottomRight; + const float centerY = rect.y + rect.h - clampedRadii.bottomRight; + SDL_Clay_RenderArc(rendererData, (SDL_FPoint){centerX, centerY}, clampedRadii.bottomRight, + 0.0f, 90.0f, config->width.bottom, config->color); + } + + } break; + case CLAY_RENDER_COMMAND_TYPE_SCISSOR_START: { + Clay_BoundingBox boundingBox = rcmd->boundingBox; + currentClippingRectangle = (SDL_Rect) { + .x = boundingBox.x, + .y = boundingBox.y, + .w = boundingBox.width, + .h = boundingBox.height, + }; + SDL_SetRenderClipRect(rendererData->renderer, ¤tClippingRectangle); + break; + } + case CLAY_RENDER_COMMAND_TYPE_SCISSOR_END: { + SDL_SetRenderClipRect(rendererData->renderer, NULL); + break; + } + case CLAY_RENDER_COMMAND_TYPE_IMAGE: { + SDL_Texture *texture = (SDL_Texture *)rcmd->renderData.image.imageData; + const SDL_FRect dest = { rect.x, rect.y, rect.w, rect.h }; + SDL_RenderTexture(rendererData->renderer, texture, NULL, &dest); + break; + } + default: + SDL_Log("Unknown render command type: %d", rcmd->commandType); + } + } +} diff --git a/vendor/renderer/clay_renderer_SDL3.h b/vendor/renderer/clay_renderer_SDL3.h new file mode 100644 index 0000000..71f05da --- /dev/null +++ b/vendor/renderer/clay_renderer_SDL3.h @@ -0,0 +1,22 @@ +#ifndef CLAY_RENDERER_SDL3_H +#define CLAY_RENDERER_SDL3_H + +#ifdef __cplusplus +extern "C" { +#endif +#include +#include +#include + +typedef struct { + SDL_Renderer *renderer; + TTF_TextEngine *textEngine; + TTF_Font **fonts; +} Clay_SDL3RendererData; + +extern void SDL_Clay_RenderClayCommands(Clay_SDL3RendererData *rendererData, Clay_RenderCommandArray *rcommands); +#ifdef __cplusplus +} +#endif + +#endif // !CLAY_RENDERER_SDL3_H diff --git a/vendor/renderer/ui_data.c b/vendor/renderer/ui_data.c new file mode 100644 index 0000000..2172d96 --- /dev/null +++ b/vendor/renderer/ui_data.c @@ -0,0 +1,30 @@ +#include "ui_data.h" +#include +#include + +const size_t uiDataLength = UI_DATA_SIZE; + +static size_t utilized = 9; +static char uiDataArena[UI_DATA_SIZE]; +static char *uiDataWriter = uiDataArena; + +Clay_String UiData_StoreString(char const *data, size_t amount) { + if (utilized + amount > uiDataLength) { + return CLAY_STRING("out of arena memory"); + } + memcpy(uiDataWriter, data, amount); + Clay_String result = { + false, (int32_t)amount, uiDataWriter + }; + uiDataWriter += amount; + utilized += amount; + return result; +} +Clay_String UiData_StoreClayStr(Clay_String string) { + return UiData_StoreString(string.chars, string.length); +} + +void UiData_Clear() { + utilized = 0; + uiDataWriter = uiDataArena; +} diff --git a/vendor/renderer/ui_data.h b/vendor/renderer/ui_data.h new file mode 100644 index 0000000..ac62421 --- /dev/null +++ b/vendor/renderer/ui_data.h @@ -0,0 +1,23 @@ +#ifndef UI_DATA_H +#define UI_DATA_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef UI_DATA_SIZE +#define UI_DATA_SIZE 1024*1024 +#endif + +extern Clay_String UiData_StoreString(char const *data, size_t amount); +extern Clay_String UiData_StoreClayStr(Clay_String str); +extern void UiData_Clear(); + +#ifdef __cplusplus +} +#endif + +#endif // !UI_DATA_ From 761560f82d23dd6d1478c01e3f43d21902c1571c Mon Sep 17 00:00:00 2001 From: Sara Date: Sun, 26 Oct 2025 14:10:11 +0100 Subject: [PATCH 66/87] chore: added .dir-locals.el --- .dir-locals.el | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .dir-locals.el diff --git a/.dir-locals.el b/.dir-locals.el new file mode 100644 index 0000000..bfab89f --- /dev/null +++ b/.dir-locals.el @@ -0,0 +1,4 @@ +((nil + (indent-tabs-mode . t) + (tab-width . 4) + (lsp-enable-on-type-formatting nil))) From 2d669e64110869829f027016e7d5445258114d55 Mon Sep 17 00:00:00 2001 From: Sara Date: Sun, 26 Oct 2025 14:27:30 +0100 Subject: [PATCH 67/87] feat: initialized project --- CMakeLists.txt | 8 +- asset-src/dice_icons.svg | 180 +++++++++++++++++++++++++++++++++++++++ assets/icons/d10.svg | 18 ++++ assets/icons/d12.svg | 19 +++++ assets/icons/d2.svg | 19 +++++ assets/icons/d20.svg | 19 +++++ assets/icons/d4.svg | 19 +++++ assets/icons/d6.svg | 22 +++++ assets/icons/d8.svg | 19 +++++ justfile | 4 +- 10 files changed, 321 insertions(+), 6 deletions(-) create mode 100644 asset-src/dice_icons.svg create mode 100644 assets/icons/d10.svg create mode 100644 assets/icons/d12.svg create mode 100644 assets/icons/d2.svg create mode 100644 assets/icons/d20.svg create mode 100644 assets/icons/d4.svg create mode 100644 assets/icons/d6.svg create mode 100644 assets/icons/d8.svg diff --git a/CMakeLists.txt b/CMakeLists.txt index 9340897..3130a7f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.21) -project(CHANGEME) +project(dice-gui) set(CMAKE_BINARY_DIR "${CMAKE_SOURCE_DIR}/bin") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}") @@ -15,11 +15,11 @@ add_subdirectory(vendor/SDL3/ EXCLUDE_FROM_ALL) set(SDLTTF_VENDORED ON) add_subdirectory(vendor/SDL3_ttf/ EXCLUDE_FROM_ALL) -add_executable(CHANGEME ${source_files}) -target_link_libraries(CHANGEME PRIVATE SDL3_ttf::SDL3_ttf SDL3::SDL3) +add_executable(dice-gui ${source_files}) +target_link_libraries(dice-gui PRIVATE SDL3_ttf::SDL3_ttf SDL3::SDL3) add_custom_target(copy_assets COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/assets/ ${CMAKE_BINARY_DIR}/assets ) -add_dependencies(CHANGEME copy_assets) +add_dependencies(dice-gui copy_assets) diff --git a/asset-src/dice_icons.svg b/asset-src/dice_icons.svg new file mode 100644 index 0000000..2987abc --- /dev/null +++ b/asset-src/dice_icons.svg @@ -0,0 +1,180 @@ + + + + diff --git a/assets/icons/d10.svg b/assets/icons/d10.svg new file mode 100644 index 0000000..d151e8d --- /dev/null +++ b/assets/icons/d10.svg @@ -0,0 +1,18 @@ + + + + diff --git a/assets/icons/d12.svg b/assets/icons/d12.svg new file mode 100644 index 0000000..4028926 --- /dev/null +++ b/assets/icons/d12.svg @@ -0,0 +1,19 @@ + + + + diff --git a/assets/icons/d2.svg b/assets/icons/d2.svg new file mode 100644 index 0000000..9d90323 --- /dev/null +++ b/assets/icons/d2.svg @@ -0,0 +1,19 @@ + + + + diff --git a/assets/icons/d20.svg b/assets/icons/d20.svg new file mode 100644 index 0000000..df1a4cd --- /dev/null +++ b/assets/icons/d20.svg @@ -0,0 +1,19 @@ + + + + diff --git a/assets/icons/d4.svg b/assets/icons/d4.svg new file mode 100644 index 0000000..feed6a9 --- /dev/null +++ b/assets/icons/d4.svg @@ -0,0 +1,19 @@ + + + + diff --git a/assets/icons/d6.svg b/assets/icons/d6.svg new file mode 100644 index 0000000..3324024 --- /dev/null +++ b/assets/icons/d6.svg @@ -0,0 +1,22 @@ + + + + diff --git a/assets/icons/d8.svg b/assets/icons/d8.svg new file mode 100644 index 0000000..722aca5 --- /dev/null +++ b/assets/icons/d8.svg @@ -0,0 +1,19 @@ + + + + diff --git a/justfile b/justfile index a106e4d..7c23837 100644 --- a/justfile +++ b/justfile @@ -3,7 +3,7 @@ build: cmake --build build run: - cd bin/ && CHANGEME + cd bin/ && dice-gui configure: # CONFIGURING WITH PREMAKE @@ -16,4 +16,4 @@ clean: set-project-name projectname: clean git remote set-url origin "" - sed -i "s/CHANGEME/{{projectname}}/g" ./CMakeLists.txt ./justfile + sed -i "s/dice-gui/{{projectname}}/g" ./CMakeLists.txt ./justfile From f32494a29f97d2ea0959c2139053716e5f886dfd Mon Sep 17 00:00:00 2001 From: Sara Date: Sun, 26 Oct 2025 20:05:00 +0100 Subject: [PATCH 68/87] feat: cleaned up and created 'ceramic/' --- .clang-format | 204 +++++++++++++++++++++++++++++++++ src/application.cpp | 15 +-- src/{ => ceramic}/elements.cpp | 4 +- src/{ => ceramic}/elements.h | 5 +- src/ceramic/resources.cpp | 28 +++++ src/{ => ceramic}/resources.h | 4 +- src/{ => ceramic}/style.cpp | 49 ++------ src/{ => ceramic}/style.h | 27 ++--- src/main.cpp | 8 +- src/resources.cpp | 32 ------ src/thread_pool.cpp | 54 --------- src/thread_pool.h | 30 ----- 12 files changed, 265 insertions(+), 195 deletions(-) create mode 100644 .clang-format rename src/{ => ceramic}/elements.cpp (96%) rename src/{ => ceramic}/elements.h (83%) create mode 100644 src/ceramic/resources.cpp rename src/{ => ceramic}/resources.h (73%) rename src/{ => ceramic}/style.cpp (64%) rename src/{ => ceramic}/style.h (81%) delete mode 100644 src/resources.cpp delete mode 100644 src/thread_pool.cpp delete mode 100644 src/thread_pool.h diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..5c9a9a3 --- /dev/null +++ b/.clang-format @@ -0,0 +1,204 @@ +--- +BasedOnStyle: Microsoft +AccessModifierOffset: -4 +AlignAfterOpenBracket: DontAlign +AlignArrayOfStructures: None +AlignConsecutiveAssignments: None +AlignConsecutiveBitFields: None +AlignConsecutiveDeclarations: None +AlignConsecutiveMacros: None +AlignEscapedNewlines: Right +AlignOperands: DontAlign +AlignTrailingComments: + Kind: Always + OverEmptyLines: 0 +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortEnumsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: All +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +AttributeMacros: + - __capability +BinPackArguments: true +BinPackParameters: true +BitFieldColonSpacing: Both +BreakAfterAttributes: Never +BreakAfterJavaFieldAnnotations: false +BreakArrays: false +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Custom +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: false + SplitEmptyRecord: false + SplitEmptyNamespace: false +BreakBeforeConceptDeclarations: Always +BreakBeforeInlineASMColon: OnlyMultiline +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeComma +BreakInheritanceList: BeforeColon +BreakStringLiterals: true +ColumnLimit: 0 +CommentPragmas: "^ IWYU pragma:" +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: ^"(llvm|llvm-c|clang|clang-c)/ + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: ^(<|"(gtest|gmock|isl|json)/) + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: .* + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: (Test)?$ +IncludeIsMainSourceRegex: "" +IndentAccessModifiers: false +IndentCaseBlocks: false +IndentCaseLabels: false +IndentExternBlock: AfterExternBlock +IndentGotoLabels: true +IndentPPDirectives: None +IndentRequiresClause: true +IndentWidth: 4 +IndentWrappedFunctionNames: false +InsertBraces: true +InsertNewlineAtEOF: true +InsertTrailingCommas: None +IntegerLiteralSeparator: + Binary: 0 + BinaryMinDigits: 0 + Decimal: 0 + DecimalMinDigits: 0 + Hex: 0 + HexMinDigits: 0 +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +LambdaBodyIndentation: Signature +Language: Cpp +LineEnding: DeriveLF +MacroBlockBegin: "" +MacroBlockEnd: "" +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 4 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PPIndentWidth: -1 +PackConstructorInitializers: BinPack +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyIndentedWhitespace: 0 +PenaltyReturnTypeOnItsOwnLine: 1000 +PointerAlignment: Right +QualifierAlignment: Leave +ReferenceAlignment: Pointer +ReflowComments: true +RemoveBracesLLVM: false +RemoveSemicolon: false +RequiresClausePosition: OwnLine +RequiresExpressionIndentation: OuterScope +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SortIncludes: CaseSensitive +SortJavaStaticImport: Before +SortUsingDeclarations: LexicographicNumeric +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceAroundPointerQualifiers: Default +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: Never +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDeclarationName: false + AfterFunctionDefinitionName: false + AfterIfMacros: false + AfterOverloadedOperator: false + AfterRequiresInClause: false + AfterRequiresInExpression: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: false +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInCStyleCastParentheses: false +SpacesInConditionalStatement: false +SpacesInContainerLiterals: true +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Latest +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 4 +UseTab: Always +WhitespaceSensitiveMacros: + - BOOST_PP_STRINGIZE + - CF_SWIFT_NAME + - NS_SWIFT_NAME + - PP_STRINGIZE + - STRINGIZE +UseCRLF: false diff --git a/src/application.cpp b/src/application.cpp index decafbb..c269306 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -1,24 +1,13 @@ #include "application.h" -#include "style.h" -#include "elements.h" +#include "ceramic/style.h" +#include "ceramic/elements.h" #include #include namespace application { -static void SampleHeader() { - elements::Header(CLAY_STRING("Left Panel"), 2, { - .textColor = style::color::white - }); -} - Clay_RenderCommandArray RenderApplication() { Clay_BeginLayout(); CLAY(CLAY_ID("OuterContainer"), style::Window()) { - CLAY_AUTO_ID(style::PanelContainer(0, { - .layout = { .sizing = { CLAY_SIZING_PERCENT(0.15), CLAY_SIZING_GROW() } } - })) { - SampleHeader(); - } } return Clay_EndLayout(); } diff --git a/src/elements.cpp b/src/ceramic/elements.cpp similarity index 96% rename from src/elements.cpp rename to src/ceramic/elements.cpp index b261a97..72ffea9 100644 --- a/src/elements.cpp +++ b/src/ceramic/elements.cpp @@ -21,7 +21,7 @@ void TextButton(Clay_String text, Clay_Color color, OnHoveredFn onHovered, intpt }) { Clay_OnHover(onHovered, onHoveredData); elements::Body(text, { - .textColor = style::TextColor(0), + .textColor = style::textColor, .textAlignment = CLAY_TEXT_ALIGN_CENTER, }); } @@ -65,7 +65,7 @@ void Toggle(Clay_String label, Clay_Color selected, bool &state) { }, }) { } Body(label, { - .textColor = style::TextColor(0) + .textColor = style::textColor }); } } diff --git a/src/elements.h b/src/ceramic/elements.h similarity index 83% rename from src/elements.h rename to src/ceramic/elements.h index 1f5269e..c34a52e 100644 --- a/src/elements.h +++ b/src/ceramic/elements.h @@ -2,13 +2,14 @@ #define ELEMENTS_H #include +#include "style.h" namespace elements { typedef void(*OnHoveredFn)(Clay_ElementId element, Clay_PointerData pointer, intptr_t data); void TextButton(Clay_String text, Clay_Color color, OnHoveredFn onHovered, intptr_t onHoveredData = 0); void Toggle(Clay_String label, Clay_Color selected, bool &state); -void Body(Clay_String string, Clay_TextElementConfig baseCfg = {}); -void Header(Clay_String string, size_t header, Clay_TextElementConfig baseCfg = {}); +void Body(Clay_String string, Clay_TextElementConfig baseCfg = {.textColor = style::textColor}); +void Header(Clay_String string, size_t header, Clay_TextElementConfig baseCfg = {.textColor = style::textColor}); } #endif // !ELEMENTS_H diff --git a/src/ceramic/resources.cpp b/src/ceramic/resources.cpp new file mode 100644 index 0000000..8a2494d --- /dev/null +++ b/src/ceramic/resources.cpp @@ -0,0 +1,28 @@ +#include "resources.h" +#include "style.h" +#include +#include +#include +#include + +namespace resources { +TTF_Font *defaultFont[FONT_MAX]; +TTF_TextEngine *textEngine = nullptr; + +void SetDefaultFont(char const *path) { + defaultFont[FONT_DEFAULT] = TTF_OpenFont(path, style::baseFontSize * 5); + if (defaultFont[FONT_DEFAULT] == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load default font '%s': %s", path, SDL_GetError()); + exit(6); + } + TTF_SetFontHinting(defaultFont[FONT_DEFAULT], TTF_HINTING_LIGHT_SUBPIXEL); + defaultFont[FONT_BOLD] = TTF_OpenFont(path, style::baseFontSize * 5); + if (defaultFont[FONT_BOLD] == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load default bold font '%s': %s", path, SDL_GetError()); + exit(6); + } + TTF_SetFontHinting(defaultFont[FONT_BOLD], TTF_HINTING_LIGHT_SUBPIXEL); + TTF_SetFontStyle(defaultFont[FONT_BOLD], TTF_STYLE_BOLD); + SDL_Log("SetDefaultFont: Success"); +} +} diff --git a/src/resources.h b/src/ceramic/resources.h similarity index 73% rename from src/resources.h rename to src/ceramic/resources.h index ef12346..c341e54 100644 --- a/src/resources.h +++ b/src/ceramic/resources.h @@ -11,9 +11,9 @@ enum Font { }; extern TTF_TextEngine *textEngine; -extern TTF_Font *fonts[FONT_MAX]; +extern TTF_Font *defaultFont[FONT_MAX]; -void LoadResources(); +void SetDefaultFont(char const *path); } #endif // !RESOURCES_H diff --git a/src/style.cpp b/src/ceramic/style.cpp similarity index 64% rename from src/style.cpp rename to src/ceramic/style.cpp index 7fab4b6..1e24225 100644 --- a/src/style.cpp +++ b/src/ceramic/style.cpp @@ -1,22 +1,23 @@ #include "style.h" +#include "SDL3/SDL_stdinc.h" #include "resources.h" #include namespace style { Clay_ElementDeclaration ListContainer(size_t depth, Clay_ElementDeclaration baseCfg) { baseCfg.border = { - PanelBorder(depth), - CLAY_BORDER_ALL(2) + .color = panelBorder, + .width = CLAY_BORDER_ALL(2) }; baseCfg.cornerRadius = defaultRadiusAll; return baseCfg; } Clay_ElementDeclaration PanelContainer(size_t depth, Clay_ElementDeclaration baseCfg) { - baseCfg.backgroundColor = PanelBackground(depth); + baseCfg.backgroundColor = panelBackground; baseCfg.border = { - PanelBorder(depth), - CLAY_BORDER_OUTSIDE(2) + .color = panelBorder, + .width = CLAY_BORDER_OUTSIDE(2) }; baseCfg.cornerRadius = defaultRadiusAll; baseCfg.layout.padding = CLAY_PADDING_ALL(8); @@ -39,49 +40,23 @@ Clay_ElementDeclaration RightPanelContainer(size_t depth, Clay_ElementDeclaratio return baseCfg; } -Clay_Color PanelBackground(size_t idx) { - return { - 255*panelBackground[idx], - 255*panelBackground[idx], - 255*panelBackground[idx], - 255 - }; -} - -Clay_Color PanelBorder(size_t idx) { - return { - 255*panelBorder[idx], - 255*panelBorder[idx], - 255*panelBorder[idx], - 255 - }; -} - -Clay_Color TextColor(size_t idx) { - return { - 255*textColorsP[idx], - 255*textColorsP[idx], - 255*textColorsP[idx], - 255 - }; -} - Clay_ElementDeclaration Window() { return { .layout = { .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, - .padding = CLAY_PADDING_ALL(0), + .padding = CLAY_PADDING_ALL(windowPadding), .childGap = 0, - .layoutDirection = CLAY_LEFT_TO_RIGHT, + .layoutDirection = CLAY_LEFT_TO_RIGHT }, + .backgroundColor = windowColor }; } Clay_Color ToHoveredColor(Clay_Color color) { float avg = (color.r + color.g + color.b) / 3.f; - color.r = (color.r - avg) * 0.8f + avg - 30; - color.g = (color.g - avg) * 0.8f + avg - 30; - color.b = (color.b - avg) * 0.8f + avg - 30; + color.r = SDL_clamp((color.r - avg) * 0.8f + avg - 30, 0., 1.); + color.g = SDL_clamp((color.g - avg) * 0.8f + avg - 30, 0., 1.); + color.b = SDL_clamp((color.b - avg) * 0.8f + avg - 30, 0., 1.); return color; } } diff --git a/src/style.h b/src/ceramic/style.h similarity index 81% rename from src/style.h rename to src/ceramic/style.h index 9ba6024..218ff7b 100644 --- a/src/style.h +++ b/src/ceramic/style.h @@ -9,21 +9,18 @@ namespace style { // WINDOW STYLE //////////////////////////////////// -constexpr uint16_t windowPadding{ 10 }; +constexpr uint16_t windowPadding{1}; +constexpr Clay_Color windowColor{20, 20, 20, 255}; //////////////////////////////////// // CONTAINER STYLE //////////////////////////////////// -constexpr uint16_t containerGap{ 10 }; -constexpr double defaultRadius{ 5.0 }; +constexpr uint16_t containerGap{10}; +constexpr double defaultRadius{5.0}; -constexpr float panelBackground[] = { - .4f, .3f, .2f -}; -constexpr float panelBorder[] = { - .5f, .4f, .3f -}; +constexpr Clay_Color panelBackground{ 0,0,0,0 }; +constexpr Clay_Color panelBorder { 150, 150, 150, 150 }; constexpr Clay_Padding panelPadding = { 24, 24, @@ -34,8 +31,6 @@ Clay_ElementDeclaration ListContainer(size_t depth, Clay_ElementDeclaration base Clay_ElementDeclaration PanelContainer(size_t depth, Clay_ElementDeclaration baseCfg); Clay_ElementDeclaration LeftPanelContainer(size_t depth, Clay_ElementDeclaration baseCfg); Clay_ElementDeclaration RightPanelContainer(size_t depth, Clay_ElementDeclaration baseCfg); -Clay_Color PanelBackground(size_t idx); -Clay_Color PanelBorder(size_t idx); Clay_ElementDeclaration Window(); //////////////////////////////////// @@ -44,16 +39,10 @@ Clay_ElementDeclaration Window(); constexpr float paragraphGap = 10; constexpr uint16_t baseFontSize = 16; -constexpr float textColorsP[] = { - 0.9f, 0.9f, 0.9f -}; -constexpr uint16_t headerSizes[] = { - 64, 32, - 28, 16 -}; +constexpr uint16_t headerSizes[] = {64, 32, 28, 16}; -Clay_Color TextColor(size_t idx); +constexpr Clay_Color textColor{170, 170, 170, 255}; //////////////////////////////////// // BUTTONS diff --git a/src/main.cpp b/src/main.cpp index 543d5f0..d649347 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,7 +2,7 @@ #include "application.h" #include "input.h" -#include "resources.h" +#include "ceramic/resources.h" #include #include #include @@ -90,7 +90,7 @@ void InitClay() { clayMemorySize = Clay_MinMemorySize(); clayPrimaryArena = Clay_CreateArenaWithCapacityAndMemory(clayMemorySize, SDL_malloc(clayMemorySize)); Clay_Initialize(clayPrimaryArena, { (float)screenWidth, (float)screenHeight }, { HandleClayErrors }); - Clay_SetMeasureTextFunction(MeasureText, resources::fonts); + Clay_SetMeasureTextFunction(MeasureText, resources::defaultFont); Clay_SetLayoutDimensions({ (float)screenWidth, (float)screenHeight }); float x{ 0 }, y{ 0 }; SDL_GetMouseState(&x, &y); @@ -99,10 +99,10 @@ void InitClay() { int main(int argc, char *argv[]) { InitSDL(); - resources::LoadResources(); + resources::SetDefaultFont("assets/AdwaitaSans-Regular.ttf"); LogOutputResolution(); InitClay(); - backendData = { renderer, resources::textEngine, resources::fonts }; + backendData = { renderer, resources::textEngine, resources::defaultFont }; SDL_Event event; uint64_t startFrameTime = SDL_GetTicksNS(); double deltaTime = 0.0; diff --git a/src/resources.cpp b/src/resources.cpp deleted file mode 100644 index 845ef9f..0000000 --- a/src/resources.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "resources.h" -#include "style.h" -#include -#include -#include -#include - -namespace resources { -TTF_Font *fonts[FONT_MAX]; -TTF_TextEngine *textEngine = nullptr; - -static inline void LoadFonts() { - fonts[FONT_DEFAULT] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", style::baseFontSize * 5); - if (fonts[FONT_DEFAULT] == nullptr) { - SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load adwaita sans: %s", SDL_GetError()); - exit(6); - } - TTF_SetFontHinting(fonts[FONT_DEFAULT], TTF_HINTING_LIGHT_SUBPIXEL); - fonts[FONT_BOLD] = TTF_OpenFont("assets/AdwaitaSans-Regular.ttf", style::baseFontSize * 5); - if (fonts[FONT_BOLD] == nullptr) { - SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load adwaita sans bold: %s", SDL_GetError()); - exit(6); - } - TTF_SetFontHinting(fonts[FONT_BOLD], TTF_HINTING_LIGHT_SUBPIXEL); - TTF_SetFontStyle(fonts[FONT_BOLD], TTF_STYLE_BOLD); - SDL_Log("LoadFonts: Success"); -} - -void LoadResources() { - LoadFonts(); -} -} diff --git a/src/thread_pool.cpp b/src/thread_pool.cpp deleted file mode 100644 index 48e4d25..0000000 --- a/src/thread_pool.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "thread_pool.h" -#include -#include -#include - -namespace threading { -ThreadPool::ThreadPool() { - size_t const thread_count{ std::max(std::thread::hardware_concurrency() - 1, 1u) }; - this->threads.reserve(thread_count); - for (size_t i{ 0 }; i < thread_count; ++i) { - this->threads.emplace_back(std::bind(&ThreadPool::ThreadFn, this)); - } -} - -ThreadPool::~ThreadPool() { - { std::scoped_lock lock{ this->lock }; - this->shutdown = true; - this->threadNotifier.notify_all(); - } - for (std::thread &thread : this->threads) { - thread.join(); - } -} - -size_t ThreadPool::GetThreadCount() { - return this->threads.size(); -} - -void ThreadPool::ScheduleTask(TaskFunc fn) { - std::scoped_lock lock{ this->lock }; - this->taskQueue.emplace(std::move(fn)); - this->threadNotifier.notify_one(); -} - -void ThreadPool::ThreadFn() { - TaskFunc function; - for(;;) { - { std::unique_lock lock{ this->lock }; - while (!this->shutdown && this->taskQueue.empty()) { - this->threadNotifier.wait(lock); - } - if (this->taskQueue.empty()) { - return; - } - function = std::move(this->taskQueue.front()); - this->taskQueue.pop(); - } - - function.operator()(); - } -} - -ThreadPool tasks{}; -} diff --git a/src/thread_pool.h b/src/thread_pool.h deleted file mode 100644 index eb55962..0000000 --- a/src/thread_pool.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef THREAD_POOL_H -#define THREAD_POOL_H - -#include -#include -#include -#include -#include - -namespace threading { -typedef std::function TaskFunc; - -class ThreadPool { -public: ThreadPool(); - ~ThreadPool(); - void ScheduleTask(TaskFunc jobs); - size_t GetThreadCount(); -private: - void ThreadFn(); - std::queue taskQueue{}; - std::vector threads{}; - std::mutex lock{}; - std::condition_variable threadNotifier{}; - bool shutdown{ false }; -}; - -extern ThreadPool tasks; -} - -#endif // !THREAD_POOL_H From fc07424af4870157e856b0c96170bdba9b475dd0 Mon Sep 17 00:00:00 2001 From: Sara Date: Sun, 26 Oct 2025 20:21:47 +0100 Subject: [PATCH 69/87] chore: renamed namespaces in ceramic/ to cera:: --- src/application.cpp | 4 +++- src/ceramic/elements.cpp | 30 +++++++++++++++--------------- src/ceramic/elements.h | 6 +++--- src/ceramic/resources.cpp | 6 +++--- src/ceramic/resources.h | 2 +- src/ceramic/style.cpp | 14 +++++++------- src/ceramic/style.h | 10 +++++----- src/main.cpp | 8 ++++---- 8 files changed, 41 insertions(+), 39 deletions(-) diff --git a/src/application.cpp b/src/application.cpp index c269306..904d071 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -7,7 +7,9 @@ namespace application { Clay_RenderCommandArray RenderApplication() { Clay_BeginLayout(); - CLAY(CLAY_ID("OuterContainer"), style::Window()) { + CLAY(CLAY_ID("OuterContainer"), cera::Window()) { + CLAY_AUTO_ID(cera::LeftPanelContainer()) { + } } return Clay_EndLayout(); } diff --git a/src/ceramic/elements.cpp b/src/ceramic/elements.cpp index 72ffea9..4650361 100644 --- a/src/ceramic/elements.cpp +++ b/src/ceramic/elements.cpp @@ -2,26 +2,26 @@ #include "style.h" #include "resources.h" -namespace elements { +namespace cera { void TextButton(Clay_String text, Clay_Color color, OnHoveredFn onHovered, intptr_t onHoveredData) { - Clay_Color hovered{ style::ToHoveredColor(color) }; + Clay_Color hovered{ cera::ToHoveredColor(color) }; CLAY_AUTO_ID({ .layout = { - .padding = style::buttonPadding, + .padding = cera::buttonPadding, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, }, .backgroundColor = Clay_Hovered() ? hovered : color, - .cornerRadius = style::buttonRadii, + .cornerRadius = cera::buttonRadii, .border = { - style::ToHoveredColor(Clay_Hovered() ? hovered : color), + cera::ToHoveredColor(Clay_Hovered() ? hovered : color), CLAY_BORDER_ALL(2) }, }) { Clay_OnHover(onHovered, onHoveredData); - elements::Body(text, { - .textColor = style::textColor, + cera::Body(text, { + .textColor = cera::textColor, .textAlignment = CLAY_TEXT_ALIGN_CENTER, }); } @@ -44,7 +44,7 @@ void Toggle(Clay_String label, Clay_Color selected, bool &state) { }, }) { Clay_Color color{Clay_Hovered() - ? style::ToHoveredColor(selected) + ? cera::ToHoveredColor(selected) : selected }; Clay_OnHover(&ToggleHovered, (intptr_t)(&state)); @@ -56,29 +56,29 @@ void Toggle(Clay_String label, Clay_Color selected, bool &state) { }, .backgroundColor = (state ? selected - : style::color::transparent + : cera::color::transparent ), - .cornerRadius = style::buttonRadii, + .cornerRadius = cera::buttonRadii, .border = { color, CLAY_BORDER_OUTSIDE(3) }, }) { } Body(label, { - .textColor = style::textColor + .textColor = cera::textColor }); } } void Body(Clay_String string, Clay_TextElementConfig baseCfg) { - baseCfg.fontId = resources::FONT_DEFAULT; - baseCfg.fontSize = style::baseFontSize; + baseCfg.fontId = cera::FONT_DEFAULT; + baseCfg.fontSize = cera::baseFontSize; CLAY_TEXT(string, CLAY_TEXT_CONFIG(baseCfg)); } void Header(Clay_String string, size_t header, Clay_TextElementConfig baseCfg) { - baseCfg.fontId = resources::FONT_BOLD; - baseCfg.fontSize = style::headerSizes[(header)-1]; + baseCfg.fontId = cera::FONT_BOLD; + baseCfg.fontSize = cera::headerSizes[(header)-1]; CLAY_TEXT(string, CLAY_TEXT_CONFIG(baseCfg)); } } diff --git a/src/ceramic/elements.h b/src/ceramic/elements.h index c34a52e..c9a6881 100644 --- a/src/ceramic/elements.h +++ b/src/ceramic/elements.h @@ -4,12 +4,12 @@ #include #include "style.h" -namespace elements { +namespace cera { typedef void(*OnHoveredFn)(Clay_ElementId element, Clay_PointerData pointer, intptr_t data); void TextButton(Clay_String text, Clay_Color color, OnHoveredFn onHovered, intptr_t onHoveredData = 0); void Toggle(Clay_String label, Clay_Color selected, bool &state); -void Body(Clay_String string, Clay_TextElementConfig baseCfg = {.textColor = style::textColor}); -void Header(Clay_String string, size_t header, Clay_TextElementConfig baseCfg = {.textColor = style::textColor}); +void Body(Clay_String string, Clay_TextElementConfig baseCfg = {.textColor = cera::textColor}); +void Header(Clay_String string, size_t header, Clay_TextElementConfig baseCfg = {.textColor = cera::textColor}); } #endif // !ELEMENTS_H diff --git a/src/ceramic/resources.cpp b/src/ceramic/resources.cpp index 8a2494d..2798d80 100644 --- a/src/ceramic/resources.cpp +++ b/src/ceramic/resources.cpp @@ -5,18 +5,18 @@ #include #include -namespace resources { +namespace cera { TTF_Font *defaultFont[FONT_MAX]; TTF_TextEngine *textEngine = nullptr; void SetDefaultFont(char const *path) { - defaultFont[FONT_DEFAULT] = TTF_OpenFont(path, style::baseFontSize * 5); + defaultFont[FONT_DEFAULT] = TTF_OpenFont(path, cera::baseFontSize * 5); if (defaultFont[FONT_DEFAULT] == nullptr) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load default font '%s': %s", path, SDL_GetError()); exit(6); } TTF_SetFontHinting(defaultFont[FONT_DEFAULT], TTF_HINTING_LIGHT_SUBPIXEL); - defaultFont[FONT_BOLD] = TTF_OpenFont(path, style::baseFontSize * 5); + defaultFont[FONT_BOLD] = TTF_OpenFont(path, cera::baseFontSize * 5); if (defaultFont[FONT_BOLD] == nullptr) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load default bold font '%s': %s", path, SDL_GetError()); exit(6); diff --git a/src/ceramic/resources.h b/src/ceramic/resources.h index c341e54..3adc3cf 100644 --- a/src/ceramic/resources.h +++ b/src/ceramic/resources.h @@ -3,7 +3,7 @@ #include -namespace resources { +namespace cera { enum Font { FONT_DEFAULT = 0, FONT_BOLD = 1, diff --git a/src/ceramic/style.cpp b/src/ceramic/style.cpp index 1e24225..616b284 100644 --- a/src/ceramic/style.cpp +++ b/src/ceramic/style.cpp @@ -3,8 +3,8 @@ #include "resources.h" #include -namespace style { -Clay_ElementDeclaration ListContainer(size_t depth, Clay_ElementDeclaration baseCfg) { +namespace cera { +Clay_ElementDeclaration ListContainer(Clay_ElementDeclaration baseCfg) { baseCfg.border = { .color = panelBorder, .width = CLAY_BORDER_ALL(2) @@ -13,7 +13,7 @@ Clay_ElementDeclaration ListContainer(size_t depth, Clay_ElementDeclaration base return baseCfg; } -Clay_ElementDeclaration PanelContainer(size_t depth, Clay_ElementDeclaration baseCfg) { +Clay_ElementDeclaration PanelContainer(Clay_ElementDeclaration baseCfg) { baseCfg.backgroundColor = panelBackground; baseCfg.border = { .color = panelBorder, @@ -24,16 +24,16 @@ Clay_ElementDeclaration PanelContainer(size_t depth, Clay_ElementDeclaration bas return baseCfg; } -Clay_ElementDeclaration LeftPanelContainer(size_t depth, Clay_ElementDeclaration baseCfg) { - baseCfg = PanelContainer(depth, baseCfg); +Clay_ElementDeclaration LeftPanelContainer(Clay_ElementDeclaration baseCfg) { + baseCfg = PanelContainer(baseCfg); baseCfg.border.width = { 0, 2, 2, 2, 0 }; baseCfg.cornerRadius = { 0, defaultRadius, 0, defaultRadius }; baseCfg.layout.sizing.height = CLAY_SIZING_GROW(); return baseCfg; } -Clay_ElementDeclaration RightPanelContainer(size_t depth, Clay_ElementDeclaration baseCfg) { - baseCfg = PanelContainer(depth, baseCfg); +Clay_ElementDeclaration RightPanelContainer(Clay_ElementDeclaration baseCfg) { + baseCfg = PanelContainer(baseCfg); baseCfg.border.width = { 2, 0, 2, 2, 0 }; baseCfg.cornerRadius = { defaultRadius, 0, defaultRadius, 0 }; baseCfg.layout.sizing.height = CLAY_SIZING_GROW(); diff --git a/src/ceramic/style.h b/src/ceramic/style.h index 218ff7b..409396b 100644 --- a/src/ceramic/style.h +++ b/src/ceramic/style.h @@ -4,7 +4,7 @@ #include #include -namespace style { +namespace cera { //////////////////////////////////// // WINDOW STYLE //////////////////////////////////// @@ -27,10 +27,10 @@ constexpr Clay_Padding panelPadding = { 24, 24, }; -Clay_ElementDeclaration ListContainer(size_t depth, Clay_ElementDeclaration baseCfg); -Clay_ElementDeclaration PanelContainer(size_t depth, Clay_ElementDeclaration baseCfg); -Clay_ElementDeclaration LeftPanelContainer(size_t depth, Clay_ElementDeclaration baseCfg); -Clay_ElementDeclaration RightPanelContainer(size_t depth, Clay_ElementDeclaration baseCfg); +Clay_ElementDeclaration ListContainer(Clay_ElementDeclaration baseCfg = {}); +Clay_ElementDeclaration PanelContainer(Clay_ElementDeclaration baseCfg = {}); +Clay_ElementDeclaration LeftPanelContainer(Clay_ElementDeclaration baseCfg = {}); +Clay_ElementDeclaration RightPanelContainer(Clay_ElementDeclaration baseCfg = {}); Clay_ElementDeclaration Window(); //////////////////////////////////// diff --git a/src/main.cpp b/src/main.cpp index d649347..93ed603 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -79,7 +79,7 @@ void InitSDL() { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_Init failed: %s", SDL_GetError()); exit(4); } - if ((resources::textEngine = TTF_CreateRendererTextEngine(renderer)) == nullptr) { + if (!(cera::textEngine = TTF_CreateRendererTextEngine(renderer))) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_CreateRendererTextEngine failed: %s", SDL_GetError()); exit(5); } @@ -90,7 +90,7 @@ void InitClay() { clayMemorySize = Clay_MinMemorySize(); clayPrimaryArena = Clay_CreateArenaWithCapacityAndMemory(clayMemorySize, SDL_malloc(clayMemorySize)); Clay_Initialize(clayPrimaryArena, { (float)screenWidth, (float)screenHeight }, { HandleClayErrors }); - Clay_SetMeasureTextFunction(MeasureText, resources::defaultFont); + Clay_SetMeasureTextFunction(MeasureText, cera::defaultFont); Clay_SetLayoutDimensions({ (float)screenWidth, (float)screenHeight }); float x{ 0 }, y{ 0 }; SDL_GetMouseState(&x, &y); @@ -99,10 +99,10 @@ void InitClay() { int main(int argc, char *argv[]) { InitSDL(); - resources::SetDefaultFont("assets/AdwaitaSans-Regular.ttf"); + cera::SetDefaultFont("assets/AdwaitaSans-Regular.ttf"); LogOutputResolution(); InitClay(); - backendData = { renderer, resources::textEngine, resources::defaultFont }; + backendData = { renderer, cera::textEngine, cera::defaultFont }; SDL_Event event; uint64_t startFrameTime = SDL_GetTicksNS(); double deltaTime = 0.0; From 91b1ce4992d258e52996354a244fe3023f7469b2 Mon Sep 17 00:00:00 2001 From: Sara Date: Sun, 26 Oct 2025 20:41:34 +0100 Subject: [PATCH 70/87] feat: moved ceramic to vendor/ --- {src => vendor}/ceramic/elements.cpp | 0 {src => vendor}/ceramic/elements.h | 0 {src => vendor}/ceramic/resources.cpp | 0 {src => vendor}/ceramic/resources.h | 0 {src => vendor}/ceramic/style.cpp | 0 {src => vendor}/ceramic/style.h | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {src => vendor}/ceramic/elements.cpp (100%) rename {src => vendor}/ceramic/elements.h (100%) rename {src => vendor}/ceramic/resources.cpp (100%) rename {src => vendor}/ceramic/resources.h (100%) rename {src => vendor}/ceramic/style.cpp (100%) rename {src => vendor}/ceramic/style.h (100%) diff --git a/src/ceramic/elements.cpp b/vendor/ceramic/elements.cpp similarity index 100% rename from src/ceramic/elements.cpp rename to vendor/ceramic/elements.cpp diff --git a/src/ceramic/elements.h b/vendor/ceramic/elements.h similarity index 100% rename from src/ceramic/elements.h rename to vendor/ceramic/elements.h diff --git a/src/ceramic/resources.cpp b/vendor/ceramic/resources.cpp similarity index 100% rename from src/ceramic/resources.cpp rename to vendor/ceramic/resources.cpp diff --git a/src/ceramic/resources.h b/vendor/ceramic/resources.h similarity index 100% rename from src/ceramic/resources.h rename to vendor/ceramic/resources.h diff --git a/src/ceramic/style.cpp b/vendor/ceramic/style.cpp similarity index 100% rename from src/ceramic/style.cpp rename to vendor/ceramic/style.cpp diff --git a/src/ceramic/style.h b/vendor/ceramic/style.h similarity index 100% rename from src/ceramic/style.h rename to vendor/ceramic/style.h From 37aa497ebfd3855fdbd6fdfec4fc534640c12320 Mon Sep 17 00:00:00 2001 From: Sara Date: Sun, 26 Oct 2025 20:44:50 +0100 Subject: [PATCH 71/87] feat: added vendor/ceramic/*.cpp to CMakeLists.txt --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3130a7f..88b5593 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}") set(CMAKE_CXX_STANDARD 23) set(CMAKE_C_STANDARD 23) -file(GLOB_RECURSE source_files . src/**.cpp src/**.c vendor/renderer/**.c) +file(GLOB_RECURSE source_files . src/**.cpp src/**.c vendor/renderer/**.c vendor/ceramic/**.cpp) include_directories(vendor/) add_subdirectory(vendor/SDL3/ EXCLUDE_FROM_ALL) From 5f03f9dbb77af9a3e407b5153a5ff78255178032 Mon Sep 17 00:00:00 2001 From: Sara Date: Sun, 26 Oct 2025 20:45:39 +0100 Subject: [PATCH 72/87] chore: removed ceramic --- vendor/ceramic/elements.cpp | 84 -------------------------------- vendor/ceramic/elements.h | 15 ------ vendor/ceramic/resources.cpp | 28 ----------- vendor/ceramic/resources.h | 19 -------- vendor/ceramic/style.cpp | 62 ------------------------ vendor/ceramic/style.h | 93 ------------------------------------ 6 files changed, 301 deletions(-) delete mode 100644 vendor/ceramic/elements.cpp delete mode 100644 vendor/ceramic/elements.h delete mode 100644 vendor/ceramic/resources.cpp delete mode 100644 vendor/ceramic/resources.h delete mode 100644 vendor/ceramic/style.cpp delete mode 100644 vendor/ceramic/style.h diff --git a/vendor/ceramic/elements.cpp b/vendor/ceramic/elements.cpp deleted file mode 100644 index 4650361..0000000 --- a/vendor/ceramic/elements.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "elements.h" -#include "style.h" -#include "resources.h" - -namespace cera { -void TextButton(Clay_String text, Clay_Color color, OnHoveredFn onHovered, intptr_t onHoveredData) { - Clay_Color hovered{ cera::ToHoveredColor(color) }; - CLAY_AUTO_ID({ - .layout = { - .padding = cera::buttonPadding, - .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, - }, - .backgroundColor = Clay_Hovered() - ? hovered - : color, - .cornerRadius = cera::buttonRadii, - .border = { - cera::ToHoveredColor(Clay_Hovered() ? hovered : color), - CLAY_BORDER_ALL(2) - }, - }) { - Clay_OnHover(onHovered, onHoveredData); - cera::Body(text, { - .textColor = cera::textColor, - .textAlignment = CLAY_TEXT_ALIGN_CENTER, - }); - } -} - -void ToggleHovered(Clay_ElementId element, Clay_PointerData pointer, intptr_t data) { - bool *hovered{ (bool*)data }; - if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { - *hovered = !(*hovered); - } -} - - -void Toggle(Clay_String label, Clay_Color selected, bool &state) { - CLAY_AUTO_ID({ - .layout = { - .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, - .childGap = 10, - .childAlignment = { CLAY_ALIGN_X_LEFT, CLAY_ALIGN_Y_CENTER }, - }, - }) { - Clay_Color color{Clay_Hovered() - ? cera::ToHoveredColor(selected) - : selected - }; - Clay_OnHover(&ToggleHovered, (intptr_t)(&state)); - CLAY_AUTO_ID({ - .layout = { - .sizing = { - CLAY_SIZING_FIXED(20), CLAY_SIZING_FIXED(20) - } - }, - .backgroundColor = (state - ? selected - : cera::color::transparent - ), - .cornerRadius = cera::buttonRadii, - .border = { - color, - CLAY_BORDER_OUTSIDE(3) - }, - }) { } - Body(label, { - .textColor = cera::textColor - }); - } -} - -void Body(Clay_String string, Clay_TextElementConfig baseCfg) { - baseCfg.fontId = cera::FONT_DEFAULT; - baseCfg.fontSize = cera::baseFontSize; - CLAY_TEXT(string, CLAY_TEXT_CONFIG(baseCfg)); -} - -void Header(Clay_String string, size_t header, Clay_TextElementConfig baseCfg) { - baseCfg.fontId = cera::FONT_BOLD; - baseCfg.fontSize = cera::headerSizes[(header)-1]; - CLAY_TEXT(string, CLAY_TEXT_CONFIG(baseCfg)); -} -} diff --git a/vendor/ceramic/elements.h b/vendor/ceramic/elements.h deleted file mode 100644 index c9a6881..0000000 --- a/vendor/ceramic/elements.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef ELEMENTS_H -#define ELEMENTS_H - -#include -#include "style.h" - -namespace cera { -typedef void(*OnHoveredFn)(Clay_ElementId element, Clay_PointerData pointer, intptr_t data); -void TextButton(Clay_String text, Clay_Color color, OnHoveredFn onHovered, intptr_t onHoveredData = 0); -void Toggle(Clay_String label, Clay_Color selected, bool &state); -void Body(Clay_String string, Clay_TextElementConfig baseCfg = {.textColor = cera::textColor}); -void Header(Clay_String string, size_t header, Clay_TextElementConfig baseCfg = {.textColor = cera::textColor}); -} - -#endif // !ELEMENTS_H diff --git a/vendor/ceramic/resources.cpp b/vendor/ceramic/resources.cpp deleted file mode 100644 index 2798d80..0000000 --- a/vendor/ceramic/resources.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "resources.h" -#include "style.h" -#include -#include -#include -#include - -namespace cera { -TTF_Font *defaultFont[FONT_MAX]; -TTF_TextEngine *textEngine = nullptr; - -void SetDefaultFont(char const *path) { - defaultFont[FONT_DEFAULT] = TTF_OpenFont(path, cera::baseFontSize * 5); - if (defaultFont[FONT_DEFAULT] == nullptr) { - SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load default font '%s': %s", path, SDL_GetError()); - exit(6); - } - TTF_SetFontHinting(defaultFont[FONT_DEFAULT], TTF_HINTING_LIGHT_SUBPIXEL); - defaultFont[FONT_BOLD] = TTF_OpenFont(path, cera::baseFontSize * 5); - if (defaultFont[FONT_BOLD] == nullptr) { - SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load default bold font '%s': %s", path, SDL_GetError()); - exit(6); - } - TTF_SetFontHinting(defaultFont[FONT_BOLD], TTF_HINTING_LIGHT_SUBPIXEL); - TTF_SetFontStyle(defaultFont[FONT_BOLD], TTF_STYLE_BOLD); - SDL_Log("SetDefaultFont: Success"); -} -} diff --git a/vendor/ceramic/resources.h b/vendor/ceramic/resources.h deleted file mode 100644 index 3adc3cf..0000000 --- a/vendor/ceramic/resources.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef RESOURCES_H -#define RESOURCES_H - -#include - -namespace cera { -enum Font { - FONT_DEFAULT = 0, - FONT_BOLD = 1, - FONT_MAX -}; - -extern TTF_TextEngine *textEngine; -extern TTF_Font *defaultFont[FONT_MAX]; - -void SetDefaultFont(char const *path); -} - -#endif // !RESOURCES_H diff --git a/vendor/ceramic/style.cpp b/vendor/ceramic/style.cpp deleted file mode 100644 index 616b284..0000000 --- a/vendor/ceramic/style.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include "style.h" -#include "SDL3/SDL_stdinc.h" -#include "resources.h" -#include - -namespace cera { -Clay_ElementDeclaration ListContainer(Clay_ElementDeclaration baseCfg) { - baseCfg.border = { - .color = panelBorder, - .width = CLAY_BORDER_ALL(2) - }; - baseCfg.cornerRadius = defaultRadiusAll; - return baseCfg; -} - -Clay_ElementDeclaration PanelContainer(Clay_ElementDeclaration baseCfg) { - baseCfg.backgroundColor = panelBackground; - baseCfg.border = { - .color = panelBorder, - .width = CLAY_BORDER_OUTSIDE(2) - }; - baseCfg.cornerRadius = defaultRadiusAll; - baseCfg.layout.padding = CLAY_PADDING_ALL(8); - return baseCfg; -} - -Clay_ElementDeclaration LeftPanelContainer(Clay_ElementDeclaration baseCfg) { - baseCfg = PanelContainer(baseCfg); - baseCfg.border.width = { 0, 2, 2, 2, 0 }; - baseCfg.cornerRadius = { 0, defaultRadius, 0, defaultRadius }; - baseCfg.layout.sizing.height = CLAY_SIZING_GROW(); - return baseCfg; -} - -Clay_ElementDeclaration RightPanelContainer(Clay_ElementDeclaration baseCfg) { - baseCfg = PanelContainer(baseCfg); - baseCfg.border.width = { 2, 0, 2, 2, 0 }; - baseCfg.cornerRadius = { defaultRadius, 0, defaultRadius, 0 }; - baseCfg.layout.sizing.height = CLAY_SIZING_GROW(); - return baseCfg; -} - -Clay_ElementDeclaration Window() { - return { - .layout = { - .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, - .padding = CLAY_PADDING_ALL(windowPadding), - .childGap = 0, - .layoutDirection = CLAY_LEFT_TO_RIGHT - }, - .backgroundColor = windowColor - }; -} - -Clay_Color ToHoveredColor(Clay_Color color) { - float avg = (color.r + color.g + color.b) / 3.f; - color.r = SDL_clamp((color.r - avg) * 0.8f + avg - 30, 0., 1.); - color.g = SDL_clamp((color.g - avg) * 0.8f + avg - 30, 0., 1.); - color.b = SDL_clamp((color.b - avg) * 0.8f + avg - 30, 0., 1.); - return color; -} -} diff --git a/vendor/ceramic/style.h b/vendor/ceramic/style.h deleted file mode 100644 index 409396b..0000000 --- a/vendor/ceramic/style.h +++ /dev/null @@ -1,93 +0,0 @@ -#ifndef STYLE_H -#define STYLE_H - -#include -#include - -namespace cera { -//////////////////////////////////// -// WINDOW STYLE -//////////////////////////////////// - -constexpr uint16_t windowPadding{1}; -constexpr Clay_Color windowColor{20, 20, 20, 255}; - -//////////////////////////////////// -// CONTAINER STYLE -//////////////////////////////////// - -constexpr uint16_t containerGap{10}; -constexpr double defaultRadius{5.0}; - -constexpr Clay_Color panelBackground{ 0,0,0,0 }; -constexpr Clay_Color panelBorder { 150, 150, 150, 150 }; - -constexpr Clay_Padding panelPadding = { - 24, 24, - 24, 24, -}; - -Clay_ElementDeclaration ListContainer(Clay_ElementDeclaration baseCfg = {}); -Clay_ElementDeclaration PanelContainer(Clay_ElementDeclaration baseCfg = {}); -Clay_ElementDeclaration LeftPanelContainer(Clay_ElementDeclaration baseCfg = {}); -Clay_ElementDeclaration RightPanelContainer(Clay_ElementDeclaration baseCfg = {}); -Clay_ElementDeclaration Window(); - -//////////////////////////////////// -// TEXT STYLE -//////////////////////////////////// - -constexpr float paragraphGap = 10; -constexpr uint16_t baseFontSize = 16; - -constexpr uint16_t headerSizes[] = {64, 32, 28, 16}; - -constexpr Clay_Color textColor{170, 170, 170, 255}; - -//////////////////////////////////// -// BUTTONS -//////////////////////////////////// - -constexpr Clay_Color warningButton = { - 177, 56, 52, 255 -}; -constexpr Clay_Color proceedButton = { - 49, 181, 99, 255 -}; -constexpr Clay_Color actionButton = { - 49, 142, 181, 255 -}; - -constexpr Clay_Padding buttonPadding = { - 24, 24, - 4, 4, -}; -constexpr Clay_CornerRadius buttonRadii = { - 3, 3, 3, 3 -}; - -Clay_Color ToHoveredColor(Clay_Color color); - -//////////////////////////////////// -// COMPILATIONS -// | Functions and expressions that combine styling data from the settings above. -//////////////////////////////////// - -constexpr Clay_Sizing layoutExpand = { - .width = CLAY_SIZING_GROW(0), - .height = CLAY_SIZING_GROW(0) -}; - -constexpr Clay_CornerRadius defaultRadiusAll = { - defaultRadius, defaultRadius, - defaultRadius, defaultRadius -}; - -namespace color { -constexpr Clay_Color transparent{ 255, 255, 255, 0 }; -constexpr Clay_Color black{ 0, 0, 0, 255 }; -constexpr Clay_Color white{ 255, 255, 255, 255 }; -} -} - -#endif // !STYLE_H From 0cec7f12033cf3d30bf835169f7edc7a84257f99 Mon Sep 17 00:00:00 2001 From: Sara Date: Sun, 26 Oct 2025 20:48:01 +0100 Subject: [PATCH 73/87] feat: added submodule for ceramic --- .gitmodules | 4 ++++ vendor/ceramic | 1 + 2 files changed, 5 insertions(+) create mode 160000 vendor/ceramic diff --git a/.gitmodules b/.gitmodules index 01eb3de..7f74cf9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,7 @@ [submodule "vendor/SDL3_ttf"] path = vendor/SDL3_ttf url = https://github.com/libsdl-org/SDL_ttf.git +[submodule "vendor/ceramic"] + path = vendor/ceramic + url = forgejo@git.objectionable.solutions:Sara/clay-ceramic.git + branch = main diff --git a/vendor/ceramic b/vendor/ceramic new file mode 160000 index 0000000..7260454 --- /dev/null +++ b/vendor/ceramic @@ -0,0 +1 @@ +Subproject commit 72604542111253a9e2dd20992baf6dba81de9773 From 37a412ea40a48e94834861708cc6b7525de731e7 Mon Sep 17 00:00:00 2001 From: Sara Date: Sun, 26 Oct 2025 21:17:43 +0100 Subject: [PATCH 74/87] chore(style): clarified InitSDL error conditions --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 93ed603..06413e3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -67,11 +67,11 @@ void InitSDL() { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "SDL_Init failed: %s", SDL_GetError()); exit(1); } - if ((window = SDL_CreateWindow("Window", screenWidth, screenHeight, sdlInitFlags)) == nullptr) { + if (!(window = SDL_CreateWindow("Window", screenWidth, screenHeight, sdlInitFlags))) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "SDL_CreateWindow failed: %s", SDL_GetError()); exit(2); } - if ((renderer = SDL_CreateRenderer(window, NULL)) == nullptr) { + if (!(renderer = SDL_CreateRenderer(window, NULL))) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "SDL_CreateRenderer failed: %s", SDL_GetError()); exit(3); } From 0f9ae51ca0462349e02c7fc966b36da198dfe18c Mon Sep 17 00:00:00 2001 From: Sara Date: Sun, 26 Oct 2025 21:18:42 +0100 Subject: [PATCH 75/87] chore: updated ceramic submodule --- vendor/ceramic | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/ceramic b/vendor/ceramic index 7260454..c372a4d 160000 --- a/vendor/ceramic +++ b/vendor/ceramic @@ -1 +1 @@ -Subproject commit 72604542111253a9e2dd20992baf6dba81de9773 +Subproject commit c372a4db3a28dd292793756f0ca36e9460d24b33 From 4146f117af1ea3ff8465dec397d16c43be296d46 Mon Sep 17 00:00:00 2001 From: Sara Date: Mon, 27 Oct 2025 14:40:56 +0100 Subject: [PATCH 76/87] chore: updated README.md --- README.md | 94 +++++-------------------------------------------------- 1 file changed, 7 insertions(+), 87 deletions(-) diff --git a/README.md b/README.md index 7e63075..b40c788 100644 --- a/README.md +++ b/README.md @@ -1,94 +1,14 @@ -# Clay SDL3 Template +# Dice GUI -## Using Template +A simple dice rolling GUI app using Clay for layout, Ceramic elements and SDL3 rendering. -### Just use [`just`](https://just.systems/man/en/) +# Compiling -Run `just set-project-name {project name}` first. +Either `git clone --recursive` or remember to `git submodule update --init --recursive`. Then `cmake -S. -Bbuild` and `cmake --build build`. Which compiles `bin/dice-gui`, which you can run. -And remember to `git remote set-url origin {repo}`. +# Code Standards -### Otherwise - -Modify the CMakeLists.txt manually, just replace CHANGEME with whatever your binary should be called. - -## Compiling - -> Remember to `git submodule update --init --recursive`! - -### Just again - -`just configure` runs cmake configuration and generates a `compile_commands.json`. - -`just build` runs the cmake build. - -### CMake works too, I guess - -`cmake -S. -Bbuild` - -`cmake --build build` - -Same as always - -## Files - -### thread_pool.h/cpp - -Thread pool used for parallel GoL generation ticking. - -### application.h/cpp - -UI and layout logic. - -### style.h/cpp - -Reusable UI styling - -### resources.h/cpp - -Font loading. - -### elements.h/cpp - -Reusable UI elements - -### input.h/cpp - -Handling of input events. - -### main.cpp: - -Entrypoint, setup, and main application loop. - -## Prerequisites - -* CMake 3.21 or higher - -* Compiler capable of C++23 and C23. - -## Dependencies - -### SDL3 - -Included as git submodule at `vendor/SDL3/` and dynamically linked. - -### SDL3_ttf - -Included as git submodule at `vendor/SDL3_ttf/` and dynamically linked. - -### Clay - -Included as files in `vendor/clay/clay.h`; Single header library. - -### Clay SDL3 renderer - -Included as files in `vendor/renderer/` and compiled as part of the project. - -> Note: Mildly modified from the official Clay_SDL3_renderer to enable more advanced styling. - -## Code Standards - -* Keep program structure as simple as possible. No `class Application {` class or other Java-isms. Prefer namespaces with static lifetime variables. +* Keep program structure as simple as possible. No `class Application` or other Java-isms. Prefer namespaces with static lifetime variables. * Use STL where possible. Don't reinvent the wheel. @@ -98,7 +18,7 @@ Included as files in `vendor/renderer/` and compiled as part of the project. * In class member functions, always use `this->` to access member variables. -* const applies to the name to it's left, so it goes after the type, not `const int x;` but `int const x`. +* `const` applies to the name to it's left, so it goes after the type, not `const int x;` but `int const x`. * \* and & flush with the declaration name. `Type const &Function(Type &inRef)` From 454abfce1e34f1e82af1ce35e761fb85d2032193 Mon Sep 17 00:00:00 2001 From: Sara Date: Mon, 27 Oct 2025 14:41:08 +0100 Subject: [PATCH 77/87] feat: disabled C mode for all files in the project --- .dir-locals.el | 1 + 1 file changed, 1 insertion(+) diff --git a/.dir-locals.el b/.dir-locals.el index bfab89f..ac91ce2 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -2,3 +2,4 @@ (indent-tabs-mode . t) (tab-width . 4) (lsp-enable-on-type-formatting nil))) +((c-mode . ((mode . c++)))) From bac1ace9bff826faa6c608d073d69b307dd17fde Mon Sep 17 00:00:00 2001 From: Sara Date: Mon, 27 Oct 2025 14:42:55 +0100 Subject: [PATCH 78/87] fix: specified cpp for code block in README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b40c788..85b3081 100644 --- a/README.md +++ b/README.md @@ -25,13 +25,13 @@ Either `git clone --recursive` or remember to `git submodule update --init --rec > (1) Bracket exceptions: > * using scoped_lock in arbitrary blocks, prefer tailed lisp brackets -``` +```cpp struct Data { int x{ 0 }, y{ 0 }; }; void MyFunction(Data const &data) { // K&R here DoAsynchronousThings(); - { scoped_lock lock{ myMutex }; + { std::scoped_lock lock{ myMutex }; myVariable++; } // not quite lisp, lisp with a tail DoMoreAsynchronousThings(); From aa2fc338d7ea1c2e6324d10a4b1dfc9f637a6466 Mon Sep 17 00:00:00 2001 From: Sara Date: Mon, 27 Oct 2025 16:26:40 +0100 Subject: [PATCH 79/87] feat: added submodule for SDL3_image --- .gitmodules | 3 +++ vendor/SDL3_image | 1 + 2 files changed, 4 insertions(+) create mode 160000 vendor/SDL3_image diff --git a/.gitmodules b/.gitmodules index 7f74cf9..cdaf7b9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,6 +4,9 @@ [submodule "vendor/SDL3_ttf"] path = vendor/SDL3_ttf url = https://github.com/libsdl-org/SDL_ttf.git +[submodule "vendor/SDL3_image"] + path = vendor/SDL3_image + url = https://github.com/libsdl-org/SDL_image.git [submodule "vendor/ceramic"] path = vendor/ceramic url = forgejo@git.objectionable.solutions:Sara/clay-ceramic.git diff --git a/vendor/SDL3_image b/vendor/SDL3_image new file mode 160000 index 0000000..3bbb15f --- /dev/null +++ b/vendor/SDL3_image @@ -0,0 +1 @@ +Subproject commit 3bbb15f654d48251c164e4dc4f5ae8b9ee0eae71 From 6a05c3e933af9dc6b81d87d1cf8a354e2f4c3ceb Mon Sep 17 00:00:00 2001 From: Sara Date: Mon, 27 Oct 2025 18:40:57 +0100 Subject: [PATCH 80/87] chore: updated SDL3 submodules --- vendor/SDL3 | 2 +- vendor/SDL3_ttf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/SDL3 b/vendor/SDL3 index 137b0b2..be1d442 160000 --- a/vendor/SDL3 +++ b/vendor/SDL3 @@ -1 +1 @@ -Subproject commit 137b0b2bee2bb9dd76e2c260970ccf7ff0621692 +Subproject commit be1d44279c715c5ac879f5698bc604fe9070ff0c diff --git a/vendor/SDL3_ttf b/vendor/SDL3_ttf index 6b6bd58..215872a 160000 --- a/vendor/SDL3_ttf +++ b/vendor/SDL3_ttf @@ -1 +1 @@ -Subproject commit 6b6bd588e8646360b08f624fb601cc2ec75c6ada +Subproject commit 215872a0f91d24a4013f106832c32d879fba48db From 3a5b55cc066ab1eb865ef3bc2c228bc488a749cd Mon Sep 17 00:00:00 2001 From: Sara Date: Mon, 27 Oct 2025 20:27:25 +0100 Subject: [PATCH 81/87] feat: setup SDL3 image for building --- CMakeLists.txt | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 88b5593..12e11f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,12 +11,23 @@ set(CMAKE_C_STANDARD 23) file(GLOB_RECURSE source_files . src/**.cpp src/**.c vendor/renderer/**.c vendor/ceramic/**.cpp) include_directories(vendor/) + +set(SDL_VENDORED ON) add_subdirectory(vendor/SDL3/ EXCLUDE_FROM_ALL) set(SDLTTF_VENDORED ON) -add_subdirectory(vendor/SDL3_ttf/ EXCLUDE_FROM_ALL) +add_subdirectory(vendor/SDL3_ttf EXCLUDE_FROM_ALL) +set(SDLIMAGE_AVIF OFF) +set(SDLIMAGE_BMP OFF) +set(SDLIMAGE_TIF OFF) +set(SDLIMAGE_WEBP OFF) +set(SDLIMAGE_VENDORED ON) +add_subdirectory(vendor/SDL3_image EXCLUDE_FROM_ALL) add_executable(dice-gui ${source_files}) -target_link_libraries(dice-gui PRIVATE SDL3_ttf::SDL3_ttf SDL3::SDL3) +target_link_libraries(dice-gui PRIVATE + SDL3_ttf::SDL3_ttf + SDL3_image::SDL3_image + SDL3::SDL3) add_custom_target(copy_assets COMMAND ${CMAKE_COMMAND} -E From 451c71254cf80b3883f81edefb52b31b44feded7 Mon Sep 17 00:00:00 2001 From: Sara Date: Mon, 27 Oct 2025 20:30:07 +0100 Subject: [PATCH 82/87] feat: started resource management & dice --- src/application.cpp | 15 +++++++++++---- src/dice_data.cpp | 36 +++++++++++++++++++++++++++++++++++ src/dice_data.h | 46 +++++++++++++++++++++++++++++++++++++++++++++ src/dice_gui.cpp | 44 +++++++++++++++++++++++++++++++++++++++++++ src/dice_gui.h | 3 +++ src/main.cpp | 1 + 6 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 src/dice_data.cpp create mode 100644 src/dice_data.h create mode 100644 src/dice_gui.cpp create mode 100644 src/dice_gui.h diff --git a/src/application.cpp b/src/application.cpp index 904d071..130134e 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -1,14 +1,21 @@ #include "application.h" -#include "ceramic/style.h" -#include "ceramic/elements.h" +#include "dice_gui.h" +#include +#include #include #include +constexpr Clay_LayoutConfig centerContainer { + .sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_GROW()}, + .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}, +}; + namespace application { Clay_RenderCommandArray RenderApplication() { Clay_BeginLayout(); - CLAY(CLAY_ID("OuterContainer"), cera::Window()) { - CLAY_AUTO_ID(cera::LeftPanelContainer()) { + CLAY(CLAY_ID("Window"), cera::Window()) { + CLAY(CLAY_ID("Content"), {.layout = centerContainer}) { + DiceContainer(); } } return Clay_EndLayout(); diff --git a/src/dice_data.cpp b/src/dice_data.cpp new file mode 100644 index 0000000..6187ad8 --- /dev/null +++ b/src/dice_data.cpp @@ -0,0 +1,36 @@ +#include "dice_data.h" +#include +#include + +namespace active_dice { +constexpr size_t maxActiveDice{16}; +Die activeDice[maxActiveDice]; +size_t numActiveDice{0}; + +void Add(Die die) { + if(numActiveDice < maxActiveDice) { + activeDice[numActiveDice] = die; + ++numActiveDice; + } +} + +void Remove(size_t at) { + if(at >= numActiveDice) { + return; + } + if(at < numActiveDice - 1) { + std::memmove(activeDice + at, activeDice + at + 1, numActiveDice - at); + } + --numActiveDice; +} + +Die Get(size_t at) { + if(at < numActiveDice) { + return activeDice[at]; + } else return D_COIN; +} + +size_t Count() { + return numActiveDice; +} +} diff --git a/src/dice_data.h b/src/dice_data.h new file mode 100644 index 0000000..32d800b --- /dev/null +++ b/src/dice_data.h @@ -0,0 +1,46 @@ +#pragma once + +#include + +enum Die { + D_COIN = 2, + D4 = 4, + D6 = 6, + D8 = 8, + D10 = 10, + D12 = 12, + D20 = 20, + D100 = 100, +}; + +constexpr Die diceIndex[]{D_COIN, D4, D6, D8, D10, D12, D20, D100}; + +static inline size_t DieToIndex(Die die) { + switch(die) { + default: + case D_COIN: + return 0; + case D4: + return 1; + case D6: + return 2; + case D8: + return 3; + case D10: + return 4; + case D12: + return 5; + case D20: + return 6; + case D100: + return 7; + } + +} + +namespace active_dice { +void Add(Die die); +void Remove(size_t at); +Die Get(size_t at); +size_t Count(); +} // namespace active_dice diff --git a/src/dice_gui.cpp b/src/dice_gui.cpp new file mode 100644 index 0000000..72ea5ce --- /dev/null +++ b/src/dice_gui.cpp @@ -0,0 +1,44 @@ +#include "dice_gui.h" +#include "dice_data.h" +#include +#include +#include + +extern SDL_Renderer *renderer; + +SDL_Texture *dieImages[8]; + +static void LoadDieImagesIfNeeded() { + static bool diceImagesLoaded{false}; + if(!diceImagesLoaded) { + diceImagesLoaded = true; + dieImages[0] = cera::LoadAndStoreTexture(renderer, "assets/icons/d2.svg"); + dieImages[1] = cera::LoadAndStoreTexture(renderer, "assets/icons/d4.svg"); + dieImages[2] = cera::LoadAndStoreTexture(renderer, "assets/icons/d6.svg"); + dieImages[3] = cera::LoadAndStoreTexture(renderer, "assets/icons/d8.svg"); + dieImages[4] = cera::LoadAndStoreTexture(renderer, "assets/icons/d10.svg"); + dieImages[5] = cera::LoadAndStoreTexture(renderer, "assets/icons/d12.svg"); + dieImages[6] = cera::LoadAndStoreTexture(renderer, "assets/icons/d20.svg"); + dieImages[7] = cera::LoadAndStoreTexture(renderer, "assets/icons/d100.svg"); + } +} + +static void OnDieButtonHovered(Clay_ElementId element, Clay_PointerData pointer, intptr_t data) { + if(pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + active_dice::Add((Die)data); + } +} + +void DiceContainer() { + LoadDieImagesIfNeeded(); + CLAY(CLAY_ID("DiceSelector"), {}) { + cera::ImageTextButton(dieImages[0], CLAY_STRING("C"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D_COIN); + cera::ImageTextButton(dieImages[1], CLAY_STRING("4"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D4); + cera::ImageTextButton(dieImages[2], CLAY_STRING("6"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D6); + cera::ImageTextButton(dieImages[3], CLAY_STRING("8"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D8); + cera::ImageTextButton(dieImages[4], CLAY_STRING("10"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D10); + cera::ImageTextButton(dieImages[5], CLAY_STRING("12"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D12); + cera::ImageTextButton(dieImages[6], CLAY_STRING("20"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D20); + cera::ImageTextButton(dieImages[7], CLAY_STRING("100"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D100); + } +} diff --git a/src/dice_gui.h b/src/dice_gui.h new file mode 100644 index 0000000..bc0513c --- /dev/null +++ b/src/dice_gui.h @@ -0,0 +1,3 @@ +#pragma once + +void DiceContainer(); diff --git a/src/main.cpp b/src/main.cpp index 06413e3..2a1c4fb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -137,6 +137,7 @@ int main(int argc, char *argv[]) { SDL_RenderPresent(renderer); SDL_Delay(10); } + cera::CleanupResources(); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); From ddd44d2d0c8a8d3170a13b65c34252c8ac4d44e4 Mon Sep 17 00:00:00 2001 From: Sara Date: Mon, 27 Oct 2025 21:43:29 +0100 Subject: [PATCH 83/87] feat: added rendering add die buttons to dice_gui --- src/dice_gui.cpp | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/dice_gui.cpp b/src/dice_gui.cpp index 72ea5ce..eeeda08 100644 --- a/src/dice_gui.cpp +++ b/src/dice_gui.cpp @@ -1,4 +1,6 @@ #include "dice_gui.h" +#include "SDL3/SDL_render.h" +#include "ceramic/style.h" #include "dice_data.h" #include #include @@ -7,19 +9,41 @@ extern SDL_Renderer *renderer; SDL_Texture *dieImages[8]; +SDL_Texture *hoveredDieImages[8]; +Clay_Color const dieImageColors[8]{ + {230, 184, 48, 255}, + {177, 56, 52, 255}, + {115, 177, 52, 255}, + {52, 177, 125, 255}, + {52, 177, 176, 255}, + {52, 93, 177, 255}, + {177, 52, 140, 255}, + {95, 52, 177, 255}, +}; +char const *dieImagePaths[8]{ + "assets/icons/d2.svg", + "assets/icons/d4.svg", + "assets/icons/d6.svg", + "assets/icons/d8.svg", + "assets/icons/d10.svg", + "assets/icons/d12.svg", + "assets/icons/d20.svg", + "assets/icons/d10.svg", +}; static void LoadDieImagesIfNeeded() { static bool diceImagesLoaded{false}; if(!diceImagesLoaded) { diceImagesLoaded = true; - dieImages[0] = cera::LoadAndStoreTexture(renderer, "assets/icons/d2.svg"); - dieImages[1] = cera::LoadAndStoreTexture(renderer, "assets/icons/d4.svg"); - dieImages[2] = cera::LoadAndStoreTexture(renderer, "assets/icons/d6.svg"); - dieImages[3] = cera::LoadAndStoreTexture(renderer, "assets/icons/d8.svg"); - dieImages[4] = cera::LoadAndStoreTexture(renderer, "assets/icons/d10.svg"); - dieImages[5] = cera::LoadAndStoreTexture(renderer, "assets/icons/d12.svg"); - dieImages[6] = cera::LoadAndStoreTexture(renderer, "assets/icons/d20.svg"); - dieImages[7] = cera::LoadAndStoreTexture(renderer, "assets/icons/d100.svg"); + Clay_Color color{}; + for(size_t i{0}; i < 8; ++i) { + color = dieImageColors[i]; + dieImages[i] = cera::LoadAndStoreTexture(renderer, dieImagePaths[i]); + SDL_SetTextureColorMod(dieImages[i], color.r, color.g, color.b); + hoveredDieImages[i] = cera::LoadAndStoreTexture(renderer, dieImagePaths[i]); + color = cera::ToHoveredColor(dieImageColors[i]); + SDL_SetTextureColorMod(hoveredDieImages[i], color.r, color.g, color.b); + } } } From 37ce2f0629d394876298c43bbf037b83fa72b47a Mon Sep 17 00:00:00 2001 From: Sara Date: Mon, 27 Oct 2025 21:43:52 +0100 Subject: [PATCH 84/87] chore: updated ceramic --- vendor/ceramic | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/ceramic b/vendor/ceramic index c372a4d..762d165 160000 --- a/vendor/ceramic +++ b/vendor/ceramic @@ -1 +1 @@ -Subproject commit c372a4db3a28dd292793756f0ca36e9460d24b33 +Subproject commit 762d165cd14f0d4423c2de6f7f1659f7b36a4fd3 From ddf9936f58bdbe53c33d33a87004b3f9cdf0d401 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 28 Oct 2025 11:58:37 +0100 Subject: [PATCH 85/87] chore: adjusted clang-format --- .clang-format | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.clang-format b/.clang-format index 5c9a9a3..b8060e9 100644 --- a/.clang-format +++ b/.clang-format @@ -30,7 +30,7 @@ AttributeMacros: BinPackArguments: true BinPackParameters: true BitFieldColonSpacing: Both -BreakAfterAttributes: Never +BreakAfterAttributes: Always BreakAfterJavaFieldAnnotations: false BreakArrays: false BreakBeforeBinaryOperators: None From ae334c395a4243aa0eccb4314cebb1a2299f90b7 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 28 Oct 2025 11:59:27 +0100 Subject: [PATCH 86/87] feat: implemented dice rolling --- src/dice_data.cpp | 34 +++++++++++++-- src/dice_data.h | 5 +++ src/dice_gui.cpp | 103 ++++++++++++++++++++++++++++++++++++++++------ vendor/ceramic | 2 +- 4 files changed, 127 insertions(+), 17 deletions(-) diff --git a/src/dice_data.cpp b/src/dice_data.cpp index 6187ad8..2c014c0 100644 --- a/src/dice_data.cpp +++ b/src/dice_data.cpp @@ -1,15 +1,22 @@ #include "dice_data.h" #include +#include +#include #include namespace active_dice { +struct DieState { + Die type; + uint8_t value; +}; constexpr size_t maxActiveDice{16}; -Die activeDice[maxActiveDice]; +DieState activeDice[maxActiveDice]; size_t numActiveDice{0}; void Add(Die die) { if(numActiveDice < maxActiveDice) { - activeDice[numActiveDice] = die; + activeDice[numActiveDice].type = die; + activeDice[numActiveDice].value = RollDie(die); ++numActiveDice; } } @@ -19,18 +26,37 @@ void Remove(size_t at) { return; } if(at < numActiveDice - 1) { - std::memmove(activeDice + at, activeDice + at + 1, numActiveDice - at); + std::memmove(activeDice + at, activeDice + at + 1, sizeof(DieState) * (numActiveDice - at)); } --numActiveDice; } Die Get(size_t at) { if(at < numActiveDice) { - return activeDice[at]; + return activeDice[at].type; } else return D_COIN; } +uint8_t GetValue(size_t at) { + if(at < numActiveDice) { + return activeDice[at].value; + } else return 0; +} + size_t Count() { return numActiveDice; } + +void ReRoll() { + for(size_t i{0}; i < numActiveDice; ++i) { + activeDice[i].value = RollDie(activeDice[i].type); + } +} +} + +uint8_t RollDie(Die die) { + if(die == D_COIN) { + return std::rand() % 2; + } + return 1 + std::rand() % (die-1); } diff --git a/src/dice_data.h b/src/dice_data.h index 32d800b..b26f6d7 100644 --- a/src/dice_data.h +++ b/src/dice_data.h @@ -1,6 +1,7 @@ #pragma once #include +#include enum Die { D_COIN = 2, @@ -42,5 +43,9 @@ namespace active_dice { void Add(Die die); void Remove(size_t at); Die Get(size_t at); +uint8_t GetValue(size_t at); size_t Count(); +void ReRoll(); } // namespace active_dice + +uint8_t RollDie(Die die); diff --git a/src/dice_gui.cpp b/src/dice_gui.cpp index eeeda08..da7edcb 100644 --- a/src/dice_gui.cpp +++ b/src/dice_gui.cpp @@ -2,9 +2,11 @@ #include "SDL3/SDL_render.h" #include "ceramic/style.h" #include "dice_data.h" +#include "renderer/ui_data.h" #include #include #include +#include extern SDL_Renderer *renderer; @@ -30,6 +32,16 @@ char const *dieImagePaths[8]{ "assets/icons/d20.svg", "assets/icons/d10.svg", }; +Clay_String const dieUiStrings[8] { + CLAY_STRING("C"), + CLAY_STRING("4"), + CLAY_STRING("6"), + CLAY_STRING("8"), + CLAY_STRING("10"), + CLAY_STRING("12"), + CLAY_STRING("20"), + CLAY_STRING("100") +}; static void LoadDieImagesIfNeeded() { static bool diceImagesLoaded{false}; @@ -47,22 +59,89 @@ static void LoadDieImagesIfNeeded() { } } -static void OnDieButtonHovered(Clay_ElementId element, Clay_PointerData pointer, intptr_t data) { + +static void DieButton(Die die, int32_t showNumber, Clay_Sizing size, cera::OnHoveredFn onHover, intptr_t data) { + size_t const index{DieToIndex(die)}; + char resultStr[6]=""; + int32_t len = SDL_snprintf(resultStr, 6, "%d", showNumber); + Clay_String string = UiData_StoreString(resultStr, len); + CLAY_AUTO_ID({ + .layout = { + .sizing = {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, + .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER} + }, + .image = {.imageData = Clay_Hovered() ? hoveredDieImages[index] : dieImages[index]} + }) { + Clay_OnHover(onHover, data); + cera::Header(string, 2, { + .textColor = cera::color::white + }); + } +} + +static void AddDieButtonHovered(Clay_ElementId element, Clay_PointerData pointer, intptr_t data) { if(pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { active_dice::Add((Die)data); } } -void DiceContainer() { - LoadDieImagesIfNeeded(); - CLAY(CLAY_ID("DiceSelector"), {}) { - cera::ImageTextButton(dieImages[0], CLAY_STRING("C"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D_COIN); - cera::ImageTextButton(dieImages[1], CLAY_STRING("4"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D4); - cera::ImageTextButton(dieImages[2], CLAY_STRING("6"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D6); - cera::ImageTextButton(dieImages[3], CLAY_STRING("8"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D8); - cera::ImageTextButton(dieImages[4], CLAY_STRING("10"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D10); - cera::ImageTextButton(dieImages[5], CLAY_STRING("12"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D12); - cera::ImageTextButton(dieImages[6], CLAY_STRING("20"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D20); - cera::ImageTextButton(dieImages[7], CLAY_STRING("100"), {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}, &OnDieButtonHovered, (intptr_t)D100); +static void ActiveDieButtonHovered(Clay_ElementId element, Clay_PointerData pointer, intptr_t data) { + if(pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + active_dice::Remove((size_t)data); + } +} + +void DiceContainer() { + LoadDieImagesIfNeeded(); + + Clay_Sizing const addDieButtonSize{CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)}; + CLAY(CLAY_ID("DiceSelector"), cera::PanelContainer({ + .layout={ + .sizing={CLAY_SIZING_FIT(), CLAY_SIZING_GROW()}, + .childAlignment{CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER} + }, + })) { + CLAY_AUTO_ID({ + .layout = { + .sizing = {CLAY_SIZING_FIT(), CLAY_SIZING_FIT()}, + .layoutDirection = CLAY_TOP_TO_BOTTOM, + }, + .clip = { + .horizontal = false, + .vertical = true, + .childOffset = Clay_GetScrollOffset(), + } + }) { + DieButton(D4, D4, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D4); + DieButton(D6, D6, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D6); + DieButton(D8, D8, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D8); + DieButton(D10, D10, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D10); + DieButton(D12, D12, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D12); + DieButton(D20, D20, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D20); + DieButton(D100, D100, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D100); + DieButton(D_COIN, D_COIN, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D_COIN); + } + } + Clay_Sizing const activeDieButtonSize{CLAY_SIZING_FIXED(200), CLAY_SIZING_FIXED(200)}; + CLAY(CLAY_ID("DiceActive"), cera::PanelContainer({ + .layout={ + .sizing={CLAY_SIZING_GROW(), CLAY_SIZING_GROW()}, + .childAlignment={CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER} + } + })) { + CLAY_AUTO_ID({ + .layout = { + .sizing = {CLAY_SIZING_FIT(), CLAY_SIZING_FIT()}, + }, + .clip = { + .horizontal = true, + .vertical = false, + .childOffset = Clay_GetScrollOffset(), + }, + }) { + for(size_t i{0}; i < active_dice::Count(); ++i) { + DieButton(active_dice::Get(i), active_dice::GetValue(i), activeDieButtonSize, &ActiveDieButtonHovered, (intptr_t)i); + } + } } } diff --git a/vendor/ceramic b/vendor/ceramic index 762d165..2dcdcd3 160000 --- a/vendor/ceramic +++ b/vendor/ceramic @@ -1 +1 @@ -Subproject commit 762d165cd14f0d4423c2de6f7f1659f7b36a4fd3 +Subproject commit 2dcdcd394c5b0c7e4875f965dfe789d3c71ad217 From 7adf2d9528115aa80592baef687f34cb1e910597 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 28 Oct 2025 11:59:37 +0100 Subject: [PATCH 87/87] fix: uidata starts with 0 utilized bytes ipv 9 --- vendor/renderer/ui_data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/renderer/ui_data.c b/vendor/renderer/ui_data.c index 2172d96..9a78fc3 100644 --- a/vendor/renderer/ui_data.c +++ b/vendor/renderer/ui_data.c @@ -4,7 +4,7 @@ const size_t uiDataLength = UI_DATA_SIZE; -static size_t utilized = 9; +static size_t utilized = 0; static char uiDataArena[UI_DATA_SIZE]; static char *uiDataWriter = uiDataArena;