public void OnRenderTaskBegin(SceneRenderTask task, GPUContext context)
        {
            var size = Size;

            _modelActor.LocalPosition = new Vector3(size.X * -0.5f, size.Y * -0.5f, DistanceFromOrigin);
            if (_cachedSize != size)
            {
                GenerateGridMesh(_model.LODs[0].Meshes[0], size);
                _cachedSize = size;
            }

            if (!_materialInstance)
            {
                return;
            }

            for (int i = 0; i < _inputParameters.Length; i++)
            {
                if (!HasInput(i + 1))
                {
                    continue;
                }
                _inputParameters[i].Value = GetInput(i + 1);
            }
        }
Example #2
0
        private void OnEnable()
        {
            // Create backbuffer
            if (output == null)
            {
                output = RenderTarget.New();
            }
            output.Init(PixelFormat.R8G8B8A8_UNorm, (int)resolution.X, (int)resolution.Y);

            // Create rendering task
            if (task == null)
            {
                task = RenderTask.Create <SceneRenderTask>();
            }
            task.Order   = -100;
            task.Camera  = Cam;
            task.Output  = output;
            task.Enabled = false;

            // Use dynamic material instance
            if (Material && material == null)
            {
                material = Material.CreateVirtualInstance();
            }
            setMaterial = true;
        }
Example #3
0
        /// <inheritdoc />
        public override void Render(GPUContext context, SceneRenderTask task, RenderTarget input, RenderTarget output)
        {
            if (Viewport == null)
            {
                throw new NullReferenceException();
            }

            Profiler.BeginEventGPU("Editor Primitives");

            // Check if use MSAA
            var format = output.Format;

            GraphicsDevice.GetFeatures(format, out var formatSupport);
            bool enableMsaa = formatSupport.MSAALevelMax >= MSAALevel.X4 && Editor.Instance.Options.Options.Visual.EnableMSAAForDebugDraw;

            // Prepare
            var msaaLevel   = enableMsaa ? MSAALevel.X4 : MSAALevel.None;
            var width       = output.Width;
            var height      = output.Height;
            var target      = RenderTarget.GetTemporary(format, width, height, TextureFlags.RenderTarget | TextureFlags.ShaderResource, msaaLevel);
            var targetDepth = RenderTarget.GetTemporary(PixelFormat.D24_UNorm_S8_UInt, width, height, TextureFlags.DepthStencil, msaaLevel);

            // Copy frame and clear depth
            context.Draw(target, input);
            context.ClearDepth(targetDepth);

            // Draw gizmos (collect draw calls only)
            _drawCallsCollector.Clear();
            for (int i = 0; i < Viewport.Gizmos.Count; i++)
            {
                Viewport.Gizmos[i].Draw(_drawCallsCollector);
            }

            // Draw selected objects debug shapes and visuals
            if (DrawDebugDraw)
            {
                var debugDrawData = Viewport.DebugDrawData;
                DebugDraw.Draw(task, debugDrawData.ActorsPtrs, target, context, targetDepth, true);
            }

            // Draw gizmos (actual drawing)
            _drawCallsCollector.ExecuteDrawCalls(context, task, target, RenderPass.ForwardPass);
            _drawCallsCollector.ExecuteDrawCalls(context, task, target, RenderPass.GBufferFill);

            // Resolve MSAA texture
            if (enableMsaa)
            {
                context.ResolveMultisample(target, output);
            }
            else
            {
                context.Draw(output, target);
            }

            // Cleanup
            RenderTarget.ReleaseTemporary(targetDepth);
            RenderTarget.ReleaseTemporary(target);

            Profiler.EndEventGPU();
        }
Example #4
0
        private void OnUpdate()
        {
            if (_queue.Count == 0 || (_task != null && _task.Enabled))
            {
                return;
            }

            // TODO: add delay when processing the requests to reduce perf impact (eg. 0.2s before actual rendering)

            // Setup pipeline
            if (_atlases == null)
            {
                _atlases = new List <Atlas>(4);
            }
            if (_output == null)
            {
                _output = GPUDevice.Instance.CreateTexture("CameraCutMedia.Output");
                var desc = GPUTextureDescription.New2D(Width, Height, PixelFormat.R8G8B8A8_UNorm);
                _output.Init(ref desc);
            }
            if (_task == null)
            {
                _task        = Object.New <SceneRenderTask>();
                _task.Output = _output;
                _task.Begin += OnBegin;
                _task.End   += OnEnd;
            }

            // Kick off the rendering
            _task.Enabled = true;
        }
Example #5
0
        private void OnBegin(SceneRenderTask task, GPUContext context)
        {
            // Setup
            var req = _queue[0];

            req.Media.OnThumbnailRenderingBegin(task, context, ref req);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="EditorGizmoViewport"/> class.
        /// </summary>
        /// <param name="task">The task.</param>
        /// <param name="undo">The undo.</param>
        public EditorGizmoViewport(SceneRenderTask task, Undo undo)
            : base(task, new FPSCamera(), true)
        {
            Undo = undo;

            SetUpdate(ref _update, OnUpdate);
        }
Example #7
0
        /// <inheritdoc />
        public override void Render(GPUContext context, SceneRenderTask task, RenderTarget input, RenderTarget output)
        {
            // Pick a temporary depth buffer
            var customDepth = RenderTarget.GetTemporary(PixelFormat.R32_Typeless, input.Width, input.Height, TextureFlags.DepthStencil | TextureFlags.ShaderResource);

            context.ClearDepth(customDepth);

            // Render selected objects depth
            var actors = Editor.Instance.SceneEditing.Selection.ConvertAll(x => (x as ActorNode)?.Actor).ToArray();

            context.DrawSceneDepth(task, customDepth, true, actors, ActorsSources.CustomActors);

            var near       = task.View.Near;
            var far        = task.View.Far;
            var projection = task.View.Projection;

            // Render outline
            _material.GetParam("OutlineColor0").Value = OutlineColor0;
            _material.GetParam("OutlineColor1").Value = OutlineColor1;
            _material.GetParam("CustomDepth").Value   = customDepth;
            _material.GetParam("ViewInfo").Value      = new Vector4(1.0f / projection.M11, 1.0f / projection.M22, far / (far - near), (-far * near) / (far - near) / far);
            context.DrawPostFxMaterial(_material, output, input, task);

            // Cleanup
            RenderTarget.ReleaseTemporary(customDepth);
        }
Example #8
0
        /// <summary>
        /// Called when thumbnail rendering ends. The task output buffer contains ready frame.
        /// </summary>
        /// <param name="task">The scene rendering task to customize.</param>
        /// <param name="context">The GPU rendering context.</param>
        /// <param name="req">The request data.</param>
        /// <param name="sprite">The thumbnail sprite.</param>
        public void OnThumbnailRenderingEnd(SceneRenderTask task, GPUContext context, ref CameraCutThumbnailRenderer.Request req, ref Sprite sprite)
        {
            var image = _thumbnails[req.ThumbnailIndex];

            if (image == null)
            {
                if (req.ThumbnailIndex == 0)
                {
                    image = new Image(2, 2, CameraCutThumbnailRenderer.Width, CameraCutThumbnailRenderer.Height)
                    {
                        AnchorStyle = AnchorStyle.Left,
                    }
                }
                ;
                else
                {
                    image = new Image(Width - 2 - CameraCutThumbnailRenderer.Width, 2, CameraCutThumbnailRenderer.Width, CameraCutThumbnailRenderer.Height)
                    {
                        AnchorStyle = AnchorStyle.Right,
                    }
                };
                image.Parent = this;
                image.UnlockChildrenRecursive();
                _thumbnails[req.ThumbnailIndex] = image;
                UpdateUI();
            }
            else if (image.Brush != null)
            {
                Timeline.CameraCutThumbnailRenderer.ReleaseThumbnail(((SpriteBrush)image.Brush).Sprite);
                image.Brush = null;
            }

            image.Brush = new SpriteBrush(sprite);
        }
Example #9
0
        private void OnUpdate()
        {
            if (_queue.Count == 0 || (_task != null && _task.Enabled))
            {
                return;
            }

            // TODO: add delay when processing the requests to reduce perf impact (eg. 0.2s before actual rendering)

            // Setup pipeline
            if (_atlases == null)
            {
                _atlases = new List <Atlas>(4);
            }
            if (_output == null)
            {
                _output = RenderTarget.New();
                _output.Init(PixelFormat.R8G8B8A8_UNorm, Width, Height);
            }
            if (_task == null)
            {
                _task        = Object.New <SceneRenderTask>();
                _task.Output = _output;
                _task.Begin += OnBegin;
                _task.End   += OnEnd;
            }

            // Kick off the rendering
            _task.Enabled = true;
        }
Example #10
0
        /// <summary>
        /// Initializes a new instance of the <see cref="EditorViewportArcBallCam"/> class.
        /// </summary>
        /// <param name="task">The task.</param>
        /// <param name="useWidgets">Enable/disable viewport widgets.</param>
        /// <param name="orbitRadius">The orbit radius.</param>
        /// <param name="orbitCenter">The orbit center position.</param>
        public EditorViewportArcBallCam(SceneRenderTask task, bool useWidgets, float orbitRadius, Vector3 orbitCenter)
            : base(task, useWidgets)
        {
            _orbitRadius = orbitRadius;
            _orbitCenter = orbitCenter;

            UpdatePosition();
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="EditorGizmoViewport"/> class.
        /// </summary>
        /// <param name="task">The task.</param>
        /// <param name="undo">The undo.</param>
        /// <param name="sceneGraphRoot">The scene graph root.</param>
        public EditorGizmoViewport(SceneRenderTask task, Undo undo, SceneGraph.RootNode sceneGraphRoot)
            : base(task, new FPSCamera(), true)
        {
            Undo           = undo;
            SceneGraphRoot = sceneGraphRoot;

            SetUpdate(ref _update, OnUpdate);
        }
Example #12
0
 private void RenderTaskOnEnd(SceneRenderTask task, GPUContext context)
 {
     // Render editor primitives, gizmo and debug shapes in debug view modes
     if (task.Mode != ViewMode.Default)
     {
         // Note: can use Output buffer as both input and output because EditorPrimitives is using a intermediate buffers
         EditorPrimitives.Render(context, task, task.Output, task.Output);
     }
 }
Example #13
0
        /// <inheritdoc />
        public override void Render(GPUContext context, SceneRenderTask task, GPUTexture input, GPUTexture output)
        {
            if (Viewport == null)
            {
                throw new NullReferenceException();
            }

            Profiler.BeginEventGPU("Editor Primitives");

            // Check if use MSAA
            var format = output.Format;

            GPUDevice.GetFeatures(format, out var formatSupport);
            bool enableMsaa = formatSupport.MSAALevelMax >= MSAALevel.X4 && Editor.Instance.Options.Options.Visual.EnableMSAAForDebugDraw;

            // Prepare
            var msaaLevel = enableMsaa ? MSAALevel.X4 : MSAALevel.None;
            var width     = output.Width;
            var height    = output.Height;
            var desc      = GPUTextureDescription.New2D(width, height, format, GPUTextureFlags.RenderTarget | GPUTextureFlags.ShaderResource, 1, 1, msaaLevel);
            var target    = RenderTargetPool.Get(ref desc);

            desc = GPUTextureDescription.New2D(width, height, PixelFormat.D24_UNorm_S8_UInt, GPUTextureFlags.DepthStencil, 1, 1, msaaLevel);
            var targetDepth = RenderTargetPool.Get(ref desc);

            // Copy frame and clear depth
            context.Draw(target, input);
            context.ClearDepth(targetDepth);

            // Draw gizmos and other editor primitives (collect draw calls only)
            _drawCallsCollector.Clear();
            for (int i = 0; i < Viewport.Gizmos.Count; i++)
            {
                Viewport.Gizmos[i].Draw(_drawCallsCollector);
            }
            Viewport.DrawEditorPrimitives(context, task, target, targetDepth, _drawCallsCollector);

            // Draw gizmos (actual drawing)
            _drawCallsCollector.ExecuteDrawCalls(context, task, target, DrawPass.GBuffer);
            _drawCallsCollector.ExecuteDrawCalls(context, task, target, DrawPass.Forward);

            // Resolve MSAA texture
            if (enableMsaa)
            {
                context.ResolveMultisample(target, output);
            }
            else
            {
                context.Draw(output, target);
            }

            // Cleanup
            RenderTargetPool.Release(targetDepth);
            RenderTargetPool.Release(target);

            Profiler.EndEventGPU();
        }
Example #14
0
 public override void OnEnable()
 {
     base.OnEnable();
     Output                  = CreateOutputTexture(Size);
     RenderTask              = FlaxEngine.Object.New <SceneRenderTask>();
     RenderTask.Order        = Order;
     RenderTask.Camera       = Camera;
     RenderTask.ActorsSource = ActorsSources.Scenes;
     RenderTask.Output       = Output;
     RenderTask.Begin       += OnRenderTaskBegin;
     RenderTask.End         += OnRenderTaskEnd;
 }
Example #15
0
            /// <inheritdoc />
            public override void Render(GPUContext context, SceneRenderTask task, GPUTexture input, GPUTexture output)
            {
                Profiler.BeginEventGPU("Editor Primitives");

                for (int i = 0; i < SceneManager.ScenesCount; i++)
                {
                    var scene = SceneManager.GetScene(i);
                    ViewportIconsRenderer.DrawIcons(context, task, input, task.Buffers.DepthBuffer, scene);
                }

                Profiler.EndEventGPU();
            }
Example #16
0
 /// <summary>
 /// Called when ask rendering ends.
 /// </summary>
 /// <param name="task">The task.</param>
 /// <param name="context">The GPU execution context.</param>
 protected virtual void OnEnd(SceneRenderTask task, GPUContext context)
 {
     // Check if was using old backbuffer
     if (_backBufferOld)
     {
         _oldBackbufferLiveTimeLeft--;
         if (_oldBackbufferLiveTimeLeft < 0)
         {
             Object.Destroy(ref _backBufferOld);
         }
     }
 }
Example #17
0
        /// <inheritdoc />
        public override void Render(GPUContext context, SceneRenderTask task, RenderTarget input, RenderTarget output)
        {
            Profiler.BeginEventGPU("Editor Primitives");

            // Check if use MSAA
            // TODO: add edito option to switch between msaa and non-msaa
            bool enableMsaa = true;

            // Prepare
            var editor      = Editor.Instance;
            var viewport    = editor.Windows.EditWin.Viewport;
            var msaaLevel   = enableMsaa ? MSAALevel.X4 : MSAALevel.None;
            var width       = output.Width;
            var height      = output.Height;
            var target      = RenderTarget.GetTemporary(output.Format, width, height, TextureFlags.RenderTarget | TextureFlags.ShaderResource, msaaLevel);
            var targetDepth = RenderTarget.GetTemporary(PixelFormat.D24_UNorm_S8_UInt, width, height, TextureFlags.DepthStencil, msaaLevel);

            // Copy frame and clear depth
            context.Draw(target, input);
            context.ClearDepth(targetDepth);

            // Draw gizmos (collect draw calls only)
            _drawCallsCollector.Clear();
            for (int i = 0; i < viewport.Gizmos.Count; i++)
            {
                viewport.Gizmos[i].Draw(_drawCallsCollector);
            }

            // Draw selected objects debug shapes and visuals
            var debugDrawData = viewport.DebugDrawData;

            DebugDraw.Draw(task, debugDrawData.ActorsPtrs, target, context, targetDepth, true);

            // Draw gizmos (actual drawing)
            _drawCallsCollector.ExecuteDrawCalls(context, task, target, RenderPass.ForwardPass);

            // Resolve MSAA texture
            if (enableMsaa)
            {
                context.ResolveMultisample(target, output);
            }
            else
            {
                context.Draw(output, target);
            }

            // Cleanup
            RenderTarget.ReleaseTemporary(targetDepth);
            RenderTarget.ReleaseTemporary(target);

            Profiler.EndEventGPU();
        }
Example #18
0
        /// <inheritdoc />
        public override void Render(GPUContext context, SceneRenderTask task, RenderTarget input, RenderTarget output)
        {
            Profiler.BeginEventGPU("Selection Outline");

            // Pick a temporary depth buffer
            var customDepth = RenderTarget.GetTemporary(PixelFormat.R32_Typeless, input.Width, input.Height, TextureFlags.DepthStencil | TextureFlags.ShaderResource);

            context.ClearDepth(customDepth);

            // Get selected actors
            var selection = SelectionGetter();

            if (_actors == null)
            {
                _actors = new List <Actor>();
            }
            else
            {
                _actors.Clear();
            }
            _actors.Capacity = Mathf.NextPowerOfTwo(Mathf.Max(_actors.Capacity, selection.Count));
            for (int i = 0; i < selection.Count; i++)
            {
                if (selection[i] is ActorNode actorNode)
                {
                    _actors.Add(actorNode.Actor);
                }
            }

            // Render selected objects depth
            context.DrawSceneDepth(task, customDepth, true, _actors, ActorsSources.CustomActors);

            _actors.Clear();

            var near       = task.View.Near;
            var far        = task.View.Far;
            var projection = task.View.Projection;

            // Render outline
            _material.GetParam("OutlineColor0").Value = _color0;
            _material.GetParam("OutlineColor1").Value = _color1;
            _material.GetParam("CustomDepth").Value   = customDepth;
            _material.GetParam("ViewInfo").Value      = new Vector4(1.0f / projection.M11, 1.0f / projection.M22, far / (far - near), (-far * near) / (far - near) / far);
            context.DrawPostFxMaterial(_material, output, input, task);

            // Cleanup
            RenderTarget.ReleaseTemporary(customDepth);

            Profiler.EndEventGPU();
        }
Example #19
0
        /// <summary>
        /// Initializes a new instance of the <see cref="RenderOutputControl"/> class.
        /// </summary>
        /// <param name="task">The task. Cannot be null.</param>
        /// <exception cref="System.ArgumentNullException">Invalid task.</exception>
        public RenderOutputControl(SceneRenderTask task)
        {
            if (task == null)
            {
                throw new ArgumentNullException();
            }

            _backBuffer = RenderTarget.New();
            _resizeTime = ResizeCheckTime;

            _task                   = task;
            _task.Output            = _backBuffer;
            _task.CanSkipRendering += CanSkipRendering;
            _task.End              += OnEnd;
        }
Example #20
0
        /// <summary>
        /// Initializes a new instance of the <see cref="RenderOutputControl"/> class.
        /// </summary>
        /// <param name="task">The task. Cannot be null.</param>
        /// <exception cref="System.ArgumentNullException">Invalid task.</exception>
        public RenderOutputControl(SceneRenderTask task)
        {
            if (task == null)
            {
                throw new ArgumentNullException();
            }

            _backBuffer = GPUDevice.Instance.CreateTexture();
            _resizeTime = ResizeCheckTime;

            _task        = task;
            _task.Output = _backBuffer;
            _task.End   += OnEnd;

            Scripting.Update += OnUpdate;
        }
Example #21
0
        /// <summary>
        /// Draws the selected object to depth buffer.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="task">The task.</param>
        /// <param name="customDepth">The custom depth (output).</param>
        protected virtual void DrawSelectionDepth(GPUContext context, SceneRenderTask task, RenderTarget customDepth)
        {
            // Get selected actors
            var selection = SelectionGetter();

            _actors.Capacity = Mathf.NextPowerOfTwo(Mathf.Max(_actors.Capacity, selection.Count));
            for (int i = 0; i < selection.Count; i++)
            {
                if (selection[i] is ActorNode actorNode)
                {
                    _actors.Add(actorNode.Actor);
                }
            }

            // Render selected objects depth
            context.DrawSceneDepth(task, customDepth, true, _actors, ActorsSources.CustomActors);
        }
        public override void OnEnable()
        {
            base.OnEnable();

            if (!Material || !Material.IsSurface)
            {
                return;
            }
            Material.WaitForLoaded();
            _materialInstance = Material.CreateVirtualInstance();

            _inputParameters = GetPublicParameters(_materialInstance);

            var size = Size;

            _orthographicCamera = CreateOrthographicCamera();
            _model = Content.CreateVirtualAsset <Model>();
            _model.SetupLODs(1);
            _model.SetupMaterialSlots(1);
            _model.MinScreenSize = 0;
            // TODO: Optimize, use instanced rendering and whatnot
            GenerateGridMesh(_model.LODs[0].Meshes[0], size);
            _cachedSize           = size;
            _modelActor           = FlaxEngine.Object.New <StaticModel>();
            _modelActor.Model     = _model;
            _modelActor.DrawModes = DrawPass.Depth | DrawPass.GBuffer; // TODO: Optionally enable transparency?
            _modelActor.Entries[0].ReceiveDecals = false;
            _modelActor.Entries[0].ShadowsMode   = ShadowsCastingMode.None;
            _modelActor.Entries[0].Material      = _materialInstance;
            _modelActor.LocalPosition            = new Vector3(size * -0.5f, DistanceFromOrigin);

            Output = CreateOutputTexture(Size);

            RenderTask = FlaxEngine.Object.New <SceneRenderTask>();
            RenderTask.AllowGlobalCustomPostFx = false;
            RenderTask.Order        = Order;
            RenderTask.Camera       = _orthographicCamera;
            RenderTask.ActorsSource = ActorsSources.CustomActors;
            RenderTask.Output       = Output;
            RenderTask.Begin       += OnRenderTaskBegin;
            RenderTask.End         += OnRenderTaskEnd;
            RenderTask.CustomActors.Add(_modelActor);
            RenderTask.View.MaxShadowsQuality = Quality.Low;
            RenderTask.View.Mode  = ViewMode.Emissive;
            RenderTask.View.Flags = ViewFlags.None;
        }
Example #23
0
        /// <summary>
        /// Called when thumbnail rendering ends. The task output buffer contains ready frame.
        /// </summary>
        /// <param name="task">The scene rendering task to customize.</param>
        /// <param name="context">The GPU rendering context.</param>
        /// <param name="req">The request data.</param>
        /// <param name="sprite">The thumbnail sprite.</param>
        public void OnThumbnailRenderingEnd(SceneRenderTask task, GPUContext context, ref CameraCutThumbnailRenderer.Request req, ref SpriteHandle sprite)
        {
            var image = _thumbnails[req.ThumbnailIndex];

            if (image == null)
            {
                if (req.ThumbnailIndex == 0)
                {
                    image = new Image
                    {
                        AnchorPreset = AnchorPresets.MiddleLeft,
                        Parent       = this,
                        Bounds       = new Rectangle(2, 2, CameraCutThumbnailRenderer.Width, CameraCutThumbnailRenderer.Height),
                    };
                }
                else if (req.ThumbnailIndex == 1)
                {
                    image = new Image
                    {
                        AnchorPreset = AnchorPresets.MiddleRight,
                        Parent       = this,
                        Bounds       = new Rectangle(Width - 2 - CameraCutThumbnailRenderer.Width, 2, CameraCutThumbnailRenderer.Width, CameraCutThumbnailRenderer.Height),
                    };
                }
                else
                {
                    image = new Image
                    {
                        AnchorPreset = AnchorPresets.MiddleCenter,
                        Parent       = this,
                        Bounds       = new Rectangle(Width * 0.5f - 1 - CameraCutThumbnailRenderer.Width * 0.5f, 2, CameraCutThumbnailRenderer.Width, CameraCutThumbnailRenderer.Height),
                    };
                }
                image.UnlockChildrenRecursive();
                _thumbnails[req.ThumbnailIndex] = image;
                UpdateUI();
            }
            else if (image.Brush != null)
            {
                Timeline.CameraCutThumbnailRenderer.ReleaseThumbnail(((SpriteBrush)image.Brush).Sprite);
                image.Brush = null;
            }

            image.Brush = new SpriteBrush(sprite);
        }
Example #24
0
        private void RenderTaskOnBegin(SceneRenderTask task, GPUContext context)
        {
            _debugDrawData.Clear();

            // Collect selected objects debug shapes and visuals
            var selectedParents = TransformGizmo.SelectedParents;

            if (selectedParents.Count > 0)
            {
                for (int i = 0; i < selectedParents.Count; i++)
                {
                    if (selectedParents[i].IsActiveInHierarchy)
                    {
                        selectedParents[i].OnDebugDraw(_debugDrawData);
                    }
                }
            }
        }
Example #25
0
        /// <summary>
        /// Takes the screenshot of the current viewport.
        /// </summary>
        public void TakeScreenshot()
        {
            // Select task
            SceneRenderTask target = null;

            if (Editor.Windows.EditWin.IsSelected)
            {
                // Use editor window
                target = EditWin.Viewport.Task;
            }
            else
            {
                // Use game window
                GameWin.FocusOrShow();
            }

            // Fire screenshot taking
            Screenshot.Capture(target);
        }
Example #26
0
        private void OnEnable()
        {
            // Create backbuffer
            if (_output == null)
            {
                _output = RenderTarget.New();
            }
            _output.Init(PixelFormat.R8G8B8A8_UNorm, (int)_resolution.X, (int)_resolution.Y);

            // Create rendering task
            if (_task == null)
            {
                _task = RenderTask.Create <SceneRenderTask>();
            }
            _task.Order   = -100;
            _task.Camera  = Cam;
            _task.Output  = _output;
            _task.Enabled = false;

            if (Material && _material == null)
            {
                // Use dynamic material instance
                if (Material.WaitForLoaded())
                {
                    throw new Exception("Failed to load material.");
                }
                _material = Material.CreateVirtualInstance();

                // Set render task output to draw on model
                _material.GetParam("Image").Value = _output;

                // Bind material to parent model
                if (Actor is StaticModel staticModel && staticModel.Model)
                {
                    staticModel.Model.WaitForLoaded();
                    staticModel.Entries[0].Material = _material;
                }
            }

            _task.Enabled = true;
        }
Example #27
0
        /// <inheritdoc />
        protected override void DrawSelectionDepth(GPUContext context, SceneRenderTask task, GPUTexture customDepth)
        {
            var foliage = GizmoMode.SelectedFoliage;

            if (!foliage)
            {
                return;
            }
            var instanceIndex = GizmoMode.SelectedInstanceIndex;

            if (instanceIndex < 0 || instanceIndex >= foliage.InstancesCount)
            {
                return;
            }

            // Draw single instance
            var instance = foliage.GetInstance(instanceIndex);
            var model    = foliage.GetFoliageType(instance.Type).Model;

            if (model)
            {
                Transform instanceWorld = foliage.Transform.LocalToWorld(instance.Transform);

                if (!_staticModel)
                {
                    _staticModel = new StaticModel
                    {
                        StaticFlags = StaticFlags.None
                    };
                }

                _staticModel.Model     = model;
                _staticModel.Transform = instanceWorld;
                _actors.Add(_staticModel);

                Renderer.DrawSceneDepth(context, task, customDepth, _actors);
            }
        }
Example #28
0
        /// <inheritdoc />
        public override void Render(GPUContext context, SceneRenderTask task, RenderTarget input, RenderTarget output)
        {
            Profiler.BeginEventGPU("Selection Outline");

            // Pick a temporary depth buffer
            var customDepth = RenderTarget.GetTemporary(PixelFormat.R32_Typeless, input.Width, input.Height, TextureFlags.DepthStencil | TextureFlags.ShaderResource);

            context.ClearDepth(customDepth);

            // Draw objects to depth buffer
            if (_actors == null)
            {
                _actors = new List <Actor>();
            }
            else
            {
                _actors.Clear();
            }
            DrawSelectionDepth(context, task, customDepth);
            _actors.Clear();

            var near       = task.View.Near;
            var far        = task.View.Far;
            var projection = task.View.Projection;

            // Render outline
            _material.GetParam("OutlineColor0").Value = _color0;
            _material.GetParam("OutlineColor1").Value = _color1;
            _material.GetParam("CustomDepth").Value   = customDepth;
            _material.GetParam("ViewInfo").Value      = new Vector4(1.0f / projection.M11, 1.0f / projection.M22, far / (far - near), (-far * near) / (far - near) / far);
            context.DrawPostFxMaterial(_material, output, input, task);

            // Cleanup
            RenderTarget.ReleaseTemporary(customDepth);

            Profiler.EndEventGPU();
        }
Example #29
0
        /// <inheritdoc />
        protected override void DrawSelectionDepth(GPUContext context, SceneRenderTask task, RenderTarget customDepth)
        {
            var foliage = GizmoMode.SelectedFoliage;

            if (!foliage)
            {
                return;
            }
            var instanceIndex = GizmoMode.SelectedInstanceIndex;

            if (instanceIndex < 0 || instanceIndex >= foliage.InstancesCount)
            {
                return;
            }

            // Draw single instance
            foliage.GetInstance(instanceIndex, out var instance);
            var model = foliage.GetFoliageTypeModel(instance.Type);

            if (model)
            {
                Transform instanceWorld = foliage.Transform.LocalToWorld(instance.Transform);

                if (!_staticModel)
                {
                    _staticModel             = StaticModel.New();
                    _staticModel.StaticFlags = StaticFlags.None;
                }

                _staticModel.Model     = model;
                _staticModel.Transform = instanceWorld;
                _actors.Add(_staticModel);

                context.DrawSceneDepth(task, customDepth, true, _actors, ActorsSources.CustomActors);
            }
        }
Example #30
0
 /// <summary>
 /// Performs custom postFx rendering.
 /// </summary>
 /// <param name="context">The GPU commands context.</param>
 /// <param name="task">The current rendering task.</param>
 /// <param name="input">The input texture.</param>
 /// <param name="output">The output texture.</param>
 public abstract void Render(GPUContext context, SceneRenderTask task, RenderTarget input, RenderTarget output);