⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d3d9cartoon.cpp

📁 现在市面上流行的3D游戏画面越来越炫目
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//-----------------------------------------------------------------------------
// 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 + -