📄 graphics.cpp
字号:
//--------------------------------------------------
// 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 + -