mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 11:07:07 +02:00
Merge branch 'master' of https://github.com/highfidelity/hifi into ac-ice-connect
This commit is contained in:
commit
27db69207d
15 changed files with 56 additions and 24 deletions
|
@ -392,6 +392,13 @@ function scriptEnding() {
|
||||||
Overlays.deleteOverlay(spawnButton);
|
Overlays.deleteOverlay(spawnButton);
|
||||||
Overlays.deleteOverlay(deleteButton);
|
Overlays.deleteOverlay(deleteButton);
|
||||||
|
|
||||||
|
|
||||||
|
//We only want to delete everything if we've spawned them first.
|
||||||
|
//Otherwise we'll throw an error- if we have edge1 we've spawned them all.
|
||||||
|
if(!edge1){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Entities.editEntity(edge1, {
|
Entities.editEntity(edge1, {
|
||||||
locked: false
|
locked: false
|
||||||
});
|
});
|
||||||
|
@ -418,7 +425,6 @@ function scriptEnding() {
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Entities.deleteEntity(edge1);
|
Entities.deleteEntity(edge1);
|
||||||
Entities.deleteEntity(edge2);
|
Entities.deleteEntity(edge2);
|
||||||
Entities.deleteEntity(edge3a);
|
Entities.deleteEntity(edge3a);
|
||||||
|
|
|
@ -23,6 +23,8 @@ const GRAVITY = {x: 0, y: -2.8, z: 0};
|
||||||
const DENSITY = 2000;
|
const DENSITY = 2000;
|
||||||
const DAMPING_FACTOR = 0.98;
|
const DAMPING_FACTOR = 0.98;
|
||||||
const ANGULAR_DAMPING_FACTOR = 0.8;
|
const ANGULAR_DAMPING_FACTOR = 0.8;
|
||||||
|
const FRICTION = 0.99;
|
||||||
|
const RESTITUTION = 0.0;
|
||||||
const SPAWN_DISTANCE = 3;
|
const SPAWN_DISTANCE = 3;
|
||||||
const BLOCK_YAW_OFFSET = 45;
|
const BLOCK_YAW_OFFSET = 45;
|
||||||
const BUTTON_DIMENSIONS = {width: 49, height: 49};
|
const BUTTON_DIMENSIONS = {width: 49, height: 49};
|
||||||
|
@ -110,6 +112,8 @@ function resetBlocks() {
|
||||||
rotation: Quat.multiply(layerRotation, offsetRot),
|
rotation: Quat.multiply(layerRotation, offsetRot),
|
||||||
collisionsWillMove: true,
|
collisionsWillMove: true,
|
||||||
damping: DAMPING_FACTOR,
|
damping: DAMPING_FACTOR,
|
||||||
|
restitution: RESTITUTION,
|
||||||
|
friction: FRICTION,
|
||||||
angularDamping: ANGULAR_DAMPING_FACTOR,
|
angularDamping: ANGULAR_DAMPING_FACTOR,
|
||||||
gravity: GRAVITY,
|
gravity: GRAVITY,
|
||||||
density: DENSITY
|
density: DENSITY
|
||||||
|
|
|
@ -284,7 +284,7 @@
|
||||||
var elModelOriginalTextures = document.getElementById("property-model-original-textures");
|
var elModelOriginalTextures = document.getElementById("property-model-original-textures");
|
||||||
|
|
||||||
var elWebSections = document.querySelectorAll(".web-section");
|
var elWebSections = document.querySelectorAll(".web-section");
|
||||||
allSections.push(elModelSections);
|
allSections.push(elWebSections);
|
||||||
var elWebSourceURL = document.getElementById("property-web-source-url");
|
var elWebSourceURL = document.getElementById("property-web-source-url");
|
||||||
|
|
||||||
var elTextSections = document.querySelectorAll(".text-section");
|
var elTextSections = document.querySelectorAll(".text-section");
|
||||||
|
@ -481,7 +481,7 @@
|
||||||
elModelTextures.value = properties.textures;
|
elModelTextures.value = properties.textures;
|
||||||
elModelOriginalTextures.value = properties.originalTextures;
|
elModelOriginalTextures.value = properties.originalTextures;
|
||||||
} else if (properties.type == "Web") {
|
} else if (properties.type == "Web") {
|
||||||
for (var i = 0; i < elTextSections.length; i++) {
|
for (var i = 0; i < elWebSections.length; i++) {
|
||||||
elWebSections[i].style.display = 'block';
|
elWebSections[i].style.display = 'block';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1213,7 +1213,7 @@ SelectionDisplay = (function () {
|
||||||
rotation: rotation,
|
rotation: rotation,
|
||||||
visible: true,
|
visible: true,
|
||||||
});
|
});
|
||||||
var distance = (properties.dimensions.z / 2) * Math.tan(properties.cutoff * (Math.PI / 180));
|
var distance = (properties.dimensions.z / 2) * Math.sin(properties.cutoff * (Math.PI / 180));
|
||||||
|
|
||||||
Overlays.editOverlay(grabberSpotLightL, {
|
Overlays.editOverlay(grabberSpotLightL, {
|
||||||
position: EdgeNL,
|
position: EdgeNL,
|
||||||
|
|
|
@ -339,7 +339,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) :
|
||||||
_aboutToQuit(false),
|
_aboutToQuit(false),
|
||||||
_notifiedPacketVersionMismatchThisDomain(false),
|
_notifiedPacketVersionMismatchThisDomain(false),
|
||||||
_domainConnectionRefusals(QList<QString>()),
|
_domainConnectionRefusals(QList<QString>()),
|
||||||
_maxOctreePPS(maxOctreePacketsPerSecond.get())
|
_maxOctreePPS(maxOctreePacketsPerSecond.get()),
|
||||||
|
_lastFaceTrackerUpdate(0)
|
||||||
{
|
{
|
||||||
setInstance(this);
|
setInstance(this);
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
|
@ -2413,7 +2414,27 @@ void Application::update(float deltaTime) {
|
||||||
FaceTracker* tracker = getActiveFaceTracker();
|
FaceTracker* tracker = getActiveFaceTracker();
|
||||||
if (tracker && !tracker->isMuted()) {
|
if (tracker && !tracker->isMuted()) {
|
||||||
tracker->update(deltaTime);
|
tracker->update(deltaTime);
|
||||||
|
|
||||||
|
// Auto-mute microphone after losing face tracking?
|
||||||
|
if (tracker->isTracking()) {
|
||||||
|
_lastFaceTrackerUpdate = usecTimestampNow();
|
||||||
|
} else {
|
||||||
|
const quint64 MUTE_MICROPHONE_AFTER_USECS = 5000000; //5 secs
|
||||||
|
Menu* menu = Menu::getInstance();
|
||||||
|
if (menu->isOptionChecked(MenuOption::AutoMuteAudio) && !menu->isOptionChecked(MenuOption::MuteAudio)) {
|
||||||
|
if (_lastFaceTrackerUpdate > 0
|
||||||
|
&& ((usecTimestampNow() - _lastFaceTrackerUpdate) > MUTE_MICROPHONE_AFTER_USECS)) {
|
||||||
|
menu->triggerOption(MenuOption::MuteAudio);
|
||||||
|
_lastFaceTrackerUpdate = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_lastFaceTrackerUpdate = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_lastFaceTrackerUpdate = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SixenseManager::getInstance().update(deltaTime);
|
SixenseManager::getInstance().update(deltaTime);
|
||||||
JoystickScriptingInterface::getInstance().update();
|
JoystickScriptingInterface::getInstance().update();
|
||||||
}
|
}
|
||||||
|
@ -2461,7 +2482,6 @@ void Application::update(float deltaTime) {
|
||||||
if (_physicsEngine.hasOutgoingChanges()) {
|
if (_physicsEngine.hasOutgoingChanges()) {
|
||||||
_entitySimulation.lock();
|
_entitySimulation.lock();
|
||||||
_entitySimulation.handleOutgoingChanges(_physicsEngine.getOutgoingChanges(), _physicsEngine.getSessionID());
|
_entitySimulation.handleOutgoingChanges(_physicsEngine.getOutgoingChanges(), _physicsEngine.getSessionID());
|
||||||
_entitySimulation.handleCollisionEvents(_physicsEngine.getCollisionEvents());
|
|
||||||
_entitySimulation.unlock();
|
_entitySimulation.unlock();
|
||||||
_physicsEngine.dumpStatsIfNecessary();
|
_physicsEngine.dumpStatsIfNecessary();
|
||||||
}
|
}
|
||||||
|
@ -2469,9 +2489,11 @@ void Application::update(float deltaTime) {
|
||||||
|
|
||||||
if (!_aboutToQuit) {
|
if (!_aboutToQuit) {
|
||||||
PerformanceTimer perfTimer("entities");
|
PerformanceTimer perfTimer("entities");
|
||||||
// NOTE: the _entities.update() call below will wait for lock
|
// Collision events (and their scripts) must not be handled when we're locked, above. (That would risk deadlock.)
|
||||||
|
_entitySimulation.handleCollisionEvents(_physicsEngine.getCollisionEvents());
|
||||||
|
// NOTE: the _entities.update() call below will wait for lock
|
||||||
// and will simulate entity motion (the EntityTree has been given an EntitySimulation).
|
// and will simulate entity motion (the EntityTree has been given an EntitySimulation).
|
||||||
_entities.update(); // update the models...
|
_entities.update(); // update the models...
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
|
@ -668,6 +668,8 @@ private:
|
||||||
glm::uvec2 _renderResolution;
|
glm::uvec2 _renderResolution;
|
||||||
|
|
||||||
int _maxOctreePPS = DEFAULT_MAX_OCTREE_PPS;
|
int _maxOctreePPS = DEFAULT_MAX_OCTREE_PPS;
|
||||||
|
|
||||||
|
quint64 _lastFaceTrackerUpdate;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_Application_h
|
#endif // hifi_Application_h
|
||||||
|
|
|
@ -407,6 +407,7 @@ Menu::Menu() {
|
||||||
addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::MuteFaceTracking,
|
addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::MuteFaceTracking,
|
||||||
Qt::CTRL | Qt::SHIFT | Qt::Key_F, true, // DDE face tracking is on by default
|
Qt::CTRL | Qt::SHIFT | Qt::Key_F, true, // DDE face tracking is on by default
|
||||||
qApp, SLOT(toggleFaceTrackerMute()));
|
qApp, SLOT(toggleFaceTrackerMute()));
|
||||||
|
addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::AutoMuteAudio, 0, true);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
auto avatarManager = DependencyManager::get<AvatarManager>();
|
auto avatarManager = DependencyManager::get<AvatarManager>();
|
||||||
|
|
|
@ -147,6 +147,7 @@ namespace MenuOption {
|
||||||
const QString AudioScopeTwentyFrames = "Twenty";
|
const QString AudioScopeTwentyFrames = "Twenty";
|
||||||
const QString AudioStats = "Audio Stats";
|
const QString AudioStats = "Audio Stats";
|
||||||
const QString AudioStatsShowInjectedStreams = "Audio Stats Show Injected Streams";
|
const QString AudioStatsShowInjectedStreams = "Audio Stats Show Injected Streams";
|
||||||
|
const QString AutoMuteAudio = "Auto Mute Microphone";
|
||||||
const QString AvatarReceiveStats = "Show Receive Stats";
|
const QString AvatarReceiveStats = "Show Receive Stats";
|
||||||
const QString BandwidthDetails = "Bandwidth Details";
|
const QString BandwidthDetails = "Bandwidth Details";
|
||||||
const QString BinaryEyelidControl = "Binary Eyelid Control";
|
const QString BinaryEyelidControl = "Binary Eyelid Control";
|
||||||
|
|
|
@ -293,6 +293,10 @@ void DdeFaceTracker::reset() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DdeFaceTracker::isActive() const {
|
bool DdeFaceTracker::isActive() const {
|
||||||
|
return (_ddeProcess != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DdeFaceTracker::isTracking() const {
|
||||||
static const quint64 ACTIVE_TIMEOUT_USECS = 3000000; //3 secs
|
static const quint64 ACTIVE_TIMEOUT_USECS = 3000000; //3 secs
|
||||||
return (usecTimestampNow() - _lastReceiveTimestamp < ACTIVE_TIMEOUT_USECS);
|
return (usecTimestampNow() - _lastReceiveTimestamp < ACTIVE_TIMEOUT_USECS);
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ public:
|
||||||
virtual void reset();
|
virtual void reset();
|
||||||
|
|
||||||
virtual bool isActive() const;
|
virtual bool isActive() const;
|
||||||
virtual bool isTracking() const { return isActive(); }
|
virtual bool isTracking() const;
|
||||||
|
|
||||||
float getLeftBlink() const { return getBlendshapeCoefficient(_leftBlinkIndex); }
|
float getLeftBlink() const { return getBlendshapeCoefficient(_leftBlinkIndex); }
|
||||||
float getRightBlink() const { return getBlendshapeCoefficient(_rightBlinkIndex); }
|
float getRightBlink() const { return getBlendshapeCoefficient(_rightBlinkIndex); }
|
||||||
|
|
|
@ -1174,8 +1174,7 @@ void EntityTreeRenderer::entityCollisionWithEntity(const EntityItemID& idA, cons
|
||||||
if (!_tree || _shuttingDown) {
|
if (!_tree || _shuttingDown) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Don't respond to small continuous contacts. It causes deadlocks when locking the entityTree.
|
// Don't respond to small continuous contacts.
|
||||||
// Note that any entity script is likely to Entities.getEntityProperties(), which locks the tree.
|
|
||||||
const float COLLISION_MINUMUM_PENETRATION = 0.005;
|
const float COLLISION_MINUMUM_PENETRATION = 0.005;
|
||||||
if ((collision.type != CONTACT_EVENT_TYPE_START) && (glm::length(collision.penetration) < COLLISION_MINUMUM_PENETRATION)) {
|
if ((collision.type != CONTACT_EVENT_TYPE_START) && (glm::length(collision.penetration) < COLLISION_MINUMUM_PENETRATION)) {
|
||||||
return;
|
return;
|
||||||
|
@ -1183,16 +1182,9 @@ void EntityTreeRenderer::entityCollisionWithEntity(const EntityItemID& idA, cons
|
||||||
|
|
||||||
// See if we should play sounds
|
// See if we should play sounds
|
||||||
EntityTree* entityTree = static_cast<EntityTree*>(_tree);
|
EntityTree* entityTree = static_cast<EntityTree*>(_tree);
|
||||||
if (!entityTree->tryLockForRead()) {
|
|
||||||
// I don't know why this can happen, but if it does,
|
|
||||||
// the consequences are a deadlock, so bail.
|
|
||||||
qCDebug(entitiesrenderer) << "NOTICE: skipping collision type " << collision.type << " penetration " << glm::length(collision.penetration);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const QUuid& myNodeID = DependencyManager::get<NodeList>()->getSessionUUID();
|
const QUuid& myNodeID = DependencyManager::get<NodeList>()->getSessionUUID();
|
||||||
playEntityCollisionSound(myNodeID, entityTree, idA, collision);
|
playEntityCollisionSound(myNodeID, entityTree, idA, collision);
|
||||||
playEntityCollisionSound(myNodeID, entityTree, idB, collision);
|
playEntityCollisionSound(myNodeID, entityTree, idB, collision);
|
||||||
entityTree->unlock();
|
|
||||||
|
|
||||||
// And now the entity scripts
|
// And now the entity scripts
|
||||||
QScriptValue entityScriptA = loadEntityScript(idA);
|
QScriptValue entityScriptA = loadEntityScript(idA);
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
|
|
||||||
#include "EntityTreeRenderer.h"
|
#include "EntityTreeRenderer.h"
|
||||||
|
|
||||||
const int FIXED_FONT_POINT_SIZE = 40;
|
|
||||||
const float DPI = 30.47;
|
const float DPI = 30.47;
|
||||||
const float METERS_TO_INCHES = 39.3701;
|
const float METERS_TO_INCHES = 39.3701;
|
||||||
|
|
||||||
|
@ -161,7 +160,6 @@ void RenderableWebEntityItem::render(RenderArgs* args) {
|
||||||
glm::vec3 axis = glm::axis(rotation);
|
glm::vec3 axis = glm::axis(rotation);
|
||||||
glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z);
|
glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z);
|
||||||
|
|
||||||
float alpha = 1.0f;
|
|
||||||
static const glm::vec2 texMin(0);
|
static const glm::vec2 texMin(0);
|
||||||
static const glm::vec2 texMax(1);
|
static const glm::vec2 texMax(1);
|
||||||
glm::vec2 topLeft(-halfDimensions.x, -halfDimensions.y);
|
glm::vec2 topLeft(-halfDimensions.x, -halfDimensions.y);
|
||||||
|
|
|
@ -64,7 +64,7 @@ EntityItemProperties::EntityItemProperties() :
|
||||||
CONSTRUCT_PROPERTY(isSpotlight, false),
|
CONSTRUCT_PROPERTY(isSpotlight, false),
|
||||||
CONSTRUCT_PROPERTY(intensity, 1.0f),
|
CONSTRUCT_PROPERTY(intensity, 1.0f),
|
||||||
CONSTRUCT_PROPERTY(exponent, 0.0f),
|
CONSTRUCT_PROPERTY(exponent, 0.0f),
|
||||||
CONSTRUCT_PROPERTY(cutoff, PI),
|
CONSTRUCT_PROPERTY(cutoff, ENTITY_ITEM_DEFAULT_CUTOFF),
|
||||||
CONSTRUCT_PROPERTY(locked, ENTITY_ITEM_DEFAULT_LOCKED),
|
CONSTRUCT_PROPERTY(locked, ENTITY_ITEM_DEFAULT_LOCKED),
|
||||||
CONSTRUCT_PROPERTY(textures, ""),
|
CONSTRUCT_PROPERTY(textures, ""),
|
||||||
CONSTRUCT_PROPERTY(animationSettings, ""),
|
CONSTRUCT_PROPERTY(animationSettings, ""),
|
||||||
|
|
|
@ -64,6 +64,8 @@ const float ENTITY_ITEM_DEFAULT_FRICTION = 0.5f;
|
||||||
const bool ENTITY_ITEM_DEFAULT_IGNORE_FOR_COLLISIONS = false;
|
const bool ENTITY_ITEM_DEFAULT_IGNORE_FOR_COLLISIONS = false;
|
||||||
const bool ENTITY_ITEM_DEFAULT_COLLISIONS_WILL_MOVE = false;
|
const bool ENTITY_ITEM_DEFAULT_COLLISIONS_WILL_MOVE = false;
|
||||||
|
|
||||||
|
const float ENTITY_ITEM_DEFAULT_CUTOFF = PI / 2;
|
||||||
|
|
||||||
const QString ENTITY_ITEM_DEFAULT_NAME = QString("");
|
const QString ENTITY_ITEM_DEFAULT_NAME = QString("");
|
||||||
|
|
||||||
#endif // hifi_EntityItemPropertiesDefaults_h
|
#endif // hifi_EntityItemPropertiesDefaults_h
|
||||||
|
|
|
@ -46,7 +46,7 @@ void LightEntityItem::setDimensions(const glm::vec3& value) {
|
||||||
// If we are a spotlight, treat the z value as our radius or length, and
|
// If we are a spotlight, treat the z value as our radius or length, and
|
||||||
// recalculate the x/y dimensions to properly encapsulate the spotlight.
|
// recalculate the x/y dimensions to properly encapsulate the spotlight.
|
||||||
const float length = value.z;
|
const float length = value.z;
|
||||||
const float width = length * glm::tan(glm::radians(_cutoff));
|
const float width = length * glm::sin(glm::radians(_cutoff));
|
||||||
_dimensions = glm::vec3(width, width, length);
|
_dimensions = glm::vec3(width, width, length);
|
||||||
} else {
|
} else {
|
||||||
float maxDimension = glm::max(value.x, value.y, value.z);
|
float maxDimension = glm::max(value.x, value.y, value.z);
|
||||||
|
@ -73,7 +73,7 @@ void LightEntityItem::setIsSpotlight(bool value) {
|
||||||
|
|
||||||
if (_isSpotlight) {
|
if (_isSpotlight) {
|
||||||
const float length = _dimensions.z;
|
const float length = _dimensions.z;
|
||||||
const float width = length * glm::tan(glm::radians(_cutoff));
|
const float width = length * glm::sin(glm::radians(_cutoff));
|
||||||
_dimensions = glm::vec3(width, width, length);
|
_dimensions = glm::vec3(width, width, length);
|
||||||
} else {
|
} else {
|
||||||
float maxDimension = glm::max(_dimensions.x, _dimensions.y, _dimensions.z);
|
float maxDimension = glm::max(_dimensions.x, _dimensions.y, _dimensions.z);
|
||||||
|
@ -89,7 +89,7 @@ void LightEntityItem::setCutoff(float value) {
|
||||||
// If we are a spotlight, adjusting the cutoff will affect the area we encapsulate,
|
// If we are a spotlight, adjusting the cutoff will affect the area we encapsulate,
|
||||||
// so update the dimensions to reflect this.
|
// so update the dimensions to reflect this.
|
||||||
const float length = _dimensions.z;
|
const float length = _dimensions.z;
|
||||||
const float width = length * glm::tan(glm::radians(_cutoff));
|
const float width = length * glm::sin(glm::radians(_cutoff));
|
||||||
_dimensions = glm::vec3(width, width, length);
|
_dimensions = glm::vec3(width, width, length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue