mirror of
https://github.com/overte-org/overte.git
synced 2025-04-20 02:03:57 +02:00
Merge pull request #11046 from rickdaniels/21448
Address bug #21448 "Correctly Size Bounding Boxes for Polylines"
This commit is contained in:
commit
72bb52c7ed
3 changed files with 69 additions and 17 deletions
|
@ -262,7 +262,7 @@ public:
|
|||
glm::vec3 getRegistrationPoint() const; /// registration point as ratio of entity
|
||||
|
||||
/// registration point as ratio of entity
|
||||
void setRegistrationPoint(const glm::vec3& value);
|
||||
virtual void setRegistrationPoint(const glm::vec3& value);
|
||||
|
||||
bool hasAngularVelocity() const { return getAngularVelocity() != ENTITY_ITEM_ZERO_VEC3; }
|
||||
bool hasLocalAngularVelocity() const { return getLocalAngularVelocity() != ENTITY_ITEM_ZERO_VEC3; }
|
||||
|
|
|
@ -92,13 +92,12 @@ bool PolyLineEntityItem::appendPoint(const glm::vec3& point) {
|
|||
qCDebug(entities) << "MAX POINTS REACHED!";
|
||||
return false;
|
||||
}
|
||||
glm::vec3 halfBox = getDimensions() * 0.5f;
|
||||
if ((point.x < -halfBox.x || point.x > halfBox.x) || (point.y < -halfBox.y || point.y > halfBox.y) || (point.z < -halfBox.z || point.z > halfBox.z)) {
|
||||
qCDebug(entities) << "Point is outside entity's bounding box";
|
||||
return false;
|
||||
}
|
||||
|
||||
_points << point;
|
||||
_pointsChanged = true;
|
||||
|
||||
calculateScaleAndRegistrationPoint();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -141,23 +140,69 @@ bool PolyLineEntityItem::setLinePoints(const QVector<glm::vec3>& points) {
|
|||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < points.size(); i++) {
|
||||
glm::vec3 point = points.at(i);
|
||||
glm::vec3 halfBox = getDimensions() * 0.5f;
|
||||
if ((point.x < -halfBox.x || point.x > halfBox.x) ||
|
||||
(point.y < -halfBox.y || point.y > halfBox.y) ||
|
||||
(point.z < -halfBox.z || point.z > halfBox.z)) {
|
||||
qCDebug(entities) << "Point is outside entity's bounding box";
|
||||
return;
|
||||
}
|
||||
}
|
||||
_points = points;
|
||||
|
||||
calculateScaleAndRegistrationPoint();
|
||||
|
||||
result = true;
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void PolyLineEntityItem::calculateScaleAndRegistrationPoint() {
|
||||
glm::vec3 high(0.0f, 0.0f, 0.0f);
|
||||
glm::vec3 low(0.0f, 0.0f, 0.0f);
|
||||
for (int i = 0; i < _points.size(); i++) {
|
||||
glm::vec3 point = _points.at(i);
|
||||
|
||||
if (point.x > high.x) {
|
||||
high.x = point.x;
|
||||
} else if (point.x < low.x) {
|
||||
low.x = point.x;
|
||||
}
|
||||
|
||||
if (point.y > high.y) {
|
||||
high.y = point.y;
|
||||
} else if (point.y < low.y) {
|
||||
low.y = point.y;
|
||||
}
|
||||
|
||||
if (point.z > high.z) {
|
||||
high.z = point.z;
|
||||
} else if (point.z < low.z) {
|
||||
low.z = point.z;
|
||||
}
|
||||
}
|
||||
const float EPSILON = 0.0001f;
|
||||
if (_points.size() > 1) {
|
||||
// if all the points in the Polyline are at the same place in space, use default dimension settings
|
||||
if ((low - high).length() < EPSILON) {
|
||||
SpatiallyNestable::setScale(glm::vec3(1.0f, 1.0f, 1.0f));
|
||||
EntityItem::setRegistrationPoint(glm::vec3(0.5f));
|
||||
return;
|
||||
}
|
||||
|
||||
glm::vec3 result;
|
||||
const float halfLineWidth = 0.075f; // sadly _strokeWidths() don't seem to correspond to reality, so just use a flat assumption of the stroke width
|
||||
result.x = fabsf(high.x) + fabsf(low.x) + halfLineWidth;
|
||||
result.y = fabsf(high.y) + fabsf(low.y) + halfLineWidth;
|
||||
result.z = fabsf(high.z) + fabsf(low.z) + halfLineWidth;
|
||||
SpatiallyNestable::setScale(result);
|
||||
|
||||
// Center the poly line in the bounding box
|
||||
glm::vec3 point = _points.at(0);
|
||||
glm::vec3 startPointInScaleSpace = point - low;
|
||||
startPointInScaleSpace += glm::vec3(halfLineWidth * 0.5f);
|
||||
glm::vec3 newRegistrationPoint = startPointInScaleSpace / result;
|
||||
EntityItem::setRegistrationPoint(newRegistrationPoint);
|
||||
} else {
|
||||
// if Polyline has only one or fewer points, use default dimension settings
|
||||
SpatiallyNestable::setScale(glm::vec3(1.0f, 1.0f, 1.0f));
|
||||
EntityItem::setRegistrationPoint(glm::vec3(0.5f));
|
||||
}
|
||||
}
|
||||
|
||||
int PolyLineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead,
|
||||
ReadBitstreamToTreeParams& args,
|
||||
EntityPropertyFlags& propertyFlags, bool overwriteLocalData,
|
||||
|
|
|
@ -81,10 +81,17 @@ class PolyLineEntityItem : public EntityItem {
|
|||
BoxFace& face, glm::vec3& surfaceNormal,
|
||||
void** intersectedObject, bool precisionPicking) const override { return false; }
|
||||
|
||||
// disable these external interfaces as PolyLineEntities caculate their own dimensions based on the points they contain
|
||||
virtual void setRegistrationPoint(const glm::vec3& value) override {};
|
||||
virtual void setScale(const glm::vec3& scale) override {};
|
||||
virtual void setScale(float value) override {};
|
||||
|
||||
virtual void debugDump() const override;
|
||||
static const float DEFAULT_LINE_WIDTH;
|
||||
static const int MAX_POINTS_PER_LINE;
|
||||
|
||||
private:
|
||||
void calculateScaleAndRegistrationPoint();
|
||||
|
||||
protected:
|
||||
rgbColor _color;
|
||||
float _lineWidth;
|
||||
|
|
Loading…
Reference in a new issue