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

📄 graphics.cpp

📁 骨骼动画....把魔兽模型解出的代码..
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//+-----------------------------------------------------------------------------
//| Included files
//+-----------------------------------------------------------------------------
#include "Graphics.h"
#include "MainWindow.h"


//+-----------------------------------------------------------------------------
//| Global objects
//+-----------------------------------------------------------------------------
GRAPHICS Graphics;


//+-----------------------------------------------------------------------------
//| Constructor
//+-----------------------------------------------------------------------------
GRAPHICS::GRAPHICS()
{
	CurrentGraphicsWindow = NULL;

	Direct3D = NULL;
	Direct3DDevice = NULL;
	LineVertexBuffer = NULL;
	ParticleVertexBuffer = NULL;
	GroundVertexBuffer = NULL;

	Material.Ambient = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
	Material.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
	Material.Specular = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
	Material.Emissive = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f);
	Material.Power = 8.0f;

	Light.Type = D3DLIGHT_DIRECTIONAL;
	Light.Ambient = D3DXCOLOR(0.0f, 0.0f, 0.0f, 0.0f);
	Light.Diffuse = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f);
	Light.Specular = D3DXCOLOR(0.0f, 0.0f, 0.0f, 0.0f);
	Light.Position = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
	Light.Direction = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
	Light.Range = 0.0f;
	Light.Falloff = 0.0f;
	Light.Attenuation0 = 0.0f;
	Light.Attenuation1 = 0.0f;
	Light.Attenuation2 = 0.0f;
	Light.Theta = 0.0f;
	Light.Phi = 0.0f;

	Sprite = NULL;

	D3DXMatrixIdentity(&ProjectionMatrix);
	D3DXMatrixIdentity(&ViewMatrix);
	D3DXMatrixIdentity(&WorldMatrix);
	D3DXMatrixIdentity(&BillboardMatrix);
	D3DXMatrixIdentity(&WorldViewProjectionMatrix);

	CameraPosition = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
	CameraDirection = D3DXVECTOR3(0.0f, 0.0f, 0.0f);

	ScreenWidth = 0;
	ScreenHeight = 0;
	ScreenAspect = 0.0f;
	FieldOfView = GRAPHICS_DEFAULT_FIELD_OF_VIEW;
	NearDistance = GRAPHICS_DEFAULT_NEAR_DISTANCE;
	FarDistance = GRAPHICS_DEFAULT_FAR_DISTANCE;

	Initialized = FALSE;
	DeviceLost = FALSE;
	UseShading = TRUE;
	UseCulling = TRUE;
}


//+-----------------------------------------------------------------------------
//| Destructor
//+-----------------------------------------------------------------------------
GRAPHICS::~GRAPHICS()
{
	Shutdown();
}


//+-----------------------------------------------------------------------------
//| Returns the Direct3D device pointer
//+-----------------------------------------------------------------------------
LPDIRECT3DDEVICE9 GRAPHICS::GetDevice() CONST
{
	return Direct3DDevice;
}


//+-----------------------------------------------------------------------------
//| Returns the graphics info pointer
//+-----------------------------------------------------------------------------
GRAPHICS_INFO* GRAPHICS::GetGraphicsInfo()
{
	return &GraphicsInfo;
}


//+-----------------------------------------------------------------------------
//| Returns the texture format
//+-----------------------------------------------------------------------------
D3DFORMAT GRAPHICS::GetTextureFormat() CONST
{
	return GraphicsInfo.TextureFormat;
}


//+-----------------------------------------------------------------------------
//| Returns the billboard matrix
//+-----------------------------------------------------------------------------
CONST D3DXMATRIX& GRAPHICS::GetBillboardMatrix() CONST
{
	return BillboardMatrix;
}


//+-----------------------------------------------------------------------------
//| Sets up the shaders
//+-----------------------------------------------------------------------------
BOOL GRAPHICS::SetupShaders()
{
	if(!Properties.ShadersAvailable()) return TRUE;

	if(!VertexShader.Setup(PATH_VERTEX_SHADER)) return FALSE;;
	if(!PixelShaderShaded.Setup(PATH_PIXEL_SHADER_SHADED)) return FALSE;
	if(!PixelShaderUnshaded.Setup(PATH_PIXEL_SHADER_UNSHADED)) return FALSE;

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Shuts down the shaders
//+-----------------------------------------------------------------------------
VOID GRAPHICS::ShutdownShaders()
{
	PixelShaderUnshaded.Shutdown();
	PixelShaderShaded.Shutdown();
	VertexShader.Shutdown();
}


//+-----------------------------------------------------------------------------
//| Enables or disables shading
//+-----------------------------------------------------------------------------
VOID GRAPHICS::SetShading(BOOL Shading)
{
	UseShading = Shading;
}


//+-----------------------------------------------------------------------------
//| Enables or disables backface culling
//+-----------------------------------------------------------------------------
VOID GRAPHICS::SetCulling(BOOL Culling)
{
	UseCulling = Culling;
}


//+-----------------------------------------------------------------------------
//| Sets the world camera
//+-----------------------------------------------------------------------------
VOID GRAPHICS::SetCamera(CONST CAMERA& Camera)
{
	SetCamera(Camera.GetSource(), Camera.GetTarget(), Camera.GetUp());
}


//+-----------------------------------------------------------------------------
//| Sets the world camera
//+-----------------------------------------------------------------------------
VOID GRAPHICS::SetCamera(CONST D3DXVECTOR3& Source, CONST D3DXVECTOR3& Target, CONST D3DXVECTOR3& Up)
{
	D3DXMatrixLookAtRH(&ViewMatrix, &Source, &Target, &Up);
	Direct3DDevice->SetTransform(D3DTS_VIEW, &ViewMatrix);
	D3DXMatrixTranspose(&BillboardMatrix, &ViewMatrix);

	BillboardMatrix._14 = 0.0f;
	BillboardMatrix._24 = 0.0f;
	BillboardMatrix._34 = 0.0f;
	BillboardMatrix._41 = 0.0f;
	BillboardMatrix._42 = 0.0f;
	BillboardMatrix._43 = 0.0f;

	CameraPosition = Source;
	CameraDirection = Target - Source;
	D3DXVec3Normalize(&CameraDirection, &CameraDirection);

	Light.Direction = CameraDirection;
}


//+-----------------------------------------------------------------------------
//| Sets a new field of view
//+-----------------------------------------------------------------------------
VOID GRAPHICS::SetFieldOfView(FLOAT NewFieldOfView)
{
	FieldOfView = NewFieldOfView;
}


//+-----------------------------------------------------------------------------
//| Sets a new clipping plane
//+-----------------------------------------------------------------------------
VOID GRAPHICS::SetClippingPlane(FLOAT NewNearDistance, FLOAT NewFarDistance)
{
	NearDistance = NewNearDistance;
	FarDistance = NewFarDistance;
}


//+-----------------------------------------------------------------------------
//| Sets up the graphics
//+-----------------------------------------------------------------------------
BOOL GRAPHICS::Setup()
{
	Shutdown();

	if(!CreateDummyWindow()) return FALSE;
	if(!CreateDirect3D()) return FALSE;
	if(!CheckCapabilities()) return FALSE;
	if(!CreateDirect3DDevice()) return FALSE;
	if(!CreateObjects()) return FALSE;

	SetRenderStates();
	SetProjection();

	GraphicsWindowReferenceObject.SetData(this);

	Initialized = TRUE;

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Shuts down the graphics
//+-----------------------------------------------------------------------------
VOID GRAPHICS::Shutdown()
{
	OnShutdown();

	SAFE_RELEASE(Sprite);

	SAFE_RELEASE(GroundVertexBuffer);
	SAFE_RELEASE(ParticleVertexBuffer);
	SAFE_RELEASE(LineVertexBuffer);
	SAFE_RELEASE(Direct3DDevice);
	SAFE_RELEASE(Direct3D);
	SAFE_DESTROY(Window);

	D3DXMatrixIdentity(&ProjectionMatrix);
	D3DXMatrixIdentity(&ViewMatrix);
	D3DXMatrixIdentity(&WorldMatrix);
	D3DXMatrixIdentity(&BillboardMatrix);

	ScreenWidth = 0;
	ScreenHeight = 0;
	ScreenAspect = 0.0f;
	FieldOfView = GRAPHICS_DEFAULT_FIELD_OF_VIEW;
	NearDistance = GRAPHICS_DEFAULT_NEAR_DISTANCE;
	FarDistance = GRAPHICS_DEFAULT_FAR_DISTANCE;

	Initialized = FALSE;
	DeviceLost = FALSE;
}


//+-----------------------------------------------------------------------------
//| Checks for a lost state
//+-----------------------------------------------------------------------------
BOOL GRAPHICS::CheckLostState()
{
	HRESULT Result;
	GRAPHICS_INFO TempGraphicsInfo;

	if(FAILED(Result = Direct3DDevice->TestCooperativeLevel()))
	{
		if(!DeviceLost) OnLostDevice();

		DeviceLost = TRUE;

		if(Result == D3DERR_DEVICELOST)
		{
			Error.SetMessage("The Direct3D device was lost!");
			return FALSE;
		}

		TempGraphicsInfo = GraphicsInfo;
		if(FAILED(Direct3DDevice->Reset(&TempGraphicsInfo.DeviceInfo)))
		{
			Error.SetMessage("Unable to reset the Direct3D device!");
			return FALSE;
		}

		SetRenderStates();
		OnResetDevice();

		Error.ClearMessage();

		DeviceLost = FALSE;
	}

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Begins rendering
//+-----------------------------------------------------------------------------
BOOL GRAPHICS::BeginRender(GRAPHICS_WINDOW& GraphicsWindow)
{
	LPDIRECT3DSWAPCHAIN9 SwapChain;

	if(!Initialized)
	{
		Error.SetMessage("The Direct3D device is not initialized!");
		return FALSE;
	}

	if(!CheckLostState()) return FALSE;

	CurrentGraphicsWindow = &GraphicsWindow;

	SwapChain = CurrentGraphicsWindow->GetSwapChain();
	if(SwapChain == NULL)
	{
		Error.SetMessage("Unable to retrieve the swap chain from the graphics window!");
		return FALSE;
	}

	if(FAILED(Direct3DDevice->SetRenderTarget(0, CurrentGraphicsWindow->GetBackBuffer())))
	{
		Error.SetMessage("Unable to set the swap chain back buffer as a render target!");
		return FALSE;
	}

	if(FAILED(Direct3DDevice->SetDepthStencilSurface(CurrentGraphicsWindow->GetZBuffer())))
	{
		Error.SetMessage("XXXXXXXXXXXX!");
		return FALSE;
	}

	ScreenWidth = CurrentGraphicsWindow->GetWidth();
	ScreenHeight = CurrentGraphicsWindow->GetHeight();
	ScreenAspect = CurrentGraphicsWindow->GetScreenAspect();

	SetProjection();

	Direct3DDevice->Clear(0, NULL, D3DCLEAR_ZBUFFER, 0, 1.0f, 0);

⌨️ 快捷键说明

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