RMSTATS.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:9k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File: rmstats.cpp
  6.  *
  7.  ***************************************************************************/
  8. #include "rmfull.h"
  9. /*
  10.  * GLOBAL VARIABLES
  11.  */
  12. extern D3DAppInfo* d3dapp;     /* Pointer to read only collection of DD and D3D
  13.                objects maintained by D3DApp */
  14. extern rmfullglobals myglobs;     /* collection of global variables */
  15. static struct {
  16.     HFONT hFont;
  17.     SIZE szFrameRate;
  18.     SIZE szInfo;
  19. } statglobs;
  20.  /************************************************************************
  21.   Frame rate and info text
  22.  ************************************************************************/
  23. BOOL
  24. WriteFrameRateBuffer(float fps, long tps)
  25. {
  26.     HRESULT LastError;
  27.     HDC hdc;
  28.     RECT rc;
  29.     char buf1[30], buf2[30], buf[60];
  30.     int len;
  31.     if (!myglobs.lpFrameRateBuffer)
  32. return TRUE;
  33.     if (fps > 0.0f)
  34.         wsprintf(buf1, "%d.%02d fps   ",
  35.          (int)( fps * 100 ) / 100,
  36.          (int)( fps * 100 ) % 100);
  37.     else
  38.         buf1[0] = 0;
  39.     if (tps > 0)
  40.         wsprintf(buf2, "%ld tps   ", tps);
  41.     else
  42.         buf2[0] = 0;
  43.     len = wsprintf(buf, "%s%s", buf1, buf2);
  44.     if (!myglobs.lpFrameRateBuffer)
  45.         return FALSE;
  46.     LastError = myglobs.lpFrameRateBuffer->GetDC(&hdc);
  47.     if (LastError != DD_OK) {
  48. /*
  49.  *  This is not vital, don't report an error.
  50.  */
  51.         return TRUE;
  52.     }
  53.     SelectObject(hdc, statglobs.hFont);
  54.     SetTextColor(hdc, RGB(255,255,0));
  55.     SetBkColor(hdc, RGB(0,0,0));
  56.     SetBkMode(hdc, OPAQUE);
  57.     GetTextExtentPoint32(hdc, buf, len, &statglobs.szFrameRate);
  58.     SetRect(&rc, 0, 0, statglobs.szFrameRate.cx, statglobs.szFrameRate.cy);
  59.     ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, buf, len, NULL);
  60.     myglobs.lpFrameRateBuffer->ReleaseDC(hdc);
  61.     return TRUE;
  62. }
  63. BOOL
  64. WriteInfoBuffer(void)
  65. {
  66.     HRESULT LastError;
  67.     HDC hdc;
  68.     RECT rc;
  69.     char buf[40];
  70.     int len;
  71.     if (!myglobs.lpInfoBuffer)
  72. return TRUE;
  73.     if (d3dapp->bFullscreen)
  74. len = wsprintf(buf, "%dx%dx%d (%s)", d3dapp->ThisMode.w, d3dapp->ThisMode.h, d3dapp->ThisMode.bpp,
  75.        (d3dapp->ThisDriver.Desc.dcmColorModel == D3DCOLOR_MONO) ? "MONO" : "RGB");
  76.     else
  77. len = wsprintf(buf, "%dx%d (%s)", d3dapp->szClient.cx, d3dapp->szClient.cy, 
  78.        (d3dapp->ThisDriver.Desc.dcmColorModel == D3DCOLOR_MONO) ? "MONO" : "RGB");
  79.     if (!myglobs.lpInfoBuffer)
  80.         return FALSE;
  81.     LastError = myglobs.lpInfoBuffer->GetDC(&hdc);
  82.     if (LastError != DD_OK) {
  83. /*
  84.  *  This is not vital, don't report an error.
  85.  */
  86.         return TRUE;
  87.     }
  88.     SelectObject(hdc, statglobs.hFont);
  89.     SetTextColor(hdc, RGB(255,255,0));
  90.     SetBkColor(hdc, RGB(0,0,0));
  91.     SetBkMode(hdc, OPAQUE);
  92.     GetTextExtentPoint32(hdc, buf, len, &statglobs.szInfo);
  93.     SetRect(&rc, 0, 0, statglobs.szInfo.cx, statglobs.szInfo.cy);
  94.     ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, buf, len, NULL);
  95.     myglobs.lpInfoBuffer->ReleaseDC(hdc);
  96.     return TRUE;
  97. }
  98. BOOL
  99. InitFontAndTextBuffers(void)
  100. {
  101.     DDCOLORKEY          ddck;
  102.     DDSURFACEDESC       ddsd;
  103.     HDC hdc;
  104.     HRESULT ddrval;
  105.     char dummyinfo[] = "000x000x00 (MONO) 0000";
  106.     char dummyfps[] = "000.00 fps 00000000.00 tps 0000.00 mppps";
  107.    
  108.     /*
  109.      * Create the font.
  110.      */
  111.     RELEASE(myglobs.lpInfoBuffer);
  112.     RELEASE(myglobs.lpFrameRateBuffer);
  113.     if (statglobs.hFont != NULL) {
  114.         DeleteObject(statglobs.hFont);
  115.     }
  116.     statglobs.hFont = CreateFont(
  117.         d3dapp->szClient.cx <= 600 ? 12 : 24,
  118.         0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
  119.         ANSI_CHARSET,
  120.         OUT_DEFAULT_PRECIS,
  121.         CLIP_DEFAULT_PRECIS,
  122.         DEFAULT_QUALITY,
  123.         VARIABLE_PITCH,
  124.         "Arial" );
  125.     hdc = GetDC(NULL);
  126.     SelectObject(hdc, statglobs.hFont);
  127.     GetTextExtentPoint(hdc, dummyfps, strlen(dummyfps), &statglobs.szFrameRate);
  128.     GetTextExtentPoint(hdc, dummyinfo, strlen(dummyinfo), &statglobs.szInfo);
  129.     ReleaseDC(NULL, hdc);
  130.     memset( &ddsd, 0, sizeof( ddsd ) );
  131.     ddsd.dwSize = sizeof( ddsd );
  132.     ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
  133.     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
  134.     ddsd.dwHeight = statglobs.szFrameRate.cy;
  135.     ddsd.dwWidth = statglobs.szFrameRate.cx;
  136.     ddrval = D3DAppCreateSurface(&ddsd, &myglobs.lpFrameRateBuffer);
  137.     if (ddrval != DD_OK) {
  138. Msg("Could not create frame rate buffer.n%s", D3DAppErrorToString(ddrval));
  139.         goto exit_with_error;
  140.     }
  141.     memset(&ddck, 0, sizeof(ddck));
  142.     myglobs.lpFrameRateBuffer->SetColorKey(DDCKEY_SRCBLT, &ddck);
  143.     if (!WriteFrameRateBuffer(0.0f, 0)) {
  144.         goto exit_with_error;
  145.     }
  146.     memset( &ddsd, 0, sizeof( ddsd ) );
  147.     ddsd.dwSize = sizeof( ddsd );
  148.     ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
  149.     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
  150.     ddsd.dwHeight = statglobs.szInfo.cy;
  151.     ddsd.dwWidth = statglobs.szInfo.cx;
  152.     ddrval = D3DAppCreateSurface(&ddsd, &myglobs.lpInfoBuffer);
  153.     if (ddrval != DD_OK) {
  154. Msg("Could not create info buffer.n%s", D3DAppErrorToString(ddrval));
  155. goto exit_with_error;
  156.     }
  157.     memset(&ddck, 0, sizeof(ddck));
  158.     myglobs.lpInfoBuffer->SetColorKey(DDCKEY_SRCBLT, &ddck);
  159.     if (!WriteInfoBuffer())
  160. goto exit_with_error;
  161.     return TRUE;
  162. exit_with_error:
  163.     RELEASE(myglobs.lpInfoBuffer);
  164.     RELEASE(myglobs.lpFrameRateBuffer);
  165.     if (statglobs.hFont != NULL) {
  166.         DeleteObject(statglobs.hFont);
  167.     }
  168.     return FALSE;
  169. }
  170. /*************************************************************************
  171.   Frame rate output.
  172.  *************************************************************************/
  173. #define INTERVAL 100
  174. char StatTxt[100];
  175. int StatTxtLen;
  176. int count = 0;
  177. int last_polygons = 0;
  178. int this_frames = 0;
  179. time_t last_time;
  180. float fps;
  181. long tps;
  182. /*
  183.  * ResetFrameRate
  184.  * Initializes the frame rate counter.
  185.  */
  186. void
  187. ResetFrameRate(void)
  188. {
  189.     last_time = clock();
  190.     count = 0;
  191.     last_polygons = 0;
  192.     this_frames = 0;
  193.     fps = 0.0f; tps = 0;
  194.     StatTxt[0] = 0;
  195.     StatTxtLen = 0;
  196. }
  197. BOOL
  198. CalculateFrameRate()
  199. {
  200.     /*
  201.      * Calculate the frame rate and get other stats.
  202.      */
  203.     count++;
  204.     this_frames++;
  205.     if (count == INTERVAL) {
  206.      double t;
  207. int p, f;
  208.         time_t this_time;
  209.         count = 0;
  210. this_time = clock();
  211. t = (this_time - last_time) / (double)CLOCKS_PER_SEC;
  212. last_time = this_time;
  213. p = myglobs.dev->GetTrianglesDrawn() - last_polygons;
  214. last_polygons = myglobs.dev->GetTrianglesDrawn();
  215. f = this_frames;
  216. this_frames = 0;
  217.         fps = (float)(f / t);
  218.         tps = (long)(p / t);
  219.         if (myglobs.bShowFrameRate) {
  220.             if (!WriteFrameRateBuffer(fps, tps))
  221.                 return FALSE;
  222.         }
  223.     }
  224.     return TRUE;
  225. }
  226. /*
  227.  * DisplayFrameRate
  228.  * Outputs frame rate info and screen mode to back buffer when appropriate.
  229.  */
  230. BOOL
  231. DisplayFrameRate(int* count, LPD3DRECT lpExtents )
  232. {
  233.     RECT rc;
  234.     int x, y;
  235.     HRESULT ddrval = DD_OK;
  236.     if (myglobs.bShowFrameRate && !myglobs.bSingleStepMode && statglobs.szFrameRate.cx > 0 && statglobs.szFrameRate.cy > 0 &&
  237.         statglobs.szFrameRate.cx < d3dapp->szClient.cx && statglobs.szFrameRate.cy < d3dapp->szClient.cy) {
  238.         SetRect(&rc, 0, 0, statglobs.szFrameRate.cx, statglobs.szFrameRate.cy);
  239.         x = (int)(0.5 * (d3dapp->szClient.cx - statglobs.szFrameRate.cx) + 0.5);
  240.         y = 0;
  241. if (myglobs.lpFrameRateBuffer)
  242.     ddrval = d3dapp->lpBackBuffer->BltFast(x, y, myglobs.lpFrameRateBuffer, &rc,
  243.  DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
  244. if (ddrval != DD_OK) {
  245.     /*
  246.      * Blting the frame rate has failed. Since it is not vital, we
  247.      * aren't going to report an error.  Check to see if the surfaces
  248.      * have been lost and then return.
  249.      */
  250.     if (ddrval == DDERR_SURFACELOST) {
  251. d3dapp->lpBackBuffer->Restore();
  252. myglobs.lpFrameRateBuffer->Restore();
  253.     }
  254.     return TRUE;
  255. }
  256. SetRect((LPRECT)(lpExtents), x, y, statglobs.szFrameRate.cx + x, statglobs.szFrameRate.cy);
  257. ++(*count);
  258. ++lpExtents;
  259.     }
  260.     if (myglobs.bShowInfo && statglobs.szInfo.cx < d3dapp->szClient.cx && statglobs.szInfo.cy < d3dapp->szClient.cy) {
  261.         SetRect(&rc, 0, 0, statglobs.szInfo.cx, statglobs.szInfo.cy);
  262.         x = (int)(0.5 * (d3dapp->szClient.cx - statglobs.szInfo.cx) + 0.5);
  263.         y = d3dapp->szClient.cy - statglobs.szInfo.cy;
  264. if (myglobs.lpInfoBuffer)
  265.     ddrval = d3dapp->lpBackBuffer->BltFast(x,y, myglobs.lpInfoBuffer, &rc,
  266.  DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
  267. if (ddrval != DD_OK) {
  268.     /*
  269.      * Blting the info has failed. Since it is not vital, we
  270.      * aren't going to report an error.  Check to see if the surfaces
  271.      * have been lost and then return.
  272.      */
  273.     if (ddrval == DDERR_SURFACELOST) {
  274. d3dapp->lpBackBuffer->Restore();
  275. myglobs.lpInfoBuffer->Restore();
  276.     }
  277.     return TRUE;
  278. }
  279. SetRect((LPRECT)(lpExtents), x, y, x + statglobs.szInfo.cx, y + statglobs.szInfo.cy);
  280. ++(*count);
  281.     }
  282.     return TRUE;
  283. }