Skip to content

Commit

Permalink
Refactor: Shadow strength is now a font renderer state attribute.
Browse files Browse the repository at this point in the history
  • Loading branch information
danij-deng committed Jun 12, 2011
1 parent 1fda008 commit af859e1
Show file tree
Hide file tree
Showing 13 changed files with 56 additions and 35 deletions.
3 changes: 2 additions & 1 deletion doomsday/engine/api/dd_bitmapfont.h
Expand Up @@ -92,6 +92,8 @@ void FR_SetTracking(int tracking);

void FR_SetShadowOffset(int offsetX, int offsetY);

void FR_SetShadowStrength(float value);

/// @return Unique identifier associated with the current font.
fontid_t FR_GetCurrentId(void);

Expand All @@ -115,7 +117,6 @@ void FR_DrawTextFragment(const char* string, int x, int y);
void FR_DrawTextFragment2(const char* string, int x, int y, short flags);
void FR_DrawTextFragment3(const char* string, int x, int y, short flags, int initialCount);
void FR_DrawTextFragment4(const char* string, int x, int y, short flags, int initialCount, float glitterStrength);
void FR_DrawTextFragment5(const char* string, int x, int y, short flags, int initialCount, float glitterStrength, float shadowStrength);

// Utility routines:
void FR_TextFragmentDimensions(int* width, int* height, const char* string);
Expand Down
4 changes: 2 additions & 2 deletions doomsday/engine/api/doomsday.def
Expand Up @@ -501,9 +501,10 @@ EXPORTS
FR_PopAttrib @514 NONAME
FR_LoadDefaultAttrib @515 NONAME

FR_Tracking @198 NONAME
FR_Tracking @123 NONAME
FR_SetTracking @124 NONAME
FR_SetShadowOffset @125 NONAME
FR_SetShadowStrength @198 NONAME
FR_ResetTypeInTimer @131 NONAME

FR_TextDimensions @112 NONAME
Expand All @@ -521,7 +522,6 @@ EXPORTS
FR_DrawTextFragment2 @120 NONAME
FR_DrawTextFragment3 @121 NONAME
FR_DrawTextFragment4 @122 NONAME
FR_DrawTextFragment5 @123 NONAME

FR_DrawChar @202 NONAME
FR_DrawChar2 @203 NONAME
Expand Down
1 change: 1 addition & 0 deletions doomsday/engine/portable/include/ui_main.h
Expand Up @@ -50,6 +50,7 @@ typedef enum {
#define UI_HEIGHT (1000.0f)
#define UI_BORDER (UI_WIDTH/120) /// All borders are this wide.
#define UI_SHADOW_OFFSET (MIN_OF(3, UI_WIDTH/320))
#define UI_SHADOW_STRENGTH (.6f)
#define UI_BUTTON_BORDER (UI_BORDER)
#define UI_BAR_WDH (UI_BORDER * 3)
#define UI_BAR_BORDER (UI_BORDER / 2)
Expand Down
4 changes: 4 additions & 0 deletions doomsday/engine/portable/src/edit_bias.c
Expand Up @@ -692,6 +692,7 @@ static void SBE_InfoBox(source_t* s, int rightX, char* title, float alpha)

FR_SetFont(glFontFixed);
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
UI_TextOutEx2(title, x, y, UI_Color(UIC_TITLE), alpha, DTF_ALIGN_LEFT|DTF_ONLY_SHADOW);
y += th;

Expand Down Expand Up @@ -755,6 +756,7 @@ static void SBE_DrawLevelGauge(int x, int y, int height)
FR_SetFont(glFontFixed);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
off = FR_TextFragmentWidth("000");

glBegin(GL_LINES);
Expand Down Expand Up @@ -831,6 +833,7 @@ void SBE_DrawHUD(void)
FR_SetFont(glFontFixed);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
w = FR_TextFragmentWidth(buf) + 16;
h = FR_TextFragmentHeight(buf) + 16;
y = theWindow->height - 10 - h;
Expand Down Expand Up @@ -923,6 +926,7 @@ static void SBE_DrawIndex(source_t *src)
FR_SetFont(glFontFixed);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
UI_TextOutEx(buf, 2, 2, UI_Color(UIC_TITLE), 1 - M_Distance(src->pos, eye)/2000);

glMatrixMode(GL_MODELVIEW);
Expand Down
50 changes: 28 additions & 22 deletions doomsday/engine/portable/src/gl_font.c
Expand Up @@ -46,6 +46,7 @@
typedef struct fr_state_attributes_s {
int tracking;
int shadowOffsetX, shadowOffsetY;
float shadowStrength;
} fr_state_attributes_t;

typedef struct {
Expand All @@ -62,7 +63,7 @@ typedef struct {
float offX, offY;
float angle;
float color[4];
float glitter, shadow;
float glitter, shadowStrength;
int shadowOffsetX, shadowOffsetY;
int tracking;
float leading;
Expand Down Expand Up @@ -424,6 +425,7 @@ void FR_LoadDefaultAttrib(void)
if(!inited)
Con_Error("FR_LoadDefaultAttrib: Font renderer has not yet been initialized.");
sat->tracking = DEFAULT_TRACKING;
sat->shadowStrength = DEFAULT_SHADOW_STRENGTH;
sat->shadowOffsetX = DEFAULT_SHADOW_XOFFSET;
sat->shadowOffsetY = DEFAULT_SHADOW_YOFFSET;
}
Expand Down Expand Up @@ -473,11 +475,19 @@ void FR_SetShadowOffset(int offsetX, int offsetY)
{
fr_state_attributes_t* sat = currentAttributes();
if(!inited)
Con_Error("FR_SetTracking: Font renderer has not yet been initialized.");
Con_Error("FR_SetShadowOffset: Font renderer has not yet been initialized.");
sat->shadowOffsetX = offsetX;
sat->shadowOffsetY = offsetY;
}

void FR_SetShadowStrength(float value)
{
fr_state_attributes_t* sat = currentAttributes();
if(!inited)
Con_Error("FR_SetShadowStrength: Font renderer has not yet been initialized.");
sat->shadowStrength = MINMAX_OF(0, value, 1);
}

void FR_CharDimensions(int* width, int* height, unsigned char ch)
{
if(!inited)
Expand Down Expand Up @@ -592,18 +602,18 @@ int FR_GlyphTopToAscent(const char* text)
}

static void drawTextFragment(const char* string, int x, int y, short flags,
int initialCount, float glitterStrength, float shadowStrength)
int initialCount, float glitterStrength)
{
assert(inited && string && string[0] && fr.fontIdx != -1);
{
bitmapfont_t* cf = fonts[fr.fontIdx];
fr_state_attributes_t* sat = currentAttributes();
boolean noTypein = (flags & DTF_NO_TYPEIN) != 0;
boolean noGlitter = (glitterStrength <= 0 || (flags & DTF_NO_GLITTER) != 0);
boolean noShadow = (shadowStrength <= 0 || (flags & DTF_NO_SHADOW) != 0 ||
boolean noShadow = (sat->shadowStrength <= 0 || (flags & DTF_NO_SHADOW) != 0 ||
(BitmapFont_Flags(cf) & BFF_HAS_EMBEDDEDSHADOW) != 0);
float glitter = (noGlitter? 0 : MIN_OF(glitterStrength, 1)), glitterMul;
float shadow = (noShadow ? 0 : MIN_OF(shadowStrength, 1)), shadowMul;
float shadow = (noShadow ? 0 : sat->shadowStrength), shadowMul;
int w, h, cx, cy, count, yoff;
float origColor[4], flashColor[3];
unsigned char c;
Expand Down Expand Up @@ -655,7 +665,7 @@ static void drawTextFragment(const char* string, int x, int y, short flags,
glitter = (noGlitter? 0 : glitterStrength);
glitterMul = 0;

shadow = (noShadow? 0 : shadowStrength);
shadow = (noShadow? 0 : sat->shadowStrength);
shadowMul = (noShadow? 0 : origColor[3]);

if(!(noTypein && noShadow && noGlitter))
Expand Down Expand Up @@ -777,8 +787,8 @@ static void drawTextFragment(const char* string, int x, int y, short flags,
}
}

void FR_DrawTextFragment5(const char* string, int x, int y, short flags,
int initialCount, float glitterStrength, float shadowStrength)
void FR_DrawTextFragment4(const char* string, int x, int y, short flags,
int initialCount, float glitterStrength)
{
if(!inited)
Con_Error("Bitmap font system not yet initialized.");
Expand All @@ -796,21 +806,13 @@ void FR_DrawTextFragment5(const char* string, int x, int y, short flags,
#endif
return;
}
drawTextFragment(string, x, y, flags, initialCount, glitterStrength, shadowStrength);
}

void FR_DrawTextFragment4(const char* string, int x, int y, short flags,
int initialCount, float glitterStrength)
{
FR_DrawTextFragment5(string, x, y, flags, initialCount, glitterStrength,
DEFAULT_SHADOW_STRENGTH);
drawTextFragment(string, x, y, flags, initialCount, glitterStrength);
}

void FR_DrawTextFragment3(const char* string, int x, int y, short flags,
int initialCount)
{
FR_DrawTextFragment4(string, x, y, flags, initialCount,
DEFAULT_GLITTER_STRENGTH);
FR_DrawTextFragment4(string, x, y, flags, initialCount, DEFAULT_GLITTER_STRENGTH);
}

void FR_DrawTextFragment2(const char* string, int x, int y, short flags)
Expand Down Expand Up @@ -1128,7 +1130,7 @@ static void parseParamaterBlock(char** strPtr, drawtextstate_t* state,
else if(!strnicmp((*strPtr), "shadow", 6))
{
(*strPtr) += 6;
state->shadow = parseFloat(&(*strPtr));
state->shadowStrength = parseFloat(&(*strPtr));
}
else if(!strnicmp((*strPtr), "tracking", 8))
{
Expand Down Expand Up @@ -1175,7 +1177,7 @@ static void initDrawTextState(drawtextstate_t* state)
state->angle = 0;
state->color[CR] = state->color[CG] = state->color[CB] = state->color[CA] = 1;
state->glitter = DEFAULT_GLITTER_STRENGTH;
state->shadow = DEFAULT_SHADOW_STRENGTH;
state->shadowStrength = DEFAULT_SHADOW_STRENGTH;
state->shadowOffsetX = DEFAULT_SHADOW_XOFFSET;
state->shadowOffsetY = DEFAULT_SHADOW_YOFFSET;
state->leading = DEFAULT_LEADING;
Expand Down Expand Up @@ -1235,7 +1237,7 @@ void FR_DrawText(const char* inString, int x, int y, fontid_t defFont,
state.color[CB] = defBlue;
state.color[CA] = defAlpha;
state.glitter = defGlitter;
state.shadow = defShadow;
state.shadowStrength = defShadow;
state.tracking = defTracking;
state.leading = defLeading;
state.caseScale = defCase;
Expand All @@ -1245,6 +1247,7 @@ void FR_DrawText(const char* inString, int x, int y, fontid_t defFont,
FR_LoadDefaultAttrib();
FR_SetTracking(state.tracking);
FR_SetShadowOffset(state.shadowOffsetX, state.shadowOffsetY);
FR_SetShadowStrength(state.shadowStrength);
lastLineHeight = FR_CharHeight('A') * state.scaleY;

string = str;
Expand All @@ -1256,6 +1259,7 @@ void FR_DrawText(const char* inString, int x, int y, fontid_t defFont,
fontid_t lastFont = state.font;
int lastTracking = state.tracking;
float lastLeading = state.leading;
float lastShadowStrength = state.shadowStrength;
int numBreaks = 0;

parseParamaterBlock(&string, &state, &numBreaks);
Expand All @@ -1273,6 +1277,8 @@ void FR_DrawText(const char* inString, int x, int y, fontid_t defFont,
FR_SetFont(state.font);
if(state.tracking != lastTracking)
FR_SetTracking(state.tracking);
if(state.shadowStrength != lastShadowStrength)
FR_SetShadowStrength(state.shadowStrength);
}

for(end = string; *end && *end != '{';)
Expand Down Expand Up @@ -1351,7 +1357,7 @@ void FR_DrawText(const char* inString, int x, int y, fontid_t defFont,

// Draw it.
glColor4fv(state.color);
FR_DrawTextFragment5(temp, 0, 0, fragmentFlags, state.typeIn ? (int) charCount : 0, state.glitter, state.shadow);
FR_DrawTextFragment4(temp, 0, 0, fragmentFlags, state.typeIn ? (int) charCount : 0, state.glitter);
charCount += strlen(temp);

// Advance the current position?
Expand Down
2 changes: 2 additions & 0 deletions doomsday/engine/portable/src/p_bmap.c
Expand Up @@ -1154,6 +1154,7 @@ static void drawInfoBox(int x, int y, long blockIdx, uint blockX,
FR_SetFont(glFontFixed);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
w = FR_TextFragmentWidth(buf) + 16;
h = FR_TextFragmentHeight(buf) + 16;
x -= w / 2;
Expand All @@ -1173,6 +1174,7 @@ static void drawInfoBox2(float minX, float minY, float maxX, float maxY,
FR_SetFont(glFontFixed);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
w = 16 + FR_TextFragmentWidth("(+000.0,+000.0)(+000.0,+000.0)");
th = FR_TextFragmentHeight("a");
h = th * 4 + 16;
Expand Down
2 changes: 2 additions & 0 deletions doomsday/engine/portable/src/rend_console.c
Expand Up @@ -424,6 +424,7 @@ void Rend_ConsoleFPS(int x, int y)
FR_SetFont(glFontFixed);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
w = FR_TextFragmentWidth(buf) + 16;
h = FR_SingleLineHeight(buf) + 16;

Expand Down Expand Up @@ -463,6 +464,7 @@ static void drawConsoleTitleBar(float alpha)
FR_SetFont(glFontVariable[GLFS_BOLD]);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
UI_TextOutEx2(consoleTitle, border, height / 2, UI_Color(UIC_TITLE), alpha, DTF_ALIGN_LEFT|DTF_ONLY_SHADOW);
if(secondaryTitleText[0])
{
Expand Down
1 change: 1 addition & 0 deletions doomsday/engine/portable/src/rend_main.c
Expand Up @@ -4356,6 +4356,7 @@ static void drawVertexIndex(const vertex_t* vtx, float z, float scale, float alp
FR_SetFont(glFontFixed);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);

sprintf(buf, "%lu", (unsigned long) (vtx - vertexes));

Expand Down
1 change: 1 addition & 0 deletions doomsday/engine/portable/src/rend_particle.c
Expand Up @@ -907,6 +907,7 @@ static boolean drawGeneratorOrigin(ptcgen_t* gen, void* context)
FR_SetFont(glFontFixed);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
UI_TextOutEx(buf, 2, 2, UI_Color(UIC_TITLE), alpha);
glDisable(GL_TEXTURE_2D);

Expand Down
8 changes: 7 additions & 1 deletion doomsday/engine/portable/src/ui_main.c
Expand Up @@ -893,6 +893,7 @@ void UIText_Drawer(ui_object_t* ob)
FR_SetFont(glFontVariable[GLFS_NORMAL]);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
UI_TextOutEx2(ob->text, ob->x, ob->y + ob->h / 2, UI_Color(UIC_TEXT), ob->flags & UIF_DISABLED ? .2f : 1, DTF_ALIGN_LEFT|DTF_ONLY_SHADOW);
glDisable(GL_TEXTURE_2D);
}
Expand All @@ -903,6 +904,7 @@ void UIText_BrightDrawer(ui_object_t* ob)
FR_SetFont(glFontVariable[GLFS_NORMAL]);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
UI_TextOutEx2(ob->text, ob->x, ob->y + ob->h / 2, UI_Color(UIC_TITLE), ob->flags & UIF_DISABLED ? .2f : 1, DTF_ALIGN_LEFT|DTF_ONLY_SHADOW);
glDisable(GL_TEXTURE_2D);
}
Expand Down Expand Up @@ -1000,6 +1002,7 @@ void UIButton_Drawer(ui_object_t* ob)
FR_SetFont(glFontVariable[GLFS_NORMAL]);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
UI_TextOutEx2(text, down + ob->x + (ob->flags & UIF_LEFT_ALIGN ? UI_BUTTON_BORDER * 2 : ob->w / 2), down + ob->y + ob->h / 2, UI_Color(UIC_TITLE), alpha, DTF_ONLY_SHADOW| ((ob->flags & UIF_LEFT_ALIGN)? DTF_ALIGN_LEFT : 0));
glDisable(GL_TEXTURE_2D);
}
Expand Down Expand Up @@ -1107,6 +1110,7 @@ void UIEdit_Drawer(ui_object_t* ob)
FR_SetFont(glFontVariable[GLFS_LIGHT]);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
memset(buf, 0, sizeof(buf));

// Does all of it fit in the box?
Expand Down Expand Up @@ -1322,6 +1326,7 @@ void UIList_Drawer(ui_object_t* ob)
FR_SetFont(glFontVariable[GLFS_NORMAL]);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
UI_TextOutEx(ob->text, ob->x, ob->y - UI_BORDER - uiFontHgt, UI_Color(UIC_TEXT), alpha);
glDisable(GL_TEXTURE_2D);

Expand Down Expand Up @@ -1619,6 +1624,7 @@ void UISlider_Drawer(ui_object_t* ob)
FR_SetFont(glFontVariable[GLFS_LIGHT]);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
UI_TextOutEx2(buf, x + (dat->value < (dat->min + dat->max) / 2 ? inwidth - butw - UI_BAR_BORDER - FR_TextFragmentWidth(buf) : butw + UI_BAR_BORDER), y + inheight / 2, UI_Color(UIC_TEXT), alpha, DTF_ALIGN_LEFT|DTF_ONLY_SHADOW);
glDisable(GL_TEXTURE_2D);
}
Expand Down Expand Up @@ -1875,7 +1881,7 @@ void UI_TextOutEx2(const char* text, int x, int y, ui_color_t* color, float alph
alpha *= uiAlpha;
if(alpha <= 0) return;
UI_SetColorA(color, alpha);
FR_DrawTextFragment5(text, x, y, flags, DEFAULT_INITIALCOUNT, DEFAULT_GLITTER_STRENGTH, .6f);
FR_DrawTextFragment4(text, x, y, flags, DEFAULT_INITIALCOUNT, DEFAULT_GLITTER_STRENGTH);
}

void UI_TextOutEx(const char* text, int x, int y, ui_color_t* color, float alpha)
Expand Down
3 changes: 3 additions & 0 deletions doomsday/engine/portable/src/ui_panel.c
Expand Up @@ -831,6 +831,7 @@ void CP_KeyGrabDrawer(ui_object_t *ob)
FR_SetFont(glFontVariable[GLFS_LIGHT]);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
UI_TextOutEx2(buf, ob->x + ob->w / 2, ob->y + ob->h / 2, UI_Color(UIC_TEXT), alpha, DTF_ONLY_SHADOW);
glDisable(GL_TEXTURE_2D);
}
Expand Down Expand Up @@ -864,6 +865,7 @@ void CP_VideoModeInfo(ui_object_t *ob)
FR_SetFont(glFontVariable[GLFS_LIGHT]);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
UI_TextOutEx2(buf, ob->x, ob->y + ob->h / 2, UI_Color(UIC_TEXT), 1, DTF_ALIGN_LEFT|DTF_ONLY_SHADOW);
glDisable(GL_TEXTURE_2D);
}
Expand Down Expand Up @@ -1054,6 +1056,7 @@ void CP_Drawer(ui_page_t *page)
FR_SetFont(glFontVariable[GLFS_LIGHT]);
FR_LoadDefaultAttrib();
FR_SetShadowOffset(UI_SHADOW_OFFSET, UI_SHADOW_OFFSET);
FR_SetShadowStrength(UI_SHADOW_STRENGTH);
UI_TextOutEx2(DENGPROJECT_HOMEURL,
UI_ScreenW(1000) - UI_BORDER,
UI_ScreenY(25), UI_Color(UIC_TEXT), 0.2f, DTF_ALIGN_RIGHT|DTF_ONLY_SHADOW);
Expand Down
1 change: 0 additions & 1 deletion doomsday/plugins/common/include/hu_lib.h
Expand Up @@ -682,7 +682,6 @@ void MN_DrawPage(mn_page_t* page, float alpha, boolean showFocusCursor);
void MN_DrawText(const char* string, int x, int y);
void MN_DrawText2(const char* string, int x, int y, short flags);
void MN_DrawText3(const char* string, int x, int y, short flags, float glitterStrength);
void MN_DrawText4(const char* string, int x, int y, short flags, float glitterStrength, float shadowStrength);

/**
* Execute a menu navigation/action command.
Expand Down

0 comments on commit af859e1

Please sign in to comment.