diff --git a/interface/src/SecondaryCamera.cpp b/interface/src/SecondaryCamera.cpp index ae4c67507a..257c8454c5 100644 --- a/interface/src/SecondaryCamera.cpp +++ b/interface/src/SecondaryCamera.cpp @@ -42,6 +42,9 @@ void SecondaryCameraRenderTaskConfig::resetSizeSpectatorCamera(int width, int he class BeginSecondaryCameraFrame { // Changes renderContext for our framebuffer and and view. glm::vec3 _position{}; glm::quat _orientation{}; + float _vFoV{}; + float _nearClipPlaneDistance{}; + float _farClipPlaneDistance{}; public: using Config = BeginSecondaryCameraFrameConfig; using JobModel = render::Job::ModelO; @@ -53,6 +56,9 @@ public: if (config.enabled || config.alwaysEnabled) { _position = config.position; _orientation = config.orientation; + _vFoV = config.vFoV; + _nearClipPlaneDistance = config.nearClipPlaneDistance; + _farClipPlaneDistance = config.farClipPlaneDistance; } } @@ -76,7 +82,7 @@ public: auto srcViewFrustum = args->getViewFrustum(); srcViewFrustum.setPosition(_position); srcViewFrustum.setOrientation(_orientation); - srcViewFrustum.setProjection(glm::perspective(45.0f, ((float)args->_viewport.z / (float)args->_viewport.w), 0.1f, 100.0f)); + srcViewFrustum.setProjection(glm::perspective(glm::radians(_vFoV), ((float)args->_viewport.z / (float)args->_viewport.w), _nearClipPlaneDistance, _farClipPlaneDistance)); // Without calculating the bound planes, the secondary camera will use the same culling frustum as the main camera, // which is not what we want here. srcViewFrustum.calculate(); diff --git a/interface/src/SecondaryCamera.h b/interface/src/SecondaryCamera.h index 1abb2952aa..f689c042c0 100644 --- a/interface/src/SecondaryCamera.h +++ b/interface/src/SecondaryCamera.h @@ -29,13 +29,19 @@ public: void build(JobModel& task, const render::Varying& inputs, render::Varying& outputs, render::CullFunctor cullFunctor, bool isDeferred = true); }; -class BeginSecondaryCameraFrameConfig : public render::Task::Config { // Exposes view frustum position/orientation to javascript. +class BeginSecondaryCameraFrameConfig : public render::Task::Config { // Exposes secondary camera parameters to JavaScript. Q_OBJECT Q_PROPERTY(glm::vec3 position MEMBER position NOTIFY dirty) // of viewpoint to render from Q_PROPERTY(glm::quat orientation MEMBER orientation NOTIFY dirty) // of viewpoint to render from + Q_PROPERTY(float vFoV MEMBER vFoV NOTIFY dirty) // Secondary camera's vertical field of view. In degrees. + Q_PROPERTY(float nearClipPlaneDistance MEMBER nearClipPlaneDistance NOTIFY dirty) // Secondary camera's near clip plane distance. In meters. + Q_PROPERTY(float farClipPlaneDistance MEMBER farClipPlaneDistance NOTIFY dirty) // Secondary camera's far clip plane distance. In meters. public: glm::vec3 position{}; glm::quat orientation{}; + float vFoV{}; + float nearClipPlaneDistance{}; + float farClipPlaneDistance{}; BeginSecondaryCameraFrameConfig() : render::Task::Config(false) {} signals: void dirty(); diff --git a/scripts/system/spectatorCamera.js b/scripts/system/spectatorCamera.js index f77eaab3e4..a3cdea7bd5 100644 --- a/scripts/system/spectatorCamera.js +++ b/scripts/system/spectatorCamera.js @@ -81,6 +81,9 @@ // function is wired. // windowAspectRatio: The ratio of the Interface windows's sizeX/sizeY // previewAspectRatio: The ratio of the camera preview's sizeX/sizeY + // vFoV: The vertical field of view of the spectator camera + // nearClipPlaneDistance: The near clip plane distance of the spectator camera + // farClipPlaneDistance: The far clip plane distance of the spectator camera // // Arguments: // None @@ -91,7 +94,10 @@ // var isUpdateRenderWired = false; var windowAspectRatio; - var previewAspectRatio = 16/9; + var previewAspectRatio = 16 / 9; + var vFoV = 45.0; + var nearClipPlaneDistance = 0.1; + var farClipPlaneDistance = 100.0; function spectatorCameraOn() { // Set the special texture size based on the window in which it will eventually be displayed. var size = Controller.getViewportDimensions(); // FIXME: Need a signal to hook into when the dimensions change. @@ -100,6 +106,9 @@ windowAspectRatio = sizeX/sizeY; spectatorFrameRenderConfig.resetSizeSpectatorCamera(sizeX, sizeY); spectatorFrameRenderConfig.enabled = beginSpectatorFrameRenderConfig.enabled = true; + beginSpectatorFrameRenderConfig.vFoV = vFoV; + beginSpectatorFrameRenderConfig.nearClipPlaneDistance = nearClipPlaneDistance; + beginSpectatorFrameRenderConfig.farClipPlaneDistance = farClipPlaneDistance; var cameraRotation = MyAvatar.orientation, cameraPosition = inFrontOf(1, Vec3.sum(MyAvatar.position, { x: 0, y: 0.3, z: 0 })); Script.update.connect(updateRenderFromCamera); isUpdateRenderWired = true;