198 lines
8.2 KiB
C#
198 lines
8.2 KiB
C#
|
using UnityEngine;
|
||
|
using System;
|
||
|
using UnityEditor;
|
||
|
using System.Collections.Generic;
|
||
|
|
||
|
#if CINEMACHINE_HDRP || CINEMACHINE_LWRP_7_3_1
|
||
|
#if CINEMACHINE_HDRP_7_3_1
|
||
|
using UnityEngine.Rendering.HighDefinition;
|
||
|
#else
|
||
|
#if CINEMACHINE_LWRP_7_3_1
|
||
|
using UnityEngine.Rendering.Universal;
|
||
|
#else
|
||
|
using UnityEngine.Experimental.Rendering.HDPipeline;
|
||
|
#endif
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
namespace Cinemachine.Editor
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// User-definable named presets for lenses. This is a Singleton asset, available in editor only
|
||
|
/// </summary>
|
||
|
[DocumentationSorting(DocumentationSortingAttribute.Level.UserRef)]
|
||
|
[Serializable]
|
||
|
public sealed class CinemachineLensPresets : ScriptableObject
|
||
|
{
|
||
|
private static CinemachineLensPresets sInstance = null;
|
||
|
private static bool alreadySearched = false;
|
||
|
|
||
|
/// <summary>Get the singleton instance of this object, or null if it doesn't exist</summary>
|
||
|
public static CinemachineLensPresets InstanceIfExists
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (!alreadySearched)
|
||
|
{
|
||
|
alreadySearched = true;
|
||
|
var guids = AssetDatabase.FindAssets("t:CinemachineLensPresets");
|
||
|
for (int i = 0; i < guids.Length && sInstance == null; ++i)
|
||
|
sInstance = AssetDatabase.LoadAssetAtPath<CinemachineLensPresets>(
|
||
|
AssetDatabase.GUIDToAssetPath(guids[i]));
|
||
|
}
|
||
|
return sInstance;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>Get the singleton instance of this object. Creates asset if nonexistant</summary>
|
||
|
public static CinemachineLensPresets Instance
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (InstanceIfExists == null)
|
||
|
{
|
||
|
string newAssetPath = EditorUtility.SaveFilePanelInProject(
|
||
|
"Create Lens Presets asset", "CinemachineLensPresets", "asset",
|
||
|
"This editor-only file will contain the lens presets for this project");
|
||
|
if (!string.IsNullOrEmpty(newAssetPath))
|
||
|
{
|
||
|
sInstance = CreateInstance<CinemachineLensPresets>();
|
||
|
// Create some sample presets
|
||
|
List<Preset> defaults = new List<Preset>();
|
||
|
defaults.Add(new Preset() { m_Name = "21mm", m_FieldOfView = 60f } );
|
||
|
defaults.Add(new Preset() { m_Name = "35mm", m_FieldOfView = 38f } );
|
||
|
defaults.Add(new Preset() { m_Name = "58mm", m_FieldOfView = 23f } );
|
||
|
defaults.Add(new Preset() { m_Name = "80mm", m_FieldOfView = 17f } );
|
||
|
defaults.Add(new Preset() { m_Name = "125mm", m_FieldOfView = 10f } );
|
||
|
sInstance.m_Presets = defaults.ToArray();
|
||
|
AssetDatabase.CreateAsset(sInstance, newAssetPath);
|
||
|
AssetDatabase.SaveAssets();
|
||
|
AssetDatabase.Refresh();
|
||
|
}
|
||
|
}
|
||
|
return sInstance;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>Lens Preset</summary>
|
||
|
[DocumentationSorting(DocumentationSortingAttribute.Level.UserRef)]
|
||
|
[Serializable]
|
||
|
public struct Preset
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Name of the preset
|
||
|
/// </summary>
|
||
|
[Tooltip("Lens Name")]
|
||
|
public string m_Name;
|
||
|
|
||
|
/// <summary>
|
||
|
/// This is the camera view in vertical degrees. For cinematic people, a 50mm lens
|
||
|
/// on a super-35mm sensor would equal a 19.6 degree FOV
|
||
|
/// </summary>
|
||
|
[Range(1f, 179f)]
|
||
|
[Tooltip("This is the camera view in vertical degrees. For cinematic people, "
|
||
|
+ " a 50mm lens on a super-35mm sensor would equal a 19.6 degree FOV")]
|
||
|
public float m_FieldOfView;
|
||
|
}
|
||
|
/// <summary>The array containing Preset definitions for nonphysical cameras</summary>
|
||
|
[Tooltip("The array containing Preset definitions, for nonphysical cameras")]
|
||
|
public Preset[] m_Presets = new Preset[0];
|
||
|
|
||
|
/// <summary>Physical Lens Preset</summary>
|
||
|
[DocumentationSorting(DocumentationSortingAttribute.Level.UserRef)]
|
||
|
[Serializable]
|
||
|
public struct PhysicalPreset
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Name of the preset
|
||
|
/// </summary>
|
||
|
[Tooltip("Lens Name")]
|
||
|
public string m_Name;
|
||
|
|
||
|
/// <summary>
|
||
|
/// This is the camera focal length in mm
|
||
|
/// </summary>
|
||
|
[Tooltip("This is the camera focal length in mm")]
|
||
|
public float m_FocalLength;
|
||
|
|
||
|
/// <summary>Position of the gate relative to the film back</summary>
|
||
|
public Vector2 LensShift;
|
||
|
|
||
|
#if CINEMACHINE_HDRP
|
||
|
public int Iso;
|
||
|
public float ShutterSpeed;
|
||
|
[Range(HDPhysicalCamera.kMinAperture, HDPhysicalCamera.kMaxAperture)]
|
||
|
public float Aperture;
|
||
|
[Range(HDPhysicalCamera.kMinBladeCount, HDPhysicalCamera.kMaxBladeCount)]
|
||
|
public int BladeCount;
|
||
|
public Vector2 Curvature;
|
||
|
[Range(0, 1)]
|
||
|
public float BarrelClipping;
|
||
|
[Range(-1, 1)]
|
||
|
public float Anamorphism;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
/// <summary>The array containing Preset definitions, for physical cameras</summary>
|
||
|
[Tooltip("The array containing Preset definitions, for physical cameras")]
|
||
|
public PhysicalPreset[] m_PhysicalPresets = new PhysicalPreset[0];
|
||
|
|
||
|
/// <summary>Get the index of the preset that matches the lens settings</summary>
|
||
|
/// <param name="verticalFOV">Vertical field of view</param>
|
||
|
/// <returns>the preset index, or -1 if no matching preset</returns>
|
||
|
public int GetMatchingPreset(float verticalFOV)
|
||
|
{
|
||
|
for (int i = 0; i < m_Presets.Length; ++i)
|
||
|
if (Mathf.Approximately(m_Presets[i].m_FieldOfView, verticalFOV))
|
||
|
return i;
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
/// <summary>Get the index of the physical preset that matches the lens settings</summary>
|
||
|
/// <param name="focalLength">Focal length to match</param>
|
||
|
/// <returns>the preset index, or -1 if no matching preset</returns>
|
||
|
public int GetMatchingPhysicalPreset(float focalLength)
|
||
|
{
|
||
|
for (int i = 0; i < m_PhysicalPresets.Length; ++i)
|
||
|
if (Mathf.Approximately(m_PhysicalPresets[i].m_FocalLength, focalLength))
|
||
|
return i;
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
#if CINEMACHINE_HDRP
|
||
|
/// <summary>Get the index of the physical preset that matches the lens settings</summary>
|
||
|
/// <returns>the preset index, or -1 if no matching preset</returns>
|
||
|
public int GetMatchingPhysicalPreset(
|
||
|
float FocalLength,
|
||
|
int Iso,
|
||
|
float ShutterSpeed,
|
||
|
float Aperture,
|
||
|
int BladeCount,
|
||
|
Vector2 Curvature,
|
||
|
float BarrelClipping,
|
||
|
float Anamorphism,
|
||
|
Vector2 LensShift)
|
||
|
{
|
||
|
for (int i = 0; i < m_PhysicalPresets.Length; ++i)
|
||
|
{
|
||
|
if (Mathf.Approximately(m_PhysicalPresets[i].m_FocalLength, FocalLength)
|
||
|
&& m_PhysicalPresets[i].Iso == Iso
|
||
|
&& Mathf.Approximately(m_PhysicalPresets[i].ShutterSpeed, ShutterSpeed)
|
||
|
&& Mathf.Approximately(m_PhysicalPresets[i].Aperture, Aperture)
|
||
|
&& m_PhysicalPresets[i].BladeCount == BladeCount
|
||
|
&& Mathf.Approximately(m_PhysicalPresets[i].Curvature.x, Curvature.x)
|
||
|
&& Mathf.Approximately(m_PhysicalPresets[i].Curvature.y, Curvature.y)
|
||
|
&& Mathf.Approximately(m_PhysicalPresets[i].BarrelClipping, BarrelClipping)
|
||
|
&& Mathf.Approximately(m_PhysicalPresets[i].Anamorphism, Anamorphism)
|
||
|
&& Mathf.Approximately(m_PhysicalPresets[i].LensShift.x, LensShift.x)
|
||
|
&& Mathf.Approximately(m_PhysicalPresets[i].LensShift.y, LensShift.y))
|
||
|
{
|
||
|
return i;
|
||
|
}
|
||
|
}
|
||
|
return -1;
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
}
|