summaryrefslogtreecommitdiff
path: root/Assets/ProFlares/Scripts/ProFlare.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/ProFlares/Scripts/ProFlare.cs')
-rw-r--r--Assets/ProFlares/Scripts/ProFlare.cs437
1 files changed, 437 insertions, 0 deletions
diff --git a/Assets/ProFlares/Scripts/ProFlare.cs b/Assets/ProFlares/Scripts/ProFlare.cs
new file mode 100644
index 0000000..d73abd9
--- /dev/null
+++ b/Assets/ProFlares/Scripts/ProFlare.cs
@@ -0,0 +1,437 @@
+/// ProFlares - v1.08 - Copyright 2014-2015 All rights reserved - ProFlares.com
+
+
+/// <summary>
+/// ProFlare.cs
+/// Holds the definition of a flare and all of its features.
+/// </summary>
+
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+
+
+[System.Serializable]
+public class SubElement{
+ public Color color = Color.white;
+ public Color colorFinal = Color.white;
+ public float position = 0;
+ public Vector3 offset = Vector2.zero;
+ public float angle = 0;
+ public float scale = 0;
+ public float random = 0.5f;
+ public float random2= 0.5f;
+ public float RandomScaleSeed= 0.5f;
+ public float RandomColorSeedR = 0.5f;
+ public float RandomColorSeedG = 0.5f;
+ public float RandomColorSeedB = 0.5f;
+ public float RandomColorSeedA = 0.5f;
+}
+
+[System.Serializable]
+public class ProFlareElement{
+
+ public bool Editing;
+
+ public bool Visible = true;
+
+ //Element's texture index inside the texture atlas.
+ public int elementTextureID;
+
+ //Elements Sprite name from the texture atlas, this isn't checked at runtime. Its only used to help stop flares breaking when the atlas changes.
+ public string SpriteName;
+
+ public ProFlare flare;
+
+ public ProFlareAtlas flareAtlas;
+
+ public float Brightness = 1;
+ public float Scale = 1;
+ public float ScaleRandom = 0;
+ public float ScaleFinal = 1;
+
+ public Vector4 RandomColorAmount = Vector4.zero;
+
+ //Element OffSet Properties
+ public float position;
+
+ public bool useRangeOffset = false;
+
+ public float SubElementPositionRange_Min = -1f;
+ public float SubElementPositionRange_Max = 1f;
+
+ public float SubElementAngleRange_Min = -180f;
+ public float SubElementAngleRange_Max = 180f;
+
+
+ public Vector3 OffsetPosition;
+
+ public Vector3 Anamorphic = Vector3.zero;
+
+ public Vector3 OffsetPostion = Vector3.zero;
+
+
+ //Element Rotation Properties
+ public float angle = 0;
+ public float FinalAngle = 0; //Final angle used by FlareBatch
+ public bool useRandomAngle;
+ public bool useStarRotation;
+ public float AngleRandom_Min;
+ public float AngleRandom_Max;
+ public bool OrientToSource;
+ public bool rotateToFlare;
+ public float rotationSpeed;
+ public float rotationOverTime;
+
+
+ //Colour Properties,
+ public bool useColorRange;
+
+ public Color ElementFinalColor;
+
+ public Color ElementTint = new Color(1,1,1,0.33f);
+
+
+ public Color SubElementColor_Start = Color.white;
+ public Color SubElementColor_End = Color.white;
+
+ //Scale Curve
+ public bool useScaleCurve;
+ public AnimationCurve ScaleCurve = new AnimationCurve(new Keyframe(0, 0.1f), new Keyframe(0.5f, 1.0f), new Keyframe(1.0f, 0.1f));
+
+
+ //Override Properties
+ public bool OverrideDynamicEdgeBoost;
+ public float DynamicEdgeBoostOverride = 1f;
+
+ public bool OverrideDynamicCenterBoost;
+ public float DynamicCenterBoostOverride = 1f;
+
+ public bool OverrideDynamicEdgeBrightness;
+ public float DynamicEdgeBrightnessOverride = 0.4f;
+
+ public bool OverrideDynamicCenterBrightness;
+ public float DynamicCenterBrightnessOverride = 0.4f;
+
+ //public SubElement[] subElements;
+ public List<SubElement> subElements = new List<SubElement>();
+
+
+
+ public Vector2 size = Vector2.one;
+
+ public enum Type{
+ Single,
+ Multi
+ }
+
+#if UNITY_EDITOR
+
+ public bool EditDynamicTriggering;
+ public bool EditOcclusion;
+
+ public bool ElementSetting;
+ public bool OffsetSetting;
+ public bool ColorSetting;
+ public bool ScaleSetting;
+ public bool RotationSetting;
+ public bool OverrideSetting;
+
+ public Texture2D colorTexture;
+ public bool colorTextureDirty;
+#endif
+
+ public Type type;
+}
+
+[ExecuteInEditMode]
+public class ProFlare : MonoBehaviour {
+
+
+ //Required External Objects
+ public ProFlareAtlas _Atlas;
+
+ public ProFlareBatch[] FlareBatches = new ProFlareBatch[0];
+
+ public bool EditingAtlas;
+
+ public bool isVisible = true;
+ //
+ public List<ProFlareElement> Elements = new List<ProFlareElement>();
+
+ //Cached Components
+ public Transform thisTransform;
+
+ //Screen space Flare Position
+ public Vector3 LensPosition;
+
+ //Global Settings
+ public bool EditGlobals;
+ public float GlobalScale = 100;
+ public bool MultiplyScaleByTransformScale = false;
+
+ public float GlobalBrightness = 1;
+ public Color GlobalTintColor = Color.white;
+
+
+ //Distance Fall off
+ public bool useMaxDistance = true;
+ public bool useDistanceScale = true;
+ public bool useDistanceFade = true;
+ public float GlobalMaxDistance = 150f;
+
+ //Angle Culling Properties
+ public bool UseAngleLimit;
+ public float maxAngle = 90f;
+ public bool UseAngleScale;
+ public bool UseAngleBrightness = true;
+ public bool UseAngleCurve;
+ public AnimationCurve AngleCurve = new AnimationCurve(new Keyframe(0, 0f), new Keyframe(1, 1.0f));
+
+ //Occlusion Properties
+ public LayerMask mask = 1;
+ public bool RaycastPhysics;
+ public bool Occluded = false;
+ public float OccludeScale = 1;
+
+#if UNITY_EDITOR
+ public GameObject OccludingObject;
+#endif
+
+ //Editor Inspector Toggles.
+#if UNITY_EDITOR
+ public bool EditDynamicTriggering;
+ public bool EditOcclusion;
+ public bool IoSetting;
+
+#endif
+
+
+ public float OffScreenFadeDist = 0.2f;
+
+ //Dynamic Edge Properties
+ public bool useDynamicEdgeBoost = false;
+ public float DynamicEdgeBoost = 1f;
+ public float DynamicEdgeBrightness = 0.1f;
+ public float DynamicEdgeRange = 0.3f;
+ public float DynamicEdgeBias = -0.1f;
+
+ public AnimationCurve DynamicEdgeCurve = new AnimationCurve(new Keyframe(0, 0f), new Keyframe(0.5f, 1), new Keyframe(1, 0f));
+
+ //Dynamic Center Properties
+ public bool useDynamicCenterBoost = false;
+ public float DynamicCenterBoost = 1f;
+ public float DynamicCenterBrightness = 0.2f;
+ public float DynamicCenterRange = 0.3f;
+ public float DynamicCenterBias = 0.0f;
+
+ public bool neverCull;
+
+
+ void Awake(){
+ DisabledPlayMode = false;
+ Initialised = false;
+ thisTransform = transform;
+ }
+
+ void Start(){
+ //Cache Transform.
+ thisTransform = transform;
+
+ if((_Atlas != null)&&(FlareBatches.Length == 0)){
+ PopulateFlareBatches();
+ }
+
+ if(!Initialised){
+ Init();
+ }
+
+ //Make Sure All elements reference the correct atlas.
+ for(int i = 0; i < Elements.Count; i++){
+ Elements[i].flareAtlas = _Atlas;
+ Elements[i].flare = this;
+ }
+ }
+
+
+ void PopulateFlareBatches(){
+
+ //Atlas is set but Flare is not try and find a FlareBatch with the same atlas;
+ ProFlareBatch[] flareBatchs = GameObject.FindObjectsOfType(typeof(ProFlareBatch)) as ProFlareBatch[];
+ int matchCount = 0;
+
+ foreach (ProFlareBatch flareBatch in flareBatchs){
+ if (flareBatch._atlas == _Atlas){
+ matchCount++;
+ }
+ }
+
+ FlareBatches = new ProFlareBatch[matchCount];
+
+ int count = 0;
+
+ foreach (ProFlareBatch flareBatch in flareBatchs){
+ if (flareBatch._atlas == _Atlas){
+ FlareBatches[count] = flareBatch;
+ count++;
+ }
+ }
+ }
+
+ bool Initialised;
+
+ void Init(){
+
+ if(thisTransform == null)
+ thisTransform = transform;
+
+ if(_Atlas == null)
+ return;
+
+ PopulateFlareBatches();
+
+
+ //Make Sure All elements reference the correct atlas.
+ for(int i = 0; i < Elements.Count; i++){
+ Elements[i].flareAtlas = _Atlas;
+ }
+
+ //All Conditions met, add flare to flare batch.
+ for(int i = 0; i < FlareBatches.Length; i++){
+ if(FlareBatches[i] != null)
+ if(FlareBatches[i]._atlas == _Atlas)
+ FlareBatches[i].AddFlare(this);
+ }
+
+ Initialised = true;
+ }
+
+ public void ReInitialise(){
+ Initialised = false;
+ Init();
+ }
+
+ /// <summary>
+ /// Rebuilding the FlareBatch geometry is more expensive than just updating it, and can cause a small hickup in the frame
+ /// While in play mode, we avoid doing a full rebuild by using a 'soft' enable/disable. If Flare isn't in the FlareBatches list it will always be added.
+ /// </summary>
+
+ public bool DisabledPlayMode;
+ void OnEnable(){
+ if(Application.isPlaying && DisabledPlayMode){
+ DisabledPlayMode = false;
+ }else{
+ if(_Atlas)
+ for(int i = 0; i < FlareBatches.Length; i++){
+ if(FlareBatches[i] != null){
+ FlareBatches[i].dirty = true;
+ }else{
+ Initialised = false;
+ }
+ }
+ Init();
+ }
+ }
+
+ void OnDisable(){
+ if(Application.isPlaying){
+ DisabledPlayMode = true;
+ }else{
+
+ for(int i = 0; i < FlareBatches.Length; i++){
+
+ if(FlareBatches[i] != null){
+ FlareBatches[i].RemoveFlare(this);// .Flares.Remove(this);
+ FlareBatches[i].dirty = true;
+ }else{
+
+ Initialised = false;
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// If Flare is destroyed, it will be removed from the FlaresBatch List.
+ /// </summary>
+ void OnDestroy(){
+ for(int i = 0; i < FlareBatches.Length; i++){
+ if(FlareBatches[i] != null){
+// FlareBatches[i].Flares.Remove(this);
+ FlareBatches[i].RemoveFlare(this);// .Flares.Remove(this);
+ FlareBatches[i].dirty = true;
+ }else{
+ Initialised = false;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Helper piece of code that only runs while in the editor.
+ /// It checks the state of the flare against its atlas.
+ /// </summary>
+#if UNITY_EDITOR
+ void LateUpdate(){
+ for(int i = 0; i < Elements.Count; i++){
+ if(Elements[i].SpriteName == ""){
+ Elements[i].SpriteName = _Atlas.elementsList[Elements[i].elementTextureID].name;
+ }
+ }
+
+ for(int i = 0; i < Elements.Count; i++){
+
+ bool error = false;
+
+ if(!_Atlas)
+ continue;
+
+ if(Elements[i].elementTextureID >= _Atlas.elementsList.Count){
+ Debug.LogWarning("ProFlares - Elements ID No longer exists");
+ error = true;
+ }
+
+ if(!error)
+ if(Elements[i].SpriteName != _Atlas.elementsList[Elements[i].elementTextureID].name){
+ Debug.LogWarning("Pro Flares - Where did my elements go? - Lets try and find it. -" + Elements[i].SpriteName,gameObject);
+ error = true;
+ }
+
+ if(error){
+ bool Found = false;
+ for(int i2 = 0; i2 < _Atlas.elementsList.Count; i2++){
+ if(Elements[i].SpriteName == _Atlas.elementsList[i2].name){
+ Debug.LogWarning("Pro Flares - Ah its ok i Found it = "+Elements[i].SpriteName);
+ Found = true;
+ Elements[i].elementTextureID = i2;
+ for(int f = 0; f < FlareBatches.Length; f++){
+ FlareBatches[f].dirty = true;
+ }
+ }
+ }
+ if(!Found){
+ Debug.LogError("Pro Flares - NOOOO.... It must of been deleted, resetting to first in list. :( -" +Elements[i].SpriteName,gameObject);
+ Elements[i].elementTextureID = 0;
+ Elements[i].SpriteName = _Atlas.elementsList[0].name;
+ for(int f = 0; f < FlareBatches.Length; f++){
+ FlareBatches[f].dirty = true;
+ }
+ }
+ }
+ }
+ }
+#endif
+
+
+
+ void Update () {
+ if(!Initialised){
+ Init();
+ }
+ }
+
+ void OnDrawGizmos() {
+ Gizmos.color = GlobalTintColor;
+ Gizmos.DrawSphere(transform.position,0.1f);
+ //Gizmos.DrawIcon(transform.position,"ProFlaresGizmo.tga",true);
+ }
+}