KavTest/KavTest/Renderers/SceneRenderer.cs

227 lines
8.4 KiB
C#
Raw Normal View History

2020-08-05 19:21:42 +00:00
using System;
using System.Collections.Generic;
using Encompass;
using Kav;
using KavTest.Components;
2020-08-26 23:07:31 +00:00
using KavTest.Extensions;
2020-08-07 08:13:20 +00:00
using Microsoft.Xna.Framework;
2020-08-05 19:21:42 +00:00
using Microsoft.Xna.Framework.Graphics;
namespace KavTest.Renderers
{
public class SceneRenderer : GeneralRenderer
{
2020-12-04 23:40:27 +00:00
private GraphicsDevice GraphicsDevice { get; }
private SpriteBatch SpriteBatch { get; }
2020-08-07 08:13:20 +00:00
private Kav.Renderer Renderer { get; }
2020-12-04 23:40:27 +00:00
private RenderTarget2D DeferredTarget { get; }
private RenderTarget2D BillboardTarget { get; }
2020-08-05 19:21:42 +00:00
2020-08-07 08:13:20 +00:00
private IEnumerable<(Kav.Model, Matrix)> ModelTransforms
2020-08-05 19:21:42 +00:00
{
get
{
foreach (var entity in ReadEntitiesAsEnumerable<ModelComponent>())
{
2020-10-02 05:27:41 +00:00
/* FIXME: this transformation should definitely not go here */
2020-08-05 22:10:04 +00:00
var transformComponent = GetComponent<Transform3DComponent>(entity);
2020-08-05 19:21:42 +00:00
var modelComponent = GetComponent<ModelComponent>(entity);
2020-08-26 23:07:31 +00:00
if (HasComponent<OverrideAlbedoComponent>(entity))
{
var overrideAlbedoComponent = GetComponent<OverrideAlbedoComponent>(entity);
foreach (var mesh in modelComponent.Model.Meshes)
{
foreach (var meshPart in mesh.MeshParts)
{
2020-10-02 05:27:41 +00:00
meshPart.DisableAlbedoMap = true;
meshPart.Albedo = overrideAlbedoComponent.Color;
2020-08-26 23:07:31 +00:00
}
}
}
2020-08-07 08:13:20 +00:00
yield return (modelComponent.Model, transformComponent.Transform.TransformMatrix);
2020-08-05 19:21:42 +00:00
}
}
}
2020-10-01 21:53:15 +00:00
private AmbientLight AmbientLight
{
get
{
if (SomeComponent<AmbientLightComponent>())
{
return new AmbientLight(ReadComponent<AmbientLightComponent>().Color);
}
else
{
return new AmbientLight(Color.Black);
}
}
}
2020-08-05 19:21:42 +00:00
private IEnumerable<PointLight> PointLights
{
get
{
foreach (var entity in ReadEntitiesAsEnumerable<PointLightComponent>())
{
2020-08-05 22:10:04 +00:00
var transformComponent = GetComponent<Transform3DComponent>(entity);
2020-08-05 19:21:42 +00:00
var pointLightComponent = GetComponent<PointLightComponent>(entity);
yield return new PointLight(
2020-08-07 08:13:20 +00:00
transformComponent.Transform.Position,
2020-08-05 19:21:42 +00:00
pointLightComponent.Color,
pointLightComponent.Intensity
);
}
}
}
2020-12-07 02:52:41 +00:00
private Kav.DirectionalLight? DirectionalLight()
2020-08-07 08:13:20 +00:00
{
2020-12-07 02:52:41 +00:00
if (SomeComponent<DirectionalLightComponent>())
{
var entity = ReadEntity<DirectionalLightComponent>();
var transformComponent = GetComponent<Transform3DComponent>(entity);
var directionalLightComponent = GetComponent<DirectionalLightComponent>(entity);
return new Kav.DirectionalLight(
transformComponent.Transform.Forward,
directionalLightComponent.Color,
directionalLightComponent.Intensity
);
}
else
{
return null;
}
2020-08-07 08:13:20 +00:00
}
2020-12-07 02:52:41 +00:00
private IEnumerable<(MeshSprite, Matrix)> MeshSpriteTransforms()
2020-12-04 23:40:27 +00:00
{
2020-12-07 02:52:41 +00:00
foreach (var entity in ReadEntitiesAsEnumerable<MeshSpriteComponent>())
2020-12-04 23:40:27 +00:00
{
var transformComponent = GetComponent<Transform3DComponent>(entity);
2020-12-07 02:52:41 +00:00
var spriteComponent = GetComponent<MeshSpriteComponent>(entity);
yield return (spriteComponent.MeshSprite, transformComponent.Transform.TransformMatrix);
2020-12-04 23:40:27 +00:00
}
}
2020-08-05 19:21:42 +00:00
public SceneRenderer(GraphicsDevice graphicsDevice)
{
2020-09-19 08:06:50 +00:00
Renderer = new Kav.Renderer(
2020-12-04 23:40:27 +00:00
graphicsDevice,
graphicsDevice.PresentationParameters.BackBufferWidth,
2020-09-19 08:06:50 +00:00
graphicsDevice.PresentationParameters.BackBufferHeight,
2020-09-21 07:44:21 +00:00
4,
4096
2020-09-19 08:06:50 +00:00
);
2020-12-04 23:40:27 +00:00
DeferredTarget = new RenderTarget2D(
graphicsDevice,
graphicsDevice.PresentationParameters.BackBufferWidth,
graphicsDevice.PresentationParameters.BackBufferHeight,
false,
SurfaceFormat.Color,
DepthFormat.Depth24Stencil8,
0,
RenderTargetUsage.PreserveContents
);
BillboardTarget = new RenderTarget2D(
graphicsDevice,
graphicsDevice.PresentationParameters.BackBufferWidth,
graphicsDevice.PresentationParameters.BackBufferHeight,
false,
SurfaceFormat.Color,
DepthFormat.Depth24Stencil8,
0,
RenderTargetUsage.PreserveContents
);
GraphicsDevice = graphicsDevice;
SpriteBatch = new SpriteBatch(GraphicsDevice);
2020-08-05 19:21:42 +00:00
}
public override void Render()
{
2020-09-19 08:06:50 +00:00
if (SomeComponent<PerspectiveCameraComponent>())
2020-08-05 19:21:42 +00:00
{
2020-09-19 08:06:50 +00:00
var cameraEntity = ReadEntity<PerspectiveCameraComponent>();
2020-08-06 21:21:34 +00:00
var transformComponent = GetComponent<ArcballTransformComponent>(cameraEntity);
2020-09-19 08:06:50 +00:00
var cameraComponent = GetComponent<PerspectiveCameraComponent>(cameraEntity);
2020-08-06 07:00:02 +00:00
2020-09-19 08:06:50 +00:00
var camera = new Kav.PerspectiveCamera(
transformComponent.ArcballTransform.Position,
transformComponent.ArcballTransform.Forward,
transformComponent.ArcballTransform.Up,
cameraComponent.FieldOfView,
cameraComponent.AspectRatio,
cameraComponent.NearPlane,
cameraComponent.FarPlane
2020-08-06 07:00:02 +00:00
);
2020-08-05 19:21:42 +00:00
2020-08-07 08:13:20 +00:00
// if (SomeComponent<DirectionalLightComponent>())
// {
// ref readonly var directionalLightEntity = ref ReadEntity<DirectionalLightComponent>();
// ref readonly var directionalLightTransformComponent = ref GetComponent<Transform3DComponent>(directionalLightEntity);
// ref readonly var directionalLightComponent = ref GetComponent<DirectionalLightComponent>(directionalLightEntity);
// Renderer.DepthRender(
// ModelTransforms,
// new Kav.DirectionalLight(
// directionalLightTransformComponent.Transform.Forward,
// directionalLightComponent.Color,
// directionalLightComponent.Intensity
// )
// );
// }
2020-10-01 21:53:15 +00:00
// Renderer.DeferredRender(
// camera,
// ModelTransforms,
2020-10-02 05:27:41 +00:00
// AmbientLight,
2020-10-01 21:53:15 +00:00
// PointLights,
// DirectionalLight()
// );
Renderer.DeferredToonRender(
2020-12-04 23:40:27 +00:00
DeferredTarget,
2020-08-06 07:00:02 +00:00
camera,
2020-08-07 08:13:20 +00:00
ModelTransforms,
2020-10-01 21:53:15 +00:00
AmbientLight,
2020-10-19 10:02:31 +00:00
PointLights,
2020-10-17 20:53:52 +00:00
DirectionalLight(),
ReadComponent<SkyboxComponent>().Skybox
2020-08-05 19:21:42 +00:00
);
2020-08-22 04:29:18 +00:00
2020-12-07 02:52:41 +00:00
Renderer.MeshSpriteRender(
2020-12-04 23:40:27 +00:00
BillboardTarget,
camera,
ModelTransforms,
2020-12-07 02:52:41 +00:00
MeshSpriteTransforms(),
2020-12-06 03:47:40 +00:00
AmbientLight,
PointLights,
DirectionalLight()
2020-12-04 23:40:27 +00:00
);
GraphicsDevice.SetRenderTarget(null);
SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null, null);
SpriteBatch.Draw(DeferredTarget, Vector2.Zero, Color.White);
SpriteBatch.Draw(BillboardTarget, Vector2.Zero, Color.White);
SpriteBatch.End();
2020-08-23 01:31:59 +00:00
// foreach (var directionalLight in DirectionalLights)
// {
// Renderer.DepthRender(
// ModelTransforms,
// directionalLight
// );
// }
2020-08-05 19:21:42 +00:00
}
}
}
}