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();