From be9b2b38fce6fc18e342d167dce27ae01fa93168 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 10 Feb 2017 11:44:46 +0100 Subject: [PATCH 1/6] - ColorpickerMenu.MouseEvent exported. --- src/menu/colorpickermenu.cpp | 49 ------------------ src/menu/menu.cpp | 40 +++++++++++++-- src/menu/menu.h | 1 + src/scripting/backend/codegen.cpp | 1 + src/scripting/thingdef_data.cpp | 30 +++++++++++ src/v_font.cpp | 6 +++ src/v_font.h | 3 +- wadsrc/static/zscript/base.txt | 9 +++- .../static/zscript/menu/colorpickermenu.txt | 49 ++++++++++++++++++ wadsrc/static/zscript/menu/menu.txt | 50 +++++++++++-------- 10 files changed, 160 insertions(+), 78 deletions(-) diff --git a/src/menu/colorpickermenu.cpp b/src/menu/colorpickermenu.cpp index 7970382bb..6f73a709e 100644 --- a/src/menu/colorpickermenu.cpp +++ b/src/menu/colorpickermenu.cpp @@ -124,55 +124,6 @@ public: // //============================================================================= - bool MouseEvent(int type, int mx, int my) - { - int olditem = mDesc->mSelectedItem; - bool res = Super::MouseEvent(type, mx, my); - - if (mDesc->mSelectedItem == -1 || mDesc->mSelectedItem == mStartItem+7) - { - int y = (-mDesc->mPosition + BigFont->GetHeight() + mDesc->mItems.Size() * OptionSettings.mLinespacing) * CleanYfac_1; - int h = (screen->GetHeight() - y) / 16; - int fh = OptionSettings.mLinespacing * CleanYfac_1; - int w = fh; - int yy = y + 2 * CleanYfac_1; - int indent = (screen->GetWidth() / 2); - - if (h > fh) h = fh; - else if (h < 4) return res; // no space to draw it. - - int box_y = y - 2 * CleanYfac_1; - int box_x = indent - 16*w; - - if (mx >= box_x && mx < box_x + 16*w && my >= box_y && my < box_y + 16*h) - { - int cell_x = (mx - box_x) / w; - int cell_y = (my - box_y) / h; - - if (olditem != mStartItem+7 || cell_x != mGridPosX || cell_y != mGridPosY) - { - mGridPosX = cell_x; - mGridPosY = cell_y; - //S_Sound (CHAN_VOICE | CHAN_UI, "menu/cursor", snd_menuvolume, ATTN_NONE); - } - mDesc->mSelectedItem = mStartItem+7; - if (type == MOUSE_Release) - { - MenuEvent(MKEY_Enter, true); - if (m_use_mouse == 2) mDesc->mSelectedItem = -1; - } - res = true; - } - } - return res; - } - - //============================================================================= - // - // - // - //============================================================================= - void Drawer() { Super::Drawer(); diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp index 8b9094f72..adaf1990c 100644 --- a/src/menu/menu.cpp +++ b/src/menu/menu.cpp @@ -149,7 +149,7 @@ bool DMenu::Responder (event_t *ev) res = MouseEventBack(MOUSE_Click, ev->data1, ev->data2); // make the menu's mouse handler believe that the current coordinate is outside the valid range if (res) ev->data2 = -1; - res |= MouseEvent(MOUSE_Click, ev->data1, ev->data2); + res |= CallMouseEvent(MOUSE_Click, ev->data1, ev->data2); if (res) { SetCapture(); @@ -163,7 +163,7 @@ bool DMenu::Responder (event_t *ev) { res = MouseEventBack(MOUSE_Move, ev->data1, ev->data2); if (res) ev->data2 = -1; - res |= MouseEvent(MOUSE_Move, ev->data1, ev->data2); + res |= CallMouseEvent(MOUSE_Move, ev->data1, ev->data2); } } else if (ev->subtype == EV_GUI_LButtonUp) @@ -173,7 +173,7 @@ bool DMenu::Responder (event_t *ev) ReleaseCapture(); res = MouseEventBack(MOUSE_Release, ev->data1, ev->data2); if (res) ev->data2 = -1; - res |= MouseEvent(MOUSE_Release, ev->data1, ev->data2); + res |= CallMouseEvent(MOUSE_Release, ev->data1, ev->data2); } } } @@ -217,7 +217,7 @@ bool DMenu::CallMenuEvent(int mkey, bool fromcontroller) int retval; VMReturn ret(&retval); GlobalVMStack.Call(func, params, 3, &ret, 1, nullptr); - return retval; + return !!retval; } else return MenuEvent(mkey, fromcontroller); } @@ -253,6 +253,28 @@ bool DMenu::MouseEvent(int type, int x, int y) return true; } +DEFINE_ACTION_FUNCTION(DMenu, MouseEvent) +{ + PARAM_SELF_PROLOGUE(DMenu); + PARAM_INT(type); + PARAM_INT(x); + PARAM_INT(y); + ACTION_RETURN_BOOL(self->MouseEvent(type, x, y)); +} + +bool DMenu::CallMouseEvent(int type, int x, int y) +{ + IFVIRTUAL(DMenu, MouseEvent) + { + VMValue params[] = { (DObject*)this, type, x, y }; + int retval; + VMReturn ret(&retval); + GlobalVMStack.Call(func, params, 4, &ret, 1, nullptr); + return !!retval; + } + else return MouseEvent (type, x, y); +} + //============================================================================= // // @@ -1034,7 +1056,7 @@ CCMD(reset2saved) //native OptionMenuItem OptionMenuDescriptor.GetItem(Name iname); //native void OptionMenuItem.drawLabel(int indent, int y, EColorRange color, bool grayed = false); -DEFINE_FIELD(DMenuDescriptor, mMenuName) +DEFINE_FIELD(DMenuDescriptor, mMenuName) DEFINE_FIELD(DMenuDescriptor, mNetgameMessage) DEFINE_FIELD(DMenuDescriptor, mClass) @@ -1062,3 +1084,11 @@ DEFINE_FIELD(DOptionMenu, VisBottom) DEFINE_FIELD(DOptionMenu, mFocusControl) DEFINE_FIELD(DOptionMenu, mDesc) +DEFINE_FIELD(FOptionMenuSettings, mTitleColor) +DEFINE_FIELD(FOptionMenuSettings, mFontColor) +DEFINE_FIELD(FOptionMenuSettings, mFontColorValue) +DEFINE_FIELD(FOptionMenuSettings, mFontColorMore) +DEFINE_FIELD(FOptionMenuSettings, mFontColorHeader) +DEFINE_FIELD(FOptionMenuSettings, mFontColorHighlight) +DEFINE_FIELD(FOptionMenuSettings, mFontColorSelection) +DEFINE_FIELD(FOptionMenuSettings, mLinespacing) diff --git a/src/menu/menu.h b/src/menu/menu.h index a3c1f86ea..153c79226 100644 --- a/src/menu/menu.h +++ b/src/menu/menu.h @@ -244,6 +244,7 @@ public: virtual bool MouseEvent(int type, int x, int y); bool CallMenuEvent(int mkey, bool fromcontroller); + bool CallMouseEvent(int type, int x, int y); bool MouseEventBack(int type, int x, int y); void SetCapture(); diff --git a/src/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index 71ecfc58c..1307693cf 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -7747,6 +7747,7 @@ FxExpression *FxMemberFunctionCall::Resolve(FCompileContext& ctx) if (MethodName == NAME_Size) { FxExpression *x = new FxMemberIdentifier(Self, NAME_Size, ScriptPosition); // todo: obfuscate the name to prevent direct access. + Self->ValueType = static_cast(Self->ValueType)->BackingType; Self = nullptr; delete this; return x->Resolve(ctx); diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 97f6ae10b..8cd10b75d 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -54,6 +54,8 @@ #include "p_checkposition.h" #include "r_sky.h" #include "v_font.h" +#include "v_video.h" +#include "menu/menu.h" static TArray properties; static TArray AFTable; @@ -841,6 +843,34 @@ void InitThingdef() fieldptr = new PField("intermissionfont", fontptr, VARF_Native | VARF_Static | VARF_ReadOnly, (intptr_t)&IntermissionFont); Namespaces.GlobalNamespace->Symbols.AddSymbol(fieldptr); + fieldptr = new PField("CleanXFac", TypeSInt32, VARF_Native | VARF_Static | VARF_ReadOnly, (intptr_t)&CleanXfac); + Namespaces.GlobalNamespace->Symbols.AddSymbol(fieldptr); + + fieldptr = new PField("CleanYFac", TypeSInt32, VARF_Native | VARF_Static | VARF_ReadOnly, (intptr_t)&CleanYfac); + Namespaces.GlobalNamespace->Symbols.AddSymbol(fieldptr); + + fieldptr = new PField("CleanWidth", TypeSInt32, VARF_Native | VARF_Static | VARF_ReadOnly, (intptr_t)&CleanWidth); + Namespaces.GlobalNamespace->Symbols.AddSymbol(fieldptr); + + fieldptr = new PField("CleanHeight", TypeSInt32, VARF_Native | VARF_Static | VARF_ReadOnly, (intptr_t)&CleanHeight); + Namespaces.GlobalNamespace->Symbols.AddSymbol(fieldptr); + + fieldptr = new PField("CleanXFac_1", TypeSInt32, VARF_Native | VARF_Static | VARF_ReadOnly, (intptr_t)&CleanXfac_1); + Namespaces.GlobalNamespace->Symbols.AddSymbol(fieldptr); + + fieldptr = new PField("CleanYFac_1", TypeSInt32, VARF_Native | VARF_Static | VARF_ReadOnly, (intptr_t)&CleanYfac_1); + Namespaces.GlobalNamespace->Symbols.AddSymbol(fieldptr); + + fieldptr = new PField("CleanWidth_1", TypeSInt32, VARF_Native | VARF_Static | VARF_ReadOnly, (intptr_t)&CleanWidth_1); + Namespaces.GlobalNamespace->Symbols.AddSymbol(fieldptr); + + fieldptr = new PField("CleanHeight_1", TypeSInt32, VARF_Native | VARF_Static | VARF_ReadOnly, (intptr_t)&CleanHeight_1); + Namespaces.GlobalNamespace->Symbols.AddSymbol(fieldptr); + + fieldptr = new PField("OptionMenuSettings", NewStruct("FOptionMenuSettings", nullptr), VARF_Native | VARF_Static | VARF_ReadOnly, (intptr_t)&OptionSettings); + Namespaces.GlobalNamespace->Symbols.AddSymbol(fieldptr); + + // Argh. It sucks when bad hacks need to be supported. WP_NOCHANGE is just a bogus pointer but it used everywhere as a special flag. // It cannot be defined as constant because constants can either be numbers or strings but nothing else, so the only 'solution' // is to create a static variable from it and reference that in the script. Yuck!!! diff --git a/src/v_font.cpp b/src/v_font.cpp index 00d3b10f7..669054001 100644 --- a/src/v_font.cpp +++ b/src/v_font.cpp @@ -853,6 +853,12 @@ DEFINE_ACTION_FUNCTION(FFont, GetCharWidth) ACTION_RETURN_INT(self->GetCharWidth(code)); } +DEFINE_ACTION_FUNCTION(FFont, GetHeight) +{ + PARAM_SELF_STRUCT_PROLOGUE(FFont); + ACTION_RETURN_INT(self->GetHeight()); +} + //========================================================================== // // Find string width using this font diff --git a/src/v_font.h b/src/v_font.h index 4c78b3007..21d773d9d 100644 --- a/src/v_font.h +++ b/src/v_font.h @@ -40,7 +40,7 @@ class DCanvas; struct FRemapTable; class FTexture; -enum EColorRange +enum EColorRange : int { CR_UNDEFINED = -1, CR_BRICK, @@ -67,7 +67,6 @@ enum EColorRange CR_DARKGRAY, CR_CYAN, NUM_TEXT_COLORS, - FORCE_DWORD = 0x7fffffff // required for script access. }; extern int NumTextColors; diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 269e32ef2..863e8d010 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -132,7 +132,12 @@ struct Screen native CR_CYAN, NUM_TEXT_COLORS }; - + + int CleanWidth, CleanHeight; + int CleanXFac, CleanYFac; + int CleanWidth_1, CleanHeight_1; + int CleanXFac_1, CleanYFac_1; + native static Color PaletteColor(int index); native static int GetWidth(); native static int GetHeight(); @@ -154,6 +159,8 @@ struct Font native { native int GetCharWidth(int code); native int StringWidth(String code); + native int GetHeight(); + native static int FindFontColor(Name color); native static Font FindFont(Name fontname); native static Font GetFont(Name fontname); diff --git a/wadsrc/static/zscript/menu/colorpickermenu.txt b/wadsrc/static/zscript/menu/colorpickermenu.txt index 017c89796..2ed3cf076 100644 --- a/wadsrc/static/zscript/menu/colorpickermenu.txt +++ b/wadsrc/static/zscript/menu/colorpickermenu.txt @@ -98,5 +98,54 @@ class ColorpickerMenu : Menu native return Super.MenuEvent(mkey, fromcontroller); } + //============================================================================= + // + // + // + //============================================================================= + + override bool MouseEvent(int type, int mx, int my) + { + int olditem = mDesc.mSelectedItem; + bool res = Super.MouseEvent(type, mx, my); + + if (mDesc.mSelectedItem == -1 || mDesc.mSelectedItem == mStartItem+7) + { + int y = (-mDesc.mPosition + BigFont.GetHeight() + mDesc.mItems.Size() * OptionMenuSettings.mLinespacing) * CleanYfac_1; + int h = (screen.GetHeight() - y) / 16; + int fh = OptionMenuSettings.mLinespacing * CleanYfac_1; + int w = fh; + int yy = y + 2 * CleanYfac_1; + int indent = (screen.GetWidth() / 2); + + if (h > fh) h = fh; + else if (h < 4) return res; // no space to draw it. + + int box_y = y - 2 * CleanYfac_1; + int box_x = indent - 16*w; + + if (mx >= box_x && mx < box_x + 16*w && my >= box_y && my < box_y + 16*h) + { + int cell_x = (mx - box_x) / w; + int cell_y = (my - box_y) / h; + + if (olditem != mStartItem+7 || cell_x != mGridPosX || cell_y != mGridPosY) + { + mGridPosX = cell_x; + mGridPosY = cell_y; + //S_Sound (CHAN_VOICE | CHAN_UI, "menu/cursor", snd_menuvolume, ATTN_NONE); + } + mDesc.mSelectedItem = mStartItem+7; + if (type == MOUSE_Release) + { + MenuEvent(MKEY_Enter, true); + if (m_use_mouse == 2) mDesc.mSelectedItem = -1; + } + res = true; + } + } + return res; + } + } \ No newline at end of file diff --git a/wadsrc/static/zscript/menu/menu.txt b/wadsrc/static/zscript/menu/menu.txt index 2dbfa6e79..14ff55fb9 100644 --- a/wadsrc/static/zscript/menu/menu.txt +++ b/wadsrc/static/zscript/menu/menu.txt @@ -1,30 +1,38 @@ -enum EMenuKey -{ - MKEY_Up, - MKEY_Down, - MKEY_Left, - MKEY_Right, - MKEY_PageUp, - MKEY_PageDown, - MKEY_Enter, - MKEY_Back, - MKEY_Clear, - NUM_MKEYS, - - // These are not buttons but events sent from other menus - - MKEY_Input, - MKEY_Abort, - MKEY_MBYes, - MKEY_MBNo, -} - class Menu : Object native { + enum EMenuKey + { + MKEY_Up, + MKEY_Down, + MKEY_Left, + MKEY_Right, + MKEY_PageUp, + MKEY_PageDown, + MKEY_Enter, + MKEY_Back, + MKEY_Clear, + NUM_MKEYS, + + // These are not buttons but events sent from other menus + + MKEY_Input, + MKEY_Abort, + MKEY_MBYes, + MKEY_MBNo, + } + + enum EMenuMouse + { + MOUSE_Click, + MOUSE_Move, + MOUSE_Release + }; + //native static int MenuTime(); native virtual bool MenuEvent (int mkey, bool fromcontroller); + native virtual bool MouseEvent(int type, int mx, int my); void MenuSound(Sound snd) { From 04e2b3be4a130fa229ed1633ec3f75fa3176d171 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 10 Feb 2017 13:34:28 +0200 Subject: [PATCH 2/6] Fixed compilation with GCC/Clang No more 'enumeration previously declared with fixed underlying type' error --- src/menu/menu.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/menu/menu.h b/src/menu/menu.h index 153c79226..ceab87603 100644 --- a/src/menu/menu.h +++ b/src/menu/menu.h @@ -19,7 +19,7 @@ EXTERN_CVAR(Int, m_use_mouse); struct event_t; class FTexture; class FFont; -enum EColorRange; +enum EColorRange : int; class FPlayerClass; class FKeyBindings; @@ -709,4 +709,4 @@ void M_InitVideoModesMenu (); void M_MarkMenus(); -#endif \ No newline at end of file +#endif From 8c780ab7ffcd73dbc4c440476d1dc095d66e25ea Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 10 Feb 2017 13:20:19 +0100 Subject: [PATCH 3/6] - exported the drawer function of the colorpicker menu. --- src/am_map.cpp | 2 - src/c_cvars.cpp | 21 ++++ src/dobject.cpp | 4 + src/gl/renderer/gl_renderer.h | 3 - src/menu/colorpickermenu.cpp | 75 ------------ src/menu/menu.cpp | 22 +++- src/menu/menu.h | 1 + src/menu/menuinput.cpp | 2 +- src/menu/optionmenuitems.h | 2 +- src/v_draw.cpp | 35 +++--- src/v_text.cpp | 4 +- src/v_video.h | 3 - wadsrc/static/zscript/base.txt | 54 +++++---- .../static/zscript/menu/colorpickermenu.txt | 109 ++++++++++++++++++ wadsrc/static/zscript/menu/menu.txt | 1 + 15 files changed, 211 insertions(+), 127 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index 57eccc19d..9968f4ac4 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -1901,7 +1901,6 @@ void AM_drawSubsectors() PalEntry flatcolor; mpoint_t originpt; - screen->StartSimplePolys(); for (int i = 0; i < numsubsectors; ++i) { if (subsectors[i].flags & SSECF_POLYORG) @@ -2058,7 +2057,6 @@ void AM_drawSubsectors() ); } } - screen->FinishSimplePolys(); } //============================================================================= diff --git a/src/c_cvars.cpp b/src/c_cvars.cpp index 82be8663e..768392c6c 100644 --- a/src/c_cvars.cpp +++ b/src/c_cvars.cpp @@ -181,6 +181,27 @@ void FBaseCVar::SetGenericRep (UCVarValue value, ECVarType type) } } +DEFINE_ACTION_FUNCTION(_CVar, GetInt) +{ + PARAM_SELF_STRUCT_PROLOGUE(FBaseCVar); + auto v = self->GetGenericRep(CVAR_Int); + ACTION_RETURN_INT(v.Int); +} + +DEFINE_ACTION_FUNCTION(_CVar, GetFloat) +{ + PARAM_SELF_STRUCT_PROLOGUE(FBaseCVar); + auto v = self->GetGenericRep(CVAR_Float); + ACTION_RETURN_FLOAT(v.Int); +} + +DEFINE_ACTION_FUNCTION(_CVar, GetString) +{ + PARAM_SELF_STRUCT_PROLOGUE(FBaseCVar); + auto v = self->GetGenericRep(CVAR_String); + ACTION_RETURN_STRING(v.String); +} + bool FBaseCVar::ToBool (UCVarValue value, ECVarType type) { switch (type) diff --git a/src/dobject.cpp b/src/dobject.cpp index 68f3aab8e..747c1f9bf 100644 --- a/src/dobject.cpp +++ b/src/dobject.cpp @@ -616,6 +616,10 @@ DEFINE_ACTION_FUNCTION(DObject, GetClassName) ACTION_RETURN_INT(self->GetClass()->TypeName); } +DEFINE_ACTION_FUNCTION(DObject, MSTime) +{ + ACTION_RETURN_INT(I_MSTime()); +} void *DObject::ScriptVar(FName field, PType *type) { diff --git a/src/gl/renderer/gl_renderer.h b/src/gl/renderer/gl_renderer.h index 95739e86d..ed2c523f2 100644 --- a/src/gl/renderer/gl_renderer.h +++ b/src/gl/renderer/gl_renderer.h @@ -211,9 +211,6 @@ public: bool StartOffscreen(); void EndOffscreen(); - void StartSimplePolys(); - void FinishSimplePolys(); - void FillSimplePoly(FTexture *texture, FVector2 *points, int npoints, double originx, double originy, double scalex, double scaley, DAngle rotation, FDynamicColormap *colormap, PalEntry flatcolor, int lightlevel, int bottomclip); diff --git a/src/menu/colorpickermenu.cpp b/src/menu/colorpickermenu.cpp index 6f73a709e..7fc3e2ecd 100644 --- a/src/menu/colorpickermenu.cpp +++ b/src/menu/colorpickermenu.cpp @@ -118,81 +118,6 @@ public: mBlue = (float)BPART(DWORD(*mCVar)); } - //============================================================================= - // - // - // - //============================================================================= - - void Drawer() - { - Super::Drawer(); - - if (mCVar == NULL) return; - int y = (-mDesc->mPosition + BigFont->GetHeight() + mDesc->mItems.Size() * OptionSettings.mLinespacing) * CleanYfac_1; - int h = (screen->GetHeight() - y) / 16; - int fh = OptionSettings.mLinespacing * CleanYfac_1; - int w = fh; - int yy = y; - - if (h > fh) h = fh; - else if (h < 4) return; // no space to draw it. - - int indent = (screen->GetWidth() / 2); - int p = 0; - - for(int i = 0; i < 16; i++, y += h) - { - int box_x, box_y; - int x1; - - box_y = y - 2 * CleanYfac_1; - box_x = indent - 16*w; - for (x1 = 0; x1 < 16; ++x1, p++) - { - screen->Clear (box_x, box_y, box_x + w, box_y + h, p, 0); - if ((mDesc->mSelectedItem == mStartItem+7) && - (/*p == CurrColorIndex ||*/ (i == mGridPosY && x1 == mGridPosX))) - { - int r, g, b; - DWORD col; - double blinky; - if (i == mGridPosY && x1 == mGridPosX) - { - r = 255, g = 128, b = 0; - } - else - { - r = 200, g = 200, b = 255; - } - // Make sure the cursors stand out against similar colors - // by pulsing them. - blinky = fabs(sin(I_MSTime()/1000.0)) * 0.5 + 0.5; - col = MAKEARGB(255,int(r*blinky),int(g*blinky),int(b*blinky)); - - screen->Clear (box_x, box_y, box_x + w, box_y + 1, -1, col); - screen->Clear (box_x, box_y + h-1, box_x + w, box_y + h, -1, col); - screen->Clear (box_x, box_y, box_x + 1, box_y + h, -1, col); - screen->Clear (box_x + w - 1, box_y, box_x + w, box_y + h, -1, col); - } - box_x += w; - } - } - y = yy; - DWORD newColor = MAKEARGB(255, int(mRed), int(mGreen), int(mBlue)); - DWORD oldColor = DWORD(*mCVar) | 0xFF000000; - - int x = screen->GetWidth()*2/3; - - screen->Clear (x, y, x + 48*CleanXfac_1, y + 48*CleanYfac_1, -1, oldColor); - screen->Clear (x + 48*CleanXfac_1, y, x + 48*2*CleanXfac_1, y + 48*CleanYfac_1, -1, newColor); - - y += 49*CleanYfac_1; - screen->DrawText (SmallFont, CR_GRAY, x+(24-SmallFont->StringWidth("Old")/2)*CleanXfac_1, y, - "Old", DTA_CleanNoMove_1, true, TAG_DONE); - screen->DrawText (SmallFont, CR_WHITE, x+(48+24-SmallFont->StringWidth("New")/2)*CleanXfac_1, y, - "New", DTA_CleanNoMove_1, true, TAG_DONE); - } }; IMPLEMENT_CLASS(DColorPickerMenu, true, false) diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp index adaf1990c..1f3ac189e 100644 --- a/src/menu/menu.cpp +++ b/src/menu/menu.cpp @@ -357,6 +357,26 @@ void DMenu::Drawer () } } + +DEFINE_ACTION_FUNCTION(DMenu, Drawer) +{ + PARAM_SELF_PROLOGUE(DMenu); + self->Drawer(); + return 0; +} + +void DMenu::CallDrawer() +{ + IFVIRTUAL(DMenu, Drawer) + { + VMValue params[] = { (DObject*)this }; + GlobalVMStack.Call(func, params, 1, nullptr, 0, nullptr); + } + else Drawer(); +} + + + bool DMenu::DimAllowed() { return true; @@ -800,7 +820,7 @@ void M_Drawer (void) screen->Dim(fade); V_SetBorderNeedRefresh(); } - DMenu::CurrentMenu->Drawer(); + DMenu::CurrentMenu->CallDrawer(); } } diff --git a/src/menu/menu.h b/src/menu/menu.h index ceab87603..e8d5b9a82 100644 --- a/src/menu/menu.h +++ b/src/menu/menu.h @@ -245,6 +245,7 @@ public: bool CallMenuEvent(int mkey, bool fromcontroller); bool CallMouseEvent(int type, int x, int y); + void CallDrawer(); bool MouseEventBack(int type, int x, int y); void SetCapture(); diff --git a/src/menu/menuinput.cpp b/src/menu/menuinput.cpp index ab372a6ae..67f34635e 100644 --- a/src/menu/menuinput.cpp +++ b/src/menu/menuinput.cpp @@ -297,7 +297,7 @@ bool DTextEnterMenu::MenuEvent (int key, bool fromcontroller) void DTextEnterMenu::Drawer () { - mParentMenu->Drawer(); + mParentMenu->CallDrawer(); if (mInputGridOkay) { const int cell_width = 18 * CleanXfac; diff --git a/src/menu/optionmenuitems.h b/src/menu/optionmenuitems.h index 904bf8ff8..a7c16ec8c 100644 --- a/src/menu/optionmenuitems.h +++ b/src/menu/optionmenuitems.h @@ -426,7 +426,7 @@ public: void Drawer() { - mParentMenu->Drawer(); + mParentMenu->CallDrawer(); } }; diff --git a/src/v_draw.cpp b/src/v_draw.cpp index 4b9072015..d2b09b0d1 100644 --- a/src/v_draw.cpp +++ b/src/v_draw.cpp @@ -498,12 +498,15 @@ static void ListEnd(VMVa_List &tags) int ListGetInt(VMVa_List &tags) { - if (tags.curindex < tags.numargs && tags.args[tags.curindex].Type == REGT_INT) + if (tags.curindex < tags.numargs) { - return tags.args[tags.curindex++].i; + if (tags.args[tags.curindex].Type == REGT_INT) + { + return tags.args[tags.curindex++].i; + } + ThrowAbortException(X_OTHER, "Invalid parameter in draw function, int expected"); } - ThrowAbortException(X_OTHER, "Invalid parameter in draw function, int expected"); - return 0; + return TAG_DONE; } static inline double ListGetDouble(VMVa_List &tags) @@ -1350,18 +1353,18 @@ void DCanvas::Clear (int left, int top, int right, int bottom, int palcolor, uin } } -//========================================================================== -// -// no-ops. This is so that renderer backends can better manage the -// processing of the subsector drawing in the automap -// -//========================================================================== - -void DCanvas::StartSimplePolys() -{} - -void DCanvas::FinishSimplePolys() -{} +DEFINE_ACTION_FUNCTION(_Screen, Clear) +{ + PARAM_PROLOGUE; + PARAM_INT(x1); + PARAM_INT(y1); + PARAM_INT(x2); + PARAM_INT(y2); + PARAM_INT(color); + PARAM_INT_DEF(palcol); + screen->Clear(x1, y1, x2, y2, palcol, color); + return 0; +} //========================================================================== // diff --git a/src/v_text.cpp b/src/v_text.cpp index 8b612e83c..85b3de7db 100644 --- a/src/v_text.cpp +++ b/src/v_text.cpp @@ -46,6 +46,7 @@ #include "doomstat.h" #include "templates.h" +#include "gstrings.h" int ListGetInt(VMVa_List &tags); @@ -239,7 +240,8 @@ DEFINE_ACTION_FUNCTION(_Screen, DrawText) PARAM_STRING(chr); VMVa_List args = { param + 5, 0, numparam - 5 }; - screen->DrawText(font, cr, x, y, chr, args); + const char *txt = chr[0] == '$' ? GStrings(chr) : chr.GetChars(); + screen->DrawText(font, cr, x, y, txt, args); return 0; } diff --git a/src/v_video.h b/src/v_video.h index a2586d5a7..72474ee28 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -228,9 +228,6 @@ public: // Fill an area with a texture virtual void FlatFill (int left, int top, int right, int bottom, FTexture *src, bool local_origin=false); - virtual void StartSimplePolys(); - virtual void FinishSimplePolys(); - // Fill a simple polygon with a texture virtual void FillSimplePoly(FTexture *tex, FVector2 *points, int npoints, double originx, double originy, double scalex, double scaley, DAngle rotation, diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 863e8d010..8e77c3212 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -103,6 +103,32 @@ enum DrawTextureTags }; struct Screen native +{ + int CleanWidth, CleanHeight; + int CleanXFac, CleanYFac; + int CleanWidth_1, CleanHeight_1; + int CleanXFac_1, CleanYFac_1; + + native static Color PaletteColor(int index); + native static int GetWidth(); + native static int GetHeight(); + native static void Clear(int left, int top, int right, int bottom, Color color, int palcolor = -1); + + native static void DrawHUDTexture(TextureID tex, double x, double y); + native static vararg void DrawTexture(TextureID tex, bool animate, double x, double y, ...); + native static vararg void DrawChar(Font font, int normalcolor, double x, double y, int character, ...); + native static vararg void DrawText(Font font, int normalcolor, double x, double y, String text, ...); + +} + +class BrokenLines : Object native +{ + native int Count(); + native int StringWidth(int line); + native String StringAt(int line); +} + +struct Font native { enum EColorRange { @@ -132,31 +158,7 @@ struct Screen native CR_CYAN, NUM_TEXT_COLORS }; - - int CleanWidth, CleanHeight; - int CleanXFac, CleanYFac; - int CleanWidth_1, CleanHeight_1; - int CleanXFac_1, CleanYFac_1; - - native static Color PaletteColor(int index); - native static int GetWidth(); - native static int GetHeight(); - native static void DrawHUDTexture(TextureID tex, double x, double y); - native static vararg void DrawTexture(TextureID tex, bool animate, double x, double y, ...); - native static vararg void DrawChar(Font font, int normalcolor, double x, double y, int character, ...); - native static vararg void DrawText(Font font, int normalcolor, double x, double y, String text, ...); -} - -class BrokenLines : Object native -{ - native int Count(); - native int StringWidth(int line); - native String StringAt(int line); -} - -struct Font native -{ native int GetCharWidth(int code); native int StringWidth(String code); native int GetHeight(); @@ -180,6 +182,9 @@ struct DamageTypeDefinition native struct CVar native { + native int GetInt(); + native double GetFloat(); + native String GetString(); } struct GameInfoStruct native @@ -207,6 +212,7 @@ class Object native native static bool S_ChangeMusic(String music_name, int order = 0, bool looping = true, bool force = false); native static uint BAM(double angle); native static void SetMusicVolume(float vol); + native static uint MSTime(); native Name GetClassName(); native void Destroy(); diff --git a/wadsrc/static/zscript/menu/colorpickermenu.txt b/wadsrc/static/zscript/menu/colorpickermenu.txt index 2ed3cf076..30c2a183e 100644 --- a/wadsrc/static/zscript/menu/colorpickermenu.txt +++ b/wadsrc/static/zscript/menu/colorpickermenu.txt @@ -1,3 +1,36 @@ +/* +** colorpickermenu.txt +** The color picker menu +** +**--------------------------------------------------------------------------- +** Copyright 2010-2017 Christoph Oelckers +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ class ColorpickerMenu : Menu native { @@ -147,5 +180,81 @@ class ColorpickerMenu : Menu native return res; } + //============================================================================= + // + // + // + //============================================================================= + + override void Drawer() + { + Super.Drawer(); + + if (mCVar == null) return; + int y = (-mDesc.mPosition + BigFont.GetHeight() + mDesc.mItems.Size() * OptionMenuSettings.mLinespacing) * CleanYfac_1; + int fh = OptionMenuSettings.mLinespacing * CleanYfac_1; + int h = (screen.GetHeight() - y) / 16; + int w = fh; + int yy = y; + + if (h > fh) h = fh; + else if (h < 4) return; // no space to draw it. + + int indent = (screen.GetWidth() / 2); + int p = 0; + + for(int i = 0; i < 16; i++) + { + int box_x, box_y; + int x1; + + box_y = y - 2 * CleanYfac_1; + box_x = indent - 16*w; + for (x1 = 0; x1 < 16; ++x1) + { + screen.Clear (box_x, box_y, box_x + w, box_y + h, 0, p); + if ((mDesc.mSelectedItem == mStartItem+7) && + (/*p == CurrColorIndex ||*/ (i == mGridPosY && x1 == mGridPosX))) + { + int r, g, b; + Color col; + double blinky; + if (i == mGridPosY && x1 == mGridPosX) + { + r = 255; g = 128; b = 0; + } + else + { + r = 200; g = 200; b = 255; + } + // Make sure the cursors stand out against similar colors + // by pulsing them. + blinky = abs(sin(MSTime()/1000.0)) * 0.5 + 0.5; + col = Color(255, int(r*blinky), int(g*blinky), int(b*blinky)); + + screen.Clear (box_x, box_y, box_x + w, box_y + 1, col); + screen.Clear (box_x, box_y + h-1, box_x + w, box_y + h, col); + screen.Clear (box_x, box_y, box_x + 1, box_y + h, col); + screen.Clear (box_x + w - 1, box_y, box_x + w, box_y + h, col); + } + box_x += w; + p++; + } + y += h; + } + y = yy; + color newColor = Color(255, int(mRed), int(mGreen), int(mBlue)); + color oldColor = mCVar.GetInt() | 0xFF000000; + + int x = screen.GetWidth()*2/3; + + screen.Clear (x, y, x + 48*CleanXfac_1, y + 48*CleanYfac_1, oldColor); + screen.Clear (x + 48*CleanXfac_1, y, x + 48*2*CleanXfac_1, y + 48*CleanYfac_1, newColor); + + y += 49*CleanYfac_1; + screen.DrawText (SmallFont, Font.CR_GRAY, x+(24-SmallFont.StringWidth("Old")/2)*CleanXfac_1, y, "Old", DTA_CleanNoMove_1, true); + screen.DrawText (SmallFont, Font.CR_WHITE, x+(48+24-SmallFont.StringWidth("New")/2)*CleanXfac_1, y, "New", DTA_CleanNoMove_1, true); + } + } \ No newline at end of file diff --git a/wadsrc/static/zscript/menu/menu.txt b/wadsrc/static/zscript/menu/menu.txt index 14ff55fb9..c759e8351 100644 --- a/wadsrc/static/zscript/menu/menu.txt +++ b/wadsrc/static/zscript/menu/menu.txt @@ -33,6 +33,7 @@ class Menu : Object native native virtual bool MenuEvent (int mkey, bool fromcontroller); native virtual bool MouseEvent(int type, int mx, int my); + native virtual void Drawer(); void MenuSound(Sound snd) { From 65174af5440bc37210811f9e90650311dab63e5b Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 10 Feb 2017 14:07:21 +0100 Subject: [PATCH 4/6] - moved the backdrop for the player box into the texture manager so that the menu doesn't have to bother with managing the texture itself. --- src/CMakeLists.txt | 1 + src/menu/playerdisplay.cpp | 304 +------------------------- src/textures/backdroptexture.cpp | 357 +++++++++++++++++++++++++++++++ src/textures/texturemanager.cpp | 2 + 4 files changed, 362 insertions(+), 302 deletions(-) create mode 100644 src/textures/backdroptexture.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d0d31984d..d079c68b2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1176,6 +1176,7 @@ set (PCH_SOURCES textures/pngtexture.cpp textures/rawpagetexture.cpp textures/emptytexture.cpp + textures/backdroptexture.cpp textures/texture.cpp textures/texturemanager.cpp textures/tgatexture.cpp diff --git a/src/menu/playerdisplay.cpp b/src/menu/playerdisplay.cpp index 358192280..4b01ab398 100644 --- a/src/menu/playerdisplay.cpp +++ b/src/menu/playerdisplay.cpp @@ -49,306 +49,6 @@ #include "r_data/r_translate.h" -//============================================================================= -// -// Used by the player display -// -//============================================================================= - -struct FBackdropTexture : public FTexture -{ - enum - { - COS_SIZE = 256, - ANGLESHIFT = 24 - }; - - static constexpr uint32_t DEGREES(double v) - { - return uint32_t((v)*(0x40000000 / 90.0)); - } - - static double TORAD(uint32_t x) - { - return x*(M_PI / 0x80000000); - } - -public: - FBackdropTexture(); - - const BYTE *GetColumn(unsigned int column, const Span **spans_out); - const BYTE *GetPixels(); - void Unload(); - bool CheckModified(); - -protected: - uint32_t costab[COS_SIZE]; - BYTE Pixels[144*160]; - static const Span DummySpan[2]; - int LastRenderTic; - - uint32_t time1, time2, time3, time4; - uint32_t t1ang, t2ang, z1ang, z2ang; - - void Render(); -}; - - - -// A 32x32 cloud rendered with Photoshop, plus some other filters -static BYTE pattern1[1024] = -{ - 5, 9, 7,10, 9,15, 9, 7, 8,10, 5, 3, 5, 7, 9, 8,14, 8, 4, 7, 8, 9, 5, 7,14, 7, 0, 7,13,13, 9, 6, - 2, 7, 9, 7, 7,10, 8, 8,11,10, 6, 7,10, 7, 5, 6, 6, 4, 7,13,15,16,11,15,11, 8, 0, 4,13,22,17,11, - 5, 9, 9, 7, 9,10, 4, 3, 6, 7, 8, 6, 5, 4, 2, 2, 1, 4, 6,11,15,15,14,13,17, 9, 5, 9,11,12,17,20, - 9,16, 9, 8,12,13, 7, 3, 7, 9, 5, 4, 2, 5, 5, 5, 7,11, 6, 7, 6,13,17,10,10, 9,12,17,14,12,16,15, - 15,13, 5, 3, 9,10, 4,10,12,12, 7, 9, 8, 8, 8,10, 7, 6, 5, 5, 5, 6,11, 9, 3,13,16,18,21,16,23,18, - 23,13, 0, 0, 0, 0, 0,12,18,14,15,16,13, 7, 7, 5, 9, 6, 6, 8, 4, 0, 0, 0, 0,14,19,17,14,20,21,25, - 19,20,14,13, 7, 5,13,19,14,13,17,15,14, 7, 3, 5, 6,11, 7, 7, 8, 8,10, 9, 9,18,17,15,14,15,18,16, - 16,29,24,23,18, 9,17,20,11, 5,12,15,15,12, 6, 3, 4, 6, 7,10,13,18,18,19,16,12,17,19,23,16,14,14, - 9,18,20,26,19, 5,18,18,10, 5,12,15,14,17,11, 6,11, 9,10,13,10,20,24,20,21,20,14,18,15,22,20,19, - 0, 6,16,18, 8, 7,15,18,10,13,17,17,13,11,15,11,19,12,13,10, 4,15,19,21,21,24,14, 9,17,20,24,17, - 18,17, 7, 7,16,21,22,15, 5,14,20,14,13,21,13, 8,12,14, 7, 8,11,15,13,11,16,17, 7, 5,12,17,19,14, - 25,23,17,16,23,18,15, 7, 0, 6,11, 6,11,15,11, 7,12, 7, 4,10,16,13, 7, 7,15,13, 9,15,21,14, 5, 0, - 18,22,21,21,21,22,12, 6,14,20,15, 6,10,19,13, 8, 7, 3, 7,12,14,16, 9,12,22,15,12,18,24,19,17, 9, - 0,15,18,21,17,25,14,13,19,21,21,11, 6,13,16,16,12,10,12,11,13,20,14,13,18,13, 9,15,16,25,31,20, - 5,20,24,16, 7,14,14,11,18,19,19, 6, 0, 5,11,14,17,16,19,14,15,21,19,15,14,14, 8, 0, 7,24,18,16, - 9,17,15, 7, 6,14,12, 7,14,16,11, 4, 7, 6,13,16,15,13,12,20,21,20,21,17,18,26,14, 0,13,23,21,11, - 9,12,18,11,15,21,13, 8,13,13,10, 7,13, 8, 8,19,13, 7, 4,15,19,18,14,12,14,15, 8, 6,16,22,22,15, - 9,17,14,19,15,14,15, 9,11, 9, 6, 8,14,13,13,12, 5, 0, 0, 6,12,13, 7, 7, 9, 7, 0,12,21,16,15,18, - 15,16,18,11, 6, 8,15, 9, 2, 0, 5,10,10,16, 9, 0, 4,12,15, 9,12, 9, 7, 7,12, 7, 0, 6,12, 6, 9,13, - 12,19,15,14,11, 7, 8, 9,12,10, 5, 5, 7,12,12,10,14,16,16,11, 8,12,10,12,10, 8,10,10,14,12,16,16, - 16,17,20,22,12,15,12,14,19,11, 6, 5,10,13,17,17,21,19,15, 9, 6, 9,15,18,10,10,18,14,20,15,16,17, - 11,19,19,18,19,14,17,13,12,12, 7,11,18,17,16,15,19,19,10, 2, 0, 8,15,12, 8,11,12,10,19,20,19,19, - 6,14,18,13,13,16,16,12, 5, 8,10,12,10,13,18,12, 9,10, 7, 6, 5,11, 8, 6, 7,13,16,13,10,15,20,14, - 0, 5,12,12, 4, 0, 9,16, 9,10,12, 8, 0, 9,13, 9, 0, 2, 4, 7,10, 6, 7, 3, 4,11,16,18,10,11,21,21, - 16,13,11,15, 8, 0, 5, 9, 8, 7, 6, 3, 0, 9,17, 9, 0, 0, 0, 3, 5, 4, 3, 5, 7,15,16,16,17,14,22,22, - 24,14,15,12, 9, 0, 5,10, 8, 4, 7,12,10,11,12, 7, 6, 8, 6, 5, 7, 8, 8,11,13,10,15,14,12,18,20,16, - 16,17,17,18,12, 9,12,16,10, 5, 6,20,13,15, 8, 4, 8, 9, 8, 7, 9,11,12,17,16,16,11,10, 9,10, 5, 0, - 0,14,18,18,15,16,14, 9,10, 9, 9,15,14,10, 4, 6,10, 8, 8, 7,10, 9,10,16,18,10, 0, 0, 7,12,10, 8, - 0,14,19,14, 9,11,11, 8, 8,10,15, 9,10, 7, 4,10,13, 9, 7, 5, 5, 7, 7, 7,13,13, 5, 5,14,22,18,16, - 0,10,14,10, 3, 6, 5, 6, 8, 9, 8, 9, 5, 9, 8, 9, 6, 8, 8, 8, 1, 0, 0, 0, 9,17,12,12,17,19,20,13, - 6,11,17,11, 5, 5, 8,10, 6, 5, 6, 6, 3, 7, 9, 7, 6, 8,12,10, 4, 8, 6, 6,11,16,16,15,16,17,17,16, - 11, 9,10,10, 5, 6,12,10, 5, 1, 6,10, 5, 3, 3, 5, 4, 7,15,10, 7,13, 7, 8,15,11,15,15,15, 8,11,15, -}; - -// Just a 32x32 cloud rendered with the standard Photoshop filter -static BYTE pattern2[1024] = -{ - 9, 9, 8, 8, 8, 8, 6, 6,13,13,11,21,19,21,23,18,23,24,19,19,24,17,18,12, 9,14, 8,12,12, 5, 8, 6, - 11,10, 6, 7, 8, 8, 9,13,10,11,17,15,23,22,23,22,20,26,27,26,17,21,20,14,12, 8,11, 8,11, 7, 8, 7, - 6, 9,13,13,10, 9,13, 7,12,13,16,19,16,20,22,25,22,25,27,22,21,23,15,10,14,14,15,13,12, 8,12, 6, - 6, 7,12,12,12,16, 9,12,12,15,16,11,21,24,19,24,23,26,28,27,26,21,14,15, 7, 7,10,15,12,11,10, 9, - 7,14,11,16,12,18,16,14,16,14,11,14,15,21,23,17,20,18,26,24,27,18,20,11,11,14,10,17,17,10, 6,10, - 13, 9,14,10,13,11,14,15,18,15,15,12,19,19,20,18,22,20,19,22,19,19,19,20,17,15,15,11,16,14,10, 8, - 13,16,12,16,17,19,17,18,15,19,14,18,15,14,15,17,21,19,23,18,23,22,18,18,17,15,15,16,12,12,15,10, - 10,12,14,10,16,11,18,15,21,20,20,17,18,19,16,19,14,20,19,14,19,25,22,21,22,24,18,12, 9, 9, 8, 6, - 10,10,13, 9,15,13,20,19,22,18,18,17,17,21,21,13,13,12,19,18,16,17,27,26,22,23,20,17,12,11, 8, 9, - 7,13,14,15,11,13,18,22,19,23,23,20,22,24,21,14,12,16,17,19,18,18,22,18,24,23,19,17,16,14, 8, 7, - 12,12, 8, 8,16,20,26,25,28,28,22,29,23,22,21,18,13,16,15,15,20,17,25,24,19,17,17,17,15,10, 8, 9, - 7,12,15,11,17,20,25,25,25,29,30,31,28,26,18,16,17,18,20,21,22,20,23,19,18,19,10,16,16,11,11, 8, - 5, 6, 8,14,14,17,17,21,27,23,27,31,27,22,23,21,19,19,21,19,20,19,17,22,13,17,12,15,10,10,12, 6, - 8, 9, 8,14,15,16,15,18,27,26,23,25,23,22,18,21,20,17,19,20,20,16,20,14,15,13,12, 8, 8, 7,11,13, - 7, 6,11,11,11,13,15,22,25,24,26,22,24,26,23,18,24,24,20,18,20,16,17,12,12,12,10, 8,11, 9, 6, 8, - 9,10, 9, 6, 5,14,16,19,17,21,26,20,23,19,19,17,20,21,26,25,23,21,17,13,12, 5,13,11, 7,12,10,12, - 6, 5, 4,10,11, 9,10,13,17,20,20,18,23,26,27,20,21,24,20,19,24,20,18,10,11, 3, 6,13, 9, 6, 8, 8, - 1, 2, 2,11,13,13,11,16,16,16,19,21,20,23,22,28,21,20,19,18,23,16,18, 7, 5, 9, 7, 6, 5,10, 8, 8, - 0, 0, 6, 9,11,15,12,12,19,18,19,26,22,24,26,30,23,22,22,16,20,19,12,12, 3, 4, 6, 5, 4, 7, 2, 4, - 2, 0, 0, 7,11, 8,14,13,15,21,26,28,25,24,27,26,23,24,22,22,15,17,12, 8,10, 7, 7, 4, 0, 5, 0, 1, - 1, 2, 0, 1, 9,14,13,10,19,24,22,29,30,28,30,30,31,23,24,19,17,14,13, 8, 8, 8, 1, 4, 0, 0, 0, 3, - 5, 2, 4, 2, 9, 8, 8, 8,18,23,20,27,30,27,31,25,28,30,28,24,24,15,11,14,10, 3, 4, 3, 0, 0, 1, 3, - 9, 3, 4, 3, 5, 6, 8,13,14,23,21,27,28,27,28,27,27,29,30,24,22,23,13,15, 8, 6, 2, 0, 4, 3, 4, 1, - 6, 5, 5, 3, 9, 3, 6,14,13,16,23,26,28,23,30,31,28,29,26,27,21,20,15,15,13, 9, 1, 0, 2, 0, 5, 8, - 8, 4, 3, 7, 2, 0,10, 7,10,14,21,21,29,28,25,27,30,28,25,24,27,22,19,13,10, 5, 0, 0, 0, 0, 0, 7, - 7, 6, 7, 0, 2, 2, 5, 6,15,11,19,24,22,29,27,31,30,30,31,28,23,18,14,14, 7, 5, 0, 0, 1, 0, 1, 0, - 5, 5, 5, 0, 0, 4, 5,11, 7,10,13,20,21,21,28,31,28,30,26,28,25,21, 9,12, 3, 3, 0, 2, 2, 2, 0, 1, - 3, 3, 0, 2, 0, 3, 5, 3,11,11,16,19,19,27,26,26,30,27,28,26,23,22,16, 6, 2, 2, 3, 2, 0, 2, 4, 0, - 0, 0, 0, 3, 3, 1, 0, 4, 5, 9,11,16,24,20,28,26,28,24,28,25,22,21,16, 5, 7, 5, 7, 3, 2, 3, 3, 6, - 0, 0, 2, 0, 2, 0, 4, 3, 8,12, 9,17,16,23,23,27,27,22,26,22,21,21,13,14, 5, 3, 7, 3, 2, 4, 6, 1, - 2, 5, 6, 4, 0, 1, 5, 8, 7, 6,15,17,22,20,24,28,23,25,20,21,18,16,13,15,13,10, 8, 5, 5, 9, 3, 7, - 7, 7, 0, 5, 1, 6, 7, 9,12, 9,12,21,22,25,24,22,23,25,24,18,24,22,17,13,10, 9,10, 9, 6,11, 6, 5, -}; - -const FTexture::Span FBackdropTexture::DummySpan[2] = { { 0, 160 }, { 0, 0 } }; - -//============================================================================= -// -// -// -//============================================================================= - -FBackdropTexture::FBackdropTexture() -{ - Width = 144; - Height = 160; - WidthBits = 8; - HeightBits = 8; - WidthMask = 255; - LastRenderTic = 0; - - for (int i = 0; i < COS_SIZE; ++i) - { - costab[i] = uint32_t(cos(i * (M_PI / (COS_SIZE / 2))) * 65536); - } - - time1 = DEGREES(180); - time2 = DEGREES(56); - time3 = DEGREES(99); - time4 = DEGREES(1); - t1ang = DEGREES(90); - t2ang = 0; - z1ang = 0; - z2ang = DEGREES(45); -} - -//============================================================================= -// -// -// -//============================================================================= - -bool FBackdropTexture::CheckModified() -{ - return LastRenderTic != gametic; -} - -void FBackdropTexture::Unload() -{ -} - -//============================================================================= -// -// -// -//============================================================================= - -const BYTE *FBackdropTexture::GetColumn(unsigned int column, const Span **spans_out) -{ - if (LastRenderTic != gametic) - { - Render(); - } - column = clamp(column, 0u, 143u); - if (spans_out != NULL) - { - *spans_out = DummySpan; - } - return Pixels + column*160; -} - -//============================================================================= -// -// -// -//============================================================================= - -const BYTE *FBackdropTexture::GetPixels() -{ - if (LastRenderTic != gametic) - { - Render(); - } - return Pixels; -} - -//============================================================================= -// -// This is one plasma and two rotozoomers. I think it turned out quite awesome. -// -//============================================================================= - -void FBackdropTexture::Render() -{ - BYTE *from; - int width, height, pitch; - - width = 160; - height = 144; - pitch = width; - - int x, y; - - const DWORD a1add = DEGREES(0.5); - const DWORD a2add = DEGREES(359); - const DWORD a3add = DEGREES(5 / 7.f); - const DWORD a4add = DEGREES(358.66666); - - const DWORD t1add = DEGREES(358); - const DWORD t2add = DEGREES(357.16666); - const DWORD t3add = DEGREES(2.285); - const DWORD t4add = DEGREES(359.33333); - const DWORD x1add = 5 * 524288; - const DWORD x2add = 0u - 13 * 524288; - const DWORD z1add = 3 * 524288; - const DWORD z2add = 4 * 524288; - - - DWORD a1, a2, a3, a4; - SDWORD c1, c2, c3, c4; - DWORD tx, ty, tc, ts; - DWORD ux, uy, uc, us; - DWORD ltx, lty, lux, luy; - - from = Pixels; - - a3 = time3; - a4 = time4; - - double z1 = (cos(TORAD(z2ang)) / 4 + 0.5) * (0x8000000); - double z2 = (cos(TORAD(z1ang)) / 4 + 0.75) * (0x8000000); - - tc = SDWORD(cos(TORAD(t1ang)) * z1); - ts = SDWORD(sin(TORAD(t1ang)) * z1); - uc = SDWORD(cos(TORAD(t2ang)) * z2); - us = SDWORD(sin(TORAD(t2ang)) * z2); - - ltx = -width / 2 * tc; - lty = -width / 2 * ts; - lux = -width / 2 * uc; - luy = -width / 2 * us; - - for (y = 0; y < height; ++y) - { - a1 = time1; - a2 = time2; - c3 = SDWORD(cos(TORAD(a3)) * 65536.0); - c4 = SDWORD(cos(TORAD(a4)) * 65536.0); - tx = ltx - (y - height / 2)*ts; - ty = lty + (y - height / 2)*tc; - ux = lux - (y - height / 2)*us; - uy = luy + (y - height / 2)*uc; - for (x = 0; x < width; ++x) - { - c1 = costab[a1 >> ANGLESHIFT]; - c2 = costab[a2 >> ANGLESHIFT]; - from[x] = ((c1 + c2 + c3 + c4) >> (16 + 3 - 7)) + 128 // plasma - + pattern1[(tx >> 27) + ((ty >> 22) & 992)] // rotozoomer 1 - + pattern2[(ux >> 27) + ((uy >> 22) & 992)]; // rotozoomer 2 - tx += tc; - ty += ts; - ux += uc; - uy += us; - a1 += a1add; - a2 += a2add; - } - a3 += a3add; - a4 += a4add; - from += pitch; - } - - time1 += t1add; - time2 += t2add; - time3 += t3add; - time4 += t4add; - t1ang += x1add; - t2ang += x2add; - z1ang += z1add; - z2ang += z2add; - - LastRenderTic = gametic; -} - - //============================================================================= // // @@ -369,7 +69,8 @@ DListMenuItemPlayerDisplay::DListMenuItemPlayerDisplay(DListMenuDescriptor *menu bdremap->Remap[i] = ColorMatcher.Pick (r, g, b); bdremap->Palette[i] = PalEntry(255, r, g, b); } - mBackdrop = new FBackdropTexture; + auto id = TexMan.CheckForTexture("PlayerBackdrop", FTexture::TEX_MiscPatch); + mBackdrop = TexMan[id]; mPlayerClass = NULL; mPlayerState = NULL; mNoportrait = np; @@ -391,7 +92,6 @@ DListMenuItemPlayerDisplay::DListMenuItemPlayerDisplay(DListMenuDescriptor *menu void DListMenuItemPlayerDisplay::OnDestroy() { - delete mBackdrop; } //============================================================================= diff --git a/src/textures/backdroptexture.cpp b/src/textures/backdroptexture.cpp new file mode 100644 index 000000000..9b05af103 --- /dev/null +++ b/src/textures/backdroptexture.cpp @@ -0,0 +1,357 @@ +/* +** backdroptexture.cpp +** The player display background for the player setup and class selection screen +** +**--------------------------------------------------------------------------- +** Copyright 1999-2010 Randy Heit +** Copyright 2010 Christoph Oelckers +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +#include "doomtype.h" +#include "doomstat.h" +#include "d_player.h" +#include "templates.h" +#include "menu/menu.h" +#include "colormatcher.h" +#include "textures/textures.h" +#include "w_wad.h" +#include "v_font.h" +#include "v_video.h" +#include "g_level.h" +#include "gi.h" +#include "r_defs.h" +#include "r_state.h" +#include "r_data/r_translate.h" + + +//============================================================================= +// +// Used by the player display +// +//============================================================================= + +struct FBackdropTexture : public FTexture +{ + enum + { + COS_SIZE = 256, + ANGLESHIFT = 24 + }; + + static constexpr uint32_t DEGREES(double v) + { + return uint32_t((v)*(0x40000000 / 90.0)); + } + + static double TORAD(uint32_t x) + { + return x*(M_PI / 0x80000000); + } + +public: + FBackdropTexture(); + + const BYTE *GetColumn(unsigned int column, const Span **spans_out); + const BYTE *GetPixels(); + void Unload(); + bool CheckModified(); + +protected: + uint32_t costab[COS_SIZE]; + BYTE Pixels[144*160]; + static const Span DummySpan[2]; + int LastRenderTic; + + uint32_t time1, time2, time3, time4; + uint32_t t1ang, t2ang, z1ang, z2ang; + + void Render(); +}; + + + +// A 32x32 cloud rendered with Photoshop, plus some other filters +static BYTE pattern1[1024] = +{ + 5, 9, 7,10, 9,15, 9, 7, 8,10, 5, 3, 5, 7, 9, 8,14, 8, 4, 7, 8, 9, 5, 7,14, 7, 0, 7,13,13, 9, 6, + 2, 7, 9, 7, 7,10, 8, 8,11,10, 6, 7,10, 7, 5, 6, 6, 4, 7,13,15,16,11,15,11, 8, 0, 4,13,22,17,11, + 5, 9, 9, 7, 9,10, 4, 3, 6, 7, 8, 6, 5, 4, 2, 2, 1, 4, 6,11,15,15,14,13,17, 9, 5, 9,11,12,17,20, + 9,16, 9, 8,12,13, 7, 3, 7, 9, 5, 4, 2, 5, 5, 5, 7,11, 6, 7, 6,13,17,10,10, 9,12,17,14,12,16,15, + 15,13, 5, 3, 9,10, 4,10,12,12, 7, 9, 8, 8, 8,10, 7, 6, 5, 5, 5, 6,11, 9, 3,13,16,18,21,16,23,18, + 23,13, 0, 0, 0, 0, 0,12,18,14,15,16,13, 7, 7, 5, 9, 6, 6, 8, 4, 0, 0, 0, 0,14,19,17,14,20,21,25, + 19,20,14,13, 7, 5,13,19,14,13,17,15,14, 7, 3, 5, 6,11, 7, 7, 8, 8,10, 9, 9,18,17,15,14,15,18,16, + 16,29,24,23,18, 9,17,20,11, 5,12,15,15,12, 6, 3, 4, 6, 7,10,13,18,18,19,16,12,17,19,23,16,14,14, + 9,18,20,26,19, 5,18,18,10, 5,12,15,14,17,11, 6,11, 9,10,13,10,20,24,20,21,20,14,18,15,22,20,19, + 0, 6,16,18, 8, 7,15,18,10,13,17,17,13,11,15,11,19,12,13,10, 4,15,19,21,21,24,14, 9,17,20,24,17, + 18,17, 7, 7,16,21,22,15, 5,14,20,14,13,21,13, 8,12,14, 7, 8,11,15,13,11,16,17, 7, 5,12,17,19,14, + 25,23,17,16,23,18,15, 7, 0, 6,11, 6,11,15,11, 7,12, 7, 4,10,16,13, 7, 7,15,13, 9,15,21,14, 5, 0, + 18,22,21,21,21,22,12, 6,14,20,15, 6,10,19,13, 8, 7, 3, 7,12,14,16, 9,12,22,15,12,18,24,19,17, 9, + 0,15,18,21,17,25,14,13,19,21,21,11, 6,13,16,16,12,10,12,11,13,20,14,13,18,13, 9,15,16,25,31,20, + 5,20,24,16, 7,14,14,11,18,19,19, 6, 0, 5,11,14,17,16,19,14,15,21,19,15,14,14, 8, 0, 7,24,18,16, + 9,17,15, 7, 6,14,12, 7,14,16,11, 4, 7, 6,13,16,15,13,12,20,21,20,21,17,18,26,14, 0,13,23,21,11, + 9,12,18,11,15,21,13, 8,13,13,10, 7,13, 8, 8,19,13, 7, 4,15,19,18,14,12,14,15, 8, 6,16,22,22,15, + 9,17,14,19,15,14,15, 9,11, 9, 6, 8,14,13,13,12, 5, 0, 0, 6,12,13, 7, 7, 9, 7, 0,12,21,16,15,18, + 15,16,18,11, 6, 8,15, 9, 2, 0, 5,10,10,16, 9, 0, 4,12,15, 9,12, 9, 7, 7,12, 7, 0, 6,12, 6, 9,13, + 12,19,15,14,11, 7, 8, 9,12,10, 5, 5, 7,12,12,10,14,16,16,11, 8,12,10,12,10, 8,10,10,14,12,16,16, + 16,17,20,22,12,15,12,14,19,11, 6, 5,10,13,17,17,21,19,15, 9, 6, 9,15,18,10,10,18,14,20,15,16,17, + 11,19,19,18,19,14,17,13,12,12, 7,11,18,17,16,15,19,19,10, 2, 0, 8,15,12, 8,11,12,10,19,20,19,19, + 6,14,18,13,13,16,16,12, 5, 8,10,12,10,13,18,12, 9,10, 7, 6, 5,11, 8, 6, 7,13,16,13,10,15,20,14, + 0, 5,12,12, 4, 0, 9,16, 9,10,12, 8, 0, 9,13, 9, 0, 2, 4, 7,10, 6, 7, 3, 4,11,16,18,10,11,21,21, + 16,13,11,15, 8, 0, 5, 9, 8, 7, 6, 3, 0, 9,17, 9, 0, 0, 0, 3, 5, 4, 3, 5, 7,15,16,16,17,14,22,22, + 24,14,15,12, 9, 0, 5,10, 8, 4, 7,12,10,11,12, 7, 6, 8, 6, 5, 7, 8, 8,11,13,10,15,14,12,18,20,16, + 16,17,17,18,12, 9,12,16,10, 5, 6,20,13,15, 8, 4, 8, 9, 8, 7, 9,11,12,17,16,16,11,10, 9,10, 5, 0, + 0,14,18,18,15,16,14, 9,10, 9, 9,15,14,10, 4, 6,10, 8, 8, 7,10, 9,10,16,18,10, 0, 0, 7,12,10, 8, + 0,14,19,14, 9,11,11, 8, 8,10,15, 9,10, 7, 4,10,13, 9, 7, 5, 5, 7, 7, 7,13,13, 5, 5,14,22,18,16, + 0,10,14,10, 3, 6, 5, 6, 8, 9, 8, 9, 5, 9, 8, 9, 6, 8, 8, 8, 1, 0, 0, 0, 9,17,12,12,17,19,20,13, + 6,11,17,11, 5, 5, 8,10, 6, 5, 6, 6, 3, 7, 9, 7, 6, 8,12,10, 4, 8, 6, 6,11,16,16,15,16,17,17,16, + 11, 9,10,10, 5, 6,12,10, 5, 1, 6,10, 5, 3, 3, 5, 4, 7,15,10, 7,13, 7, 8,15,11,15,15,15, 8,11,15, +}; + +// Just a 32x32 cloud rendered with the standard Photoshop filter +static BYTE pattern2[1024] = +{ + 9, 9, 8, 8, 8, 8, 6, 6,13,13,11,21,19,21,23,18,23,24,19,19,24,17,18,12, 9,14, 8,12,12, 5, 8, 6, + 11,10, 6, 7, 8, 8, 9,13,10,11,17,15,23,22,23,22,20,26,27,26,17,21,20,14,12, 8,11, 8,11, 7, 8, 7, + 6, 9,13,13,10, 9,13, 7,12,13,16,19,16,20,22,25,22,25,27,22,21,23,15,10,14,14,15,13,12, 8,12, 6, + 6, 7,12,12,12,16, 9,12,12,15,16,11,21,24,19,24,23,26,28,27,26,21,14,15, 7, 7,10,15,12,11,10, 9, + 7,14,11,16,12,18,16,14,16,14,11,14,15,21,23,17,20,18,26,24,27,18,20,11,11,14,10,17,17,10, 6,10, + 13, 9,14,10,13,11,14,15,18,15,15,12,19,19,20,18,22,20,19,22,19,19,19,20,17,15,15,11,16,14,10, 8, + 13,16,12,16,17,19,17,18,15,19,14,18,15,14,15,17,21,19,23,18,23,22,18,18,17,15,15,16,12,12,15,10, + 10,12,14,10,16,11,18,15,21,20,20,17,18,19,16,19,14,20,19,14,19,25,22,21,22,24,18,12, 9, 9, 8, 6, + 10,10,13, 9,15,13,20,19,22,18,18,17,17,21,21,13,13,12,19,18,16,17,27,26,22,23,20,17,12,11, 8, 9, + 7,13,14,15,11,13,18,22,19,23,23,20,22,24,21,14,12,16,17,19,18,18,22,18,24,23,19,17,16,14, 8, 7, + 12,12, 8, 8,16,20,26,25,28,28,22,29,23,22,21,18,13,16,15,15,20,17,25,24,19,17,17,17,15,10, 8, 9, + 7,12,15,11,17,20,25,25,25,29,30,31,28,26,18,16,17,18,20,21,22,20,23,19,18,19,10,16,16,11,11, 8, + 5, 6, 8,14,14,17,17,21,27,23,27,31,27,22,23,21,19,19,21,19,20,19,17,22,13,17,12,15,10,10,12, 6, + 8, 9, 8,14,15,16,15,18,27,26,23,25,23,22,18,21,20,17,19,20,20,16,20,14,15,13,12, 8, 8, 7,11,13, + 7, 6,11,11,11,13,15,22,25,24,26,22,24,26,23,18,24,24,20,18,20,16,17,12,12,12,10, 8,11, 9, 6, 8, + 9,10, 9, 6, 5,14,16,19,17,21,26,20,23,19,19,17,20,21,26,25,23,21,17,13,12, 5,13,11, 7,12,10,12, + 6, 5, 4,10,11, 9,10,13,17,20,20,18,23,26,27,20,21,24,20,19,24,20,18,10,11, 3, 6,13, 9, 6, 8, 8, + 1, 2, 2,11,13,13,11,16,16,16,19,21,20,23,22,28,21,20,19,18,23,16,18, 7, 5, 9, 7, 6, 5,10, 8, 8, + 0, 0, 6, 9,11,15,12,12,19,18,19,26,22,24,26,30,23,22,22,16,20,19,12,12, 3, 4, 6, 5, 4, 7, 2, 4, + 2, 0, 0, 7,11, 8,14,13,15,21,26,28,25,24,27,26,23,24,22,22,15,17,12, 8,10, 7, 7, 4, 0, 5, 0, 1, + 1, 2, 0, 1, 9,14,13,10,19,24,22,29,30,28,30,30,31,23,24,19,17,14,13, 8, 8, 8, 1, 4, 0, 0, 0, 3, + 5, 2, 4, 2, 9, 8, 8, 8,18,23,20,27,30,27,31,25,28,30,28,24,24,15,11,14,10, 3, 4, 3, 0, 0, 1, 3, + 9, 3, 4, 3, 5, 6, 8,13,14,23,21,27,28,27,28,27,27,29,30,24,22,23,13,15, 8, 6, 2, 0, 4, 3, 4, 1, + 6, 5, 5, 3, 9, 3, 6,14,13,16,23,26,28,23,30,31,28,29,26,27,21,20,15,15,13, 9, 1, 0, 2, 0, 5, 8, + 8, 4, 3, 7, 2, 0,10, 7,10,14,21,21,29,28,25,27,30,28,25,24,27,22,19,13,10, 5, 0, 0, 0, 0, 0, 7, + 7, 6, 7, 0, 2, 2, 5, 6,15,11,19,24,22,29,27,31,30,30,31,28,23,18,14,14, 7, 5, 0, 0, 1, 0, 1, 0, + 5, 5, 5, 0, 0, 4, 5,11, 7,10,13,20,21,21,28,31,28,30,26,28,25,21, 9,12, 3, 3, 0, 2, 2, 2, 0, 1, + 3, 3, 0, 2, 0, 3, 5, 3,11,11,16,19,19,27,26,26,30,27,28,26,23,22,16, 6, 2, 2, 3, 2, 0, 2, 4, 0, + 0, 0, 0, 3, 3, 1, 0, 4, 5, 9,11,16,24,20,28,26,28,24,28,25,22,21,16, 5, 7, 5, 7, 3, 2, 3, 3, 6, + 0, 0, 2, 0, 2, 0, 4, 3, 8,12, 9,17,16,23,23,27,27,22,26,22,21,21,13,14, 5, 3, 7, 3, 2, 4, 6, 1, + 2, 5, 6, 4, 0, 1, 5, 8, 7, 6,15,17,22,20,24,28,23,25,20,21,18,16,13,15,13,10, 8, 5, 5, 9, 3, 7, + 7, 7, 0, 5, 1, 6, 7, 9,12, 9,12,21,22,25,24,22,23,25,24,18,24,22,17,13,10, 9,10, 9, 6,11, 6, 5, +}; + +const FTexture::Span FBackdropTexture::DummySpan[2] = { { 0, 160 }, { 0, 0 } }; + +//============================================================================= +// +// +// +//============================================================================= + +FBackdropTexture::FBackdropTexture() +{ + Width = 144; + Height = 160; + WidthBits = 8; + HeightBits = 8; + WidthMask = 255; + LastRenderTic = 0; + + for (int i = 0; i < COS_SIZE; ++i) + { + costab[i] = uint32_t(cos(i * (M_PI / (COS_SIZE / 2))) * 65536); + } + + time1 = DEGREES(180); + time2 = DEGREES(56); + time3 = DEGREES(99); + time4 = DEGREES(1); + t1ang = DEGREES(90); + t2ang = 0; + z1ang = 0; + z2ang = DEGREES(45); +} + +//============================================================================= +// +// +// +//============================================================================= + +bool FBackdropTexture::CheckModified() +{ + return LastRenderTic != gametic; +} + +void FBackdropTexture::Unload() +{ +} + +//============================================================================= +// +// +// +//============================================================================= + +const BYTE *FBackdropTexture::GetColumn(unsigned int column, const Span **spans_out) +{ + if (LastRenderTic != gametic) + { + Render(); + } + column = clamp(column, 0u, 143u); + if (spans_out != NULL) + { + *spans_out = DummySpan; + } + return Pixels + column*160; +} + +//============================================================================= +// +// +// +//============================================================================= + +const BYTE *FBackdropTexture::GetPixels() +{ + if (LastRenderTic != gametic) + { + Render(); + } + return Pixels; +} + +//============================================================================= +// +// This is one plasma and two rotozoomers. I think it turned out quite awesome. +// +//============================================================================= + +void FBackdropTexture::Render() +{ + BYTE *from; + int width, height, pitch; + + width = 160; + height = 144; + pitch = width; + + int x, y; + + const DWORD a1add = DEGREES(0.5); + const DWORD a2add = DEGREES(359); + const DWORD a3add = DEGREES(5 / 7.f); + const DWORD a4add = DEGREES(358.66666); + + const DWORD t1add = DEGREES(358); + const DWORD t2add = DEGREES(357.16666); + const DWORD t3add = DEGREES(2.285); + const DWORD t4add = DEGREES(359.33333); + const DWORD x1add = 5 * 524288; + const DWORD x2add = 0u - 13 * 524288; + const DWORD z1add = 3 * 524288; + const DWORD z2add = 4 * 524288; + + + DWORD a1, a2, a3, a4; + SDWORD c1, c2, c3, c4; + DWORD tx, ty, tc, ts; + DWORD ux, uy, uc, us; + DWORD ltx, lty, lux, luy; + + from = Pixels; + + a3 = time3; + a4 = time4; + + double z1 = (cos(TORAD(z2ang)) / 4 + 0.5) * (0x8000000); + double z2 = (cos(TORAD(z1ang)) / 4 + 0.75) * (0x8000000); + + tc = SDWORD(cos(TORAD(t1ang)) * z1); + ts = SDWORD(sin(TORAD(t1ang)) * z1); + uc = SDWORD(cos(TORAD(t2ang)) * z2); + us = SDWORD(sin(TORAD(t2ang)) * z2); + + ltx = -width / 2 * tc; + lty = -width / 2 * ts; + lux = -width / 2 * uc; + luy = -width / 2 * us; + + for (y = 0; y < height; ++y) + { + a1 = time1; + a2 = time2; + c3 = SDWORD(cos(TORAD(a3)) * 65536.0); + c4 = SDWORD(cos(TORAD(a4)) * 65536.0); + tx = ltx - (y - height / 2)*ts; + ty = lty + (y - height / 2)*tc; + ux = lux - (y - height / 2)*us; + uy = luy + (y - height / 2)*uc; + for (x = 0; x < width; ++x) + { + c1 = costab[a1 >> ANGLESHIFT]; + c2 = costab[a2 >> ANGLESHIFT]; + from[x] = ((c1 + c2 + c3 + c4) >> (16 + 3 - 7)) + 128 // plasma + + pattern1[(tx >> 27) + ((ty >> 22) & 992)] // rotozoomer 1 + + pattern2[(ux >> 27) + ((uy >> 22) & 992)]; // rotozoomer 2 + tx += tc; + ty += ts; + ux += uc; + uy += us; + a1 += a1add; + a2 += a2add; + } + a3 += a3add; + a4 += a4add; + from += pitch; + } + + time1 += t1add; + time2 += t2add; + time3 += t3add; + time4 += t4add; + t1ang += x1add; + t2ang += x2add; + z1ang += z1add; + z2ang += z2add; + + LastRenderTic = gametic; +} + +FTexture *GetBackdropTexture() +{ + auto t = new FBackdropTexture; + t->Name = "PlayerBackdrop"; + return t; +} \ No newline at end of file diff --git a/src/textures/texturemanager.cpp b/src/textures/texturemanager.cpp index c94f4f467..114919df9 100644 --- a/src/textures/texturemanager.cpp +++ b/src/textures/texturemanager.cpp @@ -976,6 +976,7 @@ void FTextureManager::SortTexturesByType(int start, int end) // FTextureManager :: Init // //========================================================================== +FTexture *GetBackdropTexture(); void FTextureManager::Init() { @@ -987,6 +988,7 @@ void FTextureManager::Init() // Texture 0 is a dummy texture used to indicate "no texture" AddTexture (new FDummyTexture); + AddTexture(GetBackdropTexture()); int wadcnt = Wads.GetNumWads(); for(int i = 0; i< wadcnt; i++) From 98de1fcfcb0c5b2885b7f6209f62dc743b5b1b56 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 10 Feb 2017 14:18:00 +0100 Subject: [PATCH 5/6] - make the pixel buffer of the player backdrop dynamic. --- src/gl/scene/gl_scene.cpp | 5 +++++ src/textures/backdroptexture.cpp | 22 +++++++++++++--------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/gl/scene/gl_scene.cpp b/src/gl/scene/gl_scene.cpp index e9d6b7e1e..285b7798d 100644 --- a/src/gl/scene/gl_scene.cpp +++ b/src/gl/scene/gl_scene.cpp @@ -1052,6 +1052,11 @@ void FGLInterface::PrecacheTexture(FTexture *tex, int cache) FMaterial * gltex = FMaterial::ValidateTexture(tex, false); if (gltex) gltex->Precache(); } + else + { + // make sure that software pixel buffers do not stick around for unneeded textures. + tex->Unload(); + } } //========================================================================== diff --git a/src/textures/backdroptexture.cpp b/src/textures/backdroptexture.cpp index 9b05af103..b4b2793dc 100644 --- a/src/textures/backdroptexture.cpp +++ b/src/textures/backdroptexture.cpp @@ -77,14 +77,14 @@ struct FBackdropTexture : public FTexture public: FBackdropTexture(); - const BYTE *GetColumn(unsigned int column, const Span **spans_out); - const BYTE *GetPixels(); + const uint8_t *GetColumn(unsigned int column, const Span **spans_out); + const uint8_t *GetPixels(); void Unload(); bool CheckModified(); protected: uint32_t costab[COS_SIZE]; - BYTE Pixels[144*160]; + uint8_t *Pixels; static const Span DummySpan[2]; int LastRenderTic; @@ -97,7 +97,7 @@ protected: // A 32x32 cloud rendered with Photoshop, plus some other filters -static BYTE pattern1[1024] = +static uint8_t pattern1[1024] = { 5, 9, 7,10, 9,15, 9, 7, 8,10, 5, 3, 5, 7, 9, 8,14, 8, 4, 7, 8, 9, 5, 7,14, 7, 0, 7,13,13, 9, 6, 2, 7, 9, 7, 7,10, 8, 8,11,10, 6, 7,10, 7, 5, 6, 6, 4, 7,13,15,16,11,15,11, 8, 0, 4,13,22,17,11, @@ -134,7 +134,7 @@ static BYTE pattern1[1024] = }; // Just a 32x32 cloud rendered with the standard Photoshop filter -static BYTE pattern2[1024] = +static uint8_t pattern2[1024] = { 9, 9, 8, 8, 8, 8, 6, 6,13,13,11,21,19,21,23,18,23,24,19,19,24,17,18,12, 9,14, 8,12,12, 5, 8, 6, 11,10, 6, 7, 8, 8, 9,13,10,11,17,15,23,22,23,22,20,26,27,26,17,21,20,14,12, 8,11, 8,11, 7, 8, 7, @@ -180,6 +180,7 @@ const FTexture::Span FBackdropTexture::DummySpan[2] = { { 0, 160 }, { 0, 0 } }; FBackdropTexture::FBackdropTexture() { + Pixels = nullptr; Width = 144; Height = 160; WidthBits = 8; @@ -215,6 +216,8 @@ bool FBackdropTexture::CheckModified() void FBackdropTexture::Unload() { + if (Pixels != nullptr) delete[] Pixels; + Pixels = nullptr; } //============================================================================= @@ -223,14 +226,14 @@ void FBackdropTexture::Unload() // //============================================================================= -const BYTE *FBackdropTexture::GetColumn(unsigned int column, const Span **spans_out) +const uint8_t *FBackdropTexture::GetColumn(unsigned int column, const Span **spans_out) { if (LastRenderTic != gametic) { Render(); } column = clamp(column, 0u, 143u); - if (spans_out != NULL) + if (spans_out != nullptr) { *spans_out = DummySpan; } @@ -243,7 +246,7 @@ const BYTE *FBackdropTexture::GetColumn(unsigned int column, const Span **spans_ // //============================================================================= -const BYTE *FBackdropTexture::GetPixels() +const uint8_t *FBackdropTexture::GetPixels() { if (LastRenderTic != gametic) { @@ -260,9 +263,10 @@ const BYTE *FBackdropTexture::GetPixels() void FBackdropTexture::Render() { - BYTE *from; + uint8_t *from; int width, height, pitch; + if (Pixels == nullptr) Pixels = new uint8_t[160 * 144]; width = 160; height = 144; pitch = width; From d2affc7c0ca57a14aaffd71ac6d8547dfe1258ac Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 10 Feb 2017 16:19:33 +0200 Subject: [PATCH 6/6] Fixed crash on attempt to get string value of null https://mantis.zdoom.org/view.php?id=231 --- src/scripting/zscript/zcc_compile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripting/zscript/zcc_compile.cpp b/src/scripting/zscript/zcc_compile.cpp index 4972e1344..b4a97c3cf 100644 --- a/src/scripting/zscript/zcc_compile.cpp +++ b/src/scripting/zscript/zcc_compile.cpp @@ -69,7 +69,7 @@ static FString GetStringConst(FxExpression *ex, FCompileContext &ctx) { ex = new FxStringCast(ex); ex = ex->Resolve(ctx); - return static_cast(ex)->GetValue().GetString(); + return ex ? static_cast(ex)->GetValue().GetString() : FString(); } int ZCCCompiler::IntConstFromNode(ZCC_TreeNode *node, PStruct *cls)