Mercurial > LightClone
view LightClone/Source/GuiButton.cpp @ 37:58a16d529d95
Refactoring code and adding events for drag and drop
author | koryspansel <koryspansel@bendbroadband.com> |
---|---|
date | Wed, 21 Sep 2011 20:30:29 -0700 |
parents | 7f5feeb3f604 |
children | 7ff46a00bcd3 |
line wrap: on
line source
/* * GuiButton */ #include "GuiButton.h" #include "GuiInterface.h" #include "VertexTypes.h" /* * EventClick */ const char* GuiButton::EventClick = "GuiButton:Click"; /* * GuiButton */ GuiButton::GuiButton() : nState(GuiButtonState_Normal), pEffect(NULL), pVertexBuffer(NULL), pFont(NULL) { SetFlag(GuiElementFlag_Pickable); memset(pTexture, 0, sizeof(pTexture)); } /* * Initialize */ ErrorCode GuiButton::Initialize(ResourceManager* pManager) { ErrorCode eCode = pManager->CreateEffectFromFile("Data\\Shaders\\TexturedQuad.fx", &pEffect); if(eCode == Error_Success) { eCode = pManager->CreateVertexBuffer(6 * sizeof(Vertex::Quad), D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED, &pVertexBuffer); if(eCode == Error_Success) { eCode = SetupVertexBuffer(); if(eCode == Error_Success) { pResourceManager = pManager; } } } return eCode; } /* * Terminate */ void GuiButton::Terminate() { if(pVertexBuffer) { pVertexBuffer->Release(); pVertexBuffer = NULL; } } /* * Update */ void GuiButton::Update(float fElapsed) { } /* * Render */ void GuiButton::Render(RenderContext& kContext, Camera& kCamera) { if(nFlags & GuiElementFlag_Visible) { 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); kContext.ApplyCameraToEffect(kCamera, pEffect); D3DXMATRIX kScale; D3DXMatrixScaling(&kScale, kDimensions.x, kDimensions.y, 1.0f); const D3DXVECTOR2& kLocation = GetPosition(); D3DXMATRIX kTranslate; D3DXMatrixTranslation(&kTranslate, fOffsetX + kLocation.x + 0.5f, fOffsetY - kLocation.y + 0.5f, 0.0f); D3DXMATRIX kWorldMatrix; D3DXMatrixMultiply(&kWorldMatrix, &kScale, &kTranslate); pEffect->SetMatrix(pEffect->GetParameterByName(NULL, "kWorld"), &kWorldMatrix); pEffect->SetVector(pEffect->GetParameterByName(NULL, "kColor"), &kColorVector); pEffect->SetTexture(pEffect->GetParameterByName(NULL, "kTexture"), pTexture[nState]); 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(); if(pFont && kText.Length() > 0) { int32 nOffsetX = 0; int32 nOffsetY = 0; if(nState == GuiButtonState_Down) { nOffsetX += 1; nOffsetY += 2; } const int32 nX = (int32)(kLocation.x + 0.5f * kDimensions.x + 1) + nOffsetX; const int32 nY = (int32)(kLocation.y + 0.5f * kDimensions.y + 0) + nOffsetY; RECT kRectangle; kRectangle.left = nX; kRectangle.top = nY; kRectangle.right = nX; kRectangle.bottom = nY; const uint32 nLength = kText.Length(); pFont->DrawTextA(NULL, kText, nLength, &kRectangle, DT_CENTER | DT_VCENTER | DT_CALCRECT, kColor); pFont->DrawTextA(NULL, kText, nLength, &kRectangle, DT_CENTER | DT_VCENTER, kColor); } } GuiElement::Render(kContext, kCamera); } } /* * SetTexture */ ErrorCode GuiButton::SetTexture(uint32 nState, const char* pName, bool bResize) { ErrorCode eCode = Error_Fail; if(nState < GuiButtonState_Count) { 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; } /* * SetFont */ ErrorCode GuiButton::SetFont(const char* pName, uint32 nSize, uint32 nWeight) { pFont = NULL; return pResourceManager->CreateFontFromName(pName, nSize, nWeight, &pFont); } /* * SetText */ void GuiButton::SetText(const char* pText) { kText = pText; } /* * OnMouseEnter */ void GuiButton::OnMouseEnter() { } /* * OnMouseLeave */ void GuiButton::OnMouseLeave() { if(!pInterface->IsCursorAcquiredBy(this)) { nState = GuiButtonState_Normal; } } /* * OnMouseDown */ void GuiButton::OnMouseDown(uint32 nButton, float fX, float fY) { pInterface->AcquireCursor(this); nState = GuiButtonState_Down; } /* * OnMouseUp */ void GuiButton::OnMouseUp(uint32 nButton, float fX, float fY) { if(pInterface->IsCursorAcquiredBy(this)) { pInterface->ReleaseCursor(); if(Contains(fX, fY)) { nState = GuiButtonState_Hover; GuiEventArguments kArguments(this); Fire(EventClick, kArguments); } else { nState = GuiButtonState_Normal; } } } /* * OnMouseMove */ void GuiButton::OnMouseMove(float fX, float fY) { if(pInterface->IsCursorAcquiredBy(this)) { if(Contains(fX, fY)) { nState = GuiButtonState_Down; } else { nState = GuiButtonState_Hover; } } else { //NOTE: If we're not capturing the mouse we only get mouse // move events when the cursor is inside the button bounds nState = GuiButtonState_Hover; } } /* * SetupVertexBuffer */ ErrorCode GuiButton::SetupVertexBuffer() { Vertex::Quad* pVertices = NULL; HRESULT hResult = pVertexBuffer->Lock(0, 0, (void**)&pVertices, D3DLOCK_DISCARD); if(FAILED(hResult)) { 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); pVertexBuffer->Unlock(); return Error_Success; }