History

Merge branch 'master' of https://github.com/highfidelity/hifi into applications_diet_cpp11

Atlante45 committed 11 years ago

Commit 327daac2 parents 296c002 fb15b0f107 files · +1333 −822Browse files

Showing the changes to libraries/render-utils/src/GeometryCache.cpp (1 of 107 files). Show all

Unified · Split

libraries/render-utils/src/GeometryCache.cpp+161−2
@@ -119,7 +119,7 @@ const int NUM_COORDS_PER_VERTEX = 3; · 118 unmodified lines
119const int NUM_BYTES_PER_VERTEX = NUM_COORDS_PER_VERTEX * sizeof(GLfloat);119const int NUM_BYTES_PER_VERTEX = NUM_COORDS_PER_VERTEX * sizeof(GLfloat);
120const int NUM_BYTES_PER_INDEX = sizeof(GLushort);120const int NUM_BYTES_PER_INDEX = sizeof(GLushort);
121 121
122void GeometryCache::renderSphere(float radius, int slices, int stacks) {122void GeometryCache::renderSphere(float radius, int slices, int stacks, bool solid) {
123 VerticesIndices& vbo = _sphereVBOs[IntPair(slices, stacks)];123 VerticesIndices& vbo = _sphereVBOs[IntPair(slices, stacks)];
124 int vertices = slices * (stacks - 1) + 2; 124 int vertices = slices * (stacks - 1) + 2;
125 int indices = slices * stacks * NUM_VERTICES_PER_TRIANGULATED_QUAD;125 int indices = slices * stacks * NUM_VERTICES_PER_TRIANGULATED_QUAD;
@@ -211,7 +211,11 @@ void GeometryCache::renderSphere(float radius, int slices, int stacks) { · 85 unmodified lines
211 211
212 glPushMatrix();212 glPushMatrix();
213 glScalef(radius, radius, radius);213 glScalef(radius, radius, radius);
214 glDrawRangeElementsEXT(GL_TRIANGLES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0);214 if (solid) {
215 glDrawRangeElementsEXT(GL_TRIANGLES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0);
216 } else {
217 glDrawRangeElementsEXT(GL_LINES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0);
218 }
215 glPopMatrix();219 glPopMatrix();
216 220
217 glDisableClientState(GL_VERTEX_ARRAY);221 glDisableClientState(GL_VERTEX_ARRAY);
@@ -503,6 +507,161 @@ void GeometryCache::renderGrid(int xDivisions, int yDivisions) { · 285 unmodified lines
503 buffer.release();507 buffer.release();
504}508}
505 509
510void GeometryCache::renderSolidCube(float size) {
511 VerticesIndices& vbo = _solidCubeVBOs[size];
512 const int FLOATS_PER_VERTEX = 3;
513 const int VERTICES_PER_FACE = 4;
514 const int NUMBER_OF_FACES = 6;
515 const int TRIANGLES_PER_FACE = 2;
516 const int VERTICES_PER_TRIANGLE = 3;
517 const int vertices = NUMBER_OF_FACES * VERTICES_PER_FACE * FLOATS_PER_VERTEX;
518 const int indices = NUMBER_OF_FACES * TRIANGLES_PER_FACE * VERTICES_PER_TRIANGLE;
519 const int vertexPoints = vertices * FLOATS_PER_VERTEX;
520 if (vbo.first == 0) {
521 GLfloat* vertexData = new GLfloat[vertexPoints * 2]; // vertices and normals
522 GLfloat* vertex = vertexData;
523 float halfSize = size / 2.0f;
524
525 static GLfloat cannonicalVertices[vertexPoints] =
526 { 1, 1, 1, -1, 1, 1, -1,-1, 1, 1,-1, 1, // v0,v1,v2,v3 (front)
527 1, 1, 1, 1,-1, 1, 1,-1,-1, 1, 1,-1, // v0,v3,v4,v5 (right)
528 1, 1, 1, 1, 1,-1, -1, 1,-1, -1, 1, 1, // v0,v5,v6,v1 (top)
529 -1, 1, 1, -1, 1,-1, -1,-1,-1, -1,-1, 1, // v1,v6,v7,v2 (left)
530 -1,-1,-1, 1,-1,-1, 1,-1, 1, -1,-1, 1, // v7,v4,v3,v2 (bottom)
531 1,-1,-1, -1,-1,-1, -1, 1,-1, 1, 1,-1 }; // v4,v7,v6,v5 (back)
532
533 // normal array
534 static GLfloat cannonicalNormals[vertexPoints] =
535 { 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, // v0,v1,v2,v3 (front)
536 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // v0,v3,v4,v5 (right)
537 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // v0,v5,v6,v1 (top)
538 -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, // v1,v6,v7,v2 (left)
539 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, // v7,v4,v3,v2 (bottom)
540 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1 }; // v4,v7,v6,v5 (back)
541
542 // index array of vertex array for glDrawElements() & glDrawRangeElement()
543 static GLubyte cannonicalIndices[indices] =
544 { 0, 1, 2, 2, 3, 0, // front
545 4, 5, 6, 6, 7, 4, // right
546 8, 9,10, 10,11, 8, // top
547 12,13,14, 14,15,12, // left
548 16,17,18, 18,19,16, // bottom
549 20,21,22, 22,23,20 }; // back
550
551
552
553 GLfloat* cannonicalVertex = &cannonicalVertices[0];
554 GLfloat* cannonicalNormal = &cannonicalNormals[0];
555
556 for (int i = 0; i < vertices; i++) {
557 //normals
558 *(vertex++) = *cannonicalNormal++;
559 *(vertex++) = *cannonicalNormal++;
560 *(vertex++) = *cannonicalNormal++;
561
562 // vertices
563 *(vertex++) = halfSize * *cannonicalVertex++;
564 *(vertex++) = halfSize * *cannonicalVertex++;
565 *(vertex++) = halfSize * *cannonicalVertex++;
566
567 }
568
569 glGenBuffers(1, &vbo.first);
570 glBindBuffer(GL_ARRAY_BUFFER, vbo.first);
571 glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW);
572 delete[] vertexData;
573
574 GLushort* indexData = new GLushort[indices];
575 GLushort* index = indexData;
576 for (int i = 0; i < indices; i++) {
577 index[i] = cannonicalIndices[i];
578 }
579
580 glGenBuffers(1, &vbo.second);
581 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second);
582 glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW);
583 delete[] indexData;
584
585 } else {
586 glBindBuffer(GL_ARRAY_BUFFER, vbo.first);
587 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second);
588 }
589 glEnableClientState(GL_VERTEX_ARRAY);
590 glEnableClientState(GL_NORMAL_ARRAY);
591
592 glNormalPointer(GL_FLOAT, 6 * sizeof(float), 0);
593 glVertexPointer(3, GL_FLOAT, (6 * sizeof(float)), (const void *)(3 * sizeof(float)));
594
595 glDrawRangeElementsEXT(GL_TRIANGLES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0);
596
597 glDisableClientState(GL_VERTEX_ARRAY);
598 glDisableClientState(GL_NORMAL_ARRAY);
599
600 glBindBuffer(GL_ARRAY_BUFFER, 0);
601 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
602}
603
604void GeometryCache::renderWireCube(float size) {
605 VerticesIndices& vbo = _wireCubeVBOs[size];
606 const int FLOATS_PER_VERTEX = 3;
607 const int VERTICES_PER_EDGE = 2;
608 const int TOP_EDGES = 4;
609 const int BOTTOM_EDGES = 4;
610 const int SIDE_EDGES = 4;
611 const int vertices = 8;
612 const int indices = (TOP_EDGES + BOTTOM_EDGES + SIDE_EDGES) * VERTICES_PER_EDGE;
613 if (vbo.first == 0) {
614 int vertexPoints = vertices * FLOATS_PER_VERTEX;
615 GLfloat* vertexData = new GLfloat[vertexPoints]; // only vertices, no normals because we're a wire cube
616 GLfloat* vertex = vertexData;
617 float halfSize = size / 2.0f;
618
619 static GLfloat cannonicalVertices[] =
620 { 1, 1, 1, 1, 1,-1, -1, 1,-1, -1, 1, 1, // v0, v1, v2, v3 (top)
621 1,-1, 1, 1,-1,-1, -1,-1,-1, -1,-1, 1 // v4, v5, v6, v7 (bottom)
622 };
623
624 // index array of vertex array for glDrawRangeElement() as a GL_LINES for each edge
625 static GLubyte cannonicalIndices[indices] = {
626 0, 1, 1, 2, 2, 3, 3, 0, // (top)
627 4, 5, 5, 6, 6, 7, 7, 4, // (bottom)
628 0, 4, 1, 5, 2, 6, 3, 7, // (side edges)
629 };
630
631 for (int i = 0; i < vertexPoints; i++) {
632 vertex[i] = cannonicalVertices[i] * halfSize;
633 }
634
635 glGenBuffers(1, &vbo.first);
636 glBindBuffer(GL_ARRAY_BUFFER, vbo.first);
637 glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW);
638 delete[] vertexData;
639
640 GLushort* indexData = new GLushort[indices];
641 GLushort* index = indexData;
642 for (int i = 0; i < indices; i++) {
643 index[i] = cannonicalIndices[i];
644 }
645
646 glGenBuffers(1, &vbo.second);
647 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second);
648 glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW);
649 delete[] indexData;
650
651 } else {
652 glBindBuffer(GL_ARRAY_BUFFER, vbo.first);
653 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second);
654 }
655 glEnableClientState(GL_VERTEX_ARRAY);
656 glVertexPointer(FLOATS_PER_VERTEX, GL_FLOAT, FLOATS_PER_VERTEX * sizeof(float), 0);
657 glDrawRangeElementsEXT(GL_LINES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0);
658 glDisableClientState(GL_VERTEX_ARRAY);
659
660 glBindBuffer(GL_ARRAY_BUFFER, 0);
661 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
662}
663
664
506QSharedPointer<NetworkGeometry> GeometryCache::getGeometry(const QUrl& url, const QUrl& fallback, bool delayLoad) {665QSharedPointer<NetworkGeometry> GeometryCache::getGeometry(const QUrl& url, const QUrl& fallback, bool delayLoad) {
507 return getResource(url, fallback, delayLoad).staticCast<NetworkGeometry>();666 return getResource(url, fallback, delayLoad).staticCast<NetworkGeometry>();
508}667}