Skip to content
80 changes: 43 additions & 37 deletions ProceduralSkyInitializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ public class ProceduralSkyInitializer : MonoBehaviour
public const float moonDistanceToCamera = 10;

private Light dirLight;
private Camera mainCam;

private Material _layeredCubemap;
private Material _skyMaterial;
private AudioClip _rainAudioClip;
private GameObject _cloudPrefab;
Expand All @@ -27,6 +27,7 @@ public void Init ()
// Load the asset bundle
AssetBundle assets = AssetBundle.LoadFromFile(Main.ModPath + "Resources/proceduralskymod");

_layeredCubemap = assets.LoadAsset<Material>("Assets/Materials/CubemapOverlay.mat");
_skyMaterial = assets.LoadAsset<Material>("Assets/Materials/Sky.mat");
_rainAudioClip = assets.LoadAsset<AudioClip>("Assets/Audio/rain-03.wav");
_cloudPrefab = assets.LoadAsset<GameObject>("Assets/Prefabs/CloudPlane.prefab");
Expand Down Expand Up @@ -80,41 +81,44 @@ public void Init ()
#if DEBUG
Debug.Log(">>> >>> >>> Setting Up Cameras...");
#endif
// main cam
mainCam = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<Camera>();
mainCam.clearFlags = CameraClearFlags.Depth;
mainCam.cullingMask = -1;
mainCam.cullingMask &= ~(1 << 31);
//mainCam.depth = -1; // original setting

Camera.main.cullingMask = -1;
Camera.main.cullingMask &= ~(1 << 31);

// clear cam
Camera clearCam = new GameObject() { name = "ClearCam" }.AddComponent<Camera>();
clearCam.transform.SetParent(psMaster.transform, false);
clearCam.clearFlags = CameraClearFlags.Skybox;
clearCam.cullingMask = 0;
clearCam.enabled = false;

// override clearCam's skybox with skyMaterial to render sun disk
Skybox clearCamSkybox = clearCam.gameObject.AddComponent<Skybox>();
clearCamSkybox.material = skyMaterial;

// sky cam
Camera skyCam = new GameObject() { name = "SkyCam" }.AddComponent<Camera>();
GameObject skyCamGimbal = new GameObject { name = "SkyCamGimbal" };
skyCamGimbal.transform.SetParent(psMaster.transform, false);
skyCam.transform.SetParent(skyCamGimbal.transform, false);
skyCam.clearFlags = CameraClearFlags.Depth;
skyCam.transform.SetParent(psMaster.transform, false);
skyCam.clearFlags = CameraClearFlags.Color;
skyCam.backgroundColor = Color.clear;
skyCam.cullingMask = 0;
skyCam.cullingMask |= 1 << 31;
skyCam.depth = -2;
skyCam.fieldOfView = mainCam.fieldOfView;
skyCam.nearClipPlane = mainCam.nearClipPlane;
skyCam.farClipPlane = 100;
// this localScale negates VR stereo separation
skyCamGimbal.transform.localScale = Vector3.zero;
skyCamGimbal.AddComponent<PositionConstraintOnPreCull>().source = psMaster.transform;

// clear cam
Camera clearCam = new GameObject() { name = "ClearCam" }.AddComponent<Camera>();
clearCam.clearFlags = CameraClearFlags.Skybox;
clearCam.cullingMask = 0;
clearCam.depth = -3;
clearCam.fieldOfView = mainCam.fieldOfView;

SkyCamConstraint constraint = skyCam.gameObject.AddComponent<SkyCamConstraint>();
constraint.main = mainCam;
constraint.sky = skyCam;
constraint.clear = clearCam;

skyCam.enabled = false;

// skyCamOutputMat will be used for global skybox
int skyCamTexSize = 4096;
RenderTexture clearCamTex = new RenderTexture(skyCamTexSize/4, skyCamTexSize/4, 0, RenderTextureFormat.DefaultHDR);
clearCamTex.dimension = UnityEngine.Rendering.TextureDimension.Cube;
RenderTexture skyCamTex = new RenderTexture(skyCamTexSize, skyCamTexSize, 0, RenderTextureFormat.DefaultHDR);
skyCamTex.dimension = UnityEngine.Rendering.TextureDimension.Cube;
Material skyCamOutputMat = _layeredCubemap;
skyCamOutputMat.SetTexture("_Tex", clearCamTex); // shader: Skybox/Cubemap
skyCamOutputMat.SetTexture("_AlphaTex", skyCamTex); // shader: Skybox/CubemapOverlay

// initialize skybox
clearCam.RenderToCubemap(clearCamTex);
skyCam.RenderToCubemap(skyCamTex);
// cloud render texture cam
Camera cloudRendTexCam = new GameObject() { name = "CloudRendTexCam" }.AddComponent<Camera>();
cloudRendTexCam.transform.SetParent(psMaster.transform);
Expand Down Expand Up @@ -169,7 +173,7 @@ public void Init ()
Debug.Log(">>> >>> >>> Setting Up Audio Sources...");
#endif
GameObject psAudio = new GameObject() { name = "ProceduralSkyAudio" };
psAudio.transform.SetParent(mainCam.transform);
psAudio.transform.SetParent(Camera.main.transform);
RainController.RainAudio = psAudio.AddComponent<AudioSource>();

RainController.RainAudio.clip = _rainAudioClip;
Expand Down Expand Up @@ -218,6 +222,7 @@ public void Init ()
Debug.Log(">>> >>> >>> Setting Up Starbox...");
#endif
GameObject starBox = GameObject.CreatePrimitive(PrimitiveType.Cube);
_starMaterial.SetFloat("_Exposure", .5f);
starBox.GetComponent<MeshRenderer>().sharedMaterial = _starMaterial;
starBox.transform.SetParent(skyboxNight.transform);
starBox.transform.ResetLocal();
Expand Down Expand Up @@ -247,7 +252,7 @@ public void Init ()
GameObject psRainParticleSys = new GameObject() { name = "ProceduralSkyRainParticleSystem" };

PositionConstraintOnUpdate psRainParticleSysconstraint = psRainParticleSys.AddComponent<PositionConstraintOnUpdate>();
psRainParticleSysconstraint.source = mainCam.transform;
psRainParticleSysconstraint.source = Camera.main.transform;

GameObject rainObj = GameObject.Instantiate(_rainPrefab);
rainObj.transform.SetParent(psRainParticleSys.transform);
Expand Down Expand Up @@ -278,11 +283,12 @@ public void Init ()

skyManager.StarMaterial = starBox.GetComponent<MeshRenderer>().sharedMaterial;

skyManager.SkyCam = skyCam.transform;
skyManager.ClearCam = clearCam;
skyManager.ClearCamTex = clearCamTex;
skyManager.SkyCam = skyCam;
skyManager.SkyCamTex = skyCamTex;
skyManager.SkyMaterial = skyMaterial;

skyManager.ClearCam = clearCam.transform;

skyManager.MoonPathCenter = moonBillboard.transform;
skyManager.MoonMaterial = moonBillboard.GetComponent<MeshRenderer>().sharedMaterial;

Expand All @@ -291,7 +297,7 @@ public void Init ()
#endif
// Set render settings
RenderSettings.sun = dirLight;
RenderSettings.skybox = skyMaterial;
RenderSettings.skybox = skyCamOutputMat;
RenderSettings.ambientMode = UnityEngine.Rendering.AmbientMode.Flat;

#if DEBUG
Expand Down
Binary file modified Resources/proceduralskymod
Binary file not shown.
11 changes: 8 additions & 3 deletions SkyManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,10 @@ public class SkyManager : MonoBehaviour
public Material CloudMaterial { get; set; }
public Material MoonMaterial { get; set; }

public Transform ClearCam { get; set; }
public Transform SkyCam { get; set; }
public Camera SkyCam { get; set; }
public RenderTexture SkyCamTex { get; set; }
public Camera ClearCam { get; set; }
public RenderTexture ClearCamTex { get; set; }
public Transform CloudPlane { get; set; }

void Start ()
Expand Down Expand Up @@ -55,6 +57,9 @@ void Update ()
else
SunLight.cookie = null;

ClearCam.RenderToCubemap(ClearCamTex, 63 & ~(1 << (int)CubemapFace.NegativeY));
SkyCam.RenderToCubemap(SkyCamTex, 63 & ~(1 << (int)CubemapFace.NegativeY));

#if !CYBEX_TIME
// fauxnik time algo
ProceduralSkyTimeSource.Instance.CalculateTimeProgress(Time.deltaTime);
Expand Down Expand Up @@ -111,7 +116,7 @@ void Update ()
SunLight.intensity = sunOverHorizonFac * 1.5f;
SunLight.color = Color.Lerp(new Color(1f, 0.5f, 0), Color.white, sunOverHorizonFac);

StarMaterial.SetFloat("_Visibility", (-sunOverHorizonFac + 1) * .01f);
StarMaterial.SetFloat("_Visibility", Mathf.Clamp01(1f - 4f * sunOverHorizonFac));

MoonMaterial.SetFloat("_MoonDayNight", Mathf.Lerp(2.19f, 1.5f, sunOverHorizonFac));
// gives aproximate moon phase
Expand Down