swb_shared/util/CameraUtil.cs
using System;

/* 
 * Utility class for cameras
*/

namespace SWB.Shared;

public static class CameraUtil
{
	public static Vector3 ProjectToViewSpace( Vector3 pos, CameraComponent vmCam, CameraComponent worldCam )
	{
		var to = pos - vmCam.WorldPosition;
		var x = to.Dot( vmCam.WorldRotation.Right );
		var y = to.Dot( vmCam.WorldRotation.Up );
		var z = to.Dot( vmCam.WorldRotation.Forward );

		if ( z <= 0.001f ) return pos;

		var scale = MathF.Tan( MathX.DegreeToRadian( worldCam.FieldOfView ) * 0.5f )
				/ MathF.Tan( MathX.DegreeToRadian( vmCam.FieldOfView ) * 0.5f );

		x *= scale;
		y *= scale;

		return worldCam.WorldPosition
			+ worldCam.WorldRotation.Right * x
			+ worldCam.WorldRotation.Up * y
			+ worldCam.WorldRotation.Forward * z;
	}
}