diff options
| -rw-r--r-- | Makefile | 180 | ||||
| -rw-r--r-- | src/static-ui.cpp | 91 | ||||
| -rw-r--r-- | src/static-ui.hpp | 21 | ||||
| -rw-r--r-- | tests/pke-test-dummy.cpp (renamed from tests/pke-test-dummy.c) | 7 | ||||
| -rw-r--r-- | tests/pke-test-dummy.h | 8 | ||||
| -rw-r--r-- | tests/pke-test-static-ui.cpp | 106 | ||||
| -rw-r--r-- | tests/pke-test-static-ui.h | 16 | ||||
| -rw-r--r-- | tests/pke-test-types.h | 11 | ||||
| -rw-r--r-- | tests/pke-test.cpp (renamed from tests/pke-test.c) | 26 |
9 files changed, 343 insertions, 123 deletions
@@ -22,43 +22,12 @@ FLG_PKE = -Isub/imgui -Isub/stb -Isub/cgltf -Isub/bullet3/src FLG_EDT = $(FLG_PKE) -Isrc -I/home/pikum/build/msdfgen -I/home/pikum/build/msdf-atlas-gen FLG_MPL = $(FLG_PKE) -Isrc FLG_RUN = $(FLG_PKE) -Isrc +FLG_TST = $(FLG_PKE) -Isrc DIR_OBJ=obj DIR_BIN=bin DIR_DBG=dbg -SRC = \ - src/vendor-pkh-include.cpp \ - src/arg-handler.cpp \ - src/camera.cpp \ - src/ecs.cpp \ - src/entities.cpp \ - src/event.cpp \ - src/font.cpp \ - src/game.cpp \ - src/game-settings.cpp \ - src/helpers.cpp \ - src/level-types.cpp \ - src/level.cpp \ - src/math-helpers.cpp \ - src/dynamic-array.cpp \ - src/asset-manager.cpp \ - src/physics.cpp \ - src/player-input.cpp \ - src/plugins.cpp \ - src/project.cpp \ - src/project-settings.cpp \ - src/static-cube.cpp \ - src/static-plane.cpp \ - src/static-ui.cpp \ - src/thread-pool.cpp \ - src/vendor-cgltf-include.cpp \ - src/vendor-stb-image-include.c \ - src/vendor-tinyfiledialogs.c \ - src/window.cpp \ - tests/pke-test.c \ - tests/pke-test-dummy.c \ - DST_SHADERS = \ $(DIR_OBJ)/shaders/vertex.vert.spv \ $(DIR_OBJ)/shaders/present.vert.spv \ @@ -69,20 +38,8 @@ DST_SHADERS = \ $(DIR_OBJ)/shaders/ui-base.vert.spv \ $(DIR_OBJ)/shaders/ui-base.frag.spv \ -SRC_C = $(filter %.c,$(SRC)) -SRC_CXX = $(filter %.cpp,$(SRC)) -OBJ = $(SRC_C:%.c=%.o) -SOBJ = $(SRC_C:%.c=%.so) -CXXOBJ = $(SRC_CXX:%.cpp=%.o) -CXXSOBJ = $(SRC_CXX:%.cpp=%.so) -TMP_OUT_OBJ = $(notdir $(OBJ)) -TMP_OUT_SOBJ = $(notdir $(SOBJ)) -TMP_OUT_CXXOBJ = $(notdir $(CXXOBJ)) -TMP_OUT_CXXSOBJ = $(notdir $(CXXSOBJ)) -OUT_OBJ = $(TMP_OUT_OBJ:%.o=$(DIR_OBJ)/%.o) -OUT_SOBJ = $(TMP_OUT_SOBJ:%.so=$(DIR_OBJ)/%.so) -OUT_CXXOBJ = $(TMP_OUT_CXXOBJ:%.o=$(DIR_OBJ)/%.o) -OUT_CXXSOBJ = $(TMP_OUT_CXXSOBJ:%.so=$(DIR_OBJ)/%.so) +MAINS_OBJ = obj/editor-main.o obj/pke-runtime.o obj/test-pke.o +MAINS_SOBJ = $(MAINS_OBJ:%.o=%.so) .PHONY: default default: options $(DIR_BIN)/pke-editor $(DIR_BIN)/libpke-example.a $(DIR_BIN)/pke-runtime ; @@ -110,20 +67,22 @@ config.h: %.h: ; -$(SRC_C): config.h config.mk -$(SRC_CXX): config.h config.mk +%.hpp: ; + +$(DIR_OBJ)/%.o : config.h config.mk +$(DIR_OBJ)/%.so : config.h config.mk -$(DIR_OBJ)/%.o: sub/imgui/%.cpp +$(DIR_OBJ)/%.o : sub/imgui/%.cpp $(cxx-bin-command) -Isub/imgui -$(DIR_OBJ)/%.so: sub/imgui/%.cpp +$(DIR_OBJ)/%.so : sub/imgui/%.cpp $(cxx-dbg-command) -Isub/imgui -$(DIR_OBJ)/%.o: sub/imgui/backends/%.cpp +$(DIR_OBJ)/%.o : sub/imgui/backends/%.cpp $(cxx-bin-command) -Isub/imgui -$(DIR_OBJ)/%.so: sub/imgui/backends/%.cpp +$(DIR_OBJ)/%.so : sub/imgui/backends/%.cpp $(cxx-dbg-command) -Isub/imgui -$(DIR_OBJ)/%.o: sub/imgui/misc/cpp/%.cpp +$(DIR_OBJ)/%.o : sub/imgui/misc/cpp/%.cpp $(cxx-bin-command) -Isub/imgui -$(DIR_OBJ)/%.so: sub/imgui/misc/cpp/%.cpp +$(DIR_OBJ)/%.so : sub/imgui/misc/cpp/%.cpp $(cxx-dbg-command) -Isub/imgui $(DIR_OBJ)/shaders/%.vert.spv: assets/shaders/%.vert @@ -131,39 +90,39 @@ $(DIR_OBJ)/shaders/%.vert.spv: assets/shaders/%.vert $(DIR_OBJ)/shaders/%.frag.spv: assets/shaders/%.frag $(GLSLC) $^ -o $@ -$(DIR_OBJ)/%.o : src/%.c +$(DIR_OBJ)/%.o : src/%.c $(cc-bin-command) $(FLG_PKE) $(DIR_OBJ)/%.so : src/%.c $(cc-dbg-command) $(FLG_PKE) -$(DIR_OBJ)/%.o : src/vendor/tinyfiledialogs/%.c +$(DIR_OBJ)/%.o : src/vendor/tinyfiledialogs/%.c $(cc-bin-command) $(FLG_PKE) $(DIR_OBJ)/%.so : src/vendor/tinyfiledialogs/%.c $(cc-dbg-command) $(FLG_PKE) +$(DIR_OBJ)/%.o : tests/%.c + $(cc-bin-command) $(FLG_TST) +$(DIR_OBJ)/%.so : tests/%.c + $(cc-dbg-command) $(FLG_TST) -$(DIR_OBJ)/%.o : src/%.cpp +$(DIR_OBJ)/%.o : src/%.cpp $(cxx-bin-command) $(FLG_PKE) $(DIR_OBJ)/%.so : src/%.cpp $(cxx-dbg-command) $(FLG_PKE) -$(DIR_OBJ)/%.o : tests/%.c - $(cc-bin-command) $(FLG_PKE) -$(DIR_OBJ)/%.so : tests/%.c - $(cc-dbg-command) $(FLG_PKE) -$(DIR_OBJ)/%.o : tests/%.cpp - $(cxx-bin-command) $(FLG_PKE) -$(DIR_OBJ)/%.so : tests/%.cpp - $(cxx-dbg-command) $(FLG_PKE) -$(DIR_OBJ)/%.o : editor/%.cpp +$(DIR_OBJ)/%.o : editor/%.cpp $(cxx-bin-command) $(FLG_EDT) $(DIR_OBJ)/%.so : editor/%.cpp $(cxx-dbg-command) $(FLG_EDT) -$(DIR_OBJ)/%.o : example/%.cpp +$(DIR_OBJ)/%.o : example/%.cpp $(cxx-bin-command) $(FLG_MPL) $(DIR_OBJ)/%.so : example/%.cpp $(cxx-dbg-command) $(FLG_MPL) -$(DIR_OBJ)/%.o : runtime/%.cpp +$(DIR_OBJ)/%.o : runtime/%.cpp $(cxx-bin-command) $(FLG_RUN) $(DIR_OBJ)/%.so : runtime/%.cpp $(cxx-dbg-command) $(FLG_RUN) +$(DIR_OBJ)/%.o : tests/%.cpp + $(cxx-bin-command) $(FLG_TST) +$(DIR_OBJ)/%.so : tests/%.cpp + $(cxx-dbg-command) $(FLG_TST) $(DIR_BIN)/libImgui.a: $(DIR_OBJ)/imgui.o $(DIR_BIN)/libImgui.a: $(DIR_OBJ)/imgui_demo.o @@ -204,13 +163,67 @@ $(DIR_DBG)/libBullet3.a: ranlib $@ $(DIR_BIN)/libpke.a: $(DST_SHADERS) -$(DIR_BIN)/libpke.a: $(OUT_OBJ) $(OUT_CXXOBJ) +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/arg-handler.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/asset-manager.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/camera.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/dynamic-array.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/ecs.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/entities.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/event.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/font.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/game-settings.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/game.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/helpers.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/level-types.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/level.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/math-helpers.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/physics.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/player-input.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/plugins.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/project-settings.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/project.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/static-cube.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/static-plane.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/static-ui.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/thread-pool.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/vendor-cgltf-include.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/vendor-pkh-include.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/vendor-stb-image-include.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/vendor-tinyfiledialogs.o +$(DIR_BIN)/libpke.a: $(DIR_OBJ)/window.o $(DIR_BIN)/libpke.a: ar rc $@ $(filter %.o,$^) ranlib $@ $(DIR_DBG)/libpke.a: $(DST_SHADERS) -$(DIR_DBG)/libpke.a: $(OUT_SOBJ) $(OUT_CXXSOBJ) +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/arg-handler.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/asset-manager.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/camera.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/dynamic-array.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/ecs.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/entities.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/event.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/font.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/game-settings.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/game.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/helpers.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/level-types.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/level.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/math-helpers.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/physics.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/player-input.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/plugins.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/project-settings.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/project.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/static-cube.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/static-plane.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/static-ui.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/thread-pool.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/vendor-cgltf-include.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/vendor-pkh-include.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/vendor-stb-image-include.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/vendor-tinyfiledialogs.so +$(DIR_DBG)/libpke.a: $(DIR_OBJ)/window.so $(DIR_DBG)/libpke.a: ar rc $@ $(filter %.so,$^) ranlib $@ @@ -224,12 +237,12 @@ $(DIR_DBG)/libpke-example.a: $(DIR_OBJ)/example.so ranlib $@ $(DIR_BIN)/libpke-test.a: $(DIR_OBJ)/pke-test-dummy.o - ar rc $@ $(filter %.o,$^) - ranlib $@ +$(DIR_BIN)/libpke-test.a: $(DIR_OBJ)/pke-test-static-ui.o + ar rcs $@ $(filter %.o,$^) $(DIR_DBG)/libpke-test.a: $(DIR_OBJ)/pke-test-dummy.so - ar rc $@ $(filter %.so,$^) - ranlib $@ +$(DIR_DBG)/libpke-test.a: $(DIR_OBJ)/pke-test-static-ui.so + ar rcs $@ $(filter %.so,$^) $(DIR_BIN)/pke-editor: $(DIR_BIN)/libpke.a $(DIR_BIN)/libImgui.a $(DIR_BIN)/libBullet3.a $(DIR_BIN)/pke-editor: $(DIR_OBJ)/editor-main.o $(DIR_OBJ)/editor.o @@ -250,22 +263,21 @@ $(DIR_DBG)/pke-runtime: $(DIR_OBJ)/runtime.so @echo $^ $(CXX) -v -std=c++23 $(INCS) $^ $(LDFLAGS) $(CXXFLAGS) -g -O0 -o $@ -$(DIR_BIN)/test-pke: $(DIR_BIN)/libpke.a $(DIR_BIN)/libImgui.a $(DIR_BIN)/libBullet3.a -$(DIR_DBG)/test-pke: $(DIR_BIN)/libpke-test.a -$(DIR_BIN)/test-pke: $(DIR_OBJ)/pke-test.o -$(DIR_BIN)/test-pke: +$(DIR_BIN)/pke-test: $(DIR_BIN)/libpke-test.a $(DIR_BIN)/libpke.a $(DIR_BIN)/libImgui.a $(DIR_BIN)/libBullet3.a +$(DIR_BIN)/pke-test: $(DIR_OBJ)/pke-test.o @echo $^ - $(CC) -std=c2x -v $(INCS) $^ $(LDFLAGS) $(CXXFLAGS) -g -O0 -o $@ + $(CXX) -v -std=c++23 $(INCS) $^ $(LDFLAGS) $(CXXFLAGS) -g -O0 -o $@ -$(DIR_DBG)/test-pke: $(DIR_DBG)/libpke.a $(DIR_DBG)/libImgui.a $(DIR_DBG)/libBullet3.a -$(DIR_DBG)/test-pke: $(DIR_DBG)/libpke-test.a -$(DIR_DBG)/test-pke: $(DIR_OBJ)/pke-test.so +$(DIR_DBG)/pke-test: $(DIR_DBG)/libpke-test.a $(DIR_DBG)/libpke.a $(DIR_DBG)/libImgui.a $(DIR_DBG)/libBullet3.a +$(DIR_DBG)/pke-test: $(DIR_OBJ)/pke-test.so @echo $^ - $(CC) -std=c2x -v $(INCS) $^ $(LDFLAGS) $(CXXFLAGS) -g -O0 -o $@ + $(CXX) -v -std=c++23 $(INCS) $^ $(LDFLAGS) $(CXXFLAGS) -g -O0 -o $@ .PHONY: print print: - @echo $(DST_SHADERS) + @echo $(OUT_OBJ) + @echo $(MAINS_OBJ) + @echo $(MAINS_SOBJ) .PHONY: clean clean: diff --git a/src/static-ui.cpp b/src/static-ui.cpp index 01af0db..fff8ecc 100644 --- a/src/static-ui.cpp +++ b/src/static-ui.cpp @@ -83,14 +83,19 @@ Some restrictions: - this means that tables or similar need to consist of rows of columns */ -void pke_ui_calc_px(pke_ui_box *box, DynArray<pke_ui_box_instance_buffer_item> &buffer) { +struct pke_ui_flex_params { + float px_per_unit; + float unit_total; +}; + +void pke_ui_calc_px(DynArray<pke_ui_box_instance_buffer_item> &buffer, pke_ui_flex_params *flex_params, pke_ui_box *box) { assert(box != nullptr); - static const float built_in_offset = 2.0; glm::vec2 px_size; + glm::vec2 px_min_size; + glm::vec2 px_max_size; glm::vec2 parent_size_padded; glm::vec2 parent_pos_and_offset; - assert(PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_POSITION_TYPE_ALL)); assert(box->pos_top_left_x >= 0.0); assert(box->pos_top_left_y >= 0.0); assert(box->max_width >= 0.0); @@ -114,7 +119,20 @@ void pke_ui_calc_px(pke_ui_box *box, DynArray<pke_ui_box_instance_buffer_item> & px_size = glm::vec2(Extent.width, Extent.height); } + px_min_size.x = box->min_width; + px_min_size.y = box->min_height; + px_max_size.x = box->max_width; + px_max_size.y = box->max_height; + box->internal.px_corner_x = 0 + + parent_pos_and_offset.x + + box->pos_top_left_x; + box->internal.px_corner_y = 0 + + parent_pos_and_offset.y + + box->pos_top_left_y; + if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_POSITION_TYPE_FLEX)) { + assert(flex_params != nullptr); + assert(box->internal.parent != nullptr); // TODO - think through how to organize this. // It's almost like the parent needs to set the widths/heights of the children // In every other method, the child determines its size, @@ -122,19 +140,14 @@ void pke_ui_calc_px(pke_ui_box *box, DynArray<pke_ui_box_instance_buffer_item> & // Could pass a struct around with all the needed details: // - width or height per weight unit, current used weight or current offset // Parent should assert that all or none of the children are position type flex? - px_size.x = PK_CLAMP(parent_size_padded.x, box->min_width, box->max_width); - px_size.y = PK_CLAMP(parent_size_padded.y, box->min_height, box->max_height); + if (box->internal.parent->flex_direction == 0) { + px_size.x = flex_params->px_per_unit * box->flex_weight; + } else { + px_size.y = flex_params->px_per_unit * box->flex_weight; + } } else if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_POSITION_TYPE_STATIC)) { px_size.x -= box->pos_top_left_x; px_size.y -= box->pos_top_left_y; - box->internal.px_corner_x = 0 - + parent_pos_and_offset.x - + box->pos_top_left_x; - box->internal.px_corner_y = 0 - + parent_pos_and_offset.y - + box->pos_top_left_y; - px_size.x = PK_CLAMP(parent_size_padded.x, box->min_width, box->max_width); - px_size.y = PK_CLAMP(parent_size_padded.y, box->min_height, box->max_height); } else { assert(box->pos_top_left_x < 1.0); assert(box->pos_top_left_y < 1.0); @@ -144,33 +157,43 @@ void pke_ui_calc_px(pke_ui_box *box, DynArray<pke_ui_box_instance_buffer_item> & float px_top = px_size.y * box->pos_top_left_y; box->internal.px_corner_x += px_left; box->internal.px_corner_y += px_top; - px_size -= px_left; - px_size -= px_top; - px_size.x = PK_CLAMP(parent_size_padded.x, box->min_width * parent_size_padded.x, box->max_width * parent_size_padded.x); - px_size.y = PK_CLAMP(parent_size_padded.y, box->min_height * parent_size_padded.y, box->max_height * parent_size_padded.y); + px_size.x -= px_left; + px_size.y -= px_top; + px_min_size.x = box->min_width * parent_size_padded.x; + px_min_size.y = box->min_height * parent_size_padded.y; + px_max_size.x = box->max_width * parent_size_padded.x; + px_max_size.y = box->max_height * parent_size_padded.y; } + + px_size = glm::clamp(px_size, px_min_size, px_max_size); + // built-in padding box->internal.px_offset_x = built_in_offset; box->internal.px_offset_y = built_in_offset; if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_CENTER_HORIZONTAL)) { if (parent_size_padded.x > px_size.x) { - box->internal.px_offset_x += (parent_size_padded.x - px_size.x) / 2.0; + box->internal.px_corner_x += (parent_size_padded.x - px_size.x) / 2.0; } } if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_CENTER_VERTICAL)) { if (parent_size_padded.y > px_size.y) { - box->internal.px_offset_y += (parent_size_padded.y - px_size.y) / 2.0; + box->internal.px_corner_y += (parent_size_padded.y - px_size.y) / 2.0; } } box->internal.px_width = px_size.x; box->internal.px_height = px_size.y; if (box->internal.parent != nullptr) { + box->internal.parent->internal.px_offset_x += px_size.x; box->internal.parent->internal.px_offset_y += px_size.y; } + if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_VISIBILITY_INVISIBLE)) { + return; + } + // update buffer glm::vec3 scale = glm::vec3(box->internal.px_width / (float)Extent.width, box->internal.px_height / (float)Extent.height, 1.0); glm::vec3 translate = glm::vec3(1); @@ -200,17 +223,35 @@ void pke_ui_calc_px(pke_ui_box *box, DynArray<pke_ui_box_instance_buffer_item> & void pke_ui_recalc_sizes_recursive(DynArray<pke_ui_box_instance_buffer_item> &arr, pke_ui_box *box, uint8_t depth = 0) { uint64_t flags_masked; + uint8_t flex_count = 0; + pke_ui_flex_params flex_params{}; + + flags_masked = box->flags & (PKE_UI_BOX_FLAG_POSITION_TYPE_ALL); + if (flags_masked == 0b000 || flags_masked == 0b011 || flags_masked == 0b101 || flags_masked == 0b110 || flags_masked == 0b111) { + fprintf(stderr, "[%s] ui box invalid flags: position type", __FILE__); + return; + } for (pke_ui_box_count_T i = 0; i < box->internal.h_children; ++i) { - flags_masked = box->flags & (PKE_UI_BOX_FLAG_POSITION_TYPE_ALL); - if (flags_masked == 0 || flags_masked == 3 || flags_masked == 5 || flags_masked == 6 || flags_masked == 7) { - fprintf(stderr, "[%s] ui box invalid flags: position", __FILE__); - return; + if (PK_HAS_FLAG(box->internal.children[i]->flags, PKE_UI_BOX_FLAG_POSITION_TYPE_FLEX)) { + flex_count += 1; + flex_params.unit_total += box->internal.children[i]->flex_weight; } } + if (flex_count != 0 && flex_count != box->internal.h_children) { + fprintf(stderr, "[%s] ui box invalid flags: if one child is type FLEX, then all children must be type FLEX", __FILE__); + return; + } + if (flex_count != 0) { + flex_params.px_per_unit = + box->flex_direction == 0 + ? box->internal.px_width / flex_params.unit_total + : box->internal.px_height / flex_params.unit_total; + } + for (pke_ui_box_count_T i = 0; i < box->internal.h_children; ++i) { - pke_ui_calc_px(box->internal.children[i], arr); + pke_ui_calc_px(arr, &flex_params, box->internal.children[i]); pke_ui_recalc_sizes_recursive(arr, box->internal.children[i], depth + 1); } } @@ -316,7 +357,7 @@ void pke_ui_tick(double delta) { ); for (pke_ui_box_count_T i = 0; i < pke_ui_master.h_root_boxes; ++i) { pke_ui_box *box = pke_ui_master.root_boxes[i]; - pke_ui_calc_px(box, arr); + pke_ui_calc_px(arr, nullptr, box); pke_ui_recalc_sizes_recursive(arr, box, 0); } pke_ui_update_instance_buffer(arr); diff --git a/src/static-ui.hpp b/src/static-ui.hpp index 0cc7aa2..a9b751b 100644 --- a/src/static-ui.hpp +++ b/src/static-ui.hpp @@ -4,6 +4,8 @@ #include "components-vk.hpp" #include <cstdint> +#define built_in_offset 2.0 + struct MSDFGlyphSettings { float width; float height; @@ -14,22 +16,18 @@ struct MSDFGlyphSettings { enum PKE_UI_BOX_FLAGS : uint64_t { PKE_UI_BOX_FLAG_NONE = 0, - // position type [0-1] + // position type [0-4] // exact screen coordinates PKE_UI_BOX_FLAG_POSITION_TYPE_FLEX = (1 << 0), PKE_UI_BOX_FLAG_POSITION_TYPE_STATIC = (1 << 1), PKE_UI_BOX_FLAG_POSITION_TYPE_DYNAMIC = (1 << 2), PKE_UI_BOX_FLAG_POSITION_TYPE_ALL = (1 << 0) | (1 << 1) | (1 << 2), - /* - // grow [2-3] - PKE_UI_BOX_FLAG_GROW_HORIZONTAL = (1 << 3), - PKE_UI_BOX_FLAG_GROW_VERTICAL = (1 << 4), - PKE_UI_BOX_FLAG_GROW_BOTH = (1 << 3) | (1 << 4), - */ - // center [4-5] + // center [5-6] PKE_UI_BOX_FLAG_CENTER_HORIZONTAL = (1 << 5), PKE_UI_BOX_FLAG_CENTER_VERTICAL = (1 << 6), PKE_UI_BOX_FLAG_CENTER_BOTH = (1 << 5) | (1 << 6), + // visibility [7-9] + PKE_UI_BOX_FLAG_VISIBILITY_INVISIBLE = (1 << 7), }; typedef uint16_t pke_ui_box_count_T; @@ -41,6 +39,8 @@ struct pke_ui_box { float pos_top_left_x, pos_top_left_y; float min_width, min_height; float max_width, max_height; + float flex_weight; + uint8_t flex_direction; uint8_t layer; struct pke_ui_box_internals { float px_corner_x, px_corner_y; @@ -73,6 +73,11 @@ void pke_ui_teardown(); pke_ui_box *pke_ui_box_new_root(); pke_ui_box *pke_ui_box_new_child(pke_ui_box *parent); +#ifdef PKE_TEST_EXPOSE +void pke_ui_calc_px(DynArray<pke_ui_box_instance_buffer_item> &buffer, pke_ui_flex_params *flex_params, pke_ui_box *box); +void pke_ui_recalc_sizes_recursive(DynArray<pke_ui_box_instance_buffer_item> &arr, pke_ui_box *box, uint8_t depth = 0); +#endif + pke_ui_graphics_bindings *pke_ui_get_graphics_bindings(); #endif /* PKE_STATIC_UI_HPP */ diff --git a/tests/pke-test-dummy.c b/tests/pke-test-dummy.cpp index ea92c34..a7e2ddc 100644 --- a/tests/pke-test-dummy.c +++ b/tests/pke-test-dummy.cpp @@ -6,16 +6,17 @@ int pke_test_dummy_001() { } struct pke_test_group *pke_test_dummy_get_group() { - static struct pke_test tests[1] = { + static const uint64_t test_count = 1; + static struct pke_test tests[test_count] = { { .title = "test 001", .func = pke_test_dummy_001, .expected_result = 0, } }; - static struct pke_test_group group = {0}; + static struct pke_test_group group = {}; group.title = "dummy test"; - group.n_tests = 1; + group.n_tests = test_count; group.tests = &tests[0]; return &group; diff --git a/tests/pke-test-dummy.h b/tests/pke-test-dummy.h index b69609e..6abf8b7 100644 --- a/tests/pke-test-dummy.h +++ b/tests/pke-test-dummy.h @@ -3,6 +3,14 @@ #include "pke-test-types.h" +#ifdef __cplusplus +extern "C" { +#endif + struct pke_test_group *pke_test_dummy_get_group(); +#ifdef __cplusplus +} +#endif + #endif /* PKE_PKE_TEST_DUMMY_H */ diff --git a/tests/pke-test-static-ui.cpp b/tests/pke-test-static-ui.cpp new file mode 100644 index 0000000..6e6fb4b --- /dev/null +++ b/tests/pke-test-static-ui.cpp @@ -0,0 +1,106 @@ + +#include "./pke-test-static-ui.h" + +#include "window.hpp" +#include "dynamic-array.hpp" +#include "vendor-glm-include.hpp" +struct pke_ui_box_instance_buffer_item { + glm::mat4 pos_scale; + glm::vec2 px_scale; + float depth; + float padding[1]; +}; +struct pke_ui_flex_params { + float px_per_unit; + float unit_total; +}; +#define PKE_TEST_EXPOSE +#include "static-ui.hpp" + +void pke_test_static_ui_setup() { + Extent.width = 1920; + Extent.height = 1080; + pke_ui_init(); +} + +void pke_test_static_ui_teardown() { + pke_ui_teardown(); +} + +// test static +int pke_test_static_ui_000() { + DynArray<pke_ui_box_instance_buffer_item> arr{}; + float calculated_offset; + uint8_t err_index = 0; + + pke_ui_box *ui_box = pke_ui_box_new_root(); + ui_box->flags = PKE_UI_BOX_FLAG_POSITION_TYPE_STATIC; + ui_box->pos_top_left_x = 10; + ui_box->pos_top_left_y = 10; + ui_box->max_width = 500; + ui_box->max_height = 500; + + pke_ui_box *c_ui_box = pke_ui_box_new_child(ui_box); + c_ui_box->flags = PKE_UI_BOX_FLAG_POSITION_TYPE_STATIC; + c_ui_box->pos_top_left_x = 10; + c_ui_box->pos_top_left_y = 10; + c_ui_box->max_width = 100; + c_ui_box->max_height = 100; + + calculated_offset = ui_box->pos_top_left_x + c_ui_box->pos_top_left_x + built_in_offset; + + pke_ui_calc_px(arr, nullptr, ui_box); + pke_ui_recalc_sizes_recursive(arr, ui_box, 0); + + PKE_TEST_ASSERT(ui_box->internal.parent == nullptr, err_index); + PKE_TEST_ASSERT(c_ui_box->internal.parent != nullptr, err_index); + + PKE_TEST_ASSERT(ui_box->internal.px_corner_x == 10, err_index); + PKE_TEST_ASSERT(ui_box->internal.px_corner_y == 10, err_index); + PKE_TEST_ASSERT(c_ui_box->internal.px_corner_x == calculated_offset, err_index); + PKE_TEST_ASSERT(c_ui_box->internal.px_corner_y == calculated_offset, err_index); + + return 0; +} + +// test dynamic +int pke_test_static_ui_100() { + return 0; +} + + +// test flex +int pke_test_static_ui_200() { + return 0; +} + +pke_test_group *pke_test_static_ui_get_group() { + static const uint64_t test_count = 3; + static struct pke_test tests[test_count] = { + { + .title = "test 000", + .func = pke_test_static_ui_000, + .expected_result = 0, + }, + { + .title = "test 100", + .func = pke_test_static_ui_100, + .expected_result = 0, + }, + { + .title = "test 200", + .func = pke_test_static_ui_200, + .expected_result = 0, + }, + }; + static struct pke_test_group group = {}; + group.title = "static_ui"; + group.group_setup = NULL; + group.group_teardown = NULL; + group.test_setup = pke_test_static_ui_setup; + group.test_teardown = pke_test_static_ui_teardown; + group.tests = &tests[0]; + group.n_tests = test_count; + + return &group; +} diff --git a/tests/pke-test-static-ui.h b/tests/pke-test-static-ui.h new file mode 100644 index 0000000..673adf8 --- /dev/null +++ b/tests/pke-test-static-ui.h @@ -0,0 +1,16 @@ +#ifndef PKE_PKE_TEST_STATIC_UI_H +#define PKE_PKE_TEST_STATIC_UI_H + +#include "pke-test-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct pke_test_group *pke_test_static_ui_get_group(); + +#ifdef __cplusplus +} +#endif + +#endif /* PKE_PKE_TEST_STATIC_UI_H */ diff --git a/tests/pke-test-types.h b/tests/pke-test-types.h index 5278eae..5a9ee24 100644 --- a/tests/pke-test-types.h +++ b/tests/pke-test-types.h @@ -15,6 +15,11 @@ typedef int (pke_test_func)(); struct pke_test_group; typedef struct pke_test_group *(pke_test_get_group)(); +typedef void (pke_test_group_setup()); +typedef void (pke_test_group_teardown()); +typedef void (pke_test_setup()); +typedef void (pke_test_teardown()); + struct pke_test { const char *title; pke_test_func *func; @@ -23,8 +28,14 @@ struct pke_test { struct pke_test_group { const char *title; + pke_test_group_setup *group_setup; + pke_test_group_teardown *group_teardown; + pke_test_setup *test_setup; + pke_test_teardown *test_teardown; struct pke_test *tests; uint32_t n_tests; }; +#define PKE_TEST_ASSERT(condition, index) if (!(condition)) { return ++index; } else { ++index; } + #endif /* PKE_PKE_TEST_TYPES_H */ diff --git a/tests/pke-test.c b/tests/pke-test.cpp index 4f88dbf..61b6fb8 100644 --- a/tests/pke-test.c +++ b/tests/pke-test.cpp @@ -2,7 +2,9 @@ #include "./pke-test-types.h" #include "./pke-test-dummy.h" +#include "./pke-test-static-ui.h" +#include "pk.h" #include "unistd.h" #include <stdio.h> @@ -25,30 +27,48 @@ int main(int argc, char *argv[]) (void)argc; (void)argv; int i = 0; + int result; uint32_t k, pass_count; + double nanoseconds; + double group_nanoseconds; + pk_tmr func_tmr; pke_test_get_group *group_fns[] = { pke_test_dummy_get_group, + pke_test_static_ui_get_group, NULL, }; + fprintf(stdout, "\r\n"); pke_test_get_group *fn = group_fns[i]; while (fn != NULL) { pass_count = 0; + group_nanoseconds = 0; struct pke_test_group *group = (fn)(); fprintf(stdout, "[pke-test]:[%s] Begin.\n", group->title); + if (group->group_setup != NULL) (group->group_setup)(); for (k = 0; k < group->n_tests; ++k) { fprintf(stdout, "[pke-test]:[%s]:[%s] Begin.\n", group->title, group->tests[k].title); + if (group->test_setup != NULL) (group->test_setup)(); lj.expected_exit = 0; lj.caught = 0; - if (group->tests[k].expected_result == (group->tests[k].func)()){ + pk_tmr_start(func_tmr); + result = (group->tests[k].func)(); + pk_tmr_stop(func_tmr); + nanoseconds = pk_tmr_duration_double(func_tmr); + group_nanoseconds += nanoseconds; + if (result == group->tests[k].expected_result){ pass_count += 1; fprintf(stdout, "[pke-test]:[%s]:[%s] %sPassed.%s\n", group->title, group->tests[k].title, CLR_GREEN, CLR_WHITE); + fprintf(stdout, "[pke-test]:[%s]:[%s] Elapsed ms: '%f'.\n", group->title, group->tests[k].title, nanoseconds); } else { - fprintf(stdout, "[pke-test]:[%s]:[%s] %sFailed.%s\n", group->title, group->tests[k].title, CLR_RED, CLR_WHITE); + fprintf(stdout, "[pke-test]:[%s]:[%s] %sFailed.%s Expected: '%i' Got: '%i'.\n", group->title, group->tests[k].title, CLR_RED, CLR_WHITE, group->tests[k].expected_result, result); } + if (group->test_teardown != NULL) (group->test_teardown)(); } - fprintf(stdout, "[pke-test]:[%s] End. ( %s%03d%s / %03d ) Tests Completed.\n\n", group->title, pass_count == group->n_tests ? CLR_GREEN : CLR_RED, pass_count, CLR_WHITE, group->n_tests); + if (group->group_teardown != NULL) (group->group_teardown)(); + fprintf(stdout, "[pke-test]:[%s] End. ( %s%03d%s / %03d ) Tests Completed.\n", group->title, pass_count == group->n_tests ? CLR_GREEN : CLR_RED, pass_count, CLR_WHITE, group->n_tests); + fprintf(stdout, "[pke-test]:[%s] End. Elapsed ms: '%f'.\n\n", group->title, group_nanoseconds); i += 1; fn = group_fns[i]; } |
