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