?? core_graphics.cpp
字號:
if((m_Graphics = Graphics) == NULL)
return FALSE;
if(Graphics->GetDeviceCOM() == NULL)
return FALSE;
if(Filename == NULL)
return FALSE;
if(FAILED(D3DXCreateTextureFromFileEx(Graphics->GetDeviceCOM(),
Filename, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT,
0, Format, D3DPOOL_MANAGED,
D3DX_FILTER_TRIANGLE, D3DX_FILTER_TRIANGLE,
Transparent, NULL, NULL, &m_Texture)))
return FALSE;
m_Width = GetWidth();
m_Height = GetHeight();
return TRUE;
}
BOOL cTexture::Create(cGraphics *Graphics, IDirect3DTexture8 *Texture)
{
D3DLOCKED_RECT SrcRect, DestRect;
D3DSURFACE_DESC Desc;
Free();
if((m_Graphics = Graphics) == NULL)
return FALSE;
if(Texture == NULL)
return TRUE;
// Copy texture over
Texture->GetLevelDesc(0, &Desc);
m_Width = Desc.Width;
m_Height = Desc.Height;
m_Graphics->GetDeviceCOM()->CreateTexture(m_Width, m_Height, 0, 0, Desc.Format, D3DPOOL_MANAGED, &m_Texture);
Texture->LockRect(0, &SrcRect, NULL, D3DLOCK_READONLY);
m_Texture->LockRect(0, &DestRect, NULL, 0);
memcpy(DestRect.pBits, SrcRect.pBits, SrcRect.Pitch * m_Height);
m_Texture->UnlockRect(0);
Texture->UnlockRect(0);
return TRUE;
}
BOOL cTexture::Free()
{
ReleaseCOM(m_Texture);
m_Graphics = NULL;
m_Width = m_Height = 0;
return TRUE;
}
BOOL cTexture::IsLoaded()
{
if(m_Texture == NULL)
return FALSE;
return TRUE;
}
IDirect3DTexture8 *cTexture::GetTextureCOM()
{
return m_Texture;
}
long cTexture::GetWidth()
{
D3DSURFACE_DESC d3dsd;
if(m_Texture == NULL)
return 0;
if(FAILED(m_Texture->GetLevelDesc(0, &d3dsd)))
return 0;
return d3dsd.Width;
}
long cTexture::GetHeight()
{
D3DSURFACE_DESC d3dsd;
if(m_Texture == NULL)
return 0;
if(FAILED(m_Texture->GetLevelDesc(0, &d3dsd)))
return 0;
return d3dsd.Height;
}
D3DFORMAT cTexture::GetFormat()
{
D3DSURFACE_DESC d3dsd;
if(m_Texture == NULL)
return D3DFMT_UNKNOWN;
if(FAILED(m_Texture->GetLevelDesc(0, &d3dsd)))
return D3DFMT_UNKNOWN;
return d3dsd.Format;
}
BOOL cTexture::Blit(long DestX, long DestY, \
long SrcX, long SrcY, \
long Width, long Height, \
float XScale, float YScale, \
D3DCOLOR Color)
{
RECT Rect;
ID3DXSprite *pSprite;
if(m_Texture == NULL)
return FALSE;
if(m_Graphics == NULL)
return FALSE;
if((pSprite = m_Graphics->GetSpriteCOM()) == NULL)
return FALSE;
if(!Width)
Width = m_Width;
if(!Height)
Height = m_Height;
Rect.left = SrcX;
Rect.top = SrcY;
Rect.right = Rect.left + Width;
Rect.bottom = Rect.top + Height;
if(FAILED(pSprite->Draw(m_Texture, \
&Rect, &D3DXVECTOR2(XScale, YScale), \
NULL, 0.0f, \
&D3DXVECTOR2((float)DestX, (float)DestY), \
Color)))
return FALSE;
return TRUE;
}
cMaterial::cMaterial()
{
// Set a default material (white)
ZeroMemory(&m_Material, sizeof(D3DMATERIAL8));
SetDiffuseColor(255,255,255);
SetAmbientColor(255,255,255);
SetSpecularColor(255,255,255);
SetEmissiveColor(0,0,0);
SetPower(1.0f);
}
BOOL cMaterial::SetDiffuseColor(char Red, char Green, char Blue)
{
m_Material.Diffuse.r = 1.0f / 255.0f * (float)Red;
m_Material.Diffuse.g = 1.0f / 255.0f * (float)Green;
m_Material.Diffuse.b = 1.0f / 255.0f * (float)Blue;
return TRUE;
}
BOOL cMaterial::GetDiffuseColor(char *Red, char *Green, char *Blue)
{
if(Red != NULL)
*Red = (char)(255.0f * m_Material.Diffuse.r);
if(Green != NULL)
*Green = (char)(255.0f * m_Material.Diffuse.g);
if(Blue != NULL)
*Blue = (char)(255.0f * m_Material.Diffuse.b);
return TRUE;
}
BOOL cMaterial::SetAmbientColor(char Red, char Green, char Blue)
{
m_Material.Ambient.r = 1.0f / 255.0f * (float)Red;
m_Material.Ambient.g = 1.0f / 255.0f * (float)Green;
m_Material.Ambient.b = 1.0f / 255.0f * (float)Blue;
return TRUE;
}
BOOL cMaterial::GetAmbientColor(char *Red, char *Green, char *Blue)
{
if(Red != NULL)
*Red = (char)(255.0f * m_Material.Ambient.r);
if(Green != NULL)
*Green = (char)(255.0f * m_Material.Ambient.g);
if(Blue != NULL)
*Blue = (char)(255.0f * m_Material.Ambient.b);
return TRUE;
}
BOOL cMaterial::SetSpecularColor(char Red, char Green, char Blue)
{
m_Material.Specular.r = 1.0f / 255.0f * (float)Red;
m_Material.Specular.g = 1.0f / 255.0f * (float)Green;
m_Material.Specular.b = 1.0f / 255.0f * (float)Blue;
return TRUE;
}
BOOL cMaterial::GetSpecularColor(char *Red, char *Green, char *Blue)
{
if(Red != NULL)
*Red = (char)(255.0f * m_Material.Specular.r);
if(Green != NULL)
*Green = (char)(255.0f * m_Material.Specular.g);
if(Blue != NULL)
*Blue = (char)(255.0f * m_Material.Specular.b);
return TRUE;
}
BOOL cMaterial::SetEmissiveColor(char Red, char Green, char Blue)
{
m_Material.Emissive.r = 1.0f / 255.0f * (float)Red;
m_Material.Emissive.g = 1.0f / 255.0f * (float)Green;
m_Material.Emissive.b = 1.0f / 255.0f * (float)Blue;
return TRUE;
}
BOOL cMaterial::GetEmissiveColor(char *Red, char *Green, char *Blue)
{
if(Red != NULL)
*Red = (char)(255.0f * m_Material.Emissive.r);
if(Green != NULL)
*Green = (char)(255.0f * m_Material.Emissive.g);
if(Blue != NULL)
*Blue = (char)(255.0f * m_Material.Emissive.b);
return TRUE;
}
BOOL cMaterial::SetPower(float Power)
{
m_Material.Power = Power;
return TRUE;
}
float cMaterial::GetPower(float Power)
{
return m_Material.Power;
}
D3DMATERIAL8 *cMaterial::GetMaterial()
{
return &m_Material;
}
cLight::cLight()
{
// Set a default light to point
ZeroMemory(&m_Light, sizeof(D3DLIGHT8));
SetType(D3DLIGHT_POINT);
Move(0.0f, 0.0f, 0.0f);
SetDiffuseColor(255,255,255);
SetAmbientColor(255,255,255);
SetRange(1000.0f);
}
BOOL cLight::SetType(D3DLIGHTTYPE Type)
{
m_Light.Type = Type;
return TRUE;
}
BOOL cLight::Move(float XPos, float YPos, float ZPos)
{
m_Light.Position.x = XPos;
m_Light.Position.y = YPos;
m_Light.Position.z = ZPos;
return TRUE;
}
BOOL cLight::MoveRel(float XPos, float YPos, float ZPos)
{
m_Light.Position.x += XPos;
m_Light.Position.y += YPos;
m_Light.Position.z += ZPos;
return TRUE;
}
BOOL cLight::GetPos(float *XPos, float *YPos, float *ZPos)
{
if(XPos != NULL)
*XPos = m_Light.Position.x;
if(YPos != NULL)
*YPos = m_Light.Position.y;
if(ZPos != NULL)
*ZPos = m_Light.Position.z;
return TRUE;
}
BOOL cLight::Point(float XFrom, float YFrom, float ZFrom,
float XAt, float YAt, float ZAt)
{
D3DXVECTOR3 vecSrc;
D3DXVECTOR3 vecDest;
// Move the light
Move(XFrom, YFrom, ZFrom);
// Calculate vector between angles
m_Light.Direction.x = XAt - XFrom;
m_Light.Direction.y = YAt - YFrom;
m_Light.Direction.z = ZAt - ZFrom;
return TRUE;
}
BOOL cLight::GetDirection(float *XDir, float *YDir, float *ZDir)
{
if(XDir != NULL)
*XDir = m_Light.Direction.x;
if(YDir != NULL)
*YDir = m_Light.Direction.y;
if(ZDir != NULL)
*ZDir = m_Light.Direction.z;
return TRUE;
}
BOOL cLight::SetDiffuseColor(char Red, char Green, char Blue)
{
m_Light.Diffuse.r = 1.0f / 255.0f * (float)Red;
m_Light.Diffuse.g = 1.0f / 255.0f * (float)Green;
m_Light.Diffuse.b = 1.0f / 255.0f * (float)Blue;
return TRUE;
}
BOOL cLight::GetDiffuseColor(char *Red, char *Green, char *Blue)
{
if(Red != NULL)
*Red = (char)(255.0f * m_Light.Diffuse.r);
if(Green != NULL)
*Green = (char)(255.0f * m_Light.Diffuse.g);
if(Blue != NULL)
*Blue = (char)(255.0f * m_Light.Diffuse.b);
return TRUE;
}
BOOL cLight::SetSpecularColor(char Red, char Green, char Blue)
{
m_Light.Specular.r = 1.0f / 255.0f * (float)Red;
m_Light.Specular.g = 1.0f / 255.0f * (float)Green;
m_Light.Specular.b = 1.0f / 255.0f * (float)Blue;
return TRUE;
}
BOOL cLight::GetSpecularColor(char *Red, char *Green, char *Blue)
{
if(Red != NULL)
*Red = (char)(255.0f * m_Light.Specular.r);
if(Green != NULL)
*Green = (char)(255.0f * m_Light.Specular.g);
if(Blue != NULL)
*Blue = (char)(255.0f * m_Light.Specular.b);
return TRUE;
}
BOOL cLight::SetAmbientColor(char Red, char Green, char Blue)
{
m_Light.Ambient.r = 1.0f / 255.0f * (float)Red;
m_Light.Ambient.g = 1.0f / 255.0f * (float)Green;
m_Light.Ambient.b = 1.0f / 255.0f * (float)Blue;
return TRUE;
}
BOOL cLight::GetAmbientColor(char *Red, char *Green, char *Blue)
{
if(Red != NULL)
*Red = (char)(255.0f * m_Light.Ambient.r);
if(Green != NULL)
*Green = (char)(255.0f * m_Light.Ambient.g);
if(Blue != NULL)
*Blue = (char)(255.0f * m_Light.Ambient.b);
return TRUE;
}
BOOL cLight::SetRange(float Range)
{
m_Light.Range = Range;
return TRUE;
}
float cLight::GetRange()
{
return m_Light.Range;
}
BOOL cLight::SetFalloff(float Falloff)
{
m_Light.Falloff = Falloff;
return TRUE;
}
float cLight::GetFalloff()
{
return m_Light.Falloff;
}
BOOL cLight::SetAttenuation0(float Attenuation)
{
m_Light.Attenuation0 = Attenuation;
return TRUE;
}
float cLight::GetAttenuation0()
{
return m_Light.Attenuation0;
}
BOOL cLight::SetAttenuation1(float Attenuation)
{
m_Light.Attenuation1 = Attenuation;
return TRUE;
}
float cLight::GetAttenuation1()
{
return m_Light.Attenuation1;
}
BOOL cLight::SetAttenuation2(float Attenuation)
{
m_Light.Attenuation2 = Attenuation;
return TRUE;
}
float cLight::GetAttenuation2()
{
return m_Light.Attenuation2;
}
BOOL cLight::SetTheta(float Theta)
{
m_Light.Theta = Theta;
return TRUE;
}
float cLight::GetTheta()
{
return m_Light.Theta;
}
BOOL cLight::SetPhi(float Phi)
{
m_Light.Phi = Phi;
return TRUE;
}
float cLight::GetPhi()
{
return m_Light.Phi;
}
D3DLIGHT8 *cLight::GetLight()
{
return &m_Light;
}
cVertexBuffer::cVertexBuffer()
{
m_Graphics = NULL;
m_pVB = NULL;
m_NumVertices = 0;
m_FVF = 0;
m_Locked = FALSE;
m_Ptr = NULL;
}
cVertexBuffer::~cVertexBuffer()
{
Free();
}
IDirect3DVertexBuffer8 *cVertexBuffer::GetVertexBufferCOM()
{
return m_pVB;
}
unsigned long cVertexBuffer::GetVertexSize()
{
return D3DXGetFVFVertexSize(m_FVF);
}
unsigned long cVertexBuffer::GetVertexFVF()
{
return m_FVF;
}
unsigned long cVertexBuffer::GetNumVertices()
{
return m_NumVertices;
}
BOOL cVertexBuffer::Create(cGraphics *Graphics, unsigned long NumVertices, DWORD Descriptor, long VertexSize)
{
Free();
if((m_Graphics = Graphics) == NULL)
return FALSE;
if(m_Graphics->GetDeviceCOM() == NULL)
return FALSE;
if(!(m_NumVertices = NumVertices) || !(m_FVF = Descriptor) || !(m_VertexSize = VertexSize))
return FALSE;
if(FAILED(m_Graphics->GetDeviceCOM()->CreateVertexBuffer(
m_NumVertices * m_VertexSize,
0, m_FVF,
D3DPOOL_DEFAULT, &m_pVB)))
return FALSE;
return TRUE;
}
BOOL cVertexBuffer::Free()
{
Unlock();
ReleaseCOM(m_pVB);
m_Graphics = NULL;
m_NumVertices = 0;
m_FVF = 0;
m_Locked = FALSE;
m_Ptr = NULL;
return TRUE;
}
BOOL cVertexBuffer::Set(unsigned long FirstVertex, unsigned long NumVertices, void *VertexList)
{
if(m_Graphic
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -