mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-05 11:10:03 +02:00
Merge remote-tracking branch 'upstream/master'
Conflicts: interface/src/Application.cpp interface/src/avatar/Head.cpp
This commit is contained in:
commit
e0b7773521
10 changed files with 241 additions and 91 deletions
|
@ -570,7 +570,9 @@ void Application::keyPressEvent(QKeyEvent* event) {
|
|||
if (_simulateLeapHand->isChecked() || _testRaveGlove->isChecked()) {
|
||||
_myAvatar.getHand().setRaveGloveEffectsMode((QKeyEvent*)event);
|
||||
}
|
||||
|
||||
|
||||
bool alt = event->modifiers().testFlag(Qt::AltModifier);
|
||||
bool meta = event->modifiers().testFlag(Qt::MetaModifier);
|
||||
bool shifted = event->modifiers().testFlag(Qt::ShiftModifier);
|
||||
switch (event->key()) {
|
||||
case Qt::Key_BracketLeft:
|
||||
|
@ -644,7 +646,13 @@ void Application::keyPressEvent(QKeyEvent* event) {
|
|||
break;
|
||||
|
||||
case Qt::Key_C:
|
||||
_myAvatar.setDriveKeys(DOWN, 1);
|
||||
if (shifted) {
|
||||
_occlusionCulling->trigger();
|
||||
} else if (meta) {
|
||||
chooseVoxelPaintColor();
|
||||
} else {
|
||||
_myAvatar.setDriveKeys(DOWN, 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case Qt::Key_W:
|
||||
|
@ -652,7 +660,11 @@ void Application::keyPressEvent(QKeyEvent* event) {
|
|||
break;
|
||||
|
||||
case Qt::Key_S:
|
||||
_myAvatar.setDriveKeys(BACK, 1);
|
||||
if (shifted) {
|
||||
doTreeStats();
|
||||
} else {
|
||||
_myAvatar.setDriveKeys(BACK, 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case Qt::Key_Space:
|
||||
|
@ -661,11 +673,19 @@ void Application::keyPressEvent(QKeyEvent* event) {
|
|||
break;
|
||||
|
||||
case Qt::Key_G:
|
||||
goHome();
|
||||
if (shifted) {
|
||||
_gravityUse->trigger();
|
||||
} else {
|
||||
_eyedropperMode->trigger();
|
||||
}
|
||||
break;
|
||||
|
||||
case Qt::Key_A:
|
||||
_myAvatar.setDriveKeys(ROT_LEFT, 1);
|
||||
if (shifted) {
|
||||
_renderAtmosphereOn->trigger();
|
||||
} else {
|
||||
_myAvatar.setDriveKeys(ROT_LEFT, 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case Qt::Key_D:
|
||||
|
@ -755,12 +775,66 @@ void Application::keyPressEvent(QKeyEvent* event) {
|
|||
}
|
||||
resizeGL(_glWidget->width(), _glWidget->height());
|
||||
break;
|
||||
case Qt::Key_N:
|
||||
_noise->trigger();
|
||||
break;
|
||||
case Qt::Key_H:
|
||||
_lookingInMirror->trigger();
|
||||
break;
|
||||
case Qt::Key_F:
|
||||
if (shifted) {
|
||||
_frustumOn->trigger();
|
||||
} else {
|
||||
_fullScreenMode->trigger();
|
||||
}
|
||||
break;
|
||||
case Qt::Key_V:
|
||||
if (shifted) {
|
||||
_renderVoxels->trigger();
|
||||
} else {
|
||||
_addVoxelMode->trigger();
|
||||
}
|
||||
break;
|
||||
case Qt::Key_P:
|
||||
_manualFirstPerson->trigger();
|
||||
break;
|
||||
case Qt::Key_R:
|
||||
if (shifted) {
|
||||
_frustumRenderModeAction->trigger();
|
||||
} else {
|
||||
_deleteVoxelMode->trigger();
|
||||
}
|
||||
break;
|
||||
case Qt::Key_B:
|
||||
_colorVoxelMode->trigger();
|
||||
break;
|
||||
case Qt::Key_O:
|
||||
if (shifted) {
|
||||
_viewFrustumFromOffset->trigger();
|
||||
} else {
|
||||
_selectVoxelMode->trigger();
|
||||
}
|
||||
break;
|
||||
case Qt::Key_Slash:
|
||||
_renderStatsOn->trigger();
|
||||
break;
|
||||
case Qt::Key_Backspace:
|
||||
case Qt::Key_Delete:
|
||||
if (_selectVoxelMode->isChecked()) {
|
||||
deleteVoxelUnderCursor();
|
||||
}
|
||||
break;
|
||||
case Qt::Key_Plus:
|
||||
if (alt) {
|
||||
increaseAvatarSize();
|
||||
}
|
||||
break;
|
||||
case Qt::Key_Minus:
|
||||
if (alt) {
|
||||
decreaseAvatarSize();
|
||||
}
|
||||
break;
|
||||
|
||||
case Qt::Key_1:
|
||||
case Qt::Key_2:
|
||||
case Qt::Key_3:
|
||||
|
@ -859,7 +933,7 @@ void Application::mouseMoveEvent(QMouseEvent* event) {
|
|||
|
||||
const bool MAKE_SOUND_ON_VOXEL_HOVER = false;
|
||||
const bool MAKE_SOUND_ON_VOXEL_CLICK = true;
|
||||
const float HOVER_VOXEL_FREQUENCY = 14080.f;
|
||||
const float HOVER_VOXEL_FREQUENCY = 7040.f;
|
||||
const float HOVER_VOXEL_DECAY = 0.999f;
|
||||
|
||||
void Application::mousePressEvent(QMouseEvent* event) {
|
||||
|
@ -1791,10 +1865,12 @@ void Application::initMenu() {
|
|||
_window->setMenuBar(menuBar);
|
||||
|
||||
QMenu* fileMenu = menuBar->addMenu("File");
|
||||
fileMenu->addAction("Quit", this, SLOT(quit()), Qt::CTRL | Qt::Key_Q);
|
||||
QAction* quitAction = fileMenu->addAction("Quit", this, SLOT(quit()), Qt::CTRL | Qt::Key_Q);
|
||||
quitAction->setMenuRole(QAction::QuitRole);
|
||||
|
||||
QMenu* editMenu = menuBar->addMenu("Edit");
|
||||
editMenu->addAction("Preferences...", this, SLOT(editPreferences()));
|
||||
QAction* preferencesAction = editMenu->addAction("Preferences...", this, SLOT(editPreferences()), Qt::CTRL | Qt::Key_Comma);
|
||||
preferencesAction->setMenuRole(QAction::PreferencesRole);
|
||||
|
||||
QMenu* pairMenu = menuBar->addMenu("Pair");
|
||||
pairMenu->addAction("Pair", this, SLOT(pair()));
|
||||
|
@ -1803,7 +1879,7 @@ void Application::initMenu() {
|
|||
(_lookingInMirror = optionsMenu->addAction("Mirror", this, SLOT(setRenderMirrored(bool)), Qt::Key_H))->setCheckable(true);
|
||||
(_echoAudioMode = optionsMenu->addAction("Echo Audio"))->setCheckable(true);
|
||||
|
||||
optionsMenu->addAction("Noise", this, SLOT(setNoise(bool)), Qt::Key_N)->setCheckable(true);
|
||||
(_noise = optionsMenu->addAction("Noise", this, SLOT(setNoise(bool)), Qt::Key_N))->setCheckable(true);
|
||||
(_gyroLook = optionsMenu->addAction("Smooth Gyro Look"))->setCheckable(true);
|
||||
_gyroLook->setChecked(true);
|
||||
(_showHeadMouse = optionsMenu->addAction("Head Mouse"))->setCheckable(true);
|
||||
|
@ -1819,7 +1895,7 @@ void Application::initMenu() {
|
|||
optionsMenu->addAction("Webcam", &_webcam, SLOT(setEnabled(bool)))->setCheckable(true);
|
||||
optionsMenu->addAction("Toggle Skeleton Tracking", &_webcam, SLOT(setSkeletonTrackingOn(bool)))->setCheckable(true);
|
||||
optionsMenu->addAction("Cycle Webcam Send Mode", _webcam.getGrabber(), SLOT(cycleVideoSendMode()));
|
||||
optionsMenu->addAction("Go Home", this, SLOT(goHome()));
|
||||
optionsMenu->addAction("Go Home", this, SLOT(goHome()), Qt::CTRL | Qt::Key_G);
|
||||
|
||||
QMenu* renderMenu = menuBar->addMenu("Render");
|
||||
(_renderVoxels = renderMenu->addAction("Voxels", this, SLOT(setRenderVoxels(bool)), Qt::SHIFT | Qt::Key_V))->setCheckable(true);
|
||||
|
@ -1888,8 +1964,8 @@ void Application::initMenu() {
|
|||
"Get Color Mode", this, SLOT(updateVoxelModeActions()), Qt::Key_G))->setCheckable(true);
|
||||
_voxelModeActions->addAction(_eyedropperMode);
|
||||
|
||||
voxelMenu->addAction("Decrease Voxel Size", this, SLOT(decreaseVoxelSize()), QKeySequence::ZoomOut);
|
||||
voxelMenu->addAction("Increase Voxel Size", this, SLOT(increaseVoxelSize()), QKeySequence::ZoomIn);
|
||||
voxelMenu->addAction("Decrease Voxel Size", this, SLOT(decreaseVoxelSize()), QKeySequence::ZoomOut);
|
||||
voxelMenu->addAction("Increase Voxel Size", this, SLOT(increaseVoxelSize()), QKeySequence::ZoomIn);
|
||||
voxelMenu->addAction("Reset Swatch Colors", this, SLOT(resetSwatchColors()));
|
||||
|
||||
_voxelPaintColor = voxelMenu->addAction("Voxel Paint Color", this,
|
||||
|
@ -1916,7 +1992,7 @@ void Application::initMenu() {
|
|||
(_viewFrustumFromOffset = frustumMenu->addAction(
|
||||
"Use Offset Camera", this, SLOT(setFrustumOffset(bool)), Qt::SHIFT | Qt::Key_O))->setCheckable(true);
|
||||
_frustumRenderModeAction = frustumMenu->addAction(
|
||||
"Render Mode", this, SLOT(cycleFrustumRenderMode()), Qt::SHIFT | Qt::Key_R);
|
||||
"Render Mode", this, SLOT(cycleFrustumRenderMode()), Qt::SHIFT | Qt::Key_R);
|
||||
updateFrustumRenderModeAction();
|
||||
|
||||
debugMenu->addAction("Run Timing Tests", this, SLOT(runTests()));
|
||||
|
@ -1940,8 +2016,8 @@ void Application::initMenu() {
|
|||
debugMenu->addAction("Wants Monochrome", this, SLOT(setWantsMonochrome(bool)))->setCheckable(true);
|
||||
debugMenu->addAction("Use Lower Resolution While Moving", this, SLOT(setWantsLowResMoving(bool)))->setCheckable(true);
|
||||
debugMenu->addAction("Disable Delta Sending", this, SLOT(disableDeltaSending(bool)))->setCheckable(true);
|
||||
debugMenu->addAction("Disable Occlusion Culling", this, SLOT(disableOcclusionCulling(bool)),
|
||||
Qt::SHIFT | Qt::Key_C)->setCheckable(true);
|
||||
(_occlusionCulling = debugMenu->addAction("Disable Occlusion Culling", this, SLOT(disableOcclusionCulling(bool)),
|
||||
Qt::SHIFT | Qt::Key_C))->setCheckable(true);
|
||||
|
||||
(_renderCoverageMap = debugMenu->addAction("Render Coverage Map"))->setCheckable(true);
|
||||
_renderCoverageMap->setShortcut(Qt::SHIFT | Qt::CTRL | Qt::Key_O);
|
||||
|
@ -2161,7 +2237,8 @@ void Application::update(float deltaTime) {
|
|||
_myAvatar.getHead().setLookAtPosition(lookAtSpot);
|
||||
} else {
|
||||
// Just look in direction of the mouse ray
|
||||
lookAtSpot = mouseRayOrigin + mouseRayDirection;
|
||||
const float FAR_AWAY_STARE = TREE_SCALE;
|
||||
lookAtSpot = mouseRayOrigin + mouseRayDirection * FAR_AWAY_STARE);
|
||||
_myAvatar.getHead().setLookAtPosition(lookAtSpot);
|
||||
}
|
||||
|
||||
|
@ -2172,15 +2249,21 @@ void Application::update(float deltaTime) {
|
|||
// If we have clicked on a voxel, update it's color
|
||||
if (_isHoverVoxelSounding) {
|
||||
VoxelNode* hoveredNode = _voxels.getVoxelAt(_hoverVoxel.x, _hoverVoxel.y, _hoverVoxel.z, _hoverVoxel.s);
|
||||
float bright = _audio.getCollisionSoundMagnitude();
|
||||
nodeColor clickColor = { 255 * bright + _hoverVoxelOriginalColor[0] * (1.f - bright),
|
||||
_hoverVoxelOriginalColor[1] * (1.f - bright),
|
||||
_hoverVoxelOriginalColor[2] * (1.f - bright), 1 };
|
||||
hoveredNode->setColor(clickColor);
|
||||
if (bright < 0.01f) {
|
||||
hoveredNode->setColor(_hoverVoxelOriginalColor);
|
||||
if (hoveredNode) {
|
||||
float bright = _audio.getCollisionSoundMagnitude();
|
||||
nodeColor clickColor = { 255 * bright + _hoverVoxelOriginalColor[0] * (1.f - bright),
|
||||
_hoverVoxelOriginalColor[1] * (1.f - bright),
|
||||
_hoverVoxelOriginalColor[2] * (1.f - bright), 1 };
|
||||
hoveredNode->setColor(clickColor);
|
||||
if (bright < 0.01f) {
|
||||
hoveredNode->setColor(_hoverVoxelOriginalColor);
|
||||
_isHoverVoxelSounding = false;
|
||||
}
|
||||
} else {
|
||||
// Voxel is not found, clear all
|
||||
_isHoverVoxelSounding = false;
|
||||
}
|
||||
_isHoverVoxel = false;
|
||||
}
|
||||
} else {
|
||||
// Check for a new hover voxel
|
||||
glm::vec4 oldVoxel(_hoverVoxel.x, _hoverVoxel.y, _hoverVoxel.z, _hoverVoxel.s);
|
||||
|
@ -2848,8 +2931,9 @@ void Application::displaySide(Camera& whichCamera) {
|
|||
_myAvatar.getHead().setLookAtPosition(_myCamera.getPosition());
|
||||
}
|
||||
_myAvatar.render(_lookingInMirror->isChecked(), _renderAvatarBalls->isChecked());
|
||||
_myAvatar.setDisplayingLookatVectors(_renderLookatOn->isChecked());
|
||||
|
||||
if (_renderLookatIndicatorOn->isChecked() && _isLookingAtOtherAvatar) {
|
||||
if (_renderLookatIndicatorOn->isChecked()) {
|
||||
renderLookatIndicator(_lookatOtherPosition, whichCamera);
|
||||
}
|
||||
}
|
||||
|
@ -2861,7 +2945,7 @@ void Application::displaySide(Camera& whichCamera) {
|
|||
}
|
||||
|
||||
// Render the world box
|
||||
if (!_lookingInMirror->isChecked() && _renderStatsOn->isChecked()) { render_world_box(); }
|
||||
if (!_lookingInMirror->isChecked() && _renderStatsOn->isChecked()) { renderWorldBox(); }
|
||||
|
||||
// brad's frustum for debugging
|
||||
if (_frustumOn->isChecked()) renderViewFrustum(_viewFrustum);
|
||||
|
|
|
@ -288,6 +288,8 @@ private:
|
|||
QAction* _fullScreenMode; // whether we are in full screen mode
|
||||
QAction* _frustumRenderModeAction;
|
||||
QAction* _settingsAutosave; // Whether settings are saved automatically
|
||||
QAction* _noise;
|
||||
QAction* _occlusionCulling;
|
||||
|
||||
QAction* _renderCoverageMapV2;
|
||||
QAction* _renderCoverageMap;
|
||||
|
|
|
@ -223,39 +223,54 @@ void noiseTest(int w, int h) {
|
|||
glEnd();
|
||||
}
|
||||
|
||||
void render_world_box() {
|
||||
// Show edge of world
|
||||
void renderWorldBox() {
|
||||
// Show edge of world
|
||||
float red[] = {1, 0, 0};
|
||||
float green[] = {0, 1, 0};
|
||||
float blue[] = {0, 0, 1};
|
||||
float gray[] = {0.5, 0.5, 0.5};
|
||||
|
||||
glDisable(GL_LIGHTING);
|
||||
glColor4f(1.0, 1.0, 1.0, 1.0);
|
||||
glLineWidth(1.0);
|
||||
glBegin(GL_LINES);
|
||||
glColor3f(1, 0, 0);
|
||||
glColor3fv(red);
|
||||
glVertex3f(0, 0, 0);
|
||||
glVertex3f(WORLD_SIZE, 0, 0);
|
||||
glColor3f(0, 1, 0);
|
||||
glVertex3f(TREE_SCALE, 0, 0);
|
||||
glColor3fv(green);
|
||||
glVertex3f(0, 0, 0);
|
||||
glVertex3f(0, WORLD_SIZE, 0);
|
||||
glColor3f(0, 0, 1);
|
||||
glVertex3f(0, TREE_SCALE, 0);
|
||||
glColor3fv(blue);
|
||||
glVertex3f(0, 0, 0);
|
||||
glVertex3f(0, 0, WORLD_SIZE);
|
||||
glVertex3f(0, 0, TREE_SCALE);
|
||||
glColor3fv(gray);
|
||||
glVertex3f(0, 0, TREE_SCALE);
|
||||
glVertex3f(TREE_SCALE, 0, TREE_SCALE);
|
||||
glVertex3f(TREE_SCALE, 0, TREE_SCALE);
|
||||
glVertex3f(TREE_SCALE, 0, 0);
|
||||
glEnd();
|
||||
// Draw little marker dots along the axis
|
||||
// Draw marker dots at very end
|
||||
glEnable(GL_LIGHTING);
|
||||
glPushMatrix();
|
||||
glTranslatef(WORLD_SIZE, 0, 0);
|
||||
glColor3f(1, 0, 0);
|
||||
glTranslatef(TREE_SCALE, 0, 0);
|
||||
glColor3fv(red);
|
||||
glutSolidSphere(0.125, 10, 10);
|
||||
glPopMatrix();
|
||||
glPushMatrix();
|
||||
glTranslatef(0, WORLD_SIZE, 0);
|
||||
glColor3f(0, 1, 0);
|
||||
glTranslatef(0, TREE_SCALE, 0);
|
||||
glColor3fv(green);
|
||||
glutSolidSphere(0.125, 10, 10);
|
||||
glPopMatrix();
|
||||
glPushMatrix();
|
||||
glTranslatef(0, 0, WORLD_SIZE);
|
||||
glColor3f(0, 0, 1);
|
||||
glTranslatef(0, 0, TREE_SCALE);
|
||||
glColor3fv(blue);
|
||||
glutSolidSphere(0.125, 10, 10);
|
||||
glPopMatrix();
|
||||
glPushMatrix();
|
||||
glColor3fv(gray);
|
||||
glTranslatef(TREE_SCALE, 0, TREE_SCALE);
|
||||
glutSolidSphere(0.125, 10, 10);
|
||||
glPopMatrix();
|
||||
|
||||
}
|
||||
|
||||
double diffclock(timeval *clock1,timeval *clock2)
|
||||
|
|
|
@ -33,7 +33,7 @@ float angle_to(glm::vec3 head_pos, glm::vec3 source_pos, float render_yaw, float
|
|||
float randFloat();
|
||||
const glm::vec3 randVector();
|
||||
|
||||
void render_world_box();
|
||||
void renderWorldBox();
|
||||
int widthText(float scale, int mono, char const* string);
|
||||
float widthChar(float scale, int mono, char ch);
|
||||
void drawtext(int x, int y, float scale, float rotate, float thick, int mono,
|
||||
|
|
|
@ -465,9 +465,12 @@ void FrameGrabber::grabFrame() {
|
|||
color = image;
|
||||
}
|
||||
|
||||
const int ENCODED_FACE_WIDTH = 128;
|
||||
const int ENCODED_FACE_HEIGHT = 128;
|
||||
int encodedWidth;
|
||||
int encodedHeight;
|
||||
int depthBitrateMultiplier = 1;
|
||||
float colorBitrateMultiplier = 1.0f;
|
||||
float depthBitrateMultiplier = 1.0f;
|
||||
Mat faceTransform;
|
||||
float aspectRatio;
|
||||
if (_videoSendMode == FULL_FRAME_VIDEO) {
|
||||
|
@ -476,6 +479,7 @@ void FrameGrabber::grabFrame() {
|
|||
encodedWidth = color.cols;
|
||||
encodedHeight = color.rows;
|
||||
aspectRatio = FULL_FRAME_ASPECT;
|
||||
colorBitrateMultiplier = 4.0f;
|
||||
|
||||
} else {
|
||||
// if we don't have a search window (yet), try using the face cascade
|
||||
|
@ -510,11 +514,9 @@ void FrameGrabber::grabFrame() {
|
|||
Rect imageBounds(0, 0, color.cols, color.rows);
|
||||
_searchWindow = Rect(clip(faceBounds.tl(), imageBounds), clip(faceBounds.br(), imageBounds));
|
||||
}
|
||||
const int ENCODED_FACE_WIDTH = 128;
|
||||
const int ENCODED_FACE_HEIGHT = 128;
|
||||
encodedWidth = ENCODED_FACE_WIDTH;
|
||||
encodedHeight = ENCODED_FACE_HEIGHT;
|
||||
depthBitrateMultiplier = 2;
|
||||
depthBitrateMultiplier = 2.0f;
|
||||
|
||||
// correct for 180 degree rotations
|
||||
if (faceRect.angle < -90.0f) {
|
||||
|
@ -595,7 +597,7 @@ void FrameGrabber::grabFrame() {
|
|||
// initialize encoder context(s)
|
||||
vpx_codec_enc_cfg_t codecConfig;
|
||||
vpx_codec_enc_config_default(vpx_codec_vp8_cx(), &codecConfig, 0);
|
||||
codecConfig.rc_target_bitrate = encodedWidth * encodedHeight *
|
||||
codecConfig.rc_target_bitrate = ENCODED_FACE_WIDTH * ENCODED_FACE_HEIGHT * colorBitrateMultiplier *
|
||||
codecConfig.rc_target_bitrate / codecConfig.g_w / codecConfig.g_h;
|
||||
codecConfig.g_w = encodedWidth;
|
||||
codecConfig.g_h = encodedHeight;
|
||||
|
|
|
@ -163,21 +163,21 @@ int Face::processVideoMessage(unsigned char* packetData, size_t dataBytes) {
|
|||
int ybr = ysrc[image->w + 1];
|
||||
ysrc += 2;
|
||||
|
||||
tl[0] = ytl + redOffset;
|
||||
tl[1] = ytl - greenOffset;
|
||||
tl[2] = ytl + blueOffset;
|
||||
tl[0] = saturate_cast<uchar>(ytl + redOffset);
|
||||
tl[1] = saturate_cast<uchar>(ytl - greenOffset);
|
||||
tl[2] = saturate_cast<uchar>(ytl + blueOffset);
|
||||
|
||||
tr[0] = ytr + redOffset;
|
||||
tr[1] = ytr - greenOffset;
|
||||
tr[2] = ytr + blueOffset;
|
||||
tr[0] = saturate_cast<uchar>(ytr + redOffset);
|
||||
tr[1] = saturate_cast<uchar>(ytr - greenOffset);
|
||||
tr[2] = saturate_cast<uchar>(ytr + blueOffset);
|
||||
|
||||
bl[0] = ybl + redOffset;
|
||||
bl[1] = ybl - greenOffset;
|
||||
bl[2] = ybl + blueOffset;
|
||||
bl[0] = saturate_cast<uchar>(ybl + redOffset);
|
||||
bl[1] = saturate_cast<uchar>(ybl - greenOffset);
|
||||
bl[2] = saturate_cast<uchar>(ybl + blueOffset);
|
||||
|
||||
br[0] = ybr + redOffset;
|
||||
br[1] = ybr - greenOffset;
|
||||
br[2] = ybr + blueOffset;
|
||||
br[0] = saturate_cast<uchar>(ybr + redOffset);
|
||||
br[1] = saturate_cast<uchar>(ybr - greenOffset);
|
||||
br[2] = saturate_cast<uchar>(ybr + blueOffset);
|
||||
}
|
||||
yline += image->stride[0] * 2;
|
||||
vline += image->stride[1];
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
#include "Util.h"
|
||||
#include "renderer/ProgramObject.h"
|
||||
|
||||
const bool SHOW_LEAP_HAND = false;
|
||||
const bool SHOW_LEAP_HAND = true;
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -85,7 +85,7 @@ void Hand::calculateGeometry() {
|
|||
}
|
||||
}
|
||||
|
||||
// generate finger rot balls....
|
||||
// generate finger root balls....
|
||||
_leapFingerRootBalls.clear();
|
||||
for (size_t i = 0; i < getNumPalms(); ++i) {
|
||||
PalmData& palm = getPalms()[i];
|
||||
|
@ -225,20 +225,7 @@ void Hand::renderLeapHandSpheres() {
|
|||
glPopMatrix();
|
||||
}
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < _leapFingerRootBalls.size(); i++) {
|
||||
float alpha = 1.0f;
|
||||
|
||||
if (alpha > 0.0f) {
|
||||
glColor4f(0.3f, 0.4f, 0.6f, alpha);
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef(_leapFingerRootBalls[i].position.x, _leapFingerRootBalls[i].position.y, _leapFingerRootBalls[i].position.z);
|
||||
glutSolidSphere(_leapFingerRootBalls[i].radius, 20.0f, 20.0f);
|
||||
glPopMatrix();
|
||||
}
|
||||
}
|
||||
|
||||
// Draw the finger root cones
|
||||
for (size_t i = 0; i < getNumPalms(); ++i) {
|
||||
PalmData& palm = getPalms()[i];
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
#include "renderer/ProgramObject.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
const int MOHAWK_TRIANGLES = 50;
|
||||
const bool USING_PHYSICAL_MOHAWK = true;
|
||||
const float EYE_RIGHT_OFFSET = 0.27f;
|
||||
|
@ -36,6 +36,11 @@ const float HAIR_GRAVITY_FORCE = 0.05f;
|
|||
const float HAIR_DRAG = 10.0f;
|
||||
const float HAIR_LENGTH = 0.09f;
|
||||
const float HAIR_THICKNESS = 0.03f;
|
||||
const float NOSE_LENGTH = 0.025;
|
||||
const float NOSE_WIDTH = 0.03;
|
||||
const float NOSE_HEIGHT = 0.034;
|
||||
const float NOSE_UP_OFFSET = -0.07;
|
||||
const float NOSE_UPTURN = 0.005;
|
||||
const float IRIS_RADIUS = 0.007;
|
||||
const float IRIS_PROTRUSION = 0.0145f;
|
||||
const char IRIS_TEXTURE_FILENAME[] = "resources/images/iris.png";
|
||||
|
@ -100,7 +105,7 @@ void Head::init() {
|
|||
|
||||
_irisProgram->setUniformValue("texture", 0);
|
||||
_eyePositionLocation = _irisProgram->uniformLocation("eyePosition");
|
||||
|
||||
|
||||
QImage image = QImage(IRIS_TEXTURE_FILENAME).convertToFormat(QImage::Format_ARGB32);
|
||||
|
||||
glGenTextures(1, &_irisTextureID);
|
||||
|
@ -262,31 +267,40 @@ void Head::calculateGeometry() {
|
|||
glm::vec3 up = orientation * IDENTITY_UP;
|
||||
glm::vec3 front = orientation * IDENTITY_FRONT;
|
||||
|
||||
float scale = _scale * BODY_BALL_RADIUS_HEAD_BASE;
|
||||
|
||||
//calculate the eye positions
|
||||
_leftEyePosition = _position
|
||||
- right * _scale * BODY_BALL_RADIUS_HEAD_BASE * EYE_RIGHT_OFFSET
|
||||
+ up * _scale * BODY_BALL_RADIUS_HEAD_BASE * EYE_UP_OFFSET
|
||||
+ front * _scale * BODY_BALL_RADIUS_HEAD_BASE * EYE_FRONT_OFFSET;
|
||||
- right * scale * EYE_RIGHT_OFFSET
|
||||
+ up * scale * EYE_UP_OFFSET
|
||||
+ front * scale * EYE_FRONT_OFFSET;
|
||||
_rightEyePosition = _position
|
||||
+ right * _scale * BODY_BALL_RADIUS_HEAD_BASE * EYE_RIGHT_OFFSET
|
||||
+ up * _scale * BODY_BALL_RADIUS_HEAD_BASE * EYE_UP_OFFSET
|
||||
+ front * _scale * BODY_BALL_RADIUS_HEAD_BASE * EYE_FRONT_OFFSET;
|
||||
+ right * scale * EYE_RIGHT_OFFSET
|
||||
+ up * scale * EYE_UP_OFFSET
|
||||
+ front * scale * EYE_FRONT_OFFSET;
|
||||
|
||||
_eyePosition = _rightEyePosition - right * _scale * BODY_BALL_RADIUS_HEAD_BASE * EYE_RIGHT_OFFSET;
|
||||
_eyePosition = _rightEyePosition - right * scale * EYE_RIGHT_OFFSET;
|
||||
|
||||
//calculate the eyebrow positions
|
||||
_leftEyeBrowPosition = _leftEyePosition;
|
||||
_rightEyeBrowPosition = _rightEyePosition;
|
||||
|
||||
//calculate the ear positions
|
||||
_leftEarPosition = _position - right * _scale * BODY_BALL_RADIUS_HEAD_BASE * EAR_RIGHT_OFFSET;
|
||||
_rightEarPosition = _position + right * _scale * BODY_BALL_RADIUS_HEAD_BASE * EAR_RIGHT_OFFSET;
|
||||
_leftEarPosition = _position - right * scale * EAR_RIGHT_OFFSET;
|
||||
_rightEarPosition = _position + right * scale * EAR_RIGHT_OFFSET;
|
||||
|
||||
//calculate the mouth position
|
||||
_mouthPosition = _position + up * _scale * BODY_BALL_RADIUS_HEAD_BASE * MOUTH_UP_OFFSET
|
||||
+ front * _scale * BODY_BALL_RADIUS_HEAD_BASE;
|
||||
}
|
||||
_mouthPosition = _position + up * scale * MOUTH_UP_OFFSET + front * scale;
|
||||
|
||||
// calculate nose geometry
|
||||
glm::vec3 noseBase = _position + front * 0.95f * scale + up * NOSE_UP_OFFSET * scale;
|
||||
|
||||
_nose.top = noseBase + up * _scale * NOSE_HEIGHT;
|
||||
_nose.left = noseBase - right * _scale * NOSE_WIDTH * ONE_HALF;
|
||||
_nose.right = noseBase + right * _scale * NOSE_WIDTH * ONE_HALF;
|
||||
_nose.front = noseBase + front * _scale * NOSE_LENGTH
|
||||
+ up * _scale * NOSE_UPTURN;
|
||||
}
|
||||
|
||||
void Head::render(float alpha) {
|
||||
|
||||
|
@ -302,7 +316,8 @@ void Head::render(float alpha) {
|
|||
renderHeadSphere();
|
||||
renderEyeBalls();
|
||||
renderEars();
|
||||
renderMouth();
|
||||
renderMouth();
|
||||
renderNose();
|
||||
renderEyeBrows();
|
||||
}
|
||||
|
||||
|
@ -441,6 +456,42 @@ void Head::renderEars() {
|
|||
glPopMatrix();
|
||||
}
|
||||
|
||||
|
||||
void Head::renderNose() {
|
||||
|
||||
glm::vec3 bridgeVector = _nose.front - _nose.top;
|
||||
glm::vec3 leftvector = _nose.front - _nose.left;
|
||||
glm::vec3 rightvector = _nose.front - _nose.right;
|
||||
|
||||
glm::vec3 leftNormal (glm::normalize(glm::cross(leftvector, bridgeVector)));
|
||||
glm::vec3 rightNormal (glm::normalize(glm::cross(bridgeVector, rightvector )));
|
||||
glm::vec3 bottomNormal(glm::normalize(glm::cross(rightvector, leftvector )));
|
||||
|
||||
glColor4f(_skinColor.x, _skinColor.y, _skinColor.z, _renderAlpha);
|
||||
|
||||
glBegin(GL_TRIANGLES);
|
||||
|
||||
glNormal3f(leftNormal.x, leftNormal.y, leftNormal.z);
|
||||
glVertex3f(_nose.top.x, _nose.top.y, _nose.top.z );
|
||||
glVertex3f(_nose.left.x, _nose.left.y, _nose.left.z );
|
||||
glVertex3f(_nose.front.x, _nose.front.y, _nose.front.z );
|
||||
|
||||
glNormal3f(rightNormal.x, rightNormal.y, rightNormal.z);
|
||||
glVertex3f(_nose.top.x, _nose.top.y, _nose.top.z );
|
||||
glVertex3f(_nose.right.x, _nose.right.y, _nose.right.z );
|
||||
glVertex3f(_nose.front.x, _nose.front.y, _nose.front.z );
|
||||
|
||||
glNormal3f(bottomNormal.x, bottomNormal.y, bottomNormal.z);
|
||||
glVertex3f(_nose.left.x, _nose.left.y, _nose.left.z );
|
||||
glVertex3f(_nose.right.x, _nose.right.y, _nose.right.z );
|
||||
glVertex3f(_nose.front.x, _nose.front.y, _nose.front.z );
|
||||
|
||||
glEnd();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void Head::renderMouth() {
|
||||
|
||||
float s = sqrt(_averageLoudness);
|
||||
|
|
|
@ -92,6 +92,14 @@ private:
|
|||
glm::vec3 endVelocity;
|
||||
};
|
||||
|
||||
struct Nose
|
||||
{
|
||||
glm::vec3 top;
|
||||
glm::vec3 left;
|
||||
glm::vec3 right;
|
||||
glm::vec3 front;
|
||||
};
|
||||
|
||||
float _renderAlpha;
|
||||
bool _returnHeadToCenter;
|
||||
glm::vec3 _skinColor;
|
||||
|
@ -105,6 +113,7 @@ private:
|
|||
glm::vec3 _leftEarPosition;
|
||||
glm::vec3 _rightEarPosition;
|
||||
glm::vec3 _mouthPosition;
|
||||
Nose _nose;
|
||||
float _scale;
|
||||
float _browAudioLift;
|
||||
glm::vec3 _gravity;
|
||||
|
@ -141,6 +150,7 @@ private:
|
|||
void renderEyeBalls();
|
||||
void renderEyeBrows();
|
||||
void renderEars();
|
||||
void renderNose();
|
||||
void renderMouth();
|
||||
void renderLookatVectors(glm::vec3 leftEyePosition, glm::vec3 rightEyePosition, glm::vec3 lookatPosition);
|
||||
void calculateGeometry();
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
#define __interface__world__
|
||||
|
||||
|
||||
const float WORLD_SIZE = 10.0;
|
||||
#define PIf 3.14159265f
|
||||
|
||||
const float GRAVITY_EARTH = 9.80665f;
|
||||
|
|
Loading…
Reference in a new issue