Changeset 647
- Timestamp:
- Feb 14, 2011, 2:26:37 AM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/debugsphere.cpp
r259 r647 39 39 friend class DebugSphere; 40 40 41 void DrawSphere(int ndiv, GLfloat r) 42 { 43 glBegin(GL_TRIANGLES); 41 void DrawSphere(int ndiv, GLfloat r, float *&vertex, float *&normal) 42 { 44 43 for (int i = 0; i < 20; i++) 45 44 DrawTriangle(vdata[tindices[i][0]], 46 45 vdata[tindices[i][2]], 47 vdata[tindices[i][1]], ndiv, r); 48 glEnd(); 46 vdata[tindices[i][1]], ndiv, r, vertex, normal); 49 47 } 50 48 51 49 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) 53 51 { 54 52 if (div <= 0) 55 53 { 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; 59 60 } 60 61 else … … 68 69 } 69 70 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); 74 75 } 75 76 } … … 83 84 private: 84 85 float time; 86 int initialised; 87 GLuint buflist[2]; 85 88 86 89 static GLfloat const vdata[12][3]; … … 115 118 { 116 119 data->time = 0.0f; 120 data->initialised = 0; 117 121 } 118 122 … … 130 134 Entity::TickDraw(deltams); 131 135 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 132 150 float a = sinf(data->time); 133 151 float b = sinf(data->time * 0.5f); 134 152 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 135 180 glPushAttrib(GL_COLOR_BUFFER_BIT | GL_CURRENT_BIT); 181 #endif 182 glColor4f(1.0f, b, a, 0.1f); 136 183 glBindTexture(GL_TEXTURE_2D, NULL); 137 glColor4f(1.0f, b, a, 0.1f); 184 138 185 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); 141 187 glTranslatef(-320.0f, -240.0f, -32.0f); 188 glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 189 #if 0 142 190 glPopAttrib(); 191 #endif 192 193 glDisableClientState(GL_VERTEX_ARRAY); 194 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 195 196 free(vertex); 197 free(normal); 143 198 } 144 199
Note: See TracChangeset
for help on using the changeset viewer.