using UnityEngine;
namespace VLB
{
public abstract class VolumetricLightBeamAbstractBase : MonoBehaviour
{
public const string ClassName = "VolumetricLightBeamAbstractBase";
public abstract BeamGeometryAbstractBase GetBeamGeometry();
protected abstract void SetBeamGeometryNull();
/// Has the geometry already been generated?
public bool hasGeometry { get { return GetBeamGeometry() != null; } }
/// Bounds of the geometry's mesh (if the geometry exists)
public Bounds bounds { get { return GetBeamGeometry() != null ? GetBeamGeometry().meshRenderer.bounds : new Bounds(Vector3.zero, Vector3.zero); } }
public abstract bool IsScalable();
public abstract Vector3 GetLossyScale();
// INTERNAL
#pragma warning disable 0414
[SerializeField] protected int pluginVersion = -1;
public int _INTERNAL_pluginVersion => pluginVersion;
#pragma warning restore 0414
public enum AttachedLightType { NoLight, OtherLight, SpotLight }
public Light GetLightSpotAttachedSlow(out AttachedLightType lightType)
{
var light = GetComponent();
if (light)
{
if (light.type == LightType.Spot)
{
lightType = AttachedLightType.SpotLight;
return light;
}
else
{
lightType = AttachedLightType.OtherLight;
return null;
}
}
lightType = AttachedLightType.NoLight;
return null;
}
protected Light m_CachedLightSpot = null;
public Light lightSpotAttached
{
get
{
#if UNITY_EDITOR
if (!Application.isPlaying) { AttachedLightType lightType; return GetLightSpotAttachedSlow(out lightType); }
#endif
return m_CachedLightSpot;
}
}
protected void InitLightSpotAttachedCached()
{
Debug.Assert(Application.isPlaying);
AttachedLightType lightType;
m_CachedLightSpot = GetLightSpotAttachedSlow(out lightType);
}
void OnDestroy()
{
DestroyBeam();
}
protected void DestroyBeam()
{
// do not destroy the beam GAO here in editor to prevent crash when we undo placing a beam in a prefab (with Unity 2021.3 and 2022.1)
// in editor, we delete the beam GAO through BeamGeometryAbstractBase.Update instead
if (Application.isPlaying)
BeamGeometryAbstractBase.DestroyBeamGeometryGameObject(GetBeamGeometry()); // Make sure to delete the GAO
SetBeamGeometryNull();
}
#if UNITY_EDITOR
public abstract Color ComputeColorAtDepth(float depthRatio);
public abstract int _EDITOR_GetInstancedMaterialID();
[System.Flags]
protected enum EditorDirtyFlags
{
Clean = 0,
Props = 1 << 1,
Mesh = 1 << 2,
BeamGeomGAO = 1 << 3,
FullBeamGeomGAO = Mesh | BeamGeomGAO,
Everything = Props | Mesh | BeamGeomGAO,
}
protected EditorDirtyFlags m_EditorDirtyFlags;
protected CachedLightProperties m_PrevCachedLightProperties;
protected void EditorHandleLightPropertiesUpdate()
{
// Handle edition of light properties in Editor
if (!Application.isPlaying)
{
var newProps = new CachedLightProperties(lightSpotAttached);
if (!newProps.Equals(m_PrevCachedLightProperties))
m_EditorDirtyFlags |= EditorDirtyFlags.Props;
m_PrevCachedLightProperties = newProps;
}
}
public UnityEditor.StaticEditorFlags GetStaticEditorFlagsForSubObjects()
{
// Apply the same static flags to the BeamGeometry and DustParticles than the VLB GAO
var flags = UnityEditor.GameObjectUtility.GetStaticEditorFlags(gameObject);
flags &= ~(
// remove the Lightmap static flag since it will generate error messages when selecting the BeamGeometry GAO in the editor
#if UNITY_2019_2_OR_NEWER
UnityEditor.StaticEditorFlags.ContributeGI
#else
UnityEditor.StaticEditorFlags.LightmapStatic
#endif
| UnityEditor.StaticEditorFlags.NavigationStatic
| UnityEditor.StaticEditorFlags.OffMeshLinkGeneration
| UnityEditor.StaticEditorFlags.OccluderStatic
);
return flags;
}
public bool _EditorIsDirty() { return m_EditorDirtyFlags != EditorDirtyFlags.Clean; }
public void _EditorSetMeshDirty() { m_EditorDirtyFlags |= EditorDirtyFlags.Mesh; }
public void _EditorSetBeamGeomDirty() { m_EditorDirtyFlags |= EditorDirtyFlags.FullBeamGeomGAO; }
#endif // UNITY_EDITOR
}
}