summaryrefslogtreecommitdiff
path: root/VRCSDK3Worlds/Assets/Bakery/BakeryPointLight.cs
diff options
context:
space:
mode:
authortylermurphy534 <tylermurphy534@gmail.com>2022-11-06 15:12:42 -0500
committertylermurphy534 <tylermurphy534@gmail.com>2022-11-06 15:12:42 -0500
commiteb84bb298d2b95aec7b2ae12cbf25ac64f25379a (patch)
treeefd616a157df06ab661c6d56651853431ac6b08b /VRCSDK3Worlds/Assets/Bakery/BakeryPointLight.cs
downloadunityprojects-eb84bb298d2b95aec7b2ae12cbf25ac64f25379a.tar.gz
unityprojects-eb84bb298d2b95aec7b2ae12cbf25ac64f25379a.tar.bz2
unityprojects-eb84bb298d2b95aec7b2ae12cbf25ac64f25379a.zip
move to self host
Diffstat (limited to 'VRCSDK3Worlds/Assets/Bakery/BakeryPointLight.cs')
-rw-r--r--VRCSDK3Worlds/Assets/Bakery/BakeryPointLight.cs191
1 files changed, 191 insertions, 0 deletions
diff --git a/VRCSDK3Worlds/Assets/Bakery/BakeryPointLight.cs b/VRCSDK3Worlds/Assets/Bakery/BakeryPointLight.cs
new file mode 100644
index 00000000..170b1466
--- /dev/null
+++ b/VRCSDK3Worlds/Assets/Bakery/BakeryPointLight.cs
@@ -0,0 +1,191 @@
+using UnityEngine;
+
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+[ExecuteInEditMode]
+[DisallowMultipleComponent]
+public class BakeryPointLight : MonoBehaviour
+{
+ public enum ftLightProjectionMode
+ {
+ Omni = 0,
+ Cookie = 1,
+ Cubemap = 2,
+ IES = 3,
+ Cone = 4
+ };
+
+ public enum Direction
+ {
+ NegativeY = 0,
+ PositiveZ = 1
+ };
+
+ public int UID;
+ public Color color = Color.white;
+ public float intensity = 1.0f;
+ public float shadowSpread = 0.05f;
+ public float cutoff = 10.0f;
+ public bool realisticFalloff = false;
+ public int samples = 8;
+ public ftLightProjectionMode projMode;
+ public Texture2D cookie;
+ public float angle = 30.0f;
+ public float innerAngle = 0;
+ public Cubemap cubemap;
+ public UnityEngine.Object iesFile;
+ public int bitmask = 1;
+ public bool bakeToIndirect = false;
+ public bool shadowmask = false;
+ public float indirectIntensity = 1.0f;
+ public float falloffMinRadius = 1.0f;
+ public int shadowmaskGroupID = 0;
+ public Direction directionMode = Direction.NegativeY;
+
+ const float GIZMO_MAXSIZE = 0.1f;
+ const float GIZMO_SCALE = 0.01f;
+ float screenRadius = GIZMO_MAXSIZE;
+
+ public static int lightsChanged = 0; // 1 = const, 2 = full
+
+#if UNITY_EDITOR
+ void OnValidate()
+ {
+ if (lightsChanged == 0) lightsChanged = 1;
+ }
+ void OnEnable()
+ {
+ lightsChanged = 2;
+ }
+ void OnDisable()
+ {
+ lightsChanged = 2;
+ }
+
+ public void Start()
+ {
+ if (gameObject.GetComponent<BakeryDirectLight>() != null ||
+ gameObject.GetComponent<BakerySkyLight>() != null ||
+ gameObject.GetComponent<BakeryLightMesh>() != null)
+ {
+ EditorUtility.DisplayDialog("Bakery", "Can't have more than one Bakery light on one object", "OK");
+ DestroyImmediate(this);
+ return;
+ }
+
+ if (EditorApplication.isPlayingOrWillChangePlaymode) return;
+ if (UID == 0) UID = Guid.NewGuid().GetHashCode();
+ ftUniqueIDRegistry.Register(UID, gameObject.GetInstanceID());
+ }
+
+ void OnDestroy()
+ {
+ if (UID == 0) return;
+ if (EditorApplication.isPlayingOrWillChangePlaymode) return;
+ ftUniqueIDRegistry.Deregister(UID);
+ }
+
+ void Update()
+ {
+ if (EditorApplication.isPlayingOrWillChangePlaymode) return;
+ if (!ftUniqueIDRegistry.Mapping.ContainsKey(UID)) ftUniqueIDRegistry.Register(UID, gameObject.GetInstanceID());
+ if (gameObject.GetInstanceID() != ftUniqueIDRegistry.GetInstanceId(UID))
+ {
+ UID = Guid.NewGuid().GetHashCode();
+ ftUniqueIDRegistry.Register(UID, gameObject.GetInstanceID());
+ }
+ }
+
+ void OnDrawGizmos()
+ {
+ Gizmos.color = color;
+ var curCam = Camera.current;
+ if (curCam != null)
+ {
+ screenRadius = Mathf.Min((transform.position - curCam.transform.position).magnitude * GIZMO_SCALE, GIZMO_MAXSIZE);
+ }
+ Gizmos.DrawSphere(transform.position, screenRadius);
+ }
+
+ void DrawArrow(Vector3 a, Vector3 b)
+ {
+ //const float len = 0.125f;
+
+ b = a + b * (shadowSpread + 0.05f);
+ Gizmos.DrawLine(a, b);
+ }
+
+ void OnDrawGizmosSelected()
+ {
+ Gizmos.color = color;//Color.yellow;
+ Gizmos.DrawWireSphere(transform.position, shadowSpread);
+
+ Gizmos.color = new Color(color.r, color.g, color.b, 0.25f);//Color.gray;
+ if (projMode != ftLightProjectionMode.Cookie && projMode != ftLightProjectionMode.Cone) Gizmos.DrawWireSphere(transform.position, cutoff);
+
+ if (projMode != 0)
+ {
+ Gizmos.color = color;//Color.yellow;
+ Vector3 endPoint;
+ if (projMode == ftLightProjectionMode.Cookie || projMode == ftLightProjectionMode.Cone)
+ {
+ endPoint = transform.forward * 2;
+ Gizmos.DrawRay(transform.position, endPoint);
+
+ float angle2 = (180 - angle) * Mathf.Deg2Rad * 0.5f;
+ //float x = Mathf.Cos(angle2);
+ //float radius = x * cutoff;
+
+ float x = 1 / Mathf.Sin(angle2);
+ x = Mathf.Sqrt(x * x - 1);
+ float radius = x * cutoff;
+
+ const int segments = 16;
+ for(int i=0; i<segments; i++)
+ {
+ float p1 = i / (float)segments;
+ float p2 = (i+1) / (float)segments;
+
+ float x1 = Mathf.Cos(p1 * Mathf.PI*2);
+ float y1 = Mathf.Sin(p1 * Mathf.PI*2);
+
+ float x2 = Mathf.Cos(p2 * Mathf.PI*2);
+ float y2 = Mathf.Sin(p2 * Mathf.PI*2);
+
+ Vector3 A = transform.position + transform.forward * cutoff + transform.right * x1 * radius + transform.up * y1 * radius;
+ Vector3 B = transform.position + transform.forward * cutoff + transform.right * x2 * radius + transform.up * y2 * radius;
+ Gizmos.DrawLine(A, B);
+
+ if (i % 4 == 0) Gizmos.DrawLine(transform.position, A);
+ }
+ }
+ else
+ {
+ if (projMode == ftLightProjectionMode.IES && directionMode == Direction.PositiveZ)
+ {
+ endPoint = transform.forward * 2;
+ }
+ else
+ {
+ endPoint = -transform.up * 2;
+ }
+ Gizmos.DrawRay(transform.position, endPoint);
+ }
+ endPoint += transform.position;
+ Gizmos.DrawLine(endPoint, endPoint + (transform.position + transform.right - endPoint).normalized * 0.5f);
+ Gizmos.DrawLine(endPoint, endPoint + (transform.position - transform.right - endPoint).normalized * 0.5f);
+ Gizmos.DrawLine(endPoint, endPoint + (transform.position + transform.up - endPoint).normalized * 0.5f);
+ Gizmos.DrawLine(endPoint, endPoint + (transform.position - transform.up - endPoint).normalized * 0.5f);
+ }
+ }
+#endif
+}
+
+
+