mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 12:57:18 +02:00
Moving all the 3D overlay transform evaluation out of the render thread to the game loop, need to do something for the line3d
This commit is contained in:
parent
5b5464fe63
commit
d112ffd8d6
28 changed files with 146 additions and 63 deletions
|
@ -268,18 +268,17 @@ void Base3DOverlay::update(float duration) {
|
||||||
|
|
||||||
// In Base3DOverlay, if its location or bound changed, the renderTrasnformDirty flag is true.
|
// In Base3DOverlay, if its location or bound changed, the renderTrasnformDirty flag is true.
|
||||||
// then the correct transform used for rendering is computed in the update transaction and assigned.
|
// then the correct transform used for rendering is computed in the update transaction and assigned.
|
||||||
// TODO: Fix the value to be computed in main thread now and passed by value to the render item.
|
|
||||||
// This is the simplest fix for the web overlay of the tablet for now
|
|
||||||
if (_renderTransformDirty) {
|
if (_renderTransformDirty) {
|
||||||
_renderTransformDirty = false;
|
|
||||||
auto itemID = getRenderItemID();
|
auto itemID = getRenderItemID();
|
||||||
if (render::Item::isValidID(itemID)) {
|
if (render::Item::isValidID(itemID)) {
|
||||||
|
_renderTransformDirty = false;
|
||||||
|
// Capture the render transform value in game loop before
|
||||||
|
auto latestTransform = evalRenderTransform();
|
||||||
render::ScenePointer scene = qApp->getMain3DScene();
|
render::ScenePointer scene = qApp->getMain3DScene();
|
||||||
render::Transaction transaction;
|
render::Transaction transaction;
|
||||||
transaction.updateItem<Overlay>(itemID, [](Overlay& data) {
|
transaction.updateItem<Overlay>(itemID, [latestTransform](Overlay& data) {
|
||||||
auto overlay3D = dynamic_cast<Base3DOverlay*>(&data);
|
auto overlay3D = dynamic_cast<Base3DOverlay*>(&data);
|
||||||
if (overlay3D) {
|
if (overlay3D) {
|
||||||
auto latestTransform = overlay3D->evalRenderTransform();
|
|
||||||
overlay3D->setRenderTransform(latestTransform);
|
overlay3D->setRenderTransform(latestTransform);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -292,7 +291,7 @@ void Base3DOverlay::notifyRenderTransformChange() const {
|
||||||
_renderTransformDirty = true;
|
_renderTransformDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform Base3DOverlay::evalRenderTransform() const {
|
Transform Base3DOverlay::evalRenderTransform() {
|
||||||
return getTransform();
|
return getTransform();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ protected:
|
||||||
virtual void parentDeleted() override;
|
virtual void parentDeleted() override;
|
||||||
|
|
||||||
mutable Transform _renderTransform;
|
mutable Transform _renderTransform;
|
||||||
virtual Transform evalRenderTransform() const;
|
virtual Transform evalRenderTransform();
|
||||||
virtual void setRenderTransform(const Transform& transform);
|
virtual void setRenderTransform(const Transform& transform);
|
||||||
const Transform& getRenderTransform() const { return _renderTransform; }
|
const Transform& getRenderTransform() const { return _renderTransform; }
|
||||||
|
|
||||||
|
|
|
@ -45,3 +45,14 @@ bool Billboard3DOverlay::applyTransformTo(Transform& transform, bool force) {
|
||||||
}
|
}
|
||||||
return transformChanged;
|
return transformChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Transform Billboard3DOverlay::evalRenderTransform() {
|
||||||
|
Transform transform = getTransform();
|
||||||
|
bool transformChanged = applyTransformTo(transform, true);
|
||||||
|
// If the transform is not modified, setting the transform to
|
||||||
|
// itself will cause drift over time due to floating point errors.
|
||||||
|
if (transformChanged) {
|
||||||
|
setTransform(transform);
|
||||||
|
}
|
||||||
|
return transform;
|
||||||
|
}
|
|
@ -28,6 +28,8 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool applyTransformTo(Transform& transform, bool force = false) override;
|
virtual bool applyTransformTo(Transform& transform, bool force = false) override;
|
||||||
|
|
||||||
|
Transform evalRenderTransform() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_Billboard3DOverlay_h
|
#endif // hifi_Billboard3DOverlay_h
|
||||||
|
|
|
@ -438,3 +438,7 @@ bool Circle3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::ve
|
||||||
Circle3DOverlay* Circle3DOverlay::createClone() const {
|
Circle3DOverlay* Circle3DOverlay::createClone() const {
|
||||||
return new Circle3DOverlay(this);
|
return new Circle3DOverlay(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Transform Circle3DOverlay::evalRenderTransform() {
|
||||||
|
return getTransform();
|
||||||
|
}
|
||||||
|
|
|
@ -88,6 +88,8 @@ protected:
|
||||||
int _minorTicksVerticesID { 0 };
|
int _minorTicksVerticesID { 0 };
|
||||||
|
|
||||||
bool _dirty { true };
|
bool _dirty { true };
|
||||||
|
|
||||||
|
Transform evalRenderTransform() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -53,18 +53,11 @@ void Cube3DOverlay::render(RenderArgs* args) {
|
||||||
const float MAX_COLOR = 255.0f;
|
const float MAX_COLOR = 255.0f;
|
||||||
glm::vec4 cubeColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha);
|
glm::vec4 cubeColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha);
|
||||||
|
|
||||||
// TODO: handle registration point??
|
|
||||||
// FIXME Start using the _renderTransform instead of calling for Transform from here, do the custom things needed in evalRenderTransform()
|
|
||||||
glm::vec3 position = getPosition();
|
|
||||||
glm::vec3 dimensions = getDimensions();
|
|
||||||
glm::quat rotation = getRotation();
|
|
||||||
|
|
||||||
auto batch = args->_batch;
|
auto batch = args->_batch;
|
||||||
|
|
||||||
if (batch) {
|
if (batch) {
|
||||||
Transform transform;
|
Transform transform = getRenderTransform();
|
||||||
transform.setTranslation(position);
|
|
||||||
transform.setRotation(rotation);
|
|
||||||
auto geometryCache = DependencyManager::get<GeometryCache>();
|
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||||
auto shapePipeline = args->_shapePipeline;
|
auto shapePipeline = args->_shapePipeline;
|
||||||
if (!shapePipeline) {
|
if (!shapePipeline) {
|
||||||
|
@ -72,12 +65,12 @@ void Cube3DOverlay::render(RenderArgs* args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_isSolid) {
|
if (_isSolid) {
|
||||||
transform.setScale(dimensions);
|
|
||||||
batch->setModelTransform(transform);
|
batch->setModelTransform(transform);
|
||||||
geometryCache->renderSolidCubeInstance(args, *batch, cubeColor, shapePipeline);
|
geometryCache->renderSolidCubeInstance(args, *batch, cubeColor, shapePipeline);
|
||||||
} else {
|
} else {
|
||||||
geometryCache->bindSimpleProgram(*batch, false, false, false, true, true);
|
geometryCache->bindSimpleProgram(*batch, false, false, false, true, true);
|
||||||
if (getIsDashedLine()) {
|
if (getIsDashedLine()) {
|
||||||
|
auto dimensions = transform.getScale();
|
||||||
transform.setScale(1.0f);
|
transform.setScale(1.0f);
|
||||||
batch->setModelTransform(transform);
|
batch->setModelTransform(transform);
|
||||||
|
|
||||||
|
@ -108,7 +101,6 @@ void Cube3DOverlay::render(RenderArgs* args) {
|
||||||
geometryCache->renderDashedLine(*batch, bottomRightFar, topRightFar, cubeColor, _geometryIds[11]);
|
geometryCache->renderDashedLine(*batch, bottomRightFar, topRightFar, cubeColor, _geometryIds[11]);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
transform.setScale(dimensions);
|
|
||||||
batch->setModelTransform(transform);
|
batch->setModelTransform(transform);
|
||||||
geometryCache->renderWireCubeInstance(args, *batch, cubeColor, shapePipeline);
|
geometryCache->renderWireCubeInstance(args, *batch, cubeColor, shapePipeline);
|
||||||
}
|
}
|
||||||
|
@ -149,3 +141,16 @@ QVariant Cube3DOverlay::getProperty(const QString& property) {
|
||||||
|
|
||||||
return Volume3DOverlay::getProperty(property);
|
return Volume3DOverlay::getProperty(property);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Transform Cube3DOverlay::evalRenderTransform() {
|
||||||
|
// TODO: handle registration point??
|
||||||
|
glm::vec3 position = getPosition();
|
||||||
|
glm::vec3 dimensions = getDimensions();
|
||||||
|
glm::quat rotation = getRotation();
|
||||||
|
|
||||||
|
Transform transform;
|
||||||
|
transform.setScale(dimensions);
|
||||||
|
transform.setTranslation(position);
|
||||||
|
transform.setRotation(rotation);
|
||||||
|
return transform;
|
||||||
|
}
|
||||||
|
|
|
@ -36,6 +36,9 @@ public:
|
||||||
void setProperties(const QVariantMap& properties) override;
|
void setProperties(const QVariantMap& properties) override;
|
||||||
QVariant getProperty(const QString& property) override;
|
QVariant getProperty(const QString& property) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Transform evalRenderTransform() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float _borderSize;
|
float _borderSize;
|
||||||
// edges on a cube
|
// edges on a cube
|
||||||
|
|
|
@ -79,10 +79,7 @@ void Grid3DOverlay::render(RenderArgs* args) {
|
||||||
position += glm::vec3(cameraPosition.x, 0.0f, cameraPosition.z);
|
position += glm::vec3(cameraPosition.x, 0.0f, cameraPosition.z);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME Start using the _renderTransform instead of calling for Transform from here, do the custom things needed in evalRenderTransform()
|
Transform transform = getRenderTransform();
|
||||||
Transform transform;
|
|
||||||
transform.setRotation(getRotation());
|
|
||||||
transform.setScale(glm::vec3(getDimensions(), 1.0f));
|
|
||||||
transform.setTranslation(position);
|
transform.setTranslation(position);
|
||||||
batch->setModelTransform(transform);
|
batch->setModelTransform(transform);
|
||||||
const float MINOR_GRID_EDGE = 0.0025f;
|
const float MINOR_GRID_EDGE = 0.0025f;
|
||||||
|
@ -146,3 +143,10 @@ void Grid3DOverlay::updateGrid() {
|
||||||
_minorGridRowDivisions = getDimensions().x / _minorGridEvery;
|
_minorGridRowDivisions = getDimensions().x / _minorGridEvery;
|
||||||
_minorGridColDivisions = getDimensions().y / _minorGridEvery;
|
_minorGridColDivisions = getDimensions().y / _minorGridEvery;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Transform Grid3DOverlay::evalRenderTransform() {
|
||||||
|
Transform transform;
|
||||||
|
transform.setRotation(getRotation());
|
||||||
|
transform.setScale(glm::vec3(getDimensions(), 1.0f));
|
||||||
|
return transform;
|
||||||
|
}
|
||||||
|
|
|
@ -37,6 +37,9 @@ public:
|
||||||
// Grids are UI tools, and may not be intersected (pickable)
|
// Grids are UI tools, and may not be intersected (pickable)
|
||||||
virtual bool findRayIntersection(const glm::vec3&, const glm::vec3&, float&, BoxFace&, glm::vec3&) override { return false; }
|
virtual bool findRayIntersection(const glm::vec3&, const glm::vec3&, float&, BoxFace&, glm::vec3&) override { return false; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Transform evalRenderTransform() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void updateGrid();
|
void updateGrid();
|
||||||
|
|
||||||
|
|
|
@ -116,18 +116,8 @@ void Image3DOverlay::render(RenderArgs* args) {
|
||||||
const float MAX_COLOR = 255.0f;
|
const float MAX_COLOR = 255.0f;
|
||||||
xColor color = getColor();
|
xColor color = getColor();
|
||||||
float alpha = getAlpha();
|
float alpha = getAlpha();
|
||||||
|
|
||||||
// FIXME Start using the _renderTransform instead of calling for Transform from here, do the custom things needed in evalRenderTransform()
|
|
||||||
Transform transform = getTransform();
|
|
||||||
bool transformChanged = applyTransformTo(transform, true);
|
|
||||||
// If the transform is not modified, setting the transform to
|
|
||||||
// itself will cause drift over time due to floating point errors.
|
|
||||||
if (transformChanged) {
|
|
||||||
setTransform(transform);
|
|
||||||
}
|
|
||||||
transform.postScale(glm::vec3(getDimensions(), 1.0f));
|
|
||||||
|
|
||||||
batch->setModelTransform(transform);
|
batch->setModelTransform(getRenderTransform());
|
||||||
batch->setResourceTexture(0, _texture->getGPUTexture());
|
batch->setResourceTexture(0, _texture->getGPUTexture());
|
||||||
|
|
||||||
DependencyManager::get<GeometryCache>()->renderQuad(
|
DependencyManager::get<GeometryCache>()->renderQuad(
|
||||||
|
@ -249,3 +239,9 @@ bool Image3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec
|
||||||
Image3DOverlay* Image3DOverlay::createClone() const {
|
Image3DOverlay* Image3DOverlay::createClone() const {
|
||||||
return new Image3DOverlay(this);
|
return new Image3DOverlay(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Transform Image3DOverlay::evalRenderTransform() {
|
||||||
|
auto transform = Parent::evalRenderTransform();
|
||||||
|
transform.postScale(glm::vec3(getDimensions(), 1.0f));
|
||||||
|
return transform;
|
||||||
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
class Image3DOverlay : public Billboard3DOverlay {
|
class Image3DOverlay : public Billboard3DOverlay {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
using Parent = Billboard3DOverlay;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static QString const TYPE;
|
static QString const TYPE;
|
||||||
|
@ -46,6 +47,9 @@ public:
|
||||||
|
|
||||||
virtual Image3DOverlay* createClone() const override;
|
virtual Image3DOverlay* createClone() const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Transform evalRenderTransform() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString _url;
|
QString _url;
|
||||||
NetworkTexturePointer _texture;
|
NetworkTexturePointer _texture;
|
||||||
|
|
|
@ -268,3 +268,7 @@ QVariant Line3DOverlay::getProperty(const QString& property) {
|
||||||
Line3DOverlay* Line3DOverlay::createClone() const {
|
Line3DOverlay* Line3DOverlay::createClone() const {
|
||||||
return new Line3DOverlay(this);
|
return new Line3DOverlay(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Transform Line3DOverlay::evalRenderTransform() {
|
||||||
|
return getTransform();
|
||||||
|
}
|
||||||
|
|
|
@ -56,6 +56,9 @@ public:
|
||||||
QUuid getEndParentID() const { return _endParentID; }
|
QUuid getEndParentID() const { return _endParentID; }
|
||||||
quint16 getEndJointIndex() const { return _endParentJointIndex; }
|
quint16 getEndJointIndex() const { return _endParentJointIndex; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Transform evalRenderTransform() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QUuid _endParentID;
|
QUuid _endParentID;
|
||||||
quint16 _endParentJointIndex { INVALID_JOINT_INDEX };
|
quint16 _endParentJointIndex { INVALID_JOINT_INDEX };
|
||||||
|
|
|
@ -46,10 +46,7 @@ void ModelOverlay::update(float deltatime) {
|
||||||
if (_updateModel) {
|
if (_updateModel) {
|
||||||
_updateModel = false;
|
_updateModel = false;
|
||||||
_model->setSnapModelToCenter(true);
|
_model->setSnapModelToCenter(true);
|
||||||
Transform transform = getTransform();
|
Transform transform = evalRenderTransform();
|
||||||
#ifndef USE_SN_SCALE
|
|
||||||
transform.setScale(1.0f); // disable inherited scale
|
|
||||||
#endif
|
|
||||||
if (_scaleToFit) {
|
if (_scaleToFit) {
|
||||||
_model->setScaleToFit(true, transform.getScale() * getDimensions());
|
_model->setScaleToFit(true, transform.getScale() * getDimensions());
|
||||||
} else {
|
} else {
|
||||||
|
@ -282,6 +279,10 @@ ModelOverlay* ModelOverlay::createClone() const {
|
||||||
return new ModelOverlay(this);
|
return new ModelOverlay(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Transform ModelOverlay::evalRenderTransform() {
|
||||||
|
return getTransform();
|
||||||
|
}
|
||||||
|
|
||||||
void ModelOverlay::locationChanged(bool tellPhysics) {
|
void ModelOverlay::locationChanged(bool tellPhysics) {
|
||||||
Base3DOverlay::locationChanged(tellPhysics);
|
Base3DOverlay::locationChanged(tellPhysics);
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,8 @@ public:
|
||||||
float getLoadPriority() const { return _loadPriority; }
|
float getLoadPriority() const { return _loadPriority; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
Transform evalRenderTransform() override;
|
||||||
|
|
||||||
// helper to extract metadata from our Model's rigged joints
|
// helper to extract metadata from our Model's rigged joints
|
||||||
template <typename itemType> using mapFunction = std::function<itemType(int jointIndex)>;
|
template <typename itemType> using mapFunction = std::function<itemType(int jointIndex)>;
|
||||||
template <typename vectorType, typename itemType>
|
template <typename vectorType, typename itemType>
|
||||||
|
|
|
@ -67,7 +67,7 @@ bool Planar3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::ve
|
||||||
return findRayRectangleIntersection(origin, direction, getRotation(), getPosition(), getDimensions(), distance);
|
return findRayRectangleIntersection(origin, direction, getRotation(), getPosition(), getDimensions(), distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform Planar3DOverlay::evalRenderTransform() const {
|
Transform Planar3DOverlay::evalRenderTransform() {
|
||||||
auto transform = getTransform();
|
auto transform = getTransform();
|
||||||
transform.setScale(1.0f); // ignore inherited scale factor from parents
|
transform.setScale(1.0f); // ignore inherited scale factor from parents
|
||||||
if (glm::length2(getDimensions()) != 1.0f) {
|
if (glm::length2(getDimensions()) != 1.0f) {
|
||||||
|
|
|
@ -33,10 +33,10 @@ public:
|
||||||
virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance,
|
virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance,
|
||||||
BoxFace& face, glm::vec3& surfaceNormal) override;
|
BoxFace& face, glm::vec3& surfaceNormal) override;
|
||||||
|
|
||||||
Transform evalRenderTransform() const override;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
glm::vec2 _dimensions;
|
glm::vec2 _dimensions;
|
||||||
|
|
||||||
|
Transform evalRenderTransform() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -124,3 +124,8 @@ void Rectangle3DOverlay::setProperties(const QVariantMap& properties) {
|
||||||
Rectangle3DOverlay* Rectangle3DOverlay::createClone() const {
|
Rectangle3DOverlay* Rectangle3DOverlay::createClone() const {
|
||||||
return new Rectangle3DOverlay(this);
|
return new Rectangle3DOverlay(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Transform Rectangle3DOverlay::evalRenderTransform() {
|
||||||
|
return getTransform();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,10 @@ public:
|
||||||
void setProperties(const QVariantMap& properties) override;
|
void setProperties(const QVariantMap& properties) override;
|
||||||
|
|
||||||
virtual Rectangle3DOverlay* createClone() const override;
|
virtual Rectangle3DOverlay* createClone() const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Transform evalRenderTransform() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int _geometryCacheID;
|
int _geometryCacheID;
|
||||||
std::array<int, 4> _rectGeometryIds;
|
std::array<int, 4> _rectGeometryIds;
|
||||||
|
|
|
@ -33,26 +33,15 @@ void Shape3DOverlay::render(RenderArgs* args) {
|
||||||
const float MAX_COLOR = 255.0f;
|
const float MAX_COLOR = 255.0f;
|
||||||
glm::vec4 cubeColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha);
|
glm::vec4 cubeColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha);
|
||||||
|
|
||||||
// FIXME Start using the _renderTransform instead of calling for Transform and Dimensions from here, do the custom things needed in evalRenderTransform()
|
|
||||||
// TODO: handle registration point??
|
|
||||||
glm::vec3 position = getPosition();
|
|
||||||
glm::vec3 dimensions = getDimensions();
|
|
||||||
glm::quat rotation = getRotation();
|
|
||||||
|
|
||||||
auto batch = args->_batch;
|
auto batch = args->_batch;
|
||||||
|
|
||||||
if (batch) {
|
if (batch) {
|
||||||
Transform transform;
|
|
||||||
transform.setTranslation(position);
|
|
||||||
transform.setRotation(rotation);
|
|
||||||
auto geometryCache = DependencyManager::get<GeometryCache>();
|
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||||
auto shapePipeline = args->_shapePipeline;
|
auto shapePipeline = args->_shapePipeline;
|
||||||
if (!shapePipeline) {
|
if (!shapePipeline) {
|
||||||
shapePipeline = _isSolid ? geometryCache->getOpaqueShapePipeline() : geometryCache->getWireShapePipeline();
|
shapePipeline = _isSolid ? geometryCache->getOpaqueShapePipeline() : geometryCache->getWireShapePipeline();
|
||||||
}
|
}
|
||||||
|
|
||||||
transform.setScale(dimensions);
|
batch->setModelTransform(getRenderTransform());
|
||||||
batch->setModelTransform(transform);
|
|
||||||
if (_isSolid) {
|
if (_isSolid) {
|
||||||
geometryCache->renderSolidShapeInstance(args, *batch, _shape, cubeColor, shapePipeline);
|
geometryCache->renderSolidShapeInstance(args, *batch, _shape, cubeColor, shapePipeline);
|
||||||
} else {
|
} else {
|
||||||
|
@ -129,3 +118,16 @@ QVariant Shape3DOverlay::getProperty(const QString& property) {
|
||||||
|
|
||||||
return Volume3DOverlay::getProperty(property);
|
return Volume3DOverlay::getProperty(property);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Transform Shape3DOverlay::evalRenderTransform() {
|
||||||
|
// TODO: handle registration point??
|
||||||
|
glm::vec3 position = getPosition();
|
||||||
|
glm::vec3 dimensions = getDimensions();
|
||||||
|
glm::quat rotation = getRotation();
|
||||||
|
|
||||||
|
Transform transform;
|
||||||
|
transform.setScale(dimensions);
|
||||||
|
transform.setTranslation(position);
|
||||||
|
transform.setRotation(rotation);
|
||||||
|
return transform;
|
||||||
|
}
|
||||||
|
|
|
@ -37,6 +37,9 @@ public:
|
||||||
void setProperties(const QVariantMap& properties) override;
|
void setProperties(const QVariantMap& properties) override;
|
||||||
QVariant getProperty(const QString& property) override;
|
QVariant getProperty(const QString& property) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Transform evalRenderTransform() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float _borderSize;
|
float _borderSize;
|
||||||
GeometryCache::Shape _shape { GeometryCache::Hexagon };
|
GeometryCache::Shape _shape { GeometryCache::Hexagon };
|
||||||
|
|
|
@ -39,13 +39,8 @@ void Sphere3DOverlay::render(RenderArgs* args) {
|
||||||
auto batch = args->_batch;
|
auto batch = args->_batch;
|
||||||
|
|
||||||
if (batch) {
|
if (batch) {
|
||||||
// FIXME Start using the _renderTransform instead of calling for Transform and Dimensions from here, do the custom things needed in evalRenderTransform()
|
|
||||||
Transform transform = getTransform();
|
batch->setModelTransform(getRenderTransform());
|
||||||
#ifndef USE_SN_SCALE
|
|
||||||
transform.setScale(1.0f); // ignore inherited scale from SpatiallyNestable
|
|
||||||
#endif
|
|
||||||
transform.postScale(getDimensions() * SPHERE_OVERLAY_SCALE);
|
|
||||||
batch->setModelTransform(transform);
|
|
||||||
|
|
||||||
auto geometryCache = DependencyManager::get<GeometryCache>();
|
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||||
auto shapePipeline = args->_shapePipeline;
|
auto shapePipeline = args->_shapePipeline;
|
||||||
|
@ -75,3 +70,14 @@ const render::ShapeKey Sphere3DOverlay::getShapeKey() {
|
||||||
Sphere3DOverlay* Sphere3DOverlay::createClone() const {
|
Sphere3DOverlay* Sphere3DOverlay::createClone() const {
|
||||||
return new Sphere3DOverlay(this);
|
return new Sphere3DOverlay(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Transform Sphere3DOverlay::evalRenderTransform() {
|
||||||
|
// FIXME Start using the _renderTransform instead of calling for Transform and Dimensions from here, do the custom things needed in evalRenderTransform()
|
||||||
|
Transform transform = getTransform();
|
||||||
|
#ifndef USE_SN_SCALE
|
||||||
|
transform.setScale(1.0f); // ignore inherited scale from SpatiallyNestable
|
||||||
|
#endif
|
||||||
|
transform.postScale(getDimensions() * SPHERE_OVERLAY_SCALE);
|
||||||
|
|
||||||
|
return transform;
|
||||||
|
}
|
||||||
|
|
|
@ -27,6 +27,9 @@ public:
|
||||||
virtual const render::ShapeKey getShapeKey() override;
|
virtual const render::ShapeKey getShapeKey() override;
|
||||||
|
|
||||||
virtual Sphere3DOverlay* createClone() const override;
|
virtual Sphere3DOverlay* createClone() const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Transform evalRenderTransform() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -96,10 +96,7 @@ void Text3DOverlay::render(RenderArgs* args) {
|
||||||
Q_ASSERT(args->_batch);
|
Q_ASSERT(args->_batch);
|
||||||
auto& batch = *args->_batch;
|
auto& batch = *args->_batch;
|
||||||
|
|
||||||
// FIXME Start using the _renderTransform instead of calling for Transform and Dimensions from here, do the custom things needed in evalRenderTransform()
|
auto transform = getRenderTransform();
|
||||||
Transform transform = getTransform();
|
|
||||||
applyTransformTo(transform, true);
|
|
||||||
setTransform(transform);
|
|
||||||
batch.setModelTransform(transform);
|
batch.setModelTransform(transform);
|
||||||
|
|
||||||
const float MAX_COLOR = 255.0f;
|
const float MAX_COLOR = 255.0f;
|
||||||
|
@ -249,3 +246,8 @@ bool Text3DOverlay::findRayIntersection(const glm::vec3 &origin, const glm::vec3
|
||||||
setTransform(transform);
|
setTransform(transform);
|
||||||
return Billboard3DOverlay::findRayIntersection(origin, direction, distance, face, surfaceNormal);
|
return Billboard3DOverlay::findRayIntersection(origin, direction, distance, face, surfaceNormal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Transform Text3DOverlay::evalRenderTransform() {
|
||||||
|
return Parent::evalRenderTransform();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ class TextRenderer3D;
|
||||||
|
|
||||||
class Text3DOverlay : public Billboard3DOverlay {
|
class Text3DOverlay : public Billboard3DOverlay {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
using Parent = Billboard3DOverlay;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static QString const TYPE;
|
static QString const TYPE;
|
||||||
|
@ -63,6 +64,9 @@ public:
|
||||||
|
|
||||||
virtual Text3DOverlay* createClone() const override;
|
virtual Text3DOverlay* createClone() const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Transform evalRenderTransform() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TextRenderer3D* _textRenderer = nullptr;
|
TextRenderer3D* _textRenderer = nullptr;
|
||||||
|
|
||||||
|
|
|
@ -69,3 +69,11 @@ bool Volume3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::ve
|
||||||
// and testing intersection there.
|
// and testing intersection there.
|
||||||
return _localBoundingBox.findRayIntersection(overlayFrameOrigin, overlayFrameDirection, distance, face, surfaceNormal);
|
return _localBoundingBox.findRayIntersection(overlayFrameOrigin, overlayFrameDirection, distance, face, surfaceNormal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Transform Volume3DOverlay::evalRenderTransform() {
|
||||||
|
Transform transform = getTransform();
|
||||||
|
#ifndef USE_SN_SCALE
|
||||||
|
transform.setScale(1.0f); // ignore any inherited scale from SpatiallyNestable
|
||||||
|
#endif
|
||||||
|
return transform;
|
||||||
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
class Volume3DOverlay : public Base3DOverlay {
|
class Volume3DOverlay : public Base3DOverlay {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
using Parent = Base3DOverlay;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Volume3DOverlay() {}
|
Volume3DOverlay() {}
|
||||||
|
@ -35,6 +36,8 @@ public:
|
||||||
protected:
|
protected:
|
||||||
// Centered local bounding box
|
// Centered local bounding box
|
||||||
AABox _localBoundingBox{ vec3(0.0f), 1.0f };
|
AABox _localBoundingBox{ vec3(0.0f), 1.0f };
|
||||||
|
|
||||||
|
Transform evalRenderTransform() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue