d3dfuncs.cpp

来自「一個遊戲教程」· C++ 代码 · 共 167 行

CPP
167
字号
#include "d3dfuncs.h"

//create the IDirect3D7 interface
LPDIRECT3D7 LPD3D_Create(LPDIRECTDRAW7 lpdd)
{
	LPDIRECT3D7 lpd3d;
	//get the idirect3d pointer
	lpdd->QueryInterface(IID_IDirect3D7,(void**)&lpd3d);//ICKY COM STUFF!
	//return the pointer
	return(lpd3d);
}

//clean up an IDirect3D7
void LPD3D_Release(LPDIRECT3D7* lpd3d)
{
	//safe release
	if(*lpd3d)
	{
		(*lpd3d)->Release();
		(*lpd3d)=NULL;
	}
}

//create the Device
LPDIRECT3DDEVICE7 LPD3DDEV_Create(LPDIRECT3D7 lpd3d,LPDIRECTDRAWSURFACE7 lpdds)
{
	LPDIRECT3DDEVICE7 lpd3ddev;
	//create the idirect3ddevice(hack method)
	if(FAILED(lpd3d->CreateDevice(IID_IDirect3DTnLHalDevice,lpdds,&lpd3ddev)))//try tnl
		if(FAILED(lpd3d->CreateDevice(IID_IDirect3DHALDevice,lpdds,&lpd3ddev)))//no tnl, try hal
			if(FAILED(lpd3d->CreateDevice(IID_IDirect3DMMXDevice,lpdds,&lpd3ddev)))//no hal, try mmp
				if(FAILED(lpd3d->CreateDevice(IID_IDirect3DRGBDevice,lpdds,&lpd3ddev)))//no mmx, resort to rgb
					lpd3ddev=NULL;
	//return the pointer
	return(lpd3ddev);
}

//set up the viewport
void LPD3DDEV_SetViewport(LPDIRECT3DDEVICE7 lpd3ddev,DWORD x,DWORD y,DWORD width,DWORD height)
{
	//set up the view port
	D3DVIEWPORT7 vp;
	vp.dwX=x;
	vp.dwY=y;
	vp.dwWidth=width;
	vp.dwHeight=height;
	vp.dvMinZ=0.0;
	vp.dvMaxZ=1.0;
	//set the viewport for the device
	lpd3ddev->SetViewport(&vp);
}

//clear out the viewport
void LPD3DDEV_Clear(LPDIRECT3DDEVICE7 lpd3ddev,D3DCOLOR color)
{
	//clear out the device
	lpd3ddev->Clear(0,NULL,D3DCLEAR_TARGET,color,0,0);
}


//draw triangle list
void LPD3DDEV_DrawTriangleList(LPDIRECT3DDEVICE7 lpd3ddev,D3DTLVERTEX* pvertices,DWORD dwvertexcount)
{
	//draw the triangle list
	lpd3ddev->DrawPrimitive(D3DPT_TRIANGLELIST,D3DFVF_TLVERTEX,pvertices,dwvertexcount,0);
}

//draw triangle strip
void LPD3DDEV_DrawTriangleStrip(LPDIRECT3DDEVICE7 lpd3ddev,D3DTLVERTEX* pvertices,DWORD dwvertexcount)
{
	//draw the triangle strip
	lpd3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP,D3DFVF_TLVERTEX,pvertices,dwvertexcount,0);
}

//clean up a device
void LPD3DDEV_Release(LPDIRECT3DDEVICE7* lpd3ddev)
{
	//safe release
	if(*lpd3ddev)
	{
		(*lpd3ddev)->Release();
		(*lpd3ddev)=NULL;
	}
}

//primary surface as a 3d rendering target
LPDIRECTDRAWSURFACE7 LPDDS_CreatePrimary3D(LPDIRECTDRAW7 lpdd,DWORD dwBackBufferCount)
{
	LPDIRECTDRAWSURFACE7 lpdds;
	//create primary surface
	DDSURFACEDESC2 ddsd;
	memset(&ddsd,0,sizeof(DDSURFACEDESC2));
	ddsd.dwSize=sizeof(DDSURFACEDESC2);
	ddsd.dwFlags=DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
	ddsd.dwBackBufferCount=dwBackBufferCount;
	ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_3DDEVICE;
	lpdd->CreateSurface(&ddsd,&lpdds,NULL);
	//return the surface pointer
	return(lpdds);
}

//back buffer as a 3d rendering target
LPDIRECTDRAWSURFACE7 LPDDS_GetSecondary3D(LPDIRECTDRAWSURFACE7 lpdds)
{
	LPDIRECTDRAWSURFACE7 lpddsBack;
	//create back buffer
	DDSCAPS2 ddscaps;
	memset(&ddscaps,0,sizeof(DDSCAPS2));
	ddscaps.dwCaps=DDSCAPS_BACKBUFFER | DDSCAPS_3DDEVICE;
	lpdds->GetAttachedSurface(&ddscaps,&lpddsBack);
	//return the new surface
	return(lpddsBack);
}

//create a texture
LPDIRECTDRAWSURFACE7 LPDDS_CreateTexture(LPDIRECTDRAW7 lpdd,DWORD dwWidth,DWORD dwHeight)
{
	LPDIRECTDRAWSURFACE7 lpdds;
	//create texture surface
	DDSURFACEDESC2 ddsd;
	memset(&ddsd,0,sizeof(DDSURFACEDESC2));
	ddsd.dwSize=sizeof(DDSURFACEDESC2);
	ddsd.dwFlags=DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
	ddsd.dwWidth=dwWidth;
	ddsd.dwHeight=dwHeight;
	ddsd.ddsCaps.dwCaps=DDSCAPS_TEXTURE;
	lpdd->CreateSurface(&ddsd,&lpdds,NULL);
	//return the surface pointer
	return(lpdds);
}

//create a texture with a particular pixel format
LPDIRECTDRAWSURFACE7 LPDDS_CreateTexturePixelFormat(LPDIRECTDRAW7 lpdd,DWORD dwWidth,DWORD dwHeight,LPDDPIXELFORMAT lpddpf)
{
	LPDIRECTDRAWSURFACE7 lpdds;
	//create texture surface
	DDSURFACEDESC2 ddsd;
	memset(&ddsd,0,sizeof(DDSURFACEDESC2));
	ddsd.dwSize=sizeof(DDSURFACEDESC2);
	ddsd.dwFlags=DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
	ddsd.dwWidth=dwWidth;
	ddsd.dwHeight=dwHeight;
	ddsd.ddsCaps.dwCaps=DDSCAPS_TEXTURE;
	memcpy(&ddsd.ddpfPixelFormat,lpddpf,sizeof(DDPIXELFORMAT));
	lpdd->CreateSurface(&ddsd,&lpdds,NULL);
	//return the surface pointer
	return(lpdds);
}

//set vertex data
void VERTEX_Set(D3DTLVERTEX* pVert,D3DVALUE x,D3DVALUE y, D3DCOLOR color, D3DVALUE tu, D3DVALUE tv)
{
	//xyz
	pVert->sx=x;
	pVert->sy=y;
	pVert->sz=0.5;
	//rhw
	pVert->rhw=1.0;
	//color
	pVert->color=color;
	//specular
	pVert->specular=0;
	//texture coords
	pVert->tu=tu;
	pVert->tv=tv;
}

⌨️ 快捷键说明

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