Merge remote-tracking branch 'origin/master' into 1.9
This commit is contained in:
@@ -39,6 +39,7 @@ Camera::Camera(const SpawnParams& params)
|
||||
, _customAspectRatio(0.0f)
|
||||
, _near(10.0f)
|
||||
, _far(40000.0f)
|
||||
, _orthoSize(0.0f)
|
||||
, _orthoScale(1.0f)
|
||||
{
|
||||
#if USE_EDITOR
|
||||
@@ -120,6 +121,21 @@ void Camera::SetFarPlane(float value)
|
||||
}
|
||||
}
|
||||
|
||||
float Camera::GetOrthographicSize() const
|
||||
{
|
||||
return _orthoSize;
|
||||
}
|
||||
|
||||
void Camera::SetOrthographicSize(float value)
|
||||
{
|
||||
value = Math::Clamp(value, 0.0f, 1000000.0f);
|
||||
if (Math::NotNearEqual(_orthoSize, value))
|
||||
{
|
||||
_orthoSize = value;
|
||||
UpdateCache();
|
||||
}
|
||||
}
|
||||
|
||||
float Camera::GetOrthographicScale() const
|
||||
{
|
||||
return _orthoScale;
|
||||
@@ -191,39 +207,37 @@ Ray Camera::ConvertMouseToRay(const Float2& mousePosition) const
|
||||
|
||||
Ray Camera::ConvertMouseToRay(const Float2& mousePosition, const Viewport& viewport) const
|
||||
{
|
||||
#if 1
|
||||
// Gather camera properties
|
||||
Vector3 position = GetPosition();
|
||||
if (viewport.Width < ZeroTolerance || viewport.Height < ZeroTolerance)
|
||||
return Ray(position, GetDirection());
|
||||
|
||||
// Use different logic in orthographic projection
|
||||
if (!_usePerspective)
|
||||
{
|
||||
Float2 screenPosition(mousePosition.X / viewport.Width - 0.5f, -mousePosition.Y / viewport.Height + 0.5f);
|
||||
Quaternion orientation = GetOrientation();
|
||||
Float3 direction = orientation * Float3::Forward;
|
||||
const float orthoSize = (_orthoSize > 0.0f ? _orthoSize : viewport.Height) * _orthoScale;
|
||||
const float aspect = _customAspectRatio <= 0.0f ? viewport.GetAspectRatio() : _customAspectRatio;
|
||||
Vector3 rayOrigin(screenPosition.X * orthoSize * aspect, screenPosition.Y * orthoSize, 0);
|
||||
rayOrigin = position + Vector3::Transform(rayOrigin, orientation);
|
||||
rayOrigin += direction * _near;
|
||||
return Ray(rayOrigin, direction);
|
||||
}
|
||||
|
||||
// Create view frustum
|
||||
Matrix v, p, ivp;
|
||||
GetMatrices(v, p, viewport);
|
||||
Matrix::Multiply(v, p, ivp);
|
||||
ivp.Invert();
|
||||
|
||||
// Create near and far points
|
||||
Vector3 nearPoint(mousePosition, 0.0f);
|
||||
Vector3 farPoint(mousePosition, 1.0f);
|
||||
Vector3 nearPoint(mousePosition, _near);
|
||||
Vector3 farPoint(mousePosition, _far);
|
||||
viewport.Unproject(nearPoint, ivp, nearPoint);
|
||||
viewport.Unproject(farPoint, ivp, farPoint);
|
||||
|
||||
// Create direction vector
|
||||
Vector3 direction = farPoint - nearPoint;
|
||||
direction.Normalize();
|
||||
|
||||
return Ray(nearPoint, direction);
|
||||
#else
|
||||
// Create near and far points
|
||||
Vector3 nearPoint, farPoint;
|
||||
Matrix ivp;
|
||||
_frustum.GetInvMatrix(&ivp);
|
||||
viewport.Unproject(Vector3(mousePosition, 0.0f), ivp, nearPoint);
|
||||
viewport.Unproject(Vector3(mousePosition, 1.0f), ivp, farPoint);
|
||||
|
||||
// Create direction vector
|
||||
Vector3 direction = farPoint - nearPoint;
|
||||
direction.Normalize();
|
||||
|
||||
// Return result
|
||||
return Ray(nearPoint, direction);
|
||||
#endif
|
||||
return Ray(nearPoint, Vector3::Normalize(farPoint - nearPoint));
|
||||
}
|
||||
|
||||
Viewport Camera::GetViewport() const
|
||||
@@ -264,14 +278,15 @@ void Camera::GetMatrices(Matrix& view, Matrix& projection, const Viewport& viewp
|
||||
void Camera::GetMatrices(Matrix& view, Matrix& projection, const Viewport& viewport, const Vector3& origin) const
|
||||
{
|
||||
// Create projection matrix
|
||||
const float aspect = _customAspectRatio <= 0.0f ? viewport.GetAspectRatio() : _customAspectRatio;
|
||||
if (_usePerspective)
|
||||
{
|
||||
const float aspect = _customAspectRatio <= 0.0f ? viewport.GetAspectRatio() : _customAspectRatio;
|
||||
Matrix::PerspectiveFov(_fov * DegreesToRadians, aspect, _near, _far, projection);
|
||||
}
|
||||
else
|
||||
{
|
||||
Matrix::Ortho(viewport.Width * _orthoScale, viewport.Height * _orthoScale, _near, _far, projection);
|
||||
const float orthoSize = (_orthoSize > 0.0f ? _orthoSize : viewport.Height) * _orthoScale;
|
||||
Matrix::Ortho(orthoSize * aspect, orthoSize, _near, _far, projection);
|
||||
}
|
||||
|
||||
// Create view matrix
|
||||
|
||||
Reference in New Issue
Block a user