improve pointer performance

This commit is contained in:
SamGondelman 2018-08-29 13:32:53 -07:00
parent 47ce8be526
commit cda8b82ead
4 changed files with 54 additions and 35 deletions

View file

@ -54,11 +54,13 @@ PathPointer::~PathPointer() {
void PathPointer::setRenderState(const std::string& state) { void PathPointer::setRenderState(const std::string& state) {
withWriteLock([&] { withWriteLock([&] {
if (!_currentRenderState.empty() && state != _currentRenderState) { if (!_currentRenderState.empty() && state != _currentRenderState) {
if (_renderStates.find(_currentRenderState) != _renderStates.end()) { auto renderState = _renderStates.find(_currentRenderState);
_renderStates[_currentRenderState]->disable(); if (renderState != _renderStates.end()) {
renderState->second->disable();
} }
if (_defaultRenderStates.find(_currentRenderState) != _defaultRenderStates.end()) { auto defaultRenderState = _defaultRenderStates.find(_currentRenderState);
_defaultRenderStates[_currentRenderState].second->disable(); if (defaultRenderState != _defaultRenderStates.end()) {
defaultRenderState->second.second->disable();
} }
} }
_currentRenderState = state; _currentRenderState = state;
@ -142,52 +144,57 @@ PickResultPointer PathPointer::getVisualPickResult(const PickResultPointer& pick
void PathPointer::updateVisuals(const PickResultPointer& pickResult) { void PathPointer::updateVisuals(const PickResultPointer& pickResult) {
IntersectionType type = getPickedObjectType(pickResult); IntersectionType type = getPickedObjectType(pickResult);
if (_enabled && !_currentRenderState.empty() && _renderStates.find(_currentRenderState) != _renderStates.end() && auto renderState = _renderStates.find(_currentRenderState);
auto defaultRenderState = _defaultRenderStates.find(_currentRenderState);
if (_enabled && !_currentRenderState.empty() && renderState != _renderStates.end() &&
(type != IntersectionType::NONE || _pathLength > 0.0f)) { (type != IntersectionType::NONE || _pathLength > 0.0f)) {
glm::vec3 origin = getPickOrigin(pickResult); glm::vec3 origin = getPickOrigin(pickResult);
glm::vec3 end = getPickEnd(pickResult, _pathLength); glm::vec3 end = getPickEnd(pickResult, _pathLength);
glm::vec3 surfaceNormal = getPickedObjectNormal(pickResult); glm::vec3 surfaceNormal = getPickedObjectNormal(pickResult);
_renderStates[_currentRenderState]->update(origin, end, surfaceNormal, _scaleWithAvatar, _distanceScaleEnd, _centerEndY, _faceAvatar, renderState->second->update(origin, end, surfaceNormal, _scaleWithAvatar, _distanceScaleEnd, _centerEndY, _faceAvatar,
_followNormal, _followNormalStrength, _pathLength, pickResult); _followNormal, _followNormalStrength, _pathLength, pickResult);
if (_defaultRenderStates.find(_currentRenderState) != _defaultRenderStates.end()) { if (defaultRenderState != _defaultRenderStates.end() && defaultRenderState->second.second->isEnabled()) {
_defaultRenderStates[_currentRenderState].second->disable(); defaultRenderState->second.second->disable();
} }
} else if (_enabled && !_currentRenderState.empty() && _defaultRenderStates.find(_currentRenderState) != _defaultRenderStates.end()) { } else if (_enabled && !_currentRenderState.empty() && defaultRenderState != _defaultRenderStates.end()) {
if (_renderStates.find(_currentRenderState) != _renderStates.end()) { if (renderState != _renderStates.end() && renderState->second->isEnabled()) {
_renderStates[_currentRenderState]->disable(); renderState->second->disable();
} }
glm::vec3 origin = getPickOrigin(pickResult); glm::vec3 origin = getPickOrigin(pickResult);
glm::vec3 end = getPickEnd(pickResult, _defaultRenderStates[_currentRenderState].first); glm::vec3 end = getPickEnd(pickResult, defaultRenderState->second.first);
_defaultRenderStates[_currentRenderState].second->update(origin, end, Vectors::UP, _scaleWithAvatar, _distanceScaleEnd, _centerEndY, defaultRenderState->second.second->update(origin, end, Vectors::UP, _scaleWithAvatar, _distanceScaleEnd, _centerEndY,
_faceAvatar, _followNormal, _followNormalStrength, _defaultRenderStates[_currentRenderState].first, pickResult); _faceAvatar, _followNormal, _followNormalStrength, defaultRenderState->second.first, pickResult);
} else if (!_currentRenderState.empty()) { } else if (!_currentRenderState.empty()) {
if (_renderStates.find(_currentRenderState) != _renderStates.end()) { if (renderState != _renderStates.end() && renderState->second->isEnabled()) {
_renderStates[_currentRenderState]->disable(); renderState->second->disable();
} }
if (_defaultRenderStates.find(_currentRenderState) != _defaultRenderStates.end()) { if (defaultRenderState != _defaultRenderStates.end() && defaultRenderState->second.second->isEnabled()) {
_defaultRenderStates[_currentRenderState].second->disable(); defaultRenderState->second.second->disable();
} }
} }
} }
void PathPointer::editRenderState(const std::string& state, const QVariant& startProps, const QVariant& pathProps, const QVariant& endProps) { void PathPointer::editRenderState(const std::string& state, const QVariant& startProps, const QVariant& pathProps, const QVariant& endProps) {
withWriteLock([&] { withWriteLock([&] {
updateRenderStateOverlay(_renderStates[state]->getStartID(), startProps); auto renderState = _renderStates.find(state);
updateRenderStateOverlay(_renderStates[state]->getEndID(), endProps); if (renderState != _renderStates.end()) {
QVariant startDim = startProps.toMap()["dimensions"]; updateRenderStateOverlay(renderState->second->getStartID(), startProps);
if (startDim.isValid()) { updateRenderStateOverlay(renderState->second->getEndID(), endProps);
_renderStates[state]->setStartDim(vec3FromVariant(startDim)); QVariant startDim = startProps.toMap()["dimensions"];
} if (startDim.isValid()) {
QVariant endDim = endProps.toMap()["dimensions"]; renderState->second->setStartDim(vec3FromVariant(startDim));
if (endDim.isValid()) { }
_renderStates[state]->setEndDim(vec3FromVariant(endDim)); QVariant endDim = endProps.toMap()["dimensions"];
} if (endDim.isValid()) {
QVariant rotation = endProps.toMap()["rotation"]; renderState->second->setEndDim(vec3FromVariant(endDim));
if (rotation.isValid()) { }
_renderStates[state]->setEndRot(quatFromVariant(rotation)); QVariant rotation = endProps.toMap()["rotation"];
} if (rotation.isValid()) {
renderState->second->setEndRot(quatFromVariant(rotation));
}
editRenderStatePath(state, pathProps); editRenderStatePath(state, pathProps);
}
}); });
} }
@ -271,6 +278,7 @@ void StartEndRenderState::disable() {
endProps.insert("ignoreRayIntersection", true); endProps.insert("ignoreRayIntersection", true);
qApp->getOverlays().editOverlay(getEndID(), endProps); qApp->getOverlays().editOverlay(getEndID(), endProps);
} }
_enabled = false;
} }
void StartEndRenderState::update(const glm::vec3& origin, const glm::vec3& end, const glm::vec3& surfaceNormal, bool scaleWithAvatar, bool distanceScaleEnd, bool centerEndY, void StartEndRenderState::update(const glm::vec3& origin, const glm::vec3& end, const glm::vec3& surfaceNormal, bool scaleWithAvatar, bool distanceScaleEnd, bool centerEndY,
@ -337,6 +345,7 @@ void StartEndRenderState::update(const glm::vec3& origin, const glm::vec3& end,
endProps.insert("ignoreRayIntersection", doesEndIgnoreRays()); endProps.insert("ignoreRayIntersection", doesEndIgnoreRays());
qApp->getOverlays().editOverlay(getEndID(), endProps); qApp->getOverlays().editOverlay(getEndID(), endProps);
} }
_enabled = true;
} }
glm::vec2 PathPointer::findPos2D(const PickedObject& pickedObject, const glm::vec3& origin) { glm::vec2 PathPointer::findPos2D(const PickedObject& pickedObject, const glm::vec3& origin) {

View file

@ -47,6 +47,8 @@ public:
virtual void update(const glm::vec3& origin, const glm::vec3& end, const glm::vec3& surfaceNormal, bool scaleWithAvatar, bool distanceScaleEnd, bool centerEndY, virtual void update(const glm::vec3& origin, const glm::vec3& end, const glm::vec3& surfaceNormal, bool scaleWithAvatar, bool distanceScaleEnd, bool centerEndY,
bool faceAvatar, bool followNormal, float followNormalStrength, float distance, const PickResultPointer& pickResult); bool faceAvatar, bool followNormal, float followNormalStrength, float distance, const PickResultPointer& pickResult);
bool isEnabled() const { return _enabled; }
protected: protected:
OverlayID _startID; OverlayID _startID;
OverlayID _endID; OverlayID _endID;
@ -59,6 +61,8 @@ protected:
glm::quat _avgEndRot; glm::quat _avgEndRot;
bool _avgEndRotInitialized { false }; bool _avgEndRotInitialized { false };
bool _enabled { true };
}; };
typedef std::unordered_map<std::string, std::shared_ptr<StartEndRenderState>> RenderStateMap; typedef std::unordered_map<std::string, std::shared_ptr<StartEndRenderState>> RenderStateMap;

View file

@ -64,7 +64,9 @@ void StylusPointer::updateVisuals(const PickResultPointer& pickResult) {
return; return;
} }
} }
hide(); if (_showing) {
hide();
}
} }
void StylusPointer::show(const StylusTip& tip) { void StylusPointer::show(const StylusTip& tip) {
@ -80,6 +82,7 @@ void StylusPointer::show(const StylusTip& tip) {
props["visible"] = true; props["visible"] = true;
qApp->getOverlays().editOverlay(_stylusOverlay, props); qApp->getOverlays().editOverlay(_stylusOverlay, props);
} }
_showing = true;
} }
void StylusPointer::hide() { void StylusPointer::hide() {
@ -88,6 +91,7 @@ void StylusPointer::hide() {
props.insert("visible", false); props.insert("visible", false);
qApp->getOverlays().editOverlay(_stylusOverlay, props); qApp->getOverlays().editOverlay(_stylusOverlay, props);
} }
_showing = false;
} }
bool StylusPointer::shouldHover(const PickResultPointer& pickResult) { bool StylusPointer::shouldHover(const PickResultPointer& pickResult) {

View file

@ -76,6 +76,8 @@ private:
static glm::vec3 findIntersection(const PickedObject& pickedObject, const glm::vec3& origin, const glm::vec3& direction); static glm::vec3 findIntersection(const PickedObject& pickedObject, const glm::vec3& origin, const glm::vec3& direction);
static glm::vec2 findPos2D(const PickedObject& pickedObject, const glm::vec3& origin); static glm::vec2 findPos2D(const PickedObject& pickedObject, const glm::vec3& origin);
bool _showing { true };
}; };
#endif // hifi_StylusPointer_h #endif // hifi_StylusPointer_h