📄 d3d9cartoon.cpp
字号:
//-----------------------------------------------------------------------------
// File: D3D9Cartoon.cpp
//
// Desc: DirectX window application created by the DirectX AppWizard
//-----------------------------------------------------------------------------
#define STRICT
#include <windows.h>
#include <commctrl.h>
#include <commdlg.h>
#include <basetsd.h>
#include <math.h>
#include <stdio.h>
#include <d3dx9.h>
#include <dxerr9.h>
#include <tchar.h>
#include "DXUtil.h"
#include "D3DEnumeration.h"
#include "D3DSettings.h"
#include "D3DApp.h"
#include "D3DFont.h"
#include "D3DFile.h"
#include "D3DUtil.h"
#include "resource.h"
#include "D3D9Cartoon.h"
//-----------------------------------------------------------------------------
// Global access to the app (needed for the global WndProc())
//-----------------------------------------------------------------------------
CMyD3DApplication* g_pApp = NULL;
HINSTANCE g_hInst = NULL;
//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: Entry point to the program. Initializes everything, and goes into a
// message-processing loop. Idle time is used to render the scene.
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
CMyD3DApplication d3dApp;
g_pApp = &d3dApp;
g_hInst = hInst;
InitCommonControls();
if( FAILED( d3dApp.Create( hInst ) ) )
return 0;
return d3dApp.Run();
}
//-----------------------------------------------------------------------------
// Name: CMyD3DApplication()
// Desc: Application constructor. Paired with ~CMyD3DApplication()
// Member variables should be initialized to a known state here.
// The application window has not yet been created and no Direct3D device
// has been created, so any initialization that depends on a window or
// Direct3D should be deferred to a later stage.
//-----------------------------------------------------------------------------
CMyD3DApplication::CMyD3DApplication()
{
m_dwCreationWidth = 500;
m_dwCreationHeight = 375;
m_strWindowTitle = TEXT( "D3D9Cartoon" );
m_d3dEnumeration.AppUsesDepthBuffer = TRUE;
m_bStartFullscreen = false;
m_bShowCursorWhenFullscreen = false;
// Create a D3D font using d3dfont.cpp
m_pFont = new CD3DFont( _T("Arial"), 12, D3DFONT_BOLD );
m_bLoadingApp = TRUE;
m_pD3DXMesh = NULL;
ZeroMemory( &m_UserInput, sizeof(m_UserInput) );
m_fWorldRotX = 0.0f;
m_fWorldRotY = 0.0f;
///////////////////////////////////////////////////////////////
m_pSilhouetteVertexShader=0;
m_pSilhouetteVertexDecl=0;
m_pSurfaceVertexShader=0;
m_pSurfaceVertexDecl=0;
m_pFloorVertexShader=0;
m_pFloorVertexDecl=0;
m_pObject=new CD3DMesh();
m_pFloor=new CD3DMesh();
}
//-----------------------------------------------------------------------------
// Name: ~CMyD3DApplication()
// Desc: Application destructor. Paired with CMyD3DApplication()
//-----------------------------------------------------------------------------
CMyD3DApplication::~CMyD3DApplication()
{
}
//-----------------------------------------------------------------------------
// Name: OneTimeSceneInit()
// Desc: Paired with FinalCleanup().
// The window has been created and the IDirect3D9 interface has been
// created, but the device has not been created yet. Here you can
// perform application-related initialization and cleanup that does
// not depend on a device.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::OneTimeSceneInit()
{
// TODO: perform one time initialization
// Drawing loading status message until app finishes loading
SendMessage( m_hWnd, WM_PAINT, 0, 0 );
m_bLoadingApp = FALSE;
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: ConfirmDevice()
// Desc: Called during device initialization, this code checks the display device
// for some minimum set of capabilities
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::ConfirmDevice( D3DCAPS9* pCaps, DWORD dwBehavior,
D3DFORMAT Format )
{
UNREFERENCED_PARAMETER( Format );
UNREFERENCED_PARAMETER( dwBehavior );
UNREFERENCED_PARAMETER( pCaps );
BOOL bCapsAcceptable;
// TODO: Perform checks to see if these display caps are acceptable.
bCapsAcceptable = TRUE;
if( bCapsAcceptable )
return S_OK;
else
return E_FAIL;
}
//-----------------------------------------------------------------------------
// Name: InitDeviceObjects()
// Desc: Paired with DeleteDeviceObjects()
// The device has been created. Resources that are not lost on
// Reset() can be created here -- resources in D3DPOOL_MANAGED,
// D3DPOOL_SCRATCH, or D3DPOOL_SYSTEMMEM. Image surfaces created via
// CreateImageSurface are never lost and can be created here. Vertex
// shaders and pixel shaders can also be created here as they are not
// lost on Reset().
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InitDeviceObjects()
{
// TODO: create device objects
HRESULT hr;
// Init the font
m_pFont->InitDeviceObjects( m_pd3dDevice );
// Create a teapot mesh using D3DX
if( FAILED( hr = D3DXCreateTeapot( m_pd3dDevice, &m_pD3DXMesh, NULL ) ) )
return DXTRACE_ERR( "D3DXCreateTeapot", hr );
/////////////////////////////////////////////////////////////////////////
//在 d3dapp.cpp 的 Initialize3DEnvironment 中设置为软件模拟VS2.0(第725行)
LPDIRECT3DVERTEXBUFFER9 pVB;
LPVOID pVertices;
hr=m_pObject->Create(m_pd3dDevice,"tiger.x");
hr=m_pObject->SetFVF(m_pd3dDevice,FVF);
hr=m_pObject->m_pSysMemMesh->GetVertexBuffer(&pVB);
hr=pVB->Lock(0,0,&pVertices,0);
hr=D3DXComputeBoundingSphere((D3DXVECTOR3*)pVertices,m_pObject->m_pSysMemMesh->GetNumVertices(),
D3DXGetFVFVertexSize(m_pObject->m_pSysMemMesh->GetFVF()),&m_vCenter,&m_ObjRadius);
pVB->Unlock();
SAFE_RELEASE(pVB);
hr=m_pFloor->Create(m_pd3dDevice,"seaFloor.x");
hr=m_pFloor->SetFVF(m_pd3dDevice,FVF);
hr=BuildShaders();
hr=ModifyTextures();
return S_OK;
}
HRESULT CMyD3DApplication::BuildShaders()
{
LPD3DXBUFFER pError=0;
LPD3DXBUFFER pCode=0;
HRESULT hr;
D3DVERTEXELEMENT9 declSilhouette[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
{ 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
{ 0, 32, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
D3DDECL_END()
};
hr=m_pd3dDevice->CreateVertexDeclaration(declSilhouette,&m_pSilhouetteVertexDecl);
hr=D3DXAssembleShaderFromFile("zzSilhouette.vsh",0,0,0,&pCode,&pError);
hr=m_pd3dDevice->CreateVertexShader((DWORD*)pCode->GetBufferPointer(),&m_pSilhouetteVertexShader);
D3DVERTEXELEMENT9 declSurface[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
{ 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
{ 0, 32, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
D3DDECL_END()
};
hr=m_pd3dDevice->CreateVertexDeclaration(declSurface,&m_pSurfaceVertexDecl);
hr=D3DXAssembleShaderFromFile("zzSurface.vsh",0,0,0,&pCode,&pError);
hr=m_pd3dDevice->CreateVertexShader((DWORD*)pCode->GetBufferPointer(),&m_pSurfaceVertexShader);
D3DVERTEXELEMENT9 declFloor[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
{ 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
{ 0, 32, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
D3DDECL_END()
};
hr=m_pd3dDevice->CreateVertexDeclaration(declFloor,&m_pFloorVertexDecl);
hr=D3DXAssembleShaderFromFile("zzFloor.vsh",0,0,0,&pCode,&pError);
hr=m_pd3dDevice->CreateVertexShader((DWORD*)pCode->GetBufferPointer(),&m_pFloorVertexShader);
return(S_OK);
}
HRESULT CMyD3DApplication::ModifyTextures()
{
LPDIRECT3DSURFACE9 pSurface;
LPBYTE pMemSurface,pMemData;
D3DSURFACE_DESC desc;
RECT rect;
HRESULT hr;
DWORD i,j;
(*m_pObject->m_pTextures)->Release();
hr=D3DXCreateTexture(m_pd3dDevice,256,8,D3DX_DEFAULT,0,D3DFMT_L8,
D3DPOOL_MANAGED,m_pObject->m_pTextures);
(*m_pObject->m_pTextures)->GetSurfaceLevel(0,&pSurface);
pSurface->GetDesc(&desc);
pMemSurface=new BYTE[desc.Width*desc.Height];
pMemData=pMemSurface;
for(i=0;i<desc.Height;++i)
{
for(j=0;j<128;++j) *pMemData++=0x80;
for(;j<192;++j) *pMemData++=0xc0;
for(;j<desc.Width;++j) *pMemData++=0xff;
}
SetRect(&rect,0,0,desc.Width,desc.Height);
D3DXLoadSurfaceFromMemory(pSurface,0,0,pMemSurface,D3DFMT_L8,
desc.Width,0,&rect,D3DX_FILTER_NONE,0);
delete[]pMemSurface;
pSurface->Release();
return(S_OK);
}
//-----------------------------------------------------------------------------
// Name: RestoreDeviceObjects()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -