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