diff --git a/es-core/src/components/primary/CarouselComponent.h b/es-core/src/components/primary/CarouselComponent.h index 03d41d2e6..d81af7399 100644 --- a/es-core/src/components/primary/CarouselComponent.h +++ b/es-core/src/components/primary/CarouselComponent.h @@ -113,6 +113,7 @@ private: float mEntryCamOffset; int mPreviousScrollVelocity; + bool mPositiveDirection; bool mTriggerJump; bool mGamelistView; bool mUppercase; @@ -157,6 +158,7 @@ CarouselComponent::CarouselComponent() , mRenderer {Renderer::getInstance()} , mEntryCamOffset {0.0f} , mPreviousScrollVelocity {0} + , mPositiveDirection {false} , mTriggerJump {false} , mGamelistView {std::is_same_v ? true : false} , mUppercase {false} @@ -621,7 +623,13 @@ template void CarouselComponent::render(const glm::mat4& parentT yOff += mSize.y * mVerticalOffset; } - int center {static_cast(mEntryCamOffset)}; + int center {0}; + // Needed to make sure that overlapping items are renderered correctly. + if (mPositiveDirection) + center = static_cast(std::floor(mEntryCamOffset)); + else + center = static_cast(std::ceil(mEntryCamOffset)); + int itemInclusion {static_cast(std::ceil(mMaxItemCount / 2.0f))}; bool singleEntry {numEntries == 1}; @@ -1099,6 +1107,12 @@ template void CarouselComponent::onCursorChanged(const CursorSta if (endPos == mEntryCamOffset) return; + // Needed to make sure that overlapping items are renderered correctly. + if (startPos > endPos) + mPositiveDirection = true; + else + mPositiveDirection = false; + Animation* anim {new LambdaAnimation( [this, startPos, endPos, posMax](float t) { t -= 1;