diff --git a/build-windows-visual-studio/sm64ex.vcxproj b/build-windows-visual-studio/sm64ex.vcxproj index 8fb030cb..f42b2aea 100644 --- a/build-windows-visual-studio/sm64ex.vcxproj +++ b/build-windows-visual-studio/sm64ex.vcxproj @@ -3944,6 +3944,7 @@ + @@ -4364,6 +4365,7 @@ + diff --git a/build-windows-visual-studio/sm64ex.vcxproj.filters b/build-windows-visual-studio/sm64ex.vcxproj.filters index 7ad6a2fc..24040d78 100644 --- a/build-windows-visual-studio/sm64ex.vcxproj.filters +++ b/build-windows-visual-studio/sm64ex.vcxproj.filters @@ -3448,9 +3448,15 @@ {0e1e4798-796e-4801-be6e-69d0c3b05ad7} - + + {2401a619-ee3f-4637-9926-a619a5e65bcb} + + {471ac819-ed6b-4a33-8952-50a8e0d2d839} + + {a7515004-4574-4bc0-9288-f716100c8a43} + @@ -15154,22 +15160,19 @@ Source Files\src\pc\djui - Source Files\src\pc\djui\components + Source Files\src\pc\djui\component - Source Files\src\pc\djui\components + Source Files\src\pc\djui\component - Source Files\src\pc\djui\components + Source Files\src\pc\djui\component - Source Files\src\pc\djui\components + Source Files\src\pc\djui\component - Source Files\src\pc\djui\components - - - Source Files\src\pc\djui\components + Source Files\src\pc\djui\component Source Files\src\pc\controller @@ -15178,7 +15181,13 @@ Source Files\src\pc\controller - Source Files\src\pc\djui\components + Source Files\src\pc\djui\component + + + Source Files\src\pc\djui\component\compound + + + Source Files\src\pc\djui\component\compound @@ -16166,25 +16175,28 @@ Source Files\src\pc\djui - Source Files\src\pc\djui\components + Source Files\src\pc\djui\component - Source Files\src\pc\djui\components + Source Files\src\pc\djui\component - Source Files\src\pc\djui\components + Source Files\src\pc\djui\component - Source Files\src\pc\djui\components + Source Files\src\pc\djui\component - Source Files\src\pc\djui\components - - - Source Files\src\pc\djui\components + Source Files\src\pc\djui\component - Source Files\src\pc\djui\components + Source Files\src\pc\djui\component + + + Source Files\src\pc\djui\component\compound + + + Source Files\src\pc\djui\component\compound \ No newline at end of file diff --git a/src/pc/djui/djui.c b/src/pc/djui/djui.c index e13d180b..d09d7ebb 100644 --- a/src/pc/djui/djui.c +++ b/src/pc/djui/djui.c @@ -12,92 +12,79 @@ ALIGNED8 static const u8 texture16x16[] = { #include "textures/segment2/custom_luigi_head.rgba16.inc.c" }; -ALIGNED8 u8 texture_hand_open[] = { +ALIGNED8 static u8 texture_hand_open[] = { #include "textures/intro_raw/hand_open.rgba16.inc.c" }; -ALIGNED8 u8 texture_hand_closed[] = { +ALIGNED8 static u8 texture_hand_closed[] = { #include "textures/intro_raw/hand_closed.rgba16.inc.c" }; +ALIGNED8 static u8 texture_title[] = { +#include "textures/segment2/custom_title.rgba32.inc.c" +}; + static Gfx* sSavedDisplayListHead = NULL; struct DjuiRoot* gDjuiRoot = NULL; static struct DjuiImage* sMouseCursor = NULL; - -// v REMOVE ME v -static struct DjuiRect* sDjuiRect = NULL; -static struct DjuiRect* sDjuiRect2 = NULL; -static struct DjuiText* sDjuiText = NULL; -static struct DjuiImage* sDjuiImage = NULL; -// ^ REMOVE ME ^ +struct DjuiFlowLayout* buttonContainer; static void djui_init(void) { gDjuiRoot = djui_root_create(); - sMouseCursor = djui_image_create(NULL, texture_hand_open, 32, 32); + sMouseCursor = djui_image_create(NULL, texture_hand_open, 32, 32, 16); djui_base_set_location(&sMouseCursor->base, 0, 0); djui_base_set_size(&sMouseCursor->base, 64, 64); - //// - - struct DjuiRect* imageContainer = djui_rect_create(&gDjuiRoot->base); - djui_base_set_location(&imageContainer->base, 32, 32); - djui_base_set_size(&imageContainer->base, 128, 128); - djui_base_set_padding(&imageContainer->base, 48, 48, 48, 48); - - sDjuiImage = djui_image_create(&imageContainer->base, texture16x16, 16, 16); - djui_base_set_location(&sDjuiImage->base, 0, 0); - djui_base_set_size(&sDjuiImage->base, 32, 32); - djui_base_set_size_type(&sDjuiImage->base, DJUI_SVT_RELATIVE, DJUI_SVT_RELATIVE); - djui_base_set_size(&sDjuiImage->base, 1.0f, 1.0f); - - ////////////// - - sDjuiRect = djui_rect_create(&gDjuiRoot->base); - djui_base_set_location(&sDjuiRect->base, 64, 64); - djui_base_set_size(&sDjuiRect->base, 188, 64); - djui_base_set_color(&sDjuiRect->base, 255, 255, 255, 200); - djui_base_set_alignment(&sDjuiRect->base, DJUI_HALIGN_LEFT, DJUI_VALIGN_BOTTOM); - - sDjuiRect2 = djui_rect_create(&sDjuiRect->base); - djui_base_set_location(&sDjuiRect2->base, 0, 0); - djui_base_set_size(&sDjuiRect2->base, 188 - 8, 64 - 8); - djui_base_set_alignment(&sDjuiRect2->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - - sDjuiText = djui_text_create(&sDjuiRect2->base, "Host"); - djui_base_set_location(&sDjuiText->base, 0, 0); - djui_base_set_size(&sDjuiText->base, 188 - 8, 64 - 8); - djui_base_set_color(&sDjuiText->base, 111, 111, 111, 255); - djui_text_set_font_size(sDjuiText, 2); - djui_text_set_alignment(sDjuiText, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); - - struct DjuiRect* buttonContainer = djui_rect_create(&gDjuiRoot->base); - djui_base_set_alignment(&buttonContainer->base, DJUI_HALIGN_RIGHT, DJUI_VALIGN_BOTTOM); - djui_base_set_location(&buttonContainer->base, 64, 64); - djui_base_set_size(&buttonContainer->base, 200 + 16, (64 + 16) * 2.0f + 16); - djui_base_set_color(&buttonContainer->base, 0, 0, 0, 64); - djui_base_set_padding(&buttonContainer->base, 16, 16, 16, 16); - - struct DjuiButton* button1 = djui_button_create(&buttonContainer->base, "one"); - djui_base_set_location(&button1->base, 0, 0); - djui_base_set_size_type(&button1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&button1->base, 1.0f, 64); - - struct DjuiButton* button2 = djui_button_create(&buttonContainer->base, "two"); - djui_base_set_location(&button2->base, 0, 64 + 16); - djui_base_set_size_type(&button2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&button2->base, 1.0f, 64); + djui_panel_main_create(); } static void djui_debug_update(void) { + /*static struct DjuiImage* sDjuiImage = NULL; + static struct DjuiRect* sDjuiRect = NULL;; + static struct DjuiRect* sDjuiRect2 = NULL;; + static struct DjuiText* sDjuiText = NULL;; + if (sDjuiImage == NULL) { + struct DjuiRect* imageContainer = djui_rect_create(&gDjuiRoot->base); + djui_base_set_location(&imageContainer->base, 32, 32); + djui_base_set_size(&imageContainer->base, 128, 128); + djui_base_set_padding(&imageContainer->base, 48, 48, 48, 48); + + sDjuiImage = djui_image_create(&imageContainer->base, texture16x16, 16, 16, 16); + djui_base_set_location(&sDjuiImage->base, 0, 0); + djui_base_set_size(&sDjuiImage->base, 32, 32); + djui_base_set_size_type(&sDjuiImage->base, DJUI_SVT_RELATIVE, DJUI_SVT_RELATIVE); + djui_base_set_size(&sDjuiImage->base, 1.0f, 1.0f); + + sDjuiRect = djui_rect_create(&gDjuiRoot->base); + djui_base_set_location(&sDjuiRect->base, 64, 64); + djui_base_set_size(&sDjuiRect->base, 188, 64); + djui_base_set_color(&sDjuiRect->base, 255, 255, 255, 200); + djui_base_set_alignment(&sDjuiRect->base, DJUI_HALIGN_LEFT, DJUI_VALIGN_BOTTOM); + + sDjuiRect2 = djui_rect_create(&sDjuiRect->base); + djui_base_set_location(&sDjuiRect2->base, 0, 0); + djui_base_set_size(&sDjuiRect2->base, 188 - 8, 64 - 8); + djui_base_set_alignment(&sDjuiRect2->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + + sDjuiText = djui_text_create(&sDjuiRect2->base, "Host"); + djui_base_set_location(&sDjuiText->base, 0, 0); + djui_base_set_size(&sDjuiText->base, 188 - 8, 64 - 8); + djui_base_set_color(&sDjuiText->base, 111, 111, 111, 255); + djui_text_set_font_size(sDjuiText, 2); + djui_text_set_alignment(sDjuiText, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + }*/ static u32 sTimer = 0; sTimer++; + /*djui_base_set_size(&buttonContainer->base, + 512.0f + cos((sTimer) / 20.0f) * 256.0f, + buttonContainer->base.height.value);*/ /*djui_base_set_location(&sDjuiImage->base, 0.0f + cos((sTimer) / 30.0f) * 128.0f, 0.0f + fabs(sin((sTimer) / 30.0f)) * 128.0f);*/ - djui_base_set_color(&sDjuiImage->base, + /*djui_base_set_color(&sDjuiImage->base, 127.0f + sin((sTimer) / 13.0f) * 127.0f, 127.0f + sin((sTimer) / 17.0f) * 127.0f, 127.0f + sin((sTimer) / 23.0f) * 127.0f, @@ -105,7 +92,7 @@ static void djui_debug_update(void) { djui_base_set_location(&sDjuiRect2->base, 32.0f + cos((sTimer) / 10.0f) * 64.0f, - 32.0f + sin((sTimer) / 31.0f) * 64.0f); + 32.0f + sin((sTimer) / 31.0f) * 64.0f);*/ } static void djui_mouse_update(void) { @@ -118,9 +105,9 @@ static void djui_mouse_update(void) { djui_base_set_location(&sMouseCursor->base, mouse_window_x - 13, mouse_window_y - 13); if (mouse_window_buttons & 0b0001) { - djui_image_set_image(sMouseCursor, texture_hand_closed, 32, 32); + djui_image_set_image(sMouseCursor, texture_hand_closed, 32, 32, 16); } else { - djui_image_set_image(sMouseCursor, texture_hand_open, 32, 32); + djui_image_set_image(sMouseCursor, texture_hand_open, 32, 32, 16); } #endif } diff --git a/src/pc/djui/djui.h b/src/pc/djui/djui.h index 75ee0808..e3900398 100644 --- a/src/pc/djui/djui.h +++ b/src/pc/djui/djui.h @@ -4,6 +4,8 @@ #include #include #include +#include "game/game_init.h" +#include "game/ingame_menu.h" #include "djui_types.h" #include "djui_gfx.h" @@ -16,9 +18,9 @@ #include "djui_image.h" #include "djui_button.h" +#include "djui_flow_layout.h" -#include "game/game_init.h" -#include "game/ingame_menu.h" +#include "djui_panel_main.h" extern struct DjuiRoot* gDjuiRoot; diff --git a/src/pc/djui/djui_base.c b/src/pc/djui/djui_base.c index 9c741833..5ecfc534 100644 --- a/src/pc/djui/djui_base.c +++ b/src/pc/djui/djui_base.c @@ -1,7 +1,7 @@ #include #include "djui.h" -//////////////// + //////////////// // properties // //////////////// @@ -121,6 +121,9 @@ void djui_base_compute(struct DjuiBase* base) { f32 width = (base->width.type == DJUI_SVT_RELATIVE) ? parent->comp.width * base->width.value : base->width.value; f32 height = (base->height.type == DJUI_SVT_RELATIVE) ? parent->comp.height * base->height.value : base->height.value; + width = (base->width.type == DJUI_SVT_ASPECT_RATIO) ? height * base->width.value : width; + height = (base->height.type == DJUI_SVT_ASPECT_RATIO) ? width * base->height.value : height; + // horizontal alignment if (base->hAlign == DJUI_HALIGN_CENTER) { x += (parent->comp.width - width) / 2.0f; @@ -252,6 +255,10 @@ static void djui_base_render_border(struct DjuiBase* base) { void djui_base_render(struct DjuiBase* base) { if (!base->visible) { return; } + if (base->on_render_pre != NULL) { + base->on_render_pre(base); + } + struct DjuiBaseRect* comp = &base->comp; struct DjuiBaseRect* clip = &base->clip; @@ -277,6 +284,11 @@ void djui_base_render(struct DjuiBase* base) { struct DjuiBaseChild* child = base->child; while (child != NULL) { djui_base_render(child->base); + + if (base->on_child_render != NULL) { + base->on_child_render(base, child->base); + } + child = child->next; } } diff --git a/src/pc/djui/djui_base.h b/src/pc/djui/djui_base.h index ff7fe906..d2fc592d 100644 --- a/src/pc/djui/djui_base.h +++ b/src/pc/djui/djui_base.h @@ -41,6 +41,8 @@ struct DjuiBase { struct DjuiBaseRect comp; struct DjuiBaseRect clip; struct DjuiInteractable* interactable; + void (*on_child_render)(struct DjuiBase*, struct DjuiBase*); + void (*on_render_pre)(struct DjuiBase*); void (*render)(struct DjuiBase*); void (*destroy)(struct DjuiBase*); }; diff --git a/src/pc/djui/djui_flow_layout.c b/src/pc/djui/djui_flow_layout.c new file mode 100644 index 00000000..da886ec8 --- /dev/null +++ b/src/pc/djui/djui_flow_layout.c @@ -0,0 +1,61 @@ +#include "djui.h" +#include + + //////////////// + // properties // +//////////////// + +void djui_flow_layout_set_flow_direction(struct DjuiFlowLayout* layout, enum DjuiFlowDirection flowDirection) { + layout->flowDirection = flowDirection; +} + +void djui_flow_layout_set_margin(struct DjuiFlowLayout* layout, f32 margin) { + layout->margin.value = margin; +} + +void djui_flow_layout_set_margin_type(struct DjuiFlowLayout* layout, enum DjuiScreenValueType marginType) { + layout->margin.type = marginType; +} + + //////////// + // events // +//////////// + +static void djui_flow_layout_on_child_render(struct DjuiBase* base, struct DjuiBase* child) { + struct DjuiFlowLayout* layout = (struct DjuiFlowLayout*)base; + switch (layout->flowDirection) { + case DJUI_FLOW_DIR_DOWN: + base->comp.y += (child->comp.height + layout->margin.value); + base->comp.height -= (child->comp.height + layout->margin.value); + break; + case DJUI_FLOW_DIR_UP: + base->comp.height -= (child->comp.height + layout->margin.value); + break; + case DJUI_FLOW_DIR_RIGHT: + base->comp.x += (child->comp.width + layout->margin.value); + base->comp.width -= (child->comp.width + layout->margin.value); + break; + case DJUI_FLOW_DIR_LEFT: + base->comp.width -= (child->comp.width + layout->margin.value); + break; + } +} + +static void djui_flow_layout_destroy(struct DjuiBase* base) { + struct DjuiFlowLayout* layout = (struct DjuiFlowLayout*)base; + free(layout); +} + +struct DjuiFlowLayout* djui_flow_layout_create(struct DjuiBase* parent) { + struct DjuiFlowLayout* layout = malloc(sizeof(struct DjuiFlowLayout)); + struct DjuiBase* base = &layout->base; + + djui_base_init(parent, base, djui_rect_render, djui_flow_layout_destroy); + djui_base_set_size(base, 256, 512); + + djui_flow_layout_set_flow_direction(layout, DJUI_FLOW_DIR_DOWN); + djui_flow_layout_set_margin(layout, 8); + + layout->base.on_child_render = djui_flow_layout_on_child_render; + return layout; +} diff --git a/src/pc/djui/djui_flow_layout.h b/src/pc/djui/djui_flow_layout.h new file mode 100644 index 00000000..733f7b58 --- /dev/null +++ b/src/pc/djui/djui_flow_layout.h @@ -0,0 +1,15 @@ +#pragma once +#include "djui.h" + +#pragma pack(1) +struct DjuiFlowLayout { + struct DjuiBase base; + enum DjuiFlowDirection flowDirection; + struct DjuiScreenValue margin; +}; + +void djui_flow_layout_set_flow_direction(struct DjuiFlowLayout* layout, enum DjuiFlowDirection flowDirection); +void djui_flow_layout_set_margin(struct DjuiFlowLayout* layout, f32 margin); +void djui_flow_layout_set_margin_type(struct DjuiFlowLayout* layout, enum DjuiScreenValueType marginType); + +struct DjuiFlowLayout* djui_flow_layout_create(struct DjuiBase* parent); diff --git a/src/pc/djui/djui_gbi.h b/src/pc/djui/djui_gbi.h index fa5c5e14..d718f929 100644 --- a/src/pc/djui/djui_gbi.h +++ b/src/pc/djui/djui_gbi.h @@ -12,11 +12,11 @@ _g->words.w1 = _SHIFTL(x2, 16, 8) | _SHIFTL(y2, 8, 8); \ } -#define gSetOverrideDjui(pkt, cmd, texture, w, h) \ +#define gSetOverrideDjui(pkt, cmd, texture, w, h, bitSize) \ { \ Gfx *_g = (Gfx *)(pkt); \ _g->words.w0 = _SHIFTL(cmd, 24, 8) | _SHIFTL(w, 16, 8) | \ - _SHIFTL(h, 8, 8); \ + _SHIFTL(h, 8, 8) | _SHIFTL(bitSize, 0, 8); \ _g->words.w1 = (uintptr_t)(texture); \ } @@ -25,5 +25,5 @@ _SHIFTL(G_EXECUTE_DJUI, 24, 8), (unsigned int)(word) \ }} -#define gDPSetTextureClippingDjui(pkt, rot, x1, y1, x2, y2) gSetClippingDjui(pkt, G_TEXCLIP_DJUI, rot, x1, y1, x2, y2) -#define gDPSetTextureOverrideDjui(pkt, texture, w, h) gSetOverrideDjui(pkt, G_TEXOVERRIDE_DJUI, texture, w, h) +#define gDPSetTextureClippingDjui(pkt, rot, x1, y1, x2, y2) gSetClippingDjui(pkt, G_TEXCLIP_DJUI, rot, x1, y1, x2, y2) +#define gDPSetTextureOverrideDjui(pkt, texture, w, h, bitSize) gSetOverrideDjui(pkt, G_TEXOVERRIDE_DJUI, texture, w, h, bitSize) diff --git a/src/pc/djui/djui_gfx.c b/src/pc/djui/djui_gfx.c index 4804f8ef..e31060dd 100644 --- a/src/pc/djui/djui_gfx.c +++ b/src/pc/djui/djui_gfx.c @@ -94,8 +94,24 @@ const Gfx dl_djui_image[] = { gsSPEndDisplayList(), }; -void djui_gfx_render_texture(const u8* texture, u16 w, u16 h) { - gDPSetTextureOverrideDjui(gDisplayListHead++, texture, w, h); +static u8 djui_gfx_power_of_two(u32 value) { + switch (value) { + case 2: return 1; + case 4: return 2; + case 8: return 3; + case 16: return 4; + case 32: return 5; + case 64: return 6; + case 128: return 7; + case 256: return 8; + case 512: return 9; + case 1024: return 10; + default: return 11; + } +} + +void djui_gfx_render_texture(const u8* texture, u32 w, u32 h, u32 bitSize) { + gDPSetTextureOverrideDjui(gDisplayListHead++, texture, djui_gfx_power_of_two(w), djui_gfx_power_of_two(h), bitSize); gSPDisplayList(gDisplayListHead++, dl_djui_image); } diff --git a/src/pc/djui/djui_gfx.h b/src/pc/djui/djui_gfx.h index d6583fe0..e9184739 100644 --- a/src/pc/djui/djui_gfx.h +++ b/src/pc/djui/djui_gfx.h @@ -11,7 +11,7 @@ extern const Gfx dl_djui_img_begin[]; extern const Gfx dl_djui_img_end[]; void djui_gfx_render_char(u8 c); -void djui_gfx_render_texture(const u8* texture, u16 w, u16 h); +void djui_gfx_render_texture(const u8* texture, u32 w, u32 h, u32 bitSize); void djui_gfx_position_translate(f32* x, f32* y); void djui_gfx_scale_translate(f32* width, f32* height); diff --git a/src/pc/djui/djui_image.c b/src/pc/djui/djui_image.c index cc43d4af..4de317ba 100644 --- a/src/pc/djui/djui_image.c +++ b/src/pc/djui/djui_image.c @@ -6,10 +6,11 @@ // properties // //////////////// -void djui_image_set_image(struct DjuiImage* image, const u8* texture, u16 textureWidth, u16 textureHeight) { +void djui_image_set_image(struct DjuiImage* image, const u8* texture, u16 textureWidth, u16 textureHeight, u16 textureBitSize) { image->texture = texture; image->textureWidth = textureWidth; image->textureHeight = textureHeight; + image->textureBitSize = textureBitSize; } //////////// @@ -36,7 +37,7 @@ static void djui_image_render(struct DjuiBase* base) { // render if (!djui_gfx_add_clipping(base)) { gDPSetEnvColor(gDisplayListHead++, base->color.r, base->color.g, base->color.b, base->color.a); - djui_gfx_render_texture(image->texture, image->textureWidth, image->textureHeight); + djui_gfx_render_texture(image->texture, image->textureWidth, image->textureHeight, image->textureBitSize); } gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); @@ -47,13 +48,13 @@ static void djui_image_destroy(struct DjuiBase* base) { free(image); } -struct DjuiImage* djui_image_create(struct DjuiBase* parent, const u8* texture, u16 textureWidth, u16 textureHeight) { +struct DjuiImage* djui_image_create(struct DjuiBase* parent, const u8* texture, u16 textureWidth, u16 textureHeight, u16 textureBitSize) { struct DjuiImage* image = malloc(sizeof(struct DjuiImage)); struct DjuiBase* base = &image->base; djui_base_init(parent, base, djui_image_render, djui_image_destroy); - djui_image_set_image(image, texture, textureWidth, textureHeight); + djui_image_set_image(image, texture, textureWidth, textureHeight, textureBitSize); return image; } diff --git a/src/pc/djui/djui_image.h b/src/pc/djui/djui_image.h index 9bdecc19..0e640cdd 100644 --- a/src/pc/djui/djui_image.h +++ b/src/pc/djui/djui_image.h @@ -7,8 +7,9 @@ struct DjuiImage { const u8* texture; u16 textureWidth; u16 textureHeight; + u16 textureBitSize; }; -void djui_image_set_image(struct DjuiImage* image, const u8* texture, u16 textureWidth, u16 textureHeight); +void djui_image_set_image(struct DjuiImage* image, const u8* texture, u16 textureWidth, u16 textureHeight, u16 textureBitSize); -struct DjuiImage* djui_image_create(struct DjuiBase* parent, const u8* texture, u16 textureWidth, u16 textureHeight); +struct DjuiImage* djui_image_create(struct DjuiBase* parent, const u8* texture, u16 textureWidth, u16 textureHeight, u16 textureBitSize); diff --git a/src/pc/djui/djui_panel_main.c b/src/pc/djui/djui_panel_main.c new file mode 100644 index 00000000..b423e932 --- /dev/null +++ b/src/pc/djui/djui_panel_main.c @@ -0,0 +1,70 @@ +#include "djui.h" + +ALIGNED8 static u8 texture_title[] = { +#include "textures/segment2/custom_title.rgba32.inc.c" +}; + +struct DjuiRect* sTitleContainer = NULL; +struct DjuiFlowLayout* sButtonContainer = NULL; +struct DjuiText* sVersionText = NULL; + +static void djui_panel_main_render_pre(struct DjuiBase* base) { + sTitleContainer->base.height.value = sButtonContainer->base.clip.y - sTitleContainer->base.clip.y; + sVersionText->base.height.value = sTitleContainer->base.height.value; +} + +void djui_panel_main_create(void) { + struct DjuiRect* menuContainer = djui_rect_create(&gDjuiRoot->base); + djui_base_set_size_type(&menuContainer->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_RELATIVE); + djui_base_set_size(&menuContainer->base, 512.0f + (16 * 2.0f), 1.0f); + djui_base_set_color(&menuContainer->base, 0, 0, 0, 230); + djui_base_set_border_color(&menuContainer->base, 0, 0, 0, 200); + djui_base_set_border_width(&menuContainer->base, 8); + djui_base_set_padding(&menuContainer->base, 16, 16, 16, 16); + { + sButtonContainer = djui_flow_layout_create(&menuContainer->base); + djui_base_set_alignment(&sButtonContainer->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + djui_base_set_size_type(&sButtonContainer->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&sButtonContainer->base, 1.0f, 292); + djui_base_set_color(&sButtonContainer->base, 0, 0, 0, 0); + djui_flow_layout_set_margin(sButtonContainer, 16); + djui_flow_layout_set_flow_direction(sButtonContainer, DJUI_FLOW_DIR_DOWN); + { + struct DjuiButton* button1 = djui_button_create(&sButtonContainer->base, "Host"); + djui_base_set_size_type(&button1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button1->base, 1.0f, 64); + + struct DjuiButton* button2 = djui_button_create(&sButtonContainer->base, "Join"); + djui_base_set_size_type(&button2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button2->base, 1.0f, 64); + + struct DjuiButton* button3 = djui_button_create(&sButtonContainer->base, "Options"); + djui_base_set_size_type(&button3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button3->base, 1.0f, 64); + + struct DjuiButton* button4 = djui_button_create(&sButtonContainer->base, "Quit"); + djui_base_set_size_type(&button4->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button4->base, 1.0f, 64); + } + + sTitleContainer = djui_rect_create(&menuContainer->base); + djui_base_set_size_type(&sTitleContainer->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&sTitleContainer->base, 1.0f, 1.0f); + djui_base_set_color(&sTitleContainer->base, 0, 0, 0, 0); + sTitleContainer->base.on_render_pre = djui_panel_main_render_pre; + { + struct DjuiImage* title = djui_image_create(&sTitleContainer->base, texture_title, 512, 128, 32); + djui_base_set_size(&title->base, 1.0f, 128.0f / 512.0f); + djui_base_set_size_type(&title->base, DJUI_SVT_RELATIVE, DJUI_SVT_ASPECT_RATIO); + djui_base_set_alignment(&title->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + } + + sVersionText = djui_text_create(&menuContainer->base, "version - unst 5"); + djui_base_set_alignment(&sVersionText->base, DJUI_HALIGN_LEFT, DJUI_VALIGN_BOTTOM); + djui_base_set_size_type(&sVersionText->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&sVersionText->base, 1.0f, 1.0f); + djui_base_set_color(&sVersionText->base, 50, 50, 50, 255); + djui_text_set_alignment(sVersionText, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + } + +} diff --git a/src/pc/djui/djui_panel_main.h b/src/pc/djui/djui_panel_main.h new file mode 100644 index 00000000..495ad48b --- /dev/null +++ b/src/pc/djui/djui_panel_main.h @@ -0,0 +1,4 @@ +#pragma once +#include "djui.h" + +void djui_panel_main_create(void); diff --git a/src/pc/djui/djui_rect.c b/src/pc/djui/djui_rect.c index 595c96ff..a496a5e2 100644 --- a/src/pc/djui/djui_rect.c +++ b/src/pc/djui/djui_rect.c @@ -4,7 +4,7 @@ // events // //////////// -static void djui_rect_render(struct DjuiBase* base) { +void djui_rect_render(struct DjuiBase* base) { struct DjuiBaseRect* clip = &base->clip; // translate position diff --git a/src/pc/djui/djui_rect.h b/src/pc/djui/djui_rect.h index 2d958567..3b8f7fcd 100644 --- a/src/pc/djui/djui_rect.h +++ b/src/pc/djui/djui_rect.h @@ -6,4 +6,5 @@ struct DjuiRect { struct DjuiBase base; }; +void djui_rect_render(struct DjuiBase* base); struct DjuiRect* djui_rect_create(struct DjuiBase* parent); diff --git a/src/pc/djui/djui_types.h b/src/pc/djui/djui_types.h index 9d49717f..3c5bcbdb 100644 --- a/src/pc/djui/djui_types.h +++ b/src/pc/djui/djui_types.h @@ -9,7 +9,8 @@ struct DjuiColor { u8 a; }; -enum DjuiScreenValueType { DJUI_SVT_ABSOLUTE, DJUI_SVT_RELATIVE }; +enum DjuiScreenValueType { DJUI_SVT_ABSOLUTE, DJUI_SVT_RELATIVE, DJUI_SVT_ASPECT_RATIO }; +enum DjuiFlowDirection { DJUI_FLOW_DIR_DOWN, DJUI_FLOW_DIR_UP, DJUI_FLOW_DIR_RIGHT, DJUI_FLOW_DIR_LEFT }; #pragma pack(1) struct DjuiScreenValue { diff --git a/src/pc/gfx/gfx_pc.c b/src/pc/gfx/gfx_pc.c index 7aece14b..5e83bee2 100644 --- a/src/pc/gfx/gfx_pc.c +++ b/src/pc/gfx/gfx_pc.c @@ -1862,17 +1862,9 @@ static uint8_t sDjuiClipY2 = 0; static bool sDjuiOverride = false; static void* sDjuiOverrideTexture = NULL; -static uint8_t sDjuiOverrideW = 0; -static uint8_t sDjuiOverrideH = 0; - -static void djui_gfx_dp_set_clipping(bool rotatedUV, uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2) { - sDjuiClipRotatedUV = rotatedUV; - sDjuiClipX1 = x1; - sDjuiClipY1 = y1; - sDjuiClipX2 = x2; - sDjuiClipY2 = y2; - sDjuiClip = true; -} +static uint32_t sDjuiOverrideW = 0; +static uint32_t sDjuiOverrideH = 0; +static uint32_t sDjuiOverrideB = 0; static void djui_gfx_dp_execute_clipping(void) { if (!sDjuiClip) { return; } @@ -1949,23 +1941,37 @@ static void djui_gfx_dp_execute_clipping(void) { } } -static void djui_gfx_dp_set_override(void* texture, uint8_t w, uint8_t h) { - sDjuiOverrideTexture = texture; - sDjuiOverrideW = w; - sDjuiOverrideH = h; - sDjuiOverride = (texture != NULL); -} - static void djui_gfx_dp_execute_override(void) { if (!sDjuiOverride) { return; } sDjuiOverride = false; + // gsDPSetTextureImage + uint8_t sizeLoadBlock = (sDjuiOverrideB == 32) ? 3 : 2; rdp.texture_to_load.addr = sDjuiOverrideTexture; + rdp.texture_to_load.siz = sizeLoadBlock; + + // gsDPSetTile + rdp.texture_tile.siz = sizeLoadBlock; + + // gsDPLoadBlock + uint32_t wordSizeShift = (sDjuiOverrideB == 32) ? 2 : 1; + uint32_t lrs = (sDjuiOverrideW * sDjuiOverrideH) - 1; + uint32_t sizeBytes = (lrs + 1) << wordSizeShift; + rdp.loaded_texture[rdp.texture_to_load.tile_number].size_bytes = sizeBytes; rdp.loaded_texture[rdp.texture_to_load.tile_number].addr = rdp.texture_to_load.addr; + rdp.textures_changed[rdp.texture_to_load.tile_number] = true; + + // gsDPSetTile uint32_t line = (((sDjuiOverrideW * 2) + 7) >> 3); rdp.texture_tile.line_size_bytes = line * 8; - uint32_t lrs = (sDjuiOverrideW * sDjuiOverrideH) - 1; - rdp.loaded_texture[rdp.texture_to_load.tile_number].size_bytes = (lrs + 1) << 1; + + // gsDPSetTileSize + /*rdp.texture_tile.uls = 0; + rdp.texture_tile.ult = 0; + rdp.texture_tile.lrs = (sDjuiOverrideW - 1) << G_TEXTURE_IMAGE_FRAC; + rdp.texture_tile.lrt = (sDjuiOverrideH - 1) << G_TEXTURE_IMAGE_FRAC;*/ + rdp.textures_changed[0] = true; + rdp.textures_changed[1] = true; } static void djui_gfx_dp_execute_djui(uint32_t opcode) { @@ -1975,6 +1981,23 @@ static void djui_gfx_dp_execute_djui(uint32_t opcode) { } } +static void djui_gfx_dp_set_clipping(bool rotatedUV, uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2) { + sDjuiClipRotatedUV = rotatedUV; + sDjuiClipX1 = x1; + sDjuiClipY1 = y1; + sDjuiClipX2 = x2; + sDjuiClipY2 = y2; + sDjuiClip = true; +} + +static void djui_gfx_dp_set_override(void* texture, uint32_t w, uint32_t h, uint32_t b) { + sDjuiOverrideTexture = texture; + sDjuiOverrideW = w; + sDjuiOverrideH = h; + sDjuiOverrideB = b; + sDjuiOverride = (texture != NULL); +} + void djui_gfx_run_dl(Gfx* cmd) { uint32_t opcode = cmd->words.w0 >> 24; switch (opcode) { @@ -1982,7 +2005,7 @@ void djui_gfx_run_dl(Gfx* cmd) { djui_gfx_dp_set_clipping(C0(0, 8), C0(16, 8), C0(8, 8), C1(16, 8), C1(8, 8)); break; case G_TEXOVERRIDE_DJUI: - djui_gfx_dp_set_override(seg_addr(cmd->words.w1), C0(16, 8), C0(8, 8)); + djui_gfx_dp_set_override(seg_addr(cmd->words.w1), 1 << C0(16, 8), 1 << C0(8, 8), C0(0, 8)); break; case G_EXECUTE_DJUI: djui_gfx_dp_execute_djui(cmd->words.w1); diff --git a/textures/segment2/custom_title.rgba32.png b/textures/segment2/custom_title.rgba32.png new file mode 100644 index 00000000..43002474 Binary files /dev/null and b/textures/segment2/custom_title.rgba32.png differ