?? graphics.cpp
字號:
//+-----------------------------------------------------------------------------
//| 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);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -