public override IDAEDirectionalLightNode CreateDirectionalLightNode(string name, DAEVector4 color) { var light = new DirectionalLightNode(); light.Name = name; light.Color = GetColor4(color); return(light); }
public Vector4 PrepareProjection(SceneNode root, Matrix4 camSliceFrustumProjMatrix, CameraNode cam, DirectionalLightNode light) { CameraSliceFrustum.ProjectionMatrix = camSliceFrustumProjMatrix; CameraSliceFrustum.GetBoundingBox(cam.GetWorldTransform(root) ?? Matrix4.Identity, light.GetInverseWorldTransform(root) ?? Matrix4.Identity, _frustumBounding); CameraSliceFrustum.GetBoundingBox(_frustumMaxExtend); float size = (_frustumMaxExtend.Max.Value - _frustumMaxExtend.Min.Value).Length; float worldUnitsPerTexel = size / RenderTarget.DepthStencilBuffer.Width; Vector3 min = _frustumBounding.Min.Value; min /= worldUnitsPerTexel; min = new Vector3((float)System.Math.Floor(min.X), (float)System.Math.Floor(min.Y), (float)System.Math.Floor(min.Z)); min *= worldUnitsPerTexel; LightFrustum.ProjectionMatrix = Matrix4.OrthoOffCenterRH(min.X, min.X + size, min.Y, min.Y + size, light.NearPlane, light.FarPlane); Vector4 shadowOffsetAndScale = new Vector4( (-0.5f - min.X), (-0.5f + min.Y + size), 1 / size, 1 / size); return(shadowOffsetAndScale); }