📄 graphics.cpp
字号:
{ -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, 0, 1 }, // 1
*/
// LIST
//
/*
{ -1.0f,-1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0xffffffff, 0, 1 }, // 1
{ -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0xffffffff, 0, 0 }, // 2
{ 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0xffffffff, 1, 0 }, // 4
{ 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0xffffffff, 1, 0 }, // 4
{ 1.0f,-1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0xffffffff, 1, 1 }, // 3
{ -1.0f,-1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0xffffffff, 0, 1 }, // 1
//
{ 1.0f,-1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0xffffffff, 1, 1 }, // 3
{ 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0xffffffff, 1, 0 }, // 4
{ 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0xffffffff, 0, 0 }, // 6
{ 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0xffffffff, 0, 0 }, // 6
{ 1.0f,-1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0xffffffff, 0, 1 }, // 5
{ 1.0f,-1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0xffffffff, 1, 1 }, // 3
//
{ 1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0xffffffff, 0, 1 }, // 5
{ 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0xffffffff, 0, 0 }, // 6
{ -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0xffffffff, 1, 0 }, // 8
{ -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0xffffffff, 1, 0 }, // 8
{ -1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0xffffffff, 1, 1 }, // 7
{ 1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0xffffffff, 0, 1 }, // 5
//
{ -1.0f,-1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0xffffffff, 1, 1 }, // 7
{ -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0xffffffff, 1, 0 }, // 8
{ -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0xffffffff, 0, 0 }, // 2
{ -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0xffffffff, 0, 0 }, // 2
{ -1.0f,-1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0xffffffff, 0, 1 }, // 1
{ -1.0f,-1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0xffffffff, 1, 1 }, // 7
//
{ -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0xffffffff, 0, 0 }, // 2
{ -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0xffffffff, 1, 0 }, // 8
{ 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0xffffffff, 0, 0 }, // 6
{ 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0xffffffff, 0, 0 }, // 6
{ 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0xffffffff, 1, 0 }, // 4
{ -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0xffffffff, 0, 0 }, // 2
//
{ 1.0f,-1.0f, -1.0f, 0.0f,-1.0f, 0.0f, 0xffffffff, 1, 1 }, // 3
{ 1.0f,-1.0f, 1.0f, 0.0f,-1.0f, 0.0f, 0xffffffff, 0, 1 }, // 5
{ -1.0f,-1.0f, 1.0f, 0.0f,-1.0f, 0.0f, 0xffffffff, 1, 1 }, // 7
{ -1.0f,-1.0f, 1.0f, 0.0f,-1.0f, 0.0f, 0xffffffff, 1, 1 }, // 7
{ -1.0f,-1.0f, -1.0f, 0.0f,-1.0f, 0.0f, 0xffffffff, 0, 1 }, // 1
{ 1.0f,-1.0f, -1.0f, 0.0f,-1.0f, 0.0f, 0xffffffff, 1, 1 }, // 3
}; */
// cube box
/*
8
/-----------/|6
2/___________/ |
| 4 | |
| | |
| 7 3 | |5
1|___________|/
*/
// Create the vertex buffer.
/*
if(FAILED(m_pD3DDevice->CreateVertexBuffer(72*sizeof(CustomVertex), 0, CUSTOMFVF,
D3DPOOL_MANAGED, &g_pVB, NULL)))
{
return false;
}
// Fill the vertex buffer.
VOID* pVertices;
if(FAILED(g_pVB->Lock(0, sizeof(Vertices), (void**)&pVertices, 0)))
return false;
memcpy(pVertices, Vertices, sizeof(Vertices));
g_pVB->Unlock();
*/
//-------------------------------------------------------------------
//-------------------------------------------------------------------
return true;
}
void CGraphics::Render3DObject()
{
//---------------------------------------------------
// 世界坐标
D3DXMATRIXA16 matWorld;
D3DXMatrixIdentity(&matWorld);
m_pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld);
//---------------------------------------------------
//---------------------------------------------------
// 设置透视投影
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/3, (float)(800)/600, 0.5f, 100000.0f);
m_pD3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);
//---------------------------------------------------
//---------------------------------------------------
// 设置视口
D3DVIEWPORT9 vp = { 0, 0, 800, 600, 0.0f, 1.0f };
m_pD3DDevice->SetViewport(&vp);
//---------------------------------------------------
// m_pD3DDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true);
// m_pD3DDevice->SetStreamSource(0, g_pVB, 0, sizeof(CustomVertex));
// m_pD3DDevice->SetFVF(CUSTOMFVF);
// m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 15);
// m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 12);
}
void CGraphics::InitDevice(void)
{
m_pD3DDevice->SetFVF(CUSTOMFVF);
// m_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
m_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
if(m_bZBuffer)
{
m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
}
// Alpha Blend
m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
m_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
m_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
// Alpha Test
/*
if(m_D3DCaps.AlphaCmpCaps & D3DPCMPCAPS_GREATEREQUAL)
{
m_pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
m_pD3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
m_pD3DDevice->SetRenderState(D3DRS_ALPHAREF, 0x01);
}
*/
m_pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
m_pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
m_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
m_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
m_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
m_pD3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_pD3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
//---------------------------------------------------
// 2D正交投影矩阵
//---------------------------------------------------
D3DXMATRIX tmp;
D3DXMatrixScaling(&m_MatProj, 1.0f, -1.0f, 1.0f);
D3DXMatrixTranslation(&tmp, -0.5f, m_ScreenHeight+0.5f, 0.0f);
D3DXMatrixMultiply(&m_MatProj, &m_MatProj, &tmp);
D3DXMatrixOrthoOffCenterLH(&tmp, 0, (float)m_ScreenWidth, 0,
(float)m_ScreenHeight, 0.0f, 1000.0f);
D3DXMatrixMultiply(&m_MatProj, &m_MatProj, &tmp);
D3DXMatrixIdentity(&m_MatView);
m_pD3DDevice->SetTransform(D3DTS_VIEW, &m_MatView);
m_pD3DDevice->SetTransform(D3DTS_PROJECTION, &m_MatProj);
//---------------------------------------------------
CMessage msg(MSG_SYS_LOSTDEVICE);
PostMessage(msg);
}
void CGraphics::ToggleScreen(void)
{
OnLostDevice();
m_bWindowed = !m_bWindowed;
if(m_bWindowed) m_pD3DParam = &m_D3DParamW;
else m_pD3DParam = &m_D3DParamFS;
OnResetDevice();
if(!m_bWindowed)
{
SetWindowLong(m_hWnd, GWL_STYLE, WS_POPUP);
SetWindowPos(m_hWnd, HWND_TOPMOST,
0,
0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),
SWP_SHOWWINDOW);
}
else
{
int Width= m_ScreenWidth + GetSystemMetrics(SM_CXFIXEDFRAME)*2;
int Height= m_ScreenHeight + GetSystemMetrics(SM_CYFIXEDFRAME)*2 + GetSystemMetrics(SM_CYCAPTION);
SetWindowLong(m_hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME);
SetWindowPos(m_hWnd, HWND_NOTOPMOST,
(GetSystemMetrics(SM_CXSCREEN)-Width)/2,
(GetSystemMetrics(SM_CYSCREEN)-Height)/2,
Width,
Height,
SWP_SHOWWINDOW);
}
g_pGameApp->SetWindowMode(m_bWindowed);
}
void CGraphics::SnapToFile(const char *szFileName)
{
LPDIRECT3DSURFACE9 pBackBuffer = NULL;
m_pD3DDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);
if(pBackBuffer)
{
D3DXSaveSurfaceToFile(szFileName, D3DXIFF_BMP, pBackBuffer, NULL, NULL);
}
pBackBuffer->Release();
}
//---------------------------------------------------
// 关于ID3DXSprite
// 注意ID3DXSprite::Begin会改变Render状态,end时才恢复
// Draw会自动调用begin & end
// 连续调用Draw时(如渲染UI)
// 应先手工调用begin & end
//---------------------------------------------------
void CGraphics::OnLostDevice(void)
{
// D3DPOOL_DEFAULT加载的纹理资源
m_pSprite->OnLostDevice();
m_pFont->OnLostDevice();
}
void CGraphics::OnResetDevice(void)
{
if(FAILED(m_pD3DDevice->Reset(m_pD3DParam)))
{
return;
}
// D3DPOOL_DEFAULT加载的纹理资源
m_pSprite->OnResetDevice();
m_pFont->OnResetDevice();
InitDevice();
}
bool CGraphics::BeginScene(void)
{
if(!m_pD3DDevice)
{
return false;
}
if(m_bZBuffer)
{
m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, m_BackGroundColor, 1.0f, 0);
}
else
{
m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, m_BackGroundColor, 1.0f, 0);
}
if(SUCCEEDED(m_pD3DDevice->BeginScene()))
{
return TRUE;
}
return FALSE;
}
void CGraphics::EndScene(void)
{
if(!m_pD3DDevice)
{
return;
}
m_pD3DDevice->EndScene();
HRESULT hr;
hr = m_pD3DDevice->Present(NULL, NULL, NULL, NULL);
if(hr == D3DERR_DEVICELOST)
{
if(m_pD3DDevice->TestCooperativeLevel() == D3DERR_DEVICENOTRESET)
{
OnLostDevice();
OnResetDevice();
}
}
// UPDATE Texture Manager
m_pTextureManager->Update();
m_pFrameManager->Update();
}
void CGraphics::BeginSprite(void)
{
m_pSprite->Begin();
}
void CGraphics::EndSprite(void)
{
m_pSprite->End();
}
void CGraphics::Render(IDirect3DTexture9 *pTexture, int x, int y, RECT rcSrc, DWORD color)
{
float width = (float)rcSrc.right - rcSrc.left;
float height = (float)rcSrc.bottom - rcSrc.top;
CustomVertex vPoint[4] =
{
{ (float)x, (float)y, 0.0f, color, (float)rcSrc.left/width, (float)rcSrc.top/height },
{ (float)x+width, (float)y, 0.0f, color, (float)rcSrc.right/width, (float)rcSrc.top/height },
{ (float)x, (float)y+height, 0.0f, color, (float)rcSrc.left/width, (float)rcSrc.bottom/height },
{ (float)x+width, (float)y+height, 0.0f, color, (float)rcSrc.right/width, (float)rcSrc.bottom/height }
};
m_pD3DDevice->SetTexture(0, pTexture);
m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, vPoint, sizeof(CustomVertex));
}
void CGraphics::Render(TextureHandle hTex, int x, int y, const RECT *rcSrc, DWORD color)
{
/*
CTexture* pTexture = m_pTextureManager->GetTexture(hTex);
if(!pTexture)
return;
if(pTexture->AutoLoad())
{
RECT SrcRect;
if(rcSrc)
{
SrcRect = *rcSrc;
}
else
{
SrcRect.left = SrcRect.top = 0;
SrcRect.right = pTexture->GetWidth();
SrcRect.bottom = pTexture->GetHeight();
}
float width = (float)pTexture->GetWidth();
float height = (float)pTexture->GetHeight();
float Swidth = (float)(SrcRect.right-SrcRect.left);
float Sheight = (float)(SrcRect.bottom-SrcRect.top);
CustomVertex vPoint[4] =
{
{ (float)x, (float)y, 1.2f, color, (float)SrcRect.left/width, (float)SrcRect.top/height },
{ (float)x+Swidth, (float)y, 1.2f, color, (float)SrcRect.right/width, (float)SrcRect.top/height },
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -