mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 08:21:24 +02:00
3d-line-overlays can now have an endParentID and endParentJointIndex
This commit is contained in:
parent
7c4869eb73
commit
7f6b803652
3 changed files with 85 additions and 33 deletions
|
@ -30,6 +30,8 @@ Line3DOverlay::Line3DOverlay(const Line3DOverlay* line3DOverlay) :
|
||||||
setLocalTransform(line3DOverlay->getLocalTransform());
|
setLocalTransform(line3DOverlay->getLocalTransform());
|
||||||
_direction = line3DOverlay->getDirection();
|
_direction = line3DOverlay->getDirection();
|
||||||
_length = line3DOverlay->getLength();
|
_length = line3DOverlay->getLength();
|
||||||
|
_endParentID = line3DOverlay->getEndParentID();
|
||||||
|
_endParentJointIndex = line3DOverlay->getEndJointIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
Line3DOverlay::~Line3DOverlay() {
|
Line3DOverlay::~Line3DOverlay() {
|
||||||
|
@ -45,9 +47,18 @@ glm::vec3 Line3DOverlay::getStart() const {
|
||||||
|
|
||||||
glm::vec3 Line3DOverlay::getEnd() const {
|
glm::vec3 Line3DOverlay::getEnd() const {
|
||||||
bool success;
|
bool success;
|
||||||
|
glm::vec3 localEnd;
|
||||||
|
glm::vec3 worldEnd;
|
||||||
|
|
||||||
glm::vec3 localEnd = getLocalEnd();
|
if (_endParentID != QUuid()) {
|
||||||
glm::vec3 worldEnd = localToWorld(localEnd, getParentID(), getParentJointIndex(), success);
|
glm::vec3 localOffset = _direction * _length;
|
||||||
|
bool success;
|
||||||
|
worldEnd = localToWorld(localOffset, _endParentID, _endParentJointIndex, success);
|
||||||
|
return worldEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
localEnd = getLocalEnd();
|
||||||
|
worldEnd = localToWorld(localEnd, getParentID(), getParentJointIndex(), success);
|
||||||
if (!success) {
|
if (!success) {
|
||||||
qDebug() << "Line3DOverlay::getEnd failed";
|
qDebug() << "Line3DOverlay::getEnd failed";
|
||||||
}
|
}
|
||||||
|
@ -60,15 +71,33 @@ void Line3DOverlay::setStart(const glm::vec3& start) {
|
||||||
|
|
||||||
void Line3DOverlay::setEnd(const glm::vec3& end) {
|
void Line3DOverlay::setEnd(const glm::vec3& end) {
|
||||||
bool success;
|
bool success;
|
||||||
|
glm::vec3 localStart;
|
||||||
|
glm::vec3 localEnd;
|
||||||
|
glm::vec3 offset;
|
||||||
|
|
||||||
glm::vec3 localStart = getLocalStart();
|
if (_endParentID != QUuid()) {
|
||||||
glm::vec3 localEnd = worldToLocal(end, getParentID(), getParentJointIndex(), success);
|
offset = worldToLocal(end, _endParentID, _endParentJointIndex, success);
|
||||||
|
} else {
|
||||||
|
localStart = getLocalStart();
|
||||||
|
localEnd = worldToLocal(end, getParentID(), getParentJointIndex(), success);
|
||||||
|
offset = localEnd - localStart;
|
||||||
|
}
|
||||||
if (!success) {
|
if (!success) {
|
||||||
qDebug() << "Line3DOverlay::setEnd failed";
|
qDebug() << "Line3DOverlay::setEnd failed";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
_direction = glm::normalize(offset);
|
||||||
|
_length = glm::length(offset);
|
||||||
|
}
|
||||||
|
|
||||||
glm::vec3 offset = localEnd - localStart;
|
void Line3DOverlay::setLocalEnd(const glm::vec3& localEnd) {
|
||||||
|
glm::vec3 offset;
|
||||||
|
if (_endParentID != QUuid()) {
|
||||||
|
offset = localEnd;
|
||||||
|
} else {
|
||||||
|
glm::vec3 localStart = getLocalStart();
|
||||||
|
offset = localEnd - localStart;
|
||||||
|
}
|
||||||
_direction = glm::normalize(offset);
|
_direction = glm::normalize(offset);
|
||||||
_length = glm::length(offset);
|
_length = glm::length(offset);
|
||||||
}
|
}
|
||||||
|
@ -136,16 +165,6 @@ void Line3DOverlay::setProperties(const QVariantMap& originalProperties) {
|
||||||
}
|
}
|
||||||
properties.remove("start"); // so that Base3DOverlay doesn't respond to it
|
properties.remove("start"); // so that Base3DOverlay doesn't respond to it
|
||||||
|
|
||||||
auto localStart = properties["localStart"];
|
|
||||||
if (localStart.isValid()) {
|
|
||||||
setLocalPosition(vec3FromVariant(localStart));
|
|
||||||
// in case "end" isn't updated...
|
|
||||||
glm::vec3 offset = getLocalEnd() - getLocalStart();
|
|
||||||
_direction = glm::normalize(offset);
|
|
||||||
_length = glm::length(offset);
|
|
||||||
}
|
|
||||||
properties.remove("localStart"); // so that Base3DOverlay doesn't respond to it
|
|
||||||
|
|
||||||
auto end = properties["end"];
|
auto end = properties["end"];
|
||||||
// if "end" property was not there, check to see if they included aliases: endPoint
|
// if "end" property was not there, check to see if they included aliases: endPoint
|
||||||
if (!end.isValid()) {
|
if (!end.isValid()) {
|
||||||
|
@ -157,14 +176,6 @@ void Line3DOverlay::setProperties(const QVariantMap& originalProperties) {
|
||||||
}
|
}
|
||||||
properties.remove("end"); // so that Base3DOverlay doesn't respond to it
|
properties.remove("end"); // so that Base3DOverlay doesn't respond to it
|
||||||
|
|
||||||
auto localEnd = properties["localEnd"];
|
|
||||||
if (localEnd.isValid()) {
|
|
||||||
glm::vec3 offset = vec3FromVariant(localEnd) - getLocalStart();
|
|
||||||
_direction = glm::normalize(offset);
|
|
||||||
_length = glm::length(offset);
|
|
||||||
}
|
|
||||||
properties.remove("localEnd"); // so that Base3DOverlay doesn't respond to it
|
|
||||||
|
|
||||||
auto length = properties["length"];
|
auto length = properties["length"];
|
||||||
if (length.isValid()) {
|
if (length.isValid()) {
|
||||||
_length = length.toFloat();
|
_length = length.toFloat();
|
||||||
|
@ -172,6 +183,27 @@ void Line3DOverlay::setProperties(const QVariantMap& originalProperties) {
|
||||||
|
|
||||||
Base3DOverlay::setProperties(properties);
|
Base3DOverlay::setProperties(properties);
|
||||||
|
|
||||||
|
auto endParentIDProp = properties["endParentID"];
|
||||||
|
if (endParentIDProp.isValid()) {
|
||||||
|
_endParentID = QUuid(endParentIDProp.toString());
|
||||||
|
}
|
||||||
|
auto endParentJointIndexProp = properties["endParentJointIndex"];
|
||||||
|
if (endParentJointIndexProp.isValid()) {
|
||||||
|
_endParentJointIndex = endParentJointIndexProp.toInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto localStart = properties["localStart"];
|
||||||
|
if (localStart.isValid()) {
|
||||||
|
glm::vec3 tmpLocalEnd = getLocalEnd();
|
||||||
|
setLocalStart(vec3FromVariant(localStart));
|
||||||
|
setLocalEnd(tmpLocalEnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto localEnd = properties["localEnd"];
|
||||||
|
if (localEnd.isValid()) {
|
||||||
|
setLocalEnd(vec3FromVariant(localEnd));
|
||||||
|
}
|
||||||
|
|
||||||
// these are saved until after Base3DOverlay::setProperties so parenting infomation can be set, first
|
// these are saved until after Base3DOverlay::setProperties so parenting infomation can be set, first
|
||||||
if (newStartSet) {
|
if (newStartSet) {
|
||||||
setStart(newStart);
|
setStart(newStart);
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
class Line3DOverlay : public Base3DOverlay {
|
class Line3DOverlay : public Base3DOverlay {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static QString const TYPE;
|
static QString const TYPE;
|
||||||
virtual QString getType() const override { return TYPE; }
|
virtual QString getType() const override { return TYPE; }
|
||||||
|
@ -37,6 +37,9 @@ public:
|
||||||
void setStart(const glm::vec3& start);
|
void setStart(const glm::vec3& start);
|
||||||
void setEnd(const glm::vec3& end);
|
void setEnd(const glm::vec3& end);
|
||||||
|
|
||||||
|
void setLocalStart(const glm::vec3& localStart) { setLocalPosition(localStart); }
|
||||||
|
void setLocalEnd(const glm::vec3& localEnd);
|
||||||
|
|
||||||
void setGlow(const float& glow) { _glow = glow; }
|
void setGlow(const float& glow) { _glow = glow; }
|
||||||
void setGlowWidth(const float& glowWidth) { _glowWidth = glowWidth; }
|
void setGlowWidth(const float& glowWidth) { _glowWidth = glowWidth; }
|
||||||
|
|
||||||
|
@ -51,10 +54,19 @@ public:
|
||||||
float getLength() const { return _length; }
|
float getLength() const { return _length; }
|
||||||
glm::vec3 getLocalStart() const { return getLocalPosition(); }
|
glm::vec3 getLocalStart() const { return getLocalPosition(); }
|
||||||
glm::vec3 getLocalEnd() const { return getLocalStart() + _direction * _length; }
|
glm::vec3 getLocalEnd() const { return getLocalStart() + _direction * _length; }
|
||||||
|
QUuid getEndParentID() const { return _endParentID; }
|
||||||
|
quint16 getEndJointIndex() const { return _endParentJointIndex; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QUuid _endParentID;
|
||||||
|
quint16 _endParentJointIndex { INVALID_JOINT_INDEX };
|
||||||
|
|
||||||
|
// _direction and _length are in the parent's frame. If _endParentID is set, they are
|
||||||
|
// relative to that. Otherwise, they are relative to the local-start-position (which is the
|
||||||
|
// same as localPosition)
|
||||||
glm::vec3 _direction; // in parent frame
|
glm::vec3 _direction; // in parent frame
|
||||||
float _length { 1.0 }; // in parent frame
|
float _length { 1.0 }; // in parent frame
|
||||||
|
|
||||||
float _glow { 0.0 };
|
float _glow { 0.0 };
|
||||||
float _glowWidth { 0.0 };
|
float _glowWidth { 0.0 };
|
||||||
int _geometryCacheID;
|
int _geometryCacheID;
|
||||||
|
|
|
@ -999,7 +999,7 @@ function MyController(hand) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
this.overlayLineOn = function(closePoint, farPoint, color) {
|
this.overlayLineOn = function(closePoint, farPoint, color, farParentID) {
|
||||||
if (this.overlayLine === null) {
|
if (this.overlayLine === null) {
|
||||||
var lineProperties;
|
var lineProperties;
|
||||||
if (this.hand === RIGHT_HAND) {
|
if (this.hand === RIGHT_HAND) {
|
||||||
|
@ -1014,7 +1014,8 @@ function MyController(hand) {
|
||||||
visible: true,
|
visible: true,
|
||||||
alpha: 1,
|
alpha: 1,
|
||||||
parentID: AVATAR_SELF_ID,
|
parentID: AVATAR_SELF_ID,
|
||||||
parentJointIndex: this.controllerJointIndex
|
parentJointIndex: this.controllerJointIndex,
|
||||||
|
endParentID: farParentID
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
lineProperties = {
|
lineProperties = {
|
||||||
|
@ -1033,12 +1034,16 @@ function MyController(hand) {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (this.hand === RIGHT_HAND) {
|
if (this.hand === RIGHT_HAND) {
|
||||||
Overlays.editOverlay(this.overlayLine, {
|
if (farParentID && farParentID != NULL_UUID) {
|
||||||
// start: closePoint,
|
Overlays.editOverlay(this.overlayLine, {
|
||||||
// end: farPoint,
|
color: color,
|
||||||
length: Vec3.distance(farPoint, closePoint),
|
});
|
||||||
color: color,
|
} else {
|
||||||
});
|
Overlays.editOverlay(this.overlayLine, {
|
||||||
|
length: Vec3.distance(farPoint, closePoint),
|
||||||
|
color: color,
|
||||||
|
});
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Overlays.editOverlay(this.overlayLine, {
|
Overlays.editOverlay(this.overlayLine, {
|
||||||
start: closePoint,
|
start: closePoint,
|
||||||
|
@ -2191,7 +2196,10 @@ function MyController(hand) {
|
||||||
|
|
||||||
var rayPickInfo = this.calcRayPickInfo(this.hand);
|
var rayPickInfo = this.calcRayPickInfo(this.hand);
|
||||||
|
|
||||||
this.overlayLineOn(rayPickInfo.searchRay.origin, Vec3.subtract(grabbedProperties.position, this.offsetPosition), COLORS_GRAB_DISTANCE_HOLD);
|
this.overlayLineOn(rayPickInfo.searchRay.origin,
|
||||||
|
Vec3.subtract(grabbedProperties.position, this.offsetPosition),
|
||||||
|
COLORS_GRAB_DISTANCE_HOLD,
|
||||||
|
this.grabbedEntity);
|
||||||
|
|
||||||
var distanceToObject = Vec3.length(Vec3.subtract(MyAvatar.position, this.currentObjectPosition));
|
var distanceToObject = Vec3.length(Vec3.subtract(MyAvatar.position, this.currentObjectPosition));
|
||||||
var success = Entities.updateAction(this.grabbedEntity, this.actionID, {
|
var success = Entities.updateAction(this.grabbedEntity, this.actionID, {
|
||||||
|
|
Loading…
Reference in a new issue