public static void DestroyCamera() { if (_instance != null) { Object.Destroy(_instance); _instance = null; } }
public static OutlineCamera GetCamera() { if (_instance == null) { _instance = (new GameObject("Outline Camera")).AddComponent <OutlineCamera>(); } return(_instance); }
void OnEnable() { Camera cam = Camera.main; if (cam != null) { m_OutlineCamera = cam.GetComponent <OutlineCamera>(); } Bind(); }
void OnDestroy() { if (_renderTexture != null) { _renderTexture.Release(); } if (_extraRenderTexture != null) { _extraRenderTexture.Release(); } DestroyMaterials(); OutlineCamera.DestroyCamera(); }
// Use this for initialization void Start() { mat = GetComponentInChildren <Renderer> ().material; orgColor = mat.GetColor("_Color"); orgShader = mat.shader; orgLayer = gameObject.layer; #region Regist Outline OutlineCamera outline = GameObject.FindObjectOfType <OutlineCamera>(); if (outline) { outline.Regist(this); } #endregion }
void OnDisable() { Unbind(); m_OutlineCamera = null; }
public void OnPreRender() { CreateMaterialsIfNeeded(); if (_renderTexture == null || _renderTexture.width != sourceCamera.pixelWidth || _renderTexture.height != sourceCamera.pixelHeight) { _renderTexture = new RenderTexture(sourceCamera.pixelWidth, sourceCamera.pixelHeight, 16, RenderTextureFormat.Default); _extraRenderTexture = new RenderTexture(sourceCamera.pixelWidth, sourceCamera.pixelHeight, 16, RenderTextureFormat.Default); } UpdateMaterialsPublicProperties(); var cam = OutlineCamera.GetCamera(); cam.Sync(sourceCamera, _renderTexture); cam.CommandBuffer.SetRenderTarget(_renderTexture); cam.CommandBuffer.Clear(); if (Outline.Pool.Count > 0) { foreach (Outline outline in Outline.Pool) { LayerMask l = sourceCamera.cullingMask; if (outline != null && l == (l | (1 << outline.gameObject.layer))) { var arr = outline.GetMaterials(); for (int v = 0; v < arr.Length; v++) { Material m = null; if (arr[v] && arr[v].mainTexture != null) { int id = arr[v].mainTexture.GetInstanceID(); if (!_materialBuffer.TryGetValue(id, out m)) { if (outline.eraseRenderer) { m = new Material(_outlineEraseMaterial); } else { m = new Material(GetMaterialFromID(outline.presetColor)); } m.mainTexture = arr[v].mainTexture; _materialBuffer[id] = m; } } else { if (outline.eraseRenderer) { m = _outlineEraseMaterial; } else { m = GetMaterialFromID(outline.presetColor); } } if (backfaceCulling) { m.SetInt("_Culling", (int)UnityEngine.Rendering.CullMode.Back); } else { m.SetInt("_Culling", (int)UnityEngine.Rendering.CullMode.Off); } cam.CommandBuffer.DrawRenderer(outline.Renderer, m, 0, 0); if (outline.MeshFilter) { if (outline.MeshFilter.sharedMesh != null) { for (int i = 1; i < outline.MeshFilter.sharedMesh.subMeshCount; i++) { cam.CommandBuffer.DrawRenderer(outline.Renderer, m, i, 0); } } } if (outline.SkinnedMeshRenderer) { if (outline.SkinnedMeshRenderer.sharedMesh != null) { for (int i = 1; i < outline.SkinnedMeshRenderer.sharedMesh.subMeshCount; i++) { cam.CommandBuffer.DrawRenderer(outline.Renderer, m, i, 0); } } } } } } } cam.Camera.Render(); }