0001:
0002:
0003:
0004:
0005:
0006:
0007:
0008:
0009: #include "dxstdafx.h"
0010: #include "resource.h"
0011: #include "RayTrace\render.h"
0012: #include "main_fx.h"
0013:
0014:
0015:
0016:
0017:
0018:
0019:
0020:
0021:
0022:
0023: struct VERTEX
0024: {
0025: D3DXVECTOR3 pos;
0026: D3DXVECTOR2 tex;
0027:
0028: static const DWORD FVF;
0029: };
0030: const DWORD VERTEX::FVF = D3DFVF_XYZ | D3DFVF_TEX1;
0031:
0032:
0033:
0034:
0035:
0036: IDirect3DDevice9* g_pd3dDevice = NULL;
0037: ID3DXFont* g_pFont = NULL;
0038:
0039: ID3DXSprite* g_pTextSprite = NULL;
0040:
0041: ID3DXEffect* g_pEffect = NULL;
0042:
0043: CModelViewerCamera g_Camera;
0044:
0045: bool g_bShowHelp = false;
0046:
0047: CDXUTDialog g_HUD;
0048:
0049: CDXUTDialog g_SampleUI;
0050:
0051:
0052: D3DVIEWPORT9 g_ViewportFB;
0053:
0054: VERTEX g_Vertex[4];
0055:
0056: DWORD g_MapSize = 512;
0057: LPDIRECT3DTEXTURE9 g_pTexture = NULL;
0058: LPDIRECT3DTEXTURE9 g_pSmallTexture[5]={NULL,NULL,NULL,NULL,NULL};
0059:
0060: DWORD g_nRender = 0;
0061:
0062:
0063:
0064:
0065:
0066: #define IDC_TOGGLEFULLSCREEN 1
0067: #define IDC_TOGGLEREF 2
0068: #define IDC_CHANGEDEVICE 3
0069:
0070:
0071:
0072:
0073:
0074:
0075:
0076: bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, bool bWindowed );
0077: void CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps );
0078: HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc );
0079: HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc );
0080: void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime );
0081: void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime );
0082: LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing );
0083: void CALLBACK KeyboardProc( UINT nChar, bool bKeyDown, bool bAltDown );
0084: void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl );
0085: void CALLBACK OnLostDevice();
0086: void CALLBACK OnDestroyDevice();
0087:
0088: void InitApp();
0089: HRESULT LoadMesh( IDirect3DDevice9* pd3dDevice, WCHAR* strFileName, ID3DXMesh** ppMesh );
0090: void RenderText();
0091:
0092:
0093:
0094:
0095:
0096:
0097:
0098:
0099: INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
0100: {
0101:
0102:
0103:
0104:
0105:
0106:
0107:
0108:
0109: DXUTSetCallbackDeviceCreated( OnCreateDevice );
0110: DXUTSetCallbackDeviceReset( OnResetDevice );
0111: DXUTSetCallbackDeviceLost( OnLostDevice );
0112: DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );
0113: DXUTSetCallbackMsgProc( MsgProc );
0114: DXUTSetCallbackKeyboard( KeyboardProc );
0115: DXUTSetCallbackFrameRender( OnFrameRender );
0116: DXUTSetCallbackFrameMove( OnFrameMove );
0117:
0118:
0119: DXUTSetCursorSettings( true, true );
0120:
0121: InitApp();
0122:
0123:
0124:
0125:
0126: DXUTInit( true, true, true );
0127: DXUTCreateWindow( L"main" );
0128: DXUTCreateDevice( D3DADAPTER_DEFAULT, true, 512, 512, IsDeviceAcceptable, ModifyDeviceSettings );
0129:
0130:
0131:
0132:
0133: DXUTMainLoop();
0134:
0135:
0136:
0137:
0138: return DXUTGetExitCode();
0139: }
0140:
0141:
0142:
0143:
0144:
0145:
0146: void InitApp()
0147: {
0148: g_pEffect = NULL;
0149:
0150: g_Vertex[0].pos = D3DXVECTOR3(+1,-1,0.5);
0151: g_Vertex[1].pos = D3DXVECTOR3(-1,-1,0.5);
0152: g_Vertex[2].pos = D3DXVECTOR3(+1,+1,0.5);
0153: g_Vertex[3].pos = D3DXVECTOR3(-1,+1,0.5);
0154: g_Vertex[0].tex = D3DXVECTOR2(1,1);
0155: g_Vertex[1].tex = D3DXVECTOR2(0,1);
0156: g_Vertex[2].tex = D3DXVECTOR2(1,0);
0157: g_Vertex[3].tex = D3DXVECTOR2(0,0);
0158:
0159:
0160:
0161: g_HUD.SetCallback( OnGUIEvent ); int iY = 10;
0162: g_HUD.AddButton( IDC_TOGGLEFULLSCREEN, L"Toggle full screen", 35, iY, 125, 22 );
0163: g_HUD.AddButton( IDC_TOGGLEREF, L"Toggle REF (F3)", 35, iY += 24, 125, 22 );
0164: g_HUD.AddButton( IDC_CHANGEDEVICE, L"Change device (F2)", 35, iY += 24, 125, 22 );
0165:
0166: g_SampleUI.SetCallback( OnGUIEvent ); iY = 10;
0167:
0168:
0169:
0170:
0171:
0172:
0173:
0174:
0175:
0176:
0177:
0178:
0179:
0180:
0181:
0182:
0183:
0184:
0185:
0186:
0187:
0188:
0189:
0190:
0191:
0192:
0193: }
0194:
0195:
0196:
0197:
0198:
0199: bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat,
0200: D3DFORMAT BackBufferFormat, bool bWindowed )
0201: {
0202:
0203:
0204: IDirect3D9* pD3D = DXUTGetD3DObject();
0205: if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,
0206: AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING,
0207: D3DRTYPE_TEXTURE, BackBufferFormat ) ) )
0208: return false;
0209:
0210:
0211: if( pCaps->VertexShaderVersion < D3DVS_VERSION( 1, 1 ) )
0212: return false;
0213:
0214:
0215: if( pCaps->PixelShaderVersion < D3DPS_VERSION( 2, 0 ) )
0216: return false;
0217:
0218: return true;
0219: }
0220:
0221:
0222:
0223:
0224:
0225:
0226:
0227:
0228:
0229:
0230: void CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps )
0231: {
0232:
0233:
0234: if( (pCaps->DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0 ||
0235: pCaps->VertexShaderVersion < D3DVS_VERSION(1,1) )
0236: {
0237: pDeviceSettings->BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
0238: }
0239: else
0240: {
0241: pDeviceSettings->BehaviorFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING;
0242: }
0243:
0244:
0245:
0246: if ((pCaps->DevCaps & D3DDEVCAPS_PUREDEVICE) != 0 &&
0247: (pDeviceSettings->BehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING) != 0 )
0248: pDeviceSettings->BehaviorFlags |= D3DCREATE_PUREDEVICE;
0249:
0250:
0251:
0252: #ifdef DEBUG_VS
0253: if( pDeviceSettings->DeviceType != D3DDEVTYPE_REF )
0254: {
0255: pDeviceSettings->BehaviorFlags &= ~D3DCREATE_HARDWARE_VERTEXPROCESSING;
0256: pDeviceSettings->BehaviorFlags &= ~D3DCREATE_PUREDEVICE;
0257: pDeviceSettings->BehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
0258: }
0259: #endif
0260: #ifdef DEBUG_PS
0261: pDeviceSettings->DeviceType = D3DDEVTYPE_REF;
0262: #endif
0263: }
0264:
0265:
0266:
0267:
0268: VOID WINAPI FillTexture (D3DXVECTOR4* pOut, CONST D3DXVECTOR2* pTexCoord,
0269: CONST D3DXVECTOR2* pTexelSize, LPVOID pData)
0270: {
0271: UNREFERENCED_PARAMETER( pData );
0272:
0273: float *p = Render::GetDataPointer();
0274: DWORD x = (DWORD)(pTexCoord->x / pTexelSize->x);
0275: DWORD y = (DWORD)(pTexCoord->y / pTexelSize->y);
0276:
0277: int no = y * Render::RENDER_WIDTH + x;
0278:
0279: pOut->x = p[4*no+0];
0280: pOut->y = p[4*no+1];
0281: pOut->z = p[4*no+2];
0282: pOut->w = 0;
0283: }
0284:
0285:
0286:
0287:
0288:
0289:
0290:
0291:
0292:
0293: HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc )
0294: {
0295: HRESULT hr;
0296:
0297: g_pd3dDevice = pd3dDevice;
0298:
0299:
0300: Render::Init();
0301:
0302:
0303:
0304: V_RETURN( D3DXCreateFont( pd3dDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET,
0305: OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
0306: L"Arial", &g_pFont ) );
0307:
0308:
0309: V_RETURN( pd3dDevice->CreateTexture( g_MapSize, g_MapSize, 1
0310: , 0, D3DFMT_A32B32G32R32F, D3DPOOL_MANAGED, &g_pTexture, NULL));
0311: V_RETURN( D3DXFillTexture( g_pTexture, FillTexture, NULL ));
0312:
0313:
0314:
0315:
0316:
0317:
0318:
0319:
0320:
0321:
0322:
0323:
0324:
0325: DWORD dwShaderFlags = 0;
0326: #ifdef DEBUG_VS
0327: dwShaderFlags |= D3DXSHADER_FORCE_VS_SOFTWARE_NOOPT;
0328: #endif
0329: #ifdef DEBUG_PS
0330: dwShaderFlags |= D3DXSHADER_FORCE_PS_SOFTWARE_NOOPT;
0331: #endif
0332:
0333:
0334:
0335: V_RETURN( D3DXCreateEffect( pd3dDevice, g_effect, sizeof(g_effect),
0336: NULL, NULL, dwShaderFlags, NULL, &g_pEffect, NULL ) );
0337:
0338:
0339:
0340: D3DXVECTOR3 vecEye(0.0f, 3.0f, -3.0f);
0341: D3DXVECTOR3 vecAt (0.0f, 0.0f, -0.0f);
0342: g_Camera.SetViewParams( &vecEye, &vecAt );
0343:
0344: return S_OK;
0345: }
0346:
0347:
0348:
0349:
0350:
0351:
0352:
0353: HRESULT LoadMesh( IDirect3DDevice9* pd3dDevice, WCHAR* strFileName, ID3DXMesh** ppMesh )
0354: {
0355: ID3DXMesh* pMesh = NULL;
0356: WCHAR str[MAX_PATH];
0357: HRESULT hr;
0358:
0359:
0360:
0361:
0362:
0363: V_RETURN( DXUTFindDXSDKMediaFileCch( str, MAX_PATH, strFileName ) );
0364:
0365: V_RETURN( D3DXLoadMeshFromX(str, D3DXMESH_MANAGED, pd3dDevice, NULL, NULL, NULL, NULL, &pMesh) );
0366:
0367: DWORD *rgdwAdjacency = NULL;
0368:
0369:
0370: if( !(pMesh->GetFVF() & D3DFVF_NORMAL) )
0371: {
0372: ID3DXMesh* pTempMesh;
0373: V( pMesh->CloneMeshFVF( pMesh->GetOptions(),
0374: pMesh->GetFVF() | D3DFVF_NORMAL,
0375: pd3dDevice, &pTempMesh ) );
0376: V( D3DXComputeNormals( pTempMesh, NULL ) );
0377:
0378: SAFE_RELEASE( pMesh );
0379: pMesh = pTempMesh;
0380: }
0381:
0382:
0383:
0384:
0385:
0386: rgdwAdjacency = new DWORD[pMesh->GetNumFaces() * 3];
0387: if( rgdwAdjacency == NULL )
0388: return E_OUTOFMEMORY;
0389: V( pMesh->ConvertPointRepsToAdjacency(NULL, rgdwAdjacency) );
0390: V( pMesh->OptimizeInplace(D3DXMESHOPT_VERTEXCACHE, rgdwAdjacency, NULL, NULL, NULL) );
0391: delete []rgdwAdjacency;
0392:
0393: *ppMesh = pMesh;
0394:
0395: return S_OK;
0396: }
0397:
0398:
0399:
0400:
0401:
0402:
0403:
0404:
0405:
0406: HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice,
0407: const D3DSURFACE_DESC* pBackBufferSurfaceDesc )
0408: {
0409: HRESULT hr;
0410:
0411: pd3dDevice->GetViewport(&g_ViewportFB);
0412:
0413:
0414: DWORD size = 256;
0415: for( int i = 0; i < 5; i++ )
0416: {
0417: D3DXCreateTexture( pd3dDevice, size, size, 1,
0418: D3DUSAGE_RENDERTARGET, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT, &g_pSmallTexture[i]);
0419: size /= 4;
0420: }
0421:
0422: if( g_pFont )
0423: V_RETURN( g_pFont->OnResetDevice() );
0424: if( g_pEffect )
0425: V_RETURN( g_pEffect->OnResetDevice() );
0426:
0427:
0428: V_RETURN( D3DXCreateSprite( pd3dDevice, &g_pTextSprite ) );
0429:
0430:
0431: float fAspectRatio = pBackBufferSurfaceDesc->Width / (FLOAT)pBackBufferSurfaceDesc->Height;
0432: g_Camera.SetProjParams( D3DX_PI/4, fAspectRatio, 0.1f, 1000.0f );
0433: g_Camera.SetWindow( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height );
0434:
0435: g_HUD.SetLocation( pBackBufferSurfaceDesc->Width-170, 0 );
0436: g_HUD.SetSize( 170, 170 );
0437: g_SampleUI.SetLocation( pBackBufferSurfaceDesc->Width-170, pBackBufferSurfaceDesc->Height-350 );
0438: g_SampleUI.SetSize( 170, 300 );
0439:
0440: return S_OK;
0441: }
0442:
0443:
0444:
0445:
0446:
0447:
0448:
0449:
0450: void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime )
0451: {
0452:
0453: g_Camera.FrameMove( fElapsedTime );
0454:
0455: if( Render::Render() )
0456: {
0457: g_nRender = Render::GetRenderCount();
0458: D3DXFillTexture( g_pTexture, FillTexture, NULL );
0459: }
0460: }
0461:
0462:
0463:
0464:
0465:
0466:
0467:
0468:
0469:
0470: void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime )
0471: {
0472: HRESULT hr;
0473: D3DXMATRIXA16 mWorld;
0474: D3DXMATRIXA16 mCamera;
0475: D3DXMATRIXA16 mView;
0476: D3DXMATRIXA16 mProj;
0477: D3DXMATRIXA16 mWorldViewProjection;
0478:
0479: LPDIRECT3DSURFACE9 pSurf;
0480: LPDIRECT3DSURFACE9 pOldBackBuffer, pOldZBuffer;
0481: D3DVIEWPORT9 oldViewport;
0482:
0483: D3DVIEWPORT9 viewport = {0,0
0484: , 1
0485: , 1
0486: , 0.0f,1.0f};
0487:
0488:
0489: if( SUCCEEDED( pd3dDevice->BeginScene() ) )
0490: {
0491:
0492:
0493:
0494: pd3dDevice->GetRenderTarget(0, &pOldBackBuffer);
0495: pd3dDevice->GetDepthStencilSurface(&pOldZBuffer);
0496: pd3dDevice->GetViewport(&oldViewport);
0497:
0498: pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
0499:
0500: if( g_pEffect != NULL )
0501: {
0502:
0503:
0504:
0505: g_pSmallTexture[0]->GetSurfaceLevel(0, &pSurf);
0506: pd3dDevice->SetRenderTarget(0, pSurf);
0507: SAFE_RELEASE(pSurf);
0508:
0509: viewport.Width = 256;
0510: viewport.Height = 256;
0511: pd3dDevice->SetViewport(&viewport);
0512:
0513: pd3dDevice->SetFVF( VERTEX::FVF );
0514:
0515: V( g_pEffect->SetTechnique( "LogTechnique" ) );
0516:
0517: V( g_pEffect->SetTexture( "Texture", g_pTexture ) );
0518: V( g_pEffect->SetFloat( "g_fInvTexSize", 1.0f/512.0f ) );
0519:
0520: V( g_pEffect->Begin( NULL, 0) );
0521: V( g_pEffect->BeginPass(0) );
0522: pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP,2, g_Vertex, sizeof(VERTEX) );
0523: V( g_pEffect->EndPass() );
0524: V( g_pEffect->End() );
0525:
0526:
0527:
0528:
0529: float size = 256.0f;
0530: for( int i = 1; i < 5; i++ )
0531: {
0532: g_pSmallTexture[i]->GetSurfaceLevel(0, &pSurf);
0533: pd3dDevice->SetRenderTarget(0, pSurf);
0534: SAFE_RELEASE(pSurf);
0535:
0536: viewport.Width /= 4;
0537: viewport.Height /= 4;
0538: pd3dDevice->SetViewport(&viewport);
0539:
0540:
0541:
0542: V( g_pEffect->SetTechnique( "SmallTechnique" ) );
0543:
0544: V( g_pEffect->SetTexture( "Texture", g_pSmallTexture[i-1] ) );
0545: V( g_pEffect->SetFloat( "g_fInvTexSize", 1.0f/size ) );
0546:
0547: V( g_pEffect->Begin( NULL, 0) );
0548: V( g_pEffect->BeginPass(0) );
0549: pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP,2, g_Vertex, sizeof(VERTEX) );
0550: V( g_pEffect->EndPass() );
0551: V( g_pEffect->End() );
0552:
0553: size /= 4;
0554: }
0555:
0556:
0557:
0558:
0559: pd3dDevice->SetRenderTarget(0, pOldBackBuffer);
0560: pd3dDevice->SetDepthStencilSurface(pOldZBuffer);
0561: pd3dDevice->SetViewport(&oldViewport);
0562: pOldBackBuffer->Release();
0563: pOldZBuffer->Release();
0564:
0565:
0566: V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0) );
0567:
0568:
0569: V( g_pEffect->SetTechnique( "FinalTechnique" ) );
0570:
0571: V( g_pEffect->SetTexture( "Texture", g_pTexture ) );
0572: V( g_pEffect->SetTexture( "TextureInfo", g_pSmallTexture[4] ) );
0573: V( g_pEffect->SetFloat( "g_fInvTexSize", 1.0f/(float)g_MapSize ) );
0574:
0575: pd3dDevice->SetFVF( VERTEX::FVF );
0576:
0577: V( g_pEffect->Begin( NULL, 0) );
0578: V( g_pEffect->BeginPass(0) );
0579: pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP,2, g_Vertex, sizeof(VERTEX) );
0580: V( g_pEffect->EndPass() );
0581: V( g_pEffect->End() );
0582: }
0583:
0584:
0585: DXUT_BeginPerfEvent( DXUT_PERFEVENTCOLOR, L"HUD / Stats" );
0586: RenderText();
0587: V( g_HUD.OnRender( fElapsedTime ) );
0588: V( g_SampleUI.OnRender( fElapsedTime ) );
0589: DXUT_EndPerfEvent();
0590:
0591:
0592: #if 1
0593:
0594: {
0595: pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1);
0596: pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
0597: pd3dDevice->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_DISABLE);
0598: pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
0599: pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT );
0600: pd3dDevice->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 );
0601: float scale = 64.0f;
0602: typedef struct { FLOAT p[4]; FLOAT tu, tv;} TVERTEX;
0603:
0604: for(DWORD i=0; i<6; i++){
0605: TVERTEX Vertex[4] = {
0606:
0607: {(i+0)*scale, (FLOAT)g_ViewportFB.Height-scale, 0, 1, 0, 0,},
0608: {(i+1)*scale, (FLOAT)g_ViewportFB.Height-scale, 0, 1, 1, 0,},
0609: {(i+1)*scale, (FLOAT)g_ViewportFB.Height- 0, 0, 1, 1, 1,},
0610: {(i+0)*scale, (FLOAT)g_ViewportFB.Height- 0, 0, 1, 0, 1,},
0611: };
0612: if(0==i) pd3dDevice->SetTexture( 0, g_pSmallTexture[0] );
0613: if(1==i) pd3dDevice->SetTexture( 0, g_pSmallTexture[1] );
0614: if(2==i) pd3dDevice->SetTexture( 0, g_pSmallTexture[2] );
0615: if(3==i) pd3dDevice->SetTexture( 0, g_pSmallTexture[3] );
0616: if(4==i) pd3dDevice->SetTexture( 0, g_pSmallTexture[4] );
0617: if(5==i) pd3dDevice->SetTexture( 0, g_pTexture );
0618:
0619: pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TVERTEX ) );
0620: }
0621: }
0622: #endif
0623:
0624: V( pd3dDevice->EndScene() );
0625: }
0626: }
0627:
0628:
0629:
0630:
0631:
0632:
0633: void RenderText()
0634: {
0635:
0636:
0637:
0638:
0639: const D3DSURFACE_DESC* pd3dsdBackBuffer = DXUTGetBackBufferSurfaceDesc();
0640: CDXUTTextHelper txtHelper( g_pFont, g_pTextSprite, 15 );
0641:
0642:
0643: txtHelper.Begin();
0644: txtHelper.SetInsertionPos( 5, 5 );
0645: txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
0646: txtHelper.DrawTextLine( DXUTGetFrameStats() );
0647: txtHelper.DrawTextLine( DXUTGetDeviceStats() );
0648:
0649: WCHAR str[100];
0650: _snwprintf( str, 100, L"Rendering count : %d", g_nRender );
0651: txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
0652: txtHelper.DrawTextLine( str );
0653:
0654:
0655: if( g_bShowHelp )
0656: {
0657: txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer->Height-15*3 );
0658: txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 0.75f, 0.0f, 1.0f ) );
0659: txtHelper.DrawTextLine( L"Controls (F1 to hide):" );
0660:
0661: txtHelper.SetInsertionPos( 40, pd3dsdBackBuffer->Height-15*5 );
0662: txtHelper.DrawTextLine( L"Quit: ESC" );
0663: }
0664: else
0665: {
0666: txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer->Height-15*2 );
0667: txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
0668: txtHelper.DrawTextLine( L"Press F1 for help" );
0669: }
0670: txtHelper.End();
0671: }
0672:
0673:
0674:
0675:
0676:
0677:
0678:
0679: LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing )
0680: {
0681:
0682: *pbNoFurtherProcessing = g_HUD.MsgProc( hWnd, uMsg, wParam, lParam );
0683: if( *pbNoFurtherProcessing )
0684: return 0;
0685: *pbNoFurtherProcessing = g_SampleUI.MsgProc( hWnd, uMsg, wParam, lParam );
0686: if( *pbNoFurtherProcessing )
0687: return 0;
0688:
0689:
0690: g_Camera.HandleMessages( hWnd, uMsg, wParam, lParam );
0691:
0692: return 0;
0693: }
0694:
0695:
0696:
0697:
0698:
0699:
0700:
0701:
0702: void CALLBACK KeyboardProc( UINT nChar, bool bKeyDown, bool bAltDown )
0703: {
0704: if( bKeyDown )
0705: {
0706: switch( nChar )
0707: {
0708: case VK_F1: g_bShowHelp = !g_bShowHelp; break;
0709: }
0710: }
0711: }
0712:
0713:
0714:
0715:
0716:
0717: void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl )
0718: {
0719: switch( nControlID )
0720: {
0721: case IDC_TOGGLEFULLSCREEN: DXUTToggleFullScreen(); break;
0722: case IDC_TOGGLEREF: DXUTToggleREF(); break;
0723: case IDC_CHANGEDEVICE: DXUTSetShowSettingsDialog( !DXUTGetShowSettingsDialog() ); break;
0724: }
0725: }
0726:
0727:
0728:
0729:
0730:
0731:
0732:
0733:
0734:
0735: void CALLBACK OnLostDevice()
0736: {
0737: if( g_pFont )
0738: g_pFont->OnLostDevice();
0739: if( g_pEffect )
0740: g_pEffect->OnLostDevice();
0741: SAFE_RELEASE( g_pTextSprite );
0742:
0743: for( int i = 0; i < 5; i++ )
0744: {
0745: SAFE_RELEASE( g_pSmallTexture[i] );
0746: }
0747: }
0748:
0749:
0750:
0751:
0752:
0753:
0754:
0755:
0756: void CALLBACK OnDestroyDevice()
0757: {
0758: Render::Delete();
0759:
0760: SAFE_RELEASE( g_pEffect );
0761: SAFE_RELEASE( g_pFont );
0762:
0763: SAFE_RELEASE( g_pTexture );
0764: }
0765:
0766:
0767:
0768: