git-svn-id: https://pioneer.svn.sourceforge.net/svnroot/pioneer/trunk@246 e632f14b-6550-0410-b89e-a82653faca30
master
jaj22 2009-03-22 20:51:36 +00:00
parent 689c4afb85
commit 013231c361
2 changed files with 43 additions and 15 deletions

View File

@ -15,6 +15,16 @@ static const double GEOPATCH_FRAC = 1.0 / (double)(GEOPATCH_EDGELEN-1);
#define PRINT_VECTOR(_v) printf("%f,%f,%f\n", (_v).x, (_v).y, (_v).z);
#define USE_VBO GLEW_ARB_vertex_buffer_object
//#define USE_VBO 0
#pragma pack(4)
struct VBOVertex
{
float x,y,z;
float nx,ny,nz;
float cr,cg,cb;
};
#pragma pack()
class GeoPatch {
public:
@ -22,10 +32,11 @@ public:
vector3d *vertices;
vector3d *normals;
vector3d *colors;
GLuint m_vbo[3];
GLuint m_vbo;
static unsigned short *indices;
static unsigned short *loEdgeIndices[4];
static GLuint indices_vbo[5];
static VBOVertex vbotemp[GEOPATCH_NUMVERTICES];
GeoPatch *kids[4];
GeoPatch *parent;
GeoPatch *edgeFriend[4]; // [0]=v01, [1]=v12, [2]=v20
@ -39,7 +50,7 @@ public:
memset(this, 0, sizeof(GeoPatch));
v[0] = v0; v[1] = v1; v[2] = v2; v[3] = v3;
m_roughLength = MAX((v0-v2).Length(), (v1-v3).Length());
if (USE_VBO) glGenBuffersARB(3, m_vbo);
if (USE_VBO) glGenBuffersARB(1, &m_vbo);
if (!indices) {
indices = new unsigned short[2*(GEOPATCH_EDGELEN-1)*(GEOPATCH_EDGELEN-1)*3];
const int numLoEdgeTris = GEOPATCH_EDGELEN/2;
@ -112,17 +123,33 @@ public:
if (vertices) delete vertices;
if (normals) delete normals;
if (colors) delete colors;
if (m_vbo[0]) glDeleteBuffersARB(3, m_vbo);
if (USE_VBO) glDeleteBuffersARB(1, &m_vbo);
}
void UpdateVBOs() {
if (USE_VBO) {
glBindBufferARB(GL_ARRAY_BUFFER, m_vbo[0]);
for (int i=0; i<GEOPATCH_NUMVERTICES; i++)
{
VBOVertex *pData = vbotemp + i;
pData->x = (float)vertices[i].x;
pData->y = (float)vertices[i].y;
pData->z = (float)vertices[i].z;
pData->nx = (float)normals[i].x;
pData->ny = (float)normals[i].y;
pData->nz = (float)normals[i].z;
pData->cr = (float)colors[i].x;
pData->cg = (float)colors[i].y;
pData->cb = (float)colors[i].z;
}
glBindBufferARB(GL_ARRAY_BUFFER, m_vbo);
glBufferDataARB(GL_ARRAY_BUFFER, sizeof(VBOVertex)*GEOPATCH_NUMVERTICES, vbotemp, GL_STATIC_DRAW);
/* glBindBufferARB(GL_ARRAY_BUFFER, m_vbo[0]);
glBufferDataARB(GL_ARRAY_BUFFER, sizeof(double)*3*GEOPATCH_EDGELEN*GEOPATCH_EDGELEN, vertices, GL_STATIC_DRAW);
glBindBufferARB(GL_ARRAY_BUFFER, m_vbo[1]);
glBufferDataARB(GL_ARRAY_BUFFER, sizeof(double)*3*GEOPATCH_EDGELEN*GEOPATCH_EDGELEN, normals, GL_STATIC_DRAW);
glBindBufferARB(GL_ARRAY_BUFFER, m_vbo[2]);
glBufferDataARB(GL_ARRAY_BUFFER, sizeof(double)*3*GEOPATCH_EDGELEN*GEOPATCH_EDGELEN, colors, GL_STATIC_DRAW);
}
*/ }
}
/* not quite edge, since we share edge vertices so that would be
* fucking pointless. one position inwards. used to make edge normals
@ -545,12 +572,10 @@ public:
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
if (USE_VBO) {
glBindBufferARB(GL_ARRAY_BUFFER, m_vbo[0]);
glVertexPointer(3, GL_DOUBLE, 0, 0);
glBindBufferARB(GL_ARRAY_BUFFER, m_vbo[1]);
glNormalPointer(GL_DOUBLE, 0, 0);
glBindBufferARB(GL_ARRAY_BUFFER, m_vbo[2]);
glColorPointer(3, GL_DOUBLE, 0, 0);
glBindBufferARB(GL_ARRAY_BUFFER, m_vbo);
glVertexPointer(3, GL_FLOAT, sizeof(VBOVertex), 0);
glNormalPointer(GL_FLOAT, sizeof(VBOVertex), (void *)(3*sizeof(float)));
glColorPointer(3, GL_FLOAT, sizeof(VBOVertex), (void *)(6*sizeof(float)));
glEnableClientState(GL_ELEMENT_ARRAY_BUFFER);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, indices_vbo[0]);
glDrawElements(GL_TRIANGLES, 2*(GEOPATCH_EDGELEN-1)*(GEOPATCH_EDGELEN-1)*3, GL_UNSIGNED_SHORT, 0);
@ -561,6 +586,7 @@ public:
}
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0);
glDisableClientState(GL_ELEMENT_ARRAY_BUFFER);
} else {
glVertexPointer(3, GL_DOUBLE, 0, &vertices[0].x);
glNormalPointer(GL_DOUBLE, 0, &normals[0].x);
@ -578,7 +604,7 @@ public:
}
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_ELEMENT_ARRAY_BUFFER);
glDisableClientState(GL_COLOR_ARRAY);
}
}
@ -653,6 +679,8 @@ public:
unsigned short *GeoPatch::indices = 0;
unsigned short *GeoPatch::loEdgeIndices[4];
GLuint GeoPatch::indices_vbo[5];
VBOVertex GeoPatch::vbotemp[GEOPATCH_NUMVERTICES];
static const int geo_sphere_edge_friends[6][4] = {
{ 3, 4, 1, 2 },

View File

@ -525,14 +525,14 @@ void Pi::MainLoop()
}
Gui::Draw();
#ifdef DEBUG
//#ifdef DEBUG
if (Pi::showDebugInfo) {
Gui::Screen::EnterOrtho();
glColor3f(1,1,1);
Gui::Screen::RenderString(fps_readout);
Gui::Screen::LeaveOrtho();
}
#endif /* DEBUG */
//#endif /* DEBUG */
glFlush();
SDL_GL_SwapBuffers();
@ -679,7 +679,7 @@ void sigsegv_handler(int signum)
int main(int argc, char**)
{
printf("Pioneer ultra high tech tech demo dude!\n");
signal(SIGSEGV, sigsegv_handler);
// signal(SIGSEGV, sigsegv_handler);
IniConfig cfg("config.ini");
Pi::Init(cfg);
Pi::Start();