ClassicGenScreen uses new rendering method

This commit is contained in:
UnknownShadow200 2019-12-05 21:36:32 +11:00
parent 5e297b0f8c
commit af6d0c6614
5 changed files with 89 additions and 66 deletions

View File

@ -686,14 +686,14 @@ GfxResourceID Gfx_CreateDynamicVb(VertexFormat fmt, int maxVertices) {
return vbuffer;
}
static void D3D9_SetVbData(IDirect3DVertexBuffer9* buffer, void* data, int size, const char* lockMsg, const char* unlockMsg, int lockFlags) {
static void D3D9_SetVbData(IDirect3DVertexBuffer9* buffer, void* data, int size, int lockFlags) {
void* dst = NULL;
cc_result res = IDirect3DVertexBuffer9_Lock(buffer, 0, size, &dst, lockFlags);
if (res) Logger_Abort2(res, lockMsg);
if (res) Logger_Abort2(res, "D3D9_LockVb");
Mem_Copy(dst, data, size);
res = IDirect3DVertexBuffer9_Unlock(buffer);
if (res) Logger_Abort2(res, unlockMsg);
if (res) Logger_Abort2(res, "D3D9_UnlockVb");
}
GfxResourceID Gfx_CreateVb(void* vertices, VertexFormat fmt, int count) {
@ -710,7 +710,7 @@ GfxResourceID Gfx_CreateVb(void* vertices, VertexFormat fmt, int count) {
Event_RaiseVoid(&GfxEvents.LowVRAMDetected);
}
D3D9_SetVbData(vbuffer, vertices, size, "D3D9_LockVb", "D3D9_UnlockVb", 0);
D3D9_SetVbData(vbuffer, vertices, size, 0);
return vbuffer;
}
@ -761,7 +761,7 @@ void Gfx_SetVertexFormat(VertexFormat fmt) {
void Gfx_SetDynamicVbData(GfxResourceID vb, void* vertices, int vCount) {
int size = vCount * gfx_batchStride;
IDirect3DVertexBuffer9* vbuffer = (IDirect3DVertexBuffer9*)vb;
D3D9_SetVbData(vbuffer, vertices, size, "D3D9_LockDynamicVbData", "D3D9_UnlockDynamicVbData", D3DLOCK_DISCARD);
D3D9_SetVbData(vbuffer, vertices, size, D3DLOCK_DISCARD);
cc_result res = IDirect3DDevice9_SetStreamSource(device, 0, vbuffer, 0, gfx_batchStride);
if (res) Logger_Abort2(res, "D3D9_SetDynamicVbData - Bind");

View File

@ -84,17 +84,6 @@ CC_NOINLINE static void Menu_MakeBodyFont(struct FontDesc* font) { Drawer2D_Mak
static void Menu_NullFunc(void* s) { }
static void Menu_CloseKeyboard(void* s) { Window_CloseKeyboard(); }
static void Menu_ContextLost(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;
Elem_Free(widgets[i]);
}
}
static void Menu_RenderBounds(void) {
/* These were sourced by taking a screenshot of vanilla
Then using paint to extract the colour components
@ -408,7 +397,7 @@ static void ListScreen_Free(void* screen) {
static void ListScreen_ContextLost(void* screen) {
struct ListScreen* s = (struct ListScreen*)screen;
Menu_ContextLost(screen);
Screen_ContextLost(screen);
Font_Free(&s->font);
}
@ -453,6 +442,13 @@ static void MenuScreen_Render(void* screen, double delta) {
Gfx_SetTexturing(false);
}
static void MenuScreen_Render2(void* screen, double delta) {
Menu_RenderBounds();
Gfx_SetTexturing(true);
Screen_Render2Widgets(screen, delta);
Gfx_SetTexturing(false);
}
/*########################################################################################################################*
*-------------------------------------------------------PauseScreen-------------------------------------------------------*
@ -543,7 +539,7 @@ static const struct ScreenVTABLE PauseScreen_VTABLE = {
PauseScreen_Init, MenuScreen_Render, PauseScreen_Free, PauseScreen_BuildMesh,
MenuScreen_KeyDown, Screen_TInput, Screen_TKeyPress, Screen_TText,
Menu_PointerDown, Screen_TPointer, Menu_PointerMove, Screen_TMouseScroll,
Screen_Layout, Menu_ContextLost, PauseScreen_ContextRecreated
Screen_Layout, Screen_ContextLost, PauseScreen_ContextRecreated
};
void PauseScreen_Show(void) {
struct PauseScreen* s = &PauseScreen_Instance;
@ -597,7 +593,7 @@ CC_NOINLINE static void OptionsGroupScreen_UpdateDesc(struct OptionsGroupScreen*
static void OptionsGroupScreen_ContextLost(void* screen) {
struct OptionsGroupScreen* s = (struct OptionsGroupScreen*)screen;
Font_Free(&s->textFont);
Menu_ContextLost(screen);
Screen_ContextLost(screen);
}
static void OptionsGroupScreen_ContextRecreated(void* screen) {
@ -830,7 +826,7 @@ static void EditHotkeyScreen_ContextLost(void* screen) {
struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen;
Font_Free(&s->titleFont);
Font_Free(&s->textFont);
Menu_ContextLost(screen);
Screen_ContextLost(screen);
}
static void EditHotkeyScreen_ContextRecreated(void* screen) {
@ -1010,7 +1006,7 @@ static int GenLevelScreen_PointerDown(void* screen, int id, int x, int y) {
static void GenLevelScreen_ContextLost(void* screen) {
struct GenLevelScreen* s = (struct GenLevelScreen*)screen;
Font_Free(&s->textFont);
Menu_ContextLost(screen);
Screen_ContextLost(screen);
}
static void GenLevelScreen_ContextRecreated(void* screen) {
@ -1081,14 +1077,20 @@ void GenLevelScreen_Show(void) {
static struct ClassicGenScreen {
Screen_Body
struct ButtonWidget buttons[3], cancel;
} ClassicGenScreen_Instance;
} ClassicGenScreen;
static struct Widget* classicgen_widgets[4] = {
(struct Widget*)&ClassicGenScreen.buttons[0], (struct Widget*)&ClassicGenScreen.buttons[1],
(struct Widget*)&ClassicGenScreen.buttons[2], (struct Widget*)&ClassicGenScreen.cancel
};
#define CLASSICGEN_MAX_VERTICES (4 * BUTTONWIDGET_MAX)
static void ClassicGenScreen_Gen(int size) {
RNGState rnd; Random_SeedFromCurrentTime(&rnd);
Gen_Vanilla = true;
Gen_Seed = Random_Next(&rnd, Int32_MaxValue);
Gui_Remove((struct Screen*)&ClassicGenScreen_Instance);
Gui_Remove((struct Screen*)&ClassicGenScreen);
Menu_BeginGen(size, 64, size);
}
@ -1097,12 +1099,13 @@ static void ClassicGenScreen_Medium(void* a, void* b) { ClassicGenScreen_Gen(256
static void ClassicGenScreen_Huge(void* a, void* b) { ClassicGenScreen_Gen(512); }
static void ClassicGenScreen_Make(struct ClassicGenScreen* s, int i, int y, Widget_LeftClick onClick) {
Menu_Button(s, i, &s->buttons[i], 400, onClick, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, y);
ButtonWidget_Make(&s->buttons[i], 400, onClick, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, y);
}
static void ClassicGenScreen_ContextRecreated(void* screen) {
struct ClassicGenScreen* s = (struct ClassicGenScreen*)screen;
struct FontDesc titleFont;
s->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FT2FC4B, CLASSICGEN_MAX_VERTICES);
Menu_MakeTitleFont(&titleFont);
ButtonWidget_SetConst(&s->buttons[0], "Small", &titleFont);
@ -1112,13 +1115,22 @@ static void ClassicGenScreen_ContextRecreated(void* screen) {
Font_Free(&titleFont);
}
static void ClassicGenScreen_BuildMesh(void* screen) { }
static void ClassicGenScreen_BuildMesh(void* screen) {
struct ClassicGenScreen* s = (struct ClassicGenScreen*)screen;
VertexP3fT2fC4b vertices[CLASSICGEN_MAX_VERTICES];
VertexP3fT2fC4b* ptr = vertices;
Widget_BuildMesh(&s->buttons[0], &ptr);
Widget_BuildMesh(&s->buttons[1], &ptr);
Widget_BuildMesh(&s->buttons[2], &ptr);
Widget_BuildMesh(&s->cancel, &ptr);
Gfx_SetDynamicVbData(s->vb, vertices, CLASSICGEN_MAX_VERTICES);
}
static void ClassicGenScreen_Init(void* screen) {
static struct Widget* widgets[4];
struct ClassicGenScreen* s = (struct ClassicGenScreen*)screen;
s->widgets = widgets;
s->numWidgets = Array_Elems(widgets);
s->widgets = classicgen_widgets;
s->numWidgets = Array_Elems(classicgen_widgets);
ClassicGenScreen_Make(s, 0, -100, ClassicGenScreen_Small);
ClassicGenScreen_Make(s, 1, -50, ClassicGenScreen_Medium);
@ -1128,13 +1140,13 @@ static void ClassicGenScreen_Init(void* screen) {
}
static const struct ScreenVTABLE ClassicGenScreen_VTABLE = {
ClassicGenScreen_Init, MenuScreen_Render, Menu_NullFunc, ClassicGenScreen_BuildMesh,
ClassicGenScreen_Init, MenuScreen_Render2, Menu_NullFunc, ClassicGenScreen_BuildMesh,
MenuScreen_KeyDown, Screen_TInput, Screen_TKeyPress, Screen_TText,
Menu_PointerDown, Screen_TPointer, Menu_PointerMove, Screen_TMouseScroll,
Screen_Layout, Menu_ContextLost, ClassicGenScreen_ContextRecreated
Screen_Layout, Screen_ContextLost, ClassicGenScreen_ContextRecreated
};
void ClassicGenScreen_Show(void) {
struct ClassicGenScreen* s = &ClassicGenScreen_Instance;
struct ClassicGenScreen* s = &ClassicGenScreen;
s->grabsInput = true;
s->closable = true;
s->VTABLE = &ClassicGenScreen_VTABLE;
@ -1348,7 +1360,7 @@ static void SaveLevelScreen_ContextLost(void* screen) {
struct SaveLevelScreen* s = (struct SaveLevelScreen*)screen;
Font_Free(&s->titleFont);
Font_Free(&s->textFont);
Menu_ContextLost(screen);
Screen_ContextLost(screen);
}
static void SaveLevelScreen_ContextRecreated(void* screen) {
@ -1687,7 +1699,7 @@ static int KeyBindingsScreen_KeyDown(void* screen, int key) {
static void KeyBindingsScreen_ContextLost(void* screen) {
struct KeyBindingsScreen* s = (struct KeyBindingsScreen*)screen;
Font_Free(&s->titleFont);
Menu_ContextLost(screen);
Screen_ContextLost(screen);
}
static void KeyBindingsScreen_ContextRecreated(void* screen) {
@ -2189,7 +2201,7 @@ static void MenuOptionsScreen_ContextLost(void* screen) {
struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen;
Font_Free(&s->titleFont);
Font_Free(&s->textFont);
Menu_ContextLost(s);
Screen_ContextLost(s);
Elem_Free(&s->extHelp);
}
@ -2919,7 +2931,7 @@ static struct TexIdsOverlay {
static void TexIdsOverlay_ContextLost(void* screen) {
struct TexIdsOverlay* s = (struct TexIdsOverlay*)screen;
Menu_ContextLost(s);
Screen_ContextLost(s);
Gfx_DeleteVb(&s->dynamicVb);
TextAtlas_Free(&s->idAtlas);
}
@ -3125,7 +3137,7 @@ static const struct ScreenVTABLE UrlWarningOverlay_VTABLE = {
UrlWarningOverlay_Init, MenuScreen_Render, Menu_NullFunc, UrlWarningOverlay_BuildMesh,
Screen_TInput, Screen_TInput, Screen_TKeyPress, Screen_TText,
Menu_PointerDown, Screen_TPointer, Menu_PointerMove, Screen_TMouseScroll,
Screen_Layout, Menu_ContextLost, UrlWarningOverlay_ContextRecreated
Screen_Layout, Screen_ContextLost, UrlWarningOverlay_ContextRecreated
};
void UrlWarningOverlay_Show(const String* url) {
struct UrlWarningOverlay* s = &UrlWarningOverlay_Instance;
@ -3225,7 +3237,7 @@ static void TexPackOverlay_Render(void* screen, double delta) {
static void TexPackOverlay_ContextLost(void* screen) {
struct TexPackOverlay* s = (struct TexPackOverlay*)screen;
Font_Free(&s->textFont);
Menu_ContextLost(screen);
Screen_ContextLost(screen);
}
static void TexPackOverlay_ContextRecreated(void* screen) {
@ -3359,7 +3371,7 @@ static const struct ScreenVTABLE TouchMoreOverlay_VTABLE = {
TouchMoreOverlay_Init, MenuScreen_Render, Menu_NullFunc,
Screen_TInput, Screen_TInput, Screen_TKeyPress, Screen_TText,
Menu_PointerDown, Screen_TPointer, Menu_PointerMove, Screen_TMouseScroll,
Screen_Layout, Menu_ContextLost, TouchMoreOverlay_ContextRecreated
Screen_Layout, Screen_ContextLost, TouchMoreOverlay_ContextRecreated
};
void TouchMoreOverlay_Show(void) {
struct TouchMoreOverlay* s = &TouchMoreOverlay_Instance;

View File

@ -106,8 +106,8 @@ static int Program_Run(int argc, char** argv) {
int argsCount = Platform_GetCommandLineArgs(argc, argv, args);
#ifdef _MSC_VER
/* NOTE: Make sure to comment this out before pushing a commit */
String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565");
//String rawArgs = String_FromConst("UnknownShadow200");
//String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565");
String rawArgs = String_FromConst("UnknownShadow200");
argsCount = String_UNSAFE_Split(&rawArgs, ' ', args, 4);
#endif

View File

@ -84,6 +84,18 @@ void Screen_Layout(void* screen) {
}
}
void Screen_ContextLost(void* screen) {
struct Screen* s = (struct Screen*)screen;
struct Widget** widgets = s->widgets;
int i;
Gfx_DeleteVb(&s->vb);
for (i = 0; i < s->numWidgets; i++) {
if (!widgets[i]) continue;
Elem_Free(widgets[i]);
}
}
/*########################################################################################################################*
*--------------------------------------------------------HUDScreen--------------------------------------------------------*
@ -1079,7 +1091,7 @@ static struct LoadingScreen {
char _titleBuffer[STRING_SIZE];
char _messageBuffer[STRING_SIZE];
} LoadingScreen_Instance;
} LoadingScreen;
static void LoadingScreen_SetTitle(struct LoadingScreen* s) {
TextWidget_Set(&s->title, &s->titleStr, &s->font);
@ -1201,7 +1213,7 @@ static void LoadingScreen_Free(void* screen) {
}
CC_NOINLINE static void LoadingScreen_ShowCommon(const String* title, const String* message) {
struct LoadingScreen* s = &LoadingScreen_Instance;
struct LoadingScreen* s = &LoadingScreen;
s->lastState = NULL;
s->progress = 0.0f;
@ -1223,10 +1235,10 @@ static const struct ScreenVTABLE LoadingScreen_VTABLE = {
LoadingScreen_Layout, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated
};
void LoadingScreen_Show(const String* title, const String* message) {
LoadingScreen_Instance.VTABLE = &LoadingScreen_VTABLE;
LoadingScreen.VTABLE = &LoadingScreen_VTABLE;
LoadingScreen_ShowCommon(title, message);
}
struct Screen* LoadingScreen_UNSAFE_RawPointer = (struct Screen*)&LoadingScreen_Instance;
struct Screen* LoadingScreen_UNSAFE_RawPointer = (struct Screen*)&LoadingScreen;
/*########################################################################################################################*
@ -1253,7 +1265,7 @@ static void GeneratingScreen_EndGeneration(void) {
struct LocationUpdate update;
float x, z;
Gui_Remove((struct Screen*)&LoadingScreen_Instance);
Gui_Remove((struct Screen*)&LoadingScreen);
Gen_Done = false;
if (!Gen_Blocks) { Chat_AddRaw("&cFailed to generate the map."); return; }
@ -1296,7 +1308,7 @@ void GeneratingScreen_Show(void) {
static const String title = String_FromConst("Generating level");
static const String message = String_FromConst("Generating..");
LoadingScreen_Instance.VTABLE = &GeneratingScreen_VTABLE;
LoadingScreen.VTABLE = &GeneratingScreen_VTABLE;
LoadingScreen_ShowCommon(&title, &message);
}
@ -1316,10 +1328,16 @@ static struct DisconnectScreen {
char _titleBuffer[STRING_SIZE];
char _messageBuffer[STRING_SIZE];
String titleStr, messageStr;
} DisconnectScreen_Instance;
#define DISCONNECTSCREEN_MAX_VERTICES (BUTTONWIDGET_MAX + 2 * TEXTWIDGET_MAX)
} DisconnectScreen;
static struct Widget* disconnect_widgets[3] = {
(struct Widget*)&DisconnectScreen.title,
(struct Widget*)&DisconnectScreen.message,
(struct Widget*)&DisconnectScreen.reconnect
};
#define DISCONNECT_MAX_VERTICES (BUTTONWIDGET_MAX + 2 * TEXTWIDGET_MAX)
#define DISCONNECT_DELAY_MS 5000
static void DisconnectScreen_ReconnectMessage(struct DisconnectScreen* s, String* msg) {
if (s->canReconnect) {
int elapsedMS = (int)(DateTime_CurrentUTC_MS() - s->initTime);
@ -1355,18 +1373,13 @@ static void DisconnectScreen_ContextLost(void* screen) {
struct DisconnectScreen* s = (struct DisconnectScreen*)screen;
Font_Free(&s->titleFont);
Font_Free(&s->messageFont);
Gfx_DeleteVb(&s->vb);
if (!s->title.VTABLE) return;
Elem_Free(&s->title);
Elem_Free(&s->message);
Elem_Free(&s->reconnect);
Screen_ContextLost(screen);
}
static void DisconnectScreen_ContextRecreated(void* screen) {
String msg; char msgBuffer[STRING_SIZE];
struct DisconnectScreen* s = (struct DisconnectScreen*)screen;
s->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FT2FC4B, DISCONNECTSCREEN_MAX_VERTICES);
s->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FT2FC4B, DISCONNECT_MAX_VERTICES);
Drawer2D_MakeFont(&s->titleFont, 16, FONT_STYLE_BOLD);
Drawer2D_MakeFont(&s->messageFont, 16, FONT_STYLE_NORMAL);
@ -1380,13 +1393,13 @@ static void DisconnectScreen_ContextRecreated(void* screen) {
static void DisconnectScreen_BuildMesh(void* screen) {
struct DisconnectScreen* s = (struct DisconnectScreen*)screen;
VertexP3fT2fC4b vertices[DISCONNECTSCREEN_MAX_VERTICES];
VertexP3fT2fC4b vertices[DISCONNECT_MAX_VERTICES];
VertexP3fT2fC4b* ptr = vertices;
Widget_BuildMesh(&s->title, &ptr);
Widget_BuildMesh(&s->message, &ptr);
Widget_BuildMesh(&s->reconnect, &ptr);
Gfx_SetDynamicVbData(s->vb, vertices, DISCONNECTSCREEN_MAX_VERTICES);
Gfx_SetDynamicVbData(s->vb, vertices, DISCONNECT_MAX_VERTICES);
}
static void DisconnectScreen_Init(void* screen) {
@ -1405,12 +1418,7 @@ static void DisconnectScreen_Init(void* screen) {
s->initTime = DateTime_CurrentUTC_MS();
s->lastSecsLeft = DISCONNECT_DELAY_MS / MILLIS_PER_SEC;
/* TODO: static init */
s->widgets = widgets;
s->widgets[0] = &s->title;
s->widgets[1] = &s->message;
s->widgets[2] = &s->reconnect;
s->widgets = disconnect_widgets;
s->numWidgets = s->canReconnect ? 3 : 2;
}
@ -1463,7 +1471,7 @@ void DisconnectScreen_Show(const String* title, const String* message) {
static const String kick = String_FromConst("Kicked ");
static const String ban = String_FromConst("Banned ");
String why; char whyBuffer[STRING_SIZE];
struct DisconnectScreen* s = &DisconnectScreen_Instance;
struct DisconnectScreen* s = &DisconnectScreen;
s->grabsInput = true;
s->blocksWorld = true;

View File

@ -27,6 +27,9 @@ void Screen_RenderWidgets(void* screen, double delta);
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 InventoryScreen_Show(void);
void HUDScreen_Show(void);