| OLD | NEW |
| (Empty) |
| 1 // | |
| 2 // Book: OpenGL(R) ES 2.0 Programming Guide | |
| 3 // Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner | |
| 4 // ISBN-10: 0321502795 | |
| 5 // ISBN-13: 9780321502797 | |
| 6 // Publisher: Addison-Wesley Professional | |
| 7 // URLs: http://safari.informit.com/9780321563835 | |
| 8 // http://www.opengles-book.com | |
| 9 // | |
| 10 | |
| 11 // ESShapes.c | |
| 12 // | |
| 13 // Utility functions for generating shapes | |
| 14 // | |
| 15 | |
| 16 /// | |
| 17 // Includes | |
| 18 // | |
| 19 #include "esUtil.h" | |
| 20 #include <stdlib.h> | |
| 21 #include <math.h> | |
| 22 #include <string.h> | |
| 23 | |
| 24 /// | |
| 25 // Defines | |
| 26 // | |
| 27 #define ES_PI (3.14159265f) | |
| 28 | |
| 29 ////////////////////////////////////////////////////////////////// | |
| 30 // | |
| 31 // Private Functions | |
| 32 // | |
| 33 // | |
| 34 | |
| 35 | |
| 36 | |
| 37 ////////////////////////////////////////////////////////////////// | |
| 38 // | |
| 39 // Public Functions | |
| 40 // | |
| 41 // | |
| 42 | |
| 43 // | |
| 44 /// \brief Generates geometry for a sphere. Allocates memory for the vertex dat
a and stores | |
| 45 /// the results in the arrays. Generate index list for a TRIANGLE_STRIP | |
| 46 /// \param numSlices The number of slices in the sphere | |
| 47 /// \param vertices If not NULL, will contain array of float3 positions | |
| 48 /// \param normals If not NULL, will contain array of float3 normals | |
| 49 /// \param texCoords If not NULL, will contain array of float2 texCoords | |
| 50 /// \param indices If not NULL, will contain the array of indices for the triang
le strip | |
| 51 /// \return The number of indices required for rendering the buffers (the number
of indices stored in the indices array | |
| 52 /// if it is not NULL ) as a GL_TRIANGLE_STRIP | |
| 53 // | |
| 54 int esGenSphere ( int numSlices, float radius, GLfloat **vertices, GLfloat **nor
mals, | |
| 55 GLfloat **texCoords, GLuint **indices ) | |
| 56 { | |
| 57 int i; | |
| 58 int j; | |
| 59 int numParallels = numSlices / 2; | |
| 60 int numVertices = ( numParallels + 1 ) * ( numSlices + 1 ); | |
| 61 int numIndices = numParallels * numSlices * 6; | |
| 62 float angleStep = (2.0f * ES_PI) / ((float) numSlices); | |
| 63 | |
| 64 // Allocate memory for buffers | |
| 65 if ( vertices != NULL ) | |
| 66 *vertices = malloc ( sizeof(GLfloat) * 3 * numVertices ); | |
| 67 | |
| 68 if ( normals != NULL ) | |
| 69 *normals = malloc ( sizeof(GLfloat) * 3 * numVertices ); | |
| 70 | |
| 71 if ( texCoords != NULL ) | |
| 72 *texCoords = malloc ( sizeof(GLfloat) * 2 * numVertices ); | |
| 73 | |
| 74 if ( indices != NULL ) | |
| 75 *indices = malloc ( sizeof(GLuint) * numIndices ); | |
| 76 | |
| 77 for ( i = 0; i < numParallels + 1; i++ ) | |
| 78 { | |
| 79 for ( j = 0; j < numSlices + 1; j++ ) | |
| 80 { | |
| 81 int vertex = ( i * (numSlices + 1) + j ) * 3; | |
| 82 | |
| 83 if ( vertices ) | |
| 84 { | |
| 85 (*vertices)[vertex + 0] = radius * sinf ( angleStep * (float)i ) * | |
| 86 sinf ( angleStep * (float)j ); | |
| 87 (*vertices)[vertex + 1] = radius * cosf ( angleStep * (float)i ); | |
| 88 (*vertices)[vertex + 2] = radius * sinf ( angleStep * (float)i ) * | |
| 89 cosf ( angleStep * (float)j ); | |
| 90 } | |
| 91 | |
| 92 if ( normals ) | |
| 93 { | |
| 94 (*normals)[vertex + 0] = (*vertices)[vertex + 0] / radius; | |
| 95 (*normals)[vertex + 1] = (*vertices)[vertex + 1] / radius; | |
| 96 (*normals)[vertex + 2] = (*vertices)[vertex + 2] / radius; | |
| 97 } | |
| 98 | |
| 99 if ( texCoords ) | |
| 100 { | |
| 101 int texIndex = ( i * (numSlices + 1) + j ) * 2; | |
| 102 (*texCoords)[texIndex + 0] = (float) j / (float) numSlices; | |
| 103 (*texCoords)[texIndex + 1] = ( 1.0f - (float) i ) / (float) (numPara
llels - 1 ); | |
| 104 } | |
| 105 } | |
| 106 } | |
| 107 | |
| 108 // Generate the indices | |
| 109 if ( indices != NULL ) | |
| 110 { | |
| 111 GLuint *indexBuf = (*indices); | |
| 112 for ( i = 0; i < numParallels ; i++ ) | |
| 113 { | |
| 114 for ( j = 0; j < numSlices; j++ ) | |
| 115 { | |
| 116 *indexBuf++ = i * ( numSlices + 1 ) + j; | |
| 117 *indexBuf++ = ( i + 1 ) * ( numSlices + 1 ) + j; | |
| 118 *indexBuf++ = ( i + 1 ) * ( numSlices + 1 ) + ( j + 1 ); | |
| 119 | |
| 120 *indexBuf++ = i * ( numSlices + 1 ) + j; | |
| 121 *indexBuf++ = ( i + 1 ) * ( numSlices + 1 ) + ( j + 1 ); | |
| 122 *indexBuf++ = i * ( numSlices + 1 ) + ( j + 1 ); | |
| 123 } | |
| 124 } | |
| 125 } | |
| 126 | |
| 127 return numIndices; | |
| 128 } | |
| 129 | |
| 130 // | |
| 131 /// \brief Generates geometry for a cube. Allocates memory for the vertex data
and stores | |
| 132 /// the results in the arrays. Generate index list for a TRIANGLES | |
| 133 /// \param scale The size of the cube, use 1.0 for a unit cube. | |
| 134 /// \param vertices If not NULL, will contain array of float3 positions | |
| 135 /// \param normals If not NULL, will contain array of float3 normals | |
| 136 /// \param texCoords If not NULL, will contain array of float2 texCoords | |
| 137 /// \param indices If not NULL, will contain the array of indices for the triang
le strip | |
| 138 /// \return The number of indices required for rendering the buffers (the number
of indices stored in the indices array | |
| 139 /// if it is not NULL ) as a GL_TRIANGLE_STRIP | |
| 140 // | |
| 141 int esGenCube ( float scale, GLfloat **vertices, GLfloat **normals, | |
| 142 GLfloat **texCoords, GLuint **indices ) | |
| 143 { | |
| 144 int i; | |
| 145 int numVertices = 24; | |
| 146 int numIndices = 36; | |
| 147 | |
| 148 GLfloat cubeVerts[] = | |
| 149 { | |
| 150 -0.5f, -0.5f, -0.5f, | |
| 151 -0.5f, -0.5f, 0.5f, | |
| 152 0.5f, -0.5f, 0.5f, | |
| 153 0.5f, -0.5f, -0.5f, | |
| 154 -0.5f, 0.5f, -0.5f, | |
| 155 -0.5f, 0.5f, 0.5f, | |
| 156 0.5f, 0.5f, 0.5f, | |
| 157 0.5f, 0.5f, -0.5f, | |
| 158 -0.5f, -0.5f, -0.5f, | |
| 159 -0.5f, 0.5f, -0.5f, | |
| 160 0.5f, 0.5f, -0.5f, | |
| 161 0.5f, -0.5f, -0.5f, | |
| 162 -0.5f, -0.5f, 0.5f, | |
| 163 -0.5f, 0.5f, 0.5f, | |
| 164 0.5f, 0.5f, 0.5f, | |
| 165 0.5f, -0.5f, 0.5f, | |
| 166 -0.5f, -0.5f, -0.5f, | |
| 167 -0.5f, -0.5f, 0.5f, | |
| 168 -0.5f, 0.5f, 0.5f, | |
| 169 -0.5f, 0.5f, -0.5f, | |
| 170 0.5f, -0.5f, -0.5f, | |
| 171 0.5f, -0.5f, 0.5f, | |
| 172 0.5f, 0.5f, 0.5f, | |
| 173 0.5f, 0.5f, -0.5f, | |
| 174 }; | |
| 175 | |
| 176 GLfloat cubeNormals[] = | |
| 177 { | |
| 178 0.0f, -1.0f, 0.0f, | |
| 179 0.0f, -1.0f, 0.0f, | |
| 180 0.0f, -1.0f, 0.0f, | |
| 181 0.0f, -1.0f, 0.0f, | |
| 182 0.0f, 1.0f, 0.0f, | |
| 183 0.0f, 1.0f, 0.0f, | |
| 184 0.0f, 1.0f, 0.0f, | |
| 185 0.0f, 1.0f, 0.0f, | |
| 186 0.0f, 0.0f, -1.0f, | |
| 187 0.0f, 0.0f, -1.0f, | |
| 188 0.0f, 0.0f, -1.0f, | |
| 189 0.0f, 0.0f, -1.0f, | |
| 190 0.0f, 0.0f, 1.0f, | |
| 191 0.0f, 0.0f, 1.0f, | |
| 192 0.0f, 0.0f, 1.0f, | |
| 193 0.0f, 0.0f, 1.0f, | |
| 194 -1.0f, 0.0f, 0.0f, | |
| 195 -1.0f, 0.0f, 0.0f, | |
| 196 -1.0f, 0.0f, 0.0f, | |
| 197 -1.0f, 0.0f, 0.0f, | |
| 198 1.0f, 0.0f, 0.0f, | |
| 199 1.0f, 0.0f, 0.0f, | |
| 200 1.0f, 0.0f, 0.0f, | |
| 201 1.0f, 0.0f, 0.0f, | |
| 202 }; | |
| 203 | |
| 204 GLfloat cubeTex[] = | |
| 205 { | |
| 206 0.0f, 0.0f, | |
| 207 0.0f, 1.0f, | |
| 208 1.0f, 1.0f, | |
| 209 1.0f, 0.0f, | |
| 210 1.0f, 0.0f, | |
| 211 1.0f, 1.0f, | |
| 212 0.0f, 1.0f, | |
| 213 0.0f, 0.0f, | |
| 214 0.0f, 0.0f, | |
| 215 0.0f, 1.0f, | |
| 216 1.0f, 1.0f, | |
| 217 1.0f, 0.0f, | |
| 218 0.0f, 0.0f, | |
| 219 0.0f, 1.0f, | |
| 220 1.0f, 1.0f, | |
| 221 1.0f, 0.0f, | |
| 222 0.0f, 0.0f, | |
| 223 0.0f, 1.0f, | |
| 224 1.0f, 1.0f, | |
| 225 1.0f, 0.0f, | |
| 226 0.0f, 0.0f, | |
| 227 0.0f, 1.0f, | |
| 228 1.0f, 1.0f, | |
| 229 1.0f, 0.0f, | |
| 230 }; | |
| 231 | |
| 232 // Allocate memory for buffers | |
| 233 if ( vertices != NULL ) | |
| 234 { | |
| 235 *vertices = malloc ( sizeof(GLfloat) * 3 * numVertices ); | |
| 236 memcpy( *vertices, cubeVerts, sizeof( cubeVerts ) ); | |
| 237 for ( i = 0; i < numVertices; i++ ) | |
| 238 { | |
| 239 (*vertices)[i] *= scale; | |
| 240 } | |
| 241 } | |
| 242 | |
| 243 if ( normals != NULL ) | |
| 244 { | |
| 245 *normals = malloc ( sizeof(GLfloat) * 3 * numVertices ); | |
| 246 memcpy( *normals, cubeNormals, sizeof( cubeNormals ) ); | |
| 247 } | |
| 248 | |
| 249 if ( texCoords != NULL ) | |
| 250 { | |
| 251 *texCoords = malloc ( sizeof(GLfloat) * 2 * numVertices ); | |
| 252 memcpy( *texCoords, cubeTex, sizeof( cubeTex ) ) ; | |
| 253 } | |
| 254 | |
| 255 | |
| 256 // Generate the indices | |
| 257 if ( indices != NULL ) | |
| 258 { | |
| 259 GLuint cubeIndices[] = | |
| 260 { | |
| 261 0, 2, 1, | |
| 262 0, 3, 2, | |
| 263 4, 5, 6, | |
| 264 4, 6, 7, | |
| 265 8, 9, 10, | |
| 266 8, 10, 11, | |
| 267 12, 15, 14, | |
| 268 12, 14, 13, | |
| 269 16, 17, 18, | |
| 270 16, 18, 19, | |
| 271 20, 23, 22, | |
| 272 20, 22, 21 | |
| 273 }; | |
| 274 | |
| 275 *indices = malloc ( sizeof(GLuint) * numIndices ); | |
| 276 memcpy( *indices, cubeIndices, sizeof( cubeIndices ) ); | |
| 277 } | |
| 278 | |
| 279 return numIndices; | |
| 280 } | |
| OLD | NEW |