/*________*/ /*| A |*/ /*| /\ |*/ /*| / \ |*/ /*|C----B|*/ /*|______|*/ // There is no use for current algorithm because orthogonal projection should be cubic public void Update() { float ShadowFarPlane = 300.0f; float ShadowNearPlane = 30.0f; float FoV = EngineStatics.FoV; float halfFoV = FoV * 0.5f; float AspectRatio = EngineStatics.SCREEN_ASPECT_RATIO; Vector3 camWorldPosition = m_camera.GetEyeVector(); Vector3 camForward = m_camera.GetEyeSpaceForwardVector(); Vector3 camRight = m_camera.GetEyeSpaceRightVector(); // Omit y component camForward = new Vector3(camForward.X, 0, camForward.Z).Normalized(); camRight = new Vector3(camRight.X, 0, camRight.Z).Normalized(); Vector3 camFarPlaneWorldPosition = camWorldPosition + camForward * ShadowFarPlane; Vector3 camEdgeFarPlaneWorldPosition1 = camFarPlaneWorldPosition + camRight * ShadowFarPlane; Vector3 camEdgeFarPlaneWorldPosition2 = camFarPlaneWorldPosition - camRight * ShadowFarPlane; Vector3 camEdgeNearPlaneWorldPosition = camWorldPosition - camForward * ShadowNearPlane; //Matrix3 rotationPositive = Matrix3.CreateRotationY(MathHelper.DegreesToRadians(halfFoV)); //Matrix3 rotationNegative = Matrix3.CreateRotationY(MathHelper.DegreesToRadians(-halfFoV)); //Vector3 camEdgePlaneDirection1 = (VectorMath.VectorMathOperations.TransformVec3(ref camForward, ref rotationPositive)).Normalized(); //Vector3 camEdgePlaneDirection2 = (VectorMath.VectorMathOperations.TransformVec3(ref camForward, ref rotationNegative)).Normalized(); //float edge1ProjValue = Vector3.Dot(camEdgePlaneDirection1, camFarPlaneWorldPosition); //float edge2ProjValue = Vector3.Dot(camEdgePlaneDirection2, camFarPlaneWorldPosition); //Vector3 edgePosition1 = camWorldPosition + camEdgePlaneDirection1 * edge1ProjValue; //Vector3 edgePosition2 = camWorldPosition + camEdgePlaneDirection2 * edge2ProjValue; //Vector3 edgePosition3 = camWorldPosition - camForward * ShadowNearPlane; // TODO -> Find maxX, minX, maxZ, minZ float maxX = Math.Max(Math.Max(camEdgeFarPlaneWorldPosition1.X, camEdgeFarPlaneWorldPosition2.X), camEdgeNearPlaneWorldPosition.X); float maxZ = Math.Max(Math.Max(camEdgeFarPlaneWorldPosition1.Z, camEdgeFarPlaneWorldPosition2.Z), camEdgeNearPlaneWorldPosition.Z); float minX = Math.Min(Math.Min(camEdgeFarPlaneWorldPosition1.X, camEdgeFarPlaneWorldPosition2.X), camEdgeNearPlaneWorldPosition.X); float minZ = Math.Min(Math.Min(camEdgeFarPlaneWorldPosition1.Z, camEdgeFarPlaneWorldPosition2.Z), camEdgeNearPlaneWorldPosition.Z); Max = new Vector3(maxX, 0, maxZ); Min = new Vector3(minX, 0, minZ); }