From 57efea40ee805c0916fd176ac0e6cb6fc15cf94a Mon Sep 17 00:00:00 2001 From: Mark Peng Date: Mon, 5 Aug 2013 19:52:02 -0700 Subject: [PATCH 1/9] Add untested renderHalfCylinder function to GeometryCache/ --- interface/src/renderer/GeometryCache.cpp | 68 ++++++++++++++++++++++++ interface/src/renderer/GeometryCache.h | 2 + 2 files changed, 70 insertions(+) diff --git a/interface/src/renderer/GeometryCache.cpp b/interface/src/renderer/GeometryCache.cpp index 8331a5deb9..07c383c1c1 100644 --- a/interface/src/renderer/GeometryCache.cpp +++ b/interface/src/renderer/GeometryCache.cpp @@ -163,3 +163,71 @@ void GeometryCache::renderSquare(int xDivisions, int yDivisions) { glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } + +void GeometryCache::renderHalfCylinder(int slices, int stacks, float radius, float height) { + VerticesIndices& vbo = _halfCylinderVBOs[IntPair(slices, stacks)]; + int vertices = slices * (stacks - 1) + 1; + int indices = slices * 2 * 3 * (stacks - 2) + slices * 3; + if (vbo.first == 0) { + GLfloat* vertexData = new GLfloat[vertices * 3]; + GLfloat* vertex = vertexData; + for (int i = 0; i < stacks; i++) { + float z = i * height / stacks; + + for (int j = 0; j < slices; j++) { + float theta = PIf * j / slices; + + *(vertex++) = sinf(theta) * radius; + *(vertex++) = cosf(theta) * radius; + *(vertex++) = z; + } + } + + glGenBuffers(1, &vbo.first); + glBindBuffer(GL_ARRAY_BUFFER, vbo.first); + const int BYTES_PER_VERTEX = 3 * sizeof(GLfloat); + glBufferData(GL_ARRAY_BUFFER, vertices * BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); + delete[] vertexData; + + GLushort* indexData = new GLushort[indices]; + GLushort* index = indexData; + for (int i = 0; i < stacks - 1; i++) { + GLushort bottom = i * slices; + GLushort top = bottom + slices; + for (int j = 0; j < slices; j++) { + int next = (j + 1) % slices; + + *(index++) = bottom + j; + *(index++) = top + next; + *(index++) = top + j; + + *(index++) = bottom + j; + *(index++) = bottom + next; + *(index++) = top + next; + } + } + + glGenBuffers(1, &vbo.second); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); + const int BYTES_PER_INDEX = sizeof(GLushort); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); + delete[] indexData; + + } else { + glBindBuffer(GL_ARRAY_BUFFER, vbo.first); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); + } + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + + glVertexPointer(3, GL_FLOAT, 0, 0); + glNormalPointer(GL_FLOAT, 0, 0); + + glDrawRangeElementsEXT(GL_TRIANGLES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); +} \ No newline at end of file diff --git a/interface/src/renderer/GeometryCache.h b/interface/src/renderer/GeometryCache.h index bfce642554..a0764db887 100644 --- a/interface/src/renderer/GeometryCache.h +++ b/interface/src/renderer/GeometryCache.h @@ -20,6 +20,7 @@ public: void renderHemisphere(int slices, int stacks); void renderSquare(int xDivisions, int yDivisions); + void renderHalfCylinder(int slices, int stacks, float radius, float height); private: @@ -28,6 +29,7 @@ private: QHash _hemisphereVBOs; QHash _squareVBOs; + QHash _halfCylinderVBOs; }; #endif /* defined(__interface__GeometryCache__) */ From 0cca60c03ef9dc4908f998dd2f7a8610637ac773 Mon Sep 17 00:00:00 2001 From: Hifi Test Account Date: Tue, 6 Aug 2013 09:51:57 -0700 Subject: [PATCH 2/9] Testing git. --- testing/testing | 1 + 1 file changed, 1 insertion(+) create mode 100644 testing/testing diff --git a/testing/testing b/testing/testing new file mode 100644 index 0000000000..038d718da6 --- /dev/null +++ b/testing/testing @@ -0,0 +1 @@ +testing From 25976f9313b3ba5a8762c7d236132255b1be38ae Mon Sep 17 00:00:00 2001 From: Mark Peng Date: Tue, 6 Aug 2013 10:13:59 -0700 Subject: [PATCH 3/9] Done testing git. --- testing/testing | 1 - 1 file changed, 1 deletion(-) delete mode 100644 testing/testing diff --git a/testing/testing b/testing/testing deleted file mode 100644 index 038d718da6..0000000000 --- a/testing/testing +++ /dev/null @@ -1 +0,0 @@ -testing From d725bcdbfff514499cc628bc9fede5a4d9709963 Mon Sep 17 00:00:00 2001 From: Hifi Test Account Date: Tue, 6 Aug 2013 18:09:51 -0700 Subject: [PATCH 4/9] Fix renderHalfCylinder so it only has 2 args now. --- interface/src/renderer/GeometryCache.cpp | 19 ++++++++++--------- interface/src/renderer/GeometryCache.h | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/interface/src/renderer/GeometryCache.cpp b/interface/src/renderer/GeometryCache.cpp index 07c383c1c1..309f1a9768 100644 --- a/interface/src/renderer/GeometryCache.cpp +++ b/interface/src/renderer/GeometryCache.cpp @@ -164,22 +164,23 @@ void GeometryCache::renderSquare(int xDivisions, int yDivisions) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } -void GeometryCache::renderHalfCylinder(int slices, int stacks, float radius, float height) { +void GeometryCache::renderHalfCylinder(int slices, int stacks) { VerticesIndices& vbo = _halfCylinderVBOs[IntPair(slices, stacks)]; - int vertices = slices * (stacks - 1) + 1; - int indices = slices * 2 * 3 * (stacks - 2) + slices * 3; + int vertices = (slices + 1) * stacks; + int indices = 2 * 3 * slices * (stacks - 1); if (vbo.first == 0) { GLfloat* vertexData = new GLfloat[vertices * 3]; GLfloat* vertex = vertexData; - for (int i = 0; i < stacks; i++) { - float z = i * height / stacks; + for (int i = 0; i <= (stacks - 1); i++) { + float y = (float)i / (stacks - 1); + float radius = 1.0f; - for (int j = 0; j < slices; j++) { + for (int j = 0; j <= slices; j++) { float theta = PIf * j / slices; *(vertex++) = sinf(theta) * radius; + *(vertex++) = y; *(vertex++) = cosf(theta) * radius; - *(vertex++) = z; } } @@ -192,8 +193,8 @@ void GeometryCache::renderHalfCylinder(int slices, int stacks, float radius, flo GLushort* indexData = new GLushort[indices]; GLushort* index = indexData; for (int i = 0; i < stacks - 1; i++) { - GLushort bottom = i * slices; - GLushort top = bottom + slices; + GLushort bottom = i * (slices + 1); + GLushort top = bottom + slices + 1; for (int j = 0; j < slices; j++) { int next = (j + 1) % slices; diff --git a/interface/src/renderer/GeometryCache.h b/interface/src/renderer/GeometryCache.h index a0764db887..f1e1ec4e34 100644 --- a/interface/src/renderer/GeometryCache.h +++ b/interface/src/renderer/GeometryCache.h @@ -20,7 +20,7 @@ public: void renderHemisphere(int slices, int stacks); void renderSquare(int xDivisions, int yDivisions); - void renderHalfCylinder(int slices, int stacks, float radius, float height); + void renderHalfCylinder(int slices, int stacks); private: From 05d933bf338b8ddd09fa4aa6c82c3846ed53859b Mon Sep 17 00:00:00 2001 From: Hifi Test Account Date: Tue, 6 Aug 2013 18:38:41 -0700 Subject: [PATCH 5/9] Successful static half cylinder backing. --- interface/src/avatar/Face.cpp | 4 ++++ interface/src/renderer/GeometryCache.cpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/Face.cpp b/interface/src/avatar/Face.cpp index 22ce3c0727..9050447d81 100644 --- a/interface/src/avatar/Face.cpp +++ b/interface/src/avatar/Face.cpp @@ -262,6 +262,10 @@ bool Face::render(float alpha) { xScale = FULL_FRAME_SCALE * _owningHead->getScale(); zScale = xScale * 0.3f; + glPushMatrix(); + glScalef(xScale / 12, xScale / (aspect * 3), zScale / 2); + Application::getInstance()->getGeometryCache()->renderHalfCylinder(25,20); + glPopMatrix(); } else { aspect = _aspectRatio; xScale = BODY_BALL_RADIUS_HEAD_BASE * _owningHead->getScale(); diff --git a/interface/src/renderer/GeometryCache.cpp b/interface/src/renderer/GeometryCache.cpp index 309f1a9768..2ab611a713 100644 --- a/interface/src/renderer/GeometryCache.cpp +++ b/interface/src/renderer/GeometryCache.cpp @@ -176,7 +176,7 @@ void GeometryCache::renderHalfCylinder(int slices, int stacks) { float radius = 1.0f; for (int j = 0; j <= slices; j++) { - float theta = PIf * j / slices; + float theta = 3 * PIf / 2 + PIf * j / slices; *(vertex++) = sinf(theta) * radius; *(vertex++) = y; From 988faeff54ab5cc82fd256cdcc0069218753b82b Mon Sep 17 00:00:00 2001 From: Hifi Test Account Date: Wed, 7 Aug 2013 10:14:35 -0700 Subject: [PATCH 6/9] Render static halfCylinder backing to face in full frame mode. --- interface/src/avatar/Face.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/avatar/Face.cpp b/interface/src/avatar/Face.cpp index 9050447d81..0e7e85a3dd 100644 --- a/interface/src/avatar/Face.cpp +++ b/interface/src/avatar/Face.cpp @@ -312,7 +312,7 @@ bool Face::render(float alpha) { glGenBuffers(1, &_iboID); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _iboID); int* indices = new int[INDEX_COUNT]; - int* indexPosition = indices; + int* indexPosition = indices; for (int i = 0; i < QUAD_HEIGHT; i++) { for (int j = 0; j < QUAD_WIDTH; j++) { *indexPosition++ = i * VERTEX_WIDTH + j; From 1e7dbbbccdcd09296d0ab05e5cd70bf3caaf8976 Mon Sep 17 00:00:00 2001 From: Hifi Test Account Date: Wed, 7 Aug 2013 12:07:41 -0700 Subject: [PATCH 7/9] Fix renderHalfCylinder so that normals are correct now. Add facePosition and faceRotation storage to Face class. --- interface/src/avatar/Face.cpp | 4 +++- interface/src/avatar/Face.h | 3 +++ interface/src/renderer/GeometryCache.cpp | 21 +++++++++++++-------- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/interface/src/avatar/Face.cpp b/interface/src/avatar/Face.cpp index 0e7e85a3dd..990dc17d99 100644 --- a/interface/src/avatar/Face.cpp +++ b/interface/src/avatar/Face.cpp @@ -63,6 +63,8 @@ void Face::setFrameFromWebcam() { _textureSize = webcam->getTextureSize(); _textureRect = webcam->getFaceRect(); _aspectRatio = webcam->getAspectRatio(); + _facePosition = webcam->getEstimatedPosition(); + _faceRotation = webcam->getEstimatedRotation(); } else { clearFrame(); @@ -264,7 +266,7 @@ bool Face::render(float alpha) { glPushMatrix(); glScalef(xScale / 12, xScale / (aspect * 3), zScale / 2); - Application::getInstance()->getGeometryCache()->renderHalfCylinder(25,20); + Application::getInstance()->getGeometryCache()->renderHalfCylinder(25, 20); glPopMatrix(); } else { aspect = _aspectRatio; diff --git a/interface/src/avatar/Face.h b/interface/src/avatar/Face.h index f3e681ff72..87fa629027 100644 --- a/interface/src/avatar/Face.h +++ b/interface/src/avatar/Face.h @@ -62,6 +62,9 @@ private: cv::RotatedRect _textureRect; float _aspectRatio; + glm::vec3 _facePosition; + glm::vec3 _faceRotation; + vpx_codec_ctx_t _colorCodec; vpx_codec_ctx_t _depthCodec; bool _lastFullFrame; diff --git a/interface/src/renderer/GeometryCache.cpp b/interface/src/renderer/GeometryCache.cpp index 2ab611a713..39d4c59b43 100644 --- a/interface/src/renderer/GeometryCache.cpp +++ b/interface/src/renderer/GeometryCache.cpp @@ -169,18 +169,23 @@ void GeometryCache::renderHalfCylinder(int slices, int stacks) { int vertices = (slices + 1) * stacks; int indices = 2 * 3 * slices * (stacks - 1); if (vbo.first == 0) { - GLfloat* vertexData = new GLfloat[vertices * 3]; + GLfloat* vertexData = new GLfloat[vertices * 2 * 3]; GLfloat* vertex = vertexData; for (int i = 0; i <= (stacks - 1); i++) { float y = (float)i / (stacks - 1); - float radius = 1.0f; for (int j = 0; j <= slices; j++) { float theta = 3 * PIf / 2 + PIf * j / slices; - *(vertex++) = sinf(theta) * radius; + //normals + *(vertex++) = sinf(theta); + *(vertex++) = 0; + *(vertex++) = cosf(theta); + + // vertices + *(vertex++) = sinf(theta); *(vertex++) = y; - *(vertex++) = cosf(theta) * radius; + *(vertex++) = cosf(theta); } } @@ -196,7 +201,7 @@ void GeometryCache::renderHalfCylinder(int slices, int stacks) { GLushort bottom = i * (slices + 1); GLushort top = bottom + slices + 1; for (int j = 0; j < slices; j++) { - int next = (j + 1) % slices; + int next = j + 1; *(index++) = bottom + j; *(index++) = top + next; @@ -220,9 +225,9 @@ void GeometryCache::renderHalfCylinder(int slices, int stacks) { } glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); - - glVertexPointer(3, GL_FLOAT, 0, 0); - glNormalPointer(GL_FLOAT, 0, 0); + + glNormalPointer(GL_FLOAT, 6 * sizeof(float), 0); + glVertexPointer(3, GL_FLOAT, 6 * sizeof(float), 3 * sizeof(float)); glDrawRangeElementsEXT(GL_TRIANGLES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); From 5f90e1a4e9fe7e2a3a64e9a2aa981898f0d7f6f5 Mon Sep 17 00:00:00 2001 From: Hifi Test Account Date: Wed, 7 Aug 2013 12:30:45 -0700 Subject: [PATCH 8/9] Fix the last commit. Remove compile error and increased buffer size to to account for the increased size of vertexData. --- interface/src/avatar/Face.cpp | 1 + interface/src/renderer/GeometryCache.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/src/avatar/Face.cpp b/interface/src/avatar/Face.cpp index 990dc17d99..3cd0d8be03 100644 --- a/interface/src/avatar/Face.cpp +++ b/interface/src/avatar/Face.cpp @@ -265,6 +265,7 @@ bool Face::render(float alpha) { zScale = xScale * 0.3f; glPushMatrix(); + glColor4f(1.0f, 1.0f, 1.0f, alpha); glScalef(xScale / 12, xScale / (aspect * 3), zScale / 2); Application::getInstance()->getGeometryCache()->renderHalfCylinder(25, 20); glPopMatrix(); diff --git a/interface/src/renderer/GeometryCache.cpp b/interface/src/renderer/GeometryCache.cpp index 39d4c59b43..adc4d98361 100644 --- a/interface/src/renderer/GeometryCache.cpp +++ b/interface/src/renderer/GeometryCache.cpp @@ -192,7 +192,7 @@ void GeometryCache::renderHalfCylinder(int slices, int stacks) { glGenBuffers(1, &vbo.first); glBindBuffer(GL_ARRAY_BUFFER, vbo.first); const int BYTES_PER_VERTEX = 3 * sizeof(GLfloat); - glBufferData(GL_ARRAY_BUFFER, vertices * BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, 2 * vertices * BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); delete[] vertexData; GLushort* indexData = new GLushort[indices]; @@ -227,7 +227,7 @@ void GeometryCache::renderHalfCylinder(int slices, int stacks) { glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer(GL_FLOAT, 6 * sizeof(float), 0); - glVertexPointer(3, GL_FLOAT, 6 * sizeof(float), 3 * sizeof(float)); + glVertexPointer(3, GL_FLOAT, (6 * sizeof(float)), (const void *)(3 * sizeof(float))); glDrawRangeElementsEXT(GL_TRIANGLES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); From cd8047b01abfda16785ab4dfc900fb4611863edf Mon Sep 17 00:00:00 2001 From: Hifi Test Account Date: Wed, 7 Aug 2013 13:54:38 -0700 Subject: [PATCH 9/9] Remove unused vars in Face class. --- interface/src/avatar/Face.cpp | 3 --- interface/src/avatar/Face.h | 3 --- 2 files changed, 6 deletions(-) diff --git a/interface/src/avatar/Face.cpp b/interface/src/avatar/Face.cpp index 3cd0d8be03..1949fa6c8c 100644 --- a/interface/src/avatar/Face.cpp +++ b/interface/src/avatar/Face.cpp @@ -63,9 +63,6 @@ void Face::setFrameFromWebcam() { _textureSize = webcam->getTextureSize(); _textureRect = webcam->getFaceRect(); _aspectRatio = webcam->getAspectRatio(); - _facePosition = webcam->getEstimatedPosition(); - _faceRotation = webcam->getEstimatedRotation(); - } else { clearFrame(); } diff --git a/interface/src/avatar/Face.h b/interface/src/avatar/Face.h index 87fa629027..1a68f8173e 100644 --- a/interface/src/avatar/Face.h +++ b/interface/src/avatar/Face.h @@ -61,9 +61,6 @@ private: cv::Size2f _textureSize; cv::RotatedRect _textureRect; float _aspectRatio; - - glm::vec3 _facePosition; - glm::vec3 _faceRotation; vpx_codec_ctx_t _colorCodec; vpx_codec_ctx_t _depthCodec;