make internal diffuse apply to bmt attributes

diffuse from BitmapText attributes were not receiving internal diffuse
from their parent ActorFrames. This change waits until after the draw
cycle to reset the internal diffuse and glow, so any color applications
separate from generic diffuse can use the internal diffuse when desired.
This commit is contained in:
sigatrev
2014-08-16 16:38:26 -05:00
parent 4ac7e2ad2d
commit d8b86fa3c5
3 changed files with 35 additions and 9 deletions
+9 -4
View File
@@ -288,7 +288,7 @@ void Actor::Draw()
this->PreDraw();
ASSERT( m_pTempState != NULL );
if( m_pTempState->diffuse[0].a != 0 || m_pTempState->diffuse[1].a != 0 || m_pTempState->diffuse[2].a != 0 || m_pTempState->diffuse[3].a != 0 || m_pTempState->glow.a != 0 ) // This Actor is not fully transparent
if( m_pTempState->diffuse[0].a > 0 || m_pTempState->diffuse[1].a > 0 || m_pTempState->diffuse[2].a > 0 || m_pTempState->diffuse[3].a > 0 || m_pTempState->glow.a > 0 ) // This Actor is not fully transparent
{
// call the most-derived versions
this->BeginDraw();
@@ -296,9 +296,16 @@ void Actor::Draw()
this->EndDraw();
}
this->PostDraw();
m_pTempState = NULL;
}
void Actor::PostDraw() // reset internal diffuse and glow
{
m_internalDiffuse = RageColor(1, 1, 1, 1);
m_internalGlow.a = 0;
}
void Actor::PreDraw() // calculate actor properties
{
// Somthing below may set m_pTempState to tempState
@@ -468,7 +475,6 @@ void Actor::PreDraw() // calculate actor properties
{
tempState.diffuse[i] *= m_internalDiffuse;
}
m_internalDiffuse = RageColor(1, 1, 1, 1);
}
if( m_internalGlow.a > 0 )
@@ -481,10 +487,9 @@ void Actor::PreDraw() // calculate actor properties
// Blend using Screen mode
tempState.glow = tempState.glow + m_internalGlow - m_internalGlow * tempState.glow;
m_internalGlow.a = 0;
}
}
void Actor::BeginDraw() // set the world matrix
{
DISPLAY->PushMatrix();
+2
View File
@@ -244,6 +244,8 @@ public:
virtual bool EarlyAbortDraw() const { return false; }
/** @brief Calculate values that may be needed for drawing. */
virtual void PreDraw();
/** @brief Reset internal diffuse and glow. */
virtual void PostDraw();
/** @brief Start the drawing and push the transform on the world matrix stack. */
virtual void BeginDraw();
/**
+24 -5
View File
@@ -659,10 +659,20 @@ void BitmapText::DrawPrimitives()
iEnd = min( iEnd, m_aVertices.size() );
for( ; i < iEnd; i += 4 )
{
m_aVertices[i+0].c = attr.diffuse[0]; // top left
m_aVertices[i+1].c = attr.diffuse[2]; // bottom left
m_aVertices[i+2].c = attr.diffuse[3]; // bottom right
m_aVertices[i+3].c = attr.diffuse[1]; // top right
if( m_internalDiffuse != RageColor(1, 1, 1, 1) )
{
m_aVertices[i+0].c = attr.diffuse[0] * m_internalDiffuse;
m_aVertices[i+1].c = attr.diffuse[2] * m_internalDiffuse;
m_aVertices[i+2].c = attr.diffuse[3] * m_internalDiffuse;
m_aVertices[i+3].c = attr.diffuse[1] * m_internalDiffuse;
}
else
{
m_aVertices[i+0].c = attr.diffuse[0]; // top left
m_aVertices[i+1].c = attr.diffuse[2]; // bottom left
m_aVertices[i+2].c = attr.diffuse[3]; // bottom right
m_aVertices[i+3].c = attr.diffuse[1]; // top right
}
}
}
}
@@ -729,7 +739,16 @@ void BitmapText::DrawPrimitives()
iEnd = i + attr.length*4;
iEnd = min( iEnd, m_aVertices.size() );
for( ; i < iEnd; ++i )
m_aVertices[i].c = attr.glow;
{
if( m_internalGlow.a > 0 )
{
m_aVertices[i].c = attr.glow * m_internalGlow;
}
else
{
m_aVertices[i].c = attr.glow;
}
}
}
/* Draw glow using the base texture and the glow texture. Otherwise,
* glow looks too tame on BitmapText that has a stroke. - Chris Danford */