mirror of
https://github.com/overte-org/overte.git
synced 2025-07-11 05:18:34 +02:00
Merge branch 'master' of https://github.com/worklist/hifi
This commit is contained in:
commit
02c62a82d1
4 changed files with 501 additions and 480 deletions
|
@ -215,6 +215,11 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
|
||||||
|
|
||||||
_window->setCentralWidget(_glWidget);
|
_window->setCentralWidget(_glWidget);
|
||||||
|
|
||||||
|
// these are used, for example, to identify the application settings
|
||||||
|
setApplicationName("Interface");
|
||||||
|
setOrganizationDomain("highfidelity.io");
|
||||||
|
setOrganizationName("High Fidelity");
|
||||||
|
|
||||||
initMenu();
|
initMenu();
|
||||||
|
|
||||||
QRect available = desktop()->availableGeometry();
|
QRect available = desktop()->availableGeometry();
|
||||||
|
@ -227,8 +232,6 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
|
||||||
_glWidget->setMouseTracking(true);
|
_glWidget->setMouseTracking(true);
|
||||||
|
|
||||||
// initialization continues in initializeGL when OpenGL context is ready
|
// initialization continues in initializeGL when OpenGL context is ready
|
||||||
|
|
||||||
QCoreApplication::setOrganizationDomain("highfidelity.io"); // Used by QSettings on OS X
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::initializeGL() {
|
void Application::initializeGL() {
|
||||||
|
@ -289,6 +292,9 @@ void Application::initializeGL() {
|
||||||
printLog("%s", title);
|
printLog("%s", title);
|
||||||
_window->setWindowTitle(title);
|
_window->setWindowTitle(title);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update before the first render
|
||||||
|
update(0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::paintGL() {
|
void Application::paintGL() {
|
||||||
|
@ -422,6 +428,7 @@ static void sendVoxelServerAddScene() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::keyPressEvent(QKeyEvent* event) {
|
void Application::keyPressEvent(QKeyEvent* event) {
|
||||||
|
if (activeWindow() == _window) {
|
||||||
if (_chatEntryOn) {
|
if (_chatEntryOn) {
|
||||||
if (_chatEntry.keyPressEvent(event)) {
|
if (_chatEntry.keyPressEvent(event)) {
|
||||||
_myAvatar.setKeyState(event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete ?
|
_myAvatar.setKeyState(event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete ?
|
||||||
|
@ -627,8 +634,10 @@ void Application::keyPressEvent(QKeyEvent* event) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Application::keyReleaseEvent(QKeyEvent* event) {
|
void Application::keyReleaseEvent(QKeyEvent* event) {
|
||||||
|
if (activeWindow() == _window) {
|
||||||
if (_chatEntryOn) {
|
if (_chatEntryOn) {
|
||||||
_myAvatar.setKeyState(NO_KEY_DOWN);
|
_myAvatar.setKeyState(NO_KEY_DOWN);
|
||||||
return;
|
return;
|
||||||
|
@ -684,8 +693,10 @@ void Application::keyReleaseEvent(QKeyEvent* event) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Application::mouseMoveEvent(QMouseEvent* event) {
|
void Application::mouseMoveEvent(QMouseEvent* event) {
|
||||||
|
if (activeWindow() == _window) {
|
||||||
_mouseX = event->x();
|
_mouseX = event->x();
|
||||||
_mouseY = event->y();
|
_mouseY = event->y();
|
||||||
|
|
||||||
|
@ -700,8 +711,10 @@ void Application::mouseMoveEvent(QMouseEvent* event) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Application::mousePressEvent(QMouseEvent* event) {
|
void Application::mousePressEvent(QMouseEvent* event) {
|
||||||
|
if (activeWindow() == _window) {
|
||||||
if (event->button() == Qt::LeftButton) {
|
if (event->button() == Qt::LeftButton) {
|
||||||
_mouseX = event->x();
|
_mouseX = event->x();
|
||||||
_mouseY = event->y();
|
_mouseY = event->y();
|
||||||
|
@ -712,16 +725,20 @@ void Application::mousePressEvent(QMouseEvent* event) {
|
||||||
deleteVoxelUnderCursor();
|
deleteVoxelUnderCursor();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Application::mouseReleaseEvent(QMouseEvent* event) {
|
void Application::mouseReleaseEvent(QMouseEvent* event) {
|
||||||
|
if (activeWindow() == _window) {
|
||||||
if (event->button() == Qt::LeftButton) {
|
if (event->button() == Qt::LeftButton) {
|
||||||
_mouseX = event->x();
|
_mouseX = event->x();
|
||||||
_mouseY = event->y();
|
_mouseY = event->y();
|
||||||
_mousePressed = false;
|
_mousePressed = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Application::wheelEvent(QWheelEvent* event) {
|
void Application::wheelEvent(QWheelEvent* event) {
|
||||||
|
if (activeWindow() == _window) {
|
||||||
if (checkedVoxelModeAction() == 0) {
|
if (checkedVoxelModeAction() == 0) {
|
||||||
event->ignore();
|
event->ignore();
|
||||||
return;
|
return;
|
||||||
|
@ -732,6 +749,7 @@ void Application::wheelEvent(QWheelEvent* event) {
|
||||||
decreaseVoxelSize();
|
decreaseVoxelSize();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Every second, check the frame rates and other stuff
|
// Every second, check the frame rates and other stuff
|
||||||
void Application::timer() {
|
void Application::timer() {
|
||||||
|
@ -780,192 +798,17 @@ void Application::idle() {
|
||||||
// Only run simulation code if more than IDLE_SIMULATE_MSECS have passed since last time we ran
|
// Only run simulation code if more than IDLE_SIMULATE_MSECS have passed since last time we ran
|
||||||
|
|
||||||
if (diffclock(&_lastTimeIdle, &check) > IDLE_SIMULATE_MSECS) {
|
if (diffclock(&_lastTimeIdle, &check) > IDLE_SIMULATE_MSECS) {
|
||||||
|
update(1.0f / _fps);
|
||||||
float deltaTime = 1.f/_fps;
|
|
||||||
|
|
||||||
// Use Transmitter Hand to move hand if connected, else use mouse
|
|
||||||
if (_myTransmitter.isConnected()) {
|
|
||||||
const float HAND_FORCE_SCALING = 0.01f;
|
|
||||||
glm::vec3 estimatedRotation = _myTransmitter.getEstimatedRotation();
|
|
||||||
glm::vec3 handForce(-estimatedRotation.z, -estimatedRotation.x, estimatedRotation.y);
|
|
||||||
_myAvatar.setMovedHandOffset(handForce * HAND_FORCE_SCALING);
|
|
||||||
} else {
|
|
||||||
// update behaviors for avatar hand movement: handControl takes mouse values as input,
|
|
||||||
// and gives back 3D values modulated for smooth transitioning between interaction modes.
|
|
||||||
_handControl.update(_mouseX, _mouseY);
|
|
||||||
_myAvatar.setMovedHandOffset(_handControl.getValues());
|
|
||||||
}
|
|
||||||
|
|
||||||
// tell my avatar if the mouse is being pressed...
|
|
||||||
_myAvatar.setMousePressed(_mousePressed);
|
|
||||||
|
|
||||||
// check what's under the mouse and update the mouse voxel
|
|
||||||
glm::vec3 mouseRayOrigin, mouseRayDirection;
|
|
||||||
_viewFrustum.computePickRay(_mouseX / (float)_glWidget->width(),
|
|
||||||
_mouseY / (float)_glWidget->height(), mouseRayOrigin, mouseRayDirection);
|
|
||||||
|
|
||||||
// tell my avatar the posiion and direction of the ray projected ino the world based on the mouse position
|
|
||||||
_myAvatar.setMouseRay(mouseRayOrigin, mouseRayDirection);
|
|
||||||
|
|
||||||
_mouseVoxel.s = 0.0f;
|
|
||||||
if (checkedVoxelModeAction() != 0) {
|
|
||||||
float distance;
|
|
||||||
BoxFace face;
|
|
||||||
if (_voxels.findRayIntersection(mouseRayOrigin, mouseRayDirection, _mouseVoxel, distance, face)) {
|
|
||||||
// find the nearest voxel with the desired scale
|
|
||||||
if (_mouseVoxelScale > _mouseVoxel.s) {
|
|
||||||
// choose the larger voxel that encompasses the one selected
|
|
||||||
_mouseVoxel.x = _mouseVoxelScale * floorf(_mouseVoxel.x / _mouseVoxelScale);
|
|
||||||
_mouseVoxel.y = _mouseVoxelScale * floorf(_mouseVoxel.y / _mouseVoxelScale);
|
|
||||||
_mouseVoxel.z = _mouseVoxelScale * floorf(_mouseVoxel.z / _mouseVoxelScale);
|
|
||||||
_mouseVoxel.s = _mouseVoxelScale;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
glm::vec3 faceVector = getFaceVector(face);
|
|
||||||
if (_mouseVoxelScale < _mouseVoxel.s) {
|
|
||||||
// find the closest contained voxel
|
|
||||||
glm::vec3 pt = (mouseRayOrigin + mouseRayDirection * distance) / (float)TREE_SCALE -
|
|
||||||
faceVector * (_mouseVoxelScale * 0.5f);
|
|
||||||
_mouseVoxel.x = _mouseVoxelScale * floorf(pt.x / _mouseVoxelScale);
|
|
||||||
_mouseVoxel.y = _mouseVoxelScale * floorf(pt.y / _mouseVoxelScale);
|
|
||||||
_mouseVoxel.z = _mouseVoxelScale * floorf(pt.z / _mouseVoxelScale);
|
|
||||||
_mouseVoxel.s = _mouseVoxelScale;
|
|
||||||
}
|
|
||||||
if (_addVoxelMode->isChecked()) {
|
|
||||||
// use the face to determine the side on which to create a neighbor
|
|
||||||
_mouseVoxel.x += faceVector.x * _mouseVoxel.s;
|
|
||||||
_mouseVoxel.y += faceVector.y * _mouseVoxel.s;
|
|
||||||
_mouseVoxel.z += faceVector.z * _mouseVoxel.s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (_addVoxelMode->isChecked() || _selectVoxelMode->isChecked()) {
|
|
||||||
// place the voxel a fixed distance away
|
|
||||||
float worldMouseVoxelScale = _mouseVoxelScale * TREE_SCALE;
|
|
||||||
glm::vec3 pt = mouseRayOrigin + mouseRayDirection * (2.0f + worldMouseVoxelScale * 0.5f);
|
|
||||||
_mouseVoxel.x = _mouseVoxelScale * floorf(pt.x / worldMouseVoxelScale);
|
|
||||||
_mouseVoxel.y = _mouseVoxelScale * floorf(pt.y / worldMouseVoxelScale);
|
|
||||||
_mouseVoxel.z = _mouseVoxelScale * floorf(pt.z / worldMouseVoxelScale);
|
|
||||||
_mouseVoxel.s = _mouseVoxelScale;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_deleteVoxelMode->isChecked()) {
|
|
||||||
// red indicates deletion
|
|
||||||
_mouseVoxel.red = 255;
|
|
||||||
_mouseVoxel.green = _mouseVoxel.blue = 0;
|
|
||||||
} else if (_selectVoxelMode->isChecked()) {
|
|
||||||
// yellow indicates deletion
|
|
||||||
_mouseVoxel.red = _mouseVoxel.green = 255;
|
|
||||||
_mouseVoxel.blue = 0;
|
|
||||||
} else { // _addVoxelMode->isChecked() || _colorVoxelMode->isChecked()
|
|
||||||
QColor paintColor = _voxelPaintColor->data().value<QColor>();
|
|
||||||
_mouseVoxel.red = paintColor.red();
|
|
||||||
_mouseVoxel.green = paintColor.green();
|
|
||||||
_mouseVoxel.blue = paintColor.blue();
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we just edited, use the currently selected voxel as the "last" for drag detection
|
|
||||||
if (_justEditedVoxel) {
|
|
||||||
_lastMouseVoxelPos = glm::vec3(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z);
|
|
||||||
_justEditedVoxel = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// walking triggers the handControl to stop
|
|
||||||
if (_myAvatar.getMode() == AVATAR_MODE_WALKING) {
|
|
||||||
_handControl.stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update from Mouse
|
|
||||||
if (_mouseLook->isChecked()) {
|
|
||||||
QPoint mouse = QCursor::pos();
|
|
||||||
_myAvatar.updateFromMouse(_glWidget->mapFromGlobal(mouse).x(),
|
|
||||||
_glWidget->mapFromGlobal(mouse).y(),
|
|
||||||
_glWidget->width(),
|
|
||||||
_glWidget->height());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read serial port interface devices
|
|
||||||
if (_serialHeadSensor.active) {
|
|
||||||
_serialHeadSensor.readData(deltaTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update transmitter
|
|
||||||
|
|
||||||
// Sample hardware, update view frustum if needed, and send avatar data to mixer/agents
|
|
||||||
updateAvatar(deltaTime);
|
|
||||||
|
|
||||||
// read incoming packets from network
|
|
||||||
if (!_enableNetworkThread) {
|
|
||||||
networkReceive(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
//loop through all the other avatars and simulate them...
|
|
||||||
AgentList* agentList = AgentList::getInstance();
|
|
||||||
agentList->lock();
|
|
||||||
for(AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) {
|
|
||||||
if (agent->getLinkedData() != NULL) {
|
|
||||||
Avatar *avatar = (Avatar *)agent->getLinkedData();
|
|
||||||
if (!avatar->isInitialized()) {
|
|
||||||
avatar->init();
|
|
||||||
}
|
|
||||||
avatar->simulate(deltaTime, NULL);
|
|
||||||
avatar->setMouseRay(mouseRayOrigin, mouseRayDirection);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
agentList->unlock();
|
|
||||||
|
|
||||||
// Simulate myself
|
|
||||||
_myAvatar.setGravity(_environment.getGravity(_myAvatar.getPosition()));
|
|
||||||
if (_transmitterDrives->isChecked() && _myTransmitter.isConnected()) {
|
|
||||||
_myAvatar.simulate(deltaTime, &_myTransmitter);
|
|
||||||
} else {
|
|
||||||
_myAvatar.simulate(deltaTime, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TESTING_AVATAR_TOUCH) {
|
|
||||||
if (_myCamera.getMode() != CAMERA_MODE_THIRD_PERSON) {
|
|
||||||
_myCamera.setMode(CAMERA_MODE_THIRD_PERSON);
|
|
||||||
_myCamera.setModeShiftRate(1.0f);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (_myCamera.getMode() != CAMERA_MODE_MIRROR && !OculusManager::isConnected()) {
|
|
||||||
if (_manualFirstPerson) {
|
|
||||||
if (_myCamera.getMode() != CAMERA_MODE_FIRST_PERSON ) {
|
|
||||||
_myCamera.setMode(CAMERA_MODE_FIRST_PERSON);
|
|
||||||
_myCamera.setModeShiftRate(1.0f);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (_myAvatar.getIsNearInteractingOther()) {
|
|
||||||
if (_myCamera.getMode() != CAMERA_MODE_FIRST_PERSON) {
|
|
||||||
_myCamera.setMode(CAMERA_MODE_FIRST_PERSON);
|
|
||||||
_myCamera.setModeShiftRate(1.0f);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (_myCamera.getMode() != CAMERA_MODE_THIRD_PERSON) {
|
|
||||||
_myCamera.setMode(CAMERA_MODE_THIRD_PERSON);
|
|
||||||
_myCamera.setModeShiftRate(1.0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update audio stats for procedural sounds
|
|
||||||
#ifndef _WIN32
|
|
||||||
_audio.setLastAcceleration(_myAvatar.getThrust());
|
|
||||||
_audio.setLastVelocity(_myAvatar.getVelocity());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
_glWidget->updateGL();
|
_glWidget->updateGL();
|
||||||
_lastTimeIdle = check;
|
_lastTimeIdle = check;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::terminate() {
|
void Application::terminate() {
|
||||||
// Close serial port
|
// Close serial port
|
||||||
// close(serial_fd);
|
// close(serial_fd);
|
||||||
|
|
||||||
if (_autosave) {
|
if (_settingsAutosave->isChecked()) {
|
||||||
saveSettings();
|
saveSettings();
|
||||||
_settings->sync();
|
_settings->sync();
|
||||||
}
|
}
|
||||||
|
@ -1023,7 +866,7 @@ void Application::editPreferences() {
|
||||||
QFormLayout* form = new QFormLayout();
|
QFormLayout* form = new QFormLayout();
|
||||||
layout->addLayout(form, 1);
|
layout->addLayout(form, 1);
|
||||||
|
|
||||||
QLineEdit* avatarURL = new QLineEdit(_settings->value("avatarURL").toString());
|
QLineEdit* avatarURL = new QLineEdit(_myAvatar.getVoxels()->getVoxelURL().toString());
|
||||||
avatarURL->setMinimumWidth(400);
|
avatarURL->setMinimumWidth(400);
|
||||||
form->addRow("Avatar URL:", avatarURL);
|
form->addRow("Avatar URL:", avatarURL);
|
||||||
|
|
||||||
|
@ -1040,7 +883,6 @@ void Application::editPreferences() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QUrl url(avatarURL->text());
|
QUrl url(avatarURL->text());
|
||||||
_settings->setValue("avatarURL", url);
|
|
||||||
_myAvatar.getVoxels()->setVoxelURL(url);
|
_myAvatar.getVoxels()->setVoxelURL(url);
|
||||||
sendAvatarVoxelURLMessage(url);
|
sendAvatarVoxelURLMessage(url);
|
||||||
|
|
||||||
|
@ -1469,7 +1311,7 @@ void Application::initMenu() {
|
||||||
debugMenu->addAction("Wants View Delta Sending", this, SLOT(setWantsDelta(bool)))->setCheckable(true);
|
debugMenu->addAction("Wants View Delta Sending", this, SLOT(setWantsDelta(bool)))->setCheckable(true);
|
||||||
|
|
||||||
QMenu* settingsMenu = menuBar->addMenu("Settings");
|
QMenu* settingsMenu = menuBar->addMenu("Settings");
|
||||||
(_settingsAutosave = settingsMenu->addAction("Autosave", this, SLOT(setAutosave(bool))))->setCheckable(true);
|
(_settingsAutosave = settingsMenu->addAction("Autosave"))->setCheckable(true);
|
||||||
_settingsAutosave->setChecked(true);
|
_settingsAutosave->setChecked(true);
|
||||||
settingsMenu->addAction("Load settings", this, SLOT(loadSettings()));
|
settingsMenu->addAction("Load settings", this, SLOT(loadSettings()));
|
||||||
settingsMenu->addAction("Save settings", this, SLOT(saveSettings()));
|
settingsMenu->addAction("Save settings", this, SLOT(saveSettings()));
|
||||||
|
@ -1477,7 +1319,7 @@ void Application::initMenu() {
|
||||||
settingsMenu->addAction("Export settings", this, SLOT(exportSettings()));
|
settingsMenu->addAction("Export settings", this, SLOT(exportSettings()));
|
||||||
|
|
||||||
_networkAccessManager = new QNetworkAccessManager(this);
|
_networkAccessManager = new QNetworkAccessManager(this);
|
||||||
_settings = new QSettings("High Fidelity", "Interface", this);
|
_settings = new QSettings(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::updateFrustumRenderModeAction() {
|
void Application::updateFrustumRenderModeAction() {
|
||||||
|
@ -1535,10 +1377,6 @@ void Application::init() {
|
||||||
_myCamera.setModeShiftRate(1.0f);
|
_myCamera.setModeShiftRate(1.0f);
|
||||||
_myAvatar.setDisplayingLookatVectors(false);
|
_myAvatar.setDisplayingLookatVectors(false);
|
||||||
|
|
||||||
QUrl avatarURL = _settings->value("avatarURL").toUrl();
|
|
||||||
_myAvatar.getVoxels()->setVoxelURL(avatarURL);
|
|
||||||
sendAvatarVoxelURLMessage(avatarURL);
|
|
||||||
|
|
||||||
QCursor::setPos(_headMouseX, _headMouseY);
|
QCursor::setPos(_headMouseX, _headMouseY);
|
||||||
|
|
||||||
OculusManager::connect();
|
OculusManager::connect();
|
||||||
|
@ -1550,6 +1388,193 @@ void Application::init() {
|
||||||
gettimeofday(&_lastTimeIdle, NULL);
|
gettimeofday(&_lastTimeIdle, NULL);
|
||||||
|
|
||||||
loadSettings();
|
loadSettings();
|
||||||
|
|
||||||
|
sendAvatarVoxelURLMessage(_myAvatar.getVoxels()->getVoxelURL());
|
||||||
|
}
|
||||||
|
|
||||||
|
const float MAX_AVATAR_EDIT_VELOCITY = 1.0f;
|
||||||
|
const float MAX_VOXEL_EDIT_DISTANCE = 20.0f;
|
||||||
|
|
||||||
|
void Application::update(float deltaTime) {
|
||||||
|
// Use Transmitter Hand to move hand if connected, else use mouse
|
||||||
|
if (_myTransmitter.isConnected()) {
|
||||||
|
const float HAND_FORCE_SCALING = 0.01f;
|
||||||
|
glm::vec3 estimatedRotation = _myTransmitter.getEstimatedRotation();
|
||||||
|
glm::vec3 handForce(-estimatedRotation.z, -estimatedRotation.x, estimatedRotation.y);
|
||||||
|
_myAvatar.setMovedHandOffset(handForce * HAND_FORCE_SCALING);
|
||||||
|
} else {
|
||||||
|
// update behaviors for avatar hand movement: handControl takes mouse values as input,
|
||||||
|
// and gives back 3D values modulated for smooth transitioning between interaction modes.
|
||||||
|
_handControl.update(_mouseX, _mouseY);
|
||||||
|
_myAvatar.setMovedHandOffset(_handControl.getValues());
|
||||||
|
}
|
||||||
|
|
||||||
|
// tell my avatar if the mouse is being pressed...
|
||||||
|
_myAvatar.setMousePressed(_mousePressed);
|
||||||
|
|
||||||
|
// check what's under the mouse and update the mouse voxel
|
||||||
|
glm::vec3 mouseRayOrigin, mouseRayDirection;
|
||||||
|
_viewFrustum.computePickRay(_mouseX / (float)_glWidget->width(),
|
||||||
|
_mouseY / (float)_glWidget->height(), mouseRayOrigin, mouseRayDirection);
|
||||||
|
|
||||||
|
// tell my avatar the posiion and direction of the ray projected ino the world based on the mouse position
|
||||||
|
_myAvatar.setMouseRay(mouseRayOrigin, mouseRayDirection);
|
||||||
|
|
||||||
|
_mouseVoxel.s = 0.0f;
|
||||||
|
if (checkedVoxelModeAction() != 0 &&
|
||||||
|
(fabs(_myAvatar.getVelocity().x) +
|
||||||
|
fabs(_myAvatar.getVelocity().y) +
|
||||||
|
fabs(_myAvatar.getVelocity().z)) / 3 < MAX_AVATAR_EDIT_VELOCITY) {
|
||||||
|
float distance;
|
||||||
|
BoxFace face;
|
||||||
|
if (_voxels.findRayIntersection(mouseRayOrigin, mouseRayDirection, _mouseVoxel, distance, face)) {
|
||||||
|
if (distance < MAX_VOXEL_EDIT_DISTANCE) {
|
||||||
|
// find the nearest voxel with the desired scale
|
||||||
|
if (_mouseVoxelScale > _mouseVoxel.s) {
|
||||||
|
// choose the larger voxel that encompasses the one selected
|
||||||
|
_mouseVoxel.x = _mouseVoxelScale * floorf(_mouseVoxel.x / _mouseVoxelScale);
|
||||||
|
_mouseVoxel.y = _mouseVoxelScale * floorf(_mouseVoxel.y / _mouseVoxelScale);
|
||||||
|
_mouseVoxel.z = _mouseVoxelScale * floorf(_mouseVoxel.z / _mouseVoxelScale);
|
||||||
|
_mouseVoxel.s = _mouseVoxelScale;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
glm::vec3 faceVector = getFaceVector(face);
|
||||||
|
if (_mouseVoxelScale < _mouseVoxel.s) {
|
||||||
|
// find the closest contained voxel
|
||||||
|
glm::vec3 pt = (mouseRayOrigin + mouseRayDirection * distance) / (float)TREE_SCALE -
|
||||||
|
faceVector * (_mouseVoxelScale * 0.5f);
|
||||||
|
_mouseVoxel.x = _mouseVoxelScale * floorf(pt.x / _mouseVoxelScale);
|
||||||
|
_mouseVoxel.y = _mouseVoxelScale * floorf(pt.y / _mouseVoxelScale);
|
||||||
|
_mouseVoxel.z = _mouseVoxelScale * floorf(pt.z / _mouseVoxelScale);
|
||||||
|
_mouseVoxel.s = _mouseVoxelScale;
|
||||||
|
}
|
||||||
|
if (_addVoxelMode->isChecked()) {
|
||||||
|
// use the face to determine the side on which to create a neighbor
|
||||||
|
_mouseVoxel.x += faceVector.x * _mouseVoxel.s;
|
||||||
|
_mouseVoxel.y += faceVector.y * _mouseVoxel.s;
|
||||||
|
_mouseVoxel.z += faceVector.z * _mouseVoxel.s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_mouseVoxel.s = 0.0f;
|
||||||
|
}
|
||||||
|
} else if (_addVoxelMode->isChecked() || _selectVoxelMode->isChecked()) {
|
||||||
|
// place the voxel a fixed distance away
|
||||||
|
float worldMouseVoxelScale = _mouseVoxelScale * TREE_SCALE;
|
||||||
|
glm::vec3 pt = mouseRayOrigin + mouseRayDirection * (2.0f + worldMouseVoxelScale * 0.5f);
|
||||||
|
_mouseVoxel.x = _mouseVoxelScale * floorf(pt.x / worldMouseVoxelScale);
|
||||||
|
_mouseVoxel.y = _mouseVoxelScale * floorf(pt.y / worldMouseVoxelScale);
|
||||||
|
_mouseVoxel.z = _mouseVoxelScale * floorf(pt.z / worldMouseVoxelScale);
|
||||||
|
_mouseVoxel.s = _mouseVoxelScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_deleteVoxelMode->isChecked()) {
|
||||||
|
// red indicates deletion
|
||||||
|
_mouseVoxel.red = 255;
|
||||||
|
_mouseVoxel.green = _mouseVoxel.blue = 0;
|
||||||
|
} else if (_selectVoxelMode->isChecked()) {
|
||||||
|
// yellow indicates deletion
|
||||||
|
_mouseVoxel.red = _mouseVoxel.green = 255;
|
||||||
|
_mouseVoxel.blue = 0;
|
||||||
|
} else { // _addVoxelMode->isChecked() || _colorVoxelMode->isChecked()
|
||||||
|
QColor paintColor = _voxelPaintColor->data().value<QColor>();
|
||||||
|
_mouseVoxel.red = paintColor.red();
|
||||||
|
_mouseVoxel.green = paintColor.green();
|
||||||
|
_mouseVoxel.blue = paintColor.blue();
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we just edited, use the currently selected voxel as the "last" for drag detection
|
||||||
|
if (_justEditedVoxel) {
|
||||||
|
_lastMouseVoxelPos = glm::vec3(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z);
|
||||||
|
_justEditedVoxel = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// walking triggers the handControl to stop
|
||||||
|
if (_myAvatar.getMode() == AVATAR_MODE_WALKING) {
|
||||||
|
_handControl.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update from Mouse
|
||||||
|
if (_mouseLook->isChecked()) {
|
||||||
|
QPoint mouse = QCursor::pos();
|
||||||
|
_myAvatar.updateFromMouse(_glWidget->mapFromGlobal(mouse).x(),
|
||||||
|
_glWidget->mapFromGlobal(mouse).y(),
|
||||||
|
_glWidget->width(),
|
||||||
|
_glWidget->height());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read serial port interface devices
|
||||||
|
if (_serialHeadSensor.active) {
|
||||||
|
_serialHeadSensor.readData(deltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update transmitter
|
||||||
|
|
||||||
|
// Sample hardware, update view frustum if needed, and send avatar data to mixer/agents
|
||||||
|
updateAvatar(deltaTime);
|
||||||
|
|
||||||
|
// read incoming packets from network
|
||||||
|
if (!_enableNetworkThread) {
|
||||||
|
networkReceive(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//loop through all the other avatars and simulate them...
|
||||||
|
AgentList* agentList = AgentList::getInstance();
|
||||||
|
agentList->lock();
|
||||||
|
for(AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) {
|
||||||
|
if (agent->getLinkedData() != NULL) {
|
||||||
|
Avatar *avatar = (Avatar *)agent->getLinkedData();
|
||||||
|
if (!avatar->isInitialized()) {
|
||||||
|
avatar->init();
|
||||||
|
}
|
||||||
|
avatar->simulate(deltaTime, NULL);
|
||||||
|
avatar->setMouseRay(mouseRayOrigin, mouseRayDirection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
agentList->unlock();
|
||||||
|
|
||||||
|
// Simulate myself
|
||||||
|
_myAvatar.setGravity(_environment.getGravity(_myAvatar.getPosition()));
|
||||||
|
if (_transmitterDrives->isChecked() && _myTransmitter.isConnected()) {
|
||||||
|
_myAvatar.simulate(deltaTime, &_myTransmitter);
|
||||||
|
} else {
|
||||||
|
_myAvatar.simulate(deltaTime, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TESTING_AVATAR_TOUCH) {
|
||||||
|
if (_myCamera.getMode() != CAMERA_MODE_THIRD_PERSON) {
|
||||||
|
_myCamera.setMode(CAMERA_MODE_THIRD_PERSON);
|
||||||
|
_myCamera.setModeShiftRate(1.0f);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (_myCamera.getMode() != CAMERA_MODE_MIRROR && !OculusManager::isConnected()) {
|
||||||
|
if (_manualFirstPerson) {
|
||||||
|
if (_myCamera.getMode() != CAMERA_MODE_FIRST_PERSON ) {
|
||||||
|
_myCamera.setMode(CAMERA_MODE_FIRST_PERSON);
|
||||||
|
_myCamera.setModeShiftRate(1.0f);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (_myAvatar.getIsNearInteractingOther()) {
|
||||||
|
if (_myCamera.getMode() != CAMERA_MODE_FIRST_PERSON) {
|
||||||
|
_myCamera.setMode(CAMERA_MODE_FIRST_PERSON);
|
||||||
|
_myCamera.setModeShiftRate(1.0f);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (_myCamera.getMode() != CAMERA_MODE_THIRD_PERSON) {
|
||||||
|
_myCamera.setMode(CAMERA_MODE_THIRD_PERSON);
|
||||||
|
_myCamera.setModeShiftRate(1.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update audio stats for procedural sounds
|
||||||
|
#ifndef _WIN32
|
||||||
|
_audio.setLastAcceleration(_myAvatar.getThrust());
|
||||||
|
_audio.setLastVelocity(_myAvatar.getVelocity());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::updateAvatar(float deltaTime) {
|
void Application::updateAvatar(float deltaTime) {
|
||||||
|
@ -2535,10 +2560,6 @@ void Application::saveAction(QSettings* set, QAction* action) {
|
||||||
set->setValue(action->text(), action->isChecked());
|
set->setValue(action->text(), action->isChecked());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setAutosave(bool wantsAutosave) {
|
|
||||||
_autosave = wantsAutosave;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Application::loadSettings(QSettings* set) {
|
void Application::loadSettings(QSettings* set) {
|
||||||
if (!set) set = getSettings();
|
if (!set) set = getSettings();
|
||||||
|
|
||||||
|
@ -2553,8 +2574,6 @@ void Application::saveSettings(QSettings* set) {
|
||||||
set->setValue("headCameraPitchYawScale", _headCameraPitchYawScale);
|
set->setValue("headCameraPitchYawScale", _headCameraPitchYawScale);
|
||||||
scanMenuBar(&Application::saveAction, set);
|
scanMenuBar(&Application::saveAction, set);
|
||||||
getAvatar()->saveData(set);
|
getAvatar()->saveData(set);
|
||||||
|
|
||||||
set->sync();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::importSettings() {
|
void Application::importSettings() {
|
||||||
|
|
|
@ -112,7 +112,6 @@ private slots:
|
||||||
void decreaseVoxelSize();
|
void decreaseVoxelSize();
|
||||||
void increaseVoxelSize();
|
void increaseVoxelSize();
|
||||||
void chooseVoxelPaintColor();
|
void chooseVoxelPaintColor();
|
||||||
void setAutosave(bool wantsAutosave);
|
|
||||||
void loadSettings(QSettings* set = NULL);
|
void loadSettings(QSettings* set = NULL);
|
||||||
void saveSettings(QSettings* set = NULL);
|
void saveSettings(QSettings* set = NULL);
|
||||||
void importSettings();
|
void importSettings();
|
||||||
|
@ -132,6 +131,7 @@ private:
|
||||||
void initDisplay();
|
void initDisplay();
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
|
void update(float deltaTime);
|
||||||
void updateAvatar(float deltaTime);
|
void updateAvatar(float deltaTime);
|
||||||
void loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum);
|
void loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum);
|
||||||
|
|
||||||
|
@ -293,8 +293,6 @@ private:
|
||||||
int _packetsPerSecond;
|
int _packetsPerSecond;
|
||||||
int _bytesPerSecond;
|
int _bytesPerSecond;
|
||||||
int _bytesCount;
|
int _bytesCount;
|
||||||
|
|
||||||
bool _autosave; // True if the autosave is on.
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* defined(__interface__Application__) */
|
#endif /* defined(__interface__Application__) */
|
||||||
|
|
|
@ -1225,6 +1225,8 @@ void Avatar::loadData(QSettings* set) {
|
||||||
_position.y = set->value("position_y", _position.y).toFloat();
|
_position.y = set->value("position_y", _position.y).toFloat();
|
||||||
_position.z = set->value("position_z", _position.z).toFloat();
|
_position.z = set->value("position_z", _position.z).toFloat();
|
||||||
|
|
||||||
|
_voxels.setVoxelURL(set->value("voxelURL").toUrl());
|
||||||
|
|
||||||
set->endGroup();
|
set->endGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1244,6 +1246,8 @@ void Avatar::saveData(QSettings* set) {
|
||||||
set->setValue("position_y", _position.y);
|
set->setValue("position_y", _position.y);
|
||||||
set->setValue("position_z", _position.z);
|
set->setValue("position_z", _position.z);
|
||||||
|
|
||||||
|
set->setValue("voxelURL", _voxels.getVoxelURL());
|
||||||
|
|
||||||
set->endGroup();
|
set->endGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,7 +71,7 @@ void Camera::updateFollowMode(float deltaTime) {
|
||||||
_distance = _previousDistance * (1.0f - _modeShift) + _newDistance * _modeShift;
|
_distance = _previousDistance * (1.0f - _modeShift) + _newDistance * _modeShift;
|
||||||
_tightness = _previousTightness * (1.0f - _modeShift) + _newTightness * _modeShift;
|
_tightness = _previousTightness * (1.0f - _modeShift) + _newTightness * _modeShift;
|
||||||
|
|
||||||
if (_linearModeShift > 1.0f ) {
|
if (_needsToInitialize || _linearModeShift > 1.0f) {
|
||||||
_linearModeShift = 1.0f;
|
_linearModeShift = 1.0f;
|
||||||
_modeShift = 1.0f;
|
_modeShift = 1.0f;
|
||||||
_upShift = _newUpShift;
|
_upShift = _newUpShift;
|
||||||
|
|
Loading…
Reference in a new issue