575
581
if (!vertexBufferName)
577
583
glGenBuffers(1, &vertexBufferName);
585
if (needsVertexBufferUpdate)
578
587
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferName);
579
588
glBufferData(GL_ARRAY_BUFFER, _sizeofFormat(vertexFormat)*numVertices, _vertices, usageHint);
580
589
glBindBuffer(GL_ARRAY_BUFFER, 0);
584
glGenBuffers(1, &indexBufferName);
585
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferName);
586
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 2*numIndices, indices, usageHint);
587
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
590
needsVertexBufferUpdate = NO;
592
if (!indexBufferName && numIndices)
594
glGenBuffers(1, &indexBufferName);
596
if (indexBufferName && needsIndexBufferUpdate)
598
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferName);
599
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 2*numIndices, indices, usageHint);
600
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
601
needsIndexBufferUpdate = NO;
590
604
if (!vertexArrayObject && useVAO)
592
606
glGenVertexArraysOES(1, &vertexArrayObject);
604
618
- (void) convertTriangleIndicesToLines
606
uint16_t* tris = indices;
607
indices = calloc(sizeof(*indices), numIndices*2);
609
for (size_t i = 0; i < numIndices/3; ++i)
620
uint16_t* tris = NULL;
611
indices[6*i+0] = tris[3*i+0];
612
indices[6*i+1] = tris[3*i+1];
613
indices[6*i+2] = tris[3*i+1];
614
indices[6*i+3] = tris[3*i+2];
615
indices[6*i+4] = tris[3*i+2];
616
indices[6*i+5] = tris[3*i+0];
624
indices = calloc(sizeof(*indices), numIndices*2);
626
for (size_t i = 0; i < numIndices/3; ++i)
628
indices[6*i+0] = tris[3*i+0];
629
indices[6*i+1] = tris[3*i+1];
630
indices[6*i+2] = tris[3*i+1];
631
indices[6*i+3] = tris[3*i+2];
632
indices[6*i+4] = tris[3*i+2];
633
indices[6*i+5] = tris[3*i+0];
637
needsIndexBufferUpdate = YES;
622
641
- (void) convertPseudoQuadIndicesToLines
624
uint16_t* tris = indices;
625
indices = calloc(sizeof(*indices), numIndices*2);
627
for (size_t i = 0; i < numIndices/3; ++i)
643
uint16_t* tris = NULL;
629
indices[ii++] = tris[3*i+0];
630
indices[ii++] = tris[3*i+1];
631
indices[ii++] = tris[3*i+2];
632
indices[ii++] = tris[3*i+0];
647
indices = calloc(sizeof(*indices), numIndices*2);
649
for (size_t i = 0; i < numIndices/3; ++i)
651
indices[ii++] = tris[3*i+0];
652
indices[ii++] = tris[3*i+1];
653
indices[ii++] = tris[3*i+2];
654
indices[ii++] = tris[3*i+0];
658
needsIndexBufferUpdate = YES;
642
if (!vertexBufferName)
643
669
[self generateVBO];
647
glBindVertexArrayOES(vertexArrayObject);
651
[self setupArrayState];
654
if (!indexBufferName)
655
glDrawArrays(mode, 0, numVertices);
657
glDrawElements(mode, numIndices, GL_UNSIGNED_SHORT, (void*)0);
673
glBindVertexArrayOES(vertexArrayObject);
677
[self setupArrayState];
680
if (!indexBufferName)
681
glDrawArrays(mode, 0, numVertices);
683
glDrawElements(mode, numIndices, GL_UNSIGNED_SHORT, (void*)0);
661
688
glBindVertexArrayOES(0);
670
697
- (void) applyVertexTransform: (m16) m
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];
701
switch (vertexFormat)
703
case VA_FORMAT_POS3F_NORMAL3F_TEX2F:
705
PositionNormalTex3f3f2f* vertices = _vertices;
706
for (size_t i = 0; i < numVertices; ++i)
708
v3 v = {{vertices[i].pos[0], vertices[i].pos[1], vertices[i].pos[2]}};
709
v = mtransformpos3(m, v);
710
vertices[i].pos[0] = v.a[0];
711
vertices[i].pos[1] = v.a[1];
712
vertices[i].pos[2] = v.a[2];
717
case VA_FORMAT_POS3F_TEX2F:
719
PositionTex3f2f* vertices = _vertices;
720
for (size_t i = 0; i < numVertices; ++i)
722
v3 v = {{vertices[i].pos[0], vertices[i].pos[1], vertices[i].pos[2]}};
723
v = mtransformpos3(m, v);
724
vertices[i].pos[0] = v.a[0];
725
vertices[i].pos[1] = v.a[1];
726
vertices[i].pos[2] = v.a[2];
731
case VA_FORMAT_POS3F:
733
Position3f* vertices = _vertices;
734
for (size_t i = 0; i < numVertices; ++i)
736
v3 v = {{vertices[i].pos[0], vertices[i].pos[1], vertices[i].pos[2]}};
737
v = mtransformpos3(m, v);
738
vertices[i].pos[0] = v.a[0];
739
vertices[i].pos[1] = v.a[1];
740
vertices[i].pos[2] = v.a[2];
748
needsVertexBufferUpdate = YES;
719
if (vertexBufferName)
720
glDeleteBuffers(1, &vertexBufferName);
721
vertexBufferName = 0;
723
glDeleteBuffers(1, &indexBufferName);
727
752
- (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:
756
switch (vertexFormat)
758
case VA_FORMAT_POS3F_NORMAL3F_TEX2F:
760
PositionNormalTex3f3f2f* vertices = _vertices;
761
PositionTex3f2f* nvertices = calloc(sizeof(*nvertices),numVertices);
762
for (size_t i = 0; i < numVertices; ++i)
764
nvertices[i].pos[0] = vertices[i].pos[0];
765
nvertices[i].pos[1] = vertices[i].pos[1];
766
nvertices[i].pos[2] = vertices[i].pos[2];
767
nvertices[i].texcoord[0] = vertices[i].texcoord[0];
768
nvertices[i].texcoord[1] = vertices[i].texcoord[1];
771
_vertices = nvertices;
772
vertexFormat = VA_FORMAT_POS3F_TEX2F;
774
needsVertexBufferUpdate = YES;
777
case VA_FORMAT_POS3F_TEX2F:
781
case VA_FORMAT_POS3F:
760
if (vertexBufferName)
761
glDeleteBuffers(1, &vertexBufferName);
762
vertexBufferName = 0;
764
glDeleteBuffers(1, &indexBufferName);