Exemplo n.º 1
0
        /// <summary>
        /// Adds a shadow caster to the canvas.
        /// </summary>
        public void AddShadowCaster(Vector2[] vertices, float x, float y, ShadowType shadowType = ShadowType.Illuminated)
        {
            if (!_lighting)
            {
                return;
            }

            LightRenderer.AddShadowCaster(Matrix, vertices, x, y, shadowType);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Puts the canvas into lighting mode.
        /// </summary>
        public void BeginLighting()
        {
            System.Diagnostics.Debug.Assert(!_lighting, "Already lighting");

            if (_lighting)
            {
                return;
            }

            _lighting = true;

            LightRenderer?.Reset();

            Begin();

            // create gbuffer
            //

            var refDiffuse = _diffuseMap;
            var refNormal  = _normalMap;

            _diffuseMap  = Global.CreateRenderImage(Width, Height, ref _diffuseMap, RenderTargetUsage.PreserveContents);
            _normalMap   = Global.CreateRenderImage(Width, Height, ref _normalMap);
            _specularMap = Global.CreateRenderImage(Width, Height, ref _specularMap, RenderTargetUsage.DiscardContents);

            if (refDiffuse != _diffuseMap || refNormal != _normalMap)
            {
                _gBufferDiffuseNormalSpecular = new RenderTargetBinding[]
                {
                    new RenderTargetBinding(_diffuseMap),
                    new RenderTargetBinding(_normalMap),
                    new RenderTargetBinding(_specularMap)
                };
                _gBufferDiffuseNormal = new RenderTargetBinding[]
                {
                    new RenderTargetBinding(_diffuseMap),
                    new RenderTargetBinding(_normalMap)
                };
                _gBufferDiffuse = new RenderTargetBinding[]
                {
                    new RenderTargetBinding(_diffuseMap)
                };
            }

            // clear gbuffer
            //
            Device.SetRenderTarget(_diffuseMap);
            Device.Clear(Color.Black);
            Device.SetRenderTarget(_normalMap);
            Device.Clear(new Color(0.5f, 0.5f, 0, 1.0f));
            Device.SetRenderTarget(_specularMap);
            Device.Clear(Color.TransparentBlack);// Clear Alpha, because SurafceFprmat is Alpha8

            RenderTarget = _diffuseMap;
        }
Exemplo n.º 3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="range"></param>
        /// <param name="intensity">interpolstion: 1 = linear, >1 qudratic ...</param>
        /// <param name="size"> used for shadows</param>
        /// <param name="depth"> Z Position</param>
        public void AddPointLight(float x, float y, float range, float intensity = 4.0f, float size = 4.0f, float depth = 96.0f)
        {
            if (!_lighting)
            {
                return;
            }

            PushMatrix();
            Translate(x, y);
            LightRenderer.AddPointLight(Matrix, Color, range, intensity, size, depth);
            PopMatrix();
        }
Exemplo n.º 4
0
        /// <summary>
        ///  Renders lighting and ends lighting mode.
        /// </summary>
        public void EndLighting()
        {
            if (!_lighting)
            {
                return;
            }

            // draw everything
            //
            Flush(); _lighting = false;

            // Update lighting
            //
            LightRenderer.Resize(this.Width, this.Height);
            var lightmap = LightRenderer.Render(_normalMap, AmbientColor, ShadowEnabled, NormalmapEnabled);


            // Combine diffuse an Lighting
            //  diffuse * Lighting + specular
            //
            PushMatrix();
            ResetMatrix();
            RenderTarget = _PostEffectPipeline.GetRenderTarget(_diffuseMap);
            Color        = Color.White;
            Effect       = _lightingEffect;
            BlendMode    = BlendMode.Opaque;

            Alpha = 1;

            _lightingEffect.Parameters["WorldViewProjection"].SetValue(WorldViewProj);
            _lightingEffect.Parameters["DiffuseSampler"].SetValue(_diffuseMap);
            _lightingEffect.Parameters["LightmapSampler"].SetValue(lightmap);
            _lightingEffect.Parameters["SpecularMapSampler"].SetValue(_specularMap);

            Device.SamplerStates[0] = SamplerState.PointClamp;
            Device.SamplerStates[1] = SamplerState.PointClamp;
            Device.SamplerStates[2] = SamplerState.PointClamp;

            DrawImage(_diffuseMap, 0, 0);
            Flush();

            _PostEffectPipeline.Render(this);

            if (ShowGBuffer)
            {
                RenderGBuffer(lightmap);
            }

            PopMatrix();
        }
Exemplo n.º 5
0
        /// <summary>
        /// Adds a spot light to the canvas.
        /// </summary>
        public void AddSpotLight(float x, float y, float angle, float range,
                                 float inner = 25, float outer = 45, float intensity = 4.0f, float size = 4.0f, float depth = 96.0f)
        {
            if (!_lighting)
            {
                return;
            }

            PushMatrix();
            Translate(x, y);
            Rotate(angle);
            Scale(1, 1);
            LightRenderer.AddSpotLight(Matrix, Color, inner, outer, range, intensity, size, depth);
            PopMatrix();
        }
Exemplo n.º 6
0
        private void DrawImageInternal(Image img, float x, float y)
        {
            unsafe
            {
                var ptr  = AddDrawOp((int)PrimType.Quad, 1, img, _currentEffect, _blendMode);
                var quad = img.Quad;

                ptr[0].Transform(quad.vertex0.X + x, quad.vertex0.Y + y, quad.u0, quad.v0, _transform._tanX, _transform._tanY, _transform, _color);
                ptr[1].Transform(quad.vertex1.X + x, quad.vertex1.Y + y, quad.u1, quad.v0, _transform._tanX, _transform._tanY, _transform, _color);
                ptr[2].Transform(quad.vertex2.X + x, quad.vertex2.Y + y, quad.u1, quad.v1, _transform._tanX, _transform._tanY, _transform, _color);
                ptr[3].Transform(quad.vertex3.X + x, quad.vertex3.Y + y, quad.u0, quad.v1, _transform._tanX, _transform._tanY, _transform, _color);

                if (_lighting && img.ShadowCaster != null)
                {
                    LightRenderer.AddShadowCaster(Matrix, img.ShadowCaster, x + img.Width / 2, y + img.Height / 2);
                }
            }
        }