From acb2da7759f480c5ae8ec4b521cab080ac3aa5ba Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Thu, 25 Mar 2021 15:22:19 -0700 Subject: [PATCH] Improvements to Camera APIs (#3701) * move the focus distance from DofOptions to Camera The DofOption parameter is now deprecated, but will still work if the focus distance is not set on Camera. * A few new helper APIs on Camera - getFocalLength() which returns the focal length used internally for DoF computations. - computeEffectiveFov() and computeEffectiveFocalLength() which can be used to better simulate a real camera's FOV changes with the focus distance. Modified gltf_viewer so it uses the effective fov/focallendth when DoF is active. * simplify setLensProjection We can call setProjection directly instead of converting to a fov first, which ends up performing atan(tan(x)). Also improve parameters names. --- .../filament-android/src/main/cpp/Camera.cpp | 33 +++++++++ .../com/google/android/filament/Camera.java | 50 ++++++++++++++ .../com/google/android/filament/View.java | 7 +- filament/include/filament/Camera.h | 36 +++++++++- filament/include/filament/View.h | 2 +- filament/src/Camera.cpp | 68 +++++++++++++++---- filament/src/PostProcessManager.cpp | 2 +- filament/src/View.cpp | 2 +- filament/src/details/Camera.h | 28 ++++++-- libs/viewer/include/viewer/Settings.h | 1 + libs/viewer/src/Settings.cpp | 9 ++- samples/gltf_viewer.cpp | 9 ++- web/filament-js/filament.d.ts | 5 ++ web/filament-js/jsbindings.cpp | 6 ++ 14 files changed, 232 insertions(+), 26 deletions(-) diff --git a/android/filament-android/src/main/cpp/Camera.cpp b/android/filament-android/src/main/cpp/Camera.cpp index 45590c23c5..9fccc2a73c 100644 --- a/android/filament-android/src/main/cpp/Camera.cpp +++ b/android/filament-android/src/main/cpp/Camera.cpp @@ -216,3 +216,36 @@ Java_com_google_android_filament_Camera_nGetSensitivity(JNIEnv*, jclass, Camera *camera = (Camera *) nativeCamera; return camera->getSensitivity(); } + +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_Camera_nSetFocusDistance(JNIEnv*, jclass, + jlong nativeCamera, jfloat focusDistance) { + Camera *camera = (Camera *) nativeCamera; + camera->setFocusDistance(focusDistance); +} + +extern "C" JNIEXPORT jfloat JNICALL +Java_com_google_android_filament_Camera_nGetFocusDistance(JNIEnv*, jclass, + jlong nativeCamera) { + Camera *camera = (Camera *) nativeCamera; + return camera->getFocusDistance(); +} + +extern "C" JNIEXPORT jdouble JNICALL +Java_com_google_android_filament_Camera_nGetFocalLength(JNIEnv*, jclass, + jlong nativeCamera) { + Camera *camera = (Camera *) nativeCamera; + return camera->getFocalLength(); +} + +extern "C" JNIEXPORT jdouble JNICALL +Java_com_google_android_filament_Camera_nComputeEffectiveFocalLength(JNIEnv*, jclass, + jdouble focalLength, jdouble focusDistance) { + return Camera::computeEffectiveFocalLength(focalLength, focusDistance); +} + +extern "C" JNIEXPORT jdouble JNICALL +Java_com_google_android_filament_Camera_nComputeEffectiveFov(JNIEnv*, jclass, + jdouble fovInDegrees, jdouble focusDistance) { + return Camera::computeEffectiveFov(fovInDegrees, focusDistance); +} diff --git a/android/filament-android/src/main/java/com/google/android/filament/Camera.java b/android/filament-android/src/main/java/com/google/android/filament/Camera.java index de6c8ce5e2..b21a0895f4 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/Camera.java +++ b/android/filament-android/src/main/java/com/google/android/filament/Camera.java @@ -644,6 +644,29 @@ public class Camera { return nGetShutterSpeed(getNativeObject()); } + /** + * @return focal length in meters [m] + */ + public double getFocalLength() { + return nGetFocalLength(getNativeObject()); + } + + /** + * Set the camera focus distance in world units + * @param distance Distance from the camera to the focus plane in world units. Must be + * positive and larger than the camera's near clipping plane. + */ + public void setFocusDistance(float distance) { + nSetFocusDistance(getNativeObject(), distance); + } + + /** + * @return Distance from the camera to the focus plane in world units + */ + public float getFocusDistance() { + return nGetFocusDistance(getNativeObject()); + } + /** * @return Sensitivity in ISO */ @@ -651,6 +674,28 @@ public class Camera { return nGetSensitivity(getNativeObject()); } + /** + * Helper to compute the effective focal length taking into account the focus distance + * + * @param focalLength focal length in any unit (e.g. [m] or [mm]) + * @param focusDistance focus distance in same unit as focalLength + * @return the effective focal length in same unit as focalLength + */ + static double computeEffectiveFocalLength(double focalLength, double focusDistance) { + return nComputeEffectiveFocalLength(focalLength, focusDistance); + } + + /** + * Helper to compute the effective field-of-view taking into account the focus distance + * + * @param fovInDegrees full field of view in degrees + * @param focusDistance focus distance in meters [m] + * @return effective full field of view in degrees + */ + static double computeEffectiveFov(double fovInDegrees, double focusDistance) { + return nComputeEffectiveFov(fovInDegrees, focusDistance); + } + public long getNativeObject() { if (mNativeObject == 0) { throw new IllegalStateException("Calling method on destroyed Camera"); @@ -685,4 +730,9 @@ public class Camera { private static native float nGetAperture(long nativeCamera); private static native float nGetShutterSpeed(long nativeCamera); private static native float nGetSensitivity(long nativeCamera); + private static native void nSetFocusDistance(long nativeCamera, float distance); + private static native float nGetFocusDistance(long nativeCamera); + private static native double nGetFocalLength(long nativeCamera); + private static native double nComputeEffectiveFocalLength(double focalLength, double focusDistance); + private static native double nComputeEffectiveFov(double fovInDegrees, double focusDistance); } diff --git a/android/filament-android/src/main/java/com/google/android/filament/View.java b/android/filament-android/src/main/java/com/google/android/filament/View.java index 59190eb0e7..ab12538005 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/View.java +++ b/android/filament-android/src/main/java/com/google/android/filament/View.java @@ -436,7 +436,12 @@ public class View { MEDIAN } - /** focus distance in world units */ + /** + * focus distance in world units + * + * @deprecated use {@link Camera#setFocusDistance(float)} + */ + @Deprecated public float focusDistance = 10.0f; /** diff --git a/filament/include/filament/Camera.h b/filament/include/filament/Camera.h index 70105f0b6c..1689a19fc1 100644 --- a/filament/include/filament/Camera.h +++ b/filament/include/filament/Camera.h @@ -191,12 +191,13 @@ public: /** Sets the projection matrix from the focal length. * - * @param focalLength lens's focal length in millimeters. \p focalLength > 0. + * @param focalLengthInMillimeters lens's focal length in millimeters. \p focalLength > 0. * @param aspect aspect ratio \f$ \frac{width}{height} \f$. \p aspect > 0. * @param near distance in world units from the camera to the near plane. \p near > 0. * @param far distance in world units from the camera to the far plane. \p far > \p near. */ - void setLensProjection(double focalLength, double aspect, double near, double far) noexcept; + void setLensProjection(double focalLengthInMillimeters, + double aspect, double near, double far) noexcept; /** Sets a custom projection matrix. * @@ -433,6 +434,19 @@ public: //! returns this camera's sensitivity in ISO float getSensitivity() const noexcept; + //! returns the focal length in meters [m] for a 35mm camera + double getFocalLength() const noexcept; + + /** + * Sets the camera focus distance. This is used by the Depth-of-field PostProcessing effect. + * @param distance Distnace from the camera to the plane of focus in world units. + * Must be positive and larger than the near clipping plane. + */ + void setFocusDistance(float distance) noexcept; + + //! Returns the focus distance in world units + float getFocusDistance() const noexcept; + /** * Returns the inverse of a projection matrix. * @@ -473,6 +487,24 @@ public: * @see inverseProjection(const math::mat4&) */ static math::mat4f inverseProjection(const math::mat4f& p) noexcept; + + /** + * Helper to compute the effective focal length taking into account the focus distance + * + * @param focalLength focal length in any unit (e.g. [m] or [mm]) + * @param focusDistance focus distance in same unit as focalLength + * @return the effective focal length in same unit as focalLength + */ + static double computeEffectiveFocalLength(double focalLength, double focusDistance) noexcept; + + /** + * Helper to compute the effective field-of-view taking into account the focus distance + * + * @param fovInDegrees full field of view in degrees + * @param focusDistance focus distance in meters [m] + * @return effective full field of view in degrees + */ + static double computeEffectiveFov(double fovInDegrees, double focusDistance) noexcept; }; } // namespace filament diff --git a/filament/include/filament/View.h b/filament/include/filament/View.h index 6395acbbbf..1a7706f6f3 100644 --- a/filament/include/filament/View.h +++ b/filament/include/filament/View.h @@ -191,7 +191,7 @@ public: NONE = 0, MEDIAN = 2 }; - float focusDistance = 10.0f; //!< focus distance in world units + float focusDistance = 10.0f; //!< @deprecated use Camera::setFocusDistance() instead float cocScale = 1.0f; //!< circle of confusion scale factor (amount of blur) float maxApertureDiameter = 0.01f; //!< maximum aperture diameter in meters (zero to disable rotation) bool enabled = false; //!< enable or disable depth of field effect diff --git a/filament/src/Camera.cpp b/filament/src/Camera.cpp index 36fd56dc82..619fa2239d 100644 --- a/filament/src/Camera.cpp +++ b/filament/src/Camera.cpp @@ -47,11 +47,11 @@ FCamera::FCamera(FEngine& engine, Entity e) mEntity(e) { } -void UTILS_NOINLINE FCamera::setProjection(double fov, double aspect, double near, double far, +void UTILS_NOINLINE FCamera::setProjection(double fovInDegrees, double aspect, double near, double far, Camera::Fov direction) noexcept { double w; double h; - double s = std::tan(fov * (F_PI / 360.0)) * near; + double s = std::tan(fovInDegrees * math::d::DEG_TO_RAD / 2.0) * near; if (direction == Fov::VERTICAL) { w = s * aspect; h = s; @@ -62,10 +62,12 @@ void UTILS_NOINLINE FCamera::setProjection(double fov, double aspect, double nea FCamera::setProjection(Projection::PERSPECTIVE, -w, w, -h, h, near, far); } -void FCamera::setLensProjection(double focalLength, double aspect, double near, double far) noexcept { +void FCamera::setLensProjection(double focalLengthInMillimeters, + double aspect, double near, double far) noexcept { // a 35mm camera has a 36x24mm wide frame size - double theta = 2.0 * std::atan(SENSOR_SIZE * 1000.0f / (2.0 * focalLength)); - FCamera::setProjection(theta * math::d::RAD_TO_DEG, aspect, near, far, Fov::VERTICAL); + double h = (0.5 * near) * ((SENSOR_SIZE * 1000.0) / focalLengthInMillimeters); + double w = h * aspect; + FCamera::setProjection(Projection::PERSPECTIVE, -w, w, -h, h, near, far); } /* @@ -214,6 +216,22 @@ void FCamera::setExposure(float aperture, float shutterSpeed, float sensitivity) mSensitivity = clamp(sensitivity, MIN_SENSITIVITY, MAX_SENSITIVITY); } +double FCamera::getFocalLength() const noexcept { + return (FCamera::SENSOR_SIZE * mProjection[1][1]) * 0.5; +} + +double FCamera::computeEffectiveFocalLength(double focalLength, double focusDistance) noexcept { + focusDistance = std::max(focalLength, focusDistance); + return (focusDistance * focalLength) / (focusDistance - focalLength); +} + +double FCamera::computeEffectiveFov(double fovInDegrees, double focusDistance) noexcept { + double f = 0.5 * FCamera::SENSOR_SIZE / std::tan(fovInDegrees * math::d::DEG_TO_RAD * 0.5); + focusDistance = std::max(f, focusDistance); + double fov = 2.0 * std::atan(FCamera::SENSOR_SIZE * (focusDistance - f) / (2.0 * focusDistance * f)); + return fov * math::d::RAD_TO_DEG; +} + template math::details::TMat44 inverseProjection(const math::details::TMat44& p) noexcept { math::details::TMat44 r; @@ -273,11 +291,15 @@ CameraInfo::CameraInfo(FCamera const& camera) noexcept { zn = camera.getNear(); zf = camera.getCullingFar(); ev100 = Exposure::ev100(camera); - f = (FCamera::SENSOR_SIZE * (float)projection[1][1]) * 0.5f; + f = camera.getFocalLength(); A = f / camera.getAperture(); + d = std::max(zn, camera.getFocusDistance()); } -CameraInfo::CameraInfo(FCamera const& camera, const math::mat4f& worldOriginCamera) noexcept { +CameraInfo::CameraInfo(FCamera const& camera, const math::mat4f& worldOriginCamera, + float focusDistance) noexcept { + // note: DepthOfFieldOptions is deprecated, but we continue to support it by passing it here + // and we're using it if the camera focus distance hasn't been set. const mat4f modelMatrix{ worldOriginCamera * camera.getModelMatrix() }; projection = mat4f{ camera.getProjectionMatrix() }; cullingProjection = mat4f{ camera.getCullingProjectionMatrix() }; @@ -286,8 +308,9 @@ CameraInfo::CameraInfo(FCamera const& camera, const math::mat4f& worldOriginCame zn = camera.getNear(); zf = camera.getCullingFar(); ev100 = Exposure::ev100(camera); - f = (FCamera::SENSOR_SIZE * (float)projection[1][1]) * 0.5f; + f = camera.getFocalLength(); A = f / camera.getAperture(); + d = std::max(zn, camera.getFocusDistance() > 0.0f ? camera.getFocusDistance() : focusDistance); worldOffset = camera.getPosition(); worldOrigin = worldOriginCamera; } @@ -308,13 +331,14 @@ void Camera::setProjection(Camera::Projection projection, double left, double ri upcast(this)->setProjection(projection, left, right, bottom, top, near, far); } -void Camera::setProjection(double fov, double aspect, double near, double far, +void Camera::setProjection(double fovInDegrees, double aspect, double near, double far, Camera::Fov direction) noexcept { - upcast(this)->setProjection(fov, aspect, near, far, direction); + upcast(this)->setProjection(fovInDegrees, aspect, near, far, direction); } -void Camera::setLensProjection(double focalLength, double aspect, double near, double far) noexcept { - upcast(this)->setLensProjection(focalLength, aspect, near, far); +void Camera::setLensProjection(double focalLengthInMillimeters, + double aspect, double near, double far) noexcept { + upcast(this)->setLensProjection(focalLengthInMillimeters, aspect, near, far); } void Camera::setCustomProjection(mat4 const& projection, double near, double far) noexcept { @@ -426,4 +450,24 @@ float Camera::getSensitivity() const noexcept { return upcast(this)->getSensitivity(); } +void Camera::setFocusDistance(float distance) noexcept { + upcast(this)->setFocusDistance(distance); +} + +float Camera::getFocusDistance() const noexcept { + return upcast(this)->getFocusDistance(); +} + +double Camera::getFocalLength() const noexcept { + return upcast(this)->getFocalLength(); +} + +double Camera::computeEffectiveFocalLength(double focalLength, double focusDistance) noexcept { + return FCamera::computeEffectiveFocalLength(focalLength, focusDistance); +} + +double Camera::computeEffectiveFov(double fovInDegrees, double focusDistance) noexcept { + return FCamera::computeEffectiveFov(fovInDegrees, focusDistance); +} + } // namespace filament diff --git a/filament/src/PostProcessManager.cpp b/filament/src/PostProcessManager.cpp index 89c93fcabb..831c6d790c 100644 --- a/filament/src/PostProcessManager.cpp +++ b/filament/src/PostProcessManager.cpp @@ -900,7 +900,7 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, * * It's just a madd! */ - const float focusDistance = std::max(cameraInfo.zn, dofOptions.focusDistance); + const float focusDistance = cameraInfo.d; auto const& desc = fg.getDescriptor(input); const float Kc = (cameraInfo.A * cameraInfo.f) / (focusDistance - cameraInfo.f); const float Ks = ((float)desc.height) / FCamera::SENSOR_SIZE; diff --git a/filament/src/View.cpp b/filament/src/View.cpp index 2560c82f52..1ba7d876b0 100644 --- a/filament/src/View.cpp +++ b/filament/src/View.cpp @@ -397,7 +397,7 @@ void FView::prepare(FEngine& engine, backend::DriverApi& driver, ArenaScope& are // Note: for debugging (i.e. visualize what the camera / objects are doing, using // the viewing camera), we can set worldOriginScene to identity when mViewingCamera // is set - mViewingCameraInfo = CameraInfo(*camera, worldOriginScene); + mViewingCameraInfo = CameraInfo(*camera, worldOriginScene, mDepthOfFieldOptions.focusDistance); mCullingFrustum = FCamera::getFrustum( mCullingCamera->getCullingProjectionMatrix(), diff --git a/filament/src/details/Camera.h b/filament/src/details/Camera.h index c69fc8746f..5de847d409 100644 --- a/filament/src/details/Camera.h +++ b/filament/src/details/Camera.h @@ -51,11 +51,12 @@ public: double near, double far) noexcept; // sets the projection matrix - void setProjection(double fov, double aspect, double near, double far, + void setProjection(double fovInDegrees, double aspect, double near, double far, Fov direction = Fov::VERTICAL) noexcept; // sets the projection matrix - void setLensProjection(double focalLength, double aspect, double near, double far) noexcept; + void setLensProjection(double focalLengthInMillimeters, + double aspect, double near, double far) noexcept; // Sets a custom projection matrix (sets both the viewing and culling projections). void setCustomProjection(math::mat4 const& projection, double near, double far) noexcept; @@ -157,6 +158,20 @@ public: return mSensitivity; } + void setFocusDistance(float distance) noexcept { + mFocusDistance = distance; + } + + float getFocusDistance() const noexcept { + return mFocusDistance; + } + + double getFocalLength() const noexcept; + + static double computeEffectiveFocalLength(double focalLength, double focusDistance) noexcept; + + static double computeEffectiveFov(double fovInDegrees, double focusDistance) noexcept; + utils::Entity getEntity() const noexcept { return mEntity; } @@ -179,12 +194,14 @@ private: float mAperture = 16.0f; float mShutterSpeed = 1.0f / 125.0f; float mSensitivity = 100.0f; + float mFocusDistance = 0.0f; }; struct CameraInfo { CameraInfo() noexcept = default; explicit CameraInfo(FCamera const& camera) noexcept; - CameraInfo(FCamera const& camera, const math::mat4f& worldOriginCamera) noexcept; + CameraInfo(FCamera const& camera, + const math::mat4f& worldOriginCamera, float focusDistance) noexcept; math::mat4f projection; // projection matrix for drawing (infinite zfar) math::mat4f cullingProjection; // projection matrix for culling @@ -193,8 +210,9 @@ struct CameraInfo { float zn{}; // distance (positive) to the near plane float zf{}; // distance (positive) to the far plane float ev100{}; // exposure - float f{}; // focal length (in m) - float A{}; // f / aperture diameter (in m) + float f{}; // focal length [m] + float A{}; // f-number or f / aperture diameter [m] + float d{}; // focus distance [m] math::float3 worldOffset{}; // world offset, API-level camera position math::float3 const& getPosition() const noexcept { return model[3].xyz; } math::float3 getForwardVector() const noexcept { return normalize(-model[2].xyz); } diff --git a/libs/viewer/include/viewer/Settings.h b/libs/viewer/include/viewer/Settings.h index 6579457610..2e7c3882e1 100644 --- a/libs/viewer/include/viewer/Settings.h +++ b/libs/viewer/include/viewer/Settings.h @@ -173,6 +173,7 @@ struct ViewerOptions { bool skyboxEnabled = true; sRGBColor backgroundColor = { 0.0f }; float cameraFocalLength = 28.0f; + float cameraFocusDistance = { 0.0f }; }; struct Settings { diff --git a/libs/viewer/src/Settings.cpp b/libs/viewer/src/Settings.cpp index 60c734f378..75d8da1b6d 100644 --- a/libs/viewer/src/Settings.cpp +++ b/libs/viewer/src/Settings.cpp @@ -775,6 +775,8 @@ static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, ViewerOp i = parse(tokens, i + 1, jsonChunk, &out->backgroundColor); } else if (compare(tok, jsonChunk, "cameraFocalLength") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->cameraFocalLength); + } else if (compare(tok, jsonChunk, "cameraFocusDistance") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->cameraFocusDistance); } else { slog.w << "Invalid viewer options key: '" << STR(tok, jsonChunk) << "'" << io::endl; i = parse(tokens, i + 1); @@ -887,6 +889,8 @@ void applySettings(const ViewerOptions& settings, Camera* camera, Skybox* skybox settings.cameraAperture, 1.0f / settings.cameraSpeed, settings.cameraISO); + + camera->setFocusDistance(settings.cameraFocusDistance); } } @@ -1170,7 +1174,8 @@ static std::ostream& operator<<(std::ostream& out, const ViewerOptions& in) { << "\"groundPlaneEnabled\": " << to_string(in.groundPlaneEnabled) << ",\n" << "\"skyboxEnabled\": " << to_string(in.skyboxEnabled) << ",\n" << "\"backgroundColor\": " << (in.backgroundColor) << ",\n" - << "\"cameraFocalLength\": " << (in.cameraFocalLength) << "\n" + << "\"cameraFocalLength\": " << (in.cameraFocalLength) << ",\n" + << "\"cameraFocusDistance\": " << (in.cameraFocusDistance) << "\n" << "}"; } @@ -1179,7 +1184,7 @@ static std::ostream& operator<<(std::ostream& out, const DepthOfFieldOptions& in << "\"focusDistance\": " << (in.focusDistance) << ",\n" << "\"cocScale\": " << (in.cocScale) << ",\n" << "\"maxApertureDiameter\": " << (in.maxApertureDiameter) << ",\n" - << "\"enabled\": " << to_string(in.enabled) << "\n" + << "\"enabled\": " << to_string(in.enabled) << ",\n" << "\"filter\": " << (in.filter) << "\n" << "}"; } diff --git a/samples/gltf_viewer.cpp b/samples/gltf_viewer.cpp index 2fd7c9e19f..6d48bae093 100644 --- a/samples/gltf_viewer.cpp +++ b/samples/gltf_viewer.cpp @@ -629,10 +629,17 @@ int main(int argc, char** argv) { auto& rcm = engine->getRenderableManager(); auto instance = rcm.getInstance(app.scene.groundPlane); const auto& viewerOptions = app.viewer->getSettings().viewer; + const auto& dofOptions = app.viewer->getSettings().view.dof; rcm.setLayerMask(instance, 0xff, viewerOptions.groundPlaneEnabled ? 0xff : 0x00); - FilamentApp::get().getCameraFocalLength() = viewerOptions.cameraFocalLength; + float fe = viewerOptions.cameraFocalLength; + if (dofOptions.enabled) { + fe = Camera::computeEffectiveFocalLength(fe / 1000.0, + std::max(0.1f, dofOptions.focusDistance)) * 1000.0; + } + + FilamentApp::get().getCameraFocalLength() = fe; const size_t cameraCount = app.asset->getCameraEntityCount(); view->setCamera(app.mainCamera); diff --git a/web/filament-js/filament.d.ts b/web/filament-js/filament.d.ts index 9dd862b15d..8642bd6ad8 100644 --- a/web/filament-js/filament.d.ts +++ b/web/filament-js/filament.d.ts @@ -421,7 +421,12 @@ export class Camera { public getAperture(): number; public getShutterSpeed(): number; public getSensitivity(): number; + public getFocalLength(): number; + public getFocusDistance(): number; + public setFocusDistance(distance: number): void; public static inverseProjection(p: mat4): mat4; + public static computeEffectiveFocalLength(focalLength: number, focusDistance: number) : number; + public static computeEffectiveFov(fovInDegrees: number, focusDistance: number) : number; } export class ColorGrading$Builder { diff --git a/web/filament-js/jsbindings.cpp b/web/filament-js/jsbindings.cpp index 556a6f1198..f44c9374e4 100644 --- a/web/filament-js/jsbindings.cpp +++ b/web/filament-js/jsbindings.cpp @@ -757,6 +757,12 @@ class_("Camera") .function("getAperture", &Camera::getAperture) .function("getShutterSpeed", &Camera::getShutterSpeed) .function("getSensitivity", &Camera::getSensitivity) + .function("setFocusDistance", &Camera::setFocusDistance) + .function("getFocusDistance", &Camera::getFocusDistance) + .function("getFocalLength", &Camera::getFocalLength) + + .class_function("computeEffectiveFocalLength", &Camera::computeEffectiveFocalLength) + .class_function("computeEffectiveFov", &Camera::computeEffectiveFov) .class_function("inverseProjection", (flatmat4 (*)(flatmat4)) [] (flatmat4 m) { return flatmat4 { filament::math::mat4f(Camera::inverseProjection(m.m)) };