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

📄 graphics.cpp

📁 一个自己写的游戏引擎,用DirectX 写成
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//--------------------------------------------------
//  Desc: 绘图核心类
//  Author: artsylee/2006.10.29
//  添加: 发送设置丢失的消息(2007_4_19)
//        全屏抗锯齿(2007_4_19)
//		  写信息到Log(2007_4_19)
//--------------------------------------------------

#include "../stdafx.h"
#include "Graphics.h"
#include "Log.h"
#include "Common.h"
#include "TextureManager.h"
#include "FrameManager.h"
#include "Message.h"
#include "Application.h"
/*
LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL;
*/
extern bool g_bMultiSample;

struct CustomVertex
{
	float	x, y, z;
//	float	nx, ny, nz;
	DWORD	color;
	float	tx, ty;
};

//#define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1)
#define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)


CGraphics::CGraphics()
{
	m_pD3D = NULL;
	m_pD3DDevice = NULL;
	m_pD3DParam = NULL;
	m_pSprite = NULL;
	m_pFont = NULL;

	m_ScreenDepth = 32;
	m_BackGroundColor = 0xff000000;

	m_pTextureManager = NULL;
	m_pFrameManager = NULL;
	m_bZBuffer = false;

	g_pGraphics = this;
}

CGraphics::~CGraphics()
{
	if(m_pSprite)
	{
		m_pSprite->Release();
		m_pSprite = NULL;
	}
	if(m_pFont)
	{
		m_pFont->Release();
		m_pFont = NULL;
	}
	if(m_pD3DDevice)
	{
		m_pD3DDevice->Release();
		m_pD3DDevice = NULL;
		g_pD3DDevice = NULL;
	}
	if(m_pD3D)
	{
		m_pD3D->Release();
		m_pD3D = NULL;
	}
	delete m_pTextureManager;
	m_pTextureManager = NULL;
	g_pTextureManager = NULL;
	delete m_pFrameManager;
	m_pFrameManager = NULL;
	g_pFrameManager = NULL;

	g_pGraphics = NULL;
}

bool CGraphics::InitGraphics(HWND hWnd, int width, int height, bool bWindowed, int colordepth)
{
	m_hWnd = hWnd;
	m_ScreenWidth = width;
	m_ScreenHeight = height;
	m_ScreenDepth = colordepth;
	m_bWindowed = bWindowed;

	WriteLog(INFO_NORMAL, "Initiating Graphics...");
	m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
	if(m_pD3D == NULL)
	{
		WriteLog(INFO_ERROR, "Can't create D3D interface");
		return false;
	}

	D3DADAPTER_IDENTIFIER9 AdID;
	m_pD3D->GetAdapterIdentifier(D3DADAPTER_DEFAULT, 0, &AdID);

	D3DDISPLAYMODE DisplayMode;
	if(FAILED(m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &DisplayMode))) 
	{
		WriteLog(INFO_ERROR, "Can't determine desktop video mode");
		if(bWindowed) return false;
	}

	UINT nModes = 0;
	UINT i = 0;
	D3DFORMAT Formatfs = D3DFMT_UNKNOWN;
	if(m_ScreenDepth==32)
	{
		nModes = m_pD3D->GetAdapterModeCount(D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8);
		for(UINT i=0; i<nModes; i++) 
		{
			m_pD3D->EnumAdapterModes(D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8, i, &DisplayMode);
			if(DisplayMode.Width != (UINT)m_ScreenWidth || DisplayMode.Height != (UINT)m_ScreenHeight) 
				continue;
			Formatfs = DisplayMode.Format;
			break;
		}
	}
	else
	{
		D3DFORMAT tempFormat = D3DFMT_R5G6B5;
		nModes = m_pD3D->GetAdapterModeCount(D3DADAPTER_DEFAULT, D3DFMT_R5G6B5);
		if(!nModes)
		{
			nModes = m_pD3D->GetAdapterModeCount(D3DADAPTER_DEFAULT, D3DFMT_X1R5G5B5);
			tempFormat = D3DFMT_X1R5G5B5;
		}
		for(UINT i=0; i<nModes; i++) 
		{
			m_pD3D->EnumAdapterModes(D3DADAPTER_DEFAULT, tempFormat, i, &DisplayMode);
			if(DisplayMode.Width != (UINT)m_ScreenWidth || DisplayMode.Height != (UINT)m_ScreenHeight) 
				continue;
			Formatfs = DisplayMode.Format;
			break;
		}
	}

	if(Formatfs == D3DFMT_UNKNOWN)
	{
		WriteLog(INFO_ERROR, "Can't find appropriate full screen video mode");
		if(!bWindowed) return false;
	}

	ZeroMemory(&m_D3DParamW, sizeof(m_D3DParamW));

	m_D3DParamW.BackBufferWidth  = m_ScreenWidth;
	m_D3DParamW.BackBufferHeight = m_ScreenHeight;
	m_D3DParamW.BackBufferFormat = DisplayMode.Format;
	m_D3DParamW.BackBufferCount  = 1;
	m_D3DParamW.MultiSampleType  = D3DMULTISAMPLE_4_SAMPLES;
	m_D3DParamW.hDeviceWindow    = hWnd;
	m_D3DParamW.Windowed         = TRUE;
	m_D3DParamW.SwapEffect		 = D3DSWAPEFFECT_DISCARD;
	m_D3DParamW.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

	//if(nHGEFPS==HGEFPS_VSYNC) m_D3DParamW.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC;
	//else					  m_D3DParamW.SwapEffect = D3DSWAPEFFECT_COPY;

	if(m_bZBuffer)
	{
		m_D3DParamW.EnableAutoDepthStencil = TRUE;
		m_D3DParamW.AutoDepthStencilFormat = D3DFMT_D16;
	}

	ZeroMemory(&m_D3DParamFS, sizeof(m_D3DParamFS));

	m_D3DParamFS.BackBufferWidth  = m_ScreenWidth;
	m_D3DParamFS.BackBufferHeight = m_ScreenHeight;
	m_D3DParamFS.BackBufferFormat = Formatfs;
	m_D3DParamFS.BackBufferCount  = 1;
	m_D3DParamFS.MultiSampleType  = D3DMULTISAMPLE_4_SAMPLES;
	m_D3DParamFS.hDeviceWindow    = hWnd;
	m_D3DParamFS.Windowed         = FALSE;

	m_D3DParamFS.SwapEffect       = D3DSWAPEFFECT_DISCARD;
	m_D3DParamFS.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
	m_D3DParamFS.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

	if(m_bZBuffer)
	{
		m_D3DParamFS.EnableAutoDepthStencil = TRUE;
		m_D3DParamFS.AutoDepthStencilFormat = D3DFMT_D16;
	}

	// MultiSample
	if(SUCCEEDED(m_pD3D->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT, 
		D3DDEVTYPE_HAL , DisplayMode.Format, TRUE,
		D3DMULTISAMPLE_4_SAMPLES, NULL)))
	{
		WriteLog(INFO_NORMAL, "Supported Full_windowed MultiSampling 4X: TRUE");
	}
	else
	{
		m_D3DParamW.MultiSampleType  = D3DMULTISAMPLE_NONE;
		WriteLog(INFO_NORMAL, "Supported Full_windowed MultiSampling 4X: FALSE");
	}

	if(SUCCEEDED(m_pD3D->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT, 
		D3DDEVTYPE_HAL , Formatfs, FALSE,
		D3DMULTISAMPLE_4_SAMPLES, NULL)))
	{
		g_bMultiSample = true;
		WriteLog(INFO_NORMAL, "Supported Full_scene MultiSampling 4X: TRUE");
	}
	else
	{
		g_bMultiSample = false;
		m_D3DParamFS.MultiSampleType  = D3DMULTISAMPLE_NONE;
		WriteLog(INFO_NORMAL, "Supported Full_scene MultiSampling 4X: FALSE");
	}

	if(bWindowed) m_pD3DParam = &m_D3DParamW;
	else m_pD3DParam = &m_D3DParamFS;

	ZeroMemory(&m_D3DCaps, sizeof(m_D3DCaps));
	if(FAILED(m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &m_D3DCaps)))
	{
		WriteLog(INFO_ERROR, "GetDeviceCaps fail!");
		return false;
	}

	HRESULT	hr;
	if(m_D3DCaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
	{    
		//Create device with hardware vertex processing
		hr = m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
			D3DCREATE_HARDWARE_VERTEXPROCESSING, m_pD3DParam, &m_pD3DDevice);        
	}
	else
	{
		//Create device with software vertex processing
		hr = m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
			D3DCREATE_SOFTWARE_VERTEXPROCESSING, m_pD3DParam, &m_pD3DDevice);
	}

	if(FAILED(hr))
	{
		WriteLog(INFO_ERROR, "Can't create Direct3D device.");
		return false;
	}
	g_pD3DDevice = m_pD3DDevice;
	m_pTextureManager = new CTextureManager;
	if(m_pTextureManager==NULL)
	{
		WriteLog(INFO_ERROR, "Can't Create Texture Manager.");
		return false;
	}
	g_pTextureManager = m_pTextureManager;
	m_pFrameManager = new CFrameManager;
	if(m_pFrameManager==NULL)
	{
		WriteLog(INFO_ERROR, "Can't Create Frame Manager.");
		return false;
	}
	g_pFrameManager = m_pFrameManager;
	// LOG width, height, screendepth
	WriteLog(INFO_NORMAL, "Graphics Width(%d), Height(%d), Color(%d)", m_ScreenWidth, m_ScreenHeight, m_ScreenDepth);
	WriteLog(INFO_NORMAL, "Initiate Graphics Successful.");

	hr = D3DXCreateSprite(m_pD3DDevice, &m_pSprite);
	if(FAILED(hr))
	{
		WriteLog(INFO_ERROR, "Can't create D3DXSprite.");
		return false;
	}
	HFONT hFont = CreateFont(12, 0, 0, 0, FW_NORMAL, 
		FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, 
		CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, NULL);
	hr = D3DXCreateFont(m_pD3DDevice, hFont, &m_pFont);
	
	if(FAILED(hr))
	{
		WriteLog(INFO_ERROR, "Can't create D3DXFont.");
		return false;
	}
	DeleteObject(hFont);

	InitDevice();	

	//-------------------------------------------------------------------
	// 初始化VertexBuffer
	//-------------------------------------------------------------------
	/*
	CustomVertex Vertices[] =
	{
		{ -10.0f,-10.0f, -10.0f, 0xffffffff, 0, 1 }, // 1
		{ -10.0f, 10.0f, -10.0f, 0xffffffff, 0, 0 }, // 2

		{  10.0f,-10.0f, -10.0f, 0xffffffff, 1, 1 }, // 3
		{  10.0f, 10.0f, -10.0f, 0xffffffff, 1, 0 }, // 4

		{  10.0f,-10.0f,  10.0f, 0xffffffff, 0, 1 }, // 5
		{  10.0f, 10.0f,  10.0f, 0xffffffff, 0, 0 }, // 6

		{ -10.0f,-10.0f,  10.0f, 0xffffffff, 1, 1 }, // 7
		{ -10.0f, 10.0f,  10.0f, 0xffffffff, 1, 0 }, // 8

		{ -10.0f,-10.0f, -10.0f, 0xffffffff, 0, 1 }, // 1
		{ -10.0f, 10.0f, -10.0f, 0xffffffff, 0, 0 }, // 2

		{  10.0f, 10.0f, -10.0f, 0xffffffff, 1, 0 }, // 4
		{ -10.0f, 10.0f,  10.0f, 0xffffffff, 1, 0 }, // 8

		{  10.0f, 10.0f,  10.0f, 0xffffffff, 0, 0 }, // 6
		{  10.0f,-10.0f,  10.0f, 0xffffffff, 0, 1 }, // 5

		{  10.0f,-10.0f, -10.0f, 0xffffffff, 1, 1 }, // 3
		{ -10.0f,-10.0f,  10.0f, 0xffffffff, 1, 1 }, // 7
		{ -10.0f,-10.0f, -10.0f, 0xffffffff, 0, 1 }, // 1
		*/
		// STRIP 124 356
		/*
		{ -1.0f,-1.0f, -1.0f, -1.0f,-1.0f, -1.0f, 0xffffffff, 0, 1 }, // 1
		{ -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 0xffffffff, 0, 0 }, // 2

		{  1.0f,-1.0f, -1.0f,  1.0f,-1.0f, -1.0f, 0xffffffff, 1, 1 }, // 3
		{  1.0f, 1.0f, -1.0f,  1.0f, 1.0f, -1.0f, 0xffffffff, 1, 0 }, // 4
		
		{  1.0f,-1.0f,  1.0f,  1.0f,-1.0f,  1.0f, 0xffffffff, 0, 1 }, // 5
		{  1.0f, 1.0f,  1.0f,  1.0f, 1.0f,  1.0f, 0xffffffff, 0, 0 }, // 6

		{ -1.0f,-1.0f,  1.0f, -1.0f,-1.0f,  1.0f, 0xffffffff, 1, 1 }, // 7
		{ -1.0f, 1.0f,  1.0f, -1.0f, 1.0f,  1.0f, 0xffffffff, 1, 0 }, // 8

		{ -1.0f,-1.0f, -1.0f, -1.0f,-1.0f, -1.0f, 0xffffffff, 0, 1 }, // 1
		{ -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 0xffffffff, 0, 0 }, // 2

		{  1.0f, 1.0f, -1.0f,  1.0f, 1.0f, -1.0f, 0xffffffff, 1, 0 }, // 4
		{ -1.0f, 1.0f,  1.0f, -1.0f, 1.0f,  1.0f, 0xffffffff, 1, 0 }, // 8

		{  1.0f, 1.0f,  1.0f,  1.0f, 1.0f,  1.0f, 0xffffffff, 0, 0 }, // 6
		{  1.0f,-1.0f,  1.0f,  1.0f,-1.0f,  1.0f, 0xffffffff, 0, 1 }, // 5

		{  1.0f,-1.0f, -1.0f,  1.0f,-1.0f, -1.0f, 0xffffffff, 1, 1 }, // 3

⌨️ 快捷键说明

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