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

📄 renderd3dwnd.cpp

📁 游戏编程精华02-含有几十个游戏编程例子
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/* Copyright (C) Greg James, 2001. 
 * All rights reserved worldwide.
 *
 * This software is provided "as is" without express or implied
 * warranties. You may freely copy and compile this source into
 * applications you distribute provided that the copyright text
 * below is included in the resulting source code, for example:
 * "Portions Copyright (C) Greg James, 2001"
 */
// RenderD3DWnd.cpp : implementation file
//

#include "StdAfx.h"
#include "NVEffectsBrowser.h"
#include "RenderD3DWnd.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

using namespace std;
using namespace nv_objects;

// Old-style D3D vertices
class Vertex
{
public:
	Vertex(const D3DXVECTOR3& Pos, const D3DXVECTOR3& Norm, const D3DXVECTOR2& Tex)
		: Position(Pos), Normal(Norm), Texture(Tex)
	{}

	Vertex()
	{}

	D3DXVECTOR3 Position;
	D3DXVECTOR3 Normal;
	D3DXVECTOR2 Texture;
};

class TLVertex
{
public:
	D3DXVECTOR4 Position;
	DWORD Diffuse;
	DWORD Specular;
	D3DXVECTOR2 Texture;
};

#define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)
#define D3DFVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1)



/////////////////////////////////////////////////////////////////////////////
// CRenderD3DWnd

IMPLEMENT_DYNCREATE(CRenderD3DWnd, CRenderWnd)

CRenderD3DWnd::CRenderD3DWnd()
  : m_devType(D3DDEVTYPE_REF),
	m_devBhv(0),
	m_bActive(true),
	m_colorBufferFormat(D3DFMT_UNKNOWN),
   	m_MultiSampleType(D3DMULTISAMPLE_NONE),
   	m_pD3DDev(NULL),
   	m_bSizing(false),
 	m_bUseSWVP(false),
 	m_pLogoVB(NULL),
 	m_pLogoTexture(NULL),
	m_bValid(false),
	m_pFontTexture(NULL),
	m_pFontVB(NULL)
{
	// Font setup
    _tcscpy( m_strFontName, _T("Arial"));
    m_dwFontHeight         = 10;
    m_dwFontFlags          = D3DFONT_BOLD;
}

CRenderD3DWnd::~CRenderD3DWnd()
{
}


BEGIN_MESSAGE_MAP(CRenderD3DWnd, CRenderWnd)
	//{{AFX_MSG_MAP(CRenderD3DWnd)
	ON_WM_SIZE()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_RBUTTONDOWN()
	ON_WM_RBUTTONUP()
	ON_WM_KEYDOWN()
	ON_WM_KEYUP()
	ON_WM_SYSKEYDOWN()
	ON_WM_SYSKEYUP()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CRenderD3DWnd parent class overrides

HRESULT CRenderD3DWnd::Init()
{
	return InitD3D();
}

HRESULT CRenderD3DWnd::Release()
{
	return ReleaseD3D();
}

void CRenderD3DWnd::GetDevice(LPDIRECT3DDEVICE8* pDev) 
{
	if (!m_pD3DDev)
		*pDev = NULL;

	if (m_pD3DDev) {
		*pDev = m_pD3DDev; 
		m_pD3DDev->AddRef();
	}
}

HRESULT CRenderD3DWnd::UpdateDevice()
{
	HRESULT hr;
	m_devType = theApp.GetDeviceType();

	CNVEffectsDoc* pDoc = GetDocument();

	pDoc->DeleteDeviceObjects();

	hr = ReleaseD3D();
	if (FAILED(hr)) return hr;

	hr = InitD3D();
	if (FAILED(hr)) return hr;

	return hr;
}

HRESULT CRenderD3DWnd::ConfirmDevice(EBEffect *pEffect)
{
	D3DCAPS8 Caps;
	m_pD3DDev->GetDeviceCaps(&Caps);
	
	return pEffect->ConfirmDevice(&Caps, 0, D3DFMT_UNKNOWN);
}

HRESULT CRenderD3DWnd::SetupEffect(EBEffect *pEffect)
{
	ASSERT(m_pD3DDev);
	if (!m_pD3DDev)
		return NVEFF_ERR_NOTINITIALIZED;
	
	ASSERT(pEffect);
	if (!pEffect)
		return NVEFF_ERR_NOTINITIALIZED;

	HRESULT hr;

	hr = m_pD3DDev->TestCooperativeLevel();
	if (FAILED(hr)) return hr;

	hr = ConfirmDevice(pEffect);
	if (FAILED(hr)) return hr;

	hr = SetDefaultRenderstates();
	if (FAILED(hr)) return hr;

	hr = pEffect->Initialize(m_pD3DDev);
	if (FAILED(hr)) return hr;

	CRect r;
	GetClientRect(r);
	pEffect->Resize(GetSafeHwnd(), r.Width(), r.Height(), true);

	return S_OK;
}

HRESULT CRenderD3DWnd::SetDefaultRenderstates()
{
	ASSERT(m_pD3DDev);
	if (!m_pD3DDev)
		return NVEFF_ERR_NOTINITIALIZED;

	return SetDefaultRenderstatesD3D();
}

HRESULT CRenderD3DWnd::Render()
{
	ASSERT(m_pD3DDev);
	if (!m_pD3DDev)
		return NVEFF_ERR_NOTINITIALIZED;

	CRect r;
	GetClientRect(&r);
	CNVEffectsDoc* pDoc = GetDocument();
	if (!m_bValid || !IsWindowVisible() ||
		(r.Width() <= 0 || r.Height() <= 0) ||
		!pDoc->IsEffectValid())
		return NVEFF_ERR_NOTINITIALIZED;

	HRESULT hr;

	hr = m_pD3DDev->BeginScene();
	if (FAILED(hr)) return hr;

	pDoc->Tick();
	DrawLogo();

	// Show the framerate
	EBTimer* pTimer = pDoc->GetTimer();
	float fAverageFPS = pTimer->GetAverageFramesPerSec();

	TCHAR strFrameStats[40];
	_stprintf(strFrameStats, _T("%.02f fps"), fAverageFPS);	
	DrawText(2, 0, D3DCOLOR_ARGB(255,255,255,0), strFrameStats);

	DWORD dwStat;
	if (pDoc->GetTriangleCount(dwStat))
	{
		_stprintf(strFrameStats, _T("%0.2f MTris/sec"), ((fAverageFPS * (float)dwStat) / 1000000.0f));
		DrawText(2, m_dwFontHeight + 8, D3DCOLOR_ARGB(255,255,255,0), strFrameStats);
	}

	if (pDoc->GetVertexCount(dwStat))
	{
		_stprintf(strFrameStats, _T("%.02f MVerts/sec"), ((fAverageFPS * (float)dwStat) / 1000000.0f));
		DrawText(2, (m_dwFontHeight + 8) + (m_dwFontHeight + 8), D3DCOLOR_ARGB(255,255,255,0), strFrameStats);
	}

	hr = m_pD3DDev->EndScene();
	if (FAILED(hr)) return hr;

	hr = m_pD3DDev->Present(NULL, NULL, NULL, NULL);
	if (FAILED(hr)) return hr;

	return hr;
}

HRESULT CRenderD3DWnd::Refresh(CDC* pDC)
{
	ASSERT(m_pD3DDev);
	if (!m_pD3DDev)
		return NVEFF_ERR_NOTINITIALIZED;

	HRESULT hr;

	hr = m_pD3DDev->Present(NULL, NULL, GetSafeHwnd(), NULL);
	if (FAILED(hr)) return hr;

	return hr;
}

HRESULT CRenderD3DWnd::Clear()
{
	ASSERT(m_pD3DDev);
	if (!m_pD3DDev)
		return NVEFF_ERR_NOTINITIALIZED;

	HRESULT hr;

	// Clear to grey
	hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 0xAA, 0xAA, 0xAA ), 1.0, 0);
	if (FAILED(hr)) return hr;
	
	hr = m_pD3DDev->Present(NULL, NULL, GetSafeHwnd(), NULL);
	if (FAILED(hr)) return hr;

	return hr;
}

/////////////////////////////////////////////////////////////////////////////
// CRenderD3DWnd message handlers

void CRenderD3DWnd::OnSize(UINT nType, int cx, int cy) 
{
	CRenderWnd::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	CNVEffectsDoc* pDoc = GetDocument();

	if (!m_bSizing)
	{
		m_bValid = false;
		HRESULT hr;
		pDoc->DeleteDeviceObjects();
		FreeTextBuffer();

		if (m_pD3DDev)
		{
			hr = m_pD3DDev->Reset(&m_d3dpp);
			if (FAILED(hr))
			{
				DISPDBG(0, "ERROR: Failed resize");
				
				return;
			}

			m_bValid = true;

			hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 0xAA, 0xAA, 0xAA ), 1.0, 0);
			if (FAILED(hr))
			{
				DISPDBG(0, "ERROR: Failed clear");
				
				return;
			}

			hr = ResizeLogo();
			if (FAILED(hr))
			{
				DISPDBG(0, "ERROR: Failed logo resize");

				return;
			}

			hr = SetupTextBuffer();
			if (FAILED(hr))
			{
				DISPDBG(0, "ERROR: Failed setup of text VB");

				return;
			}

			pDoc->InitDeviceObjects();

		}
		else
		{
			m_bValid = true;
		}
	}

	m_bSizing = false;
}

void CRenderD3DWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	
	CRenderWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CRenderD3DWnd::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	
	CRenderWnd::OnKeyUp(nChar, nRepCnt, nFlags);
}

void CRenderD3DWnd::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	CRenderWnd::OnLButtonDown(nFlags, point);
}

void CRenderD3DWnd::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	CRenderWnd::OnLButtonUp(nFlags, point);
}

void CRenderD3DWnd::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	CRenderWnd::OnMouseMove(nFlags, point);
}

void CRenderD3DWnd::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	CRenderWnd::OnRButtonDown(nFlags, point);
}

void CRenderD3DWnd::OnRButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	CRenderWnd::OnRButtonUp(nFlags, point);
}

void CRenderD3DWnd::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	
	CRenderWnd::OnSysKeyDown(nChar, nRepCnt, nFlags);
}

void CRenderD3DWnd::OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	
	CRenderWnd::OnSysKeyUp(nChar, nRepCnt, nFlags);
}

/////////////////////////////////////////////////////////////////////////////
// CRenderD3DWnd private implementation 

HRESULT CRenderD3DWnd::InitD3D()
{
	D3DDISPLAYMODE DisplayMode;
	UINT i;
	IDirect3D8 *pEnum = Direct3DCreate8(D3D_SDK_VERSION);

	m_bValid = false;
    if (pEnum == NULL)
	{
		assert(0);
        return E_FAIL;
	}

    HRESULT hr;
 
	m_devType = theApp.GetDeviceType();
	
	// Use current display mode
	if(FAILED(pEnum->GetAdapterDisplayMode(D3DADAPTER_DEFAULT , &DisplayMode)))
	{
		MessageBox("Could not get adapter display mode!", "ERROR", MB_OK);
		return E_FAIL;
	}

	m_colorBufferFormat = DisplayMode.Format;
    
	m_devType = theApp.GetDeviceType();
    memset(&m_d3dpp, 0, sizeof(m_d3dpp));
    m_d3dpp.Windowed = TRUE;
    m_d3dpp.BackBufferFormat = m_colorBufferFormat;
    m_d3dpp.MultiSampleType = m_MultiSampleType;
    m_d3dpp.EnableAutoDepthStencil = TRUE;

    D3DFORMAT s_ZS16[] = 
    { 
        D3DFMT_D16_LOCKABLE,
        D3DFMT_D16,
        D3DFMT_D15S1,
        D3DFMT_D32,
        D3DFMT_D24S8,
        D3DFMT_D24X4S4,
        D3DFMT_D24X8
    };

    D3DFORMAT s_ZS32[] = 
    { 
        D3DFMT_D32,
        D3DFMT_D24S8,
        D3DFMT_D24X4S4,
        D3DFMT_D24X8,
        D3DFMT_D16_LOCKABLE,
        D3DFMT_D16,
        D3DFMT_D15S1
    };

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -