add per-NoteType texcoord offset so that Note and Addition can use the same ModelGeometry

This commit is contained in:
Chris Danford
2006-12-01 13:10:01 +00:00
parent 99f4097ec1
commit e58c980aef
+19 -10
View File
@@ -28,7 +28,10 @@ static const char *NotePartNames[] = {
}; };
XToString( NotePart ); XToString( NotePart );
static const RageVector2 g_emptyVector = RageVector2( 0, 0 ); static bool IsVectorZero( const RageVector2 &v )
{
return v.x == 0 && v.y == 0;
}
// Don't require that NoteSkins have more than 8 colors. Using 9 colors to display 192nd notes // Don't require that NoteSkins have more than 8 colors. Using 9 colors to display 192nd notes
// would double the number of texture memory needed for many NoteSkin graphics versus just having // would double the number of texture memory needed for many NoteSkin graphics versus just having
@@ -41,6 +44,7 @@ struct NoteMetricCache_t
bool m_bDrawHoldHeadForTapsOnSameRow; bool m_bDrawHoldHeadForTapsOnSameRow;
float m_fAnimationLengthInBeats[NUM_NotePart]; float m_fAnimationLengthInBeats[NUM_NotePart];
bool m_bAnimationIsVivid[NUM_NotePart]; bool m_bAnimationIsVivid[NUM_NotePart];
RageVector2 m_fTextureCoordOffset[NUM_NotePart];
RageVector2 m_fNoteColorTextureCoordSpacing[NUM_NotePart]; RageVector2 m_fNoteColorTextureCoordSpacing[NUM_NotePart];
bool m_bHoldHeadIsAboveWavyParts; bool m_bHoldHeadIsAboveWavyParts;
@@ -68,6 +72,8 @@ void NoteMetricCache_t::Load( const RString &sButton )
const RString &s = NotePartToString(p); const RString &s = NotePartToString(p);
m_fAnimationLengthInBeats[p] = NOTESKIN->GetMetricF(sButton,s+"AnimationLengthInBeats"); m_fAnimationLengthInBeats[p] = NOTESKIN->GetMetricF(sButton,s+"AnimationLengthInBeats");
m_bAnimationIsVivid[p] = NOTESKIN->GetMetricB(sButton,s+"AnimationIsVivid"); m_bAnimationIsVivid[p] = NOTESKIN->GetMetricB(sButton,s+"AnimationIsVivid");
m_fTextureCoordOffset[p].x = NOTESKIN->GetMetricF(sButton,s+"TextureCoordOffsetX");
m_fTextureCoordOffset[p].y = NOTESKIN->GetMetricF(sButton,s+"TextureCoordOffsetY");
m_fNoteColorTextureCoordSpacing[p].x = NOTESKIN->GetMetricF(sButton,s+"NoteColorTextureCoordSpacingX"); m_fNoteColorTextureCoordSpacing[p].x = NOTESKIN->GetMetricF(sButton,s+"NoteColorTextureCoordSpacingX");
m_fNoteColorTextureCoordSpacing[p].y = NOTESKIN->GetMetricF(sButton,s+"NoteColorTextureCoordSpacingY"); m_fNoteColorTextureCoordSpacing[p].y = NOTESKIN->GetMetricF(sButton,s+"NoteColorTextureCoordSpacingY");
} }
@@ -731,12 +737,13 @@ void NoteDisplay::DrawHoldTail( const TapNote& tn, int iCol, int iRow, bool bIsB
pSprTail->SetXY( fX, fY ); pSprTail->SetXY( fX, fY );
pSprTail->SetZ( fZ ); pSprTail->SetZ( fZ );
if( cache->m_fNoteColorTextureCoordSpacing[NotePart_HoldTail] != g_emptyVector ) NotePart part = NotePart_HoldTail;
if( !IsVectorZero(cache->m_fTextureCoordOffset[part]) || !IsVectorZero(cache->m_fNoteColorTextureCoordSpacing[part]) )
{ {
DISPLAY->TexturePushMatrix(); DISPLAY->TexturePushMatrix();
NoteType nt = GetNoteType( iRow ); NoteType nt = GetNoteType( iRow );
ENUM_CLAMP( nt, (NoteType)0, MAX_DISPLAY_NOTE_TYPE ); ENUM_CLAMP( nt, (NoteType)0, MAX_DISPLAY_NOTE_TYPE );
DISPLAY->TextureTranslate( cache->m_fNoteColorTextureCoordSpacing[NotePart_HoldTail]*(float)nt ); DISPLAY->TextureTranslate( cache->m_fTextureCoordOffset[part] + cache->m_fNoteColorTextureCoordSpacing[part]*(float)nt );
} }
if( bGlow ) if( bGlow )
@@ -769,7 +776,7 @@ void NoteDisplay::DrawHoldTail( const TapNote& tn, int iCol, int iRow, bool bIsB
DISPLAY->SetLighting( false ); DISPLAY->SetLighting( false );
} }
if( cache->m_fNoteColorTextureCoordSpacing[NotePart_HoldTail] != g_emptyVector ) if( !IsVectorZero(cache->m_fTextureCoordOffset[part]) || !IsVectorZero(cache->m_fNoteColorTextureCoordSpacing[part]) )
{ {
DISPLAY->TexturePopMatrix(); DISPLAY->TexturePopMatrix();
} }
@@ -801,12 +808,13 @@ void NoteDisplay::DrawHoldHead( const TapNote& tn, int iCol, int iRow, bool bIsB
pActor->SetXY( fX, fY ); pActor->SetXY( fX, fY );
pActor->SetZ( fZ ); pActor->SetZ( fZ );
if( cache->m_fNoteColorTextureCoordSpacing[NotePart_HoldHead] != g_emptyVector ) NotePart part = NotePart_HoldHead;
if( !IsVectorZero(cache->m_fTextureCoordOffset[part]) || !IsVectorZero(cache->m_fNoteColorTextureCoordSpacing[part]) )
{ {
DISPLAY->TexturePushMatrix(); DISPLAY->TexturePushMatrix();
NoteType nt = GetNoteType( iRow ); NoteType nt = GetNoteType( iRow );
ENUM_CLAMP( nt, (NoteType)0, MAX_DISPLAY_NOTE_TYPE ); ENUM_CLAMP( nt, (NoteType)0, MAX_DISPLAY_NOTE_TYPE );
DISPLAY->TextureTranslate( cache->m_fNoteColorTextureCoordSpacing[NotePart_HoldHead]*(float)nt ); DISPLAY->TextureTranslate( cache->m_fTextureCoordOffset[part] + cache->m_fNoteColorTextureCoordSpacing[part]*(float)nt );
} }
if( bGlow ) if( bGlow )
@@ -839,7 +847,7 @@ void NoteDisplay::DrawHoldHead( const TapNote& tn, int iCol, int iRow, bool bIsB
DISPLAY->SetLighting( false ); DISPLAY->SetLighting( false );
} }
if( cache->m_fNoteColorTextureCoordSpacing[NotePart_HoldHead] != g_emptyVector ) if( !IsVectorZero(cache->m_fTextureCoordOffset[part]) || !IsVectorZero(cache->m_fNoteColorTextureCoordSpacing[part]) )
{ {
DISPLAY->TexturePopMatrix(); DISPLAY->TexturePopMatrix();
} }
@@ -942,12 +950,12 @@ void NoteDisplay::DrawActor( Actor* pActor, int iCol, float fBeat, float fPercen
pActor->SetGlow( glow ); pActor->SetGlow( glow );
pActor->SetZoom( fZoom ); pActor->SetZoom( fZoom );
if( cache->m_fNoteColorTextureCoordSpacing[part] != g_emptyVector ) if( !IsVectorZero(cache->m_fTextureCoordOffset[part]) || !IsVectorZero(cache->m_fNoteColorTextureCoordSpacing[part]) )
{ {
DISPLAY->TexturePushMatrix(); DISPLAY->TexturePushMatrix();
NoteType nt = BeatToNoteType( fBeat ); NoteType nt = BeatToNoteType( fBeat );
ENUM_CLAMP( nt, (NoteType)0, MAX_DISPLAY_NOTE_TYPE ); ENUM_CLAMP( nt, (NoteType)0, MAX_DISPLAY_NOTE_TYPE );
DISPLAY->TextureTranslate( cache->m_fNoteColorTextureCoordSpacing[part]*(float)nt ); DISPLAY->TextureTranslate( cache->m_fTextureCoordOffset[part] + cache->m_fNoteColorTextureCoordSpacing[part]*(float)nt );
} }
if( bUseLighting ) if( bUseLighting )
@@ -969,7 +977,7 @@ void NoteDisplay::DrawActor( Actor* pActor, int iCol, float fBeat, float fPercen
DISPLAY->SetLighting( false ); DISPLAY->SetLighting( false );
} }
if( cache->m_fNoteColorTextureCoordSpacing[part] != g_emptyVector ) if( !IsVectorZero(cache->m_fTextureCoordOffset[part]) || !IsVectorZero(cache->m_fNoteColorTextureCoordSpacing[part]) )
{ {
DISPLAY->TexturePopMatrix(); DISPLAY->TexturePopMatrix();
} }
@@ -997,6 +1005,7 @@ void NoteDisplay::DrawTap( int iCol, float fBeat, bool bOnSameRowAsHoldStart, bo
{ {
pActor = GetTapActor( m_TapAddition, NotePart_Addition, fBeat ); pActor = GetTapActor( m_TapAddition, NotePart_Addition, fBeat );
bUseLighting = cache->m_bTapAdditionUseLighting; bUseLighting = cache->m_bTapAdditionUseLighting;
part = NotePart_Addition;
} }
else if( bOnSameRowAsHoldStart && cache->m_bDrawHoldHeadForTapsOnSameRow ) else if( bOnSameRowAsHoldStart && cache->m_bDrawHoldHeadForTapsOnSameRow )
{ {