Merge branch 'tweak-camera-projectpoint' of git://github.com/stefnotch/FlaxEngine into stefnotch-tweak-camera-projectpoint

This commit is contained in:
Wojtek Figat
2021-03-18 10:59:54 +01:00
7 changed files with 46 additions and 44 deletions

View File

@@ -413,24 +413,6 @@ bool Engine::HasGameViewportFocus()
#endif
}
Vector2 Engine::ScreenToGameViewport(const Vector2& screenPos)
{
#if USE_EDITOR
return Editor::Managed->ScreenToGameViewport(screenPos);
#else
return MainWindow ? MainWindow->ScreenToClient(screenPos) : Vector2::Minimum;
#endif
}
Vector2 Engine::GameViewportToScreen(const Vector2& viewportPos)
{
#if USE_EDITOR
return Editor::Managed->GameViewportToScreen(viewportPos);
#else
return MainWindow ? MainWindow->ClientToScreen(viewportPos) : Vector2::Minimum;
#endif
}
void Engine::OnPause()
{
LOG(Info, "App paused");

View File

@@ -153,20 +153,6 @@ public:
/// <returns>True if game viewport is focused, otherwise false.</returns>
static bool HasGameViewportFocus();
/// <summary>
/// Converts the screen-space position to the game viewport position.
/// </summary>
/// <param name="screenPos">The screen-space position.</param>
/// <returns>The game viewport position.</returns>
static Vector2 ScreenToGameViewport(const Vector2& screenPos);
/// <summary>
/// Converts the game viewport position to the screen-space position.
/// </summary>
/// <param name="viewportPos">The game viewport position.</param>
/// <returns>The screen-space position.</returns>
static Vector2 GameViewportToScreen(const Vector2& viewportPos);
private:
static void OnPause();

View File

@@ -66,6 +66,26 @@ void Screen::SetSize(const Vector2& value)
Size = value;
}
Vector2 Screen::ScreenToGameViewport(const Vector2& screenPos)
{
#if USE_EDITOR
return Editor::Managed->ScreenToGameViewport(screenPos);
#else
auto win = Engine::MainWindow;
return win ? win->ScreenToClient(screenPos) : Vector2::Minimum;
#endif
}
Vector2 Screen::GameViewportToScreen(const Vector2& viewportPos)
{
#if USE_EDITOR
return Editor::Managed->GameViewportToScreen(viewportPos);
#else
auto win = Engine::MainWindow;
return win ? win->ClientToScreen(viewportPos) : Vector2::Minimum;
#endif
}
bool Screen::GetCursorVisible()
{
#if USE_EDITOR

View File

@@ -33,6 +33,20 @@ DECLARE_SCRIPTING_TYPE_NO_SPAWN(Screen);
/// <returns>The value</returns>
API_PROPERTY() static Vector2 GetSize();
/// <summary>
/// Converts the screen-space position to the game viewport position.
/// </summary>
/// <param name="screenPos">The screen-space position.</param>
/// <returns>The game viewport position.</returns>
API_FUNCTION() static Vector2 ScreenToGameViewport(const Vector2& screenPos);
/// <summary>
/// Converts the game viewport position to the screen-space position.
/// </summary>
/// <param name="viewportPos">The game viewport position.</param>
/// <returns>The screen-space position.</returns>
API_FUNCTION() static Vector2 GameViewportToScreen(const Vector2& viewportPos);
/// <summary>
/// Sets the window size.
/// </summary>

View File

@@ -339,14 +339,14 @@ bool Input::GetKeyUp(const KeyboardKeys key)
Vector2 Input::GetMousePosition()
{
return Mouse ? Engine::ScreenToGameViewport(Mouse->GetPosition()) : Vector2::Minimum;
return Mouse ? Screen::ScreenToGameViewport(Mouse->GetPosition()) : Vector2::Minimum;
}
void Input::SetMousePosition(const Vector2& position)
{
if (Mouse && Engine::HasGameViewportFocus())
{
const auto pos = Engine::GameViewportToScreen(position);
const auto pos = Screen::GameViewportToScreen(position);
if (pos > Vector2::Minimum)
Mouse->SetMousePosition(pos);
}

View File

@@ -101,12 +101,12 @@ void Camera::SetOrthographicScale(float value)
}
}
void Camera::ProjectPoint(const Vector3& worldSpaceLocation, Vector2& screenSpaceLocation) const
void Camera::ProjectPoint(const Vector3& worldSpaceLocation, Vector2& gameWindowSpaceLocation) const
{
ProjectPoint(worldSpaceLocation, screenSpaceLocation, GetViewport());
ProjectPoint(worldSpaceLocation, gameWindowSpaceLocation, GetViewport());
}
void Camera::ProjectPoint(const Vector3& worldSpaceLocation, Vector2& screenSpaceLocation, const Viewport& viewport) const
void Camera::ProjectPoint(const Vector3& worldSpaceLocation, Vector2& cameraViewportSpaceLocation, const Viewport& viewport) const
{
Matrix v, p, vp;
GetMatrices(v, p, viewport);
@@ -114,7 +114,7 @@ void Camera::ProjectPoint(const Vector3& worldSpaceLocation, Vector2& screenSpac
Vector3 clipSpaceLocation;
Vector3::Transform(worldSpaceLocation, vp, clipSpaceLocation);
viewport.Project(worldSpaceLocation, vp, clipSpaceLocation);
screenSpaceLocation = Vector2(clipSpaceLocation);
cameraViewportSpaceLocation = Vector2(clipSpaceLocation);
}
Ray Camera::ConvertMouseToRay(const Vector2& mousePosition) const

View File

@@ -174,19 +174,19 @@ public:
public:
/// <summary>
/// Projects the point from 3D world-space to the camera screen-space (in screen pixels for default viewport calculated from <see cref="Viewport"/>).
/// Projects the point from 3D world-space to game window coordinates (in screen pixels for default viewport calculated from <see cref="Viewport"/>).
/// </summary>
/// <param name="worldSpaceLocation">The input world-space location (XYZ in world).</param>
/// <param name="screenSpaceLocation">The output screen-space location (XY in screen pixels).</param>
API_FUNCTION() void ProjectPoint(const Vector3& worldSpaceLocation, API_PARAM(Out) Vector2& screenSpaceLocation) const;
/// <param name="gameWindowSpaceLocation">The output game window coordinates (XY in screen pixels).</param>
API_FUNCTION() void ProjectPoint(const Vector3& worldSpaceLocation, API_PARAM(Out) Vector2& gameWindowSpaceLocation) const;
/// <summary>
/// Projects the point from 3D world-space to the camera screen-space (in screen pixels for given viewport).
/// Projects the point from 3D world-space to the camera viewport-space (in screen pixels for given viewport).
/// </summary>
/// <param name="worldSpaceLocation">The input world-space location (XYZ in world).</param>
/// <param name="screenSpaceLocation">The output screen-space location (XY in screen pixels).</param>
/// <param name="cameraViewportSpaceLocation">The output camera viewport-space location (XY in screen pixels).</param>
/// <param name="viewport">The viewport.</param>
API_FUNCTION() void ProjectPoint(const Vector3& worldSpaceLocation, API_PARAM(Out) Vector2& screenSpaceLocation, API_PARAM(Ref) const Viewport& viewport) const;
API_FUNCTION() void ProjectPoint(const Vector3& worldSpaceLocation, API_PARAM(Out) Vector2& cameraViewportSpaceLocation, API_PARAM(Ref) const Viewport& viewport) const;
/// <summary>
/// Converts the mouse position to 3D ray.