History

handControllerGrab and web entity input integration

Anthony Thibault committed 10 years ago

Commit cf7450b1 parent f71a5927 files · +337 −216Browse files

Showing the changes to interface/src/Application.cpp (1 of 7 files). Show all

Unified · Split

interface/src/Application.cpp+113−65
@@ -1045,70 +1045,24 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : · 1044 unmodified lines
10451045 // If the user clicks an an entity, we will check that it's an unlocked web entity, and if so, set the focus to it
10461046 auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>();
10471047 connect(entityScriptingInterface.data(), &EntityScriptingInterface::clickDownOnEntity,
1048− [this, entityScriptingInterface](const EntityItemID& entityItemID, const MouseEvent& event) {
1049− if (_keyboardFocusedItem != entityItemID) {
1050− _keyboardFocusedItem = UNKNOWN_ENTITY_ID;
1051− auto properties = entityScriptingInterface->getEntityProperties(entityItemID);
1052− if (EntityTypes::Web == properties.getType() && !properties.getLocked() && properties.getVisible()) {
1053− auto entity = entityScriptingInterface->getEntityTree()->findEntityByID(entityItemID);
1054− RenderableWebEntityItem* webEntity = dynamic_cast<RenderableWebEntityItem*>(entity.get());
1055− if (webEntity) {
1056− webEntity->setProxyWindow(_window->windowHandle());
1057− if (_keyboardMouseDevice->isActive()) {
1058− _keyboardMouseDevice->pluginFocusOutEvent();
1059− }
1060− _keyboardFocusedItem = entityItemID;
1061− _lastAcceptedKeyPress = usecTimestampNow();
1062− if (_keyboardFocusHighlightID < 0 || !getOverlays().isAddedOverlay(_keyboardFocusHighlightID)) {
1063− _keyboardFocusHighlight = new Cube3DOverlay();
1064− _keyboardFocusHighlight->setAlpha(1.0f);
1065− _keyboardFocusHighlight->setBorderSize(1.0f);
1066− _keyboardFocusHighlight->setColor({ 0xFF, 0xEF, 0x00 });
1067− _keyboardFocusHighlight->setIsSolid(false);
1068− _keyboardFocusHighlight->setPulseMin(0.5);
1069− _keyboardFocusHighlight->setPulseMax(1.0);
1070− _keyboardFocusHighlight->setColorPulse(1.0);
1071− _keyboardFocusHighlight->setIgnoreRayIntersection(true);
1072− _keyboardFocusHighlight->setDrawInFront(true);
1073− }
1074− _keyboardFocusHighlight->setRotation(webEntity->getRotation());
1075− _keyboardFocusHighlight->setPosition(webEntity->getPosition());
1076− _keyboardFocusHighlight->setDimensions(webEntity->getDimensions() * 1.05f);
1077− _keyboardFocusHighlight->setVisible(true);
1078− _keyboardFocusHighlightID = getOverlays().addOverlay(_keyboardFocusHighlight);
1079− }
1080− }
1081− if (_keyboardFocusedItem == UNKNOWN_ENTITY_ID && _keyboardFocusHighlight) {
1082− _keyboardFocusHighlight->setVisible(false);
1083− }
1084−
1085− }
1048+ [this](const EntityItemID& entityItemID, const MouseEvent& event) {
1049+ setKeyboardFocusEntity(entityItemID);
10861050 });
10871051
1088− connect(entityScriptingInterface.data(), &EntityScriptingInterface::deletingEntity,
1089− [=](const EntityItemID& entityItemID) {
1090− if (entityItemID == _keyboardFocusedItem) {
1091− _keyboardFocusedItem = UNKNOWN_ENTITY_ID;
1092− if (_keyboardFocusHighlight) {
1093− _keyboardFocusHighlight->setVisible(false);
1094− }
1052+ connect(entityScriptingInterface.data(), &EntityScriptingInterface::deletingEntity, [=](const EntityItemID& entityItemID) {
1053+ if (entityItemID == _keyboardFocusedItem.get()) {
1054+ setKeyboardFocusEntity(UNKNOWN_ENTITY_ID);
10951055 }
10961056 });
10971057
10981058 // If the user clicks somewhere where there is NO entity at all, we will release focus
10991059 connect(getEntities(), &EntityTreeRenderer::mousePressOffEntity,
11001060 [=](const RayToEntityIntersectionResult& entityItemID, const QMouseEvent* event) {
1101− _keyboardFocusedItem = UNKNOWN_ENTITY_ID;
1102− if (_keyboardFocusHighlight) {
1103− _keyboardFocusHighlight->setVisible(false);
1104− }
1061+ setKeyboardFocusEntity(UNKNOWN_ENTITY_ID);
11051062 });
11061063
11071064 connect(this, &Application::aboutToQuit, [=]() {
1108− _keyboardFocusedItem = UNKNOWN_ENTITY_ID;
1109− if (_keyboardFocusHighlight) {
1110− _keyboardFocusHighlight->setVisible(false);
1111− }
1065+ setKeyboardFocusEntity(UNKNOWN_ENTITY_ID);
11121066 });
11131067
11141068 // Add periodic checks to send user activity data
@@ -1334,11 +1288,13 @@ void Application::cleanupBeforeQuit() { · 219 unmodified lines
13341288 // FIXME: once we move to shared pointer for the INputDevice we shoud remove this naked delete:
13351289 _applicationStateDevice.reset();
13361290
1337− if (_keyboardFocusHighlightID > 0) {
1338− getOverlays().deleteOverlay(_keyboardFocusHighlightID);
1339− _keyboardFocusHighlightID = -1;
1291+ {
1292+ if (_keyboardFocusHighlightID > 0) {
1293+ getOverlays().deleteOverlay(_keyboardFocusHighlightID);
1294+ _keyboardFocusHighlightID = -1;
1295+ }
1296+ _keyboardFocusHighlight = nullptr;
13401297 }
1341− _keyboardFocusHighlight = nullptr;
13421298
13431299 auto nodeList = DependencyManager::get<NodeList>();
13441300
@@ -2063,12 +2019,13 @@ bool Application::event(QEvent* event) { · 718 unmodified lines
20632019 return true;
20642020 }
20652021
2066− if (!_keyboardFocusedItem.isInvalidID()) {
2067− switch (event->type()) {
2022+ {
2023+ if (!_keyboardFocusedItem.get().isInvalidID()) {
2024+ switch (event->type()) {
20682025 case QEvent::KeyPress:
20692026 case QEvent::KeyRelease: {
20702027 auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>();
2071− auto entity = entityScriptingInterface->getEntityTree()->findEntityByID(_keyboardFocusedItem);
2028+ auto entity = entityScriptingInterface->getEntityTree()->findEntityByID(_keyboardFocusedItem.get());
20722029 RenderableWebEntityItem* webEntity = dynamic_cast<RenderableWebEntityItem*>(entity.get());
20732030 if (webEntity && webEntity->getEventHandler()) {
20742031 event->setAccepted(false);
@@ -2083,6 +2040,7 @@ bool Application::event(QEvent* event) { · 8 unmodified lines
20832040
20842041 default:
20852042 break;
2043+ }
20862044 }
20872045 }
20882046
@@ -2920,12 +2878,24 @@ void Application::idle(float nsecsElapsed) { · 831 unmodified lines
29202878 _simCounter.increment();
29212879
29222880 PerformanceTimer perfTimer("idle");
2881+
29232882 // Drop focus from _keyboardFocusedItem if no keyboard messages for 30 seconds
2924− if (!_keyboardFocusedItem.isInvalidID()) {
2925− const quint64 LOSE_FOCUS_AFTER_ELAPSED_TIME = 30 * USECS_PER_SECOND; // if idle for 30 seconds, drop focus
2926− quint64 elapsedSinceAcceptedKeyPress = usecTimestampNow() - _lastAcceptedKeyPress;
2927− if (elapsedSinceAcceptedKeyPress > LOSE_FOCUS_AFTER_ELAPSED_TIME) {
2928− _keyboardFocusedItem = UNKNOWN_ENTITY_ID;
2883+ {
2884+ if (!_keyboardFocusedItem.get().isInvalidID()) {
2885+ const quint64 LOSE_FOCUS_AFTER_ELAPSED_TIME = 30 * USECS_PER_SECOND; // if idle for 30 seconds, drop focus
2886+ quint64 elapsedSinceAcceptedKeyPress = usecTimestampNow() - _lastAcceptedKeyPress;
2887+ if (elapsedSinceAcceptedKeyPress > LOSE_FOCUS_AFTER_ELAPSED_TIME) {
2888+ setKeyboardFocusEntity(UNKNOWN_ENTITY_ID);
2889+ } else {
2890+ // update position of highlight overlay
2891+ auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>();
2892+ auto entity = entityScriptingInterface->getEntityTree()->findEntityByID(_keyboardFocusedItem.get());
2893+ RenderableWebEntityItem* webEntity = dynamic_cast<RenderableWebEntityItem*>(entity.get());
2894+ if (webEntity && _keyboardFocusHighlight) {
2895+ _keyboardFocusHighlight->setRotation(webEntity->getRotation());
2896+ _keyboardFocusHighlight->setPosition(webEntity->getPosition());
2897+ }
2898+ }
29292899 }
29302900 }
29312901
@@ -3505,6 +3475,84 @@ void Application::rotationModeChanged() const { · 573 unmodified lines
35053475 }
35063476 }
35073477
3478+QUuid Application::getKeyboardFocusEntity() const {
3479+ return _keyboardFocusedItem.get();
3480+}
3481+
3482+void Application::setKeyboardFocusEntity(QUuid id) {
3483+ EntityItemID entityItemID(id);
3484+ setKeyboardFocusEntity(entityItemID);
3485+}
3486+
3487+void Application::setKeyboardFocusEntity(EntityItemID entityItemID) {
3488+ auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>();
3489+ if (_keyboardFocusedItem.get() != entityItemID) {
3490+ _keyboardFocusedItem.set(UNKNOWN_ENTITY_ID);
3491+ auto properties = entityScriptingInterface->getEntityProperties(entityItemID);
3492+ if (EntityTypes::Web == properties.getType() && !properties.getLocked() && properties.getVisible()) {
3493+ auto entity = entityScriptingInterface->getEntityTree()->findEntityByID(entityItemID);
3494+ RenderableWebEntityItem* webEntity = dynamic_cast<RenderableWebEntityItem*>(entity.get());
3495+ if (webEntity) {
3496+ webEntity->setProxyWindow(_window->windowHandle());
3497+ if (_keyboardMouseDevice->isActive()) {
3498+ _keyboardMouseDevice->pluginFocusOutEvent();
3499+ }
3500+ _keyboardFocusedItem.set(entityItemID);
3501+ _lastAcceptedKeyPress = usecTimestampNow();
3502+ if (_keyboardFocusHighlightID < 0 || !getOverlays().isAddedOverlay(_keyboardFocusHighlightID)) {
3503+ _keyboardFocusHighlight = new Cube3DOverlay();
3504+ _keyboardFocusHighlight->setAlpha(1.0f);
3505+ _keyboardFocusHighlight->setBorderSize(1.0f);
3506+ _keyboardFocusHighlight->setColor({ 0xFF, 0xEF, 0x00 });
3507+ _keyboardFocusHighlight->setIsSolid(false);
3508+ _keyboardFocusHighlight->setPulseMin(0.5);
3509+ _keyboardFocusHighlight->setPulseMax(1.0);
3510+ _keyboardFocusHighlight->setColorPulse(1.0);
3511+ _keyboardFocusHighlight->setIgnoreRayIntersection(true);
3512+ _keyboardFocusHighlight->setDrawInFront(true);
3513+ }
3514+ _keyboardFocusHighlight->setRotation(webEntity->getRotation());
3515+ _keyboardFocusHighlight->setPosition(webEntity->getPosition());
3516+ _keyboardFocusHighlight->setDimensions(webEntity->getDimensions() * 1.05f);
3517+ _keyboardFocusHighlight->setVisible(true);
3518+ _keyboardFocusHighlightID = getOverlays().addOverlay(_keyboardFocusHighlight);
3519+ }
3520+ }
3521+ if (_keyboardFocusedItem.get() == UNKNOWN_ENTITY_ID && _keyboardFocusHighlight) {
3522+ _keyboardFocusHighlight->setVisible(false);
3523+ }
3524+ }
3525+}
3526+
3527+void Application::sendEntityMouseMoveEvent(QUuid id, glm::vec3 intersectionPoint) {
3528+ QMouseEvent mouseEvent(QEvent::MouseMove, QPoint(0, 0), QPoint(0, 0),
3529+ Qt::NoButton, Qt::NoButton, Qt::NoModifier);
3530+ sendEntityMouseEvent(id, mouseEvent, intersectionPoint);
3531+}
3532+
3533+void Application::sendEntityLeftMouseDownEvent(QUuid id, glm::vec3 intersectionPoint) {
3534+ QMouseEvent mouseEvent(QEvent::MouseButtonPress, QPoint(0, 0), QPoint(0, 0),
3535+ Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
3536+ sendEntityMouseEvent(id, mouseEvent, intersectionPoint);
3537+}
3538+
3539+void Application::sendEntityLeftMouseUpEvent(QUuid id, glm::vec3 intersectionPoint) {
3540+ QMouseEvent mouseEvent(QEvent::MouseButtonRelease, QPoint(0, 0), QPoint(0, 0),
3541+ Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
3542+ sendEntityMouseEvent(id, mouseEvent, intersectionPoint);
3543+}
3544+
3545+void Application::sendEntityMouseEvent(const QUuid& id, const QMouseEvent& mouseEvent, const glm::vec3& intersectionPoint) {
3546+ auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>();
3547+ EntityItemID entityItemID(id);
3548+ auto properties = entityScriptingInterface->getEntityProperties(entityItemID);
3549+ if (EntityTypes::Web == properties.getType() && !properties.getLocked() && properties.getVisible()) {
3550+ auto entity = entityScriptingInterface->getEntityTree()->findEntityByID(entityItemID);
3551+ RenderableWebEntityItem* webEntity = dynamic_cast<RenderableWebEntityItem*>(entity.get());
3552+ webEntity->handleMouseEvent(mouseEvent, intersectionPoint);
3553+ }
3554+}
3555+
35083556 void Application::updateDialogs(float deltaTime) const {
35093557 PerformanceTimer perfTimer("updateDialogs");
35103558 bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings);