- When scene is drawn on window (with viewport), DALi draws scene on window directly so picking ray and result is always fit.
- When scene is drawn on FBO, DALi cannot know how the result is drawn by app, so picking ray is always on space that has (0, -1, 0) as UP.
Change-Id: I441356c5b128711ca864a9cd2d51e166f297d245
Signed-off-by: Seungho Baek <sbsh.baek@samsung.com>
bool CameraActor::BuildPickingRay(const Vector2& screenCoordinates,
const Viewport& viewport,
Vector4& rayOrigin,
- Vector4& rayDirection)
+ Vector4& rayDirection,
+ bool isDrawnOnFramebuffer)
{
bool success = true;
if(mProjectionMode == Dali::Camera::PERSPECTIVE_PROJECTION)
// Compute the ray's director vector.
rayDirection.x = near.x - rayOrigin.x;
rayDirection.y = near.y - rayOrigin.y;
- rayDirection.y = (mInvertYAxis) ? -rayDirection.y : rayDirection.y;
+ rayDirection.y = (isDrawnOnFramebuffer && mInvertYAxis) ? -rayDirection.y : rayDirection.y;
rayDirection.z = near.z - rayOrigin.z;
rayDirection.Normalize();
rayDirection.w = 1.f;
bool CameraActor::BuildPickingRay(const Vector2& screenCoordinates,
const Vector2& screenSize,
Vector4& rayOrigin,
- Vector4& rayDirection)
+ Vector4& rayDirection,
+ bool isDrawnOnFramebuffer)
{
Viewport viewport(0, 0, screenSize.x, screenSize.y);
- return BuildPickingRay(screenCoordinates, viewport, rayOrigin, rayDirection);
+ return BuildPickingRay(screenCoordinates, viewport, rayOrigin, rayDirection, isDrawnOnFramebuffer);
}
const Matrix& CameraActor::GetViewMatrix() const
* @param [in] viewport to use
* @param [out] rayOrigin for the picking ray
* @param [out] rayDirection for the picking ray
+ * @param [in] isDrawnOnFramebuffer to notify this camera is currently used for Framebuffer or not.
* @return true if the building was successful, false if its not possible (camera is not valid for hit testing)
*/
- bool BuildPickingRay(const Vector2& screenCoordinates, const Viewport& viewport, Vector4& rayOrigin, Vector4& rayDirection);
+ bool BuildPickingRay(const Vector2& screenCoordinates, const Viewport& viewport, Vector4& rayOrigin, Vector4& rayDirection, bool isDrawnOnFramebuffer = false);
+
+ /**
+ * Build a picking ray with this camera and given screen coordinates (Not considers viewport.)
+ * @param [in] screenCoordinates the ray passed through
+ * @param [in] screenSize screen Size.
+ * @param [out] rayOrigin for the picking ray
+ * @param [out] rayDirection for the picking ray
+ * @param [in] isDrawnOnFramebuffer to notify this camera is currently used for Framebuffer or not.
+ * @return true if the building was successful, false if its not possible (camera is not valid for hit testing)
+ */
+ bool BuildPickingRay(const Vector2& screenCoordinates, const Vector2& screenSize, Vector4& rayOrigin, Vector4& rayDirection, bool isDrawnOnFramebuffer = false);
/**
* Build a picking ray with this camera and given screen coordinates (Not considers viewport.)
}
Ray ray;
- if(!renderTask.GetCameraActor()->BuildPickingRay(screenCoordinates, screenSize, ray.origin, ray.direction))
+ if(!renderTask.GetCameraActor()->BuildPickingRay(screenCoordinates, screenSize, ray.origin, ray.direction, !!renderTask.GetFrameBuffer()))
{
return false;
}