Esempio n. 1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="RenderContext"/> class.
 /// </summary>
 /// <param name="renderHost">The render host.</param>
 public RenderContext(IRenderHost renderHost)
 {
     this.RenderHost     = renderHost;
     this.IsDeferredPass = false;
     cbuffer             = renderHost.EffectsManager.ConstantBufferPool.Register(DefaultBufferNames.GlobalTransformCB, GlobalTransformStruct.SizeInBytes);
     LightScene          = Collect(new Light3DSceneShared(renderHost.EffectsManager.ConstantBufferPool));
     SharedResource      = Collect(new ContextSharedResource());
     OITWeightPower      = 3;
     OITWeightDepthSlope = 1;
     OITWeightMode       = OITWeightMode.Linear2;
 }
Esempio n. 2
0
 /// <summary>
 /// Called when [render].
 /// </summary>
 /// <param name="lightScene">The light scene.</param>
 /// <param name="index">The index.</param>
 protected override void OnRender(Light3DSceneShared lightScene, int index)
 {
     base.OnRender(lightScene, index);
     lightScene.LightModels.Lights[index].LightDir  = Vector3.TransformNormal(direction, ModelMatrix).Normalized().ToVector4(0);
     lightScene.LightModels.Lights[index].LightSpot = new Vector4((float)Math.Cos(outerAngle / 360.0f * Math.PI), (float)Math.Cos(innerAngle / 360.0f * Math.PI), fallOff, 0);
 }
Esempio n. 3
0
 /// <summary>
 /// Called when [render].
 /// </summary>
 /// <param name="lightScene">The light scene.</param>
 /// <param name="idx">The index.</param>
 protected override void OnRender(Light3DSceneShared lightScene, int idx)
 {
     lightScene.LightModels.AmbientLight = Color;
 }
Esempio n. 4
0
 /// <summary>
 /// Called when [render].
 /// </summary>
 /// <param name="lightScene">The light scene.</param>
 /// <param name="idx">The index.</param>
 protected virtual void OnRender(Light3DSceneShared lightScene, int idx)
 {
     lightScene.LightModels.Lights[idx].LightColor = Color;
     lightScene.LightModels.Lights[idx].LightType  = (int)LightType;
 }
Esempio n. 5
0
 /// <summary>
 /// Determines whether this instance can render the specified light scene.
 /// </summary>
 /// <param name="lightScene">The light scene.</param>
 /// <returns>
 ///   <c>true</c> if this instance can render the specified light scene; otherwise, <c>false</c>.
 /// </returns>
 protected virtual bool CanRender(Light3DSceneShared lightScene)
 {
     return(IsAttached && lightScene.LightModels.LightCount < Constants.MaxLights);
 }
        private void Render(TimeSpan timeStamp)
        {
            var device = this.device;

            if (device == null)
            {
                return;
            }
            if (swapChain == null)
            {
                return;
            }
            if (renderRenderable != null)
            {
                // ---------------------------------------------------------------------------
                // this part is done only if the scene is not attached
                // it is an attach and init pass for all elements in the scene-graph
                if (!sceneAttached)
                {
                    try
                    {
                        Light3DSceneShared.Reset();
                        sceneAttached      = true;
                        ClearColor         = renderRenderable.BackgroundColor;
                        IsShadowMapEnabled = renderRenderable.IsShadowMappingEnabled;

                        RenderTechnique = renderRenderable.RenderTechnique == null ? RenderTechniquesManager?.RenderTechniques[DefaultRenderTechniqueNames.Blinn] : renderRenderable.RenderTechnique;

                        if (renderContext != null)
                        {
                            renderContext.Dispose();
                        }
                        renderContext = new RenderContext(this, EffectsManager.GetEffect(RenderTechnique), device.ImmediateContext);
                        renderContext.EnableBoundingFrustum = EnableRenderFrustum;
                        if (EnableSharingModelMode && SharedModelContainer != null)
                        {
                            SharedModelContainer.CurrentRenderHost = this;
                            renderRenderable.Attach(SharedModelContainer);
                        }
                        else
                        {
                            renderRenderable.Attach(this);
                        }

                        RenderTechniquesManager.RenderTechniques.TryGetValue(DeferredRenderTechniqueNames.GBuffer, out gbuffer);
                        RenderTechniquesManager.RenderTechniques.TryGetValue(DeferredRenderTechniqueNames.Deferred, out deferred);

                        if (RenderTechnique == deferred)
                        {
                            deferredRenderer.InitBuffers(this, Format.R32G32B32A32_Float);
                        }
                        else if (RenderTechnique == gbuffer)
                        {
                            deferredRenderer.InitBuffers(this, Format.B8G8R8A8_UNorm);
                        }
                        SetDefaultRenderTargets(false);
                    }
                    catch (Exception ex)
                    {
                        //MessageBox.Show("DPFCanvas: Error attaching element: " + string.Format(ex.Message), "Error");
                        Debug.WriteLine("DPFCanvas: Error attaching element: " + string.Format(ex.Message), "Error");
                        throw;
                    }
                }
                renderContext.TimeStamp = timeStamp;
                // ---------------------------------------------------------------------------
                // this part is per frame
                // ---------------------------------------------------------------------------
                if (EnableSharingModelMode && SharedModelContainer != null)
                {
                    SharedModelContainer.CurrentRenderHost = this;
                }
                ClearRenderTarget();
                if (RenderTechnique == deferred)
                {
                    // set G-Buffer
                    deferredRenderer.SetGBufferTargets(renderContext);

                    // render G-Buffer pass
                    renderRenderable.Render(renderContext);

                    // call deferred render
                    deferredRenderer.RenderDeferred(renderContext, renderRenderable);
                }
                else if (RenderTechnique == gbuffer)
                {
                    // set G-Buffer
                    deferredRenderer.SetGBufferTargets(targetWidth / 2, targetHeight / 2, renderContext);

                    // render G-Buffer pass
                    renderRenderable.Render(renderContext);

                    // reset render targets and run lighting pass
#if DoubleBuffer
                    deferredRenderer.RenderGBufferOutput(renderContext, ref backBuffer);
#else
                    this.deferredRenderer.RenderGBufferOutput(renderContext, ref this.backBuffer);
#endif
                }
                else
                {
                    renderRenderable.Render(renderContext);
                }
#if DoubleBuffer
                device.ImmediateContext.ResolveSubresource(colorBuffer, 0, backBuffer, 0, Format.B8G8R8A8_UNorm);
#endif
            }
        }
 protected override void OnRender(Light3DSceneShared lightScene, int index)
 {
     base.OnRender(lightScene, index);
     lightScene.LightModels.Lights[index].LightDir = -Vector3.TransformNormal(direction, ModelMatrix).Normalized().ToVector4(0);
 }
Esempio n. 8
0
 /// <summary>
 /// Called when [render].
 /// </summary>
 /// <param name="lightScene">The light scene.</param>
 /// <param name="index">The index.</param>
 protected override void OnRender(Light3DSceneShared lightScene, int index)
 {
     base.OnRender(lightScene, index);
     lightScene.LightModels.Lights[index].LightPos = (position + ModelMatrix.Row4.ToVector3()).ToVector4();
     lightScene.LightModels.Lights[index].LightAtt = attenuation.ToVector4(range);
 }
 protected override bool OnAttach(IRenderHost host)
 {
     Light3DSceneShared = host.Light3DSceneShared;
     return(base.OnAttach(host));
 }