From 43734bf0f9fa8531b817943756157a2c459886a8 Mon Sep 17 00:00:00 2001 From: Wim Vriend Date: Mon, 28 Mar 2011 21:15:30 +0000 Subject: Added the display for the output-pose, with the 'man in black'. git-svn-id: svn+ssh://svn.code.sf.net/p/facetracknoir/code@59 19e81ba0-9b1a-49c3-bd6c-561e1906d5fb --- FTNoIR_PoseWidget/PoseWidget.qrc | 10 ++ FTNoIR_PoseWidget/glwidget.cpp | 210 +++++++++++++++++++++++++++++++++++++ FTNoIR_PoseWidget/glwidget.h | 72 +++++++++++++ FTNoIR_PoseWidget/images/side1.bmp | Bin 0 -> 44950 bytes FTNoIR_PoseWidget/images/side1.png | Bin 0 -> 9018 bytes FTNoIR_PoseWidget/images/side2.png | Bin 0 -> 2922 bytes FTNoIR_PoseWidget/images/side3.png | Bin 0 -> 2922 bytes FTNoIR_PoseWidget/images/side4.png | Bin 0 -> 2922 bytes FTNoIR_PoseWidget/images/side5.png | Bin 0 -> 2922 bytes FTNoIR_PoseWidget/images/side6.png | Bin 0 -> 4768 bytes 10 files changed, 292 insertions(+) create mode 100644 FTNoIR_PoseWidget/PoseWidget.qrc create mode 100644 FTNoIR_PoseWidget/glwidget.cpp create mode 100644 FTNoIR_PoseWidget/glwidget.h create mode 100644 FTNoIR_PoseWidget/images/side1.bmp create mode 100644 FTNoIR_PoseWidget/images/side1.png create mode 100644 FTNoIR_PoseWidget/images/side2.png create mode 100644 FTNoIR_PoseWidget/images/side3.png create mode 100644 FTNoIR_PoseWidget/images/side4.png create mode 100644 FTNoIR_PoseWidget/images/side5.png create mode 100644 FTNoIR_PoseWidget/images/side6.png (limited to 'FTNoIR_PoseWidget') diff --git a/FTNoIR_PoseWidget/PoseWidget.qrc b/FTNoIR_PoseWidget/PoseWidget.qrc new file mode 100644 index 00000000..65038eba --- /dev/null +++ b/FTNoIR_PoseWidget/PoseWidget.qrc @@ -0,0 +1,10 @@ + + + images/side1.png + images/side2.png + images/side3.png + images/side4.png + images/side5.png + images/side6.png + + diff --git a/FTNoIR_PoseWidget/glwidget.cpp b/FTNoIR_PoseWidget/glwidget.cpp new file mode 100644 index 00000000..55b65619 --- /dev/null +++ b/FTNoIR_PoseWidget/glwidget.cpp @@ -0,0 +1,210 @@ +/******************************************************************************** +* FaceTrackNoIR This program is a private project of the some enthusiastic * +* gamers from Holland, who don't like to pay much for * +* head-tracking. * +* * +* Copyright (C) 2010 Wim Vriend (Developing) * +* Ron Hendriks (Researching and Testing) * +* * +* Homepage * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU General Public License as published by the * +* Free Software Foundation; either version 3 of the License, or (at your * +* option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but * +* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * +* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * +* more details. * +* * +* Adopted this widget from the 'textures' sample of the Nokia Qt toolkit. * +* * +* You should have received a copy of the GNU General Public License along * +* with this program; if not, see . * +*********************************************************************************/ + +#include +#include + +#include "glwidget.h" + +GLWidget::GLWidget(QWidget *parent, QGLWidget *shareWidget) + : QGLWidget(parent, shareWidget) +{ + clearColor = Qt::black; + xRot = 0; + yRot = 0; + zRot = 0; + +#ifdef QT_OPENGL_ES_2 + program = 0; +#endif +} + +GLWidget::~GLWidget() +{ +} + +QSize GLWidget::minimumSizeHint() const +{ + return QSize(60, 60); +} + +QSize GLWidget::sizeHint() const +{ + return QSize(90, 90); +} + +void GLWidget::rotateBy(int xAngle, int yAngle, int zAngle) +{ + xRot = xAngle; + yRot = yAngle; + zRot = zAngle; + updateGL(); +} + +void GLWidget::setClearColor(const QColor &color) +{ + clearColor = color; + updateGL(); +} + +void GLWidget::initializeGL() +{ + makeObject(); + + glEnable(GL_DEPTH_TEST); + glEnable(GL_CULL_FACE); +#ifndef QT_OPENGL_ES_2 + glEnable(GL_TEXTURE_2D); +#endif + +#ifdef QT_OPENGL_ES_2 + +#define PROGRAM_VERTEX_ATTRIBUTE 0 +#define PROGRAM_TEXCOORD_ATTRIBUTE 1 + + QGLShader *vshader = new QGLShader(QGLShader::Vertex, this); + const char *vsrc = + "attribute highp vec4 vertex;\n" + "attribute mediump vec4 texCoord;\n" + "varying mediump vec4 texc;\n" + "uniform mediump mat4 matrix;\n" + "void main(void)\n" + "{\n" + " gl_Position = matrix * vertex;\n" + " texc = texCoord;\n" + "}\n"; + vshader->compileSourceCode(vsrc); + + QGLShader *fshader = new QGLShader(QGLShader::Fragment, this); + const char *fsrc = + "uniform sampler2D texture;\n" + "varying mediump vec4 texc;\n" + "void main(void)\n" + "{\n" + " gl_FragColor = texture2D(texture, texc.st);\n" + "}\n"; + fshader->compileSourceCode(fsrc); + + program = new QGLShaderProgram(this); + program->addShader(vshader); + program->addShader(fshader); + program->bindAttributeLocation("vertex", PROGRAM_VERTEX_ATTRIBUTE); + program->bindAttributeLocation("texCoord", PROGRAM_TEXCOORD_ATTRIBUTE); + program->link(); + + program->bind(); + program->setUniformValue("texture", 0); + +#endif +} + +void GLWidget::paintGL() +{ + qglClearColor(clearColor); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + +#if !defined(QT_OPENGL_ES_2) + + glLoadIdentity(); + glTranslatef(0.0f, 0.0f, -10.0f); + + glRotatef(xRot, 1.0f, 0.0f, 0.0f); + glRotatef(yRot, 0.0f, 1.0f, 0.0f); + glRotatef(-1.0f * zRot, 0.0f, 0.0f, 1.0f); + + glVertexPointer(3, GL_FLOAT, 0, vertices.constData()); + glTexCoordPointer(2, GL_FLOAT, 0, texCoords.constData()); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + +#else + + QMatrix4x4 m; + m.ortho(-0.5f, +0.5f, +0.5f, -0.5f, 4.0f, 15.0f); + m.translate(0.0f, 0.0f, -10.0f); + m.rotate(xRot / 16.0f, 1.0f, 0.0f, 0.0f); + m.rotate(yRot / 16.0f, 0.0f, 1.0f, 0.0f); + m.rotate(zRot / 16.0f, 0.0f, 0.0f, 1.0f); + + program->setUniformValue("matrix", m); + program->enableAttributeArray(PROGRAM_VERTEX_ATTRIBUTE); + program->enableAttributeArray(PROGRAM_TEXCOORD_ATTRIBUTE); + program->setAttributeArray + (PROGRAM_VERTEX_ATTRIBUTE, vertices.constData()); + program->setAttributeArray + (PROGRAM_TEXCOORD_ATTRIBUTE, texCoords.constData()); + +#endif + + for (int i = 0; i < 6; ++i) { + glBindTexture(GL_TEXTURE_2D, textures[i]); + glDrawArrays(GL_TRIANGLE_FAN, i * 4, 4); + } +} + +void GLWidget::resizeGL(int width, int height) +{ + int side = qMin(width, height); + glViewport((width - side) / 2, (height - side) / 2, side, side); + +#if !defined(QT_OPENGL_ES_2) + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); +#ifndef QT_OPENGL_ES + glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0); +#else + glOrthof(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0); +#endif + glMatrixMode(GL_MODELVIEW); +#endif +} + +void GLWidget::makeObject() +{ + static const int coords[6][4][3] = { + { { +1, -1, -1 }, { -1, -1, -1 }, { -1, +1, -1 }, { +1, +1, -1 } }, + { { +1, +1, -1 }, { -1, +1, -1 }, { -1, +1, +1 }, { +1, +1, +1 } }, + { { +1, -1, +1 }, { +1, -1, -1 }, { +1, +1, -1 }, { +1, +1, +1 } }, + { { -1, -1, -1 }, { -1, -1, +1 }, { -1, +1, +1 }, { -1, +1, -1 } }, + { { +1, -1, +1 }, { -1, -1, +1 }, { -1, -1, -1 }, { +1, -1, -1 } }, + { { -1, -1, +1 }, { +1, -1, +1 }, { +1, +1, +1 }, { -1, +1, +1 } } + }; + + for (int j=0; j < 6; ++j) { + textures[j] = bindTexture + (QPixmap(QString(":/images/side%1.png").arg(j + 1)), GL_TEXTURE_2D); + } + + for (int i = 0; i < 6; ++i) { + for (int j = 0; j < 4; ++j) { + texCoords.append + (QVector2D(j == 0 || j == 3, j == 0 || j == 1)); + vertices.append + (QVector3D(0.4 * coords[i][j][0], 0.4 * coords[i][j][1], + 0.02 * coords[i][j][2])); + } + } +} diff --git a/FTNoIR_PoseWidget/glwidget.h b/FTNoIR_PoseWidget/glwidget.h new file mode 100644 index 00000000..cff8cb83 --- /dev/null +++ b/FTNoIR_PoseWidget/glwidget.h @@ -0,0 +1,72 @@ +/******************************************************************************** +* FaceTrackNoIR This program is a private project of the some enthusiastic * +* gamers from Holland, who don't like to pay much for * +* head-tracking. * +* * +* Copyright (C) 2010 Wim Vriend (Developing) * +* Ron Hendriks (Researching and Testing) * +* * +* Homepage * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU General Public License as published by the * +* Free Software Foundation; either version 3 of the License, or (at your * +* option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but * +* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * +* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * +* more details. * +* * +* Adopted this widget from the 'textures' sample of the Nokia Qt toolkit. * +* * +* You should have received a copy of the GNU General Public License along * +* with this program; if not, see . * +*********************************************************************************/ + +#ifndef GLWIDGET_H +#define GLWIDGET_H + +#include +#include + +class QGLShaderProgram; + +class GLWidget : public QGLWidget +{ + Q_OBJECT + +public: + GLWidget(QWidget *parent = 0, QGLWidget *shareWidget = 0); + ~GLWidget(); + + QSize minimumSizeHint() const; + QSize sizeHint() const; + void rotateBy(int xAngle, int yAngle, int zAngle); + void setClearColor(const QColor &color); + +signals: + void clicked(); + +protected: + void initializeGL(); + void paintGL(); + void resizeGL(int width, int height); + +private: + void makeObject(); + + QColor clearColor; + QPoint lastPos; + int xRot; + int yRot; + int zRot; + GLuint textures[6]; + QVector vertices; + QVector texCoords; +#ifdef QT_OPENGL_ES_2 + QGLShaderProgram *program; +#endif +}; + +#endif diff --git a/FTNoIR_PoseWidget/images/side1.bmp b/FTNoIR_PoseWidget/images/side1.bmp new file mode 100644 index 00000000..29c28d80 Binary files /dev/null and b/FTNoIR_PoseWidget/images/side1.bmp differ diff --git a/FTNoIR_PoseWidget/images/side1.png b/FTNoIR_PoseWidget/images/side1.png new file mode 100644 index 00000000..e0315b77 Binary files /dev/null and b/FTNoIR_PoseWidget/images/side1.png differ diff --git a/FTNoIR_PoseWidget/images/side2.png b/FTNoIR_PoseWidget/images/side2.png new file mode 100644 index 00000000..67eb060b Binary files /dev/null and b/FTNoIR_PoseWidget/images/side2.png differ diff --git a/FTNoIR_PoseWidget/images/side3.png b/FTNoIR_PoseWidget/images/side3.png new file mode 100644 index 00000000..67eb060b Binary files /dev/null and b/FTNoIR_PoseWidget/images/side3.png differ diff --git a/FTNoIR_PoseWidget/images/side4.png b/FTNoIR_PoseWidget/images/side4.png new file mode 100644 index 00000000..67eb060b Binary files /dev/null and b/FTNoIR_PoseWidget/images/side4.png differ diff --git a/FTNoIR_PoseWidget/images/side5.png b/FTNoIR_PoseWidget/images/side5.png new file mode 100644 index 00000000..67eb060b Binary files /dev/null and b/FTNoIR_PoseWidget/images/side5.png differ diff --git a/FTNoIR_PoseWidget/images/side6.png b/FTNoIR_PoseWidget/images/side6.png new file mode 100644 index 00000000..f4160001 Binary files /dev/null and b/FTNoIR_PoseWidget/images/side6.png differ -- cgit v1.2.3