mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 18:18:02 +02:00
Do not const cast CollisionRegion
This commit is contained in:
parent
b7d5804edb
commit
cf34a2cffd
3 changed files with 22 additions and 24 deletions
|
@ -13,7 +13,6 @@
|
||||||
#include <glm/gtx/transform.hpp>
|
#include <glm/gtx/transform.hpp>
|
||||||
|
|
||||||
#include "ScriptEngineLogging.h"
|
#include "ScriptEngineLogging.h"
|
||||||
#include "model-networking/ModelCache.h"
|
|
||||||
#include "UUIDHasher.h"
|
#include "UUIDHasher.h"
|
||||||
|
|
||||||
QVariantMap CollisionPickResult::toVariantMap() const {
|
QVariantMap CollisionPickResult::toVariantMap() const {
|
||||||
|
@ -70,14 +69,10 @@ QVariantMap CollisionPickResult::toVariantMap() const {
|
||||||
return variantMap;
|
return variantMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CollisionPick::isShapeInfoReady(CollisionRegion& pick) {
|
bool CollisionPick::isShapeInfoReady() {
|
||||||
if (pick.shouldComputeShapeInfo()) {
|
if (_mathPick.shouldComputeShapeInfo()) {
|
||||||
if (!_cachedResource || _cachedResource->getURL() != pick.modelURL) {
|
if (_cachedResource && _cachedResource->isLoaded()) {
|
||||||
_cachedResource = DependencyManager::get<ModelCache>()->getCollisionGeometryResource(pick.modelURL);
|
computeShapeInfo(_mathPick, *_mathPick.shapeInfo, _cachedResource);
|
||||||
}
|
|
||||||
|
|
||||||
if (_cachedResource->isLoaded()) {
|
|
||||||
computeShapeInfo(pick, pick.shapeInfo, _cachedResource);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -321,12 +316,12 @@ CollisionRegion CollisionPick::getMathematicalPick() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
PickResultPointer CollisionPick::getEntityIntersection(const CollisionRegion& pick) {
|
PickResultPointer CollisionPick::getEntityIntersection(const CollisionRegion& pick) {
|
||||||
if (!isShapeInfoReady(*const_cast<CollisionRegion*>(&pick))) {
|
if (!isShapeInfoReady()) {
|
||||||
// Cannot compute result
|
// Cannot compute result
|
||||||
return std::make_shared<CollisionPickResult>();
|
return std::make_shared<CollisionPickResult>();
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& entityIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_ENTITY, pick.shapeInfo, pick.transform);
|
const auto& entityIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_ENTITY, *pick.shapeInfo, pick.transform);
|
||||||
return std::make_shared<CollisionPickResult>(pick, entityIntersections, std::vector<ContactTestResult>());
|
return std::make_shared<CollisionPickResult>(pick, entityIntersections, std::vector<ContactTestResult>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,12 +330,12 @@ PickResultPointer CollisionPick::getOverlayIntersection(const CollisionRegion& p
|
||||||
}
|
}
|
||||||
|
|
||||||
PickResultPointer CollisionPick::getAvatarIntersection(const CollisionRegion& pick) {
|
PickResultPointer CollisionPick::getAvatarIntersection(const CollisionRegion& pick) {
|
||||||
if (!isShapeInfoReady(*const_cast<CollisionRegion*>(&pick))) {
|
if (!isShapeInfoReady()) {
|
||||||
// Cannot compute result
|
// Cannot compute result
|
||||||
return std::make_shared<CollisionPickResult>();
|
return std::make_shared<CollisionPickResult>();
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& avatarIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_AVATAR, pick.shapeInfo, pick.transform);
|
const auto& avatarIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_AVATAR, *pick.shapeInfo, pick.transform);
|
||||||
return std::make_shared<CollisionPickResult>(pick, std::vector<ContactTestResult>(), avatarIntersections);
|
return std::make_shared<CollisionPickResult>(pick, std::vector<ContactTestResult>(), avatarIntersections);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,9 @@ public:
|
||||||
Pick(filter, maxDistance, enabled),
|
Pick(filter, maxDistance, enabled),
|
||||||
_mathPick(collisionRegion),
|
_mathPick(collisionRegion),
|
||||||
_physicsEngine(physicsEngine) {
|
_physicsEngine(physicsEngine) {
|
||||||
|
if (collisionRegion.shouldComputeShapeInfo()) {
|
||||||
|
_cachedResource = DependencyManager::get<ModelCache>()->getCollisionGeometryResource(collisionRegion.modelURL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CollisionRegion getMathematicalPick() const override;
|
CollisionRegion getMathematicalPick() const override;
|
||||||
|
@ -73,7 +76,7 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Returns true if pick.shapeInfo is valid. Otherwise, attempts to get the shapeInfo ready for use.
|
// Returns true if pick.shapeInfo is valid. Otherwise, attempts to get the shapeInfo ready for use.
|
||||||
bool isShapeInfoReady(CollisionRegion& pick);
|
bool isShapeInfoReady();
|
||||||
void computeShapeInfo(CollisionRegion& pick, ShapeInfo& shapeInfo, QSharedPointer<GeometryResource> resource);
|
void computeShapeInfo(CollisionRegion& pick, ShapeInfo& shapeInfo, QSharedPointer<GeometryResource> resource);
|
||||||
|
|
||||||
CollisionRegion _mathPick;
|
CollisionRegion _mathPick;
|
||||||
|
|
|
@ -243,7 +243,7 @@ public:
|
||||||
transform.setScale(vec3FromVariant(shape["dimensions"]));
|
transform.setScale(vec3FromVariant(shape["dimensions"]));
|
||||||
}
|
}
|
||||||
|
|
||||||
shapeInfo.setParams(shapeType, transform.getScale() / 2.0f, modelURL.toString());
|
shapeInfo->setParams(shapeType, transform.getScale() / 2.0f, modelURL.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,7 +259,7 @@ public:
|
||||||
QVariantMap collisionRegion;
|
QVariantMap collisionRegion;
|
||||||
|
|
||||||
QVariantMap shape;
|
QVariantMap shape;
|
||||||
shape["shapeType"] = ShapeInfo::getNameForShapeType(shapeInfo.getType());
|
shape["shapeType"] = ShapeInfo::getNameForShapeType(shapeInfo->getType());
|
||||||
shape["modelURL"] = modelURL.toString();
|
shape["modelURL"] = modelURL.toString();
|
||||||
shape["dimensions"] = vec3toVariant(transform.getScale());
|
shape["dimensions"] = vec3toVariant(transform.getScale());
|
||||||
|
|
||||||
|
@ -274,33 +274,33 @@ public:
|
||||||
operator bool() const override {
|
operator bool() const override {
|
||||||
return !(glm::any(glm::isnan(transform.getTranslation())) ||
|
return !(glm::any(glm::isnan(transform.getTranslation())) ||
|
||||||
glm::any(glm::isnan(transform.getRotation())) ||
|
glm::any(glm::isnan(transform.getRotation())) ||
|
||||||
shapeInfo.getType() == SHAPE_TYPE_NONE);
|
shapeInfo->getType() == SHAPE_TYPE_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const CollisionRegion& other) const {
|
bool operator==(const CollisionRegion& other) const {
|
||||||
return glm::all(glm::equal(transform.getTranslation(), other.transform.getTranslation())) &&
|
return glm::all(glm::equal(transform.getTranslation(), other.transform.getTranslation())) &&
|
||||||
glm::all(glm::equal(transform.getRotation(), other.transform.getRotation())) &&
|
glm::all(glm::equal(transform.getRotation(), other.transform.getRotation())) &&
|
||||||
glm::all(glm::equal(transform.getScale(), other.transform.getScale())) &&
|
glm::all(glm::equal(transform.getScale(), other.transform.getScale())) &&
|
||||||
shapeInfo.getType() == other.shapeInfo.getType() &&
|
shapeInfo->getType() == other.shapeInfo->getType() &&
|
||||||
modelURL == other.modelURL;
|
modelURL == other.modelURL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool shouldComputeShapeInfo() const {
|
bool shouldComputeShapeInfo() const {
|
||||||
if (!(shapeInfo.getType() == SHAPE_TYPE_HULL ||
|
if (!(shapeInfo->getType() == SHAPE_TYPE_HULL ||
|
||||||
(shapeInfo.getType() >= SHAPE_TYPE_COMPOUND &&
|
(shapeInfo->getType() >= SHAPE_TYPE_COMPOUND &&
|
||||||
shapeInfo.getType() <= SHAPE_TYPE_STATIC_MESH)
|
shapeInfo->getType() <= SHAPE_TYPE_STATIC_MESH)
|
||||||
)) {
|
)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return !shapeInfo.getPointCollection().size();
|
return !shapeInfo->getPointCollection().size();
|
||||||
}
|
}
|
||||||
|
|
||||||
// We can't load the model here because it would create a circular dependency, so we delegate that responsibility to the owning CollisionPick
|
// We can't load the model here because it would create a circular dependency, so we delegate that responsibility to the owning CollisionPick
|
||||||
QUrl modelURL;
|
QUrl modelURL;
|
||||||
|
|
||||||
// We can't compute the shapeInfo here without loading the model first, so we delegate that responsibility to the owning CollisionPick
|
// We can't compute the shapeInfo here without loading the model first, so we delegate that responsibility to the owning CollisionPick
|
||||||
ShapeInfo shapeInfo;
|
std::shared_ptr<ShapeInfo> shapeInfo = std::make_shared<ShapeInfo>();
|
||||||
Transform transform;
|
Transform transform;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -371,7 +371,7 @@ namespace std {
|
||||||
struct hash<CollisionRegion> {
|
struct hash<CollisionRegion> {
|
||||||
size_t operator()(const CollisionRegion& a) const {
|
size_t operator()(const CollisionRegion& a) const {
|
||||||
size_t result = 0;
|
size_t result = 0;
|
||||||
hash_combine(result, a.transform, (int)a.shapeInfo.getType(), qHash(a.modelURL));
|
hash_combine(result, a.transform, (int)a.shapeInfo->getType(), qHash(a.modelURL));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue