Move base screen code into gui.c

This commit is contained in:
UnknownShadow200 2020-08-25 22:03:17 +10:00
parent 4e58d992b1
commit face3d87b1
4 changed files with 121 additions and 114 deletions

141
src/Gui.c
View File

@ -20,37 +20,6 @@ struct ChatScreen* Gui_Chat;
struct Screen* Gui_Screens[GUI_MAX_SCREENS];
static cc_uint8 priorities[GUI_MAX_SCREENS];
void Widget_SetLocation(void* widget, cc_uint8 horAnchor, cc_uint8 verAnchor, int xOffset, int yOffset) {
struct Widget* w = (struct Widget*)widget;
w->horAnchor = horAnchor; w->verAnchor = verAnchor;
w->xOffset = Display_ScaleX(xOffset);
w->yOffset = Display_ScaleY(yOffset);
Widget_Layout(w);
}
void Widget_CalcPosition(void* widget) {
struct Widget* w = (struct Widget*)widget;
w->x = Gui_CalcPos(w->horAnchor, w->xOffset, w->width , WindowInfo.Width );
w->y = Gui_CalcPos(w->verAnchor, w->yOffset, w->height, WindowInfo.Height);
}
void Widget_Reset(void* widget) {
struct Widget* w = (struct Widget*)widget;
w->active = false;
w->disabled = false;
w->x = 0; w->y = 0;
w->width = 0; w->height = 0;
w->horAnchor = ANCHOR_MIN;
w->verAnchor = ANCHOR_MIN;
w->xOffset = 0; w->yOffset = 0;
w->MenuClick = NULL;
}
int Widget_Contains(void* widget, int x, int y) {
struct Widget* w = (struct Widget*)widget;
return Gui_Contains(w->x, w->y, w->width, w->height, x, y);
}
/*########################################################################################################################*
*----------------------------------------------------------Gui------------------------------------------------------------*
@ -359,6 +328,116 @@ void TextAtlas_AddInt(struct TextAtlas* atlas, int value, struct VertexTextured*
}
/*########################################################################################################################*
*-------------------------------------------------------Widget base-------------------------------------------------------*
*#########################################################################################################################*/
void Widget_SetLocation(void* widget, cc_uint8 horAnchor, cc_uint8 verAnchor, int xOffset, int yOffset) {
struct Widget* w = (struct Widget*)widget;
w->horAnchor = horAnchor; w->verAnchor = verAnchor;
w->xOffset = Display_ScaleX(xOffset);
w->yOffset = Display_ScaleY(yOffset);
Widget_Layout(w);
}
void Widget_CalcPosition(void* widget) {
struct Widget* w = (struct Widget*)widget;
w->x = Gui_CalcPos(w->horAnchor, w->xOffset, w->width , WindowInfo.Width );
w->y = Gui_CalcPos(w->verAnchor, w->yOffset, w->height, WindowInfo.Height);
}
void Widget_Reset(void* widget) {
struct Widget* w = (struct Widget*)widget;
w->active = false;
w->disabled = false;
w->x = 0; w->y = 0;
w->width = 0; w->height = 0;
w->horAnchor = ANCHOR_MIN;
w->verAnchor = ANCHOR_MIN;
w->xOffset = 0; w->yOffset = 0;
w->MenuClick = NULL;
}
int Widget_Contains(void* widget, int x, int y) {
struct Widget* w = (struct Widget*)widget;
return Gui_Contains(w->x, w->y, w->width, w->height, x, y);
}
/*########################################################################################################################*
*-------------------------------------------------------Screen base-------------------------------------------------------*
*#########################################################################################################################*/
void Screen_RenderWidgets(void* screen, double delta) {
struct Screen* s = (struct Screen*)screen;
struct Widget** widgets = s->widgets;
int i;
for (i = 0; i < s->numWidgets; i++) {
if (!widgets[i]) continue;
Elem_Render(widgets[i], delta);
}
}
void Screen_Render2Widgets(void* screen, double delta) {
struct Screen* s = (struct Screen*)screen;
struct Widget** widgets = s->widgets;
int i, offset = 0;
Gfx_SetVertexFormat(VERTEX_FORMAT_TEXTURED);
Gfx_BindDynamicVb(s->vb);
for (i = 0; i < s->numWidgets; i++) {
if (!widgets[i]) continue;
offset = Widget_Render2(widgets[i], offset);
}
}
void Screen_Layout(void* screen) {
struct Screen* s = (struct Screen*)screen;
struct Widget** widgets = s->widgets;
int i;
for (i = 0; i < s->numWidgets; i++) {
if (!widgets[i]) continue;
Widget_Layout(widgets[i]);
}
}
void Screen_ContextLost(void* screen) {
struct Screen* s = (struct Screen*)screen;
struct Widget** widgets = s->widgets;
int i;
Gfx_DeleteDynamicVb(&s->vb);
for (i = 0; i < s->numWidgets; i++) {
if (!widgets[i]) continue;
Elem_Free(widgets[i]);
}
}
void Screen_CreateVb(void* screen) {
struct Screen* s = (struct Screen*)screen;
s->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_TEXTURED, s->maxVertices);
}
void Screen_BuildMesh(void* screen) {
struct Screen* s = (struct Screen*)screen;
struct Widget** widgets = s->widgets;
struct VertexTextured* data;
struct VertexTextured** ptr;
int i;
data = (struct VertexTextured*)Gfx_LockDynamicVb(s->vb,
VERTEX_FORMAT_TEXTURED, s->maxVertices);
ptr = &data;
for (i = 0; i < s->numWidgets; i++) {
if (!widgets[i]) continue;
Widget_BuildMesh(widgets[i], ptr);
}
Gfx_UnlockDynamicVb(s->vb);
}
/*########################################################################################################################*
*------------------------------------------------------Gui component------------------------------------------------------*
*#########################################################################################################################*/

View File

@ -94,6 +94,17 @@ struct ScreenVTABLE {
/* Represents a container of widgets and other 2D elements. May cover entire window. */
struct Screen { Screen_Body };
/* Calls Elem_Render on each widget in the screen. */
void Screen_RenderWidgets(void* screen, double delta);
/* Calls Widget_Render2 on each widget in the screen. */
void Screen_Render2Widgets(void* screen, double delta);
/* Calls Widget_Layout on each widget in the screen. */
void Screen_Layout(void* screen);
/* Calls Widget_Free on each widget in the screen. */
/* Also deletes the screen's vb. */
void Screen_ContextLost(void* screen);
void Screen_CreateVb(void* screen);
void Screen_BuildMesh(void* screen);
typedef void (*Widget_LeftClick)(void* screen, void* widget);
struct WidgetVTABLE {

View File

@ -51,77 +51,6 @@ CC_NOINLINE static cc_bool IsOnlyChatActive(void) {
return true;
}
void Screen_RenderWidgets(void* screen, double delta) {
struct Screen* s = (struct Screen*)screen;
struct Widget** widgets = s->widgets;
int i;
for (i = 0; i < s->numWidgets; i++) {
if (!widgets[i]) continue;
Elem_Render(widgets[i], delta);
}
}
void Screen_Render2Widgets(void* screen, double delta) {
struct Screen* s = (struct Screen*)screen;
struct Widget** widgets = s->widgets;
int i, offset = 0;
Gfx_SetVertexFormat(VERTEX_FORMAT_TEXTURED);
Gfx_BindDynamicVb(s->vb);
for (i = 0; i < s->numWidgets; i++) {
if (!widgets[i]) continue;
offset = Widget_Render2(widgets[i], offset);
}
}
void Screen_Layout(void* screen) {
struct Screen* s = (struct Screen*)screen;
struct Widget** widgets = s->widgets;
int i;
for (i = 0; i < s->numWidgets; i++) {
if (!widgets[i]) continue;
Widget_Layout(widgets[i]);
}
}
void Screen_ContextLost(void* screen) {
struct Screen* s = (struct Screen*)screen;
struct Widget** widgets = s->widgets;
int i;
Gfx_DeleteDynamicVb(&s->vb);
for (i = 0; i < s->numWidgets; i++) {
if (!widgets[i]) continue;
Elem_Free(widgets[i]);
}
}
void Screen_CreateVb(void* screen) {
struct Screen* s = (struct Screen*)screen;
s->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_TEXTURED, s->maxVertices);
}
void Screen_BuildMesh(void* screen) {
struct Screen* s = (struct Screen*)screen;
struct Widget** widgets = s->widgets;
struct VertexTextured* data;
struct VertexTextured** ptr;
int i;
data = (struct VertexTextured*)Gfx_LockDynamicVb(s->vb,
VERTEX_FORMAT_TEXTURED, s->maxVertices);
ptr = &data;
for (i = 0; i < s->numWidgets; i++) {
if (!widgets[i]) continue;
Widget_BuildMesh(widgets[i], ptr);
}
Gfx_UnlockDynamicVb(s->vb);
}
/*########################################################################################################################*
*--------------------------------------------------------HUDScreen--------------------------------------------------------*

View File

@ -25,18 +25,6 @@ void Screen_NullFunc(void* screen);
void Screen_NullUpdate(void* screen, double delta);
int Screen_InputDown(void* screen, int key);
/* Calls Elem_Render on each widget in the screen. */
void Screen_RenderWidgets(void* screen, double delta);
/* Calls Widget_Render2 on each widget in the screen. */
void Screen_Render2Widgets(void* screen, double delta);
/* Calls Widget_Layout on each widget in the screen. */
void Screen_Layout(void* screen);
/* Calls Widget_Free on each widget in the screen. */
/* Also deletes the screen's vb. */
void Screen_ContextLost(void* screen);
void Screen_CreateVb(void* screen);
void Screen_BuildMesh(void* screen);
void InventoryScreen_Show(void);
void HUDScreen_Show(void);
void LoadingScreen_Show(const String* title, const String* message);