PageRenderTime 39ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/Engine/Renderer/Driver.cs

#
C# | 200 lines | 168 code | 32 blank | 0 comment | 11 complexity | 48ec1db6742a800a5fc62164e8cb1a91 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Microsoft.Xna.Framework.Graphics;
  6. using Microsoft.Xna.Framework;
  7. namespace Jemgine.Engine.Renderer
  8. {
  9. public enum ShadowType
  10. {
  11. Solid,
  12. None,
  13. }
  14. public class Driver
  15. {
  16. private RenderTarget2D ShadowBuffer;
  17. private RenderTarget2D BackgroundLightBuffer;
  18. private RenderTarget2D MiddlegroundLightBuffer;
  19. private Texture2D LightTexture;
  20. public Driver(GraphicsDevice Device, EpisodeContentManager Content)
  21. {
  22. ShadowBuffer = new RenderTarget2D(Device, 512, 512, false,
  23. SurfaceFormat.Color, DepthFormat.None, 0, RenderTargetUsage.PreserveContents);
  24. BackgroundLightBuffer = new RenderTarget2D(Device, 256, 256, false,
  25. SurfaceFormat.Color, DepthFormat.None, 0, RenderTargetUsage.PreserveContents);
  26. MiddlegroundLightBuffer = new RenderTarget2D(Device, 128, 128, false,
  27. SurfaceFormat.Color, DepthFormat.None, 0, RenderTargetUsage.PreserveContents);
  28. LightTexture = Content.Load<Texture2D>("light");
  29. }
  30. public void DrawMap(List<Data.EntityRecord> Elements, Data.MapHeader Header, GraphicsDevice Device, Camera Cam,
  31. RenderEffect Effect, VertexPusher Pusher, EpisodeContentManager Content, bool DisplayShadowmap = false)
  32. {
  33. var Viewport = Device.Viewport;
  34. Pusher.Effect = Effect;
  35. Effect.Tint = Vector4.One;
  36. Effect.RestoreMatrixStack();
  37. Device.SetRenderTarget(BackgroundLightBuffer);
  38. Effect.ProjectionMatrix = Cam.Projection;
  39. Effect.ViewMatrix = Cam.View;
  40. Effect.Color = Vector4.One;
  41. Device.Clear(ClearOptions.Target, new Vector4(Header.AmbientLighting, 1.0f), 0, 0);
  42. foreach (var Entity in Elements)
  43. {
  44. foreach (Data.Light Light in from Element in Entity.AttachedElements
  45. where Element is Data.Light
  46. select Element as Data.Light)
  47. {
  48. if (!Light.Enabled) continue;
  49. Device.SetRenderTarget(ShadowBuffer);
  50. Effect.ProjectionMatrix = Cam.Projection;
  51. Effect.ViewMatrix = Cam.View;
  52. Effect.Color = Vector4.One;
  53. Effect.Tint = Vector4.One;
  54. Device.Clear(Microsoft.Xna.Framework.Color.Black);
  55. Effect.Technique = "DrawShadow";
  56. foreach (var EntityB in from MapElement in Elements
  57. where MapElement.DrawDepth == Data.EntityRecord._DrawDepth.MiddleGround
  58. select MapElement)
  59. foreach (var ShadowCaster in from Element in EntityB.AttachedElements
  60. where Element is ICastShadow
  61. select Element as Data.EntityElement)
  62. {
  63. var M = (ShadowCaster.BoneReference == null ? Matrix.Identity : ShadowCaster.BoneReference.Transform) *
  64. EntityB.GetTransform();
  65. (ShadowCaster as ICastShadow).DrawShadow(Effect, Light.GetAnimatedWorldPosition(), M, Pusher);
  66. }
  67. Device.SetRenderTarget(BackgroundLightBuffer);
  68. Effect.ProjectionMatrix = Cam.Projection;
  69. Effect.ViewMatrix = Cam.View;
  70. Effect.Color = new Vector4(Light.Color, 1.0f);
  71. Effect.Tint = Vector4.One;
  72. Effect.ShadowMap = ShadowBuffer;
  73. Effect.PushMatrix(Light.GetFullTransform());
  74. Effect.PushMatrix(Matrix.CreateTranslation(new Vector3(Light.Position, 0.0f)));
  75. Effect.PushMatrix(Matrix.CreateScale(Light.Radius * 2));
  76. Effect.Texture = LightTexture;
  77. Effect.Technique = "DrawLight";
  78. Pusher.DrawSprite(false);
  79. Effect.PopMatrix();
  80. Effect.PopMatrix();
  81. Effect.PopMatrix();
  82. }
  83. }
  84. Device.SetRenderTarget(MiddlegroundLightBuffer);
  85. Device.Clear(ClearOptions.Target, new Vector4(Header.AmbientLighting, 1.0f), 0, 0);
  86. Effect.ProjectionMatrix = Cam.Projection;
  87. Effect.ViewMatrix = Cam.View;
  88. Effect.Tint = Vector4.One;
  89. Effect.Texture = LightTexture;
  90. Effect.Technique = "DrawLight2";
  91. foreach (var Entity in Elements)
  92. {
  93. foreach (Data.Light Light in from Element in Entity.AttachedElements
  94. where Element is Data.Light
  95. select Element as Data.Light)
  96. {
  97. if (!Light.Enabled) continue;
  98. Effect.Color = new Vector4(Light.Color, 1.0f);
  99. Effect.PushMatrix(Light.GetFullTransform());
  100. Effect.PushMatrix(Matrix.CreateTranslation(new Vector3(Light.Position, 0.0f)));
  101. Effect.PushMatrix(Matrix.CreateScale(Light.Radius * 2));
  102. Pusher.DrawSprite(false);
  103. Effect.PopMatrix();
  104. Effect.PopMatrix();
  105. Effect.PopMatrix();
  106. }
  107. }
  108. Device.SetRenderTarget(null);
  109. Device.Viewport = Viewport;
  110. Effect.ProjectionMatrix = Cam.Projection;
  111. Effect.ViewMatrix = Cam.View;
  112. Effect.Color = Vector4.One;
  113. Effect.LightMap = BackgroundLightBuffer;
  114. Device.Clear(Microsoft.Xna.Framework.Color.Black);
  115. Effect.Technique = "DrawLighted";
  116. if (!String.IsNullOrEmpty(Header.BackgroundTexture))
  117. {
  118. Effect.Texture = Content.GetTexture(Header.BackgroundTexture);
  119. Pusher.DrawFullScreenQuad(Header.BackgroundScale, Cam);
  120. }
  121. DrawLayer(Elements, Effect, Pusher, Content, Data.EntityRecord._DrawDepth.BackGround);
  122. Effect.LightMap = MiddlegroundLightBuffer;
  123. DrawLayer(Elements, Effect, Pusher, Content, Data.EntityRecord._DrawDepth.MiddleGround);
  124. Effect.Technique = "DrawFullbright";
  125. DrawLayer(Elements, Effect, Pusher, Content, Data.EntityRecord._DrawDepth.ForeGround);
  126. }
  127. public void DrawSimpleMap(Jemgine.Data.MapData Map, GraphicsDevice Device, Camera Cam,
  128. RenderEffect Effect, VertexPusher Pusher, EpisodeContentManager Content)
  129. {
  130. Effect.ProjectionMatrix = Cam.Projection;
  131. Effect.ViewMatrix = Cam.View;
  132. Effect.Color = Vector4.One;
  133. Effect.LightMap = BackgroundLightBuffer;
  134. Effect.Technique = "DrawFullbright";
  135. DrawLayerEx(Map.Elements, Effect, Pusher, Content);
  136. }
  137. private void DrawLayer(List<Data.EntityRecord> Elements, RenderEffect Effect, VertexPusher Pusher, EpisodeContentManager Content,
  138. Data.EntityRecord._DrawDepth Layer)
  139. {
  140. foreach (var Entity in from Element in Elements where Element.DrawDepth == Layer select Element)
  141. DrawEntity(Effect, Pusher, Content, Entity);
  142. }
  143. private void DrawLayerEx(List<Data.MapElement> Elements, RenderEffect Effect, VertexPusher Pusher,
  144. EpisodeContentManager Content)
  145. {
  146. foreach (var Entity in from Element in Elements where Element is Data.EntityRecord select Element)
  147. DrawEntity(Effect, Pusher, Content, Entity);
  148. }
  149. private void DrawEntity(RenderEffect Effect, VertexPusher Pusher, EpisodeContentManager Content, Data.MapElement A)
  150. {
  151. var E = A as Data.EntityRecord;
  152. Effect.PushMatrix(E.GetTransform());
  153. Effect.Tint = E.Tint;
  154. E.ForEachAttachedReverse((B) => DrawEntityElement(B, Effect, Pusher, Content));
  155. Effect.PopMatrix();
  156. }
  157. private void DrawEntityElement(Data.EntityElement Element,
  158. RenderEffect Effect, VertexPusher Pusher, EpisodeContentManager Content)
  159. {
  160. if (Element is IDrawable)
  161. {
  162. if (Element.BoneReference != null) Effect.PushMatrix(Element.BoneReference.Transform);
  163. (Element as IDrawable).Draw(Effect, Pusher, Content);
  164. if (Element.BoneReference != null) Effect.PopMatrix();
  165. }
  166. }
  167. }
  168. }