void RenderMessagePicture(CDrawPort *pdp) { CCompMessage &cm = _acmMessages[_iActiveMessage]; // try to try { // load image _toPicture.SetData_t(cm.cm_fnmPicture); ((CTextureData*)_toPicture.GetData())->Force(TEX_CONSTANT); // if failed } catch(char *strError) { // report error CPrintF("Cannot load '%s':\n%s\n", (CTString&)cm.cm_fnmPicture, strError); // do nothing return; } // get image and box sizes PIX pixImgSizeI = _toPicture.GetWidth(); PIX pixImgSizeJ = _toPicture.GetHeight(); PIXaabbox2D boxPic(PIX2D(_pixMarginI, _pixMarginJ), PIX2D(_boxMsgImage.Size()(1)-_pixMarginI, _boxMsgImage.Size()(2)-_pixMarginJ)); PIX pixBoxSizeI = boxPic.Size()(1); PIX pixBoxSizeJ = boxPic.Size()(2); PIX pixCenterI = _boxMsgImage.Size()(1)/2; PIX pixCenterJ = _boxMsgImage.Size()(2)/2; // find image stretch to fit in box FLOAT fStretch = Min(FLOAT(pixBoxSizeI)/pixImgSizeI, FLOAT(pixBoxSizeJ)/pixImgSizeJ); // draw the image pdp->PutTexture(&_toPicture, PIXaabbox2D( PIX2D(pixCenterI-pixImgSizeI*fStretch/2, pixCenterJ-pixImgSizeJ*fStretch/2), PIX2D(pixCenterI+pixImgSizeI*fStretch/2, pixCenterJ+pixImgSizeJ*fStretch/2))); }
static INDEX SliderPixToIndex(PIX pixOffset, INDEX iVisible, INDEX iTotal, PIXaabbox2D boxFull) { FLOAT fSize = ClampUp(FLOAT(iVisible)/iTotal, 1.0f); PIX pixFull = boxFull.Size()(2); PIX pixSize = PIX(pixFull*fSize); if (pixSize>=boxFull.Size()(2)) { return 0; } return (iTotal*pixOffset)/pixFull; }
static PIXaabbox2D GetSliderBox(INDEX iFirst, INDEX iVisible, INDEX iTotal, PIXaabbox2D boxFull) { FLOAT fSize = ClampUp(FLOAT(iVisible)/iTotal, 1.0f); PIX pixFull = boxFull.Size()(2); PIX pixSize = PIX(pixFull*fSize); pixSize = ClampDn(pixSize, boxFull.Size()(1)); PIX pixTop = pixFull*(FLOAT(iFirst)/iTotal)+boxFull.Min()(2); PIX pixI0 = boxFull.Min()(1); PIX pixI1 = boxFull.Max()(1); return PIXaabbox2D(PIX2D(pixI0, pixTop), PIX2D(pixI1, pixTop+pixSize)); }
void TiledTexture( PIXaabbox2D &_boxScreen, FLOAT fStretch, MEX2D &vScreen, MEXaabbox2D &boxTexture) { PIX pixW = _boxScreen.Size()(1); PIX pixH = _boxScreen.Size()(2); boxTexture = MEXaabbox2D(MEX2D(0, 0), MEX2D(pixW/fStretch, pixH/fStretch)); boxTexture+=vScreen; }
static PIXaabbox2D GetMsgSliderBox(void) { INDEX ctLines = _acmMessages.Count(); PIX pixSizeI = _boxMsgList.Size()(1); PIX pixSizeJ = _boxMsgList.Size()(2); return GetSliderBox( _iFirstMessageOnScreen, _ctMessagesOnScreen, ctLines, GetMsgSliderSpace()); }
void CMGTrigger::Render(CDrawPort *pdp) { SetFontMedium(pdp); PIXaabbox2D box = FloatBoxToPixBox(pdp, mg_boxOnScreen); PIX pixIL = box.Min()(1) + box.Size()(1)*0.45f; PIX pixIR = box.Min()(1) + box.Size()(1)*0.55f; PIX pixJ = box.Min()(2); COLOR col = GetCurrentColor(); if (!mg_bVisual || mg_strValue == "") { CTString strValue = mg_strValue; if (mg_bVisual) { strValue = TRANS("none"); } if (mg_iCenterI == -1) { pdp->PutText(mg_strLabel, box.Min()(1), pixJ, col); pdp->PutTextR(strValue, box.Max()(1), pixJ, col); } else { pdp->PutTextR(mg_strLabel, pixIL, pixJ, col); pdp->PutText(strValue, pixIR, pixJ, col); } } else { CTString strLabel = mg_strLabel + ": "; pdp->PutText(strLabel, box.Min()(1), pixJ, col); CTextureObject to; try { to.SetData_t(mg_strValue); CTextureData *ptd = (CTextureData *)to.GetData(); PIX pixSize = box.Size()(2); PIX pixCX = box.Max()(1) - pixSize / 2; PIX pixCY = box.Center()(2); pdp->PutTexture(&to, PIXaabbox2D( PIX2D(pixCX - pixSize / 2, pixCY - pixSize / 2), PIX2D(pixCX - pixSize / 2 + pixSize, pixCY - pixSize / 2 + pixSize)), C_WHITE | 255); } catch (char *strError) { CPrintF("%s\n", strError); } to.SetData(NULL); } }
static PIXaabbox2D GetTextSliderBox(void) { if (_iActiveMessage>=_acmMessages.Count()) { return PIXaabbox2D(); } INDEX ctTextLines = _acmMessages[_iActiveMessage].cm_ctFormattedLines; PIX pixSizeI = _boxMsgText.Size()(1); PIX pixSizeJ = _boxMsgText.Size()(2); return GetSliderBox( _iTextLineOnScreen, _ctTextLinesOnScreen, ctTextLines, GetTextSliderSpace()); }
static PIXaabbox2D GetMsgSliderSpace(void) { PIX pixSizeI = _boxMsgList.Size()(1); PIX pixSizeJ = _boxMsgList.Size()(2); PIX pixSliderSizeI = _pixMarginI*2; if (pixSliderSizeI<5) { pixSliderSizeI=5; } return PIXaabbox2D( PIX2D(pixSizeI-pixSliderSizeI, 0), PIX2D(pixSizeI, pixSizeJ)); }
// print list of messages void PrintMessageList(CDrawPort *pdp) { PIX pixTextX = _pixMarginI; PIX pixYLine = _pixMarginJ; SetFont1(pdp); INDEX iFirst = _iFirstMessageOnScreen; INDEX iLast = Min(INDEX(_iFirstMessageOnScreen+_ctMessagesOnScreen), _acmMessages.Count())-1; if (iFirst>iLast) { pdp->PutText( TRANS("no messages"), pixTextX, pixYLine, _colDark); } for(INDEX i=iFirst; i<=iLast; i++) { COLOR col = _colMedium; if (_acmMessages[i].cm_bRead) { col = _colDark; } if (i==_iActiveMessage) { col = _colLight; } if (GetMsgListBox(i-_iFirstMessageOnScreen)>=_vpixMouse) { col = LCDBlinkingColor(_colLight, _colMedium); } pdp->PutText( _acmMessages[i].cm_strSubject, pixTextX, pixYLine, col); pixYLine+=_pixCharSizeJ; } PIXaabbox2D boxSliderSpace = GetMsgSliderSpace(); LCDDrawBox(0,0,boxSliderSpace, _colBoxes); PIXaabbox2D boxSlider = GetMsgSliderBox(); COLOR col = _colBoxes; PIXaabbox2D boxSliderTrans = boxSlider; boxSliderTrans+=_boxMsgList.Min(); if (boxSliderTrans>=_vpixMouse) { col = LCDBlinkingColor(_colLight, _colDark); } pdp->Fill( boxSlider.Min()(1)+2, boxSlider.Min()(2)+2, boxSlider.Size()(1)-4, boxSlider.Size()(2)-4, col); }
// print text of current message void PrintMessageText(CDrawPort *pdp) { if (_acmMessages.Count()==0 || _iActiveMessage>=_acmMessages.Count()|| fComputerFadeValue<0.99f) { return; } SetFont2(pdp); // print subject CTString strSubject0; CTString strSubject1; CTString strSubject2; //strSubject.PrintF("%g", _fMsgAppearFade); const char *strSubject = _acmMessages[_iActiveMessage].cm_strSubject; INDEX ctSubjectLen = strlen(strSubject); INDEX ctToPrint = int(_fMsgAppearDelta*20.0f); for (INDEX iChar=0; iChar<ctSubjectLen; iChar++) { char strChar[2]; strChar[0] = strSubject[iChar]; strChar[1] = 0; if (iChar>ctToPrint) { NOTHING; } else if (iChar==ctToPrint) { strSubject2+=strChar; } else if (iChar==ctToPrint-1) { strSubject1+=strChar; } else { strSubject0+=strChar; } } PIX pixWidth0 = pdp->GetTextWidth(strSubject0); PIX pixWidth1 = pdp->GetTextWidth(strSubject1); pdp->PutText(strSubject0, _pixMarginI, _pixMarginJ-1, _colMedium); pdp->PutText(strSubject1, _pixMarginI+pixWidth0, _pixMarginJ-1, LerpColor( _colLight, _colMedium, 0.5f)); pdp->PutText(strSubject2, _pixMarginI+pixWidth0+pixWidth1, _pixMarginJ-1, _colLight); pdp->DrawLine(0, PIX(_pixMarginJ*4), _boxMsgText.Size()(1), PIX(_pixMarginJ*4), _colBoxes); // fill in fresh player statistics if (strncmp(_acmMessages[_iActiveMessage].cm_strText, "$STAT", 5)==0) { _ppenPlayer->GetStats(_strStatsDetails, CST_DETAIL, _ctTextCharsPerRow); _acmMessages[_iActiveMessage].cm_ctFormattedWidth = 0; } // format text _acmMessages[_iActiveMessage].PrepareMessage(_ctTextCharsPerRow); SetFont1(pdp); INDEX ctLineToPrint = int(_fMsgAppearDelta*20.0f); // print it PIX pixJ = _pixMarginJ*4; for (INDEX iLine = _iTextLineOnScreen; iLine<_iTextLineOnScreen+_ctTextLinesOnScreen; iLine++) { INDEX iPrintLine = iLine-_iTextLineOnScreen; if (iPrintLine>ctLineToPrint) { continue; } COLOR col = LerpColor( _colLight, _colMedium, Clamp( FLOAT(ctLineToPrint-iPrintLine)/3, 0.0f, 1.0f)); pdp->PutText(_acmMessages[_iActiveMessage].GetLine(iLine), _pixMarginI, pixJ, col); pixJ+=_pixCharSizeJ; } PIXaabbox2D boxSliderSpace = GetTextSliderSpace(); LCDDrawBox(0,0,boxSliderSpace, _colBoxes); PIXaabbox2D boxSlider = GetTextSliderBox(); COLOR col = _colBoxes; PIXaabbox2D boxSliderTrans = boxSlider; boxSliderTrans+=_boxMsgText.Min(); if (boxSliderTrans>=_vpixMouse) { col = LCDBlinkingColor(_colLight, _colDark); } pdp->Fill( boxSlider.Min()(1)+2, boxSlider.Min()(2)+2, boxSlider.Size()(1)-4, boxSlider.Size()(2)-4, col); }
// print exit button void PrintExit(CDrawPort *pdp) { SetFont2(pdp); pdp->PutTextR( TRANS("Exit"), _boxExit.Size()(1)-_pixMarginI*3, _pixMarginJ-2*_fScaling2+1, MouseOverColor(_boxExit, _colMedium, _colDark, _colLight)); }
// update screen geometry static void UpdateSize(CDrawPort *pdp) { // get screen size PIX pixSizeI = pdp->GetWidth(); PIX pixSizeJ = pdp->GetHeight(); // remember new size _pixSizeI = pixSizeI; _pixSizeJ = pixSizeJ; // determine scaling _fScaling = 1.0f; _fScaling2 = 1.0f; if (pixSizeJ<384) { _fScaling = 1.0f; _fScaling2 = pixSizeJ/480.0f; } // remember font size CFontData *pfd = _pfdConsoleFont; _pixCharSizeI = pfd->fd_pixCharWidth + pfd->fd_pixCharSpacing; _pixCharSizeJ = pfd->fd_pixCharHeight + pfd->fd_pixLineSpacing; _pixCharSize2I = _pixCharSizeI*_fScaling2; _pixCharSize2J = _pixCharSizeJ*_fScaling2; _pixCharSizeI = _pixCharSizeI*_fScaling; _pixCharSizeJ = _pixCharSizeJ*_fScaling; _pixMarginI = 5*_fScaling2; _pixMarginJ = 5*_fScaling2; PIX pixBoxMarginI = 10*_fScaling2; PIX pixBoxMarginJ = 10*_fScaling2; PIX pixJ0Dn = pixBoxMarginJ; PIX pixJ1Up = pixJ0Dn+_pixCharSize2J+_pixMarginI*2; PIX pixJ1Dn = pixJ1Up+pixBoxMarginJ; PIX pixJ2Up = pixJ1Dn+_pixCharSize2J*6*2+pixBoxMarginJ; PIX pixJ2Dn = pixJ2Up+pixBoxMarginJ; PIX pixJ3Up = _pixSizeJ-pixBoxMarginJ; PIX pixI0Rt = pixBoxMarginI; PIX pixI1Lt = pixI0Rt+_pixCharSize2I*20+pixBoxMarginI; PIX pixI1Rt = pixI1Lt+pixBoxMarginI; PIX pixI2Lt = _pixSizeI/2-pixBoxMarginI/2; PIX pixI2Rt = _pixSizeI/2+pixBoxMarginI/2; PIX pixI4Lt = _pixSizeI-pixBoxMarginI; PIX pixI3Rt = pixI4Lt-pixBoxMarginI*2-_pixCharSize2I*10; PIX pixI3Lt = pixI3Rt-pixBoxMarginI; // calculate box sizes _boxTitle = PIXaabbox2D( PIX2D(0, pixJ0Dn-1), PIX2D(pixI3Lt, pixJ1Up)); _boxExit = PIXaabbox2D( PIX2D( pixI3Rt, pixJ0Dn-1), PIX2D(_pixSizeI, pixJ1Up)); PIX pixD = 5; PIX pixH = (pixJ2Up-pixJ1Dn-pixD*(CMT_COUNT-1))/CMT_COUNT; INDEX i; for( i=0; i<CMT_COUNT; i++) { _boxButton[i] = PIXaabbox2D( PIX2D(0, pixJ1Dn+(pixH+pixD)*i), PIX2D(pixI1Lt, pixJ1Dn+(pixH+pixD)*i+pixH)); } _boxMsgList = PIXaabbox2D( PIX2D(pixI1Rt, pixJ1Dn), PIX2D(pixI4Lt, pixJ2Up)); if (GetSP()->sp_bCooperative) { _boxMsgText = PIXaabbox2D( PIX2D(pixI2Rt, pixJ2Dn), PIX2D(pixI4Lt, pixJ3Up)); _boxMsgImage= PIXaabbox2D( PIX2D(pixI0Rt, pixJ2Dn), PIX2D(pixI2Lt, pixJ3Up)); } else { _boxMsgText = PIXaabbox2D( PIX2D(pixI0Rt, pixJ2Dn), PIX2D(pixI4Lt, pixJ3Up)); _boxMsgImage= PIXaabbox2D(); } FLOAT fSlideSpeed = Max(_pixSizeI, _pixSizeJ*2L); FLOAT fGroup0 = ClampDn((1-fComputerFadeValue)*fSlideSpeed-_pixSizeJ, 0.0f); FLOAT fGroup1 = (1-fComputerFadeValue)*fSlideSpeed; // animate box positions _boxTitle -= PIX2D( fGroup1, 0); _boxExit += PIX2D( fGroup1, 0); for( i=0; i<CMT_COUNT; i++) { FLOAT fOffs = ClampDn(fGroup1-(CMT_COUNT-i)*_pixMarginJ*10, 0.0f); _boxButton[i] -= PIX2D(fOffs, 0); } _boxMsgList -= PIX2D(0, fGroup0); _boxMsgText += PIX2D(fGroup0, 0); _boxMsgImage+= PIX2D(0, fGroup0); _ctMessagesOnScreen = (_boxMsgList.Size()(2) - _pixMarginJ*2) / _pixCharSizeJ; _ctTextCharsPerRow = (_boxMsgText.Size()(1) - _pixMarginI*4) / _pixCharSizeI; _ctTextLinesOnScreen = (_boxMsgText.Size()(2) - _pixMarginJ*2 - _pixMarginJ*4) / _pixCharSizeJ; }