mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 06:10:52 +02:00
Merge branch 'master' of https://github.com/highfidelity/hifi into controllers
This commit is contained in:
commit
1be494a257
15 changed files with 168 additions and 90 deletions
10
cmake/externals/bullet/CMakeLists.txt
vendored
10
cmake/externals/bullet/CMakeLists.txt
vendored
|
@ -18,8 +18,8 @@ if (WIN32)
|
||||||
ExternalProject_Add(
|
ExternalProject_Add(
|
||||||
${EXTERNAL_NAME}
|
${EXTERNAL_NAME}
|
||||||
# URL https://bullet.googlecode.com/files/bullet-2.82-r2704.zip
|
# URL https://bullet.googlecode.com/files/bullet-2.82-r2704.zip
|
||||||
URL http://hifi-public.s3.amazonaws.com/dependencies/bullet-2.82-r2704.zip
|
URL http://hifi-public.s3.amazonaws.com/dependencies/bullet-2.82-ccd-fix.zip
|
||||||
URL_MD5 f5e8914fc9064ad32e0d62d19d33d977
|
URL_MD5 d95b07eb120de7dd7786361c0b5a8d9f
|
||||||
CMAKE_ARGS ${PLATFORM_CMAKE_ARGS} -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DBUILD_EXTRAS=0 -DINSTALL_LIBS=1 -DBUILD_DEMOS=0 -DUSE_GLUT=0 -DUSE_DX11=0
|
CMAKE_ARGS ${PLATFORM_CMAKE_ARGS} -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DBUILD_EXTRAS=0 -DINSTALL_LIBS=1 -DBUILD_DEMOS=0 -DUSE_GLUT=0 -DUSE_DX11=0
|
||||||
LOG_DOWNLOAD 1
|
LOG_DOWNLOAD 1
|
||||||
LOG_CONFIGURE 1
|
LOG_CONFIGURE 1
|
||||||
|
@ -30,8 +30,8 @@ else ()
|
||||||
ExternalProject_Add(
|
ExternalProject_Add(
|
||||||
${EXTERNAL_NAME}
|
${EXTERNAL_NAME}
|
||||||
#URL http://bullet.googlecode.com/files/bullet-2.82-r2704.tgz
|
#URL http://bullet.googlecode.com/files/bullet-2.82-r2704.tgz
|
||||||
URL http://hifi-public.s3.amazonaws.com/dependencies/bullet-2.82-r2704.tgz
|
URL http://hifi-public.s3.amazonaws.com/dependencies/bullet-2.82-ccd-fix.tgz
|
||||||
URL_MD5 70b3c8d202dee91a0854b4cbc88173e8
|
URL_MD5 fb140a4983b4109aa1c825a162aa8d64
|
||||||
CMAKE_ARGS ${PLATFORM_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DBUILD_EXTRAS=0 -DINSTALL_LIBS=1 -DBUILD_DEMOS=0 -DUSE_GLUT=0
|
CMAKE_ARGS ${PLATFORM_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DBUILD_EXTRAS=0 -DINSTALL_LIBS=1 -DBUILD_DEMOS=0 -DUSE_GLUT=0
|
||||||
LOG_DOWNLOAD 1
|
LOG_DOWNLOAD 1
|
||||||
LOG_CONFIGURE 1
|
LOG_CONFIGURE 1
|
||||||
|
@ -80,4 +80,4 @@ endif ()
|
||||||
|
|
||||||
if (DEFINED ${EXTERNAL_NAME_UPPER}_DYNAMICS_LIBRARY_RELEASE)
|
if (DEFINED ${EXTERNAL_NAME_UPPER}_DYNAMICS_LIBRARY_RELEASE)
|
||||||
set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INSTALL_DIR}/include/bullet CACHE PATH "Path to bullet include directory")
|
set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INSTALL_DIR}/include/bullet CACHE PATH "Path to bullet include directory")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
4
cmake/externals/quazip/CMakeLists.txt
vendored
4
cmake/externals/quazip/CMakeLists.txt
vendored
|
@ -3,12 +3,14 @@ string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
|
||||||
cmake_policy(SET CMP0046 OLD)
|
cmake_policy(SET CMP0046 OLD)
|
||||||
|
|
||||||
include(ExternalProject)
|
include(ExternalProject)
|
||||||
|
|
||||||
|
string(REPLACE \\ / QT_CMAKE_PREFIX_PATH $ENV{QT_CMAKE_PREFIX_PATH})
|
||||||
ExternalProject_Add(
|
ExternalProject_Add(
|
||||||
${EXTERNAL_NAME}
|
${EXTERNAL_NAME}
|
||||||
URL http://s3-us-west-1.amazonaws.com/hifi-production/dependencies/quazip-0.6.2.zip
|
URL http://s3-us-west-1.amazonaws.com/hifi-production/dependencies/quazip-0.6.2.zip
|
||||||
URL_MD5 514851970f1a14d815bdc3ad6267af4d
|
URL_MD5 514851970f1a14d815bdc3ad6267af4d
|
||||||
BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build
|
BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build
|
||||||
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DCMAKE_PREFIX_PATH=$ENV{QT_CMAKE_PREFIX_PATH} -DCMAKE_INSTALL_NAME_DIR:PATH=<INSTALL_DIR>/lib -DZLIB_ROOT=${ZLIB_ROOT}
|
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DCMAKE_PREFIX_PATH=${QT_CMAKE_PREFIX_PATH} -DCMAKE_INSTALL_NAME_DIR:PATH=<INSTALL_DIR>/lib -DZLIB_ROOT=${ZLIB_ROOT}
|
||||||
LOG_DOWNLOAD 1
|
LOG_DOWNLOAD 1
|
||||||
LOG_CONFIGURE 1
|
LOG_CONFIGURE 1
|
||||||
LOG_BUILD 1
|
LOG_BUILD 1
|
||||||
|
|
|
@ -21,7 +21,7 @@ macro(LINK_HIFI_LIBRARIES)
|
||||||
include_directories("${HIFI_LIBRARY_DIR}/${HIFI_LIBRARY}/src")
|
include_directories("${HIFI_LIBRARY_DIR}/${HIFI_LIBRARY}/src")
|
||||||
|
|
||||||
add_dependencies(${TARGET_NAME} ${HIFI_LIBRARY})
|
add_dependencies(${TARGET_NAME} ${HIFI_LIBRARY})
|
||||||
|
|
||||||
# link the actual library - it is static so don't bubble it up
|
# link the actual library - it is static so don't bubble it up
|
||||||
target_link_libraries(${TARGET_NAME} ${HIFI_LIBRARY})
|
target_link_libraries(${TARGET_NAME} ${HIFI_LIBRARY})
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,13 @@ macro(SETUP_HIFI_PROJECT)
|
||||||
# find these Qt modules and link them to our own target
|
# find these Qt modules and link them to our own target
|
||||||
find_package(Qt5 COMPONENTS ${${TARGET_NAME}_DEPENDENCY_QT_MODULES} REQUIRED)
|
find_package(Qt5 COMPONENTS ${${TARGET_NAME}_DEPENDENCY_QT_MODULES} REQUIRED)
|
||||||
|
|
||||||
|
# disable /OPT:REF and /OPT:ICF for the Debug builds
|
||||||
|
# This will prevent the following linker warnings
|
||||||
|
# LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:ICF' specification
|
||||||
|
if (WIN32)
|
||||||
|
set_property(TARGET ${TARGET_NAME} APPEND_STRING PROPERTY LINK_FLAGS_DEBUG "/OPT:NOREF /OPT:NOICF")
|
||||||
|
endif()
|
||||||
|
|
||||||
foreach(QT_MODULE ${${TARGET_NAME}_DEPENDENCY_QT_MODULES})
|
foreach(QT_MODULE ${${TARGET_NAME}_DEPENDENCY_QT_MODULES})
|
||||||
target_link_libraries(${TARGET_NAME} Qt5::${QT_MODULE})
|
target_link_libraries(${TARGET_NAME} Qt5::${QT_MODULE})
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
|
@ -37,6 +37,7 @@ var BUMPER_ON_VALUE = 0.5;
|
||||||
var DISTANCE_HOLDING_RADIUS_FACTOR = 5; // multiplied by distance between hand and object
|
var DISTANCE_HOLDING_RADIUS_FACTOR = 5; // multiplied by distance between hand and object
|
||||||
var DISTANCE_HOLDING_ACTION_TIMEFRAME = 0.1; // how quickly objects move to their new position
|
var DISTANCE_HOLDING_ACTION_TIMEFRAME = 0.1; // how quickly objects move to their new position
|
||||||
var DISTANCE_HOLDING_ROTATION_EXAGGERATION_FACTOR = 2.0; // object rotates this much more than hand did
|
var DISTANCE_HOLDING_ROTATION_EXAGGERATION_FACTOR = 2.0; // object rotates this much more than hand did
|
||||||
|
|
||||||
var NO_INTERSECT_COLOR = {
|
var NO_INTERSECT_COLOR = {
|
||||||
red: 10,
|
red: 10,
|
||||||
green: 10,
|
green: 10,
|
||||||
|
@ -86,6 +87,7 @@ var ZERO_VEC = {
|
||||||
y: 0,
|
y: 0,
|
||||||
z: 0
|
z: 0
|
||||||
};
|
};
|
||||||
|
|
||||||
var NULL_ACTION_ID = "{00000000-0000-0000-000000000000}";
|
var NULL_ACTION_ID = "{00000000-0000-0000-000000000000}";
|
||||||
var MSEC_PER_SEC = 1000.0;
|
var MSEC_PER_SEC = 1000.0;
|
||||||
|
|
||||||
|
@ -95,7 +97,8 @@ var ACTION_TTL = 15; // seconds
|
||||||
var ACTION_TTL_REFRESH = 5;
|
var ACTION_TTL_REFRESH = 5;
|
||||||
var PICKS_PER_SECOND_PER_HAND = 5;
|
var PICKS_PER_SECOND_PER_HAND = 5;
|
||||||
var MSECS_PER_SEC = 1000.0;
|
var MSECS_PER_SEC = 1000.0;
|
||||||
var GRABBABLE_PROPERTIES = ["position",
|
var GRABBABLE_PROPERTIES = [
|
||||||
|
"position",
|
||||||
"rotation",
|
"rotation",
|
||||||
"gravity",
|
"gravity",
|
||||||
"ignoreForCollisions",
|
"ignoreForCollisions",
|
||||||
|
@ -104,7 +107,6 @@ var GRABBABLE_PROPERTIES = ["position",
|
||||||
"name"
|
"name"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
var GRABBABLE_DATA_KEY = "grabbableKey"; // shared with grab.js
|
var GRABBABLE_DATA_KEY = "grabbableKey"; // shared with grab.js
|
||||||
var GRAB_USER_DATA_KEY = "grabKey"; // shared with grab.js
|
var GRAB_USER_DATA_KEY = "grabKey"; // shared with grab.js
|
||||||
|
|
||||||
|
@ -113,8 +115,6 @@ var DEFAULT_GRABBABLE_DATA = {
|
||||||
invertSolidWhileHeld: false
|
invertSolidWhileHeld: false
|
||||||
};
|
};
|
||||||
|
|
||||||
var disabledHand = 'none';
|
|
||||||
|
|
||||||
|
|
||||||
// states for the state machine
|
// states for the state machine
|
||||||
var STATE_OFF = 0;
|
var STATE_OFF = 0;
|
||||||
|
@ -307,7 +307,14 @@ function MyController(hand) {
|
||||||
position: closePoint,
|
position: closePoint,
|
||||||
linePoints: [ZERO_VEC, farPoint],
|
linePoints: [ZERO_VEC, farPoint],
|
||||||
color: color,
|
color: color,
|
||||||
lifetime: 0.1
|
lifetime: 0.1,
|
||||||
|
collisionsWillMove: false,
|
||||||
|
ignoreForCollisions: true,
|
||||||
|
userData: JSON.stringify({
|
||||||
|
grabbableKey: {
|
||||||
|
grabbable: false
|
||||||
|
}
|
||||||
|
})
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,7 +329,14 @@ function MyController(hand) {
|
||||||
position: closePoint,
|
position: closePoint,
|
||||||
linePoints: [ZERO_VEC, farPoint],
|
linePoints: [ZERO_VEC, farPoint],
|
||||||
color: color,
|
color: color,
|
||||||
lifetime: LIFETIME
|
lifetime: LIFETIME,
|
||||||
|
collisionsWillMove: false,
|
||||||
|
ignoreForCollisions: true,
|
||||||
|
userData: JSON.stringify({
|
||||||
|
grabbableKey: {
|
||||||
|
grabbable: false
|
||||||
|
}
|
||||||
|
})
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
var age = Entities.getEntityProperties(this.pointer, "age").age;
|
var age = Entities.getEntityProperties(this.pointer, "age").age;
|
||||||
|
@ -396,11 +410,6 @@ function MyController(hand) {
|
||||||
this.search = function() {
|
this.search = function() {
|
||||||
this.grabbedEntity = null;
|
this.grabbedEntity = null;
|
||||||
|
|
||||||
// if this hand is the one that's disabled, we don't want to search for anything at all
|
|
||||||
if (this.hand === disabledHand) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.state == STATE_SEARCHING ? this.triggerSmoothedReleased() : this.bumperReleased()) {
|
if (this.state == STATE_SEARCHING ? this.triggerSmoothedReleased() : this.bumperReleased()) {
|
||||||
this.setState(STATE_RELEASE);
|
this.setState(STATE_RELEASE);
|
||||||
return;
|
return;
|
||||||
|
@ -445,17 +454,7 @@ function MyController(hand) {
|
||||||
// the ray is intersecting something we can move.
|
// the ray is intersecting something we can move.
|
||||||
var intersectionDistance = Vec3.distance(pickRay.origin, intersection.intersection);
|
var intersectionDistance = Vec3.distance(pickRay.origin, intersection.intersection);
|
||||||
|
|
||||||
//this code will disabled the beam for the opposite hand of the one that grabbed it if the entity says so
|
|
||||||
var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, intersection.entityID, DEFAULT_GRABBABLE_DATA);
|
var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, intersection.entityID, DEFAULT_GRABBABLE_DATA);
|
||||||
if (grabbableData["turnOffOppositeBeam"]) {
|
|
||||||
if (this.hand === RIGHT_HAND) {
|
|
||||||
disabledHand = LEFT_HAND;
|
|
||||||
} else {
|
|
||||||
disabledHand = RIGHT_HAND;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
disabledHand = 'none';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (intersection.properties.name == "Grab Debug Entity") {
|
if (intersection.properties.name == "Grab Debug Entity") {
|
||||||
continue;
|
continue;
|
||||||
|
@ -526,7 +525,14 @@ function MyController(hand) {
|
||||||
green: 255,
|
green: 255,
|
||||||
blue: 0
|
blue: 0
|
||||||
},
|
},
|
||||||
lifetime: 0.1
|
lifetime: 0.1,
|
||||||
|
collisionsWillMove: false,
|
||||||
|
ignoreForCollisions: true,
|
||||||
|
userData: JSON.stringify({
|
||||||
|
grabbableKey: {
|
||||||
|
grabbable: false
|
||||||
|
}
|
||||||
|
})
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -540,8 +546,7 @@ function MyController(hand) {
|
||||||
if (typeof grabbableDataForCandidate.grabbable !== 'undefined' && !grabbableDataForCandidate.grabbable) {
|
if (typeof grabbableDataForCandidate.grabbable !== 'undefined' && !grabbableDataForCandidate.grabbable) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
var propsForCandidate =
|
var propsForCandidate = Entities.getEntityProperties(nearbyEntities[i], GRABBABLE_PROPERTIES);
|
||||||
Entities.getEntityProperties(nearbyEntities[i], GRABBABLE_PROPERTIES);
|
|
||||||
|
|
||||||
if (propsForCandidate.type == 'Unknown') {
|
if (propsForCandidate.type == 'Unknown') {
|
||||||
continue;
|
continue;
|
||||||
|
@ -737,15 +742,8 @@ function MyController(hand) {
|
||||||
|
|
||||||
this.nearGrabbing = function() {
|
this.nearGrabbing = function() {
|
||||||
var now = Date.now();
|
var now = Date.now();
|
||||||
|
|
||||||
var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, this.grabbedEntity, DEFAULT_GRABBABLE_DATA);
|
var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, this.grabbedEntity, DEFAULT_GRABBABLE_DATA);
|
||||||
|
|
||||||
var turnOffOtherHand = grabbableData["turnOffOtherHand"];
|
|
||||||
if (turnOffOtherHand) {
|
|
||||||
//don't activate the second hand grab because the script is handling the second hand logic
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.state == STATE_NEAR_GRABBING && this.triggerSmoothedReleased()) {
|
if (this.state == STATE_NEAR_GRABBING && this.triggerSmoothedReleased()) {
|
||||||
this.setState(STATE_RELEASE);
|
this.setState(STATE_RELEASE);
|
||||||
Entities.callEntityMethod(this.grabbedEntity, "releaseGrab");
|
Entities.callEntityMethod(this.grabbedEntity, "releaseGrab");
|
||||||
|
@ -1094,10 +1092,6 @@ function MyController(hand) {
|
||||||
|
|
||||||
this.release = function() {
|
this.release = function() {
|
||||||
|
|
||||||
if (this.hand !== disabledHand) {
|
|
||||||
//release the disabled hand when we let go with the main one
|
|
||||||
disabledHand = 'none';
|
|
||||||
}
|
|
||||||
this.lineOff();
|
this.lineOff();
|
||||||
|
|
||||||
if (this.grabbedEntity !== null) {
|
if (this.grabbedEntity !== null) {
|
||||||
|
@ -1218,12 +1212,35 @@ mapping.from([Controller.Standard.LB]).peek().to(leftController.bumperPress);
|
||||||
|
|
||||||
Controller.enableMapping(MAPPING_NAME);
|
Controller.enableMapping(MAPPING_NAME);
|
||||||
|
|
||||||
|
var handToDisable = 'none';
|
||||||
|
|
||||||
function update() {
|
function update() {
|
||||||
rightController.update();
|
if (handToDisable !== LEFT_HAND) {
|
||||||
leftController.update();
|
leftController.update();
|
||||||
|
}
|
||||||
|
if (handToDisable !== RIGHT_HAND) {
|
||||||
|
rightController.update();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Messages.subscribe('Hifi-Hand-Disabler');
|
||||||
|
|
||||||
|
handleHandDisablerMessages = function(channel, message, sender) {
|
||||||
|
|
||||||
|
if (sender === MyAvatar.sessionUUID) {
|
||||||
|
handToDisable = message;
|
||||||
|
if (message === 'left') {
|
||||||
|
handToDisable = LEFT_HAND;
|
||||||
|
}
|
||||||
|
if (message === 'right') {
|
||||||
|
handToDisable = RIGHT_HAND;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Messages.messageReceived.connect(handleHandDisablerMessages);
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
rightController.cleanup();
|
rightController.cleanup();
|
||||||
leftController.cleanup();
|
leftController.cleanup();
|
||||||
|
|
|
@ -247,4 +247,4 @@ function cleanup() {
|
||||||
|
|
||||||
|
|
||||||
// Uncomment this line to delete whiteboard and all associated entity on script close
|
// Uncomment this line to delete whiteboard and all associated entity on script close
|
||||||
// Script.scriptEnding.connect(cleanup);
|
//Script.scriptEnding.connect(cleanup);
|
||||||
|
|
|
@ -100,6 +100,13 @@ else()
|
||||||
add_executable(${TARGET_NAME} ${INTERFACE_SRCS} ${QM})
|
add_executable(${TARGET_NAME} ${INTERFACE_SRCS} ${QM})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# disable /OPT:REF and /OPT:ICF for the Debug builds
|
||||||
|
# This will prevent the following linker warnings
|
||||||
|
# LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:ICF' specification
|
||||||
|
if (WIN32)
|
||||||
|
set_property(TARGET ${TARGET_NAME} APPEND_STRING PROPERTY LINK_FLAGS_DEBUG "/OPT:NOREF /OPT:NOICF")
|
||||||
|
endif()
|
||||||
|
|
||||||
# link required hifi libraries
|
# link required hifi libraries
|
||||||
link_hifi_libraries(shared octree environment gpu gl procedural model render
|
link_hifi_libraries(shared octree environment gpu gl procedural model render
|
||||||
recording fbx networking model-networking entities avatars
|
recording fbx networking model-networking entities avatars
|
||||||
|
|
|
@ -96,7 +96,6 @@ Avatar::Avatar(RigPointer rig) :
|
||||||
_moving(false),
|
_moving(false),
|
||||||
_initialized(false),
|
_initialized(false),
|
||||||
_shouldRenderBillboard(true),
|
_shouldRenderBillboard(true),
|
||||||
_shouldSkipRender(true),
|
|
||||||
_voiceSphereID(GeometryCache::UNKNOWN_ID)
|
_voiceSphereID(GeometryCache::UNKNOWN_ID)
|
||||||
{
|
{
|
||||||
// we may have been created in the network thread, but we live in the main thread
|
// we may have been created in the network thread, but we live in the main thread
|
||||||
|
@ -198,12 +197,14 @@ void Avatar::simulate(float deltaTime) {
|
||||||
if (_shouldSkipRender) {
|
if (_shouldSkipRender) {
|
||||||
if (distance < renderDistance * (1.0f - SKIP_HYSTERESIS_PROPORTION)) {
|
if (distance < renderDistance * (1.0f - SKIP_HYSTERESIS_PROPORTION)) {
|
||||||
_shouldSkipRender = false;
|
_shouldSkipRender = false;
|
||||||
|
_skeletonModel.setVisibleInScene(true, qApp->getMain3DScene());
|
||||||
if (!isControllerLogging) { // Test for isMyAvatar is prophylactic. Never occurs in current code.
|
if (!isControllerLogging) { // Test for isMyAvatar is prophylactic. Never occurs in current code.
|
||||||
qCDebug(interfaceapp) << "Rerendering" << (isMyAvatar() ? "myself" : getSessionUUID()) << "for distance" << renderDistance;
|
qCDebug(interfaceapp) << "Rerendering" << (isMyAvatar() ? "myself" : getSessionUUID()) << "for distance" << renderDistance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (distance > renderDistance * (1.0f + SKIP_HYSTERESIS_PROPORTION)) {
|
} else if (distance > renderDistance * (1.0f + SKIP_HYSTERESIS_PROPORTION)) {
|
||||||
_shouldSkipRender = true;
|
_shouldSkipRender = true;
|
||||||
|
_skeletonModel.setVisibleInScene(false, qApp->getMain3DScene());
|
||||||
if (!isControllerLogging) {
|
if (!isControllerLogging) {
|
||||||
qCDebug(interfaceapp) << "Unrendering" << (isMyAvatar() ? "myself" : getSessionUUID()) << "for distance" << renderDistance;
|
qCDebug(interfaceapp) << "Unrendering" << (isMyAvatar() ? "myself" : getSessionUUID()) << "for distance" << renderDistance;
|
||||||
}
|
}
|
||||||
|
@ -609,10 +610,6 @@ void Avatar::fixupModelsInScene() {
|
||||||
// check to see if when we added our models to the scene they were ready, if they were not ready, then
|
// check to see if when we added our models to the scene they were ready, if they were not ready, then
|
||||||
// fix them up in the scene
|
// fix them up in the scene
|
||||||
render::ScenePointer scene = qApp->getMain3DScene();
|
render::ScenePointer scene = qApp->getMain3DScene();
|
||||||
_skeletonModel.setVisibleInScene(!_shouldSkipRender, scene);
|
|
||||||
if (_shouldSkipRender) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
render::PendingChanges pendingChanges;
|
render::PendingChanges pendingChanges;
|
||||||
if (_skeletonModel.isRenderable() && _skeletonModel.needsFixupInScene()) {
|
if (_skeletonModel.isRenderable() && _skeletonModel.needsFixupInScene()) {
|
||||||
_skeletonModel.removeFromScene(scene, pendingChanges);
|
_skeletonModel.removeFromScene(scene, pendingChanges);
|
||||||
|
|
|
@ -196,5 +196,9 @@ QScriptValue WebWindowClass::constructor(QScriptContext* context, QScriptEngine*
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebWindowClass::setTitle(const QString& title) {
|
void WebWindowClass::setTitle(const QString& title) {
|
||||||
|
if (QThread::currentThread() != thread()) {
|
||||||
|
QMetaObject::invokeMethod(this, "setTitle", Qt::AutoConnection, Q_ARG(QString, title));
|
||||||
|
return;
|
||||||
|
}
|
||||||
_windowWidget->setWindowTitle(title);
|
_windowWidget->setWindowTitle(title);
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ EntityItemPointer RenderablePolyLineEntityItem::factory(const EntityItemID& enti
|
||||||
RenderablePolyLineEntityItem::RenderablePolyLineEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) :
|
RenderablePolyLineEntityItem::RenderablePolyLineEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) :
|
||||||
PolyLineEntityItem(entityItemID, properties) {
|
PolyLineEntityItem(entityItemID, properties) {
|
||||||
_numVertices = 0;
|
_numVertices = 0;
|
||||||
|
_vertices = QVector<glm::vec3>(0.0f);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,13 +115,56 @@ void RenderablePolyLineEntityItem::updateGeometry() {
|
||||||
_numVertices += 2;
|
_numVertices += 2;
|
||||||
}
|
}
|
||||||
_pointsChanged = false;
|
_pointsChanged = false;
|
||||||
|
_normalsChanged = false;
|
||||||
|
_strokeWidthsChanged = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderablePolyLineEntityItem::updateVertices() {
|
||||||
|
// Calculate the minimum vector size out of normals, points, and stroke widths
|
||||||
|
int minVectorSize = _normals.size();
|
||||||
|
if (_points.size() < minVectorSize) {
|
||||||
|
minVectorSize = _points.size();
|
||||||
|
}
|
||||||
|
if (_strokeWidths.size() < minVectorSize) {
|
||||||
|
minVectorSize = _strokeWidths.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
_vertices.clear();
|
||||||
|
glm::vec3 v1, v2, tangent, binormal, point;
|
||||||
|
|
||||||
|
int finalIndex = minVectorSize - 1;
|
||||||
|
for (int i = 0; i < finalIndex; i++) {
|
||||||
|
float width = _strokeWidths.at(i);
|
||||||
|
point = _points.at(i);
|
||||||
|
|
||||||
|
tangent = _points.at(i);
|
||||||
|
|
||||||
|
tangent = _points.at(i + 1) - point;
|
||||||
|
glm::vec3 normal = _normals.at(i);
|
||||||
|
binormal = glm::normalize(glm::cross(tangent, normal)) * width;
|
||||||
|
|
||||||
|
// Check to make sure binormal is not a NAN. If it is, don't add to vertices vector
|
||||||
|
if (binormal.x != binormal.x) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
v1 = point + binormal;
|
||||||
|
v2 = point - binormal;
|
||||||
|
_vertices << v1 << v2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// For last point we can assume binormals are the same since it represents the last two vertices of quad
|
||||||
|
point = _points.at(finalIndex);
|
||||||
|
v1 = point + binormal;
|
||||||
|
v2 = point - binormal;
|
||||||
|
_vertices << v1 << v2;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void RenderablePolyLineEntityItem::render(RenderArgs* args) {
|
void RenderablePolyLineEntityItem::render(RenderArgs* args) {
|
||||||
QWriteLocker lock(&_quadReadWriteLock);
|
QWriteLocker lock(&_quadReadWriteLock);
|
||||||
if (_points.size() < 2 || _normals.size () < 2 || _vertices.size() < 2) {
|
if (_points.size() < 2 || _normals.size () < 2 || _strokeWidths.size() < 2) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,7 +183,8 @@ void RenderablePolyLineEntityItem::render(RenderArgs* args) {
|
||||||
Q_ASSERT(getType() == EntityTypes::PolyLine);
|
Q_ASSERT(getType() == EntityTypes::PolyLine);
|
||||||
|
|
||||||
Q_ASSERT(args->_batch);
|
Q_ASSERT(args->_batch);
|
||||||
if (_pointsChanged) {
|
if (_pointsChanged || _strokeWidthsChanged || _normalsChanged) {
|
||||||
|
updateVertices();
|
||||||
updateGeometry();
|
updateGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,10 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void updateGeometry();
|
void updateGeometry();
|
||||||
|
void updateVertices();
|
||||||
gpu::BufferPointer _verticesBuffer;
|
gpu::BufferPointer _verticesBuffer;
|
||||||
unsigned int _numVertices;
|
unsigned int _numVertices;
|
||||||
|
QVector<glm::vec3> _vertices;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -34,8 +34,9 @@ PolyLineEntityItem::PolyLineEntityItem(const EntityItemID& entityItemID, const E
|
||||||
EntityItem(entityItemID),
|
EntityItem(entityItemID),
|
||||||
_lineWidth(DEFAULT_LINE_WIDTH),
|
_lineWidth(DEFAULT_LINE_WIDTH),
|
||||||
_pointsChanged(true),
|
_pointsChanged(true),
|
||||||
|
_normalsChanged(true),
|
||||||
|
_strokeWidthsChanged(true),
|
||||||
_points(QVector<glm::vec3>(0.0f)),
|
_points(QVector<glm::vec3>(0.0f)),
|
||||||
_vertices(QVector<glm::vec3>(0.0f)),
|
|
||||||
_normals(QVector<glm::vec3>(0.0f)),
|
_normals(QVector<glm::vec3>(0.0f)),
|
||||||
_strokeWidths(QVector<float>(0.0f)),
|
_strokeWidths(QVector<float>(0.0f)),
|
||||||
_textures("")
|
_textures("")
|
||||||
|
@ -106,47 +107,13 @@ bool PolyLineEntityItem::appendPoint(const glm::vec3& point) {
|
||||||
|
|
||||||
bool PolyLineEntityItem::setStrokeWidths(const QVector<float>& strokeWidths) {
|
bool PolyLineEntityItem::setStrokeWidths(const QVector<float>& strokeWidths) {
|
||||||
_strokeWidths = strokeWidths;
|
_strokeWidths = strokeWidths;
|
||||||
|
_strokeWidthsChanged = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PolyLineEntityItem::setNormals(const QVector<glm::vec3>& normals) {
|
bool PolyLineEntityItem::setNormals(const QVector<glm::vec3>& normals) {
|
||||||
_normals = normals;
|
_normals = normals;
|
||||||
if (_points.size() < 2 || _normals.size() < 2 || _strokeWidths.size() < 2) {
|
_normalsChanged = true;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int minVectorSize = _normals.size();
|
|
||||||
if (_points.size() < minVectorSize) {
|
|
||||||
minVectorSize = _points.size();
|
|
||||||
}
|
|
||||||
if (_strokeWidths.size() < minVectorSize) {
|
|
||||||
minVectorSize = _strokeWidths.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
_vertices.clear();
|
|
||||||
glm::vec3 v1, v2, tangent, binormal, point;
|
|
||||||
|
|
||||||
int finalIndex = minVectorSize -1;
|
|
||||||
for (int i = 0; i < finalIndex; i++) {
|
|
||||||
float width = _strokeWidths.at(i);
|
|
||||||
point = _points.at(i);
|
|
||||||
|
|
||||||
tangent = _points.at(i + 1) - point;
|
|
||||||
glm::vec3 normal = normals.at(i);
|
|
||||||
binormal = glm::normalize(glm::cross(tangent, normal)) * width;
|
|
||||||
|
|
||||||
//This checks to make sure binormal is not a NAN
|
|
||||||
assert(binormal.x == binormal.x);
|
|
||||||
v1 = point + binormal;
|
|
||||||
v2 = point - binormal;
|
|
||||||
_vertices << v1 << v2;
|
|
||||||
}
|
|
||||||
//for last point we can just assume binormals are same since it represents last two vertices of quad
|
|
||||||
point = _points.at(finalIndex);
|
|
||||||
v1 = point + binormal;
|
|
||||||
v2 = point - binormal;
|
|
||||||
_vertices << v1 << v2;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,8 +93,9 @@ class PolyLineEntityItem : public EntityItem {
|
||||||
rgbColor _color;
|
rgbColor _color;
|
||||||
float _lineWidth;
|
float _lineWidth;
|
||||||
bool _pointsChanged;
|
bool _pointsChanged;
|
||||||
|
bool _normalsChanged;
|
||||||
|
bool _strokeWidthsChanged;
|
||||||
QVector<glm::vec3> _points;
|
QVector<glm::vec3> _points;
|
||||||
QVector<glm::vec3> _vertices;
|
|
||||||
QVector<glm::vec3> _normals;
|
QVector<glm::vec3> _normals;
|
||||||
QVector<float> _strokeWidths;
|
QVector<float> _strokeWidths;
|
||||||
QString _textures;
|
QString _textures;
|
||||||
|
|
|
@ -123,6 +123,31 @@ void ObjectMotionState::setMotionType(MotionType motionType) {
|
||||||
_motionType = motionType;
|
_motionType = motionType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update the Continuous Collision Detection (CCD) configuration settings of our RigidBody so that
|
||||||
|
// CCD will be enabled automatically when its speed surpasses a certain threshold.
|
||||||
|
void ObjectMotionState::updateCCDConfiguration() {
|
||||||
|
if (_body) {
|
||||||
|
if (_shape) {
|
||||||
|
// If this object moves faster than its bounding radius * RADIUS_MOTION_THRESHOLD_MULTIPLIER,
|
||||||
|
// CCD will be enabled for this object.
|
||||||
|
const auto RADIUS_MOTION_THRESHOLD_MULTIPLIER = 0.5f;
|
||||||
|
|
||||||
|
btVector3 center;
|
||||||
|
btScalar radius;
|
||||||
|
_shape->getBoundingSphere(center, radius);
|
||||||
|
_body->setCcdMotionThreshold(radius * RADIUS_MOTION_THRESHOLD_MULTIPLIER);
|
||||||
|
|
||||||
|
// TODO: Ideally the swept sphere radius would be contained by the object. Using the bounding sphere
|
||||||
|
// radius works well for spherical objects, but may cause issues with other shapes. For arbitrary
|
||||||
|
// objects we may want to consider a different approach, such as grouping rigid bodies together.
|
||||||
|
_body->setCcdSweptSphereRadius(radius);
|
||||||
|
} else {
|
||||||
|
// Disable CCD
|
||||||
|
_body->setCcdMotionThreshold(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ObjectMotionState::setRigidBody(btRigidBody* body) {
|
void ObjectMotionState::setRigidBody(btRigidBody* body) {
|
||||||
// give the body a (void*) back-pointer to this ObjectMotionState
|
// give the body a (void*) back-pointer to this ObjectMotionState
|
||||||
if (_body != body) {
|
if (_body != body) {
|
||||||
|
@ -133,6 +158,7 @@ void ObjectMotionState::setRigidBody(btRigidBody* body) {
|
||||||
if (_body) {
|
if (_body) {
|
||||||
_body->setUserPointer(this);
|
_body->setUserPointer(this);
|
||||||
}
|
}
|
||||||
|
updateCCDConfiguration();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,6 +258,8 @@ bool ObjectMotionState::handleHardAndEasyChanges(uint32_t& flags, PhysicsEngine*
|
||||||
if (_shape != newShape) {
|
if (_shape != newShape) {
|
||||||
_shape = newShape;
|
_shape = newShape;
|
||||||
_body->setCollisionShape(_shape);
|
_body->setCollisionShape(_shape);
|
||||||
|
|
||||||
|
updateCCDConfiguration();
|
||||||
} else {
|
} else {
|
||||||
// huh... the shape didn't actually change, so we clear the DIRTY_SHAPE flag
|
// huh... the shape didn't actually change, so we clear the DIRTY_SHAPE flag
|
||||||
flags &= ~Simulation::DIRTY_SHAPE;
|
flags &= ~Simulation::DIRTY_SHAPE;
|
||||||
|
|
|
@ -151,6 +151,7 @@ protected:
|
||||||
virtual bool isReadyToComputeShape() = 0;
|
virtual bool isReadyToComputeShape() = 0;
|
||||||
virtual btCollisionShape* computeNewShape() = 0;
|
virtual btCollisionShape* computeNewShape() = 0;
|
||||||
void setMotionType(MotionType motionType);
|
void setMotionType(MotionType motionType);
|
||||||
|
void updateCCDConfiguration();
|
||||||
|
|
||||||
// clearObjectBackPointer() overrrides should call the base method, then actually clear the object back pointer.
|
// clearObjectBackPointer() overrrides should call the base method, then actually clear the object back pointer.
|
||||||
virtual void clearObjectBackPointer() { _type = MOTIONSTATE_TYPE_INVALID; }
|
virtual void clearObjectBackPointer() { _type = MOTIONSTATE_TYPE_INVALID; }
|
||||||
|
|
Loading…
Reference in a new issue