void IN_DrawCoopStats() { #define TRACKING (1) static int sounds; DGL_Enable(DGL_TEXTURE_2D); FR_SetFont(FID(GF_FONTB)); FR_LoadDefaultAttrib(); FR_SetColorAndAlpha(defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); FR_DrawTextXY3("KILLS", 95, 35, ALIGN_TOPLEFT, DTF_ONLY_SHADOW); FR_DrawTextXY3("BONUS", 155, 35, ALIGN_TOPLEFT, DTF_ONLY_SHADOW); FR_DrawTextXY3("SECRET", 232, 35, ALIGN_TOPLEFT, DTF_ONLY_SHADOW); FR_DrawTextXY3(G_MapTitle(&wbs->currentMap).toUtf8().constData(), SCREENWIDTH/2, 3, ALIGN_TOP, DTF_ONLY_SHADOW); FR_SetFont(FID(GF_FONTA)); FR_SetColor(defFontRGB3[0], defFontRGB3[1], defFontRGB3[2]); FR_DrawTextXY3("FINISHED", SCREENWIDTH/2, 25, ALIGN_TOP, DTF_ONLY_SHADOW); FR_SetFont(FID(GF_FONTB)); FR_SetTracking(TRACKING); int ypos = 50; for(int i = 0; i < NUMTEAMS; ++i) { if(teamInfo[i].members) { DGL_Color4f(0, 0, 0, .4f); GL_DrawPatchXY(dpFaceAlive[i], 27, ypos+2); DGL_Color4f(defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); GL_DrawPatchXY(dpFaceAlive[i], 25, ypos); if(interTime < 40) { sounds = 0; ypos += 37; continue; } else if(interTime >= 40 && sounds < 1) { S_LocalSound(SFX_DORCLS, NULL); sounds++; } char buf[20]; dd_snprintf(buf, 20, "%i", killPercent[i]); M_DrawTextFragmentShadowed(buf, 121, ypos + 10, ALIGN_TOPRIGHT, 0, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); M_DrawTextFragmentShadowed("%", 121, ypos + 10, ALIGN_TOPLEFT, 0, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); dd_snprintf(buf, 20, "%i", bonusPercent[i]); M_DrawTextFragmentShadowed(buf, 196, ypos + 10, ALIGN_TOPRIGHT, 0, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); M_DrawTextFragmentShadowed("%", 196, ypos + 10, ALIGN_TOPLEFT, 0, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); dd_snprintf(buf, 20, "%i", secretPercent[i]); M_DrawTextFragmentShadowed(buf, 273, ypos + 10, ALIGN_TOPRIGHT, 0, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); M_DrawTextFragmentShadowed("%", 273, ypos + 10, ALIGN_TOPLEFT, 0, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); ypos += 37; } } DGL_Disable(DGL_TEXTURE_2D); #undef TRACKING }
void FR_DrawText3(const char* text, const Point2Raw* _origin, int alignFlags, short _textFlags) { fontid_t origFont = FR_Font(); float cx, cy, extraScale; drawtextstate_t state; const char* fragment; int pass, curCase; Point2Raw origin; Size2Raw textSize; size_t charCount; float origColor[4]; char* str, *end; boolean escaped = false; errorIfNotInited("FR_DrawText"); if(!text || !text[0]) return; origin.x = _origin? _origin->x : 0; origin.y = _origin? _origin->y : 0; _textFlags &= ~(DTF_INTERNAL_MASK); // If we aren't aligning to top-left we need to know the dimensions. if(alignFlags & ALIGN_RIGHT) FR_TextSize(&textSize, text); DENG_ASSERT_IN_MAIN_THREAD(); DENG_ASSERT_GL_CONTEXT_ACTIVE(); // We need to change the current color, so remember for restore. glGetFloatv(GL_CURRENT_COLOR, origColor); for(pass = ((_textFlags & DTF_NO_SHADOW) != 0? 1 : 0); pass < ((_textFlags & DTF_NO_GLITTER) != 0? 2 : 3); ++pass) { short textFlags = 0; // Configure the next pass. cx = (float) origin.x; cy = (float) origin.y; curCase = -1; charCount = 0; switch(pass) { case 0: textFlags = _textFlags | (DTF_NO_GLITTER|DTF_NO_CHARACTER); break; case 1: textFlags = _textFlags | (DTF_NO_SHADOW |DTF_NO_GLITTER); break; case 2: textFlags = _textFlags | (DTF_NO_SHADOW |DTF_NO_CHARACTER); break; } // Apply defaults. initDrawTextState(&state, textFlags); str = (char*)text; while(*str) { if(*str == FR_FORMAT_ESCAPE_CHAR) { escaped = true; ++str; continue; } if(!escaped && *str == '{') // Paramaters included? { fontid_t lastFont = state.fontNum; int lastTracking = state.tracking; float lastLeading = state.leading; float lastShadowStrength = state.shadowStrength; float lastGlitterStrength = state.glitterStrength; boolean lastCaseScale = state.caseScale; float lastRGBA[4]; int numBreaks = 0; lastRGBA[CR] = state.rgba[CR]; lastRGBA[CG] = state.rgba[CG]; lastRGBA[CB] = state.rgba[CB]; lastRGBA[CA] = state.rgba[CA]; parseParamaterBlock(&str, &state, &numBreaks); if(numBreaks != 0) { do { cx = (float) origin.x; cy += state.lastLineHeight * (1+lastLeading); } while(--numBreaks > 0); } if(state.fontNum != lastFont) FR_SetFont(state.fontNum); if(state.tracking != lastTracking) FR_SetTracking(state.tracking); if(state.leading != lastLeading) FR_SetLeading(state.leading); if(state.rgba[CR] != lastRGBA[CR] || state.rgba[CG] != lastRGBA[CG] || state.rgba[CB] != lastRGBA[CB] || state.rgba[CA] != lastRGBA[CA]) FR_SetColorAndAlphav(state.rgba); if(state.shadowStrength != lastShadowStrength) FR_SetShadowStrength(state.shadowStrength); if(state.glitterStrength != lastGlitterStrength) FR_SetGlitterStrength(state.glitterStrength); if(state.caseScale != lastCaseScale) FR_SetCaseScale(state.caseScale); } for(end = str; *end && *end != FR_FORMAT_ESCAPE_CHAR && (escaped || *end != '{');) { int newlines = 0, fragmentAlignFlags; float alignx = 0; // Find the end of the next fragment. if(FR_CaseScale()) { curCase = -1; // Select a substring with characters of the same case (or whitespace). for(; *end && *end != FR_FORMAT_ESCAPE_CHAR && (escaped || *end != '{') && *end != '\n'; end++) { escaped = false; // We can skip whitespace. if(isspace(*end)) continue; if(curCase < 0) curCase = (isupper(*end) != 0); else if(curCase != (isupper(*end) != 0)) break; } } else { curCase = 0; for(; *end && *end != FR_FORMAT_ESCAPE_CHAR && (escaped || *end != '{') && *end != '\n'; end++) { escaped = false; } } // No longer escaped. escaped = false; { char* buffer = enlargeTextBuffer(end - str); memcpy(buffer, str, end - str); buffer[end - str] = '\0'; fragment = buffer; } while(*end == '\n') { newlines++; end++; } // Continue from here. str = end; if(!(alignFlags & (ALIGN_LEFT|ALIGN_RIGHT))) { fragmentAlignFlags = alignFlags; } else { // We'll take care of horizontal positioning of the fragment so align left. fragmentAlignFlags = (alignFlags & ~(ALIGN_RIGHT)) | ALIGN_LEFT; if(alignFlags & ALIGN_RIGHT) alignx = -textSize.width * state.scaleX; } // Setup the scaling. glMatrixMode(GL_MODELVIEW); glPushMatrix(); // Rotate. if(state.angle != 0) { // The origin is the specified (x,y) for the patch. // We'll undo the aspect ratio (otherwise the result would be skewed). /// @todo Do not assume the aspect ratio and therefore whether // correction is even needed. glTranslatef((float)origin.x, (float)origin.y, 0); glScalef(1, 200.0f / 240.0f, 1); glRotatef(state.angle, 0, 0, 1); glScalef(1, 240.0f / 200.0f, 1); glTranslatef(-(float)origin.x, -(float)origin.y, 0); } glTranslatef(cx + state.offX + alignx, cy + state.offY + (FR_CaseScale() ? state.caseMod[curCase].offset : 0), 0); extraScale = (FR_CaseScale() ? state.caseMod[curCase].scale : 1); glScalef(state.scaleX, state.scaleY * extraScale, 1); // Draw it. if(fr.fontNum) { textFragmentDrawer(fragment, 0, 0, fragmentAlignFlags, textFlags, state.typeIn ? (int) charCount : DEFAULT_INITIALCOUNT); } charCount += strlen(fragment); // Advance the current position? if(newlines == 0) { cx += ((float) textFragmentWidth(fragment) + currentAttribs()->tracking) * state.scaleX; } else { if(strlen(fragment) > 0) state.lastLineHeight = textFragmentHeight(fragment); cx = (float) origin.x; cy += newlines * (float) state.lastLineHeight * (1+FR_Leading()); } glMatrixMode(GL_MODELVIEW); glPopMatrix(); } } FR_PopAttrib(); } freeTextBuffer(); FR_SetFont(origFont); glColor4fv(origColor); }
void IN_DrawSingleStats() { #define TRACKING (1) static int sounds; DGL_Enable(DGL_TEXTURE_2D); FR_SetFont(FID(GF_FONTB)); FR_LoadDefaultAttrib(); FR_SetColorAndAlpha(defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); FR_DrawTextXY3("KILLS", 50, 65, ALIGN_TOPLEFT, DTF_ONLY_SHADOW); FR_DrawTextXY3("ITEMS", 50, 90, ALIGN_TOPLEFT, DTF_ONLY_SHADOW); FR_DrawTextXY3("SECRETS", 50, 115, ALIGN_TOPLEFT, DTF_ONLY_SHADOW); FR_DrawTextXY3(G_MapTitle(&wbs->currentMap).toUtf8().constData(), 160, 3, ALIGN_TOP, DTF_ONLY_SHADOW); FR_SetFont(FID(GF_FONTA)); FR_SetColor(defFontRGB3[0], defFontRGB3[1], defFontRGB3[2]); FR_DrawTextXY3("FINISHED", 160, 25, ALIGN_TOP, DTF_ONLY_SHADOW); DGL_Disable(DGL_TEXTURE_2D); if(interTime < 30) { sounds = 0; return; } if(sounds < 1 && interTime >= 30) { S_LocalSound(SFX_DORCLS, NULL); sounds++; } DGL_Enable(DGL_TEXTURE_2D); char buf[20]; dd_snprintf(buf, 20, "%i", players[CONSOLEPLAYER].killCount); FR_SetFont(FID(GF_FONTB)); FR_SetTracking(TRACKING); M_DrawTextFragmentShadowed(buf, 236, 65, ALIGN_TOPRIGHT, 0, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); M_DrawTextFragmentShadowed("/", 241, 65, ALIGN_TOPLEFT, 0, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); dd_snprintf(buf, 20, "%i", totalKills); M_DrawTextFragmentShadowed(buf, 284, 65, ALIGN_TOPRIGHT, 0, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); DGL_Disable(DGL_TEXTURE_2D); if(interTime < 60) return; if(sounds < 2 && interTime >= 60) { S_LocalSound(SFX_DORCLS, NULL); sounds++; } DGL_Enable(DGL_TEXTURE_2D); dd_snprintf(buf, 20, "%i", players[CONSOLEPLAYER].itemCount); FR_SetFont(FID(GF_FONTB)); M_DrawTextFragmentShadowed(buf, 236, 90, ALIGN_TOPRIGHT, 0, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); M_DrawTextFragmentShadowed("/", 241, 90, ALIGN_TOPLEFT, 0, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); dd_snprintf(buf, 20, "%i", totalItems); M_DrawTextFragmentShadowed(buf, 284, 90, ALIGN_TOPRIGHT, 0, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); DGL_Disable(DGL_TEXTURE_2D); if(interTime < 90) return; if(sounds < 3 && interTime >= 90) { S_LocalSound(SFX_DORCLS, NULL); sounds++; } DGL_Enable(DGL_TEXTURE_2D); dd_snprintf(buf, 20, "%i", players[CONSOLEPLAYER].secretCount); FR_SetFont(FID(GF_FONTB)); M_DrawTextFragmentShadowed(buf, 236, 115, ALIGN_TOPRIGHT, 0, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); M_DrawTextFragmentShadowed("/", 241, 115, ALIGN_TOPLEFT, 0, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); dd_snprintf(buf, 20, "%i", totalSecret); M_DrawTextFragmentShadowed(buf, 284, 115, ALIGN_TOPRIGHT, 0, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); DGL_Disable(DGL_TEXTURE_2D); if(interTime < 150) { return; } if(sounds < 4 && interTime >= 150) { S_LocalSound(SFX_DORCLS, NULL); sounds++; } if(gameMode != heretic_extended || ::gameEpisode < 3) { DGL_Enable(DGL_TEXTURE_2D); FR_SetFont(FID(GF_FONTB)); FR_SetColorAndAlpha(defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); FR_DrawTextXY3("TIME", 85, 160, ALIGN_TOPLEFT, DTF_ONLY_SHADOW); IN_DrawTime(284, 160, hours, minutes, seconds, defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); DGL_Disable(DGL_TEXTURE_2D); } else { DGL_Enable(DGL_TEXTURE_2D); FR_SetFont(FID(GF_FONTA)); FR_SetColorAndAlpha(defFontRGB3[0], defFontRGB3[1], defFontRGB3[2], 1); FR_DrawTextXY3("NOW ENTERING:", SCREENWIDTH/2, 160, ALIGN_TOP, DTF_ONLY_SHADOW); FR_SetFont(FID(GF_FONTB)); FR_SetColorAndAlpha(defFontRGB[0], defFontRGB[1], defFontRGB[2], 1); FR_DrawTextXY3(G_MapTitle(&wbs->nextMap).toUtf8().constData(), 160, 170, ALIGN_TOP, DTF_ONLY_SHADOW); DGL_Disable(DGL_TEXTURE_2D); skipIntermission = false; } #undef TRACKING }