41
41
@implementation VertexArray
43
static inline size_t _sizeofFormat(int format)
48
return sizeof(Position3f);
49
case VA_FORMAT_POS3F_TEX2F:
50
return sizeof(PositionTex3f2f);
51
case VA_FORMAT_POS3F_NORMAL3F_TEX2F:
52
return sizeof(PositionNormalTex3f3f2f);
58
- (size_t) sizeofFormat
60
return _sizeofFormat(vertexFormat);
43
63
+ (VertexArray*) coneWithFraction: (float) fraction
45
65
VertexArray* va = [[[VertexArray alloc] init] autorelease];
47
67
size_t divisions = 72;
49
71
va->numVertices = (divisions+1)*2;
50
va->vertices = malloc(va->numVertices*sizeof(*va->vertices));
72
PositionNormalTex3f3f2f* vertices = calloc(va->numVertices,sizeof(*vertices));
73
va->_vertices = vertices;
74
va->vertexFormat = VA_FORMAT_POS3F_NORMAL3F_TEX2F;
51
76
for (size_t i = 0; i <= divisions; ++i)
53
78
float t = (float)i/(float)divisions;
55
80
float sina = sinf(alpha);
56
81
float cosa = cosf(alpha);
58
va->vertices[2*i].pos[0] = cosa;
59
va->vertices[2*i].pos[1] = sina;
60
va->vertices[2*i].pos[2] = 0.0;
61
va->vertices[2*i+1].pos[0] = (1.0-fraction)*cosa;
62
va->vertices[2*i+1].pos[1] = (1.0-fraction)*sina;
63
va->vertices[2*i+1].pos[2] = fraction;
65
va->vertices[2*i].normal[0] = cosa*M_SQRT1_2;
66
va->vertices[2*i].normal[1] = sina*M_SQRT1_2;
67
va->vertices[2*i].normal[2] = M_SQRT1_2;
68
va->vertices[2*i+1].normal[0] = cosa*M_SQRT1_2;
69
va->vertices[2*i+1].normal[1] = sina*M_SQRT1_2;
70
va->vertices[2*i+1].normal[2] = M_SQRT1_2;
72
va->vertices[2*i].texcoord[0] = 1.0-t;
73
va->vertices[2*i].texcoord[1] = 0.0;
74
va->vertices[2*i+1].texcoord[0] = 1.0-t;
75
va->vertices[2*i+1].texcoord[1] = 1.0;
83
vertices[2*i].pos[0] = cosa;
84
vertices[2*i].pos[1] = sina;
85
vertices[2*i].pos[2] = 0.0;
86
vertices[2*i+1].pos[0] = (1.0-fraction)*cosa;
87
vertices[2*i+1].pos[1] = (1.0-fraction)*sina;
88
vertices[2*i+1].pos[2] = fraction;
90
vertices[2*i].normal[0] = cosa*M_SQRT1_2;
91
vertices[2*i].normal[1] = sina*M_SQRT1_2;
92
vertices[2*i].normal[2] = M_SQRT1_2;
93
vertices[2*i+1].normal[0] = cosa*M_SQRT1_2;
94
vertices[2*i+1].normal[1] = sina*M_SQRT1_2;
95
vertices[2*i+1].normal[2] = M_SQRT1_2;
97
vertices[2*i].texcoord[0] = 1.0-t;
98
vertices[2*i].texcoord[1] = 0.0;
99
vertices[2*i+1].texcoord[0] = 1.0-t;
100
vertices[2*i+1].texcoord[1] = 1.0;
78
103
va->mode = GL_TRIANGLE_STRIP;
100
128
float sina = sinf(alpha);
101
129
float cosa = cosf(alpha);
103
va->vertices[2*i].pos[0] = cosa;
104
va->vertices[2*i].pos[1] = sina;
105
va->vertices[2*i].pos[2] = 1.0;
106
va->vertices[2*i+1].pos[0] = cosa;
107
va->vertices[2*i+1].pos[1] = sina;
108
va->vertices[2*i+1].pos[2] = -1.0;
110
va->vertices[2*i].normal[0] = cosa;
111
va->vertices[2*i].normal[1] = sina;
112
va->vertices[2*i].normal[2] = 0.0;
113
va->vertices[2*i+1].normal[0] = cosa;
114
va->vertices[2*i+1].normal[1] = sina;
115
va->vertices[2*i+1].normal[2] = 0.0;
117
va->vertices[2*i].texcoord[0] = t;
118
va->vertices[2*i].texcoord[1] = 0.0;
119
va->vertices[2*i+1].texcoord[0] = t;
120
va->vertices[2*i+1].texcoord[1] = 1.0;
131
vertices[2*i].pos[0] = cosa;
132
vertices[2*i].pos[1] = sina;
133
vertices[2*i].pos[2] = 1.0;
134
vertices[2*i+1].pos[0] = cosa;
135
vertices[2*i+1].pos[1] = sina;
136
vertices[2*i+1].pos[2] = -1.0;
138
vertices[2*i].normal[0] = cosa;
139
vertices[2*i].normal[1] = sina;
140
vertices[2*i].normal[2] = 0.0;
141
vertices[2*i+1].normal[0] = cosa;
142
vertices[2*i+1].normal[1] = sina;
143
vertices[2*i+1].normal[2] = 0.0;
145
vertices[2*i].texcoord[0] = t;
146
vertices[2*i].texcoord[1] = 0.0;
147
vertices[2*i+1].texcoord[0] = t;
148
vertices[2*i+1].texcoord[1] = 1.0;
138
166
unsigned divisions = 72;
140
168
va->numVertices = (divisions+1) + 1;
141
va->vertices = malloc(va->numVertices*sizeof(*va->vertices));
169
PositionNormalTex3f3f2f* vertices = calloc(va->numVertices,sizeof(*vertices));
170
va->_vertices = vertices;
171
va->vertexFormat = VA_FORMAT_POS3F_NORMAL3F_TEX2F;
143
va->vertices->pos[0] = 0.0;
144
va->vertices->pos[1] = 0.0;
145
va->vertices->pos[2] = 0.0;
146
va->vertices->normal[0] = 0.0;
147
va->vertices->normal[1] = 0.0;
148
va->vertices->normal[2] = 1.0;
149
va->vertices->texcoord[0] = 0.5;
150
va->vertices->texcoord[1] = 0.5;
173
vertices->pos[0] = 0.0;
174
vertices->pos[1] = 0.0;
175
vertices->pos[2] = 0.0;
176
vertices->normal[0] = 0.0;
177
vertices->normal[1] = 0.0;
178
vertices->normal[2] = 1.0;
179
vertices->texcoord[0] = 0.5;
180
vertices->texcoord[1] = 0.5;
151
181
for (size_t i = 0; i <= divisions; ++i)
153
183
float t = (float)i/(float)divisions;
155
185
float sina = sinf(alpha);
156
186
float cosa = cosf(alpha);
158
va->vertices[i+1].pos[0] = cosa;
159
va->vertices[i+1].pos[1] = sina;
160
va->vertices[i+1].pos[2] = 0.0;
162
va->vertices[i+1].normal[0] = 0.0;
163
va->vertices[i+1].normal[1] = 0.0;
164
va->vertices[i+1].normal[2] = 1.0;
166
va->vertices[i+1].texcoord[0] = 0.5 + 0.5*cosa;
167
va->vertices[i+1].texcoord[1] = 0.5 - 0.5*sina;
188
vertices[i+1].pos[0] = cosa;
189
vertices[i+1].pos[1] = sina;
190
vertices[i+1].pos[2] = 0.0;
192
vertices[i+1].normal[0] = 0.0;
193
vertices[i+1].normal[1] = 0.0;
194
vertices[i+1].normal[2] = 1.0;
196
vertices[i+1].texcoord[0] = 0.5 + 0.5*cosa;
197
vertices[i+1].texcoord[1] = 0.5 - 0.5*sina;
185
215
va->numVertices = 4;
186
va->vertices = calloc(va->numVertices, sizeof(*va->vertices));
216
PositionNormalTex3f3f2f* vertices = calloc(va->numVertices, sizeof(*vertices));
217
va->_vertices = vertices;
218
va->vertexFormat = VA_FORMAT_POS3F_NORMAL3F_TEX2F;
221
va->indices = calloc(sizeof(*va->indices), va->numIndices);
222
for (size_t i = 0; i < 4; ++i)
188
va->vertices[0].pos[0] = 1.0;
189
va->vertices[0].pos[1] = -1.0;
190
va->vertices[0].normal[2] = 1.0;
191
va->vertices[0].texcoord[0] = 1.0;
192
va->vertices[0].texcoord[1] = 0.0;
193
va->vertices[1].pos[0] = 1.0;
194
va->vertices[1].pos[1] = 1.0;
195
va->vertices[1].normal[2] = 1.0;
196
va->vertices[1].texcoord[0] = 1.0;
197
va->vertices[1].texcoord[1] = 1.0;
198
va->vertices[3].pos[0] = -1.0;
199
va->vertices[3].pos[1] = 1.0;
200
va->vertices[3].normal[2] = 1.0;
201
va->vertices[3].texcoord[0] = 0.0;
202
va->vertices[3].texcoord[1] = 1.0;
203
va->vertices[2].pos[0] = -1.0;
204
va->vertices[2].pos[1] = -1.0;
205
va->vertices[2].normal[2] = 1.0;
206
va->vertices[2].texcoord[0] = 0.0;
207
va->vertices[2].texcoord[1] = 0.0;
226
vertices[0].pos[0] = 1.0;
227
vertices[0].pos[1] = -1.0;
228
vertices[0].normal[2] = 1.0;
229
vertices[0].texcoord[0] = 1.0;
230
vertices[0].texcoord[1] = 0.0;
231
vertices[1].pos[0] = 1.0;
232
vertices[1].pos[1] = 1.0;
233
vertices[1].normal[2] = 1.0;
234
vertices[1].texcoord[0] = 1.0;
235
vertices[1].texcoord[1] = 1.0;
236
vertices[3].pos[0] = -1.0;
237
vertices[3].pos[1] = 1.0;
238
vertices[3].normal[2] = 1.0;
239
vertices[3].texcoord[0] = 0.0;
240
vertices[3].texcoord[1] = 1.0;
241
vertices[2].pos[0] = -1.0;
242
vertices[2].pos[1] = -1.0;
243
vertices[2].normal[2] = 1.0;
244
vertices[2].texcoord[0] = 0.0;
245
vertices[2].texcoord[1] = 0.0;
210
248
va->mode = GL_TRIANGLE_STRIP;
242
282
float sinj = sinf(aj);
243
283
float cosj = cosf(aj);
245
va->vertices[i*soff + j].pos[0] = sinj*cosi;
246
va->vertices[i*soff + j].pos[1] = sinj*sini;
247
va->vertices[i*soff + j].pos[2] = cosj;
249
va->vertices[i*soff + j].normal[0] = sinj*cosi;
250
va->vertices[i*soff + j].normal[1] = sinj*sini;
251
va->vertices[i*soff + j].normal[2] = cosj;
253
va->vertices[i*soff + j].texcoord[0] = ti;
254
va->vertices[i*soff + j].texcoord[1] = tj;
285
vertices[i*soff + j].pos[0] = sinj*cosi;
286
vertices[i*soff + j].pos[1] = sinj*sini;
287
vertices[i*soff + j].pos[2] = cosj;
289
vertices[i*soff + j].normal[0] = sinj*cosi;
290
vertices[i*soff + j].normal[1] = sinj*sini;
291
vertices[i*soff + j].normal[2] = cosj;
293
vertices[i*soff + j].texcoord[0] = ti;
294
vertices[i*soff + j].texcoord[1] = tj;
258
298
va->numIndices = (londivisions)*(latdivisions+1)*2;
259
va->indices = malloc(2*va->numIndices);
299
va->indices = calloc(2*va->numIndices,sizeof(*va->indices));
261
301
uint16_t* indices = va->indices;
312
354
float sinj = sinf(aj);
313
355
float cosj = cosf(aj);
315
va->vertices[i*soff + j].pos[0] = sinj*cosi;
316
va->vertices[i*soff + j].pos[1] = sinj*sini;
317
va->vertices[i*soff + j].pos[2] = cosj;
319
va->vertices[i*soff + j].normal[0] = sinj*cosi;
320
va->vertices[i*soff + j].normal[1] = sinj*sini;
321
va->vertices[i*soff + j].normal[2] = cosj;
323
va->vertices[i*soff + j].texcoord[0] = ti;
324
va->vertices[i*soff + j].texcoord[1] = tj;
357
vertices[i*soff + j].pos[0] = sinj*cosi;
358
vertices[i*soff + j].pos[1] = sinj*sini;
359
vertices[i*soff + j].pos[2] = cosj;
361
vertices[i*soff + j].normal[0] = sinj*cosi;
362
vertices[i*soff + j].normal[1] = sinj*sini;
363
vertices[i*soff + j].normal[2] = cosj;
365
vertices[i*soff + j].texcoord[0] = ti;
366
vertices[i*soff + j].texcoord[1] = tj;
328
370
va->numIndices = (londivisions)*(latdivisions+1)*2;
329
va->indices = malloc(2*va->numIndices);
371
va->indices = calloc(2*va->numIndices,sizeof(*va->indices));
331
373
uint16_t* indices = va->indices;
408
451
usageHint = [coder decodeIntegerForKey: @"usageHint"];
409
452
mode = [coder decodeIntegerForKey: @"mode"];
453
vertexFormat = [coder decodeIntegerForKey: @"vertexFormat"];
410
454
numVertices = [coder decodeIntegerForKey: @"numVertices"];
411
455
numIndices = [coder decodeIntegerForKey: @"numIndices"];
413
vertices = malloc(sizeof(*vertices)*numVertices);
414
indices = malloc(sizeof(*indices)*numIndices);
457
_vertices = calloc(_sizeofFormat(vertexFormat),numVertices);
458
indices = calloc(sizeof(*indices),numIndices);
416
memcpy(vertices, [[coder decodeObjectForKey: @"vertices"] bytes], sizeof(*vertices)*numVertices);
460
memcpy(_vertices, [[coder decodeObjectForKey: @"vertices"] bytes], _sizeofFormat(vertexFormat)*numVertices);
417
461
memcpy(indices, [[coder decodeObjectForKey: @"indices"] bytes], sizeof(*indices)*numIndices);
419
463
float osVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
441
486
if (indexBufferName)
442
487
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferName);
489
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
444
491
EAGLRenderingAPI api = [[EAGLContext currentContext] API];
448
495
case kEAGLRenderingAPIOpenGLES2:
449
glVertexAttribPointer(POSITION_ATTRIB_INDEX, 3, GL_FLOAT, GL_FALSE, sizeof(PositionNormalTex3f3f2f), (void*)offsetof(PositionNormalTex3f3f2f,pos));
450
glVertexAttribPointer(NORMAL_ATTRIB_INDEX, 3, GL_FLOAT, GL_FALSE, sizeof(PositionNormalTex3f3f2f), (void*)offsetof(PositionNormalTex3f3f2f,normal));
451
glVertexAttribPointer(TEXCOORD_ATTRIB_INDEX, 2, GL_FLOAT, GL_FALSE, sizeof(PositionNormalTex3f3f2f), (void*)offsetof(PositionNormalTex3f3f2f,texcoord));
453
glEnableVertexAttribArray(POSITION_ATTRIB_INDEX);
454
glEnableVertexAttribArray(NORMAL_ATTRIB_INDEX);
455
glEnableVertexAttribArray(TEXCOORD_ATTRIB_INDEX);
496
switch (vertexFormat)
498
case VA_FORMAT_POS3F_NORMAL3F_TEX2F:
499
glVertexAttribPointer(POSITION_ATTRIB_INDEX, 3, GL_FLOAT, GL_FALSE, sizeof(PositionNormalTex3f3f2f), (void*)offsetof(PositionNormalTex3f3f2f,pos));
500
glVertexAttribPointer(NORMAL_ATTRIB_INDEX, 3, GL_FLOAT, GL_FALSE, sizeof(PositionNormalTex3f3f2f), (void*)offsetof(PositionNormalTex3f3f2f,normal));
501
glVertexAttribPointer(TEXCOORD_ATTRIB_INDEX, 2, GL_FLOAT, GL_FALSE, sizeof(PositionNormalTex3f3f2f), (void*)offsetof(PositionNormalTex3f3f2f,texcoord));
503
glEnableVertexAttribArray(POSITION_ATTRIB_INDEX);
504
glEnableVertexAttribArray(NORMAL_ATTRIB_INDEX);
505
glEnableVertexAttribArray(TEXCOORD_ATTRIB_INDEX);
508
case VA_FORMAT_POS3F_TEX2F:
509
glVertexAttribPointer(POSITION_ATTRIB_INDEX, 3, GL_FLOAT, GL_FALSE, sizeof(PositionTex3f2f), (void*)offsetof(PositionTex3f2f,pos));
510
glVertexAttribPointer(TEXCOORD_ATTRIB_INDEX, 2, GL_FLOAT, GL_FALSE, sizeof(PositionTex3f2f), (void*)offsetof(PositionTex3f2f,texcoord));
512
glEnableVertexAttribArray(POSITION_ATTRIB_INDEX);
513
glDisableVertexAttribArray(NORMAL_ATTRIB_INDEX);
514
glEnableVertexAttribArray(TEXCOORD_ATTRIB_INDEX);
517
case VA_FORMAT_POS3F:
518
glVertexAttribPointer(POSITION_ATTRIB_INDEX, 3, GL_FLOAT, GL_FALSE, sizeof(Position3f), (void*)offsetof(Position3f,pos));
520
glEnableVertexAttribArray(POSITION_ATTRIB_INDEX);
521
glDisableVertexAttribArray(NORMAL_ATTRIB_INDEX);
522
glDisableVertexAttribArray(TEXCOORD_ATTRIB_INDEX);
459
530
case kEAGLRenderingAPIOpenGLES1:
460
glNormalPointer(GL_FLOAT, sizeof(PositionNormalTex3f3f2f), (void*)offsetof(PositionNormalTex3f3f2f,normal));
461
glTexCoordPointer(3, GL_FLOAT, sizeof(PositionNormalTex3f3f2f), (void*)offsetof(PositionNormalTex3f3f2f,texcoord));
462
glVertexPointer(3, GL_FLOAT, sizeof(PositionNormalTex3f3f2f), (void*)offsetof(PositionNormalTex3f3f2f,pos));
464
glEnableClientState(GL_VERTEX_ARRAY);
465
glEnableClientState(GL_NORMAL_ARRAY);
466
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
531
switch (vertexFormat)
533
case VA_FORMAT_POS3F_NORMAL3F_TEX2F:
534
glNormalPointer(GL_FLOAT, sizeof(PositionNormalTex3f3f2f), (void*)offsetof(PositionNormalTex3f3f2f,normal));
535
glTexCoordPointer(2, GL_FLOAT, sizeof(PositionNormalTex3f3f2f), (void*)offsetof(PositionNormalTex3f3f2f,texcoord));
536
glVertexPointer(3, GL_FLOAT, sizeof(PositionNormalTex3f3f2f), (void*)offsetof(PositionNormalTex3f3f2f,pos));
538
glEnableClientState(GL_VERTEX_ARRAY);
539
glEnableClientState(GL_NORMAL_ARRAY);
540
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
543
case VA_FORMAT_POS3F_TEX2F:
544
glTexCoordPointer(2, GL_FLOAT, sizeof(PositionTex3f2f), (void*)offsetof(PositionTex3f2f,texcoord));
545
glVertexPointer(3, GL_FLOAT, sizeof(PositionTex3f2f), (void*)offsetof(PositionTex3f2f,pos));
547
glEnableClientState(GL_VERTEX_ARRAY);
548
glDisableClientState(GL_NORMAL_ARRAY);
549
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
552
case VA_FORMAT_POS3F:
553
glVertexPointer(3, GL_FLOAT, sizeof(Position3f), (void*)offsetof(Position3f,pos));
555
glEnableClientState(GL_VERTEX_ARRAY);
556
glDisableClientState(GL_NORMAL_ARRAY);
557
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
483
577
glGenBuffers(1, &vertexBufferName);
484
578
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferName);
485
glBufferData(GL_ARRAY_BUFFER, sizeof(*vertices)*numVertices, vertices, usageHint);
579
glBufferData(GL_ARRAY_BUFFER, _sizeofFormat(vertexFormat)*numVertices, _vertices, usageHint);
580
glBindBuffer(GL_ARRAY_BUFFER, 0);
489
584
glGenBuffers(1, &indexBufferName);
490
585
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferName);
491
586
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 2*numIndices, indices, usageHint);
587
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
494
590
if (!vertexArrayObject && useVAO)
574
670
- (void) applyVertexTransform: (m16) m
576
for (size_t i = 0; i < numVertices; ++i)
578
v3 v = {{vertices[i].pos[0], vertices[i].pos[1], vertices[i].pos[2]}};
579
v = mtransformpos3(m, v);
580
vertices[i].pos[0] = v.a[0];
581
vertices[i].pos[1] = v.a[1];
582
vertices[i].pos[2] = v.a[2];
672
switch (vertexFormat)
674
case VA_FORMAT_POS3F_NORMAL3F_TEX2F:
676
PositionNormalTex3f3f2f* vertices = _vertices;
677
for (size_t i = 0; i < numVertices; ++i)
679
v3 v = {{vertices[i].pos[0], vertices[i].pos[1], vertices[i].pos[2]}};
680
v = mtransformpos3(m, v);
681
vertices[i].pos[0] = v.a[0];
682
vertices[i].pos[1] = v.a[1];
683
vertices[i].pos[2] = v.a[2];
688
case VA_FORMAT_POS3F_TEX2F:
690
PositionTex3f2f* vertices = _vertices;
691
for (size_t i = 0; i < numVertices; ++i)
693
v3 v = {{vertices[i].pos[0], vertices[i].pos[1], vertices[i].pos[2]}};
694
v = mtransformpos3(m, v);
695
vertices[i].pos[0] = v.a[0];
696
vertices[i].pos[1] = v.a[1];
697
vertices[i].pos[2] = v.a[2];
702
case VA_FORMAT_POS3F:
704
Position3f* vertices = _vertices;
705
for (size_t i = 0; i < numVertices; ++i)
707
v3 v = {{vertices[i].pos[0], vertices[i].pos[1], vertices[i].pos[2]}};
708
v = mtransformpos3(m, v);
709
vertices[i].pos[0] = v.a[0];
710
vertices[i].pos[1] = v.a[1];
711
vertices[i].pos[2] = v.a[2];
719
if (vertexBufferName)
720
glDeleteBuffers(1, &vertexBufferName);
721
vertexBufferName = 0;
723
glDeleteBuffers(1, &indexBufferName);
727
- (void) disposeOfNormals
729
switch (vertexFormat)
731
case VA_FORMAT_POS3F_NORMAL3F_TEX2F:
733
PositionNormalTex3f3f2f* vertices = _vertices;
734
PositionTex3f2f* nvertices = calloc(_sizeofFormat(VA_FORMAT_POS3F_TEX2F),numVertices);
735
for (size_t i = 0; i < numVertices; ++i)
737
nvertices[i].pos[0] = vertices[i].pos[0];
738
nvertices[i].pos[1] = vertices[i].pos[1];
739
nvertices[i].pos[2] = vertices[i].pos[2];
740
nvertices[i].texcoord[0] = vertices[i].texcoord[0];
741
nvertices[i].texcoord[1] = vertices[i].texcoord[1];
744
_vertices = nvertices;
745
vertexFormat = VA_FORMAT_POS3F_TEX2F;
749
case VA_FORMAT_POS3F_TEX2F:
753
case VA_FORMAT_POS3F:
585
760
if (vertexBufferName)
586
761
glDeleteBuffers(1, &vertexBufferName);
587
762
vertexBufferName = 0;