comparison 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
comparison
equal deleted inserted replaced
20:4e9b5299ffdc 21:b4dc5d674e22
4 4
5 #include "GuiButton.h" 5 #include "GuiButton.h"
6 #include "VertexTypes.h" 6 #include "VertexTypes.h"
7 7
8 /* 8 /*
9 * EventClick
10 */
11 const char* GuiButton::EventClick = "GuiButton:Click";
12
13 /*
9 * GuiButton 14 * GuiButton
10 */ 15 */
11 GuiButton::GuiButton() 16 GuiButton::GuiButton() : nState(GuiButtonState_Normal), pEffect(NULL), pVertexBuffer(NULL)
12 { 17 {
18 memset(pTexture, 0, sizeof(pTexture));
13 } 19 }
14 20
15 /* 21 /*
16 * Initialize 22 * Initialize
17 */ 23 */
18 ErrorCode GuiButton::Initialize(ResourceManager* pResourceManager) 24 ErrorCode GuiButton::Initialize(ResourceManager* pManager)
19 { 25 {
20 ErrorCode eCode = pResourceManager->CreateEffectFromFile("Data\\Shaders\\TexturedQuad.fx", &pEffect); 26 ErrorCode eCode = pManager->CreateEffectFromFile("Data\\Shaders\\TexturedQuad.fx", &pEffect);
21 if(eCode == Error_Success) 27 if(eCode == Error_Success)
22 { 28 {
23 eCode = pResourceManager->CreateVertexBuffer(6 * sizeof(Vertex::Quad), D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED, &pVertexBuffer); 29 eCode = pManager->CreateVertexBuffer(6 * sizeof(Vertex::Quad), D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED, &pVertexBuffer);
24 if(eCode == Error_Success) 30 if(eCode == Error_Success)
25 { 31 {
26 eCode = SetupVertexBuffer(); 32 eCode = SetupVertexBuffer();
33 if(eCode == Error_Success)
34 {
35 pResourceManager = pManager;
36 }
27 } 37 }
28 } 38 }
29 39
30 return eCode; 40 return eCode;
31 } 41 }
69 */ 79 */
70 void GuiButton::Render(RenderContext& kContext, Camera& kCamera) 80 void GuiButton::Render(RenderContext& kContext, Camera& kCamera)
71 { 81 {
72 if(pTexture[nState]) 82 if(pTexture[nState])
73 { 83 {
84 uint32 nPasses = 0;
85
86 const float fOffsetX = -0.5f * ScreenSizeX;
87 const float fOffsetY = +0.5f * ScreenSizeY;
88
74 const D3DXVECTOR4 kColorVector(1.0f, 1.0f, 1.0f, 1.0f); 89 const D3DXVECTOR4 kColorVector(1.0f, 1.0f, 1.0f, 1.0f);
75 90
76 D3DSURFACE_DESC kDescriptor; 91 kContext.ApplyCameraToEffect(kCamera, pEffect);
77 pTexture[nState]->GetLevelDesc(0, &kDescriptor);
78
79 const float fX = ScreenSizeX - (float)kDescriptor.Width;
80 const float fY = 0.0f;
81 92
82 D3DXMATRIX kScale; 93 D3DXMATRIX kScale;
83 D3DXMatrixScaling(&kScale, (float)kDescriptor.Width, (float)kDescriptor.Height, 1.0f); 94 D3DXMatrixScaling(&kScale, kDimensions.x, kDimensions.y, 1.0f);
84 95
85 D3DXMATRIX kTranslate; 96 D3DXMATRIX kTranslate;
86 //D3DXMatrixTranslation(&kTranslate, -0.5f * ScreenSizeX + fX + 0.5f, 0.5f * ScreenSizeY - fY + 0.5f, 0.0f); 97 D3DXMatrixTranslation(&kTranslate, fOffsetX + kPosition.x + 0.5f, fOffsetY - kPosition.y + 0.5f, 0.0f);
87 //D3DXMatrixTranslation(
88 98
89 D3DXMATRIX kWorldMatrix; 99 D3DXMATRIX kWorldMatrix;
90 D3DXMatrixMultiply(&kWorldMatrix, &kScale, &kTranslate); 100 D3DXMatrixMultiply(&kWorldMatrix, &kScale, &kTranslate);
91 101
92 pEffect->SetMatrix(pEffect->GetParameterByName(NULL, "kWorld"), &kWorldMatrix); 102 pEffect->SetMatrix(pEffect->GetParameterByName(NULL, "kWorld"), &kWorldMatrix);
93 pEffect->SetVector(pEffect->GetParameterByName(NULL, "kColor"), &kColorVector); 103 pEffect->SetVector(pEffect->GetParameterByName(NULL, "kColor"), &kColorVector);
94 pEffect->SetTexture(pEffect->GetParameterByName(NULL, "kTexture"), pTexture[nState]); 104 pEffect->SetTexture(pEffect->GetParameterByName(NULL, "kTexture"), pTexture[nState]);
95 pEffect->CommitChanges(); 105
106 pEffect->SetTechnique(pEffect->GetTechnique(0));
107 pEffect->Begin(&nPasses, 0);
108 pEffect->BeginPass(0);
96 109
97 kContext.DrawTriangles(Vertex::Quad::Declaration, pVertexBuffer, sizeof(Vertex::Quad), TrianglesPerFace); 110 kContext.DrawTriangles(Vertex::Quad::Declaration, pVertexBuffer, sizeof(Vertex::Quad), TrianglesPerFace);
111
112 pEffect->EndPass();
113 pEffect->End();
98 } 114 }
115 }
116
117 /*
118 * SetTexture
119 */
120 ErrorCode GuiButton::SetTexture(uint32 nState, const char* pName, bool bResize)
121 {
122 ErrorCode eCode = Error_Fail;
123
124 if(nState < GuiButtonState_Count)
125 {
126 if(pTexture[nState])
127 {
128 pTexture[nState]->Release();
129 pTexture[nState] = NULL;
130 }
131
132 eCode = pResourceManager->CreateTextureFromFile(pName, &pTexture[nState]);
133 if(eCode == Error_Success)
134 {
135 if(bResize)
136 {
137 D3DSURFACE_DESC kDescriptor;
138 pTexture[nState]->GetLevelDesc(0, &kDescriptor);
139
140 kDimensions.x = (float)kDescriptor.Width;
141 kDimensions.y = (float)kDescriptor.Height;
142 }
143 }
144 }
145
146 return eCode;
147 }
148
149 /*
150 * OnMouseDown
151 */
152 void GuiButton::OnMouseDown(uint32 nButton, float fX, float fY)
153 {
154 GuiEventArguments kArguments;
155 kArguments.pSource = this;
156
157 Fire(EventClick, kArguments);
158 }
159
160 /*
161 * OnMouseUp
162 */
163 void GuiButton::OnMouseUp(uint32 nButton, float fX, float fY)
164 {
99 } 165 }
100 166
101 /* 167 /*
102 * SetupVertexBuffer 168 * SetupVertexBuffer
103 */ 169 */
109 if(FAILED(hResult)) 175 if(FAILED(hResult))
110 { 176 {
111 return Error_Fail; 177 return Error_Fail;
112 } 178 }
113 179
114 pVertices[0] = Vertex::Quad(+0.0f, -1.0f, 1.0f, 0.0f, 1.0f); 180 pVertices[0] = Vertex::Quad(+0.0f, -1.0f, 1.0f, 0.0f, 1.0f);
115 pVertices[1] = Vertex::Quad(+0.0f, +0.0f, 1.0f, 0.0f, 0.0f); 181 pVertices[1] = Vertex::Quad(+0.0f, +0.0f, 1.0f, 0.0f, 0.0f);
116 pVertices[2] = Vertex::Quad(+1.0f, +0.0f, 1.0f, 1.0f, 0.0f); 182 pVertices[2] = Vertex::Quad(+1.0f, +0.0f, 1.0f, 1.0f, 0.0f);
117 pVertices[3] = Vertex::Quad(+0.0f, -1.0f, 1.0f, 0.0f, 1.0f); 183 pVertices[3] = Vertex::Quad(+0.0f, -1.0f, 1.0f, 0.0f, 1.0f);
118 pVertices[4] = Vertex::Quad(+1.0f, +0.0f, 1.0f, 1.0f, 0.0f); 184 pVertices[4] = Vertex::Quad(+1.0f, +0.0f, 1.0f, 1.0f, 0.0f);
119 pVertices[5] = Vertex::Quad(+1.0f, -1.0f, 1.0f, 1.0f, 1.0f); 185 pVertices[5] = Vertex::Quad(+1.0f, -1.0f, 1.0f, 1.0f, 1.0f);
120 186
121 pVertexBuffer->Unlock(); 187 pVertexBuffer->Unlock();
122 188
123 return Error_Success; 189 return Error_Success;
124 } 190 }