Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/source/gui/GUIRenderer.cpp
Show First 20 Lines • Show All 223 Lines • ▼ Show 20 Lines | for (cit = it->second->m_Images.begin(); cit != it->second->m_Images.end(); ++cit) | ||||
{ | { | ||||
Call.m_HasTexture = false; | Call.m_HasTexture = false; | ||||
// Enable blending if it's transparent (allowing a little error in the calculations) | // Enable blending if it's transparent (allowing a little error in the calculations) | ||||
Call.m_EnableBlending = !(fabs((*cit)->m_BackColor.a - 1.0f) < 0.0000001f); | Call.m_EnableBlending = !(fabs((*cit)->m_BackColor.a - 1.0f) < 0.0000001f); | ||||
} | } | ||||
Call.m_BackColor = &(*cit)->m_BackColor; | Call.m_BackColor = &(*cit)->m_BackColor; | ||||
Call.m_BorderColor = (*cit)->m_Border ? &(*cit)->m_BorderColor : nullptr; | Call.m_BorderColor = (*cit)->m_Border ? &(*cit)->m_BorderColor : nullptr; | ||||
Call.m_DeltaZ = (*cit)->m_DeltaZ; | |||||
if (!Call.m_HasTexture) | if (!Call.m_HasTexture) | ||||
{ | { | ||||
Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_solid); | Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_solid); | ||||
} | } | ||||
else if ((*cit)->m_Effects) | else if ((*cit)->m_Effects) | ||||
{ | { | ||||
if ((*cit)->m_Effects->m_AddColor != CGUIColor()) | if ((*cit)->m_Effects->m_AddColor != CGUIColor()) | ||||
▲ Show 20 Lines • Show All 83 Lines • ▼ Show 20 Lines | CRect SDrawCall::ComputeTexCoords() const | ||||
TexCoords.left /= TexWidth; | TexCoords.left /= TexWidth; | ||||
TexCoords.right /= TexWidth; | TexCoords.right /= TexWidth; | ||||
TexCoords.top /= TexHeight; | TexCoords.top /= TexHeight; | ||||
TexCoords.bottom /= TexHeight; | TexCoords.bottom /= TexHeight; | ||||
return TexCoords; | return TexCoords; | ||||
} | } | ||||
void GUIRenderer::Draw(DrawCalls& Calls, float Z) | void GUIRenderer::Draw(DrawCalls& Calls) | ||||
{ | { | ||||
if (Calls.empty()) | if (Calls.empty()) | ||||
return; | return; | ||||
// Called every frame, to draw the object (based on cached calculations) | // Called every frame, to draw the object (based on cached calculations) | ||||
// TODO: batching by shader/texture/etc would be nice | // TODO: batching by shader/texture/etc would be nice | ||||
Show All 31 Lines | if (cit->m_HasTexture) | ||||
if (Verts.bottom < Verts.top) | if (Verts.bottom < Verts.top) | ||||
{ | { | ||||
std::swap(Verts.bottom, Verts.top); | std::swap(Verts.bottom, Verts.top); | ||||
std::swap(TexCoords.bottom, TexCoords.top); | std::swap(TexCoords.bottom, TexCoords.top); | ||||
} | } | ||||
std::vector<float> data; | std::vector<float> data; | ||||
#define ADD(u, v, x, y, z) STMT(data.push_back(u); data.push_back(v); data.push_back(x); data.push_back(y); data.push_back(z)) | #define ADD(u, v, x, y, z) STMT(data.push_back(u); data.push_back(v); data.push_back(x); data.push_back(y); data.push_back(z)) | ||||
ADD(TexCoords.left, TexCoords.bottom, Verts.left, Verts.bottom, Z + cit->m_DeltaZ); | ADD(TexCoords.left, TexCoords.bottom, Verts.left, Verts.bottom, 0.0f); | ||||
ADD(TexCoords.right, TexCoords.bottom, Verts.right, Verts.bottom, Z + cit->m_DeltaZ); | ADD(TexCoords.right, TexCoords.bottom, Verts.right, Verts.bottom, 0.0f); | ||||
ADD(TexCoords.right, TexCoords.top, Verts.right, Verts.top, Z + cit->m_DeltaZ); | ADD(TexCoords.right, TexCoords.top, Verts.right, Verts.top, 0.0f); | ||||
ADD(TexCoords.right, TexCoords.top, Verts.right, Verts.top, Z + cit->m_DeltaZ); | ADD(TexCoords.right, TexCoords.top, Verts.right, Verts.top, 0.0f); | ||||
ADD(TexCoords.left, TexCoords.top, Verts.left, Verts.top, Z + cit->m_DeltaZ); | ADD(TexCoords.left, TexCoords.top, Verts.left, Verts.top, 0.0f); | ||||
ADD(TexCoords.left, TexCoords.bottom, Verts.left, Verts.bottom, Z + cit->m_DeltaZ); | ADD(TexCoords.left, TexCoords.bottom, Verts.left, Verts.bottom, 0.0f); | ||||
#undef ADD | #undef ADD | ||||
shader->TexCoordPointer(GL_TEXTURE0, 2, GL_FLOAT, 5*sizeof(float), &data[0]); | shader->TexCoordPointer(GL_TEXTURE0, 2, GL_FLOAT, 5*sizeof(float), &data[0]); | ||||
shader->VertexPointer(3, GL_FLOAT, 5*sizeof(float), &data[2]); | shader->VertexPointer(3, GL_FLOAT, 5*sizeof(float), &data[2]); | ||||
glDrawArrays(GL_TRIANGLES, 0, 6); | glDrawArrays(GL_TRIANGLES, 0, 6); | ||||
if (needsBlend) | if (needsBlend) | ||||
glDisable(GL_BLEND); | glDisable(GL_BLEND); | ||||
Show All 9 Lines | else | ||||
CRect Verts = cit->m_Vertices; | CRect Verts = cit->m_Vertices; | ||||
if (Verts.right < Verts.left) | if (Verts.right < Verts.left) | ||||
std::swap(Verts.right, Verts.left); | std::swap(Verts.right, Verts.left); | ||||
if (Verts.bottom < Verts.top) | if (Verts.bottom < Verts.top) | ||||
std::swap(Verts.bottom, Verts.top); | std::swap(Verts.bottom, Verts.top); | ||||
std::vector<float> data; | std::vector<float> data; | ||||
#define ADD(x, y, z) STMT(data.push_back(x); data.push_back(y); data.push_back(z)) | #define ADD(x, y, z) STMT(data.push_back(x); data.push_back(y); data.push_back(z)) | ||||
ADD(Verts.left, Verts.bottom, Z + cit->m_DeltaZ); | ADD(Verts.left, Verts.bottom, 0.0f); | ||||
ADD(Verts.right, Verts.bottom, Z + cit->m_DeltaZ); | ADD(Verts.right, Verts.bottom, 0.0f); | ||||
ADD(Verts.right, Verts.top, Z + cit->m_DeltaZ); | ADD(Verts.right, Verts.top, 0.0f); | ||||
ADD(Verts.right, Verts.top, Z + cit->m_DeltaZ); | ADD(Verts.right, Verts.top, 0.0f); | ||||
ADD(Verts.left, Verts.top, Z + cit->m_DeltaZ); | ADD(Verts.left, Verts.top, 0.0f); | ||||
ADD(Verts.left, Verts.bottom, Z + cit->m_DeltaZ); | ADD(Verts.left, Verts.bottom, 0.0f); | ||||
shader->VertexPointer(3, GL_FLOAT, 3*sizeof(float), &data[0]); | shader->VertexPointer(3, GL_FLOAT, 3*sizeof(float), &data[0]); | ||||
glDrawArrays(GL_TRIANGLES, 0, 6); | glDrawArrays(GL_TRIANGLES, 0, 6); | ||||
if (cit->m_BorderColor != nullptr) | if (cit->m_BorderColor != nullptr) | ||||
{ | { | ||||
shader->Uniform(str_color, *cit->m_BorderColor); | shader->Uniform(str_color, *cit->m_BorderColor); | ||||
data.clear(); | data.clear(); | ||||
ADD(Verts.left + 0.5f, Verts.top + 0.5f, Z + cit->m_DeltaZ); | ADD(Verts.left + 0.5f, Verts.top + 0.5f, 0.0f); | ||||
ADD(Verts.right - 0.5f, Verts.top + 0.5f, Z + cit->m_DeltaZ); | ADD(Verts.right - 0.5f, Verts.top + 0.5f, 0.0f); | ||||
ADD(Verts.right - 0.5f, Verts.bottom - 0.5f, Z + cit->m_DeltaZ); | ADD(Verts.right - 0.5f, Verts.bottom - 0.5f, 0.0f); | ||||
ADD(Verts.left + 0.5f, Verts.bottom - 0.5f, Z + cit->m_DeltaZ); | ADD(Verts.left + 0.5f, Verts.bottom - 0.5f, 0.0f); | ||||
shader->VertexPointer(3, GL_FLOAT, 3*sizeof(float), &data[0]); | shader->VertexPointer(3, GL_FLOAT, 3*sizeof(float), &data[0]); | ||||
glDrawArrays(GL_LINE_LOOP, 0, 4); | glDrawArrays(GL_LINE_LOOP, 0, 4); | ||||
} | } | ||||
if (cit->m_EnableBlending) | if (cit->m_EnableBlending) | ||||
glDisable(GL_BLEND); | glDisable(GL_BLEND); | ||||
#undef ADD | #undef ADD | ||||
} | } | ||||
cit->m_Shader->EndPass(); | cit->m_Shader->EndPass(); | ||||
} | } | ||||
} | } |
Wildfire Games · Phabricator