Skip to content

Commit 937e0a5

Browse files
committed
Merge remote-tracking branch 'refs/remotes/HifiExperiments/fixBillboard'
2 parents 6732628 + 852edec commit 937e0a5

20 files changed

+99
-50
lines changed

libraries/entities-renderer/src/RenderableEntityItem.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,11 @@ bool EntityRenderer::needsRenderUpdate() const {
368368
return needsRenderUpdateFromEntity(_entity);
369369
}
370370

371+
Transform EntityRenderer::getTransformToCenterWithMaybeOnlyLocalRotation(const EntityItemPointer& entity, bool& success) const {
372+
return entity->getBillboardMode() == BillboardMode::NONE ? entity->getTransformToCenter(success) :
373+
entity->getTransformToCenterWithOnlyLocalRotation(success);
374+
}
375+
371376
// Returns true if the item in question needs to have updateInScene called because of changes in the entity
372377
bool EntityRenderer::needsRenderUpdateFromEntity(const EntityItemPointer& entity) const {
373378
if (entity->needsRenderUpdate()) {
@@ -379,12 +384,12 @@ bool EntityRenderer::needsRenderUpdateFromEntity(const EntityItemPointer& entity
379384
}
380385

381386
bool success = false;
382-
auto bound = _entity->getAABox(success);
387+
auto bound = entity->getAABox(success);
383388
if (success && _bound != bound) {
384389
return true;
385390
}
386391

387-
auto newModelTransform = _entity->getTransformToCenter(success);
392+
auto newModelTransform = getTransformToCenterWithMaybeOnlyLocalRotation(entity, success);
388393
// FIXME can we use a stale model transform here?
389394
if (success && newModelTransform != _modelTransform) {
390395
return true;
@@ -401,15 +406,15 @@ bool EntityRenderer::needsRenderUpdateFromEntity(const EntityItemPointer& entity
401406
return false;
402407
}
403408

404-
void EntityRenderer::updateModelTransformAndBound() {
409+
void EntityRenderer::updateModelTransformAndBound(const EntityItemPointer& entity) {
405410
bool success = false;
406-
auto newModelTransform = _entity->getTransformToCenter(success);
411+
auto newModelTransform = getTransformToCenterWithMaybeOnlyLocalRotation(entity, success);
407412
if (success) {
408413
_modelTransform = newModelTransform;
409414
}
410415

411416
success = false;
412-
auto bound = _entity->getAABox(success);
417+
auto bound = entity->getAABox(success);
413418
if (success) {
414419
_bound = bound;
415420
}
@@ -429,7 +434,7 @@ void EntityRenderer::doRenderUpdateSynchronous(const ScenePointer& scene, Transa
429434

430435
_prevIsTransparent = transparent;
431436

432-
updateModelTransformAndBound();
437+
updateModelTransformAndBound(entity);
433438

434439
_moving = entity->isMovingRelativeToParent();
435440
_visible = entity->getVisible();

libraries/entities-renderer/src/RenderableEntityItem.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,24 +101,22 @@ class EntityRenderer : public QObject, public std::enable_shared_from_this<Entit
101101
virtual void doRender(RenderArgs* args) = 0;
102102

103103
virtual bool isFading() const { return _isFading; }
104-
virtual void updateModelTransformAndBound();
104+
virtual void updateModelTransformAndBound(const EntityItemPointer& entity);
105105
virtual bool isTransparent() const { return _isFading ? Interpolate::calculateFadeRatio(_fadeStartTime) < 1.0f : false; }
106106
inline bool isValidRenderItem() const { return _renderItemID != Item::INVALID_ITEM_ID; }
107107

108108
virtual void setIsVisibleInSecondaryCamera(bool value) { _isVisibleInSecondaryCamera = value; }
109109
virtual void setRenderLayer(RenderLayer value) { _renderLayer = value; }
110110
virtual void setCullWithParent(bool value) { _cullWithParent = value; }
111111

112-
signals:
113-
void requestRenderUpdate();
114-
115-
protected:
116112
template<typename T>
117113
std::shared_ptr<T> asTypedEntity() { return std::static_pointer_cast<T>(_entity); }
118114

119115
static void makeStatusGetters(const EntityItemPointer& entity, Item::Status::Getters& statusGetters);
120116
const Transform& getModelTransform() const;
121117

118+
Transform getTransformToCenterWithMaybeOnlyLocalRotation(const EntityItemPointer& entity, bool& success) const;
119+
122120
Item::Bound _bound;
123121
SharedSoundPointer _collisionSound;
124122
QUuid _changeHandlerId;
@@ -154,6 +152,9 @@ class EntityRenderer : public QObject, public std::enable_shared_from_this<Entit
154152
const EntityItemPointer _entity;
155153

156154
QUuid _entityID;
155+
156+
signals:
157+
void requestRenderUpdate();
157158
};
158159

159160
template <typename T>

libraries/entities-renderer/src/RenderableModelEntityItem.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,12 @@ bool RenderableModelEntityItem::needsUpdateModelBounds() const {
115115
}
116116

117117
bool success;
118-
auto transform = getTransform(success);
118+
auto transform = getBillboardMode() == BillboardMode::NONE ? getTransform(success) : getTransformWithOnlyLocalRotation(success);
119119
if (success) {
120120
if (model->getTranslation() != transform.getTranslation()) {
121121
return true;
122122
}
123+
123124
if (model->getRotation() != transform.getRotation()) {
124125
return true;
125126
}
@@ -171,7 +172,7 @@ void RenderableModelEntityItem::updateModelBounds() {
171172
}
172173

173174
bool success;
174-
auto transform = getTransform(success);
175+
auto transform = getBillboardMode() == BillboardMode::NONE ? getTransform(success) : getTransformWithOnlyLocalRotation(success);
175176
if (success && (model->getTranslation() != transform.getTranslation() ||
176177
model->getRotation() != transform.getRotation())) {
177178
model->setTransformNoUpdateRenderItems(transform);

libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@ PolyLineEntityRenderer::PolyLineEntityRenderer(const EntityItemPointer& entity)
4141
}
4242
}
4343

44-
void PolyLineEntityRenderer::updateModelTransformAndBound() {
44+
void PolyLineEntityRenderer::updateModelTransformAndBound(const EntityItemPointer& entity) {
4545
bool success = false;
46-
auto newModelTransform = _entity->getTransformToCenter(success);
46+
auto newModelTransform = getTransformToCenterWithMaybeOnlyLocalRotation(entity, success);
4747
if (success) {
4848
_modelTransform = newModelTransform;
4949

50-
auto lineEntity = std::static_pointer_cast<PolyLineEntityItem>(_entity);
50+
auto lineEntity = std::static_pointer_cast<PolyLineEntityItem>(entity);
5151
AABox bound;
5252
lineEntity->computeTightLocalBoundingBox(bound);
5353
bound.transform(newModelTransform);

libraries/entities-renderer/src/RenderablePolyLineEntityItem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class PolyLineEntityRenderer : public TypedEntityRenderer<PolyLineEntityItem> {
2525
public:
2626
PolyLineEntityRenderer(const EntityItemPointer& entity);
2727

28-
void updateModelTransformAndBound() override;
28+
void updateModelTransformAndBound(const EntityItemPointer& entity) override;
2929

3030
virtual bool isTransparent() const override;
3131

libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1785,8 +1785,9 @@ void PolyVoxEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& s
17851785

17861786
void PolyVoxEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) {
17871787
_lastVoxelToLocalMatrix = entity->voxelToLocalMatrix();
1788-
_position = entity->getWorldPosition();
1789-
_orientation = entity->getWorldOrientation();
1788+
bool success;
1789+
_position = entity->getCenterPosition(success);
1790+
_orientation = entity->getBillboardMode() == BillboardMode::NONE ? entity->getWorldOrientation() : entity->getLocalOrientation();
17901791
_lastVoxelVolumeSize = entity->getVoxelVolumeSize();
17911792
_params->setSubData(0, vec4(_lastVoxelVolumeSize, 0.0));
17921793
graphics::MeshPointer newMesh;

libraries/entities-renderer/src/RenderableShapeEntityItem.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,12 @@ void ShapeEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce
5656
AbstractViewStateInterface::instance()->pushPostUpdateLambda(key, [this, entity] {
5757
withWriteLock([&] {
5858
_shape = entity->getShape();
59-
_position = entity->getWorldPosition();
60-
_dimensions = entity->getUnscaledDimensions(); // get unscaled to avoid scaling twice
61-
_orientation = entity->getWorldOrientation();
6259
_renderTransform = getModelTransform(); // contains parent scale, if this entity scales with its parent
6360
if (_shape == entity::Sphere) {
6461
_renderTransform.postScale(SPHERE_ENTITY_SCALE);
6562
}
6663

67-
_renderTransform.postScale(_dimensions);
64+
_renderTransform.postScale(entity->getUnscaledDimensions());
6865
});
6966
});
7067
}
@@ -248,7 +245,7 @@ void ShapeEntityRenderer::doRender(RenderArgs* args) {
248245
outColor = procedural->getColor(outColor);
249246
outColor.a *= procedural->isFading() ? Interpolate::calculateFadeRatio(procedural->getFadeStartTime()) : 1.0f;
250247
withReadLock([&] {
251-
procedural->prepare(batch, _position, _dimensions, _orientation, _created, ProceduralProgramKey(outColor.a < 1.0f));
248+
procedural->prepare(batch, transform.getTranslation(), transform.getScale(), transform.getRotation(), _created, ProceduralProgramKey(outColor.a < 1.0f));
252249
});
253250

254251
if (render::ShapeKey(args->_globalShapeKey).isWireframe() || _primitiveMode == PrimitiveMode::LINES) {

libraries/entities-renderer/src/RenderableShapeEntityItem.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,6 @@ class ShapeEntityRenderer : public TypedEntityRenderer<ShapeEntityItem> {
4545
std::shared_ptr<graphics::ProceduralMaterial> _material { std::make_shared<graphics::ProceduralMaterial>() };
4646
glm::vec3 _color { NAN };
4747
float _alpha { NAN };
48-
49-
glm::vec3 _position;
50-
glm::vec3 _dimensions;
51-
glm::quat _orientation;
5248
};
5349

5450
} }

libraries/entities-renderer/src/RenderableTextEntityItem.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -293,12 +293,12 @@ void entities::TextPayload::render(RenderArgs* args) {
293293
}
294294
auto textRenderable = std::static_pointer_cast<TextEntityRenderer>(renderable);
295295

296-
Transform modelTransform;
296+
Transform transform;
297297
glm::vec3 dimensions;
298298

299299
glm::vec4 textColor;
300300
textRenderable->withReadLock([&] {
301-
modelTransform = textRenderable->_renderTransform;
301+
transform = textRenderable->_renderTransform;
302302
dimensions = textRenderable->_dimensions;
303303

304304
float fadeRatio = textRenderable->_isFading ? Interpolate::calculateFadeRatio(textRenderable->_fadeStartTime) : 1.0f;
@@ -314,13 +314,13 @@ void entities::TextPayload::render(RenderArgs* args) {
314314
return;
315315
}
316316

317-
modelTransform.setRotation(BillboardModeHelpers::getBillboardRotation(modelTransform.getTranslation(), modelTransform.getRotation(), textRenderable->_billboardMode,
317+
transform.setRotation(BillboardModeHelpers::getBillboardRotation(transform.getTranslation(), transform.getRotation(), textRenderable->_billboardMode,
318318
args->_renderMode == RenderArgs::RenderMode::SHADOW_RENDER_MODE ? BillboardModeHelpers::getPrimaryViewFrustumPosition() : args->getViewFrustum().getPosition()));
319319

320320
float scale = textRenderable->_lineHeight / textRenderer->getFontSize();
321-
modelTransform.postTranslate(glm::vec3(-0.5, 0.5, 1.0f + EPSILON / dimensions.z));
322-
modelTransform.setScale(scale);
323-
batch.setModelTransform(modelTransform);
321+
transform.postTranslate(glm::vec3(-0.5, 0.5, 1.0f + EPSILON / dimensions.z));
322+
transform.setScale(scale);
323+
batch.setModelTransform(transform);
324324

325325
glm::vec2 bounds = glm::vec2(dimensions.x - (textRenderable->_leftMargin + textRenderable->_rightMargin), dimensions.y - (textRenderable->_topMargin + textRenderable->_bottomMargin));
326326
textRenderer->draw(batch, textRenderable->_leftMargin / scale, -textRenderable->_topMargin / scale, bounds / scale, scale,

libraries/entities/src/EntityItem.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1620,6 +1620,19 @@ const Transform EntityItem::getTransformToCenter(bool& success) const {
16201620
return result;
16211621
}
16221622

1623+
const Transform EntityItem::getTransformToCenterWithOnlyLocalRotation(bool& success) const {
1624+
Transform result = getTransformWithOnlyLocalRotation(success);
1625+
glm::vec3 pivot = getPivot();
1626+
if (pivot != ENTITY_ITEM_ZERO_VEC3) {
1627+
result.postTranslate(pivot);
1628+
}
1629+
glm::vec3 registrationPoint = getRegistrationPoint();
1630+
if (registrationPoint != ENTITY_ITEM_HALF_VEC3) { // If it is not already centered, translate to center
1631+
result.postTranslate((ENTITY_ITEM_HALF_VEC3 - registrationPoint) * getScaledDimensions()); // Position to center
1632+
}
1633+
return result;
1634+
}
1635+
16231636
/// The maximum bounding cube for the entity, independent of it's rotation.
16241637
/// This accounts for the registration point (upon which rotation occurs around).
16251638
///

0 commit comments

Comments
 (0)