CModelViewerCamera控制摄像机

 
//--------------------------------------------------------------------------------------
// File: Test.cpp
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//--------------------------------------------------------------------------------------
#include "DXUT.h"
#include "SDKmisc.h"
#include "resource.h"
#include "DXUTcamera.h"
ID3DXFont*                 g_pFont = NULL;          //ID3DXFont字体对象
ID3DXSprite*               g_pTextSprite = NULL;    //ID3DXSprite文本精灵对象
LPDIRECT3DVERTEXBUFFER9    g_pVB        = NULL;    //顶点缓冲区对象
CModelViewerCamera         g_Camera;                  // A model viewing camera
//-----------------------------------------------------------------------------
// Desc: 顶点结构
//-----------------------------------------------------------------------------
struct CUSTOMVERTEX
{
 FLOAT x, y, z;
 DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)  //顶点格式


//--------------------------------------------------------------------------------------
// Rejects any D3D9 devices that aren't acceptable to the app by returning false
//--------------------------------------------------------------------------------------
bool CALLBACK IsD3D9DeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat,
                                      bool bWindowed, void* pUserContext )
{
 // No fallback defined by this app, so reject any device that 
 // doesn't support at least ps2.0
 if( pCaps->PixelShaderVersion < D3DPS_VERSION( 2, 0 ) )
  return false;

 // Skip backbuffer formats that don't support alpha blending
 IDirect3D9* pD3D = DXUTGetD3D9Object();
 if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,
  AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING,
  D3DRTYPE_TEXTURE, BackBufferFormat ) ) )
  return false;


 return true;

    return true;
}


//--------------------------------------------------------------------------------------
// Before a device is created, modify the device settings as needed
//--------------------------------------------------------------------------------------
bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, void* pUserContext )
{
 
 assert( DXUT_D3D9_DEVICE == pDeviceSettings->ver );

 // Debugging vertex shaders requires either REF or software vertex processing 
 // and debugging pixel shaders requires REF.  
#ifdef DEBUG_VS
 if( pDeviceSettings->d3d9.DeviceType != D3DDEVTYPE_REF )
 {
  pDeviceSettings->d3d9.BehaviorFlags &= ~D3DCREATE_HARDWARE_VERTEXPROCESSING;
  pDeviceSettings->d3d9.BehaviorFlags &= ~D3DCREATE_PUREDEVICE;
  pDeviceSettings->d3d9.BehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
 }
#endif
#ifdef DEBUG_PS
 pDeviceSettings->d3d9.DeviceType = D3DDEVTYPE_REF;
#endif

 // For the first device created if its a REF device, optionally display a warning dialog box
 static bool s_bFirstTime = true;
 if( s_bFirstTime )
 {
  s_bFirstTime = false;
  if( pDeviceSettings->d3d9.DeviceType == D3DDEVTYPE_REF )
   DXUTDisplaySwitchingToREFWarning( pDeviceSettings->ver );
 }
 //不采用默认帧率
 pDeviceSettings->d3d9.pp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
    return true;
}


//--------------------------------------------------------------------------------------
// Create any D3D9 resources that will live through a device reset (D3DPOOL_MANAGED)
// and aren't tied to the back buffer size
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
                                     void* pUserContext )
{
 HRESULT hr;
 V_RETURN( D3DXCreateFont( pd3dDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, 
  OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 
  L"Arial", &g_pFont ) );


 CUSTOMVERTEX vertices[] =
 {
  { -1.0f, 0.0f, 1.0f,0xffff0000, },
  { 1.0f,  0.0f, 1.0f,0xff00ff00, }, 
  { 0.0f, 1.0f, 1.0f,0xff0000ff, },
 };

 //创建顶点缓冲区
 if( FAILED( pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
  0, D3DFVF_CUSTOMVERTEX,
  D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
 {
  return E_FAIL;
 }

 //填充顶点缓冲区
 VOID* pVertices;
 if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
  return E_FAIL;
 memcpy( pVertices, vertices, sizeof(vertices) );
 g_pVB->Unlock();


 // Setup the camera's view parameters 
 D3DXVECTOR3 vecEye( 0.0f, 0.0f, -5.0f );
 D3DXVECTOR3 vecAt ( 0.0f, 0.0f, -0.0f );
 g_Camera.SetViewParams( &vecEye, &vecAt );
 FLOAT fObjectRadius=1;
 g_Camera.SetRadius( fObjectRadius * 3.0f, fObjectRadius * 0.5f, fObjectRadius * 10.0f );

    return S_OK;
}


//--------------------------------------------------------------------------------------
// Create any D3D9 resources that won't live through a device reset (D3DPOOL_DEFAULT) 
// or that are tied to the back buffer size 
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnD3D9ResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
                                    void* pUserContext )
{
 HRESULT hr;

 //恢复字体
 if( g_pFont )
  V_RETURN( g_pFont->OnResetDevice() );

 //创建ID3DXSprite接口对象
 V_RETURN( D3DXCreateSprite( pd3dDevice, &g_pTextSprite ) );

 //设置剔出模式为不剔出任何面(正面和反面)
 pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
 //关闭光照处理, 默认情况下启用光照处理
 pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );




 //Setup the camera's projection parameters
 float fAspectRatio = pBackBufferSurfaceDesc->Width / ( FLOAT )pBackBufferSurfaceDesc->Height;

 g_Camera.SetProjParams( D3DX_PI / 2, fAspectRatio, 0.1f, 5000.0f );
 g_Camera.SetWindow( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height );
 g_Camera.SetButtonMasks( MOUSE_LEFT_BUTTON, MOUSE_WHEEL, MOUSE_MIDDLE_BUTTON );


    return S_OK;
}


//--------------------------------------------------------------------------------------
// Handle updates to the scene.  This is called regardless of which D3D API is used
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext )
{
 g_Camera.FrameMove( fElapsedTime );
}

//-----------------------------------------------------------------------------
// Desc: 渲染文本
//-----------------------------------------------------------------------------
void RenderText()
{
 CDXUTTextHelper txtHelper( g_pFont, g_pTextSprite, 15 );

 //显示当前Direct3D设备状态和渲染帧速率
 txtHelper.Begin();
 txtHelper.SetInsertionPos( 5, 5 );
 txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
 txtHelper.DrawTextLine( DXUTGetFrameStats(true) );
 txtHelper.DrawTextLine( DXUTGetDeviceStats() );
 txtHelper.End();
}


//--------------------------------------------------------------------------------------
// Render the scene using the D3D9 device
//--------------------------------------------------------------------------------------
void CALLBACK OnD3D9FrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
    HRESULT hr;

    // Clear the render target and the zbuffer 
    V( pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB( 0, 45, 50, 170 ), 1.0f, 0 ) );

 // Set world matrix
 D3DXMATRIX world = *g_Camera.GetWorldMatrix() ;
 pd3dDevice->SetTransform(D3DTS_WORLD, &world) ;
 // Set view matrix
 D3DXMATRIX view  = *g_Camera.GetViewMatrix() ;
 pd3dDevice->SetTransform(D3DTS_VIEW, &view) ;
 // Set projection matrix
 D3DXMATRIX proj  = *g_Camera.GetProjMatrix() ;
 pd3dDevice->SetTransform(D3DTS_PROJECTION, &proj) ;

    // Render the scene
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {
  DXUT_BeginPerfEvent( DXUT_PERFEVENTCOLOR, L"HUD / Stats" ); 
  RenderText();
  DXUT_EndPerfEvent();

  pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
  pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
  pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );


        V( pd3dDevice->EndScene() );
    }
}


//--------------------------------------------------------------------------------------
// Handle messages to the application 
//--------------------------------------------------------------------------------------
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
                          bool* pbNoFurtherProcessing, void* pUserContext )
{
 // Pass all remaining windows messages to camera so it can respond to user input
 g_Camera.HandleMessages( hWnd, uMsg, wParam, lParam );

    return 0;
}


//--------------------------------------------------------------------------------------
// Release D3D9 resources created in the OnD3D9ResetDevice callback 
//--------------------------------------------------------------------------------------
void CALLBACK OnD3D9LostDevice( void* pUserContext )
{
 if( g_pFont )
  g_pFont->OnLostDevice();
 SAFE_RELEASE( g_pTextSprite );
}


//--------------------------------------------------------------------------------------
// Release D3D9 resources created in the OnD3D9CreateDevice callback 
//--------------------------------------------------------------------------------------
void CALLBACK OnD3D9DestroyDevice( void* pUserContext )
{
 SAFE_RELEASE( g_pFont );
}

//--------------------------------------------------------------------------------------
// Initialize the app 
//--------------------------------------------------------------------------------------
void InitApp()
{

}

//--------------------------------------------------------------------------------------
// Initialize everything and go into a render loop
//--------------------------------------------------------------------------------------
INT WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR, int )
{
    // Enable run-time memory check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif

    // Set the callback functions
    DXUTSetCallbackD3D9DeviceAcceptable( IsD3D9DeviceAcceptable );
    DXUTSetCallbackD3D9DeviceCreated( OnD3D9CreateDevice );
    DXUTSetCallbackD3D9DeviceReset( OnD3D9ResetDevice );
    DXUTSetCallbackD3D9FrameRender( OnD3D9FrameRender );
    DXUTSetCallbackD3D9DeviceLost( OnD3D9LostDevice );
    DXUTSetCallbackD3D9DeviceDestroyed( OnD3D9DestroyDevice );
    DXUTSetCallbackDeviceChanging( ModifyDeviceSettings );
    DXUTSetCallbackMsgProc( MsgProc );
    DXUTSetCallbackFrameMove( OnFrameMove );

    // TODO: Perform any application-level initialization here
 InitApp();
    // Initialize DXUT and create the desired Win32 window and Direct3D device for the application
    DXUTInit( true, true ); // Parse the command line and show msgboxes
    DXUTSetHotkeyHandling( true, true, true );  // handle the default hotkeys
    DXUTSetCursorSettings( true, true ); // Show the cursor and clip it when in full screen
    DXUTCreateWindow( L"Test" );
    DXUTCreateDevice( true, 640, 480 );

    // Start the render loop
    DXUTMainLoop();

    // TODO: Perform any application-level cleanup here

    return DXUTGetExitCode();
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值