// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
namespace FlaxEngine
{
partial struct RenderView
{
///
/// Initializes this view with default options.
///
public void Init()
{
MaxShadowsQuality = Quality.Ultra;
ModelLODDistanceFactor = 1.0f;
ModelLODDistanceFactorSqrt = 1.0f;
ShadowModelLODDistanceFactor = 1.0f;
Flags = ViewFlags.DefaultGame;
Mode = ViewMode.Default;
}
///
/// Updates the cached data for the view (inverse matrices, etc.).
///
public void UpdateCachedData()
{
Matrix.Invert(ref View, out IV);
Matrix.Invert(ref Projection, out IP);
Matrix.Multiply(ref View, ref Projection, out var viewProjection);
Frustum = new BoundingFrustum(viewProjection);
Matrix.Invert(ref viewProjection, out IVP);
CullingFrustum = Frustum;
}
///
/// Initializes render view data.
///
/// The view.
/// The projection.
public void SetUp(ref Matrix view, ref Matrix projection)
{
Position = view.TranslationVector;
Projection = projection;
NonJitteredProjection = projection;
TemporalAAJitter = Vector4.Zero;
View = view;
UpdateCachedData();
}
///
/// Set up view for projector rendering.
///
/// Near plane
/// Far plane
/// Camera's position
/// Camera's direction vector
/// Camera's up vector
/// Camera's FOV angle (in degrees)
public void SetProjector(float nearPlane, float farPlane, Vector3 position, Vector3 direction, Vector3 up, float angle)
{
// Copy data
Near = nearPlane;
Far = farPlane;
Position = position;
// Create projection matrix
Matrix.PerspectiveFov(angle * Mathf.DegreesToRadians, 1.0f, nearPlane, farPlane, out Projection);
NonJitteredProjection = Projection;
TemporalAAJitter = Vector4.Zero;
// Create view matrix
Direction = direction;
Vector3 target = Position + Direction;
Matrix.LookAt(ref Position, ref target, ref up, out View);
UpdateCachedData();
}
///
/// Copies render view data from the camera.
///
/// The camera.
public void CopyFrom(Camera camera)
{
Position = camera.Position;
Direction = camera.Direction;
Near = camera.NearPlane;
Far = camera.FarPlane;
View = camera.View;
Projection = camera.Projection;
NonJitteredProjection = Projection;
TemporalAAJitter = Vector4.Zero;
UpdateCachedData();
}
///
/// Copies render view data from the camera.
///
/// The camera.
/// The custom viewport to use for view/projeection matrices override.
public void CopyFrom(Camera camera, ref Viewport customViewport)
{
Position = camera.Position;
Direction = camera.Direction;
Near = camera.NearPlane;
Far = camera.FarPlane;
camera.GetMatrices(out View, out Projection, ref customViewport);
NonJitteredProjection = Projection;
TemporalAAJitter = Vector4.Zero;
UpdateCachedData();
}
}
}