From 2cbd4973a0700e99c413e6e27f009898133c9fe4 Mon Sep 17 00:00:00 2001 From: jmug Date: Sat, 19 Apr 2025 21:08:26 -0700 Subject: [PATCH] Clay main Signed-off-by: jmug --- main.c | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 103 insertions(+), 11 deletions(-) diff --git a/main.c b/main.c index 39e09b4..483a824 100644 --- a/main.c +++ b/main.c @@ -1,18 +1,110 @@ -#include "raylib.h" +#define CLAY_IMPLEMENTATION +#include "./clay-0.13/clay.h" +#include "./clay-0.13/renderers/raylib/clay_renderer_raylib.c" -int main(void) -{ - InitWindow(600, 400, "raylib [core] example - basic window"); +#define RAYLIB_VECTOR2_TO_CLAY_VECTOR2(vector) (Clay_Vector2) { .x = vector.x, .y = vector.y } - while (!WindowShouldClose()) - { - BeginDrawing(); - ClearBackground(RAYWHITE); - DrawText("Congrats! You created your first window!", 190, 200, 20, LIGHTGRAY); - EndDrawing(); +bool reinitializeClay = false; + +void HandleButtonInteraction(Clay_ElementId elementId, Clay_PointerData pointerData, void *userData) { + if (pointerData.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { + printf("You pressed the button!\n"); + } +} + +void HandleClayErrors(Clay_ErrorData errorData) { + printf("%s", errorData.errorText.chars); + if (errorData.errorType == CLAY_ERROR_TYPE_ELEMENTS_CAPACITY_EXCEEDED) { + reinitializeClay = true; + Clay_SetMaxElementCount(Clay_GetMaxElementCount() * 2); + } else if (errorData.errorType == CLAY_ERROR_TYPE_TEXT_MEASUREMENT_CAPACITY_EXCEEDED) { + reinitializeClay = true; + Clay_SetMaxMeasureTextCacheWordCount(Clay_GetMaxMeasureTextCacheWordCount() * 2); + } +} + +void ExpandContainer() { + CLAY({ + .backgroundColor = {0, 0, 0, 0}, + .layout = { + .sizing = { + .width = CLAY_SIZING_GROW(), + .height = CLAY_SIZING_GROW() + } + } + }) {} +} + +Clay_RenderCommandArray CreateLayout() { + Clay_BeginLayout(); + + CLAY({ + .backgroundColor = {255, 255, 255, 255}, + .layout = { + .sizing = { + .width = CLAY_SIZING_GROW(), + .height = CLAY_SIZING_GROW() + }, + .childAlignment = { .x = CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_CENTER } + } + }) { + CLAY({ + .backgroundColor = {255, 0, 0, 255}, + .layout = { + .sizing = { + .width = CLAY_SIZING_PERCENT(0.25), + .height = CLAY_SIZING_PERCENT(0.25) + }, + } + }) { + Clay_OnHover(HandleButtonInteraction, NULL); + } } - CloseWindow(); + return Clay_EndLayout(); +} +void UpdateDrawFrame(Font* fonts) +{ + Vector2 mouseWheelDelta = GetMouseWheelMoveV(); + float mouseWheelX = mouseWheelDelta.x; + float mouseWheelY = mouseWheelDelta.y; + + //---------------------------------------------------------------------------------- + // Handle scroll containers + Clay_Vector2 mousePosition = RAYLIB_VECTOR2_TO_CLAY_VECTOR2(GetMousePosition()); + Clay_SetPointerState(mousePosition, IsMouseButtonDown(0)); + Clay_SetLayoutDimensions((Clay_Dimensions) { (float)GetScreenWidth(), (float)GetScreenHeight() }); + + Clay_UpdateScrollContainers(true, (Clay_Vector2) {mouseWheelX, mouseWheelY}, GetFrameTime()); + // Generate the auto layout for rendering + Clay_RenderCommandArray renderCommands = CreateLayout(); + // RENDERING --------------------------------- + BeginDrawing(); + ClearBackground(BLACK); + Clay_Raylib_Render(renderCommands, fonts); + EndDrawing(); + //---------------------------------------------------------------------------------- +} +int main(void) +{ + uint64_t totalMemorySize = Clay_MinMemorySize(); + Clay_Arena clayMemory = Clay_CreateArenaWithCapacityAndMemory(totalMemorySize, malloc(totalMemorySize)); + Clay_Initialize(clayMemory, (Clay_Dimensions) { (float)GetScreenWidth(), (float)GetScreenHeight() }, (Clay_ErrorHandler) { HandleClayErrors, 0 }); + Clay_Raylib_Initialize(720, 720, "Clay - Raylib Renderer Example", FLAG_VSYNC_HINT | FLAG_FULLSCREEN_MODE | FLAG_MSAA_4X_HINT); + HideCursor(); + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + if (reinitializeClay) { + Clay_SetMaxElementCount(8192); + totalMemorySize = Clay_MinMemorySize(); + clayMemory = Clay_CreateArenaWithCapacityAndMemory(totalMemorySize, malloc(totalMemorySize)); + Clay_Initialize(clayMemory, (Clay_Dimensions) { (float)GetScreenWidth(), (float)GetScreenHeight() }, (Clay_ErrorHandler) { HandleClayErrors, 0 }); + reinitializeClay = false; + } + UpdateDrawFrame(NULL); + } return 0; }