mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-08 14:18:43 +02:00
possibly fix most annoying crash
This commit is contained in:
parent
684001a756
commit
3645bf04b6
8 changed files with 67 additions and 42 deletions
|
@ -476,19 +476,25 @@ AvatarSharedPointer AvatarManager::getAvatarBySessionID(const QUuid& sessionID)
|
||||||
RayToAvatarIntersectionResult AvatarManager::findRayIntersection(const PickRay& ray,
|
RayToAvatarIntersectionResult AvatarManager::findRayIntersection(const PickRay& ray,
|
||||||
const QScriptValue& avatarIdsToInclude,
|
const QScriptValue& avatarIdsToInclude,
|
||||||
const QScriptValue& avatarIdsToDiscard) {
|
const QScriptValue& avatarIdsToDiscard) {
|
||||||
|
QVector<EntityItemID> avatarsToInclude = qVectorEntityItemIDFromScriptValue(avatarIdsToInclude);
|
||||||
|
QVector<EntityItemID> avatarsToDiscard = qVectorEntityItemIDFromScriptValue(avatarIdsToDiscard);
|
||||||
|
|
||||||
|
return findRayIntersection(ray, avatarsToInclude, avatarsToDiscard);
|
||||||
|
}
|
||||||
|
|
||||||
|
RayToAvatarIntersectionResult AvatarManager::findRayIntersection(const PickRay& ray,
|
||||||
|
const QVector<EntityItemID>& avatarsToInclude,
|
||||||
|
const QVector<EntityItemID>& avatarsToDiscard) {
|
||||||
RayToAvatarIntersectionResult result;
|
RayToAvatarIntersectionResult result;
|
||||||
if (QThread::currentThread() != thread()) {
|
if (QThread::currentThread() != thread()) {
|
||||||
BLOCKING_INVOKE_METHOD(const_cast<AvatarManager*>(this), "findRayIntersection",
|
BLOCKING_INVOKE_METHOD(const_cast<AvatarManager*>(this), "findRayIntersection",
|
||||||
Q_RETURN_ARG(RayToAvatarIntersectionResult, result),
|
Q_RETURN_ARG(RayToAvatarIntersectionResult, result),
|
||||||
Q_ARG(const PickRay&, ray),
|
Q_ARG(const PickRay&, ray),
|
||||||
Q_ARG(const QScriptValue&, avatarIdsToInclude),
|
Q_ARG(const QVector<EntityItemID>&, avatarsToInclude),
|
||||||
Q_ARG(const QScriptValue&, avatarIdsToDiscard));
|
Q_ARG(const QVector<EntityItemID>&, avatarsToDiscard));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<EntityItemID> avatarsToInclude = qVectorEntityItemIDFromScriptValue(avatarIdsToInclude);
|
|
||||||
QVector<EntityItemID> avatarsToDiscard = qVectorEntityItemIDFromScriptValue(avatarIdsToDiscard);
|
|
||||||
|
|
||||||
glm::vec3 normDirection = glm::normalize(ray.direction);
|
glm::vec3 normDirection = glm::normalize(ray.direction);
|
||||||
|
|
||||||
for (auto avatarData : _avatarHash) {
|
for (auto avatarData : _avatarHash) {
|
||||||
|
|
|
@ -73,6 +73,9 @@ public:
|
||||||
Q_INVOKABLE RayToAvatarIntersectionResult findRayIntersection(const PickRay& ray,
|
Q_INVOKABLE RayToAvatarIntersectionResult findRayIntersection(const PickRay& ray,
|
||||||
const QScriptValue& avatarIdsToInclude = QScriptValue(),
|
const QScriptValue& avatarIdsToInclude = QScriptValue(),
|
||||||
const QScriptValue& avatarIdsToDiscard = QScriptValue());
|
const QScriptValue& avatarIdsToDiscard = QScriptValue());
|
||||||
|
Q_INVOKABLE RayToAvatarIntersectionResult findRayIntersection(const PickRay& ray,
|
||||||
|
const QVector<EntityItemID>& avatarsToInclude,
|
||||||
|
const QVector<EntityItemID>& avatarsToDiscard);
|
||||||
|
|
||||||
// TODO: remove this HACK once we settle on optimal default sort coefficients
|
// TODO: remove this HACK once we settle on optimal default sort coefficients
|
||||||
Q_INVOKABLE float getAvatarSortCoefficient(const QString& name);
|
Q_INVOKABLE float getAvatarSortCoefficient(const QString& name);
|
||||||
|
|
|
@ -197,13 +197,13 @@ RenderState::RenderState(const OverlayID& startID, const OverlayID& pathID, cons
|
||||||
_startID(startID), _pathID(pathID), _endID(endID)
|
_startID(startID), _pathID(pathID), _endID(endID)
|
||||||
{
|
{
|
||||||
if (!_startID.isNull()) {
|
if (!_startID.isNull()) {
|
||||||
_startIgnoreRays = qApp->getOverlays().getOverlay(_startID)->getProperty("ignoreRayIntersection").toBool();
|
_startIgnoreRays = qApp->getOverlays().getProperty(_startID, "ignoreRayIntersection").value.toBool();
|
||||||
}
|
}
|
||||||
if (!_pathID.isNull()) {
|
if (!_pathID.isNull()) {
|
||||||
_pathIgnoreRays = qApp->getOverlays().getOverlay(_pathID)->getProperty("ignoreRayIntersection").toBool();
|
_pathIgnoreRays = qApp->getOverlays().getProperty(_pathID, "ignoreRayIntersection").value.toBool();
|
||||||
}
|
}
|
||||||
if (!_endID.isNull()) {
|
if (!_endID.isNull()) {
|
||||||
_endIgnoreRays = qApp->getOverlays().getOverlay(_endID)->getProperty("ignoreRayIntersection").toBool();
|
_endIgnoreRays = qApp->getOverlays().getProperty(_endID, "ignoreRayIntersection").value.toBool();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,9 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "RegisteredMetaTypes.h"
|
#include "RegisteredMetaTypes.h"
|
||||||
|
|
||||||
|
#include "EntityItemID.h"
|
||||||
|
#include "ui/overlays/Overlay.h"
|
||||||
|
|
||||||
class RayPick {
|
class RayPick {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -31,18 +34,18 @@ public:
|
||||||
|
|
||||||
void setRayPickResult(const RayPickResult& rayPickResult) { _prevResult = rayPickResult; }
|
void setRayPickResult(const RayPickResult& rayPickResult) { _prevResult = rayPickResult; }
|
||||||
|
|
||||||
const QScriptValue& getIgnoreEntites() { return _ignoreEntities; }
|
const QVector<EntityItemID>& getIgnoreEntites() { return _ignoreEntities; }
|
||||||
const QScriptValue& getIncludeEntites() { return _includeEntities; }
|
const QVector<EntityItemID>& getIncludeEntites() { return _includeEntities; }
|
||||||
const QScriptValue& getIgnoreOverlays() { return _ignoreOverlays; }
|
const QVector<OverlayID>& getIgnoreOverlays() { return _ignoreOverlays; }
|
||||||
const QScriptValue& getIncludeOverlays() { return _includeOverlays; }
|
const QVector<OverlayID>& getIncludeOverlays() { return _includeOverlays; }
|
||||||
const QScriptValue& getIgnoreAvatars() { return _ignoreAvatars; }
|
const QVector<EntityItemID>& getIgnoreAvatars() { return _ignoreAvatars; }
|
||||||
const QScriptValue& getIncludeAvatars() { return _includeAvatars; }
|
const QVector<EntityItemID>& getIncludeAvatars() { return _includeAvatars; }
|
||||||
void setIgnoreEntities(const QScriptValue& ignoreEntities) { _ignoreEntities = ignoreEntities; }
|
void setIgnoreEntities(const QScriptValue& ignoreEntities) { _ignoreEntities = qVectorEntityItemIDFromScriptValue(ignoreEntities); }
|
||||||
void setIncludeEntities(const QScriptValue& includeEntities) { _includeEntities = includeEntities; }
|
void setIncludeEntities(const QScriptValue& includeEntities) { _includeEntities = qVectorEntityItemIDFromScriptValue(includeEntities); }
|
||||||
void setIgnoreOverlays(const QScriptValue& ignoreOverlays) { _ignoreOverlays = ignoreOverlays; }
|
void setIgnoreOverlays(const QScriptValue& ignoreOverlays) { _ignoreOverlays = qVectorOverlayIDFromScriptValue(ignoreOverlays); }
|
||||||
void setIncludeOverlays(const QScriptValue& includeOverlays) { _includeOverlays = includeOverlays; }
|
void setIncludeOverlays(const QScriptValue& includeOverlays) { _includeOverlays = qVectorOverlayIDFromScriptValue(includeOverlays); }
|
||||||
void setIgnoreAvatars(const QScriptValue& ignoreAvatars) { _ignoreAvatars = ignoreAvatars; }
|
void setIgnoreAvatars(const QScriptValue& ignoreAvatars) { _ignoreAvatars = qVectorEntityItemIDFromScriptValue(ignoreAvatars); }
|
||||||
void setIncludeAvatars(const QScriptValue& includeAvatars) { _includeAvatars = includeAvatars; }
|
void setIncludeAvatars(const QScriptValue& includeAvatars) { _includeAvatars = qVectorEntityItemIDFromScriptValue(includeAvatars); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint16_t _filter;
|
uint16_t _filter;
|
||||||
|
@ -50,12 +53,12 @@ private:
|
||||||
bool _enabled;
|
bool _enabled;
|
||||||
RayPickResult _prevResult;
|
RayPickResult _prevResult;
|
||||||
|
|
||||||
QScriptValue _ignoreEntities;
|
QVector<EntityItemID> _ignoreEntities;
|
||||||
QScriptValue _includeEntities;
|
QVector<EntityItemID> _includeEntities;
|
||||||
QScriptValue _ignoreOverlays;
|
QVector<OverlayID> _ignoreOverlays;
|
||||||
QScriptValue _includeOverlays;
|
QVector<OverlayID> _includeOverlays;
|
||||||
QScriptValue _ignoreAvatars;
|
QVector<EntityItemID> _ignoreAvatars;
|
||||||
QScriptValue _includeAvatars;
|
QVector<EntityItemID> _includeAvatars;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_RayPick_h
|
#endif // hifi_RayPick_h
|
||||||
|
|
|
@ -534,15 +534,15 @@ RayToOverlayIntersectionResult Overlays::findRayIntersection(const PickRay& ray,
|
||||||
const QVector<OverlayID> overlaysToInclude = qVectorOverlayIDFromScriptValue(overlayIDsToInclude);
|
const QVector<OverlayID> overlaysToInclude = qVectorOverlayIDFromScriptValue(overlayIDsToInclude);
|
||||||
const QVector<OverlayID> overlaysToDiscard = qVectorOverlayIDFromScriptValue(overlayIDsToDiscard);
|
const QVector<OverlayID> overlaysToDiscard = qVectorOverlayIDFromScriptValue(overlayIDsToDiscard);
|
||||||
|
|
||||||
return findRayIntersectionInternal(ray, precisionPicking,
|
return findRayIntersection(ray, precisionPicking,
|
||||||
overlaysToInclude, overlaysToDiscard, visibleOnly, collidableOnly);
|
overlaysToInclude, overlaysToDiscard, visibleOnly, collidableOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RayToOverlayIntersectionResult Overlays::findRayIntersectionInternal(const PickRay& ray, bool precisionPicking,
|
RayToOverlayIntersectionResult Overlays::findRayIntersection(const PickRay& ray, bool precisionPicking,
|
||||||
const QVector<OverlayID>& overlaysToInclude,
|
const QVector<OverlayID>& overlaysToInclude,
|
||||||
const QVector<OverlayID>& overlaysToDiscard,
|
const QVector<OverlayID>& overlaysToDiscard,
|
||||||
bool visibleOnly, bool collidableOnly) {
|
bool visibleOnly, bool collidableOnly) {
|
||||||
float bestDistance = std::numeric_limits<float>::max();
|
float bestDistance = std::numeric_limits<float>::max();
|
||||||
bool bestIsFront = false;
|
bool bestIsFront = false;
|
||||||
|
|
||||||
|
@ -908,21 +908,21 @@ RayToOverlayIntersectionResult Overlays::findRayIntersectionForMouseEvent(PickRa
|
||||||
|
|
||||||
// first priority is tablet screen
|
// first priority is tablet screen
|
||||||
overlaysToInclude << qApp->getTabletScreenID();
|
overlaysToInclude << qApp->getTabletScreenID();
|
||||||
rayPickResult = findRayIntersectionInternal(ray, true, overlaysToInclude, overlaysToDiscard);
|
rayPickResult = findRayIntersection(ray, true, overlaysToInclude, overlaysToDiscard);
|
||||||
if (rayPickResult.intersects) {
|
if (rayPickResult.intersects) {
|
||||||
return rayPickResult;
|
return rayPickResult;
|
||||||
}
|
}
|
||||||
// then tablet home button
|
// then tablet home button
|
||||||
overlaysToInclude.clear();
|
overlaysToInclude.clear();
|
||||||
overlaysToInclude << qApp->getTabletHomeButtonID();
|
overlaysToInclude << qApp->getTabletHomeButtonID();
|
||||||
rayPickResult = findRayIntersectionInternal(ray, true, overlaysToInclude, overlaysToDiscard);
|
rayPickResult = findRayIntersection(ray, true, overlaysToInclude, overlaysToDiscard);
|
||||||
if (rayPickResult.intersects) {
|
if (rayPickResult.intersects) {
|
||||||
return rayPickResult;
|
return rayPickResult;
|
||||||
}
|
}
|
||||||
// then tablet frame
|
// then tablet frame
|
||||||
overlaysToInclude.clear();
|
overlaysToInclude.clear();
|
||||||
overlaysToInclude << OverlayID(qApp->getTabletFrameID());
|
overlaysToInclude << OverlayID(qApp->getTabletFrameID());
|
||||||
rayPickResult = findRayIntersectionInternal(ray, true, overlaysToInclude, overlaysToDiscard);
|
rayPickResult = findRayIntersection(ray, true, overlaysToInclude, overlaysToDiscard);
|
||||||
if (rayPickResult.intersects) {
|
if (rayPickResult.intersects) {
|
||||||
return rayPickResult;
|
return rayPickResult;
|
||||||
}
|
}
|
||||||
|
|
|
@ -216,6 +216,12 @@ public slots:
|
||||||
bool visibleOnly = false,
|
bool visibleOnly = false,
|
||||||
bool collidableOnly = false);
|
bool collidableOnly = false);
|
||||||
|
|
||||||
|
// Same as above but with QVectors
|
||||||
|
RayToOverlayIntersectionResult findRayIntersection(const PickRay& ray, bool precisionPicking,
|
||||||
|
const QVector<OverlayID>& overlaysToInclude,
|
||||||
|
const QVector<OverlayID>& overlaysToDiscard,
|
||||||
|
bool visibleOnly = false, bool collidableOnly = false);
|
||||||
|
|
||||||
/**jsdoc
|
/**jsdoc
|
||||||
* Return a list of 3d overlays with bounding boxes that touch the given sphere
|
* Return a list of 3d overlays with bounding boxes that touch the given sphere
|
||||||
*
|
*
|
||||||
|
@ -350,10 +356,6 @@ private:
|
||||||
OverlayID _currentClickingOnOverlayID { UNKNOWN_OVERLAY_ID };
|
OverlayID _currentClickingOnOverlayID { UNKNOWN_OVERLAY_ID };
|
||||||
OverlayID _currentHoverOverOverlayID { UNKNOWN_OVERLAY_ID };
|
OverlayID _currentHoverOverOverlayID { UNKNOWN_OVERLAY_ID };
|
||||||
|
|
||||||
Q_INVOKABLE RayToOverlayIntersectionResult findRayIntersectionInternal(const PickRay& ray, bool precisionPicking,
|
|
||||||
const QVector<OverlayID>& overlaysToInclude,
|
|
||||||
const QVector<OverlayID>& overlaysToDiscard,
|
|
||||||
bool visibleOnly = false, bool collidableOnly = false);
|
|
||||||
RayToOverlayIntersectionResult findRayIntersectionForMouseEvent(PickRay ray);
|
RayToOverlayIntersectionResult findRayIntersectionForMouseEvent(PickRay ray);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -679,11 +679,17 @@ QVector<QUuid> EntityScriptingInterface::findEntitiesByType(const QString entity
|
||||||
|
|
||||||
RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersection(const PickRay& ray, bool precisionPicking,
|
RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersection(const PickRay& ray, bool precisionPicking,
|
||||||
const QScriptValue& entityIdsToInclude, const QScriptValue& entityIdsToDiscard, bool visibleOnly, bool collidableOnly) {
|
const QScriptValue& entityIdsToInclude, const QScriptValue& entityIdsToDiscard, bool visibleOnly, bool collidableOnly) {
|
||||||
PROFILE_RANGE(script_entities, __FUNCTION__);
|
|
||||||
|
|
||||||
QVector<EntityItemID> entitiesToInclude = qVectorEntityItemIDFromScriptValue(entityIdsToInclude);
|
QVector<EntityItemID> entitiesToInclude = qVectorEntityItemIDFromScriptValue(entityIdsToInclude);
|
||||||
QVector<EntityItemID> entitiesToDiscard = qVectorEntityItemIDFromScriptValue(entityIdsToDiscard);
|
QVector<EntityItemID> entitiesToDiscard = qVectorEntityItemIDFromScriptValue(entityIdsToDiscard);
|
||||||
return findRayIntersectionWorker(ray, Octree::Lock, precisionPicking, entitiesToInclude, entitiesToDiscard, visibleOnly, collidableOnly);
|
|
||||||
|
return findRayIntersection(ray, precisionPicking, entitiesToInclude, entitiesToDiscard, visibleOnly, collidableOnly);
|
||||||
|
}
|
||||||
|
|
||||||
|
RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersection(const PickRay& ray, bool precisionPicking,
|
||||||
|
const QVector<EntityItemID>& entityIdsToInclude, const QVector<EntityItemID>& entityIdsToDiscard, bool visibleOnly, bool collidableOnly) {
|
||||||
|
PROFILE_RANGE(script_entities, __FUNCTION__);
|
||||||
|
|
||||||
|
return findRayIntersectionWorker(ray, Octree::Lock, precisionPicking, entityIdsToInclude, entityIdsToDiscard, visibleOnly, collidableOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME - we should remove this API and encourage all users to use findRayIntersection() instead. We've changed
|
// FIXME - we should remove this API and encourage all users to use findRayIntersection() instead. We've changed
|
||||||
|
|
|
@ -229,6 +229,11 @@ public slots:
|
||||||
const QScriptValue& entityIdsToInclude = QScriptValue(), const QScriptValue& entityIdsToDiscard = QScriptValue(),
|
const QScriptValue& entityIdsToInclude = QScriptValue(), const QScriptValue& entityIdsToDiscard = QScriptValue(),
|
||||||
bool visibleOnly = false, bool collidableOnly = false);
|
bool visibleOnly = false, bool collidableOnly = false);
|
||||||
|
|
||||||
|
/// Same as above but with QVectors
|
||||||
|
Q_INVOKABLE RayToEntityIntersectionResult findRayIntersection(const PickRay& ray, bool precisionPicking,
|
||||||
|
const QVector<EntityItemID>& entityIdsToInclude, const QVector<EntityItemID>& entityIdsToDiscard,
|
||||||
|
bool visibleOnly, bool collidableOnly);
|
||||||
|
|
||||||
/// If the scripting context has visible entities, this will determine a ray intersection, and will block in
|
/// If the scripting context has visible entities, this will determine a ray intersection, and will block in
|
||||||
/// order to return an accurate result
|
/// order to return an accurate result
|
||||||
Q_INVOKABLE RayToEntityIntersectionResult findRayIntersectionBlocking(const PickRay& ray, bool precisionPicking = false, const QScriptValue& entityIdsToInclude = QScriptValue(), const QScriptValue& entityIdsToDiscard = QScriptValue());
|
Q_INVOKABLE RayToEntityIntersectionResult findRayIntersectionBlocking(const PickRay& ray, bool precisionPicking = false, const QScriptValue& entityIdsToInclude = QScriptValue(), const QScriptValue& entityIdsToDiscard = QScriptValue());
|
||||||
|
|
Loading…
Reference in a new issue