using System; using System.Collections.Generic; using Encompass; using Kav; using KavTest.Components; using KavTest.Extensions; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace KavTest.Renderers { public class SceneRenderer : GeneralRenderer { private Kav.Renderer Renderer { get; } private IEnumerable<(Kav.Model, Matrix)> ModelTransforms { get { foreach (var entity in ReadEntitiesAsEnumerable()) { var transformComponent = GetComponent(entity); var modelComponent = GetComponent(entity); if (HasComponent(entity)) { var overrideAlbedoComponent = GetComponent(entity); foreach (var mesh in modelComponent.Model.Meshes) { foreach (var meshPart in mesh.MeshParts) { if (meshPart.Effect is DeferredPBR_GBufferEffect gBufferEffect) { gBufferEffect.AlbedoTexture = null; gBufferEffect.Albedo = overrideAlbedoComponent.Color; } } } } yield return (modelComponent.Model, transformComponent.Transform.TransformMatrix); } } } private IEnumerable PointLights { get { foreach (var entity in ReadEntitiesAsEnumerable()) { var transformComponent = GetComponent(entity); var pointLightComponent = GetComponent(entity); yield return new PointLight( transformComponent.Transform.Position, pointLightComponent.Color, pointLightComponent.Intensity ); } } } private Kav.DirectionalLight DirectionalLight() { var entity = ReadEntity(); var transformComponent = GetComponent(entity); var directionalLightComponent = GetComponent(entity); return new Kav.DirectionalLight( transformComponent.Transform.Forward, directionalLightComponent.Color, directionalLightComponent.Intensity ); } public SceneRenderer(GraphicsDevice graphicsDevice) { Renderer = new Kav.Renderer( graphicsDevice, graphicsDevice.PresentationParameters.BackBufferWidth, graphicsDevice.PresentationParameters.BackBufferHeight, 3 ); } public override void Render() { if (SomeComponent()) { var cameraEntity = ReadEntity(); var transformComponent = GetComponent(cameraEntity); var cameraComponent = GetComponent(cameraEntity); var camera = new Kav.PerspectiveCamera( transformComponent.ArcballTransform.Position, transformComponent.ArcballTransform.Forward, transformComponent.ArcballTransform.Up, cameraComponent.FieldOfView, cameraComponent.AspectRatio, cameraComponent.NearPlane, cameraComponent.FarPlane ); // if (SomeComponent()) // { // ref readonly var directionalLightEntity = ref ReadEntity(); // ref readonly var directionalLightTransformComponent = ref GetComponent(directionalLightEntity); // ref readonly var directionalLightComponent = ref GetComponent(directionalLightEntity); // Renderer.DepthRender( // ModelTransforms, // new Kav.DirectionalLight( // directionalLightTransformComponent.Transform.Forward, // directionalLightComponent.Color, // directionalLightComponent.Intensity // ) // ); // } Renderer.DeferredRender( camera, ModelTransforms, PointLights, DirectionalLight() ); // foreach (var directionalLight in DirectionalLights) // { // Renderer.DepthRender( // ModelTransforms, // directionalLight // ); // } } } } }