public override void OnInspectorGUI()
        {
            ProjectorForLWRP projector = target as ProjectorForLWRP;

            DrawDefaultInspector();
            bool useStencil = EditorGUILayout.Toggle("Use Stencil Test", projector.useStencilTest);

            if (useStencil != projector.useStencilTest)
            {
                if (useStencil)
                {
                    if (projector.stencilPassMaterial == null)
                    {
                        Shader stencilPassShader = Shader.Find("Hidden/ProjectorForLWRP/StencilPass");
                        string path = AssetDatabase.GetAssetPath(stencilPassShader);
                        path  = path.Substring(0, path.Length - 6); // remove "shader" extension
                        path += "mat";                              // add "mat" extension
                        serializedObject.FindProperty("m_stencilPass").objectReferenceValue = AssetDatabase.LoadAssetAtPath(path, typeof(Material)) as Material;
                    }
                }
                else
                {
                    serializedObject.FindProperty("m_stencilPass").objectReferenceValue = null;
                }
            }
            serializedObject.ApplyModifiedProperties();
        }
 public void AddProjector(ProjectorForLWRP projector)
 {
     if (!m_projectors.Contains(projector))
     {
         m_projectors.Add(projector);
     }
 }
예제 #3
0
 public void CopySerializedPropertiesFrom(ProjectorForLWRP src)
 {
     renderPassEvent       = src.renderPassEvent;
     renderQueueLowerBound = src.renderQueueLowerBound;
     renderQueueUpperBound = src.renderQueueUpperBound;
     perObjectData         = src.perObjectData;
     stencilPassMaterial   = src.stencilPassMaterial;
 }
예제 #4
0
        public static void AddProjector(ProjectorForLWRP projector, Camera camera)
        {
            RenderProjectorPass pass;

            if (!s_projectorPasses.TryGetValue(camera, out pass))
            {
                pass = new RenderProjectorPass(camera); pass.renderPassEvent = projector.renderPassEvent; s_projectorPasses.Add(camera, pass);
            }
            pass.AddProjector(projector);
        }
예제 #5
0
        private void OnEnable()
        {
            ProjectorForLWRP projector     = target as ProjectorForLWRP;
            Projector        baseProjector = projector.GetComponent <Projector>();

            m_isOrthographic   = baseProjector.orthographic;
            m_orthographicSize = baseProjector.orthographicSize;
            m_aspect           = baseProjector.aspectRatio;
            m_fov = baseProjector.fieldOfView;
        }
예제 #6
0
        private void OnDisable()
        {
            // Revert the hide flags so that Projector can be visible in Inspector when ProjectorForLWRP component is removed.
            // this will not make the scene dirty.
            ProjectorForLWRP projector = target as ProjectorForLWRP;

            if (projector != null && projector.projector != null)
            {
                projector.projector.hideFlags &= ~HideFlags.HideInInspector;
            }
        }
예제 #7
0
        public static void AddProjector(ProjectorForLWRP projector, Camera camera)
        {
            if (s_instance == null)
            {
#if UNITY_EDITOR
                Debug.LogError("No ProjectorRendererFeature in the ForwardRendererData!");
#endif
                return;
            }
            s_instance.AddProjectorInternal(projector, camera);
        }
예제 #8
0
        private void AddProjectorInternal(ProjectorForLWRP projector, Camera camera)
        {
            RenderProjectorPass pass;

            if (!m_projectorPasses.TryGetValue(camera, out pass))
            {
                pass = new RenderProjectorPass(camera);
                pass.renderPassEvent = projector.renderPassEvent;
                m_projectorPasses.Add(camera, pass);
            }
            pass.AddProjector(projector);
        }
예제 #9
0
        public override void OnInspectorGUI()
        {
            ProjectorForLWRP projector = target as ProjectorForLWRP;

            DrawDefaultInspector();
            bool useStencil = EditorGUILayout.Toggle("Use Stencil Test", projector.useStencilTest);

            if (useStencil)
            {
                if (projector.stencilPassMaterial == null)
                {
                    Shader stencilPassShader = Shader.Find("Hidden/ProjectorForLWRP/StencilPass");
                    string path = AssetDatabase.GetAssetPath(stencilPassShader);
                    path  = path.Substring(0, path.Length - 6); // remove "shader" extension
                    path += "mat";                              // add "mat" extension
                    projector.stencilPassMaterial = AssetDatabase.LoadAssetAtPath(path, typeof(Material)) as Material;
                }
                Material projectorMaterial = projector.GetComponent <Projector>().material;
                ++EditorGUI.indentLevel;
                EditorGUILayout.PropertyField(serializedObject.FindProperty("m_stencilRef"));
                EditorGUILayout.PropertyField(serializedObject.FindProperty("m_stencilMask"));
                --EditorGUI.indentLevel;
            }
            else
            {
                projector.stencilPassMaterial = null;
            }
            projector.UpdateShaderTagIdList();
            serializedObject.ApplyModifiedProperties();
            Projector baseProjector = projector.GetComponent <Projector>();

            if (m_isOrthographic != baseProjector.orthographic ||
                m_orthographicSize != baseProjector.orthographicSize ||
                m_aspect != baseProjector.aspectRatio ||
                m_fov != baseProjector.fieldOfView ||
                m_far != baseProjector.farClipPlane ||
                m_near != baseProjector.nearClipPlane)
            {
                m_isOrthographic   = baseProjector.orthographic;
                m_orthographicSize = baseProjector.orthographicSize;
                m_aspect           = baseProjector.aspectRatio;
                m_fov  = baseProjector.fieldOfView;
                m_far  = baseProjector.farClipPlane;
                m_near = baseProjector.nearClipPlane;
                projector.UpdateFrustum();
            }
        }
예제 #10
0
        public static void AddProjector(ProjectorForLWRP projector, Camera camera)
        {
#if UNITY_EDITOR
            // check if the current Forward Renderer has the ProjectorRendererFeature instance.
            LightweightRenderPipelineAsset renderPipelineAsset = UnityEngine.Rendering.LWRP.LightweightRenderPipeline.asset;
            if (renderPipelineAsset == null)
            {
                return;
            }
            UnityEditor.SerializedObject   serializedObject                = new UnityEditor.SerializedObject(renderPipelineAsset);
            UnityEditor.SerializedProperty rendererDataProperty            = serializedObject.FindProperty("m_RendererData");
            UnityEngine.Rendering.LWRP.ScriptableRendererData rendererData = rendererDataProperty.objectReferenceValue as UnityEngine.Rendering.LWRP.ScriptableRendererData;
            if (rendererData == null)
            {
                Debug.LogError("The current Lightweight Render Pipeline Asset does not have Forward Renderer Data! Please set a Forward Renderer Data which contains ProjectorRendererFeature to the current render pipeline asset.", renderPipelineAsset);
            }
            else
            {
                bool found = false;
                foreach (var rendererFeature in rendererData.rendererFeatures)
                {
                    if (rendererFeature is ProjectorRendererFeature)
                    {
                        found = true;
                        break;
                    }
                }
                if (!found)
                {
                    Debug.LogError("ProjectorRendererFeature is not added to the current Forward Renderer Data.", rendererData);
                }
            }
#endif
            if (s_projectorPasses == null)
            {
#if UNITY_EDITOR
                Debug.LogError("No ProjectorRendererFeature instances are created!");
#endif
                return;
            }
            AddProjectorInternal(projector, camera);
        }
        public void Render(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            CullingResults cullingResults;

            if (!parentProjector.TryGetCullingResults(renderingData.cameraData.camera, out cullingResults))
            {
                return;
            }
            Material tempMaterial = material;

            // The keyword must be already enabled. It does not need to be enabled here.
            // EnableProjectorForLWRPKeyword(material);
            parentProjector.SetupProjectorMatrix(tempMaterial);

            if (useStencilTest)
            {
                if (m_runtimeStencilPassMaterial == null)
                {
                    m_runtimeStencilPassMaterial = new Material(stencilPassMaterial);
                }
                parentProjector.WriteFrustumStencil(context, renderingData.cameraData.camera, m_runtimeStencilPassMaterial);
            }

            ProjectorForLWRP.SetupCullingResultsForRendering(ref renderingData, ref cullingResults, perObjectData);
            DrawingSettings   drawingSettings;
            FilteringSettings filteringSettings;
            RenderStateBlock  renderStateBlock;

            GetDefaultDrawSettings(ref renderingData, tempMaterial, out drawingSettings, out filteringSettings, out renderStateBlock);
            context.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings, ref renderStateBlock);

            if (useStencilTest)
            {
                parentProjector.ClearStencil(context, m_runtimeStencilPassMaterial, m_stencilTestOptions);
            }
        }
예제 #12
0
        public override void OnInspectorGUI()
        {
            ProjectorForLWRP projector = target as ProjectorForLWRP;

            DrawDefaultInspector();
            bool useStencil = EditorGUILayout.Toggle("Use Stencil Test", projector.useStencilTest);

            if (useStencil)
            {
                if (m_stencilOptionProperty == null)
                {
                    m_stencilOptionProperty = serializedObject.FindProperty("m_stencilTestOptions");
                }
                EditorGUI.indentLevel++;
                bool clearStencil          = (m_stencilOptionProperty.intValue & (int)ProjectorForLWRP.StencilTestOptions.ClearStencil) != 0;
                bool preventOverwriting    = (m_stencilOptionProperty.intValue & (int)ProjectorForLWRP.StencilTestOptions.PreventOverwriting) != 0;
                bool newClearStencil       = EditorGUILayout.Toggle("Clear stencil after draw", clearStencil);
                bool newPreventOverwriting = EditorGUILayout.Toggle("Prevent overwriting", preventOverwriting);
                if (clearStencil != newClearStencil)
                {
                    if (newClearStencil)
                    {
                        m_stencilOptionProperty.intValue |= (int)ProjectorForLWRP.StencilTestOptions.ClearStencil;
                    }
                    else
                    {
                        m_stencilOptionProperty.intValue &= ~(int)ProjectorForLWRP.StencilTestOptions.ClearStencil;
                    }
                }
                if (preventOverwriting != newPreventOverwriting)
                {
                    if (newPreventOverwriting)
                    {
                        m_stencilOptionProperty.intValue |= (int)ProjectorForLWRP.StencilTestOptions.PreventOverwriting;
                    }
                    else
                    {
                        m_stencilOptionProperty.intValue &= ~(int)ProjectorForLWRP.StencilTestOptions.PreventOverwriting;
                    }
                }
                EditorGUI.indentLevel--;
            }
            if (useStencil != projector.useStencilTest)
            {
                if (m_stencilPassProperty == null)
                {
                    m_stencilPassProperty = serializedObject.FindProperty("m_stencilPass");
                }
                if (useStencil)
                {
                    if (projector.stencilPassMaterial == null)
                    {
                        Shader stencilPassShader = Shader.Find("Hidden/ProjectorForLWRP/StencilPass");
                        string path = AssetDatabase.GetAssetPath(stencilPassShader);
                        path  = path.Substring(0, path.Length - 6); // remove "shader" extension
                        path += "mat";                              // add "mat" extension
                        m_stencilPassProperty.objectReferenceValue = AssetDatabase.LoadAssetAtPath(path, typeof(Material)) as Material;
                    }
                }
                else
                {
                    m_stencilPassProperty.objectReferenceValue = null;
                }
            }
            serializedObject.ApplyModifiedProperties();
        }
 void Initialize()
 {
     m_projectorForLWRP = GetComponent <ProjectorForLWRP>();
     m_actionOnAddProjectorToRenderer = AddRenderer;
     UpdateShaderTagIdList();
 }