/// <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); }
/// <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; }
/// <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(); }
/// <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(); }
/// <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(); }
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); } } }