Mercurial > LightClone
diff LightClone/Source/GuiButton.cpp @ 21:b4dc5d674e22
Added GUI event system and some support data structures
author | koryspansel |
---|---|
date | Thu, 15 Sep 2011 18:42:12 -0700 |
parents | 33cb6979ac51 |
children | a785b0aaf004 |
line wrap: on
line diff
--- a/LightClone/Source/GuiButton.cpp Thu Sep 15 13:28:10 2011 -0700 +++ b/LightClone/Source/GuiButton.cpp Thu Sep 15 18:42:12 2011 -0700 @@ -6,24 +6,34 @@ #include "VertexTypes.h" /* + * EventClick + */ +const char* GuiButton::EventClick = "GuiButton:Click"; + +/* * GuiButton */ -GuiButton::GuiButton() +GuiButton::GuiButton() : nState(GuiButtonState_Normal), pEffect(NULL), pVertexBuffer(NULL) { + memset(pTexture, 0, sizeof(pTexture)); } /* * Initialize */ -ErrorCode GuiButton::Initialize(ResourceManager* pResourceManager) +ErrorCode GuiButton::Initialize(ResourceManager* pManager) { - ErrorCode eCode = pResourceManager->CreateEffectFromFile("Data\\Shaders\\TexturedQuad.fx", &pEffect); + ErrorCode eCode = pManager->CreateEffectFromFile("Data\\Shaders\\TexturedQuad.fx", &pEffect); if(eCode == Error_Success) { - eCode = pResourceManager->CreateVertexBuffer(6 * sizeof(Vertex::Quad), D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED, &pVertexBuffer); + eCode = pManager->CreateVertexBuffer(6 * sizeof(Vertex::Quad), D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED, &pVertexBuffer); if(eCode == Error_Success) { eCode = SetupVertexBuffer(); + if(eCode == Error_Success) + { + pResourceManager = pManager; + } } } @@ -71,20 +81,20 @@ { if(pTexture[nState]) { + uint32 nPasses = 0; + + const float fOffsetX = -0.5f * ScreenSizeX; + const float fOffsetY = +0.5f * ScreenSizeY; + const D3DXVECTOR4 kColorVector(1.0f, 1.0f, 1.0f, 1.0f); - D3DSURFACE_DESC kDescriptor; - pTexture[nState]->GetLevelDesc(0, &kDescriptor); - - const float fX = ScreenSizeX - (float)kDescriptor.Width; - const float fY = 0.0f; + kContext.ApplyCameraToEffect(kCamera, pEffect); D3DXMATRIX kScale; - D3DXMatrixScaling(&kScale, (float)kDescriptor.Width, (float)kDescriptor.Height, 1.0f); + D3DXMatrixScaling(&kScale, kDimensions.x, kDimensions.y, 1.0f); D3DXMATRIX kTranslate; - //D3DXMatrixTranslation(&kTranslate, -0.5f * ScreenSizeX + fX + 0.5f, 0.5f * ScreenSizeY - fY + 0.5f, 0.0f); - //D3DXMatrixTranslation( + D3DXMatrixTranslation(&kTranslate, fOffsetX + kPosition.x + 0.5f, fOffsetY - kPosition.y + 0.5f, 0.0f); D3DXMATRIX kWorldMatrix; D3DXMatrixMultiply(&kWorldMatrix, &kScale, &kTranslate); @@ -92,13 +102,69 @@ pEffect->SetMatrix(pEffect->GetParameterByName(NULL, "kWorld"), &kWorldMatrix); pEffect->SetVector(pEffect->GetParameterByName(NULL, "kColor"), &kColorVector); pEffect->SetTexture(pEffect->GetParameterByName(NULL, "kTexture"), pTexture[nState]); - pEffect->CommitChanges(); + + pEffect->SetTechnique(pEffect->GetTechnique(0)); + pEffect->Begin(&nPasses, 0); + pEffect->BeginPass(0); kContext.DrawTriangles(Vertex::Quad::Declaration, pVertexBuffer, sizeof(Vertex::Quad), TrianglesPerFace); + + pEffect->EndPass(); + pEffect->End(); } } /* + * SetTexture + */ +ErrorCode GuiButton::SetTexture(uint32 nState, const char* pName, bool bResize) +{ + ErrorCode eCode = Error_Fail; + + if(nState < GuiButtonState_Count) + { + if(pTexture[nState]) + { + pTexture[nState]->Release(); + pTexture[nState] = NULL; + } + + eCode = pResourceManager->CreateTextureFromFile(pName, &pTexture[nState]); + if(eCode == Error_Success) + { + if(bResize) + { + D3DSURFACE_DESC kDescriptor; + pTexture[nState]->GetLevelDesc(0, &kDescriptor); + + kDimensions.x = (float)kDescriptor.Width; + kDimensions.y = (float)kDescriptor.Height; + } + } + } + + return eCode; +} + +/* + * OnMouseDown + */ +void GuiButton::OnMouseDown(uint32 nButton, float fX, float fY) +{ + GuiEventArguments kArguments; + kArguments.pSource = this; + + Fire(EventClick, kArguments); +} + +/* + * OnMouseUp + */ +void GuiButton::OnMouseUp(uint32 nButton, float fX, float fY) +{ +} + +/* * SetupVertexBuffer */ ErrorCode GuiButton::SetupVertexBuffer() @@ -111,12 +177,12 @@ return Error_Fail; } - pVertices[0] = Vertex::Quad(+0.0f, -1.0f, 1.0f, 0.0f, 1.0f); - pVertices[1] = Vertex::Quad(+0.0f, +0.0f, 1.0f, 0.0f, 0.0f); - pVertices[2] = Vertex::Quad(+1.0f, +0.0f, 1.0f, 1.0f, 0.0f); - pVertices[3] = Vertex::Quad(+0.0f, -1.0f, 1.0f, 0.0f, 1.0f); - pVertices[4] = Vertex::Quad(+1.0f, +0.0f, 1.0f, 1.0f, 0.0f); - pVertices[5] = Vertex::Quad(+1.0f, -1.0f, 1.0f, 1.0f, 1.0f); + pVertices[0] = Vertex::Quad(+0.0f, -1.0f, 1.0f, 0.0f, 1.0f); + pVertices[1] = Vertex::Quad(+0.0f, +0.0f, 1.0f, 0.0f, 0.0f); + pVertices[2] = Vertex::Quad(+1.0f, +0.0f, 1.0f, 1.0f, 0.0f); + pVertices[3] = Vertex::Quad(+0.0f, -1.0f, 1.0f, 0.0f, 1.0f); + pVertices[4] = Vertex::Quad(+1.0f, +0.0f, 1.0f, 1.0f, 0.0f); + pVertices[5] = Vertex::Quad(+1.0f, -1.0f, 1.0f, 1.0f, 1.0f); pVertexBuffer->Unlock();