draw directly; too many vertices to generate this stuff on the fly
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
#include "ActorUtil.h"
|
#include "ActorUtil.h"
|
||||||
#include "RageUtil.h"
|
#include "RageUtil.h"
|
||||||
#include "RageLog.h"
|
#include "RageLog.h"
|
||||||
|
#include "RageMath.h"
|
||||||
#include "StageStats.h"
|
#include "StageStats.h"
|
||||||
#include "Foreach.h"
|
#include "Foreach.h"
|
||||||
#include "song.h"
|
#include "song.h"
|
||||||
@@ -14,7 +15,7 @@
|
|||||||
//#define DIVIDE_LINE_WIDTH THEME->GetMetricI(m_sName,"TexturedBottomHalf")
|
//#define DIVIDE_LINE_WIDTH THEME->GetMetricI(m_sName,"TexturedBottomHalf")
|
||||||
REGISTER_ACTOR_CLASS( GraphDisplay )
|
REGISTER_ACTOR_CLASS( GraphDisplay )
|
||||||
|
|
||||||
enum { VALUE_RESOLUTION=200 };
|
enum { VALUE_RESOLUTION=100 };
|
||||||
class GraphLine: public Actor
|
class GraphLine: public Actor
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -25,8 +26,17 @@ public:
|
|||||||
m_LineStrip[i].c = RageColor( 1,1,1,1 );
|
m_LineStrip[i].c = RageColor( 1,1,1,1 );
|
||||||
m_LineStrip[i].t = RageVector2( 0,0 );
|
m_LineStrip[i].t = RageVector2( 0,0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_pCircles = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
~GraphLine()
|
||||||
|
{
|
||||||
|
delete[] m_pCircles;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const int iSubdivisions = 4;
|
||||||
|
static const int iCircleVertices = iSubdivisions+2;
|
||||||
void DrawPrimitives()
|
void DrawPrimitives()
|
||||||
{
|
{
|
||||||
Actor::SetGlobalRenderStates(); // set Actor-specified render states
|
Actor::SetGlobalRenderStates(); // set Actor-specified render states
|
||||||
@@ -40,11 +50,76 @@ public:
|
|||||||
for( int i = 0; i < ARRAYSIZE(m_LineStrip); ++i )
|
for( int i = 0; i < ARRAYSIZE(m_LineStrip); ++i )
|
||||||
m_LineStrip[i].c = this->m_pTempState->diffuse[0];
|
m_LineStrip[i].c = this->m_pTempState->diffuse[0];
|
||||||
|
|
||||||
// XXX: order: mask, sprite, line, others
|
DISPLAY->DrawQuads( &m_Quads[0], m_Quads.size() );
|
||||||
DISPLAY->DrawLineStrip( m_LineStrip, ARRAYSIZE(m_LineStrip), 2 );
|
|
||||||
|
for( int i = 0; i < VALUE_RESOLUTION; ++i )
|
||||||
|
DISPLAY->DrawFan( m_pCircles+iCircleVertices*i, iCircleVertices );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void MakeCircle( const RageSpriteVertex &v, RageSpriteVertex *pVerts, int iSubdivisions, float fRadius )
|
||||||
|
{
|
||||||
|
pVerts[0] = v;
|
||||||
|
|
||||||
|
for( int i = 0; i < iSubdivisions+1; ++i )
|
||||||
|
{
|
||||||
|
const float fRotation = float(i) / iSubdivisions * 2*PI;
|
||||||
|
const float fX = RageFastCos(fRotation) * fRadius;
|
||||||
|
const float fY = -RageFastSin(fRotation) * fRadius;
|
||||||
|
pVerts[1+i] = v;
|
||||||
|
pVerts[1+i].p.x += fX;
|
||||||
|
pVerts[1+i].p.y += fY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Set()
|
||||||
|
{
|
||||||
|
delete[] m_pCircles;
|
||||||
|
m_pCircles = new RageSpriteVertex[VALUE_RESOLUTION * iCircleVertices];
|
||||||
|
|
||||||
|
for( int i = 0; i < VALUE_RESOLUTION; ++i )
|
||||||
|
{
|
||||||
|
MakeCircle( m_LineStrip[i], m_pCircles + iCircleVertices*i, iSubdivisions, 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
int iNumLines = VALUE_RESOLUTION-1;
|
||||||
|
m_Quads.resize( iNumLines * 4 );
|
||||||
|
for( int i = 0; i < iNumLines-1; ++i )
|
||||||
|
{
|
||||||
|
const RageSpriteVertex &p1 = m_LineStrip[i];
|
||||||
|
const RageSpriteVertex &p2 = m_LineStrip[i+1];
|
||||||
|
|
||||||
|
float opp = p2.p.x - p1.p.x;
|
||||||
|
float adj = p2.p.y - p1.p.y;
|
||||||
|
float hyp = powf(opp*opp + adj*adj, 0.5f);
|
||||||
|
|
||||||
|
float lsin = opp/hyp;
|
||||||
|
float lcos = adj/hyp;
|
||||||
|
|
||||||
|
RageSpriteVertex *v = &m_Quads[i*4];
|
||||||
|
v[0] = v[1] = p1;
|
||||||
|
v[2] = v[3] = p2;
|
||||||
|
|
||||||
|
int iLineWidth = 2;
|
||||||
|
float ydist = lsin * iLineWidth/2;
|
||||||
|
float xdist = lcos * iLineWidth/2;
|
||||||
|
|
||||||
|
v[0].p.x += xdist;
|
||||||
|
v[0].p.y -= ydist;
|
||||||
|
v[1].p.x -= xdist;
|
||||||
|
v[1].p.y += ydist;
|
||||||
|
v[2].p.x -= xdist;
|
||||||
|
v[2].p.y += ydist;
|
||||||
|
v[3].p.x += xdist;
|
||||||
|
v[3].p.y -= ydist;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RageSpriteVertex m_LineStrip[VALUE_RESOLUTION];
|
RageSpriteVertex m_LineStrip[VALUE_RESOLUTION];
|
||||||
|
|
||||||
|
private:
|
||||||
|
vector<RageSpriteVertex> m_Quads;
|
||||||
|
RageSpriteVertex *m_pCircles;
|
||||||
};
|
};
|
||||||
|
|
||||||
class GraphBody: public Actor
|
class GraphBody: public Actor
|
||||||
@@ -203,6 +278,8 @@ void GraphDisplay::UpdateVerts()
|
|||||||
|
|
||||||
m_pGraphLine->m_LineStrip[i].p = RageVector3( fX, fY, 0 );
|
m_pGraphLine->m_LineStrip[i].p = RageVector3( fX, fY, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_pGraphLine->Set();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphDisplay::Update( float fDeltaTime )
|
void GraphDisplay::Update( float fDeltaTime )
|
||||||
|
|||||||
Reference in New Issue
Block a user