diff --git a/doomsday/plugins/common/src/hu_lib.c b/doomsday/plugins/common/src/hu_lib.c index 879fab9001..3b57932fef 100644 --- a/doomsday/plugins/common/src/hu_lib.c +++ b/doomsday/plugins/common/src/hu_lib.c @@ -331,37 +331,6 @@ boolean GUI_GameTicTriggerIsSharp(void) return sharpTic; } -static void drawWidget(uiwidget_t* obj, int x, int y) -{ - assert(obj); - if(!obj->drawer || obj->alpha <= 0) return; - - uiRS.pageAlpha = obj->alpha; - - DGL_MatrixMode(DGL_MODELVIEW); - DGL_Translatef(x, y, 0); - - obj->drawer(obj, 0, 0); - - DGL_MatrixMode(DGL_MODELVIEW); - DGL_Translatef(-x, -y, 0); -} - -static void drawChildWidgets(uiwidget_t* obj, int x, int y) -{ - guidata_group_t* grp = (guidata_group_t*)obj->typedata; - int i; - assert(obj && obj->type == GUI_GROUP); - - if(!grp->widgetIdCount) return; - - for(i = 0; i < grp->widgetIdCount; ++i) - { - uiwidget_t* child = GUI_MustFindObjectById(grp->widgetIds[i]); - GUI_DrawWidget(child, x + child->geometry.origin.x, y + child->geometry.origin.y); - } -} - void UIGroup_UpdateGeometry(uiwidget_t* obj) { guidata_group_t* grp = (guidata_group_t*)obj->typedata; @@ -450,24 +419,55 @@ void UIGroup_UpdateGeometry(uiwidget_t* obj) } } -void GUI_DrawWidget(uiwidget_t* obj, int x, int y) +static void drawWidget2(uiwidget_t* obj, int x, int y) { - if(UIWidget_MaximumWidth(obj) == 0 || UIWidget_MaximumHeight(obj) == 0 || - UIWidget_Alpha(obj) <= 0) return; + assert(obj); + if(!obj->drawer || obj->alpha <= 0) return; - FR_PushAttrib(); - FR_LoadDefaultAttrib(); + uiRS.pageAlpha = obj->alpha; + + obj->drawer(obj, x + obj->geometry.origin.x, y + obj->geometry.origin.y); +} + +static void drawWidget(uiwidget_t* obj, int x, int y) +{ + assert(obj); + + DGL_MatrixMode(DGL_MODELVIEW); + DGL_Translatef(x, y, 0); // First we draw ourself. - obj->updateGeometry(obj); - drawWidget(obj, x, y); + drawWidget2(obj, 0, 0); if(obj->type == GUI_GROUP) { // Now our children. - drawChildWidgets(obj, x, y); + guidata_group_t* grp = (guidata_group_t*)obj->typedata; + int i; + for(i = 0; i < grp->widgetIdCount; ++i) + { + uiwidget_t* child = GUI_MustFindObjectById(grp->widgetIds[i]); + drawWidget(child, 0, 0); + } } + DGL_MatrixMode(DGL_MODELVIEW); + DGL_Translatef(-x, -y, 0); +} + +void GUI_DrawWidget(uiwidget_t* obj, int x, int y) +{ + if(!obj) return; + if(UIWidget_MaximumWidth(obj) < 1 || UIWidget_MaximumHeight(obj) < 1) return; + if(UIWidget_Alpha(obj) <= 0) return; + + obj->updateGeometry(obj); + + FR_PushAttrib(); + FR_LoadDefaultAttrib(); + + drawWidget(obj, x, y); + FR_PopAttrib(); } diff --git a/doomsday/plugins/jdoom/src/st_stuff.c b/doomsday/plugins/jdoom/src/st_stuff.c index c2dfa66c07..31a14944ca 100644 --- a/doomsday/plugins/jdoom/src/st_stuff.c +++ b/doomsday/plugins/jdoom/src/st_stuff.c @@ -161,6 +161,7 @@ typedef enum { enum { UWG_STATUSBAR = 0, UWG_MAPNAME, + UWG_BOTTOM, UWG_BOTTOMLEFT, UWG_BOTTOMLEFT2, UWG_BOTTOMRIGHT, @@ -2133,15 +2134,17 @@ void Face_Drawer(uiwidget_t* obj, int x, int y) DGL_Enable(DGL_TEXTURE_2D); DGL_Color4f(1, 1, 1, iconAlpha); + x = -(SCREENWIDTH/2 - ST_FACESX); + y = -1; if(R_GetPatchInfo(pFaceBackground[cfg.playerColor[obj->player]], &bgInfo)) { if(IS_NETGAME) { - GL_DrawPatch2(bgInfo.id, x, y, ALIGN_BOTTOM); + GL_DrawPatch2(bgInfo.id, 0, 0, ALIGN_BOTTOM); } y -= bgInfo.geometry.size.height; } - GL_DrawPatch(pFace, x - (SCREENWIDTH/2 - ST_FACESX), y - 1); + GL_DrawPatch(pFace, x, y); DGL_Disable(DGL_TEXTURE_2D); DGL_MatrixMode(DGL_MODELVIEW); @@ -2848,7 +2851,7 @@ void ST_Drawer(int player) drawnSize.height = UIWidget_Geometry(obj)->size.height; } - alpha = hud->alpha * (1-hud->hideAmount); + alpha = /**\kludge: clamp*/MIN_OF(1.0f, hud->alpha)/**kludge end*/ * (1-hud->hideAmount); x += PADDING; y += PADDING; width -= PADDING*2; @@ -2856,19 +2859,7 @@ void ST_Drawer(int player) if(!hud->statusbarActive) { - int h = 0; - - obj = GUI_MustFindObjectById(hud->widgetGroupIds[UWG_BOTTOMLEFT]); - UIWidget_SetAlpha(obj, alpha); - size.width = width; size.height = height; - UIWidget_SetMaximumSize(obj, &size); - GUI_DrawWidget(obj, x, y); - - drawnSize.width = UIWidget_Geometry(obj)->size.width; - drawnSize.height = UIWidget_Geometry(obj)->size.height; - if(drawnSize.height > h) h = drawnSize.height; - - obj = GUI_MustFindObjectById(hud->widgetGroupIds[UWG_BOTTOMCENTER]); + obj = GUI_MustFindObjectById(hud->widgetGroupIds[UWG_BOTTOM]); UIWidget_SetAlpha(obj, alpha); size.width = width; size.height = height; UIWidget_SetMaximumSize(obj, &size); @@ -2876,18 +2867,6 @@ void ST_Drawer(int player) drawnSize.width = UIWidget_Geometry(obj)->size.width; drawnSize.height = UIWidget_Geometry(obj)->size.height; - if(drawnSize.height > h) h = drawnSize.height; - - obj = GUI_MustFindObjectById(hud->widgetGroupIds[UWG_BOTTOMRIGHT]); - UIWidget_SetAlpha(obj, alpha); - size.width = width; size.height = height; - UIWidget_SetMaximumSize(obj, &size); - GUI_DrawWidget(obj, x, y); - - drawnSize.width = UIWidget_Geometry(obj)->size.width; - drawnSize.height = UIWidget_Geometry(obj)->size.height; - if(drawnSize.height > h) h = drawnSize.height; - drawnSize.height = h; } if(!hud->statusbarActive) @@ -3250,6 +3229,7 @@ void ST_BuildWidgets(int player) { UWG_BOTTOMLEFT2, ALIGN_BOTTOMLEFT, UWGF_LEFTTORIGHT, PADDING }, { UWG_BOTTOMRIGHT, ALIGN_BOTTOMRIGHT, UWGF_RIGHTTOLEFT, PADDING }, { UWG_BOTTOMCENTER, ALIGN_BOTTOM, UWGF_VERTICAL|UWGF_RIGHTTOLEFT, PADDING }, + { UWG_BOTTOM, ALIGN_BOTTOM, UWGF_LEFTTORIGHT }, { UWG_TOP, ALIGN_TOPLEFT, UWGF_VERTICAL|UWGF_LEFTTORIGHT, PADDING }, { UWG_COUNTERS, ALIGN_LEFT, UWGF_VERTICAL|UWGF_RIGHTTOLEFT, PADDING }, { UWG_AUTOMAP, ALIGN_TOPLEFT } @@ -3314,6 +3294,13 @@ void ST_BuildWidgets(int player) UIGroup_AddWidget(GUI_MustFindObjectById(hud->widgetGroupIds[def->group]), GUI_FindObjectById(id)); } + UIGroup_AddWidget(GUI_MustFindObjectById(hud->widgetGroupIds[UWG_BOTTOM]), + GUI_MustFindObjectById(hud->widgetGroupIds[UWG_BOTTOMLEFT])); + UIGroup_AddWidget(GUI_MustFindObjectById(hud->widgetGroupIds[UWG_BOTTOM]), + GUI_MustFindObjectById(hud->widgetGroupIds[UWG_BOTTOMCENTER])); + UIGroup_AddWidget(GUI_MustFindObjectById(hud->widgetGroupIds[UWG_BOTTOM]), + GUI_MustFindObjectById(hud->widgetGroupIds[UWG_BOTTOMRIGHT])); + hud->logWidgetId = GUI_CreateWidget(GUI_LOG, player, FID(GF_FONTA), 1, UILog_UpdateGeometry, UILog_Drawer, UILog_Ticker, &hud->log); UIGroup_AddWidget(GUI_MustFindObjectById(hud->widgetGroupIds[UWG_TOP]), GUI_FindObjectById(hud->logWidgetId));