123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735 |
-
- using UnityEngine;
- using System.IO;
- #if ZED_HDRP || ZED_URP
- using UnityEngine.Rendering;
- #endif
- public class GreenScreenManager : MonoBehaviour
- {
-
-
-
- private GameObject screen = null;
-
-
-
- private Camera cam;
-
-
-
- public ZEDManager cameraManager = null;
-
-
-
- public ZEDRenderingPlane screenManager = null;
-
-
-
-
- private bool toUpdateConfig = false;
-
-
-
- [System.Serializable]
- public struct ChromaKey
- {
- public Color color;
- public float smoothness;
- public float range;
- }
-
-
-
- [System.Serializable]
- public struct ChromaKeyData
- {
- public ChromaKey chromaKeys;
- public int erosion;
- public int numberBlurIterations;
- public float blurPower;
- public float whiteClip;
- public float blackClip;
- public float spill;
- }
-
-
-
- [System.Serializable]
- public struct GreenScreenData
- {
- public ChromaKeyData chromaKeyData;
- public GarbageMatte.GarbageMatteData garbageMatteData;
- }
-
-
-
- public ChromaKey keys;
-
-
-
- [SerializeField]
- public Color keyColors = new Color(0.0f, 1.0f, 0.0f, 1);
-
-
-
- [SerializeField]
- public float smoothness;
-
-
-
- [SerializeField]
- public float range;
-
-
-
-
- [SerializeField]
- public float spill = 0.2f;
-
-
-
- private Color defaultColor = new Color(0.0f, 1.0f, 0.0f, 1);
-
-
-
- private const float defaultSmoothness = 0.08f;
-
-
-
- private const float defaultRange = 0.42f;
-
-
-
- private const float defaultSpill = 0.1f;
-
-
-
- private const int defaultErosion = 0;
-
-
-
- private const float defaultWhiteClip = 1.0f;
-
-
-
- private const float defaultBlackClip = 0.0f;
-
-
-
- private const float defaultSigma = 0.1f;
-
-
-
- public Material finalMat;
-
-
-
- private Material greenScreenMat;
-
-
-
- private Material preprocessMat;
-
-
-
- private RenderTexture finalTexture;
-
-
-
- public RenderTexture FinalTexture
- {
- get { return finalTexture; }
- }
-
-
-
- public enum CANAL
- {
- FOREGROUND,
- BACKGROUND,
- ALPHA,
- KEY,
- FINAL
- };
-
-
-
- [HideInInspector]
- [SerializeField]
- public CANAL canal = CANAL.FINAL;
-
-
-
- [HideInInspector]
- [SerializeField]
- public int erosion = 0;
-
-
-
- [SerializeField]
- public float whiteClip = 1.0f;
-
-
-
- [SerializeField]
- public float blackClip = 0.0f;
-
-
-
- [SerializeField]
- public string pathFileConfig = "Assets/Config_greenscreen.json";
-
-
-
- private Material blurMaterial;
-
-
-
- public int numberBlurIterations = 5;
-
-
-
- public float sigma_ = 0.1f;
-
-
-
- private float currentSigma = -1;
-
-
-
- private float[] weights_ = new float[5];
-
-
-
- private float[] offsets_ = { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f };
-
-
-
- public Material matYUV;
-
-
-
-
- [SerializeField]
- [HideInInspector]
- public GarbageMatte garbageMatte = new GarbageMatte();
-
-
-
- public bool enableGarbageMatte = false;
-
-
-
- private GarbageMatte.GarbageMatteData garbageMatteData;
-
-
-
- public void SetDefaultValues()
- {
- keyColors = defaultColor;
- smoothness = defaultSmoothness;
- range = defaultRange;
- spill = defaultSpill;
- erosion = defaultErosion;
- whiteClip = defaultWhiteClip;
- blackClip = defaultBlackClip;
- sigma_ = defaultSigma;
- }
-
-
-
- private int? _masktexid;
-
-
-
- private int maskTexID
- {
- get
- {
- if (_masktexid == null) _masktexid = Shader.PropertyToID("_MaskTex");
- return (int)_masktexid;
- }
- }
-
-
-
- private int? _weightsid;
-
-
-
- private int weightsID
- {
- get
- {
- if (_masktexid == null) _masktexid = Shader.PropertyToID("weights");
- return (int)_masktexid;
- }
- }
-
-
-
- private int? _offsetid;
-
-
-
- private int offsetID
- {
- get
- {
- if (_offsetid == null) _offsetid = Shader.PropertyToID("offset");
- return (int)_offsetid;
- }
- }
- private void OnEnable()
- {
-
- cameraManager = gameObject.GetComponentInParent<ZEDManager>();
- if (!cameraManager)
- {
-
- cameraManager = FindObjectOfType<ZEDManager>();
- }
- cameraManager.OnZEDReady += ZEDReady;
- Shader.SetGlobalInt("ZEDGreenScreenActivated", 1);
- screenManager = GetComponent<ZEDRenderingPlane>();
- }
- private void OnDisable()
- {
- if (cameraManager)
- {
- cameraManager.OnZEDReady -= ZEDReady;
- }
- }
- private void Awake()
- {
-
- Shader.SetGlobalInt("_ZEDStencilComp", 0);
- if (screen == null)
- {
- screen = gameObject.transform.GetChild(0).gameObject;
- finalMat = screen.GetComponent<Renderer>().material;
- }
- if (enableGarbageMatte)
- {
- garbageMatte = new GarbageMatte(cameraManager, finalMat, transform, garbageMatte);
- }
- #if ZED_HDRP || ZED_URP
- cam = GetComponent<Camera>();
- if (!cam) Debug.LogError("GreenScreenManager is not attached to a Camera.");
- RenderPipelineManager.beginCameraRendering += OnSRPPreRender;
- #endif
- #if !UNITY_EDITOR
- Debug.Log("Load Chroma keys");
- LoadGreenScreenData();
- UpdateShader();
- CreateFileWatcher("");
- #endif
- }
-
-
-
-
- private bool textureOverlayInit = false;
- private void Update()
- {
- if (screenManager != null && !textureOverlayInit)
- {
- if (screenManager.ManageKeywordForwardMat(true, "DEPTH_ALPHA"))
- {
- textureOverlayInit = true;
- }
- }
- if (toUpdateConfig)
- {
- toUpdateConfig = false;
- LoadGreenScreenData();
- }
- if (enableGarbageMatte)
- {
- if (garbageMatte != null && garbageMatte.IsInit)
- {
- garbageMatte.Update();
- }
- else
- {
- if (cameraManager != null)
- garbageMatte = new GarbageMatte(cameraManager, finalMat, transform, garbageMatte);
- }
- }
- }
-
-
-
-
- private void ZEDReady()
- {
-
- if (cameraManager == null)
- return;
-
-
- finalMat = screenManager.matRGB;
- finalTexture = new RenderTexture(cameraManager.zedCamera.ImageWidth, cameraManager.zedCamera.ImageHeight, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
- if (screenManager.forwardMat) screenManager.forwardMat.SetTexture("ZEDMaskTexGreenScreen", finalTexture);
- if (screenManager.deferredMat) screenManager.deferredMat.SetTexture("ZEDMaskTexGreenScreen", finalTexture);
- finalMat.SetTexture("_MaskTex", finalTexture);
- greenScreenMat = new Material(Resources.Load("Materials/Mat_ZED_Compute_GreenScreen") as Material);
- blurMaterial = new Material(Resources.Load("Materials/PostProcessing/Mat_ZED_Blur") as Material);
- matYUV = new Material(Resources.Load("Materials/Mat_ZED_YUV") as Material);
- matYUV.SetInt("_isLinear", System.Convert.ToInt32(QualitySettings.activeColorSpace));
- preprocessMat = new Material(Resources.Load("Materials/Mat_ZED_Preprocess") as Material);
- preprocessMat.SetTexture("_CameraTex", screenManager.TextureEye);
- ZEDPostProcessingTools.ComputeWeights(1, out weights_, out offsets_);
-
- blurMaterial.SetFloatArray("weights2", weights_);
- blurMaterial.SetFloatArray("offset2", offsets_);
- greenScreenMat.SetTexture("_CameraTex", screenManager.TextureEye);
- UpdateShader();
- UpdateCanal();
- if (System.IO.File.Exists("ZED_Settings.conf"))
- {
- cameraManager.zedCamera.LoadCameraSettings("ZED_Settings.conf");
- cameraManager.zedCamera.SetCameraSettings();
- }
- }
-
-
-
-
-
- public void UpdateCanal()
- {
- foreach (CANAL c in System.Enum.GetValues(typeof(CANAL)))
- {
- manageKeyWord(false, c.ToString());
- }
- if (screenManager != null)
- {
-
- if (canal == CANAL.BACKGROUND) screenManager.ManageKeywordForwardMat(true, "NO_DEPTH");
- else screenManager.ManageKeywordForwardMat(false, "NO_DEPTH");
- manageKeyWord(true, canal.ToString());
- }
- }
-
-
-
-
-
- void manageKeyWord(bool value, string name)
- {
- if (finalMat != null)
- {
- if (value)
- {
- finalMat.EnableKeyword(name);
- }
- else
- {
- finalMat.DisableKeyword(name);
- }
- }
- }
- #if UNITY_EDITOR
- private void OnValidate()
- {
- UpdateShader();
- }
- #endif
- private void OnApplicationQuit()
- {
- if (finalTexture != null && finalTexture.IsCreated()) finalTexture.Release();
- }
- public void Reset()
- {
- cameraManager = gameObject.GetComponentInParent<ZEDManager>();
- if (!cameraManager)
- {
- cameraManager = ZEDManager.GetInstance(sl.ZED_CAMERA_ID.CAMERA_ID_01);
- }
- if (cameraManager != null)
- {
- cameraManager.resolution = sl.RESOLUTION.HD1080;
- Debug.Log("Resolution set to HD1080 for better result");
- }
- SetDefaultValues();
- }
-
-
-
-
-
-
- Vector3 RGBtoYUV(Color rgb, bool clamped = true)
- {
- double Y = 0.182586f * rgb.r + 0.614231f * rgb.g + 0.062007f * rgb.b + 0.062745f;
- double U = -0.100644f * rgb.r - 0.338572f * rgb.g + 0.439216f * rgb.b + 0.501961f;
- double V = 0.439216f * rgb.r - 0.398942f * rgb.g - 0.040274f * rgb.b + 0.501961f;
- if (!clamped)
- {
- U = -0.100644 * rgb.r - 0.338572 * rgb.g + 0.439216 * rgb.b;
- V = 0.439216 * rgb.r - 0.398942 * rgb.g - 0.040274 * rgb.b;
- }
- return new Vector3((float)Y, (float)U, (float)V);
- }
-
-
-
-
- public void UpdateShader()
- {
- if (greenScreenMat != null)
- {
- greenScreenMat.SetVector("_keyColor", RGBtoYUV(keyColors));
- greenScreenMat.SetFloat("_range", range);
- preprocessMat.SetFloat("_erosion", erosion);
- preprocessMat.SetFloat("_smoothness", smoothness);
- preprocessMat.SetFloat("_whiteClip", whiteClip);
- preprocessMat.SetFloat("_blackClip", blackClip);
- preprocessMat.SetFloat("_spill", spill);
- preprocessMat.SetColor("_keyColor", keyColors);
- }
- }
-
-
-
-
- private bool LoadData(out GreenScreenData gsData)
- {
- gsData = new GreenScreenData();
- if (File.Exists(pathFileConfig))
- {
- string dataAsJson = File.ReadAllText(pathFileConfig);
- gsData = JsonUtility.FromJson<GreenScreenData>(dataAsJson);
- return true;
- }
- return false;
- }
-
-
-
- public ChromaKeyData RegisterDataChromaKeys()
- {
- ChromaKeyData chromaKeyData = new ChromaKeyData();
- chromaKeyData.chromaKeys = new ChromaKey();
- chromaKeyData.erosion = erosion;
- chromaKeyData.blurPower = sigma_;
- chromaKeyData.numberBlurIterations = numberBlurIterations;
- chromaKeyData.whiteClip = whiteClip;
- chromaKeyData.spill = spill;
- chromaKeyData.blackClip = blackClip;
- chromaKeyData.chromaKeys.color = keyColors;
- chromaKeyData.chromaKeys.smoothness = smoothness;
- chromaKeyData.chromaKeys.range = range;
- return chromaKeyData;
- }
-
-
-
- public void SaveData(ChromaKeyData chromaKeyData, GarbageMatte.GarbageMatteData garbageMatteData)
- {
- GreenScreenData gsData = new GreenScreenData();
- gsData.chromaKeyData = chromaKeyData;
- gsData.garbageMatteData = garbageMatteData;
- string dataAsJson = JsonUtility.ToJson(gsData);
- File.WriteAllText(pathFileConfig, dataAsJson);
- }
-
-
-
- public void LoadGreenScreenData(bool forcegarbagemate = false)
- {
- GreenScreenData gsData;
- if (LoadData(out gsData))
- {
- ChromaKeyData chromaKeyData = gsData.chromaKeyData;
- garbageMatteData = gsData.garbageMatteData;
- erosion = chromaKeyData.erosion;
- sigma_ = chromaKeyData.blurPower;
- numberBlurIterations = chromaKeyData.numberBlurIterations;
- whiteClip = chromaKeyData.whiteClip;
- blackClip = chromaKeyData.blackClip;
- spill = chromaKeyData.spill;
- keyColors = chromaKeyData.chromaKeys.color;
- smoothness = chromaKeyData.chromaKeys.smoothness;
- range = chromaKeyData.chromaKeys.range;
- }
- UpdateShader();
- if (forcegarbagemate && garbageMatte != null)
- {
- if (!garbageMatte.IsInit && cameraManager != null)
- {
- garbageMatte = new GarbageMatte(cameraManager, finalMat, transform, garbageMatte);
- }
- enableGarbageMatte = true;
- garbageMatte.LoadData(gsData.garbageMatteData);
- garbageMatte.ApplyGarbageMatte();
- }
- }
- #if ZED_HDRP || ZED_URP
-
-
-
-
- private void OnSRPPreRender(ScriptableRenderContext context, Camera renderingcam)
- {
- if (renderingcam == cam)
- {
- OnPreRender();
- }
- }
- #endif
-
-
-
- private void OnPreRender()
- {
- if (screenManager.TextureEye == null || screenManager.TextureEye.width == 0) return;
- if (canal.Equals(CANAL.FOREGROUND)) return;
- RenderTexture tempAlpha = RenderTexture.GetTemporary(finalTexture.width, finalTexture.height, 0, RenderTextureFormat.RFloat, RenderTextureReadWrite.Linear);
- RenderTexture tempFinalAlpha = RenderTexture.GetTemporary(finalTexture.width, finalTexture.height, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
- Graphics.Blit(screenManager.TextureEye, tempAlpha, greenScreenMat);
-
- preprocessMat.SetTexture(maskTexID, tempAlpha);
- Graphics.Blit(screenManager.TextureEye, tempFinalAlpha, preprocessMat);
-
- if (sigma_ == 0)
- {
- if (sigma_ != currentSigma)
- {
- currentSigma = sigma_;
- ZEDPostProcessingTools.ComputeWeights(currentSigma, out weights_, out offsets_);
-
-
- blurMaterial.SetFloatArray(weightsID, weights_);
-
- blurMaterial.SetFloatArray(offsetID, offsets_);
- }
- ZEDPostProcessingTools.Blur(tempFinalAlpha, finalTexture, blurMaterial, 0, 1, 1);
- }
- else
- {
- Graphics.Blit(tempFinalAlpha, finalTexture);
- }
-
- RenderTexture.ReleaseTemporary(tempAlpha);
- RenderTexture.ReleaseTemporary(tempFinalAlpha);
- }
-
-
-
- float Gaussian(float x, float sigma)
- {
- return (1.0f / (2.0f * Mathf.PI * sigma)) * Mathf.Exp(-((x * x) / (2.0f * sigma)));
- }
-
-
-
-
-
- public void CreateFileWatcher(string path)
- {
- if (!File.Exists(pathFileConfig)) return;
- FileSystemWatcher watcher = new FileSystemWatcher();
- watcher.Path = path;
- watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
- watcher.Filter = Path.GetFileName(pathFileConfig);
- watcher.Changed += new FileSystemEventHandler(OnChanged);
- watcher.EnableRaisingEvents = true;
- }
-
-
-
- private void OnChanged(object source, FileSystemEventArgs e)
- {
- toUpdateConfig = true;
- }
- }
|