Changeset 647


Ignore:
Timestamp:
Feb 14, 2011, 2:26:37 AM (10 years ago)
Author:
sam
Message:

Switch debug sphere rendering method to vertex buffer objects.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/debugsphere.cpp

    r259 r647  
    3939    friend class DebugSphere;
    4040
    41     void DrawSphere(int ndiv, GLfloat r)
    42     {
    43         glBegin(GL_TRIANGLES);
     41    void DrawSphere(int ndiv, GLfloat r, float *&vertex, float *&normal)
     42    {
    4443        for (int i = 0; i < 20; i++)
    4544            DrawTriangle(vdata[tindices[i][0]],
    4645                         vdata[tindices[i][2]],
    47                          vdata[tindices[i][1]], ndiv, r);
    48         glEnd();
     46                         vdata[tindices[i][1]], ndiv, r, vertex, normal);
    4947    }
    5048
    5149    void DrawTriangle(GLfloat const *a, GLfloat const *b, GLfloat const *c,
    52                       int div, GLfloat r)
     50                      int div, GLfloat r, float *&vertex, float *&normal)
    5351    {
    5452        if (div <= 0)
    5553        {
    56             glNormal3fv(a); glVertex3f(a[0] * r, a[1] * r, a[2] * r);
    57             glNormal3fv(b); glVertex3f(b[0] * r, b[1] * r, b[2] * r);
    58             glNormal3fv(c); glVertex3f(c[0] * r, c[1] * r, c[2] * r);
     54            *normal++ = a[0]; *normal++ = a[1]; *normal++ = a[2];
     55            *vertex++ = a[0] * r; *vertex++ = a[1] * r; *vertex++ = a[2] * r;
     56            *normal++ = b[0]; *normal++ = b[1]; *normal++ = b[2];
     57            *vertex++ = b[0] * r; *vertex++ = b[1] * r; *vertex++ = b[2] * r;
     58            *normal++ = c[0]; *normal++ = c[1]; *normal++ = c[2];
     59            *vertex++ = c[0] * r; *vertex++ = c[1] * r; *vertex++ = c[2] * r;
    5960        }
    6061        else
     
    6869            }
    6970            Normalize(ab); Normalize(ac); Normalize(bc);
    70             DrawTriangle(a, ab, ac, div - 1, r);
    71             DrawTriangle(b, bc, ab, div - 1, r);
    72             DrawTriangle(c, ac, bc, div - 1, r);
    73             DrawTriangle(ab, bc, ac, div - 1, r);
     71            DrawTriangle(a, ab, ac, div - 1, r, vertex, normal);
     72            DrawTriangle(b, bc, ab, div - 1, r, vertex, normal);
     73            DrawTriangle(c, ac, bc, div - 1, r, vertex, normal);
     74            DrawTriangle(ab, bc, ac, div - 1, r, vertex, normal);
    7475        }
    7576    }
     
    8384private:
    8485    float time;
     86    int initialised;
     87    GLuint buflist[2];
    8588
    8689    static GLfloat const vdata[12][3];
     
    115118{
    116119    data->time = 0.0f;
     120    data->initialised = 0;
    117121}
    118122
     
    130134    Entity::TickDraw(deltams);
    131135
     136    if (IsDestroying())
     137    {
     138        if (data->initialised)
     139        {
     140            glDeleteBuffers(2, data->buflist);
     141            data->initialised = 0;
     142        }
     143    }
     144    else if (!data->initialised)
     145    {
     146        glGenBuffers(2, data->buflist);
     147        data->initialised = 1;
     148    }
     149
    132150    float a = sinf(data->time);
    133151    float b = sinf(data->time * 0.5f);
    134152
     153    int const ndiv = 2;
     154    int const ntriangles = 20 * (1 << (ndiv * 2))
     155                              * (int)(log(1.0f / 0.01f) / log(1.1f) + 0.9999f);
     156
     157    float *vertex = (float *)malloc(ntriangles * 3 * 3 * sizeof(float));
     158    float *normal = (float *)malloc(ntriangles * 3 * 3 * sizeof(float));
     159
     160    float *vertex_parser = vertex;
     161    float *normal_parser = normal;
     162    for (float t = 0.01f; t < 1.0f; t *= 1.1f)
     163        data->DrawSphere(ndiv, t * (60.0f + 40.0f * a),
     164                         vertex_parser, normal_parser);
     165
     166    glEnableClientState(GL_VERTEX_ARRAY);
     167    glEnableClientState(GL_NORMAL_ARRAY);
     168
     169    glBindBuffer(GL_ARRAY_BUFFER, data->buflist[0]);
     170    glBufferData(GL_ARRAY_BUFFER, ntriangles * 3 * 3 * sizeof(float),
     171                 vertex, GL_DYNAMIC_DRAW);
     172    glVertexPointer(3, GL_FLOAT, 0, NULL);
     173
     174    glBindBuffer(GL_ARRAY_BUFFER, data->buflist[1]);
     175    glBufferData(GL_ARRAY_BUFFER, ntriangles * 3 * 3 * sizeof(float),
     176                 normal, GL_DYNAMIC_DRAW);
     177    glNormalPointer(GL_FLOAT, 0, NULL);
     178
     179#if 0
    135180    glPushAttrib(GL_COLOR_BUFFER_BIT | GL_CURRENT_BIT);
     181#endif
     182    glColor4f(1.0f, b, a, 0.1f);
    136183    glBindTexture(GL_TEXTURE_2D, NULL);
    137     glColor4f(1.0f, b, a, 0.1f);
     184
    138185    glTranslatef(320.0f, 240.0f, 32.0f);
    139     for (float t = 0.01f; t < 1.0f; t *= 1.1f)
    140         data->DrawSphere(2, t * (60.0f + 40.0f * a));
     186    glDrawArrays(GL_TRIANGLES, 0, ntriangles * 3);
    141187    glTranslatef(-320.0f, -240.0f, -32.0f);
     188    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
     189#if 0
    142190    glPopAttrib();
     191#endif
     192
     193    glDisableClientState(GL_VERTEX_ARRAY);
     194    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
     195
     196    free(vertex);
     197    free(normal);
    143198}
    144199
Note: See TracChangeset for help on using the changeset viewer.