private void Init()
        {
            Camera            camera        = Window.Camera;
            IRTEGraphicsLayer graphicsLayer = Window.IOCContainer.Resolve <IRTEGraphicsLayer>();

            if (graphicsLayer != null && graphicsLayer.Camera != null)
            {
                camera = graphicsLayer.Camera.Camera;
            }

            if (camera == null)
            {
                return;
            }

            IRTEGraphics graphics = IOC.Resolve <IRTEGraphics>();

            m_rteCamera = graphics.CreateCamera(camera, CameraEvent.AfterImageEffects, false, true);
            m_rteCamera.RenderersCache.Add(m_output.GetComponent <Renderer>());
            m_rteCamera.RefreshCommandBuffer();

            DoSceneGizmo();

            if (BtnProjection != null)
            {
                BtnProjection.gameObject.SetActive(true);
            }
        }
        protected override void Render(Shader shader, string tag, Camera renderCamera)
        {
            IRTEGraphics graphics = IOC.Resolve <IRTEGraphics>();

            m_rteCamera = graphics.CreateCamera(renderCamera, UnityEngine.Rendering.CameraEvent.AfterForwardAlpha, false, true);

            for (int i = 0; i < m_renderers.Count; ++i)
            {
                Renderer[] renderers = m_renderers[i];
                for (int j = 0; j < renderers.Length; ++j)
                {
                    m_rteCamera.RenderersCache.Add(renderers[j]);
                }
            }

            //Material material = new Material(shader);
            //m_rteCamera.RenderersCache.MaterialOverride = material;

            bool invertCulling = GL.invertCulling;

            GL.invertCulling = true;
            renderCamera.projectionMatrix *= Matrix4x4.Scale(new Vector3(1, -1, 1));
            renderCamera.Render();
            GL.invertCulling = invertCulling;

            //Object.Destroy(material);
            m_rteCamera.Destroy();

            m_renderers.Clear();
        }
Exemplo n.º 3
0
        private void CreateGraphicsCamera()
        {
            IRTEGraphics graphics = IOC.Resolve <IRTEGraphics>();

            if (graphics != null)
            {
                IRTECamera rteCamera = graphics.CreateCamera(m_camera);
                IOCContainer.RegisterFallback(rteCamera);
            }
        }
Exemplo n.º 4
0
        protected virtual void OnEnable()
        {
            Camera            camera        = Window.Camera;
            IRTEGraphicsLayer graphicsLayer = Window.IOCContainer.Resolve <IRTEGraphicsLayer>();

            if (graphicsLayer != null)
            {
                camera = graphicsLayer.Camera.Camera;
            }

            m_rteCamera = m_graphics.CreateCamera(camera);
            m_rteCamera.RenderersCache.Add(m_output.GetComponent <Renderer>());
            m_rteCamera.Event = CameraEvent.AfterImageEffects;

            DoSceneGizmo();

            if (BtnProjection != null)
            {
                BtnProjection.gameObject.SetActive(true);
            }
        }
        private void PrepareGraphicsLayerCamera()
        {
            bool wasActive = m_window.Camera.gameObject.activeSelf;

            m_window.Camera.gameObject.SetActive(false);

            if (m_window.Editor.IsVR && m_window.Camera.stereoEnabled && m_window.Camera.stereoTargetEye == StereoTargetEyeMask.Both)
            {
                m_camera = Instantiate(m_window.Camera, m_window.Camera.transform.parent);
                m_camera.transform.SetSiblingIndex(m_window.Camera.transform.GetSiblingIndex() + 1);
            }
            else
            {
                m_camera = Instantiate(m_window.Camera, m_window.Camera.transform);
            }

            for (int i = m_camera.transform.childCount - 1; i >= 0; i--)
            {
                Destroy(m_camera.transform.GetChild(i).gameObject);
            }

            Component[] components = m_camera.GetComponents <Component>();
            for (int i = 0; i < components.Length; ++i)
            {
                Component component = components[i];
                if (component is Transform)
                {
                    continue;
                }
                if (component is Camera)
                {
                    continue;
                }
                if (component is RenderTextureCamera)
                {
                    continue;
                }

                Destroy(component);
            }

            m_camera.transform.localPosition = Vector3.zero;
            m_camera.transform.localRotation = Quaternion.identity;
            m_camera.transform.localScale    = Vector3.one;
            m_camera.name        = "GraphicsLayerCamera";
            m_camera.depth       = m_window.Camera.depth + 1;
            m_camera.cullingMask = 0;

            if (RenderPipelineInfo.Type == RPType.Standard)
            {
                m_graphicsCamera = m_graphics.CreateCamera(m_camera, CameraEvent.BeforeImageEffects, true, true);
            }
            else
            {
                m_graphicsCamera = m_graphics.CreateCamera(m_camera, CameraEvent.AfterImageEffectsOpaque, true, true);
            }

            m_renderTextureCamera = m_camera.GetComponent <RenderTextureCamera>();
            if (m_renderTextureCamera == null)
            {
                if (RenderPipelineInfo.Type == RPType.Standard)
                {
                    if (m_window.RenderTextureUsage == RenderTextureUsage.On || m_window.RenderTextureUsage == RenderTextureUsage.UsePipelineSettings && RenderPipelineInfo.UseRenderTextures)
                    {
                        CreateRenderTextureCamera();
                    }
                    else
                    {
                        m_camera.clearFlags = CameraClearFlags.Depth;
                    }
                }
                else
                {
                    RenderPipelineManager.beginFrameRendering += OnBeginFrameRendering;
                    RenderPipelineManager.endFrameRendering   += OnEndFrameRendering;
                }
            }
            else
            {
                if (m_window.RenderTextureUsage == RenderTextureUsage.Off || m_window.RenderTextureUsage == RenderTextureUsage.UsePipelineSettings && !RenderPipelineInfo.UseRenderTextures)
                {
                    DestroyImmediate(m_renderTextureCamera);
                }
                else
                {
                    m_renderTextureCamera.OverlayMaterial = new Material(Shader.Find("Battlehub/RTCommon/RenderTextureOverlay"));
                    m_camera.clearFlags      = CameraClearFlags.SolidColor;
                    m_camera.backgroundColor = new Color(0, 0, 0, 0);
                }
            }

            m_camera.allowHDR         = false;                            //fix strange screen blinking bug...
            m_camera.projectionMatrix = m_window.Camera.projectionMatrix; //for ARCore

            m_window.Camera.gameObject.SetActive(wasActive);
            m_camera.gameObject.SetActive(true);
        }
        private static Texture2D Render(
            Camera camera,
            Shader shader,
            Renderer[] renderers,
            int width  = -1,
            int height = -1)
        {
            bool autoSize = width < 0 || height < 0;

            int _width  = autoSize ? (int)camera.pixelRect.width : width;
            int _height = autoSize ? (int)camera.pixelRect.height : height;

            GameObject go        = new GameObject();
            Camera     renderCam = go.AddComponent <Camera>();

            renderCam.CopyFrom(camera);

            renderCam.renderingPath   = RenderingPath.Forward;
            renderCam.enabled         = false;
            renderCam.clearFlags      = CameraClearFlags.SolidColor;
            renderCam.backgroundColor = Color.white;
            renderCam.cullingMask     = 0;

            IRenderPipelineCameraUtility cameraUtility = IOC.Resolve <IRenderPipelineCameraUtility>();

            if (cameraUtility != null)
            {
                cameraUtility.EnablePostProcessing(renderCam, false);
                cameraUtility.SetBackgroundColor(renderCam, Color.white);
            }

            renderCam.allowHDR  = false;
            renderCam.allowMSAA = false;
            renderCam.forceIntoRenderTexture = true;

            float aspect = renderCam.aspect;

            renderCam.rect   = new Rect(Vector2.zero, Vector2.one);
            renderCam.aspect = aspect;

            RenderTextureDescriptor descriptor = new RenderTextureDescriptor()
            {
                width             = _width,
                height            = _height,
                colorFormat       = RenderTextureFormat,
                autoGenerateMips  = false,
                depthBufferBits   = 16,
                dimension         = TextureDimension.Tex2D,
                enableRandomWrite = false,
                memoryless        = RenderTextureMemoryless.None,
                sRGB        = true,
                useMipMap   = false,
                volumeDepth = 1,
                msaaSamples = 1
            };
            RenderTexture rt = RenderTexture.GetTemporary(descriptor);

            RenderTexture prev = RenderTexture.active;

            renderCam.targetTexture = rt;
            RenderTexture.active    = rt;

            Material replacementMaterial = new Material(shader);

            IRTEGraphics graphics  = IOC.Resolve <IRTEGraphics>();
            IRTECamera   rteCamera = graphics.CreateCamera(renderCam, CameraEvent.AfterForwardAlpha, false, true);

            rteCamera.RenderersCache.MaterialOverride = replacementMaterial;
            rteCamera.Camera.name = "BoxSelectionCamera";
            foreach (Renderer renderer in renderers)
            {
                Material[] materials = renderer.sharedMaterials;
                for (int i = 0; i < materials.Length; ++i)
                {
                    if (materials[i] != null)
                    {
                        rteCamera.RenderersCache.Add(renderer);
                    }
                }
            }
            rteCamera.RefreshCommandBuffer();

            if (RenderPipelineInfo.Type != RPType.Standard)
            {
                bool invertCulling = GL.invertCulling;
                GL.invertCulling            = true;
                renderCam.projectionMatrix *= Matrix4x4.Scale(new Vector3(1, -1, 1));
                renderCam.Render();
                GL.invertCulling = invertCulling;
            }
            else
            {
                renderCam.Render();
            }

            Texture2D img = new Texture2D(_width, _height, TextureFormat, false, false);

            img.ReadPixels(new Rect(0, 0, _width, _height), 0, 0);
            img.Apply();

            RenderTexture.active = prev;
            RenderTexture.ReleaseTemporary(rt);

            UnityObject.DestroyImmediate(go);
            UnityObject.Destroy(replacementMaterial);

            rteCamera.Destroy();
            //System.IO.File.WriteAllBytes("Assets/box_selection.png", img.EncodeToPNG());

            return(img);
        }