Exemplo n.º 1
0
 public static void DestroyCamera()
 {
     if (_instance != null)
     {
         Object.Destroy(_instance);
         _instance = null;
     }
 }
Exemplo n.º 2
0
 public static OutlineCamera GetCamera()
 {
     if (_instance == null)
     {
         _instance = (new GameObject("Outline Camera")).AddComponent <OutlineCamera>();
     }
     return(_instance);
 }
Exemplo n.º 3
0
    void OnEnable()
    {
        Camera cam = Camera.main;

        if (cam != null)
        {
            m_OutlineCamera = cam.GetComponent <OutlineCamera>();
        }

        Bind();
    }
Exemplo n.º 4
0
        void OnDestroy()
        {
            if (_renderTexture != null)
            {
                _renderTexture.Release();
            }
            if (_extraRenderTexture != null)
            {
                _extraRenderTexture.Release();
            }
            DestroyMaterials();

            OutlineCamera.DestroyCamera();
        }
Exemplo n.º 5
0
    // 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
    }
Exemplo n.º 6
0
    void OnDisable()
    {
        Unbind();

        m_OutlineCamera = null;
    }
Exemplo n.º 7
0
        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();
        }