From 30cf1555e414d43e0a7ccd58b973e8da528db483 Mon Sep 17 00:00:00 2001 From: HifiExperiments Date: Sat, 20 Feb 2021 22:47:33 -0800 Subject: [PATCH] fix keepAspectRatio, give text entities naturalDimensions --- .../src/RenderableImageEntityItem.cpp | 35 +++++++++++++++---- libraries/entities/src/ImageEntityItem.cpp | 9 ++++- libraries/entities/src/ImageEntityItem.h | 4 +++ 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableImageEntityItem.cpp b/libraries/entities-renderer/src/RenderableImageEntityItem.cpp index e03655f09c..dd6381953f 100644 --- a/libraries/entities-renderer/src/RenderableImageEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableImageEntityItem.cpp @@ -59,10 +59,22 @@ void ImageEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPoint _alpha = entity->getAlpha(); _pulseProperties = entity->getPulseProperties(); + bool nextTextureLoaded = _texture && (_texture->isLoaded() || _texture->isFailed()); if (!_textureIsLoaded) { emit requestRenderUpdate(); + if (nextTextureLoaded) { + float width = _texture->getWidth(); + float height = _texture->getHeight(); + glm::vec3 naturalDimensions = glm::vec3(1.0f, 1.0f, 0.01f); + if (width < height) { + naturalDimensions.x = width / height; + } else { + naturalDimensions.y = height / width; + } + entity->setNaturalDimension(naturalDimensions); + } } - _textureIsLoaded = _texture && (_texture->isLoaded() || _texture->isFailed()); + _textureIsLoaded = nextTextureLoaded; } ShapeKey ImageEntityRenderer::getShapeKey() { @@ -100,7 +112,6 @@ void ImageEntityRenderer::doRender(RenderArgs* args) { transform.setRotation(BillboardModeHelpers::getBillboardRotation(transform.getTranslation(), transform.getRotation(), _billboardMode, args->_renderMode == RenderArgs::RenderMode::SHADOW_RENDER_MODE ? BillboardModeHelpers::getPrimaryViewFrustumPosition() : args->getViewFrustum().getPosition())); - batch->setModelTransform(transform); batch->setResourceTexture(0, _texture->getGPUTexture()); float imageWidth = _texture->getWidth(); @@ -125,15 +136,25 @@ void ImageEntityRenderer::doRender(RenderArgs* args) { fromImage.setHeight(scaleY * _subImage.height()); } - float maxSize = glm::max(fromImage.width(), fromImage.height()); - float x = _keepAspectRatio ? fromImage.width() / (2.0f * maxSize) : 0.5f; - float y = _keepAspectRatio ? fromImage.height() / (2.0f * maxSize) : 0.5f; - glm::vec2 texCoordBottomLeft((fromImage.x() + 0.5f) / imageWidth, (fromImage.y() + fromImage.height() - 0.5f) / imageHeight); glm::vec2 texCoordTopRight((fromImage.x() + fromImage.width() - 0.5f) / imageWidth, (fromImage.y() + 0.5f) / imageHeight); + if (_keepAspectRatio) { + glm::vec3 scale = transform.getScale(); + float targetAspectRatio = imageWidth / imageHeight; + float currentAspectRatio = scale.x / scale.y; + + if (targetAspectRatio < currentAspectRatio) { + scale.x *= targetAspectRatio / currentAspectRatio; + } else { + scale.y /= targetAspectRatio / currentAspectRatio; + } + transform.setScale(scale); + } + batch->setModelTransform(transform); + DependencyManager::get()->renderQuad( - *batch, glm::vec2(-x, -y), glm::vec2(x, y), texCoordBottomLeft, texCoordTopRight, + *batch, glm::vec2(-0.5f), glm::vec2(0.5f), texCoordBottomLeft, texCoordTopRight, color, _geometryId ); diff --git a/libraries/entities/src/ImageEntityItem.cpp b/libraries/entities/src/ImageEntityItem.cpp index afa6d9ae69..41cdde7676 100644 --- a/libraries/entities/src/ImageEntityItem.cpp +++ b/libraries/entities/src/ImageEntityItem.cpp @@ -34,6 +34,7 @@ EntityItemProperties ImageEntityItem::getProperties(const EntityPropertyFlags& d COPY_ENTITY_PROPERTY_TO_PROPERTIES(alpha, getAlpha); withReadLock([&] { _pulseProperties.getProperties(properties); + properties.setNaturalDimensions(_naturalDimensions); }); COPY_ENTITY_PROPERTY_TO_PROPERTIES(imageURL, getImageURL); @@ -217,4 +218,10 @@ PulsePropertyGroup ImageEntityItem::getPulseProperties() const { return resultWithReadLock([&] { return _pulseProperties; }); -} \ No newline at end of file +} + +void ImageEntityItem::setNaturalDimension(const glm::vec3& naturalDimensions) const { + withWriteLock([&] { + _naturalDimensions = naturalDimensions; + }); +} diff --git a/libraries/entities/src/ImageEntityItem.h b/libraries/entities/src/ImageEntityItem.h index 4f7aac0c13..0cc4eae05a 100644 --- a/libraries/entities/src/ImageEntityItem.h +++ b/libraries/entities/src/ImageEntityItem.h @@ -63,6 +63,8 @@ public: PulsePropertyGroup getPulseProperties() const; + void setNaturalDimension(const glm::vec3& naturalDimensions) const; + protected: glm::u8vec3 _color; float _alpha; @@ -72,6 +74,8 @@ protected: bool _emissive { false }; bool _keepAspectRatio { true }; QRect _subImage; + + mutable glm::vec3 _naturalDimensions; }; #endif // hifi_ImageEntityItem_h