ArabDesert/Assets/Bakery/BakerySkyLight.cs

112 lines
3.0 KiB
C#

using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
using System;
using System.Collections;
using System.Collections.Generic;
[ExecuteInEditMode]
[DisallowMultipleComponent]
public class BakerySkyLight : MonoBehaviour
{
public string texName = "sky.dds";
public Color color = Color.white;
public float intensity = 1.0f;
public int samples = 32;
public bool hemispherical = false;
public int bitmask = 1;
public bool bakeToIndirect = true;
public float indirectIntensity = 1.0f;
public bool tangentSH = false;
public bool correctRotation = false;
public Cubemap cubemap;
public int UID;
public static int lightsChanged = 0; // 1 = const, 2 = full
static GameObject objShownError;
#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<BakeryPointLight>() != null ||
gameObject.GetComponent<BakeryLightMesh>() != null)
{
if (objShownError != gameObject)
{
EditorUtility.DisplayDialog("Bakery", "Can't have more than one Bakery light on one object", "OK");
objShownError = gameObject;
}
else
{
Debug.LogError("Can't have more than one Bakery light on one object");
}
DestroyImmediate(this);
return;
}
if (EditorApplication.isPlayingOrWillChangePlaymode) return;
if (UID == 0) UID = Guid.NewGuid().GetHashCode(); // legacy
}
void OnDrawGizmos()
{
Gizmos.color = new Color(49/255.0f, 91/255.0f, 191/255.0f);
Gizmos.DrawSphere(transform.position, 0.1f);
}
void OnDrawGizmosSelected()
{
Gizmos.color = new Color(49/255.0f, 91/255.0f, 191/255.0f);
Vector3 origin = transform.position;
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);
Gizmos.DrawLine(origin + new Vector3(x1,0,y1), origin + new Vector3(x2,0,y2));
if (hemispherical)
{
x1 = Mathf.Cos(p1 * Mathf.PI);
y1 = Mathf.Sin(p1 * Mathf.PI);
x2 = Mathf.Cos(p2 * Mathf.PI);
y2 = Mathf.Sin(p2 * Mathf.PI);
}
Gizmos.DrawLine(origin + new Vector3(x1,y1,0), origin + new Vector3(x2,y2,0));
Gizmos.DrawLine(origin + new Vector3(0,y1,x1), origin + new Vector3(0,y2,x2));
}
}
#endif
}