mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-23 10:34:50 +02:00
improve pointer performance
This commit is contained in:
parent
47ce8be526
commit
cda8b82ead
4 changed files with 54 additions and 35 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue