Move TouchScreen to new rendering way

This commit is contained in:
UnknownShadow200 2020-01-19 09:57:17 +11:00
parent b2d2ba2974
commit cd1d38c83c
3 changed files with 58 additions and 54 deletions

View File

@ -7,6 +7,7 @@
#include "Gui.h" #include "Gui.h"
#include "Entity.h" #include "Entity.h"
#include "Input.h" #include "Input.h"
#include "Event.h"
struct _CameraData Camera; struct _CameraData Camera;
static struct PickedPos cameraClipPos; static struct PickedPos cameraClipPos;

View File

@ -1,6 +1,5 @@
#ifndef CC_GUI_H #ifndef CC_GUI_H
#define CC_GUI_H #define CC_GUI_H
#include "Event.h"
#include "VertexStructs.h" #include "VertexStructs.h"
/* Describes and manages 2D GUI elements on screen. /* Describes and manages 2D GUI elements on screen.
Copyright 2014-2019 ClassiCube | Licensed under BSD-3 Copyright 2014-2019 ClassiCube | Licensed under BSD-3

View File

@ -702,6 +702,7 @@ static void ChatScreen_Layout(void* screen) {
if (s->showingList) Widget_Layout(&s->playerList); if (s->showingList) Widget_Layout(&s->playerList);
#ifdef CC_BUILD_TOUCH #ifdef CC_BUILD_TOUCH
if (!Input_TouchMode) return;
Widget_Layout(&s->send); Widget_Layout(&s->send);
Widget_Layout(&s->cancel); Widget_Layout(&s->cancel);
#endif #endif
@ -1553,11 +1554,18 @@ void DisconnectScreen_Show(const String* title, const String* message) {
#ifdef CC_BUILD_TOUCH #ifdef CC_BUILD_TOUCH
static struct TouchScreen { static struct TouchScreen {
Screen_Body Screen_Body
int numButtons, layout; cc_uint8 binds[7];
cc_uint8 binds[10];
struct FontDesc font; struct FontDesc font;
struct ButtonWidget buttons[10]; struct ButtonWidget btns[7];
} TouchScreen_Instance; } TouchScreen;
static struct Widget* touch_widgets[7] = {
(struct Widget*)&TouchScreen.btns[0], (struct Widget*)&TouchScreen.btns[1],
(struct Widget*)&TouchScreen.btns[2], (struct Widget*)&TouchScreen.btns[3],
(struct Widget*)&TouchScreen.btns[4], (struct Widget*)&TouchScreen.btns[5],
(struct Widget*)&TouchScreen.btns[6],
};
#define TOUCH_MAX_VERTICES (7 * BUTTONWIDGET_MAX)
static const struct TouchBindDesc { static const struct TouchBindDesc {
const char* text; const char* text;
@ -1575,17 +1583,8 @@ static const struct TouchBindDesc {
static void TouchScreen_ContextLost(void* screen) { static void TouchScreen_ContextLost(void* screen) {
struct TouchScreen* s = (struct TouchScreen*)screen; struct TouchScreen* s = (struct TouchScreen*)screen;
int i;
Font_Free(&s->font); Font_Free(&s->font);
Screen_ContextLost(screen);
for (i = 0; i < s->numButtons; i++) {
Elem_Free(&s->buttons[i]);
}
}
CC_NOINLINE static void TouchScreen_Set(struct TouchScreen* s, int i, const char* text, KeyBind bind) {
ButtonWidget_SetConst(&s->buttons[i], text, &s->font);
s->binds[i] = bind;
} }
static void TouchScreen_ModeClick(void* s, void* w) { Input_Placing = !Input_Placing; } static void TouchScreen_ModeClick(void* s, void* w) { Input_Placing = !Input_Placing; }
@ -1594,64 +1593,44 @@ static void TouchScreen_MoreClick(void* s, void* w) { TouchMoreOverlay_Show(); }
static void TouchScreen_ContextRecreated(void* screen) { static void TouchScreen_ContextRecreated(void* screen) {
struct TouchScreen* s = (struct TouchScreen*)screen; struct TouchScreen* s = (struct TouchScreen*)screen;
const struct TouchBindDesc* desc; const struct TouchBindDesc* desc;
int i, offset = 0; int i;
Drawer2D_MakeFont(&s->font, 16, FONT_STYLE_BOLD); Drawer2D_MakeFont(&s->font, 16, FONT_STYLE_BOLD);
s->layout = Gui_GetInputGrab() == NULL; s->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FT2FC4B, TOUCH_MAX_VERTICES);
s->numButtons = s->layout ? 7 : 0;
for (i = 0; i < s->numButtons; i++) { for (i = 0; i < s->numWidgets; i++) {
desc = &touchDescs[i + offset]; desc = &touchDescs[i];
ButtonWidget_Make(&s->buttons[i], desc->width, NULL, ANCHOR_MAX, ANCHOR_MIN, ButtonWidget_SetConst(&s->btns[i], desc->text, &s->font);
desc->xOffset, desc->yOffset);
ButtonWidget_SetConst(&s->buttons[i], desc->text, &s->font);
s->binds[i] = desc->bind;
} }
/* TODO: Mode should display 'Place' or 'Delete' */ /* TODO: Mode should display 'Place' or 'Delete' */
/* TODO: this is pretty nasty hacky. rewrite! */ /* TODO: this is pretty nasty hacky. rewrite! */
s->buttons[5].MenuClick = TouchScreen_ModeClick;
s->buttons[6].MenuClick = TouchScreen_MoreClick;
} }
static void TouchScreen_Render(void* screen, double delta) { static void TouchScreen_Render(void* screen, double delta) {
struct TouchScreen* s = (struct TouchScreen*)screen; struct TouchScreen* s = (struct TouchScreen*)screen;
int i; if (Gui_GetInputGrab()) return;
Gfx_SetTexturing(true); Gfx_SetTexturing(true);
for (i = 0; i < s->numButtons; i++) { Screen_Render2Widgets(screen, delta);
Elem_Render(&s->buttons[i], delta);
}
Gfx_SetTexturing(false); Gfx_SetTexturing(false);
i = Gui_GetInputGrab() == NULL;
/* TODO: AWFUL AWFUL HACK */
/* use guiEvents instead */
if (i != s->layout) Gui_Refresh(s);
}
static void TouchScreen_Layout(void* screen) {
struct TouchScreen* s = (struct TouchScreen*)screen;
int i;
for (i = 0; i < s->numButtons; i++) {
Widget_Layout(&s->buttons[i]);
}
} }
static int TouchScreen_PointerDown(void* screen, int id, int x, int y) { static int TouchScreen_PointerDown(void* screen, int id, int x, int y) {
struct TouchScreen* s = (struct TouchScreen*)screen; struct TouchScreen* s = (struct TouchScreen*)screen;
int i; int i;
//Chat_Add1("POINTER DOWN: %i", &id); //Chat_Add1("POINTER DOWN: %i", &id);
if (Gui_GetInputGrab()) return false;
for (i = 0; i < s->numButtons; i++) { for (i = 0; i < s->numWidgets; i++) {
if (!Widget_Contains(&s->buttons[i], x, y)) continue; if (!Widget_Contains(&s->btns[i], x, y)) continue;
if (s->binds[i] < KEYBIND_COUNT) { if (s->binds[i] < KEYBIND_COUNT) {
Input_SetPressed(KeyBinds[s->binds[i]], true); Input_SetPressed(KeyBinds[s->binds[i]], true);
} else { } else {
s->buttons[i].MenuClick(screen, &s->buttons[i]); s->btns[i].MenuClick(screen, &s->btns[i]);
} }
s->buttons[i].active |= id; s->btns[i].active |= id;
return true; return true;
} }
return false; return false;
@ -1662,29 +1641,54 @@ static int TouchScreen_PointerUp(void* screen, int id, int x, int y) {
int i; int i;
//Chat_Add1("POINTER UP: %i", &id); //Chat_Add1("POINTER UP: %i", &id);
for (i = 0; i < s->numButtons; i++) { for (i = 0; i < s->numWidgets; i++) {
if (!(s->buttons[i].active & id)) continue; if (!(s->btns[i].active & id)) continue;
if (s->binds[i] < KEYBIND_COUNT) { if (s->binds[i] < KEYBIND_COUNT) {
Input_SetPressed(KeyBinds[s->binds[i]], false); Input_SetPressed(KeyBinds[s->binds[i]], false);
} }
s->buttons[i].active &= ~id; s->btns[i].active &= ~id;
return true; return true;
} }
return false; return false;
} }
static void TouchScreen_BuildMesh(void* screen) { } static void TouchScreen_BuildMesh(void* screen) {
struct Screen* s = (struct Screen*)screen;
VertexP3fT2fC4b vertices[TOUCH_MAX_VERTICES];
Screen_BuildMesh(screen, vertices);
Gfx_SetDynamicVbData(s->vb, vertices, TOUCH_MAX_VERTICES);
}
static void TouchScreen_Init(void* screen) {
struct TouchScreen* s = (struct TouchScreen*)screen;
const struct TouchBindDesc* desc;
int i;
s->widgets = touch_widgets;
s->numWidgets = Array_Elems(touch_widgets);
for (i = 0; i < s->numWidgets; i++) {
desc = &touchDescs[i];
ButtonWidget_Make(&s->btns[i], desc->width, NULL, ANCHOR_MAX, ANCHOR_MIN,
desc->xOffset, desc->yOffset);
s->binds[i] = desc->bind;
}
s->btns[5].MenuClick = TouchScreen_ModeClick;
s->btns[6].MenuClick = TouchScreen_MoreClick;
}
static const struct ScreenVTABLE TouchScreen_VTABLE = { static const struct ScreenVTABLE TouchScreen_VTABLE = {
Screen_NullFunc, Screen_NullUpdate, Screen_NullFunc, TouchScreen_Init, Screen_NullUpdate, Screen_NullFunc,
TouchScreen_Render, TouchScreen_BuildMesh, TouchScreen_Render, TouchScreen_BuildMesh,
Screen_FInput, Screen_FInput, Screen_FKeyPress, Screen_FText, Screen_FInput, Screen_FInput, Screen_FKeyPress, Screen_FText,
TouchScreen_PointerDown, TouchScreen_PointerUp, Screen_FPointer, Screen_FMouseScroll, TouchScreen_PointerDown, TouchScreen_PointerUp, Screen_FPointer, Screen_FMouseScroll,
TouchScreen_Layout, TouchScreen_ContextLost, TouchScreen_ContextRecreated Screen_Layout, TouchScreen_ContextLost, TouchScreen_ContextRecreated
}; };
void TouchScreen_Show(void) { void TouchScreen_Show(void) {
struct TouchScreen* s = &TouchScreen_Instance; struct TouchScreen* s = &TouchScreen;
s->VTABLE = &TouchScreen_VTABLE; s->VTABLE = &TouchScreen_VTABLE;
if (!Input_TouchMode) return; if (!Input_TouchMode) return;