if(renderTask.IsHittable(screenCoordinates))
{
Viewport viewport;
- renderTask.GetViewport(viewport);
+ renderTask.GetHittableViewport(viewport);
+
if(screenCoordinates.x < static_cast<float>(viewport.x) ||
screenCoordinates.x > static_cast<float>(viewport.x + viewport.width) ||
screenCoordinates.y < static_cast<float>(viewport.y) ||
float localX, localY;
inside = inputMappingActor->ScreenToLocal(defaultCamera->GetViewMatrix(), defaultCamera->GetProjectionMatrix(), viewport, localX, localY, screenCoords.x, screenCoords.y);
- Vector3 actorSize = inputMappingActor->GetCurrentSize();
+ Vector3 actorSize = inputMappingActor->GetCurrentSize() * inputMappingActor->GetCurrentWorldScale();
if(inside && localX >= 0.f && localX <= actorSize.x && localY >= 0.f && localY <= actorSize.y)
{
screenCoords.x = localX;
return inside;
}
+void RenderTask::GetHittableViewport(Viewport& viewPort) const
+{
+ if(GetRenderTaskSceneObject())
+ {
+ if(GetInputEnabled())
+ {
+ if(mFrameBuffer)
+ {
+ auto mappingActor = GetScreenToFrameBufferMappingActor();
+ if(mappingActor)
+ {
+ Actor& inputMappingActor = GetImplementation(mappingActor);
+
+ Vector3 actorSize = inputMappingActor.GetCurrentSize() * inputMappingActor.GetCurrentWorldScale();
+
+ viewPort.x = viewPort.y = 0;
+ viewPort.width = static_cast<int32_t>(actorSize.x + 0.5f); // rounded
+ viewPort.height = static_cast<int32_t>(actorSize.y + 0.5f); // rounded
+ }
+ }
+ else
+ {
+ GetViewport(viewPort);
+ }
+ }
+ }
+}
+
bool RenderTask::WorldToViewport(const Vector3& position, float& viewportX, float& viewportY) const
{
CameraActor* cam = GetCameraActor();
bool TranslateCoordinates(Vector2& screenCoords) const;
/**
+ * @brief Get Viewport when we need to be used with translated screen coordinated when render task is offscreen.
+ * It will be used when we hit-test.
+ * @param[out] viewPort instance to copy the values into
+ */
+ void GetHittableViewport(Viewport& viewPort) const;
+
+ /**
* @copydoc Dali::RenderTask::WorldToViewport()
*/
bool WorldToViewport(const Vector3& position, float& viewportX, float& viewportY) const;
~RenderTask() override;
private: // not copyable
- RenderTask() = delete;
- RenderTask(const RenderTask&) = delete;
+ RenderTask() = delete;
+ RenderTask(const RenderTask&) = delete;
RenderTask& operator=(const RenderTask&) = delete;
private:
WeakHandle<Dali::Actor> mInputMappingActor; /// used to mapping screen to frame buffer coordinate, not kept alive by rendertask
RenderTaskList& mRenderTaskList; ///< The render task list
- Vector4 mClearColor; ///< Optional clear color
+ Vector4 mClearColor; ///< Optional clear color
- Vector2 mViewportPosition; ///< The cached viewport position
- Vector2 mViewportSize; ///< The cached viewport size
+ Vector2 mViewportPosition; ///< The cached viewport position
+ Vector2 mViewportSize; ///< The cached viewport size
- uint32_t mRefreshRate; ///< Determines how often the task is processed.
+ uint32_t mRefreshRate; ///< Determines how often the task is processed.
uint32_t mRefreshOnceCounter;