Newer
Older
BlackoutClient / Assets / Shaders / AddShadow.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Rendering;

public class AddShadow : MonoBehaviour
{
    public Camera SceneCam;
    public Light PointLight;

    private Camera shadowCam;

    public Shader PostShader;

    private List<Light> lights;

    // Start is called before the first frame update
    void Start()
    {
        lights = FindObjectsOfType<Light>().ToList();
        shadowCam = GetComponent<Camera>();
    }

    private AmbientMode cacheAmbientMode;
    private Color cacheAmbientSkyColor;
    private float cacheAmbientIntensity;
    private Material cacheSkybox;
    void OnPreRender()
    {
        //Debug.Log("PRE " + (Camera.current == shadowCam));
        //lights.ForEach(l => l.enabled = false);

        PointLight.intensity = 1;

        cacheAmbientMode = RenderSettings.ambientMode;
        cacheSkybox = RenderSettings.skybox;
        cacheAmbientSkyColor = RenderSettings.ambientSkyColor;
        cacheAmbientIntensity = RenderSettings.ambientIntensity;

        RenderSettings.ambientMode = AmbientMode.Flat;
        RenderSettings.skybox = null;
        RenderSettings.ambientSkyColor = new Color(0, 0, 0, 1);
        RenderSettings.ambientIntensity = 0;
    }

    void OnPostRender()
    {
        //Debug.Log("POST " + (Camera.current == shadowCam));
        PointLight.intensity = 1;
        //lights.ForEach(l => l.enabled = true);


        RenderSettings.ambientMode = cacheAmbientMode;
        RenderSettings.skybox = cacheSkybox;
        RenderSettings.ambientSkyColor = cacheAmbientSkyColor;
        RenderSettings.ambientIntensity = cacheAmbientIntensity;
    }

    // Update is called once per frame
    void Update()
    {
        shadowCam.CopyFrom(SceneCam);
        shadowCam.clearFlags = CameraClearFlags.Depth;
        shadowCam.SetReplacementShader(PostShader, "");
        shadowCam.cullingMask = ~LayerMask.GetMask("NoShadow");
    }
}