Merge branch 'nicbarker:main' into main
1
.gitignore
vendored
@ -2,6 +2,5 @@ cmake-build-debug/
|
|||||||
cmake-build-release/
|
cmake-build-release/
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.idea/
|
.idea/
|
||||||
build/
|
|
||||||
node_modules/
|
node_modules/
|
||||||
*.dSYM
|
*.dSYM
|
||||||
|
183
clay.h
@ -29,43 +29,41 @@
|
|||||||
|
|
||||||
// Public Macro API ------------------------
|
// Public Macro API ------------------------
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#define CLAY__WRAPPER_TYPE(type) Clay__##type##Wrapper
|
||||||
#define CLAY__CONFIG_WRAPPER(type, ...) __VA_ARGS__
|
#define CLAY__WRAPPER_STRUCT(type) typedef struct { type wrapped; } CLAY__WRAPPER_TYPE(type)
|
||||||
#else
|
#define CLAY__CONFIG_WRAPPER(type, ...) (CLAY__INIT(CLAY__WRAPPER_TYPE(type)) { __VA_ARGS__ }).wrapped
|
||||||
#define CLAY__CONFIG_WRAPPER(type, ...) (type) __VA_ARGS__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CLAY__MAX(x, y) (((x) > (y)) ? (x) : (y))
|
#define CLAY__MAX(x, y) (((x) > (y)) ? (x) : (y))
|
||||||
#define CLAY__MIN(x, y) (((x) < (y)) ? (x) : (y))
|
#define CLAY__MIN(x, y) (((x) < (y)) ? (x) : (y))
|
||||||
|
|
||||||
#define CLAY_LAYOUT(...) Clay__AttachLayoutConfig(Clay__StoreLayoutConfig(CLAY__CONFIG_WRAPPER(Clay_LayoutConfig, __VA_ARGS__)))
|
#define CLAY_LAYOUT(...) Clay__AttachLayoutConfig(Clay__StoreLayoutConfig(CLAY__CONFIG_WRAPPER(Clay_LayoutConfig, __VA_ARGS__)))
|
||||||
|
|
||||||
#define CLAY_RECTANGLE(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .rectangleElementConfig = Clay__StoreRectangleElementConfig(CLAY__INIT(Clay_RectangleElementConfig) __VA_ARGS__) }, CLAY__ELEMENT_CONFIG_TYPE_RECTANGLE))
|
#define CLAY_RECTANGLE(...) Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .rectangleElementConfig = Clay__StoreRectangleElementConfig(CLAY__CONFIG_WRAPPER(Clay_RectangleElementConfig, __VA_ARGS__)) }, CLAY__ELEMENT_CONFIG_TYPE_RECTANGLE)
|
||||||
|
|
||||||
#define CLAY_TEXT_CONFIG(...) Clay__StoreTextElementConfig(CLAY__CONFIG_WRAPPER(Clay_TextElementConfig, __VA_ARGS__))
|
#define CLAY_TEXT_CONFIG(...) Clay__StoreTextElementConfig(CLAY__CONFIG_WRAPPER(Clay_TextElementConfig, __VA_ARGS__))
|
||||||
|
|
||||||
#define CLAY_IMAGE(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .imageElementConfig = Clay__StoreImageElementConfig(CLAY__INIT(Clay_ImageElementConfig) __VA_ARGS__) }, CLAY__ELEMENT_CONFIG_TYPE_IMAGE))
|
#define CLAY_IMAGE(...) Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .imageElementConfig = Clay__StoreImageElementConfig(CLAY__CONFIG_WRAPPER(Clay_ImageElementConfig, __VA_ARGS__)) }, CLAY__ELEMENT_CONFIG_TYPE_IMAGE)
|
||||||
|
|
||||||
#define CLAY_FLOATING(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .floatingElementConfig = Clay__StoreFloatingElementConfig(CLAY__INIT(Clay_FloatingElementConfig) __VA_ARGS__) }, CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER))
|
#define CLAY_FLOATING(...) Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .floatingElementConfig = Clay__StoreFloatingElementConfig(CLAY__CONFIG_WRAPPER(Clay_FloatingElementConfig, __VA_ARGS__)) }, CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER)
|
||||||
|
|
||||||
#define CLAY_CUSTOM_ELEMENT(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .customElementConfig = Clay__StoreCustomElementConfig(CLAY__INIT(Clay_CustomElementConfig) __VA_ARGS__) }, CLAY__ELEMENT_CONFIG_TYPE_CUSTOM))
|
#define CLAY_CUSTOM_ELEMENT(...) Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .customElementConfig = Clay__StoreCustomElementConfig(CLAY__CONFIG_WRAPPER(Clay_CustomElementConfig, __VA_ARGS__)) }, CLAY__ELEMENT_CONFIG_TYPE_CUSTOM)
|
||||||
|
|
||||||
#define CLAY_SCROLL(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .scrollElementConfig = Clay__StoreScrollElementConfig(CLAY__INIT(Clay_ScrollElementConfig) __VA_ARGS__) }, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER))
|
#define CLAY_SCROLL(...) Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .scrollElementConfig = Clay__StoreScrollElementConfig(CLAY__CONFIG_WRAPPER(Clay_ScrollElementConfig, __VA_ARGS__)) }, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER)
|
||||||
|
|
||||||
#define CLAY_BORDER(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .borderElementConfig = Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) __VA_ARGS__) }, CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER))
|
#define CLAY_BORDER(...) Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .borderElementConfig = Clay__StoreBorderElementConfig(CLAY__CONFIG_WRAPPER(Clay_BorderElementConfig, __VA_ARGS__)) }, CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER)
|
||||||
|
|
||||||
#define CLAY_BORDER_OUTSIDE(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .borderElementConfig = Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = __VA_ARGS__, .right = __VA_ARGS__, .top = __VA_ARGS__, .bottom = __VA_ARGS__ }) }, CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER))
|
#define CLAY_BORDER_OUTSIDE(...) Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .borderElementConfig = Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = __VA_ARGS__, .right = __VA_ARGS__, .top = __VA_ARGS__, .bottom = __VA_ARGS__ }) }, CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER)
|
||||||
|
|
||||||
#define CLAY_BORDER_OUTSIDE_RADIUS(width, color, radius) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .borderElementConfig = Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = { width, color }, .right = { width, color }, .top = { width, color }, .bottom = { width, color }, .cornerRadius = { radius, radius, radius, radius } })}, CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER))
|
#define CLAY_BORDER_OUTSIDE_RADIUS(width, color, radius) Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .borderElementConfig = Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = { width, color }, .right = { width, color }, .top = { width, color }, .bottom = { width, color }, .cornerRadius = CLAY_CORNER_RADIUS(radius) })}, CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER)
|
||||||
|
|
||||||
#define CLAY_BORDER_ALL(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .borderElementConfig = Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = __VA_ARGS__, .right = __VA_ARGS__, .top = __VA_ARGS__, .bottom = __VA_ARGS__, .betweenChildren = __VA_ARGS__ }) }, CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER))
|
#define CLAY_BORDER_ALL(...) Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .borderElementConfig = Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = __VA_ARGS__, .right = __VA_ARGS__, .top = __VA_ARGS__, .bottom = __VA_ARGS__, .betweenChildren = __VA_ARGS__ }) }, CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER)
|
||||||
|
|
||||||
#define CLAY_BORDER_ALL_RADIUS(width, color, radius) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .borderElementConfig = Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = { width, color }, .right = { width, color }, .top = { width, color }, .bottom = { width, color }, .betweenChildren = { width, color }, .cornerRadius = { radius, radius, radius, radius }}) }))
|
#define CLAY_BORDER_ALL_RADIUS(width, color, radius) Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .borderElementConfig = Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = { width, color }, .right = { width, color }, .top = { width, color }, .bottom = { width, color }, .betweenChildren = { width, color }, .cornerRadius = CLAY_CORNER_RADIUS(radius)}) }, CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER)
|
||||||
|
|
||||||
#define CLAY_CORNER_RADIUS(radius) (CLAY__INIT(Clay_CornerRadius) { radius, radius, radius, radius })
|
#define CLAY_CORNER_RADIUS(radius) (CLAY__INIT(Clay_CornerRadius) { radius, radius, radius, radius })
|
||||||
|
|
||||||
#define CLAY__STRUCT_1_ARGS(a) a
|
#define CLAY__STRUCT_1_ARGS(a) a
|
||||||
#define CLAY__STRUCT_0_ARGS() {0}
|
#define CLAY__STRUCT_0_ARGS() CLAY__DEFAULT_STRUCT
|
||||||
#define CLAY__STRUCT_OVERRIDE(_0, _1, NAME, ...) NAME
|
#define CLAY__STRUCT_OVERRIDE(_0, _1, NAME, ...) NAME
|
||||||
|
|
||||||
#define CLAY__SIZING_FIT_INTERNAL(...) (CLAY__INIT(Clay_SizingAxis) { .size = { .minMax = __VA_ARGS__ }, .type = CLAY__SIZING_TYPE_FIT })
|
#define CLAY__SIZING_FIT_INTERNAL(...) (CLAY__INIT(Clay_SizingAxis) { .size = { .minMax = __VA_ARGS__ }, .type = CLAY__SIZING_TYPE_FIT })
|
||||||
@ -84,7 +82,7 @@
|
|||||||
|
|
||||||
#define CLAY_ID_LOCAL(label) CLAY_IDI_LOCAL(label, 0)
|
#define CLAY_ID_LOCAL(label) CLAY_IDI_LOCAL(label, 0)
|
||||||
|
|
||||||
#define CLAY_IDI_LOCAL(label, index) Clay__AttachId(Clay__HashString(CLAY_STRING(label), Clay_LayoutElementArray_Get(&Clay__layoutElements, Clay__int32_tArray_Get(&Clay__openLayoutElementStack, Clay__openLayoutElementStack.length - 2))->children.length + 1, Clay__GetOpenLayoutElement()->id))
|
#define CLAY_IDI_LOCAL(label, index) Clay__AttachId(Clay__HashString(CLAY_STRING(label), index, Clay__GetParentElementId()))
|
||||||
|
|
||||||
#define CLAY__STRING_LENGTH(s) ((sizeof(s) / sizeof((s)[0])) - sizeof((s)[0]))
|
#define CLAY__STRING_LENGTH(s) ((sizeof(s) / sizeof((s)[0])) - sizeof((s)[0]))
|
||||||
|
|
||||||
@ -127,17 +125,22 @@ static uint8_t CLAY__ELEMENT_DEFINITION_LATCH;
|
|||||||
#define CLAY_TEXT(text, textConfig) Clay__OpenTextElement(text, textConfig)
|
#define CLAY_TEXT(text, textConfig) Clay__OpenTextElement(text, textConfig)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
||||||
#define CLAY__INIT(type) type
|
#define CLAY__INIT(type) type
|
||||||
#define CLAY__TYPEDEF(name, ...) typedef __VA_ARGS__ name
|
#define CLAY__TYPEDEF(name, ...) typedef __VA_ARGS__ name; CLAY__WRAPPER_STRUCT(name)
|
||||||
#define CLAY__ALIGNMENT(type) alignof(type)
|
#define CLAY__ALIGNMENT(type) alignof(type)
|
||||||
#define CLAY__POINTER_ALIGNMENT alignof(void *)
|
#define CLAY__POINTER_ALIGNMENT alignof(void *)
|
||||||
|
|
||||||
#define CLAY_PACKED_ENUM enum : uint8_t
|
#define CLAY_PACKED_ENUM enum : uint8_t
|
||||||
|
|
||||||
|
#define CLAY__DEFAULT_STRUCT {}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define CLAY__INIT(type) (type)
|
#define CLAY__INIT(type) (type)
|
||||||
|
|
||||||
#define CLAY__ALIGNMENT_STRUCT(type) struct Clay__Align##type { char c; type x; }
|
#define CLAY__ALIGNMENT_STRUCT(type) struct Clay__Align##type { char c; type x; }
|
||||||
#define CLAY__TYPEDEF(name, ...) typedef __VA_ARGS__ name; CLAY__ALIGNMENT_STRUCT(name)
|
#define CLAY__TYPEDEF(name, ...) typedef __VA_ARGS__ name; CLAY__ALIGNMENT_STRUCT(name); CLAY__WRAPPER_STRUCT(name)
|
||||||
#define CLAY__ALIGNMENT(type) (offsetof(struct Clay__Align##type, x))
|
#define CLAY__ALIGNMENT(type) (offsetof(struct Clay__Align##type, x))
|
||||||
#define CLAY__POINTER_ALIGNMENT CLAY__ALIGNMENT(pointer)
|
#define CLAY__POINTER_ALIGNMENT CLAY__ALIGNMENT(pointer)
|
||||||
|
|
||||||
@ -152,8 +155,15 @@ CLAY__ALIGNMENT_STRUCT(int32_t);
|
|||||||
#else
|
#else
|
||||||
#define CLAY_PACKED_ENUM enum __attribute__((__packed__))
|
#define CLAY_PACKED_ENUM enum __attribute__((__packed__))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if __STDC_VERSION__ >= 202311L
|
||||||
|
#define CLAY__DEFAULT_STRUCT {}
|
||||||
|
#else
|
||||||
|
#define CLAY__DEFAULT_STRUCT {0}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@ -516,6 +526,7 @@ Clay_ScrollElementConfig * Clay__StoreScrollElementConfig(Clay_ScrollElementConf
|
|||||||
Clay_BorderElementConfig * Clay__StoreBorderElementConfig(Clay_BorderElementConfig config);
|
Clay_BorderElementConfig * Clay__StoreBorderElementConfig(Clay_BorderElementConfig config);
|
||||||
Clay_ElementId Clay__HashString(Clay_String key, uint32_t offset, uint32_t seed);
|
Clay_ElementId Clay__HashString(Clay_String key, uint32_t offset, uint32_t seed);
|
||||||
void Clay__OpenTextElement(Clay_String text, Clay_TextElementConfig *textConfig);
|
void Clay__OpenTextElement(Clay_String text, Clay_TextElementConfig *textConfig);
|
||||||
|
uint32_t Clay__GetParentElementId(void);
|
||||||
|
|
||||||
extern Clay_Color Clay__debugViewHighlightColor;
|
extern Clay_Color Clay__debugViewHighlightColor;
|
||||||
extern uint32_t Clay__debugViewWidth;
|
extern uint32_t Clay__debugViewWidth;
|
||||||
@ -564,7 +575,7 @@ CLAY__TYPEDEF(Clay__Warning, struct {
|
|||||||
Clay_String dynamicMessage;
|
Clay_String dynamicMessage;
|
||||||
});
|
});
|
||||||
|
|
||||||
Clay__Warning CLAY__WARNING_DEFAULT = {0};
|
Clay__Warning CLAY__WARNING_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
CLAY__TYPEDEF(Clay__WarningArray, struct {
|
CLAY__TYPEDEF(Clay__WarningArray, struct {
|
||||||
@ -592,7 +603,7 @@ Clay__WarningArray Clay__WarningArray_Allocate_Arena(int32_t capacity, Clay_Aren
|
|||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
Clay__WarningArray Clay_warnings = {0};
|
Clay__WarningArray Clay_warnings = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
Clay__Warning *Clay__WarningArray_Add(Clay__WarningArray *array, Clay__Warning item)
|
Clay__Warning *Clay__WarningArray_Add(Clay__WarningArray *array, Clay__Warning item)
|
||||||
{
|
{
|
||||||
@ -662,7 +673,7 @@ Clay__BoolArray Clay__BoolArray_Allocate_Arena(int32_t capacity, Clay_Arena *are
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
// __GENERATED__ template
|
// __GENERATED__ template
|
||||||
|
|
||||||
Clay_ElementId CLAY__ELEMENT_ID_DEFAULT = {0};
|
Clay_ElementId CLAY__ELEMENT_ID_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_allocate,array_get,array_add TYPE=Clay_ElementId NAME=Clay__ElementIdArray DEFAULT_VALUE=&CLAY__ELEMENT_ID_DEFAULT
|
// __GENERATED__ template array_define,array_allocate,array_get,array_add TYPE=Clay_ElementId NAME=Clay__ElementIdArray DEFAULT_VALUE=&CLAY__ELEMENT_ID_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -688,7 +699,7 @@ Clay_ElementId *Clay__ElementIdArray_Add(Clay__ElementIdArray *array, Clay_Eleme
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
// __GENERATED__ template
|
// __GENERATED__ template
|
||||||
|
|
||||||
Clay_ElementConfig CLAY__ELEMENT_CONFIG_DEFAULT = {CLAY__ELEMENT_CONFIG_TYPE_NONE, {0}};
|
Clay_ElementConfig CLAY__ELEMENT_CONFIG_DEFAULT = {CLAY__ELEMENT_CONFIG_TYPE_NONE, CLAY__DEFAULT_STRUCT};
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_define_slice,array_allocate,array_get,array_add,array_get_slice TYPE=Clay_ElementConfig NAME=Clay__ElementConfigArray DEFAULT_VALUE=&CLAY__ELEMENT_CONFIG_DEFAULT
|
// __GENERATED__ template array_define,array_define_slice,array_allocate,array_get,array_add,array_get_slice TYPE=Clay_ElementConfig NAME=Clay__ElementConfigArray DEFAULT_VALUE=&CLAY__ELEMENT_CONFIG_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -745,7 +756,7 @@ Clay_LayoutConfig *Clay__LayoutConfigArray_Add(Clay__LayoutConfigArray *array, C
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
// __GENERATED__ template
|
// __GENERATED__ template
|
||||||
|
|
||||||
Clay_RectangleElementConfig CLAY__RECTANGLE_ELEMENT_CONFIG_DEFAULT = {0};
|
Clay_RectangleElementConfig CLAY__RECTANGLE_ELEMENT_CONFIG_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_RectangleElementConfig NAME=Clay__RectangleElementConfigArray DEFAULT_VALUE=&CLAY__RECTANGLE_ELEMENT_CONFIG_DEFAULT
|
// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_RectangleElementConfig NAME=Clay__RectangleElementConfigArray DEFAULT_VALUE=&CLAY__RECTANGLE_ELEMENT_CONFIG_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -768,7 +779,7 @@ Clay_RectangleElementConfig *Clay__RectangleElementConfigArray_Add(Clay__Rectang
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
// __GENERATED__ template
|
// __GENERATED__ template
|
||||||
|
|
||||||
Clay_TextElementConfig CLAY__TEXT_ELEMENT_CONFIG_DEFAULT = {0};
|
Clay_TextElementConfig CLAY__TEXT_ELEMENT_CONFIG_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_TextElementConfig NAME=Clay__TextElementConfigArray DEFAULT_VALUE=&CLAY__TEXT_ELEMENT_CONFIG_DEFAULT
|
// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_TextElementConfig NAME=Clay__TextElementConfigArray DEFAULT_VALUE=&CLAY__TEXT_ELEMENT_CONFIG_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -791,7 +802,7 @@ Clay_TextElementConfig *Clay__TextElementConfigArray_Add(Clay__TextElementConfig
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
// __GENERATED__ template
|
// __GENERATED__ template
|
||||||
|
|
||||||
Clay_ImageElementConfig CLAY__IMAGE_ELEMENT_CONFIG_DEFAULT = {0};
|
Clay_ImageElementConfig CLAY__IMAGE_ELEMENT_CONFIG_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_ImageElementConfig NAME=Clay__ImageElementConfigArray DEFAULT_VALUE=&CLAY__IMAGE_ELEMENT_CONFIG_DEFAULT
|
// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_ImageElementConfig NAME=Clay__ImageElementConfigArray DEFAULT_VALUE=&CLAY__IMAGE_ELEMENT_CONFIG_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -814,7 +825,7 @@ Clay_ImageElementConfig *Clay__ImageElementConfigArray_Add(Clay__ImageElementCon
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
// __GENERATED__ template
|
// __GENERATED__ template
|
||||||
|
|
||||||
Clay_FloatingElementConfig CLAY__FLOATING_ELEMENT_CONFIG_DEFAULT = {0};
|
Clay_FloatingElementConfig CLAY__FLOATING_ELEMENT_CONFIG_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_FloatingElementConfig NAME=Clay__FloatingElementConfigArray DEFAULT_VALUE=&CLAY__FLOATING_ELEMENT_CONFIG_DEFAULT
|
// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_FloatingElementConfig NAME=Clay__FloatingElementConfigArray DEFAULT_VALUE=&CLAY__FLOATING_ELEMENT_CONFIG_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -837,7 +848,7 @@ Clay_FloatingElementConfig *Clay__FloatingElementConfigArray_Add(Clay__FloatingE
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
// __GENERATED__ template
|
// __GENERATED__ template
|
||||||
|
|
||||||
Clay_CustomElementConfig CLAY__CUSTOM_ELEMENT_CONFIG_DEFAULT = {0};
|
Clay_CustomElementConfig CLAY__CUSTOM_ELEMENT_CONFIG_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_CustomElementConfig NAME=Clay__CustomElementConfigArray DEFAULT_VALUE=&CLAY__CUSTOM_ELEMENT_CONFIG_DEFAULT
|
// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_CustomElementConfig NAME=Clay__CustomElementConfigArray DEFAULT_VALUE=&CLAY__CUSTOM_ELEMENT_CONFIG_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -860,7 +871,7 @@ Clay_CustomElementConfig *Clay__CustomElementConfigArray_Add(Clay__CustomElement
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
// __GENERATED__ template
|
// __GENERATED__ template
|
||||||
|
|
||||||
Clay_ScrollElementConfig CLAY__SCROLL_ELEMENT_CONFIG_DEFAULT = {0};
|
Clay_ScrollElementConfig CLAY__SCROLL_ELEMENT_CONFIG_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_ScrollElementConfig NAME=Clay__ScrollElementConfigArray DEFAULT_VALUE=&CLAY__SCROLL_ELEMENT_CONFIG_DEFAULT
|
// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_ScrollElementConfig NAME=Clay__ScrollElementConfigArray DEFAULT_VALUE=&CLAY__SCROLL_ELEMENT_CONFIG_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -908,7 +919,7 @@ CLAY__TYPEDEF(Clay__WrappedTextLine, struct {
|
|||||||
Clay_String line;
|
Clay_String line;
|
||||||
});
|
});
|
||||||
|
|
||||||
Clay__WrappedTextLine CLAY__WRAPPED_TEXT_LINE_DEFAULT = {0};
|
Clay__WrappedTextLine CLAY__WRAPPED_TEXT_LINE_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_define_slice,array_allocate,array_add,array_get TYPE=Clay__WrappedTextLine NAME=Clay__WrappedTextLineArray DEFAULT_VALUE=&CLAY__WRAPPED_TEXT_LINE_DEFAULT
|
// __GENERATED__ template array_define,array_define_slice,array_allocate,array_add,array_get TYPE=Clay__WrappedTextLine NAME=Clay__WrappedTextLineArray DEFAULT_VALUE=&CLAY__WRAPPED_TEXT_LINE_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -946,7 +957,7 @@ CLAY__TYPEDEF(Clay__TextElementData, struct {
|
|||||||
Clay__WrappedTextLineArraySlice wrappedLines;
|
Clay__WrappedTextLineArraySlice wrappedLines;
|
||||||
});
|
});
|
||||||
|
|
||||||
Clay__TextElementData CLAY__TEXT_ELEMENT_DATA_DEFAULT = {0};
|
Clay__TextElementData CLAY__TEXT_ELEMENT_DATA_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_allocate,array_get,array_add TYPE=Clay__TextElementData NAME=Clay__TextElementDataArray DEFAULT_VALUE=&CLAY__TEXT_ELEMENT_DATA_DEFAULT
|
// __GENERATED__ template array_define,array_allocate,array_get,array_add TYPE=Clay__TextElementData NAME=Clay__TextElementDataArray DEFAULT_VALUE=&CLAY__TEXT_ELEMENT_DATA_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -972,7 +983,7 @@ Clay__TextElementData *Clay__TextElementDataArray_Add(Clay__TextElementDataArray
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
// __GENERATED__ template
|
// __GENERATED__ template
|
||||||
|
|
||||||
Clay_BorderElementConfig CLAY__BORDER_ELEMENT_CONFIG_DEFAULT = {0};
|
Clay_BorderElementConfig CLAY__BORDER_ELEMENT_CONFIG_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_BorderElementConfig NAME=Clay__BorderElementConfigArray DEFAULT_VALUE=&CLAY__BORDER_ELEMENT_CONFIG_DEFAULT
|
// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_BorderElementConfig NAME=Clay__BorderElementConfigArray DEFAULT_VALUE=&CLAY__BORDER_ELEMENT_CONFIG_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -1013,7 +1024,7 @@ CLAY__TYPEDEF(Clay_LayoutElement, struct {
|
|||||||
uint32_t id;
|
uint32_t id;
|
||||||
});
|
});
|
||||||
|
|
||||||
Clay_LayoutElement CLAY__LAYOUT_ELEMENT_DEFAULT = {0};
|
Clay_LayoutElement CLAY__LAYOUT_ELEMENT_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_allocate,array_add,array_get TYPE=Clay_LayoutElement NAME=Clay_LayoutElementArray DEFAULT_VALUE=&CLAY__LAYOUT_ELEMENT_DEFAULT
|
// __GENERATED__ template array_define,array_allocate,array_add,array_get TYPE=Clay_LayoutElement NAME=Clay_LayoutElementArray DEFAULT_VALUE=&CLAY__LAYOUT_ELEMENT_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -1072,7 +1083,7 @@ Clay_LayoutElement* Clay__LayoutElementPointerArray_RemoveSwapback(Clay__LayoutE
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
// __GENERATED__ template
|
// __GENERATED__ template
|
||||||
|
|
||||||
Clay_RenderCommand CLAY__RENDER_COMMAND_DEFAULT = {0};
|
Clay_RenderCommand CLAY__RENDER_COMMAND_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_allocate,array_add,array_get TYPE=Clay_RenderCommand NAME=Clay_RenderCommandArray DEFAULT_VALUE=&CLAY__RENDER_COMMAND_DEFAULT
|
// __GENERATED__ template array_allocate,array_add,array_get TYPE=Clay_RenderCommand NAME=Clay_RenderCommandArray DEFAULT_VALUE=&CLAY__RENDER_COMMAND_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -1107,7 +1118,7 @@ CLAY__TYPEDEF(Clay__ScrollContainerDataInternal, struct {
|
|||||||
bool pointerScrollActive;
|
bool pointerScrollActive;
|
||||||
});
|
});
|
||||||
|
|
||||||
Clay__ScrollContainerDataInternal CLAY__SCROLL_CONTAINER_DEFAULT = {0};
|
Clay__ScrollContainerDataInternal CLAY__SCROLL_CONTAINER_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_allocate,array_add,array_get TYPE=Clay__ScrollContainerDataInternal NAME=Clay__ScrollContainerDataInternalArray DEFAULT_VALUE=&CLAY__SCROLL_CONTAINER_DEFAULT
|
// __GENERATED__ template array_define,array_allocate,array_add,array_get TYPE=Clay__ScrollContainerDataInternal NAME=Clay__ScrollContainerDataInternalArray DEFAULT_VALUE=&CLAY__SCROLL_CONTAINER_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -1152,7 +1163,7 @@ CLAY__TYPEDEF(Clay__DebugElementData, struct {
|
|||||||
bool collapsed;
|
bool collapsed;
|
||||||
});
|
});
|
||||||
|
|
||||||
Clay__DebugElementData CLAY__DEBUG_ELEMENT_DATA_DEFAULT = {0};
|
Clay__DebugElementData CLAY__DEBUG_ELEMENT_DATA_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_allocate,array_add,array_get TYPE=Clay__DebugElementData NAME=Clay__DebugElementDataArray DEFAULT_VALUE=&CLAY__DEBUG_ELEMENT_DATA_DEFAULT
|
// __GENERATED__ template array_define,array_allocate,array_add,array_get TYPE=Clay__DebugElementData NAME=Clay__DebugElementDataArray DEFAULT_VALUE=&CLAY__DEBUG_ELEMENT_DATA_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -1338,7 +1349,7 @@ CLAY__TYPEDEF(Clay__LayoutElementTreeNode, struct {
|
|||||||
Clay_Vector2 nextChildOffset;
|
Clay_Vector2 nextChildOffset;
|
||||||
});
|
});
|
||||||
|
|
||||||
Clay__LayoutElementTreeNode CLAY__LAYOUT_ELEMENT_TREE_NODE_DEFAULT = {0};
|
Clay__LayoutElementTreeNode CLAY__LAYOUT_ELEMENT_TREE_NODE_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_allocate,array_add,array_get TYPE=Clay__LayoutElementTreeNode NAME=Clay__LayoutElementTreeNodeArray DEFAULT_VALUE=&CLAY__LAYOUT_ELEMENT_TREE_NODE_DEFAULT
|
// __GENERATED__ template array_define,array_allocate,array_add,array_get TYPE=Clay__LayoutElementTreeNode NAME=Clay__LayoutElementTreeNodeArray DEFAULT_VALUE=&CLAY__LAYOUT_ELEMENT_TREE_NODE_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -1372,7 +1383,7 @@ CLAY__TYPEDEF(Clay__LayoutElementTreeRoot, struct {
|
|||||||
Clay_Vector2 pointerOffset; // Only used when scroll containers are managed externally
|
Clay_Vector2 pointerOffset; // Only used when scroll containers are managed externally
|
||||||
});
|
});
|
||||||
|
|
||||||
Clay__LayoutElementTreeRoot CLAY__LAYOUT_ELEMENT_TREE_ROOT_DEFAULT = {0};
|
Clay__LayoutElementTreeRoot CLAY__LAYOUT_ELEMENT_TREE_ROOT_DEFAULT = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// __GENERATED__ template array_define,array_allocate,array_add,array_get TYPE=Clay__LayoutElementTreeRoot NAME=Clay__LayoutElementTreeRootArray DEFAULT_VALUE=&CLAY__LAYOUT_ELEMENT_TREE_ROOT_DEFAULT
|
// __GENERATED__ template array_define,array_allocate,array_add,array_get TYPE=Clay__LayoutElementTreeRoot NAME=Clay__LayoutElementTreeRootArray DEFAULT_VALUE=&CLAY__LAYOUT_ELEMENT_TREE_ROOT_DEFAULT
|
||||||
#pragma region generated
|
#pragma region generated
|
||||||
@ -1422,7 +1433,7 @@ Clay_String Clay__WriteStringToCharBuffer(Clay__CharArray *buffer, Clay_String s
|
|||||||
|
|
||||||
// Global Variable Definitions ----------------------------------------------
|
// Global Variable Definitions ----------------------------------------------
|
||||||
Clay_PointerData Clay__pointerInfo = { .position = {-1, -1} };
|
Clay_PointerData Clay__pointerInfo = { .position = {-1, -1} };
|
||||||
Clay_Dimensions Clay__layoutDimensions = {0};
|
Clay_Dimensions Clay__layoutDimensions = CLAY__DEFAULT_STRUCT;
|
||||||
Clay_ElementId Clay__dynamicElementIndexBaseHash = { .id = 128476991, .stringId = { .length = 8, .chars = "Auto ID" } };
|
Clay_ElementId Clay__dynamicElementIndexBaseHash = { .id = 128476991, .stringId = { .length = 8, .chars = "Auto ID" } };
|
||||||
uint32_t Clay__dynamicElementIndex = 0;
|
uint32_t Clay__dynamicElementIndex = 0;
|
||||||
bool Clay__debugModeEnabled = false;
|
bool Clay__debugModeEnabled = false;
|
||||||
@ -1486,6 +1497,10 @@ Clay_LayoutElement* Clay__GetOpenLayoutElement(void) {
|
|||||||
return Clay_LayoutElementArray_Get(&Clay__layoutElements, Clay__int32_tArray_Get(&Clay__openLayoutElementStack, Clay__openLayoutElementStack.length - 1));
|
return Clay_LayoutElementArray_Get(&Clay__layoutElements, Clay__int32_tArray_Get(&Clay__openLayoutElementStack, Clay__openLayoutElementStack.length - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t Clay__GetParentElementId(void) {
|
||||||
|
return Clay_LayoutElementArray_Get(&Clay__layoutElements, Clay__int32_tArray_Get(&Clay__openLayoutElementStack, Clay__openLayoutElementStack.length - 2))->id;
|
||||||
|
}
|
||||||
|
|
||||||
bool Clay__ElementHasConfig(Clay_LayoutElement *element, Clay__ElementConfigType type) {
|
bool Clay__ElementHasConfig(Clay_LayoutElement *element, Clay__ElementConfigType type) {
|
||||||
return (element->configsEnabled & type);
|
return (element->configsEnabled & type);
|
||||||
}
|
}
|
||||||
@ -1771,7 +1786,7 @@ Clay_LayoutElementHashMapItem* Clay__AddHashMapItem(Clay_ElementId elementId, Cl
|
|||||||
hashItemIndex = hashItem->nextIndex;
|
hashItemIndex = hashItem->nextIndex;
|
||||||
}
|
}
|
||||||
Clay_LayoutElementHashMapItem *hashItem = Clay__LayoutElementHashMapItemArray_Add(&Clay__layoutElementsHashMapInternal, item);
|
Clay_LayoutElementHashMapItem *hashItem = Clay__LayoutElementHashMapItemArray_Add(&Clay__layoutElementsHashMapInternal, item);
|
||||||
hashItem->debugData = Clay__DebugElementDataArray_Add(&Clay__debugElementData, CLAY__INIT(Clay__DebugElementData) {0});
|
hashItem->debugData = Clay__DebugElementDataArray_Add(&Clay__debugElementData, CLAY__INIT(Clay__DebugElementData) CLAY__DEFAULT_STRUCT);
|
||||||
if (hashItemPrevious != -1) {
|
if (hashItemPrevious != -1) {
|
||||||
Clay__LayoutElementHashMapItemArray_Get(&Clay__layoutElementsHashMapInternal, hashItemPrevious)->nextIndex = (int32_t)Clay__layoutElementsHashMapInternal.length - 1;
|
Clay__LayoutElementHashMapItemArray_Get(&Clay__layoutElementsHashMapInternal, hashItemPrevious)->nextIndex = (int32_t)Clay__layoutElementsHashMapInternal.length - 1;
|
||||||
} else {
|
} else {
|
||||||
@ -1990,7 +2005,7 @@ void Clay__OpenElement(void) {
|
|||||||
Clay__booleanWarnings.maxElementsExceeded = true;
|
Clay__booleanWarnings.maxElementsExceeded = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Clay_LayoutElement layoutElement = {0};
|
Clay_LayoutElement layoutElement = CLAY__DEFAULT_STRUCT;
|
||||||
Clay_LayoutElementArray_Add(&Clay__layoutElements, layoutElement);
|
Clay_LayoutElementArray_Add(&Clay__layoutElements, layoutElement);
|
||||||
Clay__int32_tArray_Add(&Clay__openLayoutElementStack, Clay__layoutElements.length - 1);
|
Clay__int32_tArray_Add(&Clay__openLayoutElementStack, Clay__layoutElements.length - 1);
|
||||||
if (Clay__openClipElementStack.length > 0) {
|
if (Clay__openClipElementStack.length > 0) {
|
||||||
@ -2486,7 +2501,7 @@ void Clay__CalculateFinalLayout(void) {
|
|||||||
dfsBuffer.length = 0;
|
dfsBuffer.length = 0;
|
||||||
Clay__LayoutElementTreeRoot *root = Clay__LayoutElementTreeRootArray_Get(&Clay__layoutElementTreeRoots, rootIndex);
|
Clay__LayoutElementTreeRoot *root = Clay__LayoutElementTreeRootArray_Get(&Clay__layoutElementTreeRoots, rootIndex);
|
||||||
Clay_LayoutElement *rootElement = Clay_LayoutElementArray_Get(&Clay__layoutElements, (int)root->layoutElementIndex);
|
Clay_LayoutElement *rootElement = Clay_LayoutElementArray_Get(&Clay__layoutElements, (int)root->layoutElementIndex);
|
||||||
Clay_Vector2 rootPosition = {0};
|
Clay_Vector2 rootPosition = CLAY__DEFAULT_STRUCT;
|
||||||
Clay_LayoutElementHashMapItem *parentHashMapItem = Clay__GetHashMapItem(root->parentId);
|
Clay_LayoutElementHashMapItem *parentHashMapItem = Clay__GetHashMapItem(root->parentId);
|
||||||
// Position root floating containers
|
// Position root floating containers
|
||||||
if (Clay__ElementHasConfig(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER) && parentHashMapItem) {
|
if (Clay__ElementHasConfig(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER) && parentHashMapItem) {
|
||||||
@ -2494,7 +2509,7 @@ void Clay__CalculateFinalLayout(void) {
|
|||||||
Clay_Dimensions rootDimensions = rootElement->dimensions;
|
Clay_Dimensions rootDimensions = rootElement->dimensions;
|
||||||
Clay_BoundingBox parentBoundingBox = parentHashMapItem->boundingBox;
|
Clay_BoundingBox parentBoundingBox = parentHashMapItem->boundingBox;
|
||||||
// Set X position
|
// Set X position
|
||||||
Clay_Vector2 targetAttachPosition = {0};
|
Clay_Vector2 targetAttachPosition = CLAY__DEFAULT_STRUCT;
|
||||||
switch (config->attachment.parent) {
|
switch (config->attachment.parent) {
|
||||||
case CLAY_ATTACH_POINT_LEFT_TOP:
|
case CLAY_ATTACH_POINT_LEFT_TOP:
|
||||||
case CLAY_ATTACH_POINT_LEFT_CENTER:
|
case CLAY_ATTACH_POINT_LEFT_CENTER:
|
||||||
@ -2565,7 +2580,7 @@ void Clay__CalculateFinalLayout(void) {
|
|||||||
}
|
}
|
||||||
Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) {
|
Clay__AddRenderCommand(CLAY__INIT(Clay_RenderCommand) {
|
||||||
.boundingBox = clipHashMapItem->boundingBox,
|
.boundingBox = clipHashMapItem->boundingBox,
|
||||||
.config = { .scrollElementConfig = Clay__StoreScrollElementConfig(CLAY__INIT(Clay_ScrollElementConfig){0}) },
|
.config = { .scrollElementConfig = Clay__StoreScrollElementConfig(CLAY__INIT(Clay_ScrollElementConfig)CLAY__DEFAULT_STRUCT) },
|
||||||
.id = Clay__RehashWithNumber(rootElement->id, 10), // TODO need a better strategy for managing derived ids
|
.id = Clay__RehashWithNumber(rootElement->id, 10), // TODO need a better strategy for managing derived ids
|
||||||
.commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_START,
|
.commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_START,
|
||||||
});
|
});
|
||||||
@ -2578,7 +2593,7 @@ void Clay__CalculateFinalLayout(void) {
|
|||||||
Clay__LayoutElementTreeNode *currentElementTreeNode = Clay__LayoutElementTreeNodeArray_Get(&dfsBuffer, (int)dfsBuffer.length - 1);
|
Clay__LayoutElementTreeNode *currentElementTreeNode = Clay__LayoutElementTreeNodeArray_Get(&dfsBuffer, (int)dfsBuffer.length - 1);
|
||||||
Clay_LayoutElement *currentElement = currentElementTreeNode->layoutElement;
|
Clay_LayoutElement *currentElement = currentElementTreeNode->layoutElement;
|
||||||
Clay_LayoutConfig *layoutConfig = currentElement->layoutConfig;
|
Clay_LayoutConfig *layoutConfig = currentElement->layoutConfig;
|
||||||
Clay_Vector2 scrollOffset = {0};
|
Clay_Vector2 scrollOffset = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
// This will only be run a single time for each element in downwards DFS order
|
// This will only be run a single time for each element in downwards DFS order
|
||||||
if (!Clay__treeNodeVisited.internalArray[dfsBuffer.length - 1]) {
|
if (!Clay__treeNodeVisited.internalArray[dfsBuffer.length - 1]) {
|
||||||
@ -2612,7 +2627,7 @@ void Clay__CalculateFinalLayout(void) {
|
|||||||
scrollOffset.y = mapping->scrollPosition.y;
|
scrollOffset.y = mapping->scrollPosition.y;
|
||||||
}
|
}
|
||||||
if (Clay__externalScrollHandlingEnabled) {
|
if (Clay__externalScrollHandlingEnabled) {
|
||||||
scrollOffset = CLAY__INIT(Clay_Vector2) {0};
|
scrollOffset = CLAY__INIT(Clay_Vector2) CLAY__DEFAULT_STRUCT;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2776,7 +2791,7 @@ void Clay__CalculateFinalLayout(void) {
|
|||||||
if (scrollConfig->horizontal) { scrollOffset.x = mapping->scrollPosition.x; }
|
if (scrollConfig->horizontal) { scrollOffset.x = mapping->scrollPosition.x; }
|
||||||
if (scrollConfig->vertical) { scrollOffset.y = mapping->scrollPosition.y; }
|
if (scrollConfig->vertical) { scrollOffset.y = mapping->scrollPosition.y; }
|
||||||
if (Clay__externalScrollHandlingEnabled) {
|
if (Clay__externalScrollHandlingEnabled) {
|
||||||
scrollOffset = CLAY__INIT(Clay_Vector2) {0};
|
scrollOffset = CLAY__INIT(Clay_Vector2) CLAY__DEFAULT_STRUCT;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2939,7 +2954,7 @@ const int32_t CLAY__DEBUGVIEW_ROW_HEIGHT = 30;
|
|||||||
const int32_t CLAY__DEBUGVIEW_OUTER_PADDING = 10;
|
const int32_t CLAY__DEBUGVIEW_OUTER_PADDING = 10;
|
||||||
const int32_t CLAY__DEBUGVIEW_INDENT_WIDTH = 16;
|
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_TextElementConfig Clay__DebugView_TextNameConfig = {.textColor = {238, 226, 231, 255}, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE };
|
||||||
Clay_LayoutConfig Clay__DebugView_ScrollViewItemLayoutConfig = {0};
|
Clay_LayoutConfig Clay__DebugView_ScrollViewItemLayoutConfig = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
CLAY__TYPEDEF(Clay__DebugElementConfigTypeLabelConfig, struct {
|
CLAY__TYPEDEF(Clay__DebugElementConfigTypeLabelConfig, struct {
|
||||||
Clay_String label;
|
Clay_String label;
|
||||||
@ -2969,7 +2984,7 @@ CLAY__TYPEDEF(Clay__RenderDebugLayoutData, struct {
|
|||||||
Clay__RenderDebugLayoutData Clay__RenderDebugLayoutElementsList(int32_t initialRootsLength, int32_t highlightedRowIndex) {
|
Clay__RenderDebugLayoutData Clay__RenderDebugLayoutElementsList(int32_t initialRootsLength, int32_t highlightedRowIndex) {
|
||||||
Clay__int32_tArray dfsBuffer = Clay__reusableElementIndexBuffer;
|
Clay__int32_tArray dfsBuffer = Clay__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__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 = {0};
|
Clay__RenderDebugLayoutData layoutData = CLAY__DEFAULT_STRUCT;
|
||||||
|
|
||||||
uint32_t highlightedElementId = 0;
|
uint32_t highlightedElementId = 0;
|
||||||
|
|
||||||
@ -2979,8 +2994,8 @@ Clay__RenderDebugLayoutData Clay__RenderDebugLayoutElementsList(int32_t initialR
|
|||||||
Clay__int32_tArray_Add(&dfsBuffer, (int32_t)root->layoutElementIndex);
|
Clay__int32_tArray_Add(&dfsBuffer, (int32_t)root->layoutElementIndex);
|
||||||
Clay__treeNodeVisited.internalArray[0] = false;
|
Clay__treeNodeVisited.internalArray[0] = false;
|
||||||
if (rootIndex > 0) {
|
if (rootIndex > 0) {
|
||||||
CLAY(CLAY_IDI("Clay__DebugView_EmptyRowOuter", rootIndex), CLAY_LAYOUT({ .sizing = {.width = CLAY_SIZING_GROW({0})}, .padding = {CLAY__DEBUGVIEW_INDENT_WIDTH / 2, 0} })) {
|
CLAY(CLAY_IDI("Clay__DebugView_EmptyRowOuter", rootIndex), CLAY_LAYOUT({ .sizing = {.width = CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT)}, .padding = {CLAY__DEBUGVIEW_INDENT_WIDTH / 2, 0} })) {
|
||||||
CLAY(CLAY_IDI("Clay__DebugView_EmptyRow", rootIndex), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW({0}), .height = CLAY_SIZING_FIXED((float)CLAY__DEBUGVIEW_ROW_HEIGHT) }}), CLAY_BORDER({ .top = { .width = 1, .color = CLAY__DEBUGVIEW_COLOR_3 } })) {}
|
CLAY(CLAY_IDI("Clay__DebugView_EmptyRow", rootIndex), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), .height = CLAY_SIZING_FIXED((float)CLAY__DEBUGVIEW_ROW_HEIGHT) }}), CLAY_BORDER({ .top = { .width = 1, .color = CLAY__DEBUGVIEW_COLOR_3 } })) {}
|
||||||
}
|
}
|
||||||
layoutData.rowCount++;
|
layoutData.rowCount++;
|
||||||
}
|
}
|
||||||
@ -3057,8 +3072,8 @@ Clay__RenderDebugLayoutData Clay__RenderDebugLayoutElementsList(int32_t initialR
|
|||||||
layoutData.rowCount++;
|
layoutData.rowCount++;
|
||||||
Clay__TextElementData *textElementData = currentElement->childrenOrTextContent.textElementData;
|
Clay__TextElementData *textElementData = currentElement->childrenOrTextContent.textElementData;
|
||||||
Clay_TextElementConfig *rawTextConfig = offscreen ? CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16 }) : &Clay__DebugView_TextNameConfig;
|
Clay_TextElementConfig *rawTextConfig = offscreen ? CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16 }) : &Clay__DebugView_TextNameConfig;
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = { .height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER } }), CLAY_RECTANGLE({0})) {
|
CLAY(CLAY_LAYOUT({ .sizing = { .height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER } }), CLAY_RECTANGLE(CLAY__DEFAULT_STRUCT)) {
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_INDENT_WIDTH + 16), {0}} })) {}
|
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_INDENT_WIDTH + 16), CLAY__DEFAULT_STRUCT} })) {}
|
||||||
CLAY_TEXT(CLAY_STRING("\""), rawTextConfig);
|
CLAY_TEXT(CLAY_STRING("\""), rawTextConfig);
|
||||||
CLAY_TEXT(textElementData->text.length > 40 ? (CLAY__INIT(Clay_String) { .length = 40, .chars = textElementData->text.chars }) : textElementData->text, 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) {
|
if (textElementData->text.length > 40) {
|
||||||
@ -3073,7 +3088,7 @@ Clay__RenderDebugLayoutData Clay__RenderDebugLayoutElementsList(int32_t initialR
|
|||||||
Clay__OpenElement();
|
Clay__OpenElement();
|
||||||
CLAY_BORDER({ .left = { .width = 1, .color = CLAY__DEBUGVIEW_COLOR_3 }});
|
CLAY_BORDER({ .left = { .width = 1, .color = CLAY__DEBUGVIEW_COLOR_3 }});
|
||||||
Clay__ElementPostConfiguration();
|
Clay__ElementPostConfiguration();
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED( CLAY__DEBUGVIEW_INDENT_WIDTH), {0}}, .childAlignment = { .x = CLAY_ALIGN_X_RIGHT } })) {}
|
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED( CLAY__DEBUGVIEW_INDENT_WIDTH), CLAY__DEFAULT_STRUCT}, .childAlignment = { .x = CLAY_ALIGN_X_RIGHT } })) {}
|
||||||
Clay__OpenElement();
|
Clay__OpenElement();
|
||||||
CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM });
|
CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM });
|
||||||
Clay__ElementPostConfiguration();
|
Clay__ElementPostConfiguration();
|
||||||
@ -3102,8 +3117,8 @@ Clay__RenderDebugLayoutData Clay__RenderDebugLayoutElementsList(int32_t initialR
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (highlightedElementId) {
|
if (highlightedElementId) {
|
||||||
CLAY(CLAY_ID("Clay__DebugView_ElementHighlight"), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({0}), CLAY_SIZING_GROW({0})} }), CLAY_FLOATING({ .zIndex = 65535, .parentId = highlightedElementId })) {
|
CLAY(CLAY_ID("Clay__DebugView_ElementHighlight"), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT)} }), CLAY_FLOATING({ .zIndex = 65535, .parentId = highlightedElementId })) {
|
||||||
CLAY(CLAY_ID("Clay__DebugView_ElementHighlightRectangle"), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({0}), CLAY_SIZING_GROW({0})} }), CLAY_RECTANGLE({.color = Clay__debugViewHighlightColor })) {}
|
CLAY(CLAY_ID("Clay__DebugView_ElementHighlightRectangle"), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT)} }), CLAY_RECTANGLE({.color = Clay__debugViewHighlightColor })) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return layoutData;
|
return layoutData;
|
||||||
@ -3138,11 +3153,11 @@ void Clay__RenderDebugViewElementConfigHeader(Clay_String elementId, Clay__Eleme
|
|||||||
Clay__DebugElementConfigTypeLabelConfig config = Clay__DebugGetElementConfigTypeLabel(type);
|
Clay__DebugElementConfigTypeLabelConfig config = Clay__DebugGetElementConfigTypeLabel(type);
|
||||||
Clay_Color backgroundColor = config.color;
|
Clay_Color backgroundColor = config.color;
|
||||||
backgroundColor.a = 90;
|
backgroundColor.a = 90;
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({0}), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT + 8)}, .padding = { .x = CLAY__DEBUGVIEW_OUTER_PADDING }, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER } })) {
|
CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT + 8)}, .padding = { .x = CLAY__DEBUGVIEW_OUTER_PADDING }, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER } })) {
|
||||||
CLAY(CLAY_LAYOUT({ .padding = { 8, 2 } }), CLAY_RECTANGLE({ .color = backgroundColor, .cornerRadius = CLAY_CORNER_RADIUS(4) }), CLAY_BORDER_OUTSIDE_RADIUS(1, config.color, 4)) {
|
CLAY(CLAY_LAYOUT({ .padding = { 8, 2 } }), CLAY_RECTANGLE({ .color = backgroundColor, .cornerRadius = CLAY_CORNER_RADIUS(4) }), CLAY_BORDER_OUTSIDE_RADIUS(1, config.color, 4)) {
|
||||||
CLAY_TEXT(config.label, CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 }));
|
CLAY_TEXT(config.label, CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 }));
|
||||||
}
|
}
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW({0}) } })) {}
|
CLAY(CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT) } })) {}
|
||||||
CLAY_TEXT(elementId, CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE }));
|
CLAY_TEXT(elementId, CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE }));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3158,7 +3173,7 @@ void Clay__RenderDebugViewColor(Clay_Color color, Clay_TextElementConfig *textCo
|
|||||||
CLAY_TEXT(CLAY_STRING(", a: "), textConfig);
|
CLAY_TEXT(CLAY_STRING(", a: "), textConfig);
|
||||||
CLAY_TEXT(Clay__IntToString(color.a), textConfig);
|
CLAY_TEXT(Clay__IntToString(color.a), textConfig);
|
||||||
CLAY_TEXT(CLAY_STRING(" }"), textConfig);
|
CLAY_TEXT(CLAY_STRING(" }"), textConfig);
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_FIXED(10), {0} } })) {}
|
CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_FIXED(10), CLAY__DEFAULT_STRUCT } })) {}
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8)} }), CLAY_BORDER_OUTSIDE_RADIUS(1, CLAY__DEBUGVIEW_COLOR_4, 4)) {
|
CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8)} }), CLAY_BORDER_OUTSIDE_RADIUS(1, CLAY__DEBUGVIEW_COLOR_4, 4)) {
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8)} }), CLAY_RECTANGLE({ .color = color, .cornerRadius = CLAY_CORNER_RADIUS(4) })) {}
|
CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8)} }), CLAY_RECTANGLE({ .color = color, .cornerRadius = CLAY_CORNER_RADIUS(4) })) {}
|
||||||
}
|
}
|
||||||
@ -3230,15 +3245,15 @@ void Clay__RenderDebugView(void) {
|
|||||||
if (Clay__pointerInfo.position.x < Clay__layoutDimensions.width - (float)Clay__debugViewWidth) {
|
if (Clay__pointerInfo.position.x < Clay__layoutDimensions.width - (float)Clay__debugViewWidth) {
|
||||||
highlightedRow = -1;
|
highlightedRow = -1;
|
||||||
}
|
}
|
||||||
Clay__RenderDebugLayoutData layoutData = {0};
|
Clay__RenderDebugLayoutData layoutData = CLAY__DEFAULT_STRUCT;
|
||||||
CLAY(CLAY_ID("Clay__DebugView"),
|
CLAY(CLAY_ID("Clay__DebugView"),
|
||||||
CLAY_FLOATING({ .parentId = Clay__HashString(CLAY_STRING("Clay__RootContainer"), 0, 0).id, .attachment = { .element = CLAY_ATTACH_POINT_LEFT_CENTER, .parent = CLAY_ATTACH_POINT_RIGHT_CENTER }}),
|
CLAY_FLOATING({ .parentId = Clay__HashString(CLAY_STRING("Clay__RootContainer"), 0, 0).id, .attachment = { .element = CLAY_ATTACH_POINT_LEFT_CENTER, .parent = CLAY_ATTACH_POINT_RIGHT_CENTER }}),
|
||||||
CLAY_LAYOUT({ .sizing = { CLAY_SIZING_FIXED((float)Clay__debugViewWidth) , CLAY_SIZING_FIXED(Clay__layoutDimensions.height) }, .layoutDirection = CLAY_TOP_TO_BOTTOM }),
|
CLAY_LAYOUT({ .sizing = { CLAY_SIZING_FIXED((float)Clay__debugViewWidth) , CLAY_SIZING_FIXED(Clay__layoutDimensions.height) }, .layoutDirection = CLAY_TOP_TO_BOTTOM }),
|
||||||
CLAY_BORDER({ .bottom = { .width = 1, .color = CLAY__DEBUGVIEW_COLOR_3 }})
|
CLAY_BORDER({ .bottom = { .width = 1, .color = CLAY__DEBUGVIEW_COLOR_3 }})
|
||||||
) {
|
) {
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({0}), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 0}, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} }), CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_2 })) {
|
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 0}, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} }), CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_2 })) {
|
||||||
CLAY_TEXT(CLAY_STRING("Clay Debug Tools"), infoTextConfig);
|
CLAY_TEXT(CLAY_STRING("Clay Debug Tools"), infoTextConfig);
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({0}), {0} } })) {}
|
CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), CLAY__DEFAULT_STRUCT } })) {}
|
||||||
// Close button
|
// Close button
|
||||||
CLAY(CLAY_BORDER_OUTSIDE_RADIUS(1, (CLAY__INIT(Clay_Color){217,91,67,255}), 4),
|
CLAY(CLAY_BORDER_OUTSIDE_RADIUS(1, (CLAY__INIT(Clay_Color){217,91,67,255}), 4),
|
||||||
CLAY_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} }),
|
CLAY_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} }),
|
||||||
@ -3248,18 +3263,18 @@ void Clay__RenderDebugView(void) {
|
|||||||
CLAY_TEXT(CLAY_STRING("x"), CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 }));
|
CLAY_TEXT(CLAY_STRING("x"), CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 }));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({0}), CLAY_SIZING_FIXED(1)} }), CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_3 })) {}
|
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), CLAY_SIZING_FIXED(1)} }), CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_3 })) {}
|
||||||
CLAY(Clay__AttachId(scrollId), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({0}), CLAY_SIZING_GROW({0})} }), CLAY_SCROLL({ .horizontal = true, .vertical = true })) {
|
CLAY(Clay__AttachId(scrollId), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT)} }), CLAY_SCROLL({ .horizontal = true, .vertical = true })) {
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({0}), CLAY_SIZING_GROW({0})}, .layoutDirection = CLAY_TOP_TO_BOTTOM }), CLAY_RECTANGLE({ .color = ((initialElementsLength + initialRootsLength) & 1) == 0 ? CLAY__DEBUGVIEW_COLOR_2 : CLAY__DEBUGVIEW_COLOR_1 })) {
|
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT)}, .layoutDirection = CLAY_TOP_TO_BOTTOM }), CLAY_RECTANGLE({ .color = ((initialElementsLength + initialRootsLength) & 1) == 0 ? CLAY__DEBUGVIEW_COLOR_2 : CLAY__DEBUGVIEW_COLOR_1 })) {
|
||||||
Clay_ElementId panelContentsId = Clay__HashString(CLAY_STRING("Clay__DebugViewPaneOuter"), 0, 0);
|
Clay_ElementId panelContentsId = Clay__HashString(CLAY_STRING("Clay__DebugViewPaneOuter"), 0, 0);
|
||||||
// Element list
|
// Element list
|
||||||
CLAY(Clay__AttachId(panelContentsId), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({0}), CLAY_SIZING_GROW({0})} }), CLAY_FLOATING({ .pointerCaptureMode = CLAY_POINTER_CAPTURE_MODE_PASSTHROUGH })) {
|
CLAY(Clay__AttachId(panelContentsId), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT)} }), CLAY_FLOATING({ .pointerCaptureMode = CLAY_POINTER_CAPTURE_MODE_PASSTHROUGH })) {
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({0}), CLAY_SIZING_GROW({0})}, .padding = {.x = CLAY__DEBUGVIEW_OUTER_PADDING }, .layoutDirection = CLAY_TOP_TO_BOTTOM })) {
|
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT)}, .padding = {.x = CLAY__DEBUGVIEW_OUTER_PADDING }, .layoutDirection = CLAY_TOP_TO_BOTTOM })) {
|
||||||
layoutData = Clay__RenderDebugLayoutElementsList((int32_t)initialRootsLength, highlightedRow);
|
layoutData = Clay__RenderDebugLayoutElementsList((int32_t)initialRootsLength, highlightedRow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
float contentWidth = Clay__GetHashMapItem(panelContentsId.id)->layoutElement->dimensions.width;
|
float contentWidth = Clay__GetHashMapItem(panelContentsId.id)->layoutElement->dimensions.width;
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(contentWidth), {0}}, .layoutDirection = CLAY_TOP_TO_BOTTOM })) {}
|
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(contentWidth), CLAY__DEFAULT_STRUCT}, .layoutDirection = CLAY_TOP_TO_BOTTOM })) {}
|
||||||
for (int32_t i = 0; i < layoutData.rowCount; i++) {
|
for (int32_t i = 0; i < layoutData.rowCount; i++) {
|
||||||
Clay_Color rowColor = (i & 1) == 0 ? CLAY__DEBUGVIEW_COLOR_2 : CLAY__DEBUGVIEW_COLOR_1;
|
Clay_Color rowColor = (i & 1) == 0 ? CLAY__DEBUGVIEW_COLOR_2 : CLAY__DEBUGVIEW_COLOR_1;
|
||||||
if (i == layoutData.selectedElementRowIndex) {
|
if (i == layoutData.selectedElementRowIndex) {
|
||||||
@ -3270,22 +3285,22 @@ void Clay__RenderDebugView(void) {
|
|||||||
rowColor.g *= 1.25f;
|
rowColor.g *= 1.25f;
|
||||||
rowColor.b *= 1.25f;
|
rowColor.b *= 1.25f;
|
||||||
}
|
}
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({0}), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .layoutDirection = CLAY_TOP_TO_BOTTOM }), CLAY_RECTANGLE({ .color = rowColor })) {}
|
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .layoutDirection = CLAY_TOP_TO_BOTTOM }), CLAY_RECTANGLE({ .color = rowColor })) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = {.width = CLAY_SIZING_GROW({0}), .height = CLAY_SIZING_FIXED(1)} }), CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_3 })) {}
|
CLAY(CLAY_LAYOUT({ .sizing = {.width = CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), .height = CLAY_SIZING_FIXED(1)} }), CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_3 })) {}
|
||||||
if (Clay__debugSelectedElementId != 0) {
|
if (Clay__debugSelectedElementId != 0) {
|
||||||
Clay_LayoutElementHashMapItem *selectedItem = Clay__GetHashMapItem(Clay__debugSelectedElementId);
|
Clay_LayoutElementHashMapItem *selectedItem = Clay__GetHashMapItem(Clay__debugSelectedElementId);
|
||||||
CLAY(
|
CLAY(
|
||||||
CLAY_SCROLL({ .vertical = true }),
|
CLAY_SCROLL({ .vertical = true }),
|
||||||
CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({0}), CLAY_SIZING_FIXED(300)}, .layoutDirection = CLAY_TOP_TO_BOTTOM }),
|
CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), CLAY_SIZING_FIXED(300)}, .layoutDirection = CLAY_TOP_TO_BOTTOM }),
|
||||||
CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_2 }),
|
CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_2 }),
|
||||||
CLAY_BORDER({ .betweenChildren = { .width = 1, .color = CLAY__DEBUGVIEW_COLOR_3 }})
|
CLAY_BORDER({ .betweenChildren = { .width = 1, .color = CLAY__DEBUGVIEW_COLOR_3 }})
|
||||||
) {
|
) {
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({0}), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT + 8)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 0}, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} })) {
|
CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT + 8)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 0}, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} })) {
|
||||||
CLAY_TEXT(CLAY_STRING("Layout Config"), infoTextConfig);
|
CLAY_TEXT(CLAY_STRING("Layout Config"), infoTextConfig);
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({0}), {0} } })) {}
|
CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), CLAY__DEFAULT_STRUCT } })) {}
|
||||||
if (selectedItem->elementId.stringId.length != 0) {
|
if (selectedItem->elementId.stringId.length != 0) {
|
||||||
CLAY_TEXT(selectedItem->elementId.stringId, infoTitleConfig);
|
CLAY_TEXT(selectedItem->elementId.stringId, infoTitleConfig);
|
||||||
if (selectedItem->elementId.offset != 0) {
|
if (selectedItem->elementId.offset != 0) {
|
||||||
@ -3299,7 +3314,7 @@ void Clay__RenderDebugView(void) {
|
|||||||
CLAY(CLAY_LAYOUT({ .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM })) {
|
CLAY(CLAY_LAYOUT({ .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM })) {
|
||||||
// .boundingBox
|
// .boundingBox
|
||||||
CLAY_TEXT(CLAY_STRING("Bounding Box"), infoTitleConfig);
|
CLAY_TEXT(CLAY_STRING("Bounding Box"), infoTitleConfig);
|
||||||
CLAY(CLAY_LAYOUT({0})) {
|
CLAY(CLAY_LAYOUT(CLAY__DEFAULT_STRUCT)) {
|
||||||
CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig);
|
CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig);
|
||||||
CLAY_TEXT(Clay__IntToString(selectedItem->boundingBox.x), infoTextConfig);
|
CLAY_TEXT(Clay__IntToString(selectedItem->boundingBox.x), infoTextConfig);
|
||||||
CLAY_TEXT(CLAY_STRING(", y: "), infoTextConfig);
|
CLAY_TEXT(CLAY_STRING(", y: "), infoTextConfig);
|
||||||
@ -3316,11 +3331,11 @@ void Clay__RenderDebugView(void) {
|
|||||||
CLAY_TEXT(layoutConfig->layoutDirection == CLAY_TOP_TO_BOTTOM ? CLAY_STRING("TOP_TO_BOTTOM") : CLAY_STRING("LEFT_TO_RIGHT"), infoTextConfig);
|
CLAY_TEXT(layoutConfig->layoutDirection == CLAY_TOP_TO_BOTTOM ? CLAY_STRING("TOP_TO_BOTTOM") : CLAY_STRING("LEFT_TO_RIGHT"), infoTextConfig);
|
||||||
// .sizing
|
// .sizing
|
||||||
CLAY_TEXT(CLAY_STRING("Sizing"), infoTitleConfig);
|
CLAY_TEXT(CLAY_STRING("Sizing"), infoTitleConfig);
|
||||||
CLAY(CLAY_LAYOUT({0})) {
|
CLAY(CLAY_LAYOUT(CLAY__DEFAULT_STRUCT)) {
|
||||||
CLAY_TEXT(CLAY_STRING("width: "), infoTextConfig);
|
CLAY_TEXT(CLAY_STRING("width: "), infoTextConfig);
|
||||||
Clay__RenderDebugLayoutSizing(layoutConfig->sizing.width, infoTextConfig);
|
Clay__RenderDebugLayoutSizing(layoutConfig->sizing.width, infoTextConfig);
|
||||||
}
|
}
|
||||||
CLAY(CLAY_LAYOUT({0})) {
|
CLAY(CLAY_LAYOUT(CLAY__DEFAULT_STRUCT)) {
|
||||||
CLAY_TEXT(CLAY_STRING("height: "), infoTextConfig);
|
CLAY_TEXT(CLAY_STRING("height: "), infoTextConfig);
|
||||||
Clay__RenderDebugLayoutSizing(layoutConfig->sizing.height, infoTextConfig);
|
Clay__RenderDebugLayoutSizing(layoutConfig->sizing.height, infoTextConfig);
|
||||||
}
|
}
|
||||||
@ -3338,7 +3353,7 @@ void Clay__RenderDebugView(void) {
|
|||||||
CLAY_TEXT(Clay__IntToString(layoutConfig->childGap), infoTextConfig);
|
CLAY_TEXT(Clay__IntToString(layoutConfig->childGap), infoTextConfig);
|
||||||
// .childAlignment
|
// .childAlignment
|
||||||
CLAY_TEXT(CLAY_STRING("Child Alignment"), infoTitleConfig);
|
CLAY_TEXT(CLAY_STRING("Child Alignment"), infoTitleConfig);
|
||||||
CLAY(CLAY_LAYOUT({0})) {
|
CLAY(CLAY_LAYOUT(CLAY__DEFAULT_STRUCT)) {
|
||||||
CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig);
|
CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig);
|
||||||
Clay_String alignX = CLAY_STRING("LEFT");
|
Clay_String alignX = CLAY_STRING("LEFT");
|
||||||
if (layoutConfig->childAlignment.x == CLAY_ALIGN_X_CENTER) {
|
if (layoutConfig->childAlignment.x == CLAY_ALIGN_X_CENTER) {
|
||||||
@ -3418,7 +3433,7 @@ void Clay__RenderDebugView(void) {
|
|||||||
}
|
}
|
||||||
// Image Preview
|
// Image Preview
|
||||||
CLAY_TEXT(CLAY_STRING("Preview"), infoTitleConfig);
|
CLAY_TEXT(CLAY_STRING("Preview"), infoTitleConfig);
|
||||||
CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = imageConfig->sourceDimensions.width }), {0} }}), Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .imageElementConfig = imageConfig }, CLAY__ELEMENT_CONFIG_TYPE_IMAGE)) {}
|
CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = imageConfig->sourceDimensions.width }), CLAY__DEFAULT_STRUCT }}), Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .imageElementConfig = imageConfig }, CLAY__ELEMENT_CONFIG_TYPE_IMAGE)) {}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3439,7 +3454,7 @@ void Clay__RenderDebugView(void) {
|
|||||||
CLAY(CLAY_LAYOUT({ .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM })) {
|
CLAY(CLAY_LAYOUT({ .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM })) {
|
||||||
// .offset
|
// .offset
|
||||||
CLAY_TEXT(CLAY_STRING("Offset"), infoTitleConfig);
|
CLAY_TEXT(CLAY_STRING("Offset"), infoTitleConfig);
|
||||||
CLAY(CLAY_LAYOUT({0})) {
|
CLAY(CLAY_LAYOUT(CLAY__DEFAULT_STRUCT)) {
|
||||||
CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig);
|
CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig);
|
||||||
CLAY_TEXT(Clay__IntToString(floatingConfig->offset.x), infoTextConfig);
|
CLAY_TEXT(Clay__IntToString(floatingConfig->offset.x), infoTextConfig);
|
||||||
CLAY_TEXT(CLAY_STRING(", y: "), infoTextConfig);
|
CLAY_TEXT(CLAY_STRING(", y: "), infoTextConfig);
|
||||||
@ -3448,7 +3463,7 @@ void Clay__RenderDebugView(void) {
|
|||||||
}
|
}
|
||||||
// .expand
|
// .expand
|
||||||
CLAY_TEXT(CLAY_STRING("Expand"), infoTitleConfig);
|
CLAY_TEXT(CLAY_STRING("Expand"), infoTitleConfig);
|
||||||
CLAY(CLAY_LAYOUT({0})) {
|
CLAY(CLAY_LAYOUT(CLAY__DEFAULT_STRUCT)) {
|
||||||
CLAY_TEXT(CLAY_STRING("{ width: "), infoTextConfig);
|
CLAY_TEXT(CLAY_STRING("{ width: "), infoTextConfig);
|
||||||
CLAY_TEXT(Clay__IntToString(floatingConfig->expand.width), infoTextConfig);
|
CLAY_TEXT(Clay__IntToString(floatingConfig->expand.width), infoTextConfig);
|
||||||
CLAY_TEXT(CLAY_STRING(", height: "), infoTextConfig);
|
CLAY_TEXT(CLAY_STRING(", height: "), infoTextConfig);
|
||||||
@ -3495,12 +3510,12 @@ void Clay__RenderDebugView(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
CLAY(CLAY_ID("Clay__DebugViewWarningsScrollPane"), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({0}), CLAY_SIZING_FIXED(300)}, .childGap = 6, .layoutDirection = CLAY_TOP_TO_BOTTOM }), CLAY_SCROLL({ .horizontal = true, .vertical = true }), CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_2 })) {
|
CLAY(CLAY_ID("Clay__DebugViewWarningsScrollPane"), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), CLAY_SIZING_FIXED(300)}, .childGap = 6, .layoutDirection = CLAY_TOP_TO_BOTTOM }), CLAY_SCROLL({ .horizontal = true, .vertical = true }), CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_2 })) {
|
||||||
Clay_TextElementConfig *warningConfig = CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE });
|
Clay_TextElementConfig *warningConfig = CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE });
|
||||||
CLAY(CLAY_ID("Clay__DebugViewWarningItemHeader"), CLAY_LAYOUT({ .sizing = {.height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 0}, .childGap = 8, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} })) {
|
CLAY(CLAY_ID("Clay__DebugViewWarningItemHeader"), CLAY_LAYOUT({ .sizing = {.height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 0}, .childGap = 8, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} })) {
|
||||||
CLAY_TEXT(CLAY_STRING("Warnings"), warningConfig);
|
CLAY_TEXT(CLAY_STRING("Warnings"), warningConfig);
|
||||||
}
|
}
|
||||||
CLAY(CLAY_ID("Clay__DebugViewWarningsTopBorder"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW({0}), .height = CLAY_SIZING_FIXED(1)} }), CLAY_RECTANGLE({ .color = {200, 200, 200, 255} })) {}
|
CLAY(CLAY_ID("Clay__DebugViewWarningsTopBorder"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(CLAY__DEFAULT_STRUCT), .height = CLAY_SIZING_FIXED(1)} }), CLAY_RECTANGLE({ .color = {200, 200, 200, 255} })) {}
|
||||||
int32_t previousWarningsLength = (int)Clay_warnings.length;
|
int32_t previousWarningsLength = (int)Clay_warnings.length;
|
||||||
for (int32_t i = 0; i < previousWarningsLength; i++) {
|
for (int32_t i = 0; i < previousWarningsLength; i++) {
|
||||||
Clay__Warning warning = Clay_warnings.internalArray[i];
|
Clay__Warning warning = Clay_warnings.internalArray[i];
|
||||||
@ -3711,7 +3726,7 @@ void Clay_UpdateScrollContainers(bool enableDragScrolling, Clay_Vector2 scrollDe
|
|||||||
}
|
}
|
||||||
// Handle click / touch scroll
|
// Handle click / touch scroll
|
||||||
if (isPointerActive) {
|
if (isPointerActive) {
|
||||||
highestPriorityScrollData->scrollMomentum = CLAY__INIT(Clay_Vector2){0};
|
highestPriorityScrollData->scrollMomentum = CLAY__INIT(Clay_Vector2)CLAY__DEFAULT_STRUCT;
|
||||||
if (!highestPriorityScrollData->pointerScrollActive) {
|
if (!highestPriorityScrollData->pointerScrollActive) {
|
||||||
highestPriorityScrollData->pointerOrigin = Clay__pointerInfo.position;
|
highestPriorityScrollData->pointerOrigin = Clay__pointerInfo.position;
|
||||||
highestPriorityScrollData->scrollOrigin = highestPriorityScrollData->scrollPosition;
|
highestPriorityScrollData->scrollOrigin = highestPriorityScrollData->scrollPosition;
|
||||||
@ -3852,7 +3867,7 @@ Clay_ScrollContainerData Clay_GetScrollContainerData(Clay_ElementId id) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return CLAY__INIT(Clay_ScrollContainerData) {0};
|
return CLAY__INIT(Clay_ScrollContainerData) CLAY__DEFAULT_STRUCT;
|
||||||
}
|
}
|
||||||
|
|
||||||
CLAY_WASM_EXPORT("Clay_SetDebugModeEnabled")
|
CLAY_WASM_EXPORT("Clay_SetDebugModeEnabled")
|
||||||
|
BIN
examples/clay-official-website/build/clay/images/check_1.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
examples/clay-official-website/build/clay/images/check_2.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
examples/clay-official-website/build/clay/images/check_3.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
examples/clay-official-website/build/clay/images/check_4.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
examples/clay-official-website/build/clay/images/check_5.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
examples/clay-official-website/build/clay/images/debugger.png
Normal file
After Width: | Height: | Size: 296 KiB |
BIN
examples/clay-official-website/build/clay/images/declarative.png
Normal file
After Width: | Height: | Size: 193 KiB |
BIN
examples/clay-official-website/build/clay/images/renderer.png
Normal file
After Width: | Height: | Size: 310 KiB |
789
examples/clay-official-website/build/clay/index.html
Normal file
@ -0,0 +1,789 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<link rel="preload" href="/clay/fonts/Calistoga-Regular.ttf" as="font" type="font/ttf" crossorigin>
|
||||||
|
<link rel="preload" href="/clay/fonts/Quicksand-Semibold.ttf" as="font" type="font/ttf" crossorigin>
|
||||||
|
<title>Clay - UI Layout Library</title>
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
background: rgb(244, 235, 230);
|
||||||
|
}
|
||||||
|
/* Import the font using @font-face */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Calistoga';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: url('/clay/fonts/Calistoga-Regular.ttf') format('truetype');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Quicksand';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: url('/clay/fonts/Quicksand-Semibold.ttf') format('truetype');
|
||||||
|
}
|
||||||
|
|
||||||
|
body > canvas {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
touch-action: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div, a, img {
|
||||||
|
position: absolute;
|
||||||
|
box-sizing: border-box;
|
||||||
|
-webkit-backface-visibility: hidden;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
cursor: pointer;
|
||||||
|
pointer-events: all;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
pointer-events: all;
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO special exception for text selection in debug tools */
|
||||||
|
[id='2067877626'] > * {
|
||||||
|
pointer-events: none !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<script type="module">
|
||||||
|
const CLAY_RENDER_COMMAND_TYPE_NONE = 0;
|
||||||
|
const CLAY_RENDER_COMMAND_TYPE_RECTANGLE = 1;
|
||||||
|
const CLAY_RENDER_COMMAND_TYPE_BORDER = 2;
|
||||||
|
const CLAY_RENDER_COMMAND_TYPE_TEXT = 3;
|
||||||
|
const CLAY_RENDER_COMMAND_TYPE_IMAGE = 4;
|
||||||
|
const CLAY_RENDER_COMMAND_TYPE_SCISSOR_START = 5;
|
||||||
|
const CLAY_RENDER_COMMAND_TYPE_SCISSOR_END = 6;
|
||||||
|
const CLAY_RENDER_COMMAND_TYPE_CUSTOM = 7;
|
||||||
|
const GLOBAL_FONT_SCALING_FACTOR = 0.8;
|
||||||
|
let renderCommandSize = 0;
|
||||||
|
let scratchSpaceAddress = 8;
|
||||||
|
let heapSpaceAddress = 0;
|
||||||
|
let memoryDataView;
|
||||||
|
let textDecoder = new TextDecoder("utf-8");
|
||||||
|
let previousFrameTime;
|
||||||
|
let fontsById = [
|
||||||
|
'Quicksand',
|
||||||
|
'Calistoga',
|
||||||
|
'Quicksand',
|
||||||
|
'Quicksand',
|
||||||
|
'Quicksand',
|
||||||
|
];
|
||||||
|
let elementCache = {};
|
||||||
|
let imageCache = {};
|
||||||
|
let colorDefinition = { type: 'struct', members: [
|
||||||
|
{name: 'r', type: 'float' },
|
||||||
|
{name: 'g', type: 'float' },
|
||||||
|
{name: 'b', type: 'float' },
|
||||||
|
{name: 'a', type: 'float' },
|
||||||
|
]};
|
||||||
|
let stringDefinition = { type: 'struct', members: [
|
||||||
|
{name: 'length', type: 'uint32_t' },
|
||||||
|
{name: 'chars', type: 'uint32_t' },
|
||||||
|
]};
|
||||||
|
let borderDefinition = { type: 'struct', members: [
|
||||||
|
{name: 'width', type: 'uint32_t'},
|
||||||
|
{name: 'color', ...colorDefinition},
|
||||||
|
]};
|
||||||
|
let cornerRadiusDefinition = { type: 'struct', members: [
|
||||||
|
{name: 'topLeft', type: 'float'},
|
||||||
|
{name: 'topRight', type: 'float'},
|
||||||
|
{name: 'bottomLeft', type: 'float'},
|
||||||
|
{name: 'bottomRight', type: 'float'},
|
||||||
|
]};
|
||||||
|
let rectangleConfigDefinition = { name: 'rectangle', type: 'struct', members: [
|
||||||
|
{ name: 'color', ...colorDefinition },
|
||||||
|
{ name: 'cornerRadius', ...cornerRadiusDefinition },
|
||||||
|
{ name: 'link', ...stringDefinition },
|
||||||
|
{ name: 'cursorPointer', type: 'uint8_t' },
|
||||||
|
]};
|
||||||
|
let borderConfigDefinition = { name: 'text', type: 'struct', members: [
|
||||||
|
{ name: 'left', ...borderDefinition },
|
||||||
|
{ name: 'right', ...borderDefinition },
|
||||||
|
{ name: 'top', ...borderDefinition },
|
||||||
|
{ name: 'bottom', ...borderDefinition },
|
||||||
|
{ name: 'betweenChildren', ...borderDefinition },
|
||||||
|
{ name: 'cornerRadius', ...cornerRadiusDefinition }
|
||||||
|
]};
|
||||||
|
let textConfigDefinition = { name: 'text', type: 'struct', members: [
|
||||||
|
{ name: 'textColor', ...colorDefinition },
|
||||||
|
{ name: 'fontId', type: 'uint16_t' },
|
||||||
|
{ name: 'fontSize', type: 'uint16_t' },
|
||||||
|
{ name: 'letterSpacing', type: 'uint16_t' },
|
||||||
|
{ name: 'lineSpacing', type: 'uint16_t' },
|
||||||
|
{ name: 'wrapMode', type: 'uint32_t' },
|
||||||
|
{ name: 'disablePointerEvents', type: 'uint8_t' }
|
||||||
|
]};
|
||||||
|
let scrollConfigDefinition = { name: 'text', type: 'struct', members: [
|
||||||
|
{ name: 'horizontal', type: 'bool' },
|
||||||
|
{ name: 'vertical', type: 'bool' },
|
||||||
|
]};
|
||||||
|
let imageConfigDefinition = { name: 'image', type: 'struct', members: [
|
||||||
|
{ name: 'imageData', type: 'uint32_t' },
|
||||||
|
{ name: 'sourceDimensions', type: 'struct', members: [
|
||||||
|
{ name: 'width', type: 'float' },
|
||||||
|
{ name: 'height', type: 'float' },
|
||||||
|
]},
|
||||||
|
{ name: 'sourceURL', ...stringDefinition }
|
||||||
|
]};
|
||||||
|
let customConfigDefinition = { name: 'custom', type: 'struct', members: [
|
||||||
|
{ name: 'customData', type: 'uint32_t' },
|
||||||
|
]}
|
||||||
|
let renderCommandDefinition = {
|
||||||
|
name: 'CLay_RenderCommand',
|
||||||
|
type: 'struct',
|
||||||
|
members: [
|
||||||
|
{ name: 'boundingBox', type: 'struct', members: [
|
||||||
|
{ name: 'x', type: 'float' },
|
||||||
|
{ name: 'y', type: 'float' },
|
||||||
|
{ name: 'width', type: 'float' },
|
||||||
|
{ name: 'height', type: 'float' },
|
||||||
|
]},
|
||||||
|
{ name: 'config', type: 'uint32_t'},
|
||||||
|
{ name: 'text', ...stringDefinition },
|
||||||
|
{ name: 'id', type: 'uint32_t' },
|
||||||
|
{ name: 'commandType', type: 'uint32_t', },
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
function getStructTotalSize(definition) {
|
||||||
|
switch(definition.type) {
|
||||||
|
case 'union':
|
||||||
|
case 'struct': {
|
||||||
|
let totalSize = 0;
|
||||||
|
for (const member of definition.members) {
|
||||||
|
let result = getStructTotalSize(member);
|
||||||
|
if (definition.type === 'struct') {
|
||||||
|
totalSize += result;
|
||||||
|
} else {
|
||||||
|
totalSize = Math.max(totalSize, result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return totalSize;
|
||||||
|
}
|
||||||
|
case 'float': return 4;
|
||||||
|
case 'uint32_t': return 4;
|
||||||
|
case 'int32_t': return 4;
|
||||||
|
case 'uint16_t': return 2;
|
||||||
|
case 'uint8_t': return 1;
|
||||||
|
case 'bool': return 1;
|
||||||
|
default: {
|
||||||
|
throw "Unimplemented C data type " + definition.type
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function readStructAtAddress(address, definition) {
|
||||||
|
switch(definition.type) {
|
||||||
|
case 'union':
|
||||||
|
case 'struct': {
|
||||||
|
let struct = { __size: 0 };
|
||||||
|
for (const member of definition.members) {
|
||||||
|
let result = readStructAtAddress(address, member);
|
||||||
|
struct[member.name] = result;
|
||||||
|
if (definition.type === 'struct') {
|
||||||
|
struct.__size += result.__size;
|
||||||
|
address += result.__size;
|
||||||
|
} else {
|
||||||
|
struct.__size = Math.max(struct.__size, result.__size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return struct;
|
||||||
|
}
|
||||||
|
case 'float': return { value: memoryDataView.getFloat32(address, true), __size: 4 };
|
||||||
|
case 'uint32_t': return { value: memoryDataView.getUint32(address, true), __size: 4 };
|
||||||
|
case 'int32_t': return { value: memoryDataView.getUint32(address, true), __size: 4 };
|
||||||
|
case 'uint16_t': return { value: memoryDataView.getUint16(address, true), __size: 2 };
|
||||||
|
case 'uint8_t': return { value: memoryDataView.getUint8(address, true), __size: 1 };
|
||||||
|
case 'bool': return { value: memoryDataView.getUint8(address, true), __size: 1 };
|
||||||
|
default: {
|
||||||
|
throw "Unimplemented C data type " + definition.type
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTextDimensions(text, font) {
|
||||||
|
// re-use canvas object for better performance
|
||||||
|
window.canvasContext.font = font;
|
||||||
|
let metrics = window.canvasContext.measureText(text);
|
||||||
|
return { width: metrics.width, height: metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent };
|
||||||
|
}
|
||||||
|
|
||||||
|
function createMainArena(arenaStructAddress, arenaMemoryAddress) {
|
||||||
|
let memorySize = instance.exports.Clay_MinMemorySize();
|
||||||
|
// Last arg is address to store return value
|
||||||
|
instance.exports.Clay_CreateArenaWithCapacityAndMemory(arenaStructAddress, memorySize, arenaMemoryAddress);
|
||||||
|
}
|
||||||
|
async function init() {
|
||||||
|
await Promise.all(fontsById.map(f => document.fonts.load(`12px "${f}"`)));
|
||||||
|
window.htmlRoot = document.body.appendChild(document.createElement('div'));
|
||||||
|
window.canvasRoot = document.body.appendChild(document.createElement('canvas'));
|
||||||
|
window.canvasContext = window.canvasRoot.getContext("2d");
|
||||||
|
window.mousePositionXThisFrame = 0;
|
||||||
|
window.mousePositionYThisFrame = 0;
|
||||||
|
window.mouseWheelXThisFrame = 0;
|
||||||
|
window.mouseWheelYThisFrame = 0;
|
||||||
|
window.touchDown = false;
|
||||||
|
window.arrowKeyDownPressedThisFrame = false;
|
||||||
|
window.arrowKeyUpPressedThisFrame = false;
|
||||||
|
let zeroTimeout = null;
|
||||||
|
document.addEventListener("wheel", (event) => {
|
||||||
|
window.mouseWheelXThisFrame = event.deltaX * -0.1;
|
||||||
|
window.mouseWheelYThisFrame = event.deltaY * -0.1;
|
||||||
|
clearTimeout(zeroTimeout);
|
||||||
|
zeroTimeout = setTimeout(() => {
|
||||||
|
window.mouseWheelXThisFrame = 0;
|
||||||
|
window.mouseWheelYThisFrame = 0;
|
||||||
|
}, 10);
|
||||||
|
});
|
||||||
|
|
||||||
|
function handleTouch (event) {
|
||||||
|
if (event.touches.length === 1) {
|
||||||
|
window.touchDown = true;
|
||||||
|
let target = event.target;
|
||||||
|
let scrollTop = 0;
|
||||||
|
let scrollLeft = 0;
|
||||||
|
let activeRendererIndex = memoryDataView.getUint32(instance.exports.ACTIVE_RENDERER_INDEX.value, true);
|
||||||
|
while (activeRendererIndex !== 1 && target) {
|
||||||
|
scrollLeft += target.scrollLeft;
|
||||||
|
scrollTop += target.scrollTop;
|
||||||
|
target = target.parentElement;
|
||||||
|
}
|
||||||
|
window.mousePositionXThisFrame = event.changedTouches[0].pageX + scrollLeft;
|
||||||
|
window.mousePositionYThisFrame = event.changedTouches[0].pageY + scrollTop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener("touchstart", handleTouch);
|
||||||
|
document.addEventListener("touchmove", handleTouch);
|
||||||
|
document.addEventListener("touchend", () => {
|
||||||
|
window.touchDown = false;
|
||||||
|
window.mousePositionXThisFrame = 0;
|
||||||
|
window.mousePositionYThisFrame = 0;
|
||||||
|
})
|
||||||
|
|
||||||
|
document.addEventListener("mousemove", (event) => {
|
||||||
|
let target = event.target;
|
||||||
|
let scrollTop = 0;
|
||||||
|
let scrollLeft = 0;
|
||||||
|
let activeRendererIndex = memoryDataView.getUint32(instance.exports.ACTIVE_RENDERER_INDEX.value, true);
|
||||||
|
while (activeRendererIndex !== 1 && target) {
|
||||||
|
scrollLeft += target.scrollLeft;
|
||||||
|
scrollTop += target.scrollTop;
|
||||||
|
target = target.parentElement;
|
||||||
|
}
|
||||||
|
window.mousePositionXThisFrame = event.x + scrollLeft;
|
||||||
|
window.mousePositionYThisFrame = event.y + scrollTop;
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener("mousedown", (event) => {
|
||||||
|
window.mouseDown = true;
|
||||||
|
window.mouseDownThisFrame = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener("mouseup", (event) => {
|
||||||
|
window.mouseDown = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener("keydown", (event) => {
|
||||||
|
if (event.key === "ArrowDown") {
|
||||||
|
window.arrowKeyDownPressedThisFrame = true;
|
||||||
|
}
|
||||||
|
if (event.key === "ArrowUp") {
|
||||||
|
window.arrowKeyUpPressedThisFrame = true;
|
||||||
|
}
|
||||||
|
if (event.key === "d") {
|
||||||
|
window.dKeyPressedThisFrame = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const importObject = {
|
||||||
|
clay: {
|
||||||
|
measureTextFunction: (addressOfDimensions, textToMeasure, addressOfConfig) => {
|
||||||
|
let stringLength = memoryDataView.getUint32(textToMeasure, true);
|
||||||
|
let pointerToString = memoryDataView.getUint32(textToMeasure + 4, true);
|
||||||
|
let textConfig = readStructAtAddress(addressOfConfig, textConfigDefinition);
|
||||||
|
let textDecoder = new TextDecoder("utf-8");
|
||||||
|
let text = textDecoder.decode(memoryDataView.buffer.slice(pointerToString, pointerToString + stringLength));
|
||||||
|
let sourceDimensions = getTextDimensions(text, `${Math.round(textConfig.fontSize.value * GLOBAL_FONT_SCALING_FACTOR)}px ${fontsById[textConfig.fontId.value]}`);
|
||||||
|
memoryDataView.setFloat32(addressOfDimensions, sourceDimensions.width, true);
|
||||||
|
memoryDataView.setFloat32(addressOfDimensions + 4, sourceDimensions.height, true);
|
||||||
|
},
|
||||||
|
queryScrollOffsetFunction: (addressOfOffset, elementId) => {
|
||||||
|
let container = document.getElementById(elementId.toString());
|
||||||
|
if (container) {
|
||||||
|
memoryDataView.setFloat32(addressOfOffset, -container.scrollLeft, true);
|
||||||
|
memoryDataView.setFloat32(addressOfOffset + 4, -container.scrollTop, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const { instance } = await WebAssembly.instantiateStreaming(
|
||||||
|
fetch("/clay/index.wasm"), importObject
|
||||||
|
);
|
||||||
|
memoryDataView = new DataView(new Uint8Array(instance.exports.memory.buffer).buffer);
|
||||||
|
scratchSpaceAddress = instance.exports.__heap_base.value;
|
||||||
|
heapSpaceAddress = instance.exports.__heap_base.value + 1024;
|
||||||
|
let arenaAddress = scratchSpaceAddress + 8;
|
||||||
|
window.instance = instance;
|
||||||
|
createMainArena(arenaAddress, heapSpaceAddress);
|
||||||
|
memoryDataView.setFloat32(instance.exports.__heap_base.value, window.innerWidth, true);
|
||||||
|
memoryDataView.setFloat32(instance.exports.__heap_base.value + 4, window.innerHeight, true);
|
||||||
|
instance.exports.Clay_Initialize(arenaAddress, instance.exports.__heap_base.value);
|
||||||
|
renderCommandSize = getStructTotalSize(renderCommandDefinition);
|
||||||
|
renderLoop();
|
||||||
|
}
|
||||||
|
|
||||||
|
function MemoryIsDifferent(one, two, length) {
|
||||||
|
for (let i = 0; i < length; i++) {
|
||||||
|
if (one[i] !== two[i]) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderLoopHTML() {
|
||||||
|
let capacity = memoryDataView.getInt32(scratchSpaceAddress, true);
|
||||||
|
let length = memoryDataView.getInt32(scratchSpaceAddress + 4, true);
|
||||||
|
let arrayOffset = memoryDataView.getUint32(scratchSpaceAddress + 8, true);
|
||||||
|
let scissorStack = [{ nextAllocation: { x: 0, y: 0 }, element: htmlRoot, nextElementIndex: 0 }];
|
||||||
|
let previousId = 0;
|
||||||
|
for (let i = 0; i < length; i++, arrayOffset += renderCommandSize) {
|
||||||
|
let entireRenderCommandMemory = new Uint32Array(memoryDataView.buffer.slice(arrayOffset, arrayOffset + renderCommandSize));
|
||||||
|
let renderCommand = readStructAtAddress(arrayOffset, renderCommandDefinition);
|
||||||
|
let parentElement = scissorStack[scissorStack.length - 1];
|
||||||
|
let element = null;
|
||||||
|
let isMultiConfigElement = previousId === renderCommand.id.value;
|
||||||
|
if (!elementCache[renderCommand.id.value]) {
|
||||||
|
let elementType = 'div';
|
||||||
|
switch (renderCommand.commandType.value) {
|
||||||
|
case CLAY_RENDER_COMMAND_TYPE_RECTANGLE: {
|
||||||
|
if (readStructAtAddress(renderCommand.config.value, rectangleConfigDefinition).link.length.value > 0) {
|
||||||
|
elementType = 'a';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CLAY_RENDER_COMMAND_TYPE_IMAGE: {
|
||||||
|
elementType = 'img'; break;
|
||||||
|
}
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
element = document.createElement(elementType);
|
||||||
|
element.id = renderCommand.id.value;
|
||||||
|
if (renderCommand.commandType.value === CLAY_RENDER_COMMAND_TYPE_SCISSOR_START) {
|
||||||
|
element.style.overflow = 'hidden';
|
||||||
|
}
|
||||||
|
elementCache[renderCommand.id.value] = {
|
||||||
|
exists: true,
|
||||||
|
element: element,
|
||||||
|
previousMemoryCommand: new Uint8Array(0),
|
||||||
|
previousMemoryConfig: new Uint8Array(0),
|
||||||
|
previousMemoryText: new Uint8Array(0)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
let elementData = elementCache[renderCommand.id.value];
|
||||||
|
element = elementData.element;
|
||||||
|
if (!isMultiConfigElement && Array.prototype.indexOf.call(parentElement.element.children, element) !== parentElement.nextElementIndex) {
|
||||||
|
if (parentElement.nextElementIndex === 0) {
|
||||||
|
parentElement.element.insertAdjacentElement('afterbegin', element);
|
||||||
|
} else {
|
||||||
|
parentElement.element.childNodes[Math.min(parentElement.nextElementIndex - 1, parentElement.element.childNodes.length - 1)].insertAdjacentElement('afterend', element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
elementData.exists = true;
|
||||||
|
// Don't get me started. Cheaper to compare the render command memory than to update HTML elements
|
||||||
|
let dirty = MemoryIsDifferent(elementData.previousMemoryCommand, entireRenderCommandMemory, renderCommandSize) && !isMultiConfigElement;
|
||||||
|
if (!isMultiConfigElement) {
|
||||||
|
parentElement.nextElementIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
previousId = renderCommand.id.value;
|
||||||
|
|
||||||
|
elementData.previousMemoryCommand = entireRenderCommandMemory;
|
||||||
|
let offsetX = scissorStack.length > 0 ? scissorStack[scissorStack.length - 1].nextAllocation.x : 0;
|
||||||
|
let offsetY = scissorStack.length > 0 ? scissorStack[scissorStack.length - 1].nextAllocation.y : 0;
|
||||||
|
if (dirty) {
|
||||||
|
element.style.transform = `translate(${Math.round(renderCommand.boundingBox.x.value - offsetX)}px, ${Math.round(renderCommand.boundingBox.y.value - offsetY)}px)`
|
||||||
|
element.style.width = Math.round(renderCommand.boundingBox.width.value) + 'px';
|
||||||
|
element.style.height = Math.round(renderCommand.boundingBox.height.value) + 'px';
|
||||||
|
}
|
||||||
|
|
||||||
|
// note: commandType is packed to uint8_t and has 3 garbage bytes of padding
|
||||||
|
switch(renderCommand.commandType.value & 0xff) {
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_NONE): {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_RECTANGLE): {
|
||||||
|
let config = readStructAtAddress(renderCommand.config.value, rectangleConfigDefinition);
|
||||||
|
let configMemory = new Uint8Array(memoryDataView.buffer.slice(renderCommand.config.value, renderCommand.config.value + config.__size));
|
||||||
|
let linkContents = config.link.length.value > 0 ? textDecoder.decode(new Uint8Array(memoryDataView.buffer.slice(config.link.chars.value, config.link.chars.value + config.link.length.value))) : 0;
|
||||||
|
memoryDataView.setUint32(0, renderCommand.id.value, true);
|
||||||
|
if (linkContents.length > 0 && (window.mouseDownThisFrame || window.touchDown) && instance.exports.Clay_PointerOver(0)) {
|
||||||
|
window.location.href = linkContents;
|
||||||
|
}
|
||||||
|
if (!dirty && !MemoryIsDifferent(configMemory, elementData.previousMemoryConfig, config.__size)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (linkContents.length > 0) {
|
||||||
|
element.href = linkContents;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (linkContents.length > 0 || config.cursorPointer.value) {
|
||||||
|
element.style.pointerEvents = 'all';
|
||||||
|
element.style.cursor = 'pointer';
|
||||||
|
}
|
||||||
|
elementData.previousMemoryConfig = configMemory;
|
||||||
|
let color = config.color;
|
||||||
|
element.style.backgroundColor = `rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`;
|
||||||
|
if (config.cornerRadius.topLeft.value > 0) {
|
||||||
|
element.style.borderTopLeftRadius = config.cornerRadius.topLeft.value + 'px';
|
||||||
|
}
|
||||||
|
if (config.cornerRadius.topRight.value > 0) {
|
||||||
|
element.style.borderTopRightRadius = config.cornerRadius.topRight.value + 'px';
|
||||||
|
}
|
||||||
|
if (config.cornerRadius.bottomLeft.value > 0) {
|
||||||
|
element.style.borderBottomLeftRadius = config.cornerRadius.bottomLeft.value + 'px';
|
||||||
|
}
|
||||||
|
if (config.cornerRadius.bottomRight.value > 0) {
|
||||||
|
element.style.borderBottomRightRadius = config.cornerRadius.bottomRight.value + 'px';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_BORDER): {
|
||||||
|
let config = readStructAtAddress(renderCommand.config.value, borderConfigDefinition);
|
||||||
|
let configMemory = new Uint8Array(memoryDataView.buffer.slice(renderCommand.config.value, renderCommand.config.value + config.__size));
|
||||||
|
if (!dirty && !MemoryIsDifferent(configMemory, elementData.previousMemoryConfig, config.__size)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
elementData.previousMemoryConfig = configMemory;
|
||||||
|
if (config.left.width.value > 0) {
|
||||||
|
let color = config.left.color;
|
||||||
|
element.style.borderLeft = `${config.left.width.value}px solid rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`
|
||||||
|
}
|
||||||
|
if (config.right.width.value > 0) {
|
||||||
|
let color = config.right.color;
|
||||||
|
element.style.borderRight = `${config.right.width.value}px solid rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`
|
||||||
|
}
|
||||||
|
if (config.top.width.value > 0) {
|
||||||
|
let color = config.top.color;
|
||||||
|
element.style.borderTop = `${config.top.width.value}px solid rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`
|
||||||
|
}
|
||||||
|
if (config.bottom.width.value > 0) {
|
||||||
|
let color = config.bottom.color;
|
||||||
|
element.style.borderBottom = `${config.bottom.width.value}px solid rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`
|
||||||
|
}
|
||||||
|
if (config.cornerRadius.topLeft.value > 0) {
|
||||||
|
element.style.borderTopLeftRadius = config.cornerRadius.topLeft.value + 'px';
|
||||||
|
}
|
||||||
|
if (config.cornerRadius.topRight.value > 0) {
|
||||||
|
element.style.borderTopRightRadius = config.cornerRadius.topRight.value + 'px';
|
||||||
|
}
|
||||||
|
if (config.cornerRadius.bottomLeft.value > 0) {
|
||||||
|
element.style.borderBottomLeftRadius = config.cornerRadius.bottomLeft.value + 'px';
|
||||||
|
}
|
||||||
|
if (config.cornerRadius.bottomRight.value > 0) {
|
||||||
|
element.style.borderBottomRightRadius = config.cornerRadius.bottomRight.value + 'px';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_TEXT): {
|
||||||
|
let config = readStructAtAddress(renderCommand.config.value, textConfigDefinition);
|
||||||
|
let configMemory = new Uint8Array(memoryDataView.buffer.slice(renderCommand.config.value, renderCommand.config.value + config.__size));
|
||||||
|
let textContents = renderCommand.text;
|
||||||
|
let stringContents = new Uint8Array(memoryDataView.buffer.slice(textContents.chars.value, textContents.chars.value + textContents.length.value));
|
||||||
|
if (MemoryIsDifferent(configMemory, elementData.previousMemoryConfig, config.__size)) {
|
||||||
|
element.className = 'text';
|
||||||
|
let textColor = config.textColor;
|
||||||
|
let fontSize = Math.round(config.fontSize.value * GLOBAL_FONT_SCALING_FACTOR);
|
||||||
|
element.style.color = `rgba(${textColor.r.value}, ${textColor.g.value}, ${textColor.b.value}, ${textColor.a.value})`;
|
||||||
|
element.style.fontFamily = fontsById[config.fontId.value];
|
||||||
|
element.style.fontSize = fontSize + 'px';
|
||||||
|
element.style.pointerEvents = config.disablePointerEvents.value ? 'none' : 'all';
|
||||||
|
elementData.previousMemoryConfig = configMemory;
|
||||||
|
}
|
||||||
|
if (stringContents.length !== elementData.previousMemoryText.length || MemoryIsDifferent(stringContents, elementData.previousMemoryText, stringContents.length)) {
|
||||||
|
element.innerHTML = textDecoder.decode(stringContents);
|
||||||
|
}
|
||||||
|
elementData.previousMemoryText = stringContents;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_SCISSOR_START): {
|
||||||
|
scissorStack.push({ nextAllocation: { x: renderCommand.boundingBox.x.value, y: renderCommand.boundingBox.y.value }, element, nextElementIndex: 0 });
|
||||||
|
let config = readStructAtAddress(renderCommand.config.value, scrollConfigDefinition);
|
||||||
|
if (config.horizontal.value) {
|
||||||
|
element.style.overflowX = 'scroll';
|
||||||
|
element.style.pointerEvents = 'auto';
|
||||||
|
}
|
||||||
|
if (config.vertical.value) {
|
||||||
|
element.style.overflowY = 'scroll';
|
||||||
|
element.style.pointerEvents = 'auto';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_SCISSOR_END): {
|
||||||
|
scissorStack.splice(scissorStack.length - 1, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_IMAGE): {
|
||||||
|
let config = readStructAtAddress(renderCommand.config.value, imageConfigDefinition);
|
||||||
|
let srcContents = new Uint8Array(memoryDataView.buffer.slice(config.sourceURL.chars.value, config.sourceURL.chars.value + config.sourceURL.length.value));
|
||||||
|
if (srcContents.length !== elementData.previousMemoryText.length || MemoryIsDifferent(srcContents, elementData.previousMemoryText, srcContents.length)) {
|
||||||
|
element.src = textDecoder.decode(srcContents);
|
||||||
|
}
|
||||||
|
elementData.previousMemoryText = srcContents;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_CUSTOM): break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const key of Object.keys(elementCache)) {
|
||||||
|
if (elementCache[key].exists) {
|
||||||
|
elementCache[key].exists = false;
|
||||||
|
} else {
|
||||||
|
elementCache[key].element.remove();
|
||||||
|
delete elementCache[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderLoopCanvas() {
|
||||||
|
// Note: Rendering to canvas needs to be scaled up by window.devicePixelRatio in both width and height.
|
||||||
|
// e.g. if we're working on a device where devicePixelRatio is 2, we need to render
|
||||||
|
// everything at width^2 x height^2 resolution, then scale back down with css to get the correct pixel density.
|
||||||
|
let capacity = memoryDataView.getUint32(scratchSpaceAddress, true);
|
||||||
|
let length = memoryDataView.getUint32(scratchSpaceAddress + 4, true);
|
||||||
|
let arrayOffset = memoryDataView.getUint32(scratchSpaceAddress + 8, true);
|
||||||
|
window.canvasRoot.width = window.innerWidth * window.devicePixelRatio;
|
||||||
|
window.canvasRoot.height = window.innerHeight * window.devicePixelRatio;
|
||||||
|
window.canvasRoot.style.width = window.innerWidth + 'px';
|
||||||
|
window.canvasRoot.style.height = window.innerHeight + 'px';
|
||||||
|
let ctx = window.canvasContext;
|
||||||
|
let scale = window.devicePixelRatio;
|
||||||
|
for (let i = 0; i < length; i++, arrayOffset += renderCommandSize) {
|
||||||
|
let renderCommand = readStructAtAddress(arrayOffset, renderCommandDefinition);
|
||||||
|
let boundingBox = renderCommand.boundingBox;
|
||||||
|
|
||||||
|
// note: commandType is packed to uint8_t and has 3 garbage bytes of padding
|
||||||
|
switch(renderCommand.commandType.value & 0xff) {
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_NONE): {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_RECTANGLE): {
|
||||||
|
let config = readStructAtAddress(renderCommand.config.value, rectangleConfigDefinition);
|
||||||
|
let color = config.color;
|
||||||
|
ctx.beginPath();
|
||||||
|
window.canvasContext.fillStyle = `rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`;
|
||||||
|
window.canvasContext.roundRect(
|
||||||
|
boundingBox.x.value * scale, // x
|
||||||
|
boundingBox.y.value * scale, // y
|
||||||
|
boundingBox.width.value * scale, // width
|
||||||
|
boundingBox.height.value * scale,
|
||||||
|
[config.cornerRadius.topLeft.value * scale, config.cornerRadius.topRight.value * scale, config.cornerRadius.bottomRight.value * scale, config.cornerRadius.bottomLeft.value * scale]) // height;
|
||||||
|
ctx.fill();
|
||||||
|
ctx.closePath();
|
||||||
|
// Handle link clicks
|
||||||
|
let linkContents = config.link.length.value > 0 ? textDecoder.decode(new Uint8Array(memoryDataView.buffer.slice(config.link.chars.value, config.link.chars.value + config.link.length.value))) : 0;
|
||||||
|
memoryDataView.setUint32(0, renderCommand.id.value, true);
|
||||||
|
if (linkContents.length > 0 && (window.mouseDownThisFrame || window.touchDown) && instance.exports.Clay_PointerOver(0)) {
|
||||||
|
window.location.href = linkContents;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_BORDER): {
|
||||||
|
let config = readStructAtAddress(renderCommand.config.value, borderConfigDefinition);
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.moveTo(boundingBox.x.value * scale, boundingBox.y.value * scale);
|
||||||
|
// Top Left Corner
|
||||||
|
if (config.cornerRadius.topLeft.value > 0) {
|
||||||
|
let lineWidth = config.top.width.value;
|
||||||
|
let halfLineWidth = lineWidth / 2;
|
||||||
|
ctx.moveTo((boundingBox.x.value + halfLineWidth) * scale, (boundingBox.y.value + config.cornerRadius.topLeft.value + halfLineWidth) * scale);
|
||||||
|
let color = config.top.color;
|
||||||
|
ctx.lineWidth = lineWidth * scale;
|
||||||
|
ctx.strokeStyle = `rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`;
|
||||||
|
ctx.arcTo((boundingBox.x.value + halfLineWidth) * scale, (boundingBox.y.value + halfLineWidth) * scale, (boundingBox.x.value + config.cornerRadius.topLeft.value + halfLineWidth) * scale, (boundingBox.y.value + halfLineWidth) * scale, config.cornerRadius.topLeft.value * scale);
|
||||||
|
ctx.stroke();
|
||||||
|
}
|
||||||
|
// Top border
|
||||||
|
if (config.top.width.value > 0) {
|
||||||
|
let lineWidth = config.top.width.value;
|
||||||
|
let halfLineWidth = lineWidth / 2;
|
||||||
|
let color = config.top.color;
|
||||||
|
ctx.lineWidth = lineWidth * scale;
|
||||||
|
ctx.strokeStyle = `rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`;
|
||||||
|
ctx.moveTo((boundingBox.x.value + config.cornerRadius.topLeft.value + halfLineWidth) * scale, (boundingBox.y.value + halfLineWidth) * scale);
|
||||||
|
ctx.lineTo((boundingBox.x.value + boundingBox.width.value - config.cornerRadius.topRight.value - halfLineWidth) * scale, (boundingBox.y.value + halfLineWidth) * scale);
|
||||||
|
ctx.stroke();
|
||||||
|
}
|
||||||
|
// Top Right Corner
|
||||||
|
if (config.cornerRadius.topRight.value > 0) {
|
||||||
|
let lineWidth = config.top.width.value;
|
||||||
|
let halfLineWidth = lineWidth / 2;
|
||||||
|
ctx.moveTo((boundingBox.x.value + boundingBox.width.value - config.cornerRadius.topRight.value - halfLineWidth) * scale, (boundingBox.y.value + halfLineWidth) * scale);
|
||||||
|
let color = config.top.color;
|
||||||
|
ctx.lineWidth = lineWidth * scale;
|
||||||
|
ctx.strokeStyle = `rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`;
|
||||||
|
ctx.arcTo((boundingBox.x.value + boundingBox.width.value - halfLineWidth) * scale, (boundingBox.y.value + halfLineWidth) * scale, (boundingBox.x.value + boundingBox.width.value - halfLineWidth) * scale, (boundingBox.y.value + config.cornerRadius.topRight.value + halfLineWidth) * scale, config.cornerRadius.topRight.value * scale);
|
||||||
|
ctx.stroke();
|
||||||
|
}
|
||||||
|
// Right border
|
||||||
|
if (config.right.width.value > 0) {
|
||||||
|
let color = config.right.color;
|
||||||
|
let lineWidth = config.right.width.value;
|
||||||
|
let halfLineWidth = lineWidth / 2;
|
||||||
|
ctx.lineWidth = lineWidth * scale;
|
||||||
|
ctx.strokeStyle = `rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`;
|
||||||
|
ctx.moveTo((boundingBox.x.value + boundingBox.width.value - halfLineWidth) * scale, (boundingBox.y.value + config.cornerRadius.topRight.value + halfLineWidth) * scale);
|
||||||
|
ctx.lineTo((boundingBox.x.value + boundingBox.width.value - halfLineWidth) * scale, (boundingBox.y.value + boundingBox.height.value - config.cornerRadius.topRight.value - halfLineWidth) * scale);
|
||||||
|
ctx.stroke();
|
||||||
|
}
|
||||||
|
// Bottom Right Corner
|
||||||
|
if (config.cornerRadius.bottomRight.value > 0) {
|
||||||
|
let color = config.top.color;
|
||||||
|
let lineWidth = config.top.width.value;
|
||||||
|
let halfLineWidth = lineWidth / 2;
|
||||||
|
ctx.moveTo((boundingBox.x.value + boundingBox.width.value - halfLineWidth) * scale, (boundingBox.y.value + boundingBox.height.value - config.cornerRadius.bottomRight.value - halfLineWidth) * scale);
|
||||||
|
ctx.lineWidth = lineWidth * scale;
|
||||||
|
ctx.strokeStyle = `rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`;
|
||||||
|
ctx.arcTo((boundingBox.x.value + boundingBox.width.value - halfLineWidth) * scale, (boundingBox.y.value + boundingBox.height.value - halfLineWidth) * scale, (boundingBox.x.value + boundingBox.width.value - config.cornerRadius.bottomRight.value - halfLineWidth) * scale, (boundingBox.y.value + boundingBox.height.value - halfLineWidth) * scale, config.cornerRadius.bottomRight.value * scale);
|
||||||
|
ctx.stroke();
|
||||||
|
}
|
||||||
|
// Bottom Border
|
||||||
|
if (config.bottom.width.value > 0) {
|
||||||
|
let color = config.bottom.color;
|
||||||
|
let lineWidth = config.bottom.width.value;
|
||||||
|
let halfLineWidth = lineWidth / 2;
|
||||||
|
ctx.lineWidth = lineWidth * scale;
|
||||||
|
ctx.strokeStyle = `rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`;
|
||||||
|
ctx.moveTo((boundingBox.x.value + config.cornerRadius.bottomLeft.value + halfLineWidth) * scale, (boundingBox.y.value + boundingBox.height.value - halfLineWidth) * scale);
|
||||||
|
ctx.lineTo((boundingBox.x.value + boundingBox.width.value - config.cornerRadius.bottomRight.value - halfLineWidth) * scale, (boundingBox.y.value + boundingBox.height.value - halfLineWidth) * scale);
|
||||||
|
ctx.stroke();
|
||||||
|
}
|
||||||
|
// Bottom Left Corner
|
||||||
|
if (config.cornerRadius.bottomLeft.value > 0) {
|
||||||
|
let color = config.bottom.color;
|
||||||
|
let lineWidth = config.bottom.width.value;
|
||||||
|
let halfLineWidth = lineWidth / 2;
|
||||||
|
ctx.moveTo((boundingBox.x.value + config.cornerRadius.bottomLeft.value + halfLineWidth) * scale, (boundingBox.y.value + boundingBox.height.value - halfLineWidth) * scale);
|
||||||
|
ctx.lineWidth = lineWidth * scale;
|
||||||
|
ctx.strokeStyle = `rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`;
|
||||||
|
ctx.arcTo((boundingBox.x.value + halfLineWidth) * scale, (boundingBox.y.value + boundingBox.height.value - halfLineWidth) * scale, (boundingBox.x.value + halfLineWidth) * scale, (boundingBox.y.value + boundingBox.height.value - config.cornerRadius.bottomLeft.value - halfLineWidth) * scale, config.cornerRadius.bottomLeft.value * scale);
|
||||||
|
ctx.stroke();
|
||||||
|
}
|
||||||
|
// Left Border
|
||||||
|
if (config.left.width.value > 0) {
|
||||||
|
let color = config.left.color;
|
||||||
|
let lineWidth = config.left.width.value;
|
||||||
|
let halfLineWidth = lineWidth / 2;
|
||||||
|
ctx.lineWidth = lineWidth * scale;
|
||||||
|
ctx.strokeStyle = `rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`;
|
||||||
|
ctx.moveTo((boundingBox.x.value + halfLineWidth) * scale, (boundingBox.y.value + boundingBox.height.value - config.cornerRadius.bottomLeft.value - halfLineWidth) * scale);
|
||||||
|
ctx.lineTo((boundingBox.x.value + halfLineWidth) * scale, (boundingBox.y.value + config.cornerRadius.bottomRight.value + halfLineWidth) * scale);
|
||||||
|
ctx.stroke();
|
||||||
|
}
|
||||||
|
ctx.closePath();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_TEXT): {
|
||||||
|
let config = readStructAtAddress(renderCommand.config.value, textConfigDefinition);
|
||||||
|
let textContents = renderCommand.text;
|
||||||
|
let stringContents = new Uint8Array(memoryDataView.buffer.slice(textContents.chars.value, textContents.chars.value + textContents.length.value));
|
||||||
|
let fontSize = config.fontSize.value * GLOBAL_FONT_SCALING_FACTOR * scale;
|
||||||
|
ctx.font = `${fontSize}px ${fontsById[config.fontId.value]}`;
|
||||||
|
let color = config.textColor;
|
||||||
|
ctx.textBaseline = 'middle';
|
||||||
|
ctx.fillStyle = `rgba(${color.r.value}, ${color.g.value}, ${color.b.value}, ${color.a.value / 255})`;
|
||||||
|
ctx.fillText(textDecoder.decode(stringContents), boundingBox.x.value * scale, (boundingBox.y.value + boundingBox.height.value / 2 + 1) * scale);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_SCISSOR_START): {
|
||||||
|
window.canvasContext.save();
|
||||||
|
window.canvasContext.beginPath();
|
||||||
|
window.canvasContext.rect(boundingBox.x.value * scale, boundingBox.y.value * scale, boundingBox.width.value * scale, boundingBox.height.value * scale);
|
||||||
|
window.canvasContext.clip();
|
||||||
|
window.canvasContext.closePath();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_SCISSOR_END): {
|
||||||
|
window.canvasContext.restore();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_IMAGE): {
|
||||||
|
let config = readStructAtAddress(renderCommand.config.value, imageConfigDefinition);
|
||||||
|
let src = textDecoder.decode(new Uint8Array(memoryDataView.buffer.slice(config.sourceURL.chars.value, config.sourceURL.chars.value + config.sourceURL.length.value)));
|
||||||
|
if (!imageCache[src]) {
|
||||||
|
imageCache[src] = {
|
||||||
|
image: new Image(),
|
||||||
|
loaded: false,
|
||||||
|
}
|
||||||
|
imageCache[src].image.onload = () => imageCache[src].loaded = true;
|
||||||
|
imageCache[src].image.src = src;
|
||||||
|
} else if (imageCache[src].loaded) {
|
||||||
|
ctx.drawImage(imageCache[src].image, boundingBox.x.value * scale, boundingBox.y.value * scale, boundingBox.width.value * scale, boundingBox.height.value * scale);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (CLAY_RENDER_COMMAND_TYPE_CUSTOM): break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderLoop(currentTime) {
|
||||||
|
const elapsed = currentTime - previousFrameTime;
|
||||||
|
previousFrameTime = currentTime;
|
||||||
|
let activeRendererIndex = memoryDataView.getUint32(instance.exports.ACTIVE_RENDERER_INDEX.value, true);
|
||||||
|
if (activeRendererIndex === 0) {
|
||||||
|
instance.exports.UpdateDrawFrame(scratchSpaceAddress, window.innerWidth, window.innerHeight, 0, 0, window.mousePositionXThisFrame, window.mousePositionYThisFrame, window.touchDown, window.mouseDown, 0, 0, window.dKeyPressedThisFrame, elapsed / 1000);
|
||||||
|
} else {
|
||||||
|
instance.exports.UpdateDrawFrame(scratchSpaceAddress, window.innerWidth, window.innerHeight, window.mouseWheelXThisFrame, window.mouseWheelYThisFrame, window.mousePositionXThisFrame, window.mousePositionYThisFrame, window.touchDown, window.mouseDown, window.arrowKeyDownPressedThisFrame, window.arrowKeyUpPressedThisFrame, window.dKeyPressedThisFrame, elapsed / 1000);
|
||||||
|
}
|
||||||
|
let rendererChanged = activeRendererIndex !== window.previousActiveRendererIndex;
|
||||||
|
switch (activeRendererIndex) {
|
||||||
|
case 0: {
|
||||||
|
renderLoopHTML();
|
||||||
|
if (rendererChanged) {
|
||||||
|
window.htmlRoot.style.display = 'block';
|
||||||
|
window.canvasRoot.style.display = 'none';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1: {
|
||||||
|
renderLoopCanvas();
|
||||||
|
if (rendererChanged) {
|
||||||
|
window.htmlRoot.style.display = 'none';
|
||||||
|
window.canvasRoot.style.display = 'block';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
window.previousActiveRendererIndex = activeRendererIndex;
|
||||||
|
requestAnimationFrame(renderLoop);
|
||||||
|
window.mouseDownThisFrame = false;
|
||||||
|
window.arrowKeyUpPressedThisFrame = false;
|
||||||
|
window.arrowKeyDownPressedThisFrame = false;
|
||||||
|
window.dKeyPressedThisFrame = false;
|
||||||
|
}
|
||||||
|
init();
|
||||||
|
</script>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>
|
BIN
examples/clay-official-website/build/clay/index.wasm
Executable file
@ -165,7 +165,7 @@ Clay_Color ColorLerp(Clay_Color a, Clay_Color b, float amount) {
|
|||||||
Clay_String LOREM_IPSUM_TEXT = CLAY_STRING("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
|
Clay_String LOREM_IPSUM_TEXT = CLAY_STRING("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
|
||||||
|
|
||||||
void HighPerformancePageDesktop(float lerpValue) {
|
void HighPerformancePageDesktop(float lerpValue) {
|
||||||
CLAY(CLAY_ID("PerformanceDesktop"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT({ .min = windowHeight - 50 }) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 82, 32}, .childGap = 64 }), CLAY_RECTANGLE({ .color = COLOR_RED })) {
|
CLAY(CLAY_ID("PerformancePageOuter"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT({ .min = windowHeight - 50 }) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 82, 32}, .childGap = 64 }), CLAY_RECTANGLE({ .color = COLOR_RED })) {
|
||||||
CLAY(CLAY_ID("PerformanceLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) {
|
CLAY(CLAY_ID("PerformanceLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) {
|
||||||
CLAY_TEXT(CLAY_STRING("High Performance"), CLAY_TEXT_CONFIG({ .fontSize = 52, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT }));
|
CLAY_TEXT(CLAY_STRING("High Performance"), CLAY_TEXT_CONFIG({ .fontSize = 52, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT }));
|
||||||
CLAY(CLAY_ID("PerformanceSpacer"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 16 }) }})) {}
|
CLAY(CLAY_ID("PerformanceSpacer"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 16 }) }})) {}
|
||||||
@ -187,7 +187,7 @@ void HighPerformancePageDesktop(float lerpValue) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void HighPerformancePageMobile(float lerpValue) {
|
void HighPerformancePageMobile(float lerpValue) {
|
||||||
CLAY(CLAY_ID("PerformanceMobile"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT({ .min = windowHeight - 50 }) }, .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 16, 32}, .childGap = 32 }), CLAY_RECTANGLE({ .color = COLOR_RED })) {
|
CLAY(CLAY_ID("PerformancePageOuter"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT({ .min = windowHeight - 50 }) }, .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 16, 32}, .childGap = 32 }), CLAY_RECTANGLE({ .color = COLOR_RED })) {
|
||||||
CLAY(CLAY_ID("PerformanceLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW() }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) {
|
CLAY(CLAY_ID("PerformanceLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW() }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) {
|
||||||
CLAY_TEXT(CLAY_STRING("High Performance"), CLAY_TEXT_CONFIG({ .fontSize = 48, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT }));
|
CLAY_TEXT(CLAY_STRING("High Performance"), CLAY_TEXT_CONFIG({ .fontSize = 48, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT }));
|
||||||
CLAY(CLAY_ID("PerformanceSpacer"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 16 }) }})) {}
|
CLAY(CLAY_ID("PerformanceSpacer"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 16 }) }})) {}
|
||||||
@ -390,7 +390,11 @@ CLAY_WASM_EXPORT("UpdateDrawFrame") Clay_RenderCommandArray UpdateDrawFrame(floa
|
|||||||
windowWidth = width;
|
windowWidth = width;
|
||||||
windowHeight = height;
|
windowHeight = height;
|
||||||
Clay_SetLayoutDimensions((Clay_Dimensions) { width, height });
|
Clay_SetLayoutDimensions((Clay_Dimensions) { width, height });
|
||||||
if (deltaTime == deltaTime) { // NaN propagation can cause pain here
|
Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(Clay_GetElementId(CLAY_STRING("OuterScrollContainer")));
|
||||||
|
Clay_LayoutElementHashMapItem *perfPage = Clay__GetHashMapItem(Clay_GetElementId(CLAY_STRING("PerformancePageOuter")).id);
|
||||||
|
// NaN propagation can cause pain here
|
||||||
|
float perfPageYOffset = perfPage->boundingBox.y + scrollContainerData.scrollPosition->y;
|
||||||
|
if (deltaTime == deltaTime && perfPageYOffset < height && perfPageYOffset + perfPage->boundingBox.height > 0) {
|
||||||
animationLerpValue += deltaTime;
|
animationLerpValue += deltaTime;
|
||||||
if (animationLerpValue > 1) {
|
if (animationLerpValue > 1) {
|
||||||
animationLerpValue -= 2;
|
animationLerpValue -= 2;
|
||||||
@ -413,12 +417,10 @@ CLAY_WASM_EXPORT("UpdateDrawFrame") Clay_RenderCommandArray UpdateDrawFrame(floa
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isMouseDown && !scrollbarData.mouseDown && Clay_PointerOver(Clay_GetElementId(CLAY_STRING("ScrollBar")))) {
|
if (isMouseDown && !scrollbarData.mouseDown && Clay_PointerOver(Clay_GetElementId(CLAY_STRING("ScrollBar")))) {
|
||||||
Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(Clay_GetElementId(CLAY_STRING("OuterScrollContainer")));
|
|
||||||
scrollbarData.clickOrigin = (Clay_Vector2) { mousePositionX, mousePositionY };
|
scrollbarData.clickOrigin = (Clay_Vector2) { mousePositionX, mousePositionY };
|
||||||
scrollbarData.positionOrigin = *scrollContainerData.scrollPosition;
|
scrollbarData.positionOrigin = *scrollContainerData.scrollPosition;
|
||||||
scrollbarData.mouseDown = true;
|
scrollbarData.mouseDown = true;
|
||||||
} else if (scrollbarData.mouseDown) {
|
} else if (scrollbarData.mouseDown) {
|
||||||
Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(Clay_GetElementId(CLAY_STRING("OuterScrollContainer")));
|
|
||||||
if (scrollContainerData.contentDimensions.height > 0) {
|
if (scrollContainerData.contentDimensions.height > 0) {
|
||||||
Clay_Vector2 ratio = (Clay_Vector2) {
|
Clay_Vector2 ratio = (Clay_Vector2) {
|
||||||
scrollContainerData.contentDimensions.width / scrollContainerData.scrollContainerDimensions.width,
|
scrollContainerData.contentDimensions.width / scrollContainerData.scrollContainerDimensions.width,
|
||||||
@ -434,12 +436,10 @@ CLAY_WASM_EXPORT("UpdateDrawFrame") Clay_RenderCommandArray UpdateDrawFrame(floa
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (arrowKeyDownPressedThisFrame) {
|
if (arrowKeyDownPressedThisFrame) {
|
||||||
Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(Clay_GetElementId(CLAY_STRING("OuterScrollContainer")));
|
|
||||||
if (scrollContainerData.contentDimensions.height > 0) {
|
if (scrollContainerData.contentDimensions.height > 0) {
|
||||||
scrollContainerData.scrollPosition->y = scrollContainerData.scrollPosition->y - 50;
|
scrollContainerData.scrollPosition->y = scrollContainerData.scrollPosition->y - 50;
|
||||||
}
|
}
|
||||||
} else if (arrowKeyUpPressedThisFrame) {
|
} else if (arrowKeyUpPressedThisFrame) {
|
||||||
Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(Clay_GetElementId(CLAY_STRING("OuterScrollContainer")));
|
|
||||||
if (scrollContainerData.contentDimensions.height > 0) {
|
if (scrollContainerData.contentDimensions.height > 0) {
|
||||||
scrollContainerData.scrollPosition->y = scrollContainerData.scrollPosition->y + 50;
|
scrollContainerData.scrollPosition->y = scrollContainerData.scrollPosition->y + 50;
|
||||||
}
|
}
|
||||||
|
@ -8,5 +8,5 @@ add_executable(clay_examples_cpp_project_example main.cpp)
|
|||||||
|
|
||||||
target_include_directories(clay_examples_cpp_project_example PUBLIC .)
|
target_include_directories(clay_examples_cpp_project_example PUBLIC .)
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "-Werror -Wall -Wno-error=missing-braces")
|
set(CMAKE_CXX_FLAGS_DEBUG "-Werror -Wall")
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
|
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
|
||||||
|