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();