#define CLAY_IMPLEMENTATION #include "./clay-0.13/clay.h" #include "./clay-0.13/renderers/raylib/clay_renderer_raylib.c" #define RAYLIB_VECTOR2_TO_CLAY_VECTOR2(vector) (Clay_Vector2) { .x = vector.x, .y = vector.y } 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); } } 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; }