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

📄 graphics.cpp

📁 一个自己写的游戏引擎,用DirectX 写成
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		{ -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 + -