mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 02:36:54 +02:00
Merge branch 'master' of github.com:highfidelity/hifi into forget-you
This commit is contained in:
commit
48184c102b
16 changed files with 295 additions and 42 deletions
|
@ -162,7 +162,19 @@ JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnCrea
|
||||||
jvmArgs.version = JNI_VERSION_1_6; // choose your JNI version
|
jvmArgs.version = JNI_VERSION_1_6; // choose your JNI version
|
||||||
jvmArgs.name = NULL; // you might want to give the java thread a name
|
jvmArgs.name = NULL; // you might want to give the java thread a name
|
||||||
jvmArgs.group = NULL; // you might want to assign the java thread to a ThreadGroup
|
jvmArgs.group = NULL; // you might want to assign the java thread to a ThreadGroup
|
||||||
jvm->AttachCurrentThread(reinterpret_cast<JNIEnv **>(&myNewEnv), &jvmArgs);
|
|
||||||
|
int attachedHere = 0; // know if detaching at the end is necessary
|
||||||
|
jint res = jvm->GetEnv((void**)&myNewEnv, JNI_VERSION_1_6); // checks if current env needs attaching or it is already attached
|
||||||
|
if (JNI_OK != res) {
|
||||||
|
qDebug() << "[JCRASH] GetEnv env not attached yet, attaching now..";
|
||||||
|
res = jvm->AttachCurrentThread(reinterpret_cast<JNIEnv **>(&myNewEnv), &jvmArgs);
|
||||||
|
if (JNI_OK != res) {
|
||||||
|
qDebug() << "[JCRASH] Failed to AttachCurrentThread, ErrorCode = " << res;
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
attachedHere = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QAndroidJniObject string = QAndroidJniObject::fromString(a);
|
QAndroidJniObject string = QAndroidJniObject::fromString(a);
|
||||||
jboolean jBackToScene = (jboolean) backToScene;
|
jboolean jBackToScene = (jboolean) backToScene;
|
||||||
|
@ -175,7 +187,9 @@ JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnCrea
|
||||||
myNewEnv->CallObjectMethod(hashmap, mapClassPut, QAndroidJniObject::fromString("url").object<jstring>(), jArg.object<jstring>());
|
myNewEnv->CallObjectMethod(hashmap, mapClassPut, QAndroidJniObject::fromString("url").object<jstring>(), jArg.object<jstring>());
|
||||||
}
|
}
|
||||||
__interfaceActivity.callMethod<void>("openAndroidActivity", "(Ljava/lang/String;ZLjava/util/HashMap;)V", string.object<jstring>(), jBackToScene, hashmap);
|
__interfaceActivity.callMethod<void>("openAndroidActivity", "(Ljava/lang/String;ZLjava/util/HashMap;)V", string.object<jstring>(), jBackToScene, hashmap);
|
||||||
jvm->DetachCurrentThread();
|
if (attachedHere) {
|
||||||
|
jvm->DetachCurrentThread();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
QObject::connect(&AndroidHelper::instance(), &AndroidHelper::hapticFeedbackRequested, [](int duration) {
|
QObject::connect(&AndroidHelper::instance(), &AndroidHelper::hapticFeedbackRequested, [](int duration) {
|
||||||
|
|
|
@ -1223,7 +1223,7 @@
|
||||||
"name": "max_avatar_height",
|
"name": "max_avatar_height",
|
||||||
"type": "double",
|
"type": "double",
|
||||||
"label": "Maximum Avatar Height (meters)",
|
"label": "Maximum Avatar Height (meters)",
|
||||||
"help": "Limits the scale of avatars in your domain. Cannot be greater than 1755.",
|
"help": "Limits the height of avatars in your domain. Cannot be greater than 1755.",
|
||||||
"placeholder": 5.2,
|
"placeholder": 5.2,
|
||||||
"default": 5.2
|
"default": 5.2
|
||||||
},
|
},
|
||||||
|
|
|
@ -58,7 +58,11 @@ $(document).ready(function(){
|
||||||
}
|
}
|
||||||
|
|
||||||
Settings.handlePostSettings = function(formJSON) {
|
Settings.handlePostSettings = function(formJSON) {
|
||||||
|
|
||||||
|
if (!verifyAvatarHeights()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// check if we've set the basic http password
|
// check if we've set the basic http password
|
||||||
if (formJSON["security"]) {
|
if (formJSON["security"]) {
|
||||||
|
|
||||||
|
@ -207,7 +211,7 @@ $(document).ready(function(){
|
||||||
swal({
|
swal({
|
||||||
title: '',
|
title: '',
|
||||||
type: 'error',
|
type: 'error',
|
||||||
text: "There was a problem retreiving domain information from High Fidelity API.",
|
text: "There was a problem retrieving domain information from High Fidelity API.",
|
||||||
confirmButtonText: 'Try again',
|
confirmButtonText: 'Try again',
|
||||||
showCancelButton: true,
|
showCancelButton: true,
|
||||||
closeOnConfirm: false
|
closeOnConfirm: false
|
||||||
|
@ -288,7 +292,7 @@ $(document).ready(function(){
|
||||||
swal({
|
swal({
|
||||||
title: 'Create new domain ID',
|
title: 'Create new domain ID',
|
||||||
type: 'input',
|
type: 'input',
|
||||||
text: 'Enter a label this machine.</br></br>This will help you identify which domain ID belongs to which machine.</br></br>',
|
text: 'Enter a label for this machine.</br></br>This will help you identify which domain ID belongs to which machine.</br></br>',
|
||||||
showCancelButton: true,
|
showCancelButton: true,
|
||||||
confirmButtonText: "Create",
|
confirmButtonText: "Create",
|
||||||
closeOnConfirm: false,
|
closeOnConfirm: false,
|
||||||
|
@ -669,7 +673,7 @@ $(document).ready(function(){
|
||||||
var spinner = createDomainSpinner();
|
var spinner = createDomainSpinner();
|
||||||
$('#' + Settings.PLACES_TABLE_ID).after($(spinner));
|
$('#' + Settings.PLACES_TABLE_ID).after($(spinner));
|
||||||
|
|
||||||
var errorEl = createDomainLoadingError("There was an error retreiving your places.");
|
var errorEl = createDomainLoadingError("There was an error retrieving your places.");
|
||||||
$("#" + Settings.PLACES_TABLE_ID).after(errorEl);
|
$("#" + Settings.PLACES_TABLE_ID).after(errorEl);
|
||||||
|
|
||||||
// do we have a domain ID?
|
// do we have a domain ID?
|
||||||
|
@ -1091,4 +1095,43 @@ $(document).ready(function(){
|
||||||
|
|
||||||
$('#settings_backup .panel-body').html(html);
|
$('#settings_backup .panel-body').html(html);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function verifyAvatarHeights() {
|
||||||
|
var errorString = '';
|
||||||
|
var minAllowedHeight = 0.009;
|
||||||
|
var maxAllowedHeight = 1755;
|
||||||
|
var alertCss = { backgroundColor: '#ffa0a0' };
|
||||||
|
var minHeightElement = $('input[name="avatars.min_avatar_height"]');
|
||||||
|
var maxHeightElement = $('input[name="avatars.max_avatar_height"]');
|
||||||
|
|
||||||
|
var minHeight = Number(minHeightElement.val());
|
||||||
|
var maxHeight = Number(maxHeightElement.val());
|
||||||
|
|
||||||
|
if (maxHeight < minHeight) {
|
||||||
|
errorString = 'Maximum avatar height must not be less than minimum avatar height<br>';
|
||||||
|
minHeightElement.css(alertCss);
|
||||||
|
maxHeightElement.css(alertCss);
|
||||||
|
};
|
||||||
|
if (minHeight < minAllowedHeight) {
|
||||||
|
errorString += 'Minimum avatar height must not be less than ' + minAllowedHeight + '<br>';
|
||||||
|
minHeightElement.css(alertCss);
|
||||||
|
}
|
||||||
|
if (maxHeight > maxAllowedHeight) {
|
||||||
|
errorString += 'Maximum avatar height must not be greater than ' + maxAllowedHeight + '<br>';
|
||||||
|
maxHeightElement.css(alertCss);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errorString.length > 0) {
|
||||||
|
swal({
|
||||||
|
type: 'error',
|
||||||
|
title: '',
|
||||||
|
text: errorString,
|
||||||
|
html: true
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -299,7 +299,7 @@ Item {
|
||||||
anchors.fill: stackView
|
anchors.fill: stackView
|
||||||
id: controllerPrefereneces
|
id: controllerPrefereneces
|
||||||
objectName: "TabletControllerPreferences"
|
objectName: "TabletControllerPreferences"
|
||||||
showCategories: ["VR Movement", "Game Controller", "Sixense Controllers", "Perception Neuron", "Leap Motion"]
|
showCategories: [( (HMD.active) ? "VR Movement" : "Movement"), "Game Controller", "Sixense Controllers", "Perception Neuron", "Leap Motion"]
|
||||||
categoryProperties: {
|
categoryProperties: {
|
||||||
"VR Movement" : {
|
"VR Movement" : {
|
||||||
"User real-world height (meters)" : { "anchors.right" : "undefined" },
|
"User real-world height (meters)" : { "anchors.right" : "undefined" },
|
||||||
|
|
|
@ -4839,6 +4839,13 @@ void Application::loadSettings() {
|
||||||
}
|
}
|
||||||
|
|
||||||
isFirstPerson = (qApp->isHMDMode());
|
isFirstPerson = (qApp->isHMDMode());
|
||||||
|
|
||||||
|
// Flying should be disabled by default in HMD mode on first run, and it
|
||||||
|
// should be enabled by default in desktop mode.
|
||||||
|
|
||||||
|
auto myAvatar = getMyAvatar();
|
||||||
|
myAvatar->setFlyingEnabled(!isFirstPerson);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// if this is not the first run, the camera will be initialized differently depending on user settings
|
// if this is not the first run, the camera will be initialized differently depending on user settings
|
||||||
|
|
||||||
|
|
|
@ -275,6 +275,13 @@ Menu::Menu() {
|
||||||
QString("hifi/tablet/TabletGraphicsPreferences.qml"), "GraphicsPreferencesDialog");
|
QString("hifi/tablet/TabletGraphicsPreferences.qml"), "GraphicsPreferencesDialog");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Settings > Attachments...
|
||||||
|
action = addActionToQMenuAndActionHash(settingsMenu, MenuOption::Attachments);
|
||||||
|
connect(action, &QAction::triggered, [] {
|
||||||
|
qApp->showDialog(QString("hifi/dialogs/AttachmentsDialog.qml"),
|
||||||
|
QString("hifi/tablet/TabletAttachmentsDialog.qml"), "AttachmentsDialog");
|
||||||
|
});
|
||||||
|
|
||||||
// Settings > Developer Menu
|
// Settings > Developer Menu
|
||||||
addCheckableActionToQMenuAndActionHash(settingsMenu, "Developer Menu", 0, false, this, SLOT(toggleDeveloperMenus()));
|
addCheckableActionToQMenuAndActionHash(settingsMenu, "Developer Menu", 0, false, this, SLOT(toggleDeveloperMenus()));
|
||||||
|
|
||||||
|
|
|
@ -1281,7 +1281,8 @@ void MyAvatar::loadData() {
|
||||||
settings.remove("avatarEntityData");
|
settings.remove("avatarEntityData");
|
||||||
}
|
}
|
||||||
setAvatarEntityDataChanged(true);
|
setAvatarEntityDataChanged(true);
|
||||||
setFlyingEnabled(settings.value("enabledFlying").toBool());
|
Setting::Handle<bool> firstRunVal { Settings::firstRun, true };
|
||||||
|
setFlyingEnabled(firstRunVal.get() ? getFlyingEnabled() : settings.value("enabledFlying").toBool());
|
||||||
setDisplayName(settings.value("displayName").toString());
|
setDisplayName(settings.value("displayName").toString());
|
||||||
setCollisionSoundURL(settings.value("collisionSoundURL", DEFAULT_AVATAR_COLLISION_SOUND_URL).toString());
|
setCollisionSoundURL(settings.value("collisionSoundURL", DEFAULT_AVATAR_COLLISION_SOUND_URL).toString());
|
||||||
setSnapTurn(settings.value("useSnapTurn", _useSnapTurn).toBool());
|
setSnapTurn(settings.value("useSnapTurn", _useSnapTurn).toBool());
|
||||||
|
|
|
@ -266,20 +266,15 @@ void setupPreferences() {
|
||||||
preferences->addPreference(new SliderPreference(FACE_TRACKING, "Eye Deflection", getter, setter));
|
preferences->addPreference(new SliderPreference(FACE_TRACKING, "Eye Deflection", getter, setter));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const QString MOVEMENT{ "VR Movement" };
|
static const QString MOVEMENT{ "Movement" };
|
||||||
{
|
{
|
||||||
|
|
||||||
static const QString movementsControlChannel = QStringLiteral("Hifi-Advanced-Movement-Disabler");
|
static const QString movementsControlChannel = QStringLiteral("Hifi-Advanced-Movement-Disabler");
|
||||||
auto getter = [=]()->bool { return myAvatar->useAdvancedMovementControls(); };
|
auto getter = [=]()->bool { return myAvatar->useAdvancedMovementControls(); };
|
||||||
auto setter = [=](bool value) { myAvatar->setUseAdvancedMovementControls(value); };
|
auto setter = [=](bool value) { myAvatar->setUseAdvancedMovementControls(value); };
|
||||||
preferences->addPreference(new CheckPreference(MOVEMENT,
|
preferences->addPreference(new CheckPreference(MOVEMENT,
|
||||||
QStringLiteral("Advanced movement for hand controllers"),
|
QStringLiteral("Advanced movement for hand controllers"),
|
||||||
getter, setter));
|
getter, setter));
|
||||||
}
|
|
||||||
{
|
|
||||||
auto getter = [=]()->bool { return myAvatar->getFlyingEnabled(); };
|
|
||||||
auto setter = [=](bool value) { myAvatar->setFlyingEnabled(value); };
|
|
||||||
preferences->addPreference(new CheckPreference(MOVEMENT, "Flying & jumping", getter, setter));
|
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
auto getter = [=]()->int { return myAvatar->getSnapTurn() ? 0 : 1; };
|
auto getter = [=]()->int { return myAvatar->getSnapTurn() ? 0 : 1; };
|
||||||
|
@ -307,6 +302,47 @@ void setupPreferences() {
|
||||||
preferences->addPreference(preference);
|
preferences->addPreference(preference);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const QString VR_MOVEMENT{ "VR Movement" };
|
||||||
|
{
|
||||||
|
|
||||||
|
static const QString movementsControlChannel = QStringLiteral("Hifi-Advanced-Movement-Disabler");
|
||||||
|
auto getter = [=]()->bool { return myAvatar->useAdvancedMovementControls(); };
|
||||||
|
auto setter = [=](bool value) { myAvatar->setUseAdvancedMovementControls(value); };
|
||||||
|
preferences->addPreference(new CheckPreference(VR_MOVEMENT,
|
||||||
|
QStringLiteral("Advanced movement for hand controllers"),
|
||||||
|
getter, setter));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto getter = [=]()->bool { return myAvatar->getFlyingEnabled(); };
|
||||||
|
auto setter = [=](bool value) { myAvatar->setFlyingEnabled(value); };
|
||||||
|
preferences->addPreference(new CheckPreference(VR_MOVEMENT, "Flying & jumping", getter, setter));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto getter = [=]()->int { return myAvatar->getSnapTurn() ? 0 : 1; };
|
||||||
|
auto setter = [=](int value) { myAvatar->setSnapTurn(value == 0); };
|
||||||
|
auto preference = new RadioButtonsPreference(VR_MOVEMENT, "Snap turn / Smooth turn", getter, setter);
|
||||||
|
QStringList items;
|
||||||
|
items << "Snap turn" << "Smooth turn";
|
||||||
|
preference->setItems(items);
|
||||||
|
preferences->addPreference(preference);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto getter = [=]()->float { return myAvatar->getUserHeight(); };
|
||||||
|
auto setter = [=](float value) { myAvatar->setUserHeight(value); };
|
||||||
|
auto preference = new SpinnerPreference(VR_MOVEMENT, "User real-world height (meters)", getter, setter);
|
||||||
|
preference->setMin(1.0f);
|
||||||
|
preference->setMax(2.2f);
|
||||||
|
preference->setDecimals(3);
|
||||||
|
preference->setStep(0.001f);
|
||||||
|
preferences->addPreference(preference);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto preference = new ButtonPreference(VR_MOVEMENT, "RESET SENSORS", [] {
|
||||||
|
qApp->resetSensors();
|
||||||
|
});
|
||||||
|
preferences->addPreference(preference);
|
||||||
|
}
|
||||||
|
|
||||||
static const QString AVATAR_CAMERA{ "Mouse Sensitivity" };
|
static const QString AVATAR_CAMERA{ "Mouse Sensitivity" };
|
||||||
{
|
{
|
||||||
auto getter = [=]()->float { return myAvatar->getPitchSpeed(); };
|
auto getter = [=]()->float { return myAvatar->getPitchSpeed(); };
|
||||||
|
|
|
@ -185,7 +185,7 @@ private:
|
||||||
#if defined(Q_OS_ANDROID)
|
#if defined(Q_OS_ANDROID)
|
||||||
Setting::Handle<bool> _ignoreRadiusEnabled { "IgnoreRadiusEnabled", false };
|
Setting::Handle<bool> _ignoreRadiusEnabled { "IgnoreRadiusEnabled", false };
|
||||||
#else
|
#else
|
||||||
Setting::Handle<bool> _ignoreRadiusEnabled { "IgnoreRadiusEnabled", true };
|
Setting::Handle<bool> _ignoreRadiusEnabled { "IgnoreRadiusEnabled", false }; // False, until such time as it is made to work better.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (PR_BUILD || DEV_BUILD)
|
#if (PR_BUILD || DEV_BUILD)
|
||||||
|
|
|
@ -159,13 +159,12 @@ function fromQml(message) { // messages are {method, params}, like json-rpc. See
|
||||||
|
|
||||||
for(var bookmarkName in message.data.bookmarks) {
|
for(var bookmarkName in message.data.bookmarks) {
|
||||||
var bookmark = message.data.bookmarks[bookmarkName];
|
var bookmark = message.data.bookmarks[bookmarkName];
|
||||||
if (!bookmark.avatarEntites) { // ensure avatarEntites always exist
|
|
||||||
bookmark.avatarEntites = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
bookmark.avatarEntites.forEach(function(avatarEntity) {
|
if (bookmark.avatarEntites) {
|
||||||
avatarEntity.properties.localRotationAngles = Quat.safeEulerAngles(avatarEntity.properties.localRotation)
|
bookmark.avatarEntites.forEach(function(avatarEntity) {
|
||||||
})
|
avatarEntity.properties.localRotationAngles = Quat.safeEulerAngles(avatarEntity.properties.localRotation);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sendToQml(message)
|
sendToQml(message)
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
/* global Script, Controller, RIGHT_HAND, LEFT_HAND, enableDispatcherModule, disableDispatcherModule, makeRunningValues,
|
/* global Script, Controller, RIGHT_HAND, LEFT_HAND, enableDispatcherModule, disableDispatcherModule, makeRunningValues,
|
||||||
Messages, makeDispatcherModuleParameters, HMD, getGrabPointSphereOffset, COLORS_GRAB_SEARCHING_HALF_SQUEEZE,
|
Messages, makeDispatcherModuleParameters, HMD, getGrabPointSphereOffset, COLORS_GRAB_SEARCHING_HALF_SQUEEZE,
|
||||||
COLORS_GRAB_SEARCHING_FULL_SQUEEZE, COLORS_GRAB_DISTANCE_HOLD, DEFAULT_SEARCH_SPHERE_DISTANCE, TRIGGER_ON_VALUE,
|
COLORS_GRAB_SEARCHING_FULL_SQUEEZE, COLORS_GRAB_DISTANCE_HOLD, DEFAULT_SEARCH_SPHERE_DISTANCE, TRIGGER_ON_VALUE,
|
||||||
getEnabledModuleByName, PICK_MAX_DISTANCE, isInEditMode, Picks, makeLaserParams
|
getEnabledModuleByName, PICK_MAX_DISTANCE, isInEditMode, Picks, makeLaserParams, Entities
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Script.include("/~/system/libraries/controllerDispatcherUtils.js");
|
Script.include("/~/system/libraries/controllerDispatcherUtils.js");
|
||||||
|
@ -19,7 +19,7 @@ Script.include("/~/system/libraries/utils.js");
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
var MARGIN = 25;
|
var MARGIN = 25;
|
||||||
|
var TABLET_MATERIAL_ENTITY_NAME = 'Tablet-Material-Entity';
|
||||||
function InEditMode(hand) {
|
function InEditMode(hand) {
|
||||||
this.hand = hand;
|
this.hand = hand;
|
||||||
this.triggerClicked = false;
|
this.triggerClicked = false;
|
||||||
|
@ -53,7 +53,7 @@ Script.include("/~/system/libraries/utils.js");
|
||||||
return (HMD.tabletScreenID && objectID === HMD.tabletScreenID)
|
return (HMD.tabletScreenID && objectID === HMD.tabletScreenID)
|
||||||
|| (HMD.homeButtonID && objectID === HMD.homeButtonID);
|
|| (HMD.homeButtonID && objectID === HMD.homeButtonID);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.calculateNewReticlePosition = function(intersection) {
|
this.calculateNewReticlePosition = function(intersection) {
|
||||||
var dims = Controller.getViewportDimensions();
|
var dims = Controller.getViewportDimensions();
|
||||||
this.reticleMaxX = dims.x - MARGIN;
|
this.reticleMaxX = dims.x - MARGIN;
|
||||||
|
@ -75,10 +75,12 @@ Script.include("/~/system/libraries/utils.js");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.selectedTarget.type === Picks.INTERSECTED_ENTITY) {
|
if (this.selectedTarget.type === Picks.INTERSECTED_ENTITY) {
|
||||||
Messages.sendLocalMessage("entityToolUpdates", JSON.stringify({
|
if (!this.isTabletMaterialEntity(this.selectedTarget.objectID)) {
|
||||||
method: "selectEntity",
|
Messages.sendLocalMessage("entityToolUpdates", JSON.stringify({
|
||||||
entityID: this.selectedTarget.objectID
|
method: "selectEntity",
|
||||||
}));
|
entityID: this.selectedTarget.objectID
|
||||||
|
}));
|
||||||
|
}
|
||||||
} else if (this.selectedTarget.type === Picks.INTERSECTED_OVERLAY) {
|
} else if (this.selectedTarget.type === Picks.INTERSECTED_OVERLAY) {
|
||||||
Messages.sendLocalMessage("entityToolUpdates", JSON.stringify({
|
Messages.sendLocalMessage("entityToolUpdates", JSON.stringify({
|
||||||
method: "selectOverlay",
|
method: "selectOverlay",
|
||||||
|
@ -88,10 +90,16 @@ Script.include("/~/system/libraries/utils.js");
|
||||||
|
|
||||||
this.triggerClicked = true;
|
this.triggerClicked = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.sendPointingAtData(controllerData);
|
this.sendPointingAtData(controllerData);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
this.isTabletMaterialEntity = function(entityID) {
|
||||||
|
return ((entityID === HMD.homeButtonHighlightMaterialID) ||
|
||||||
|
(entityID === HMD.homeButtonUnhighlightMaterialID));
|
||||||
|
};
|
||||||
|
|
||||||
this.sendPointingAtData = function(controllerData) {
|
this.sendPointingAtData = function(controllerData) {
|
||||||
var rayPick = controllerData.rayPicks[this.hand];
|
var rayPick = controllerData.rayPicks[this.hand];
|
||||||
var hudRayPick = controllerData.hudRayPicks[this.hand];
|
var hudRayPick = controllerData.hudRayPicks[this.hand];
|
||||||
|
|
|
@ -30,6 +30,8 @@ var INCHES_TO_METERS = 1 / 39.3701;
|
||||||
var NO_HANDS = -1;
|
var NO_HANDS = -1;
|
||||||
var DELAY_FOR_30HZ = 33; // milliseconds
|
var DELAY_FOR_30HZ = 33; // milliseconds
|
||||||
|
|
||||||
|
var TABLET_MATERIAL_ENTITY_NAME = 'Tablet-Material-Entity';
|
||||||
|
|
||||||
|
|
||||||
// will need to be recaclulated if dimensions of fbx model change.
|
// will need to be recaclulated if dimensions of fbx model change.
|
||||||
var TABLET_NATURAL_DIMENSIONS = {x: 32.083, y: 48.553, z: 2.269};
|
var TABLET_NATURAL_DIMENSIONS = {x: 32.083, y: 48.553, z: 2.269};
|
||||||
|
@ -79,6 +81,19 @@ function calcSpawnInfo(hand, landscape) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
cleanUpOldMaterialEntities = function() {
|
||||||
|
var avatarEntityData = MyAvatar.getAvatarEntityData();
|
||||||
|
for (var entityID in avatarEntityData) {
|
||||||
|
var entityName = Entities.getEntityProperties(entityID, ["name"]).name;
|
||||||
|
|
||||||
|
if (entityName === TABLET_MATERIAL_ENTITY_NAME && entityID !== HMD.homeButtonHighlightMaterialID &&
|
||||||
|
entityID !== HMD.homeButtonUnhighlightMaterialID) {
|
||||||
|
Entities.deleteEntity(entityID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* WebTablet
|
* WebTablet
|
||||||
* @param url [string] url of content to show on the tablet.
|
* @param url [string] url of content to show on the tablet.
|
||||||
|
@ -134,6 +149,7 @@ WebTablet = function (url, width, dpi, hand, clientOnly, location, visible) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.cleanUpOldTablets();
|
this.cleanUpOldTablets();
|
||||||
|
cleanUpOldMaterialEntities();
|
||||||
|
|
||||||
this.tabletEntityID = Overlays.addOverlay("model", tabletProperties);
|
this.tabletEntityID = Overlays.addOverlay("model", tabletProperties);
|
||||||
|
|
||||||
|
@ -180,6 +196,7 @@ WebTablet = function (url, width, dpi, hand, clientOnly, location, visible) {
|
||||||
|
|
||||||
this.homeButtonUnhighlightMaterial = Entities.addEntity({
|
this.homeButtonUnhighlightMaterial = Entities.addEntity({
|
||||||
type: "Material",
|
type: "Material",
|
||||||
|
name: TABLET_MATERIAL_ENTITY_NAME,
|
||||||
materialURL: "materialData",
|
materialURL: "materialData",
|
||||||
localPosition: { x: 0.0, y: 0.0, z: 0.0 },
|
localPosition: { x: 0.0, y: 0.0, z: 0.0 },
|
||||||
priority: HIGH_PRIORITY,
|
priority: HIGH_PRIORITY,
|
||||||
|
@ -199,6 +216,7 @@ WebTablet = function (url, width, dpi, hand, clientOnly, location, visible) {
|
||||||
|
|
||||||
this.homeButtonHighlightMaterial = Entities.addEntity({
|
this.homeButtonHighlightMaterial = Entities.addEntity({
|
||||||
type: "Material",
|
type: "Material",
|
||||||
|
name: TABLET_MATERIAL_ENTITY_NAME,
|
||||||
materialURL: "materialData",
|
materialURL: "materialData",
|
||||||
localPosition: { x: 0.0, y: 0.0, z: 0.0 },
|
localPosition: { x: 0.0, y: 0.0, z: 0.0 },
|
||||||
priority: LOW_PRIORITY,
|
priority: LOW_PRIORITY,
|
||||||
|
|
|
@ -111,6 +111,11 @@ EntityListTool = function(shouldUseEditTabletApp) {
|
||||||
return value !== undefined ? value : "";
|
return value !== undefined ? value : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function filterEntity(entityID) {
|
||||||
|
return ((entityID === HMD.homeButtonHighlightMaterialID) ||
|
||||||
|
(entityID === HMD.homeButtonUnhighlightMaterialID));
|
||||||
|
}
|
||||||
|
|
||||||
that.sendUpdate = function() {
|
that.sendUpdate = function() {
|
||||||
var entities = [];
|
var entities = [];
|
||||||
|
|
||||||
|
@ -121,6 +126,10 @@ EntityListTool = function(shouldUseEditTabletApp) {
|
||||||
ids = Entities.findEntities(MyAvatar.position, searchRadius);
|
ids = Entities.findEntities(MyAvatar.position, searchRadius);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ids = ids.filter(function(id) {
|
||||||
|
return !filterEntity(id);
|
||||||
|
});
|
||||||
|
|
||||||
var cameraPosition = Camera.position;
|
var cameraPosition = Camera.position;
|
||||||
for (var i = 0; i < ids.length; i++) {
|
for (var i = 0; i < ids.length; i++) {
|
||||||
var id = ids[i];
|
var id = ids[i];
|
||||||
|
|
|
@ -381,6 +381,8 @@ SelectionDisplay = (function() {
|
||||||
|
|
||||||
var CTRL_KEY_CODE = 16777249;
|
var CTRL_KEY_CODE = 16777249;
|
||||||
|
|
||||||
|
var RAIL_AXIS_LENGTH = 10000;
|
||||||
|
|
||||||
var TRANSLATE_DIRECTION = {
|
var TRANSLATE_DIRECTION = {
|
||||||
X: 0,
|
X: 0,
|
||||||
Y: 1,
|
Y: 1,
|
||||||
|
@ -616,6 +618,40 @@ SelectionDisplay = (function() {
|
||||||
dashed: false
|
dashed: false
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var xRailOverlay = Overlays.addOverlay("line3d", {
|
||||||
|
visible: false,
|
||||||
|
start: Vec3.ZERO,
|
||||||
|
end: Vec3.ZERO,
|
||||||
|
color: {
|
||||||
|
red: 255,
|
||||||
|
green: 0,
|
||||||
|
blue: 0
|
||||||
|
},
|
||||||
|
ignoreRayIntersection: true // always ignore this
|
||||||
|
});
|
||||||
|
var yRailOverlay = Overlays.addOverlay("line3d", {
|
||||||
|
visible: false,
|
||||||
|
start: Vec3.ZERO,
|
||||||
|
end: Vec3.ZERO,
|
||||||
|
color: {
|
||||||
|
red: 0,
|
||||||
|
green: 255,
|
||||||
|
blue: 0
|
||||||
|
},
|
||||||
|
ignoreRayIntersection: true // always ignore this
|
||||||
|
});
|
||||||
|
var zRailOverlay = Overlays.addOverlay("line3d", {
|
||||||
|
visible: false,
|
||||||
|
start: Vec3.ZERO,
|
||||||
|
end: Vec3.ZERO,
|
||||||
|
color: {
|
||||||
|
red: 0,
|
||||||
|
green: 0,
|
||||||
|
blue: 255
|
||||||
|
},
|
||||||
|
ignoreRayIntersection: true // always ignore this
|
||||||
|
});
|
||||||
|
|
||||||
var allOverlays = [
|
var allOverlays = [
|
||||||
handleTranslateXCone,
|
handleTranslateXCone,
|
||||||
handleTranslateXCylinder,
|
handleTranslateXCylinder,
|
||||||
|
@ -656,7 +692,11 @@ SelectionDisplay = (function() {
|
||||||
handleScaleFLEdge,
|
handleScaleFLEdge,
|
||||||
handleCloner,
|
handleCloner,
|
||||||
selectionBox,
|
selectionBox,
|
||||||
iconSelectionBox
|
iconSelectionBox,
|
||||||
|
xRailOverlay,
|
||||||
|
yRailOverlay,
|
||||||
|
zRailOverlay
|
||||||
|
|
||||||
];
|
];
|
||||||
var maximumHandleInAllOverlays = handleCloner;
|
var maximumHandleInAllOverlays = handleCloner;
|
||||||
|
|
||||||
|
@ -873,11 +913,13 @@ SelectionDisplay = (function() {
|
||||||
};
|
};
|
||||||
|
|
||||||
// FUNCTION: MOUSE MOVE EVENT
|
// FUNCTION: MOUSE MOVE EVENT
|
||||||
|
var lastMouseEvent = null;
|
||||||
that.mouseMoveEvent = function(event) {
|
that.mouseMoveEvent = function(event) {
|
||||||
var wantDebug = false;
|
var wantDebug = false;
|
||||||
if (wantDebug) {
|
if (wantDebug) {
|
||||||
print("=============== eST::MouseMoveEvent BEG =======================");
|
print("=============== eST::MouseMoveEvent BEG =======================");
|
||||||
}
|
}
|
||||||
|
lastMouseEvent = event;
|
||||||
if (activeTool) {
|
if (activeTool) {
|
||||||
if (wantDebug) {
|
if (wantDebug) {
|
||||||
print(" Trigger ActiveTool(" + activeTool.mode + ")'s onMove");
|
print(" Trigger ActiveTool(" + activeTool.mode + ")'s onMove");
|
||||||
|
@ -999,19 +1041,35 @@ SelectionDisplay = (function() {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Control key remains active only while key is held down
|
// Control key remains active only while key is held down
|
||||||
that.keyReleaseEvent = function(key) {
|
that.keyReleaseEvent = function(event) {
|
||||||
if (key.key === CTRL_KEY_CODE) {
|
if (event.key === CTRL_KEY_CODE) {
|
||||||
ctrlPressed = false;
|
ctrlPressed = false;
|
||||||
that.updateActiveRotateRing();
|
that.updateActiveRotateRing();
|
||||||
}
|
}
|
||||||
|
if (activeTool && lastMouseEvent !== null) {
|
||||||
|
lastMouseEvent.isShifted = event.isShifted;
|
||||||
|
lastMouseEvent.isMeta = event.isMeta;
|
||||||
|
lastMouseEvent.isControl = event.isControl;
|
||||||
|
lastMouseEvent.isAlt = event.isAlt;
|
||||||
|
activeTool.onMove(lastMouseEvent);
|
||||||
|
SelectionManager._update();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Triggers notification on specific key driven events
|
// Triggers notification on specific key driven events
|
||||||
that.keyPressEvent = function(key) {
|
that.keyPressEvent = function(event) {
|
||||||
if (key.key === CTRL_KEY_CODE) {
|
if (event.key === CTRL_KEY_CODE) {
|
||||||
ctrlPressed = true;
|
ctrlPressed = true;
|
||||||
that.updateActiveRotateRing();
|
that.updateActiveRotateRing();
|
||||||
}
|
}
|
||||||
|
if (activeTool && lastMouseEvent !== null) {
|
||||||
|
lastMouseEvent.isShifted = event.isShifted;
|
||||||
|
lastMouseEvent.isMeta = event.isMeta;
|
||||||
|
lastMouseEvent.isControl = event.isControl;
|
||||||
|
lastMouseEvent.isAlt = event.isAlt;
|
||||||
|
activeTool.onMove(lastMouseEvent);
|
||||||
|
SelectionManager._update();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// NOTE: mousePressEvent and mouseMoveEvent from the main script should call us., so we don't hook these:
|
// NOTE: mousePressEvent and mouseMoveEvent from the main script should call us., so we don't hook these:
|
||||||
|
@ -1705,6 +1763,14 @@ SelectionDisplay = (function() {
|
||||||
},
|
},
|
||||||
onEnd: function(event, reason) {
|
onEnd: function(event, reason) {
|
||||||
pushCommandForSelections(duplicatedEntityIDs);
|
pushCommandForSelections(duplicatedEntityIDs);
|
||||||
|
if (isConstrained) {
|
||||||
|
Overlays.editOverlay(xRailOverlay, {
|
||||||
|
visible: false
|
||||||
|
});
|
||||||
|
Overlays.editOverlay(zRailOverlay, {
|
||||||
|
visible: false
|
||||||
|
});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
elevation: function(origin, intersection) {
|
elevation: function(origin, intersection) {
|
||||||
return (origin.y - intersection.y) / Vec3.distance(origin, intersection);
|
return (origin.y - intersection.y) / Vec3.distance(origin, intersection);
|
||||||
|
@ -1768,10 +1834,46 @@ SelectionDisplay = (function() {
|
||||||
vector.x = 0;
|
vector.x = 0;
|
||||||
}
|
}
|
||||||
if (!isConstrained) {
|
if (!isConstrained) {
|
||||||
|
var xStart = Vec3.sum(startPosition, {
|
||||||
|
x: -RAIL_AXIS_LENGTH,
|
||||||
|
y: 0,
|
||||||
|
z: 0
|
||||||
|
});
|
||||||
|
var xEnd = Vec3.sum(startPosition, {
|
||||||
|
x: RAIL_AXIS_LENGTH,
|
||||||
|
y: 0,
|
||||||
|
z: 0
|
||||||
|
});
|
||||||
|
var zStart = Vec3.sum(startPosition, {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
z: -RAIL_AXIS_LENGTH
|
||||||
|
});
|
||||||
|
var zEnd = Vec3.sum(startPosition, {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
z: RAIL_AXIS_LENGTH
|
||||||
|
});
|
||||||
|
Overlays.editOverlay(xRailOverlay, {
|
||||||
|
start: xStart,
|
||||||
|
end: xEnd,
|
||||||
|
visible: true
|
||||||
|
});
|
||||||
|
Overlays.editOverlay(zRailOverlay, {
|
||||||
|
start: zStart,
|
||||||
|
end: zEnd,
|
||||||
|
visible: true
|
||||||
|
});
|
||||||
isConstrained = true;
|
isConstrained = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (isConstrained) {
|
if (isConstrained) {
|
||||||
|
Overlays.editOverlay(xRailOverlay, {
|
||||||
|
visible: false
|
||||||
|
});
|
||||||
|
Overlays.editOverlay(zRailOverlay, {
|
||||||
|
visible: false
|
||||||
|
});
|
||||||
isConstrained = false;
|
isConstrained = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
/* global Script, HMD, WebTablet, UIWebTablet, UserActivityLogger, Settings, Entities, Messages, Tablet, Overlays,
|
/* global Script, HMD, WebTablet, UIWebTablet, UserActivityLogger, Settings, Entities, Messages, Tablet, Overlays,
|
||||||
MyAvatar, Menu, AvatarInputs, Vec3 */
|
MyAvatar, Menu, AvatarInputs, Vec3, cleanUpOldMaterialEntities */
|
||||||
|
|
||||||
(function() { // BEGIN LOCAL_SCOPE
|
(function() { // BEGIN LOCAL_SCOPE
|
||||||
var tabletRezzed = false;
|
var tabletRezzed = false;
|
||||||
|
@ -31,6 +31,14 @@
|
||||||
|
|
||||||
Script.include("../libraries/WebTablet.js");
|
Script.include("../libraries/WebTablet.js");
|
||||||
|
|
||||||
|
function cleanupMaterialEntities() {
|
||||||
|
if (Window.isPhysicsEnabled()) {
|
||||||
|
cleanUpOldMaterialEntities();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Script.setTimeout(cleanupMaterialEntities, 100);
|
||||||
|
}
|
||||||
|
|
||||||
function checkTablet() {
|
function checkTablet() {
|
||||||
if (gTablet === null) {
|
if (gTablet === null) {
|
||||||
gTablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
|
gTablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
|
||||||
|
@ -327,4 +335,5 @@
|
||||||
HMD.homeButtonHighlightMaterialID = null;
|
HMD.homeButtonHighlightMaterialID = null;
|
||||||
HMD.homeButtonUnhighlightMaterialID = null;
|
HMD.homeButtonUnhighlightMaterialID = null;
|
||||||
});
|
});
|
||||||
|
Script.setTimeout(cleanupMaterialEntities, 100);
|
||||||
}()); // END LOCAL_SCOPE
|
}()); // END LOCAL_SCOPE
|
||||||
|
|
|
@ -405,7 +405,7 @@ LogWindow.prototype = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function goHomeClicked() {
|
function visitSandboxClicked() {
|
||||||
if (interfacePath) {
|
if (interfacePath) {
|
||||||
startInterface('hifi://localhost');
|
startInterface('hifi://localhost');
|
||||||
} else {
|
} else {
|
||||||
|
@ -439,8 +439,8 @@ var labels = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
goHome: {
|
goHome: {
|
||||||
label: 'Go Home',
|
label: 'Visit Sandbox',
|
||||||
click: goHomeClicked,
|
click: visitSandboxClicked,
|
||||||
enabled: false
|
enabled: false
|
||||||
},
|
},
|
||||||
quit: {
|
quit: {
|
||||||
|
|
Loading…
Reference in a new issue