From 9e490af92b311d5ac3de8d76182807f157919934 Mon Sep 17 00:00:00 2001 From: Schwarzemann Date: Fri, 8 Nov 2024 20:47:43 +0300 Subject: [PATCH 01/12] FIX: Add getters for camera parameters #1419 --- .vscode/settings.json | 3 ++ application/F3DStarter.cxx | 4 +-- java/Camera.java | 6 ++-- java/F3DJavaBindings.cxx | 14 ++++---- library/private/camera_impl.h | 9 +++-- library/public/camera.h | 15 +++++++-- library/src/camera_impl.cxx | 55 +++++++++++++++++++++++++++++-- library/testing/TestSDKCamera.cxx | 42 +++++++++++++++++++++-- python/F3DPythonBindings.cxx | 9 +++-- python/testing/test_camera.py | 6 ++-- 10 files changed, 133 insertions(+), 30 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..70e34ecb3d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "C_Cpp.errorSquiggles": "disabled" +} \ No newline at end of file diff --git a/application/F3DStarter.cxx b/application/F3DStarter.cxx index a6a9c5a4bd..66b4b150a6 100644 --- a/application/F3DStarter.cxx +++ b/application/F3DStarter.cxx @@ -138,8 +138,8 @@ class F3DStarter::F3DInternals cam.resetToBounds(zoomFactor); } - cam.azimuth(camConf.CameraAzimuthAngle) - .elevation(camConf.CameraElevationAngle) + cam.addAzimuth(camConf.CameraAzimuthAngle) + .addElevation(camConf.CameraElevationAngle) .setCurrentAsDefault(); } diff --git a/java/Camera.java b/java/Camera.java index bf2f5aa31c..871e8324e5 100644 --- a/java/Camera.java +++ b/java/Camera.java @@ -8,9 +8,9 @@ public Camera(long nativeAddress) { public native void dolly(double val); public native void roll(double angle); - public native void azimuth(double angle); - public native void yaw(double angle); - public native void elevation(double angle); + public native void addAzimuth(double angle); + public native void addYaw(double angle); + public native void addElevation(double angle); public native void pitch(double angle); public native double[] getFocalPoint(); diff --git a/java/F3DJavaBindings.cxx b/java/F3DJavaBindings.cxx index 9f9391949b..4416d98108 100644 --- a/java/F3DJavaBindings.cxx +++ b/java/F3DJavaBindings.cxx @@ -134,21 +134,21 @@ extern "C" GetEngine(env, self)->getWindow().getCamera().roll(angle); } - JNIEXPORT void JAVA_BIND(Camera, azimuth)(JNIEnv* env, jobject self, jdouble angle) + JNIEXPORT void JNICALL JAVA_BIND(Camera, addAzimuth)(JNIEnv* env, jobject self, jdouble angle) { - GetEngine(env, self)->getWindow().getCamera().azimuth(angle); + GetEngine(env, self)->getWindow().getCamera().addAzimuth(angle); } - JNIEXPORT void JAVA_BIND(Camera, yaw)(JNIEnv* env, jobject self, jdouble angle) + JNIEXPORT void JNICALL JAVA_BIND(Camera, addYaw)(JNIEnv* env, jobject self, jdouble angle) { - GetEngine(env, self)->getWindow().getCamera().yaw(angle); + GetEngine(env, self)->getWindow().getCamera().addYaw(angle); } - JNIEXPORT void JAVA_BIND(Camera, elevation)(JNIEnv* env, jobject self, jdouble angle) + JNIEXPORT void JNICALL JAVA_BIND(Camera, addElevation)(JNIEnv* env, jobject self, jdouble angle) { - GetEngine(env, self)->getWindow().getCamera().elevation(angle); + GetEngine(env, self)->getWindow().getCamera().addElevation(angle); } - + JNIEXPORT void JAVA_BIND(Camera, pitch)(JNIEnv* env, jobject self, jdouble angle) { GetEngine(env, self)->getWindow().getCamera().pitch(angle); diff --git a/library/private/camera_impl.h b/library/private/camera_impl.h index 17173d74ca..b34bf9f05d 100644 --- a/library/private/camera_impl.h +++ b/library/private/camera_impl.h @@ -50,14 +50,17 @@ class camera_impl : public camera camera& setState(const camera_state_t& state) override; camera_state_t getState() override; void getState(camera_state_t& state) override; + angle_deg_t getAzimuth() override; + angle_deg_t getYaw() override; + angle_deg_t getElevation() override; camera& dolly(double val) override; camera& pan(double right, double up, double forward) override; camera& zoom(double factor) override; camera& roll(angle_deg_t angle) override; - camera& azimuth(angle_deg_t angle) override; - camera& yaw(angle_deg_t angle) override; - camera& elevation(angle_deg_t angle) override; + camera& addAzimuth(angle_deg_t angle) override; + camera& addYaw(angle_deg_t angle) override; + camera& addElevation(angle_deg_t angle) override; camera& pitch(angle_deg_t angle) override; camera& setCurrentAsDefault() override; diff --git a/library/public/camera.h b/library/public/camera.h index dcdf8d8230..cfd6a839db 100644 --- a/library/public/camera.h +++ b/library/public/camera.h @@ -51,6 +51,15 @@ class F3D_EXPORT camera virtual void getState(camera_state_t& state) = 0; ///@} + ///@{ @name Orientation + /** Get the azimuth angle of the camera. */ + virtual angle_deg_t getAzimuth() = 0; + /** Get the yaw angle of the camera. */ + virtual angle_deg_t getYaw() = 0; + /** Get the elevation angle of the camera. */ + virtual angle_deg_t getElevation() = 0; + ///@} + ///@{ @name Manipulation /// Standard camera manipulation methods. Angles are in degrees. @@ -63,11 +72,11 @@ class F3D_EXPORT camera /** Rotate the camera about its forward axis. */ virtual camera& roll(angle_deg_t angle) = 0; /** Rotate the camera about its vertical axis, centered at the focal point. */ - virtual camera& azimuth(angle_deg_t angle) = 0; + virtual camera& addAzimuth(angle_deg_t angle) = 0; /** Rotate the camera about its vertical axis, centered the camera's position. */ - virtual camera& yaw(angle_deg_t angle) = 0; + virtual camera& addYaw(angle_deg_t angle) = 0; /** Rotate the camera about its horizontal axis, centered at the focal point. */ - virtual camera& elevation(angle_deg_t angle) = 0; + virtual camera& addElevation(angle_deg_t angle) = 0; /** Rotate the camera about its horizontal axis, centered the camera's position. */ virtual camera& pitch(angle_deg_t angle) = 0; diff --git a/library/src/camera_impl.cxx b/library/src/camera_impl.cxx index af5e2f26ac..965a8c629d 100644 --- a/library/src/camera_impl.cxx +++ b/library/src/camera_impl.cxx @@ -117,6 +117,55 @@ angle_deg_t camera_impl::getViewAngle() return angle; } +//---------------------------------------------------------------------------- +angle_deg_t camera_impl::getAzimuth() +{ + vtkCamera* cam = this->GetVTKCamera(); + double pos[3], foc[3]; + cam->GetPosition(pos); + cam->GetFocalPoint(foc); + double viewDir[3]; + vtkMath::Subtract(foc, pos, viewDir); + double viewDirProj[2] = { viewDir[0], viewDir[1] }; + if (vtkMath::Dot2D(viewDirProj, viewDirProj) < VTK_DBL_EPSILON) + { + return 0.0; + } + return vtkMath::DegreesFromRadians(atan2(viewDirProj[1], viewDirProj[0])); +} + +//---------------------------------------------------------------------------- +angle_deg_t camera_impl::getYaw() +{ + vtkCamera* cam = this->GetVTKCamera(); + double pos[3], foc[3]; + cam->GetPosition(pos); + cam->GetFocalPoint(foc); + double viewDir[3]; + vtkMath::Subtract(foc, pos, viewDir); + double viewDirProj[2] = { viewDir[0], viewDir[2] }; + if (vtkMath::Dot2D(viewDirProj, viewDirProj) < VTK_DBL_EPSILON) + { + return 0.0; + } + return vtkMath::DegreesFromRadians(atan2(viewDirProj[0], viewDirProj[1])); +} + +//---------------------------------------------------------------------------- +angle_deg_t camera_impl::getElevation() +{ + vtkCamera* cam = this->GetVTKCamera(); + double pos[3], foc[3]; + cam->GetPosition(pos); + cam->GetFocalPoint(foc); + + double viewDir[3]; + vtkMath::Subtract(foc, pos, viewDir); + vtkMath::Normalize(viewDir); + + return vtkMath::DegreesFromRadians(asin(viewDir[2])); +} + //---------------------------------------------------------------------------- void camera_impl::getViewAngle(angle_deg_t& angle) { @@ -215,7 +264,7 @@ camera& camera_impl::roll(angle_deg_t angle) } //---------------------------------------------------------------------------- -camera& camera_impl::azimuth(angle_deg_t angle) +camera& camera_impl::addAzimuth(angle_deg_t angle) { vtkCamera* cam = this->GetVTKCamera(); cam->Azimuth(angle); @@ -225,7 +274,7 @@ camera& camera_impl::azimuth(angle_deg_t angle) } //---------------------------------------------------------------------------- -camera& camera_impl::yaw(angle_deg_t angle) +camera& camera_impl::addYaw(angle_deg_t angle) { vtkCamera* cam = this->GetVTKCamera(); cam->Yaw(angle); @@ -235,7 +284,7 @@ camera& camera_impl::yaw(angle_deg_t angle) } //---------------------------------------------------------------------------- -camera& camera_impl::elevation(angle_deg_t angle) +camera& camera_impl::addElevation(angle_deg_t angle) { vtkCamera* cam = this->GetVTKCamera(); cam->Elevation(angle); diff --git a/library/testing/TestSDKCamera.cxx b/library/testing/TestSDKCamera.cxx index 3210f4f210..2821cc5206 100644 --- a/library/testing/TestSDKCamera.cxx +++ b/library/testing/TestSDKCamera.cxx @@ -121,7 +121,7 @@ int TestSDKCamera(int argc, char* argv[]) } // Test azimuth - cam.azimuth(90); + cam.addAzimuth(90); f3d::point3_t expectedPos = { 0., -11., -1. }; f3d::point3_t expectedFoc = { 0., 0., -1. }; f3d::vector3_t expectedUp = { 1., 0., 0. }; @@ -141,6 +141,23 @@ int TestSDKCamera(int argc, char* argv[]) return EXIT_FAILURE; } + // Test getAzimuth + f3d::angle_deg_t azimuth = cam.getAzimuth(); + if (!compareDouble(azimuth, 90.0)) + { + std::cerr << "getAzimuth is not behaving as expected:" << std::endl; + std::cerr << std::setprecision(12) << "azimuth: " << azimuth << " != 0.0" << std::endl; + return EXIT_FAILURE; + } + double viewDirProj[2] = { 0.0, 0.0 }; + double dotProduct = viewDirProj[0] * viewDirProj[0] + viewDirProj[1] * viewDirProj[1]; + const double epsilon = std::numeric_limits::epsilon(); + if (dotProduct < epsilon) + { + std::cerr << "Dot product is lesser than epsilon, returning 0.0 as expected." << std::endl; + return 0.0; + } + // Test roll cam.roll(90); expectedUp = { 0., 0., -1. }; @@ -161,7 +178,7 @@ int TestSDKCamera(int argc, char* argv[]) } // Test yaw - cam.yaw(90); + cam.addYaw(90); expectedFoc = { 11., -11., -1. }; pos = cam.getPosition(); foc = cam.getFocalPoint(); @@ -179,8 +196,23 @@ int TestSDKCamera(int argc, char* argv[]) return EXIT_FAILURE; } + // Test getYaw + f3d::angle_deg_t yaw = cam.getYaw(); + if (!compareDouble(yaw, 90.0)) + { + std::cerr << "getYaw is not behaving as expected:" << std::endl; + std::cerr << std::setprecision(12) << "yaw: " << yaw << " != 0.0" << std::endl; + return EXIT_FAILURE; + } + dotProduct = viewDirProj[0] * viewDirProj[0] + viewDirProj[1] * viewDirProj[1]; + if (dotProduct < epsilon) + { + std::cerr << "Dot product is lesser than epsilon, returning 0.0 as expected." << std::endl; + return 0.0; + } + // Test elevation - cam.elevation(90); + cam.addElevation(90); expectedPos = { 11., -11., -12. }; expectedUp = { 1., 0., 0. }; pos = cam.getPosition(); @@ -199,6 +231,10 @@ int TestSDKCamera(int argc, char* argv[]) return EXIT_FAILURE; } + // Test getElevation + double elevation = cam.getElevation(); + checkDouble(elevation, 90.0, "getElevation"); + // Test pitch cam.pitch(90); expectedFoc = { 22., -11., -12. }; diff --git a/python/F3DPythonBindings.cxx b/python/F3DPythonBindings.cxx index c61cca1e2a..02ecbc39b3 100644 --- a/python/F3DPythonBindings.cxx +++ b/python/F3DPythonBindings.cxx @@ -277,9 +277,12 @@ PYBIND11_MODULE(pyf3d, module) .def("pan", &f3d::camera::pan, py::arg("right"), py::arg("up"), py::arg("forward") = 0.0) .def("zoom", &f3d::camera::zoom) .def("roll", &f3d::camera::roll) - .def("azimuth", &f3d::camera::azimuth) - .def("yaw", &f3d::camera::yaw) - .def("elevation", &f3d::camera::elevation) + .def("add_azimuth", &f3d::camera::addAzimuth) + .def("add_yaw", &f3d::camera::addYaw) + .def("add_elevation", &f3d::camera::addElevation) + .def_property_readonly("azimuth", &f3d::camera::getAzimuth) + .def_property_readonly("yaw", &f3d::camera::getYaw) + .def_property_readonly("elevation", &f3d::camera::getElevation) .def("pitch", &f3d::camera::pitch) .def("set_current_as_default", &f3d::camera::setCurrentAsDefault) .def("reset_to_default", &f3d::camera::resetToDefault) diff --git a/python/testing/test_camera.py b/python/testing/test_camera.py index c875a3ead2..dc2b6eb3ec 100644 --- a/python/testing/test_camera.py +++ b/python/testing/test_camera.py @@ -80,9 +80,9 @@ def test_moves(): camera.dolly(10) angle = 30 camera.roll(angle) - camera.azimuth(angle) - camera.yaw(angle) - camera.elevation(angle) + camera.add_azimuth(angle) + camera.add_yaw(angle) + camera.add_elevation(angle) camera.pitch(angle) From d04552e699e1c19bc089694130b383cc9220388d Mon Sep 17 00:00:00 2001 From: Schwarzemann Date: Fri, 8 Nov 2024 21:08:29 +0300 Subject: [PATCH 02/12] FIX: Add getters for camera parameters #1419 --- library/testing/TestSDKCamera.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/library/testing/TestSDKCamera.cxx b/library/testing/TestSDKCamera.cxx index 2821cc5206..7221d16d28 100644 --- a/library/testing/TestSDKCamera.cxx +++ b/library/testing/TestSDKCamera.cxx @@ -154,8 +154,8 @@ int TestSDKCamera(int argc, char* argv[]) const double epsilon = std::numeric_limits::epsilon(); if (dotProduct < epsilon) { - std::cerr << "Dot product is lesser than epsilon, returning 0.0 as expected." << std::endl; - return 0.0; + std::cerr << "Dot product is lesser than epsilon, returning epsilon." << std::endl; + return epsilon; } // Test roll @@ -207,8 +207,8 @@ int TestSDKCamera(int argc, char* argv[]) dotProduct = viewDirProj[0] * viewDirProj[0] + viewDirProj[1] * viewDirProj[1]; if (dotProduct < epsilon) { - std::cerr << "Dot product is lesser than epsilon, returning 0.0 as expected." << std::endl; - return 0.0; + std::cerr << "Dot product is lesser than epsilon, returning epsilon." << std::endl; + return epsilon; } // Test elevation From 997392752297c270280bc2eb2286dfd69f57879e Mon Sep 17 00:00:00 2001 From: Schwarzemann Date: Sun, 5 Jan 2025 17:27:19 +0300 Subject: [PATCH 03/12] Feature: Add getters for camera parameters #1419 --- library/testing/TestSDKCamera.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/testing/TestSDKCamera.cxx b/library/testing/TestSDKCamera.cxx index 7221d16d28..cdf8017b95 100644 --- a/library/testing/TestSDKCamera.cxx +++ b/library/testing/TestSDKCamera.cxx @@ -155,7 +155,7 @@ int TestSDKCamera(int argc, char* argv[]) if (dotProduct < epsilon) { std::cerr << "Dot product is lesser than epsilon, returning epsilon." << std::endl; - return epsilon; + return EXIT_FAILURE; } // Test roll @@ -208,7 +208,7 @@ int TestSDKCamera(int argc, char* argv[]) if (dotProduct < epsilon) { std::cerr << "Dot product is lesser than epsilon, returning epsilon." << std::endl; - return epsilon; + return EXIT_FAILURE; } // Test elevation From 6e20870344b49ee9bfd7c56b602e1bb838904714 Mon Sep 17 00:00:00 2001 From: Schwarzemann Date: Sun, 5 Jan 2025 17:55:05 +0300 Subject: [PATCH 04/12] Feature: Add getters for camera parameters #1419 --- .vscode/settings.json | 5 ++++- library/testing/TestSDKCamera.cxx | 9 ++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 70e34ecb3d..63c5d37b51 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,6 @@ { - "C_Cpp.errorSquiggles": "disabled" + "C_Cpp.errorSquiggles": "disabled", + "files.associations": { + "cmath": "cpp" + } } \ No newline at end of file diff --git a/library/testing/TestSDKCamera.cxx b/library/testing/TestSDKCamera.cxx index cdf8017b95..5c6485f6cd 100644 --- a/library/testing/TestSDKCamera.cxx +++ b/library/testing/TestSDKCamera.cxx @@ -141,20 +141,19 @@ int TestSDKCamera(int argc, char* argv[]) return EXIT_FAILURE; } - // Test getAzimuth f3d::angle_deg_t azimuth = cam.getAzimuth(); if (!compareDouble(azimuth, 90.0)) { std::cerr << "getAzimuth is not behaving as expected:" << std::endl; - std::cerr << std::setprecision(12) << "azimuth: " << azimuth << " != 0.0" << std::endl; + std::cerr << std::setprecision(12) << "azimuth: " << azimuth << " != 90.0" << std::endl; return EXIT_FAILURE; } - double viewDirProj[2] = { 0.0, 0.0 }; + double viewDirProj[2] = { 1.0, 1.0 }; double dotProduct = viewDirProj[0] * viewDirProj[0] + viewDirProj[1] * viewDirProj[1]; const double epsilon = std::numeric_limits::epsilon(); if (dotProduct < epsilon) { - std::cerr << "Dot product is lesser than epsilon, returning epsilon." << std::endl; + std::cerr << "Dot product is lesser than epsilon, returning failure." << std::endl; return EXIT_FAILURE; } @@ -208,7 +207,7 @@ int TestSDKCamera(int argc, char* argv[]) if (dotProduct < epsilon) { std::cerr << "Dot product is lesser than epsilon, returning epsilon." << std::endl; - return EXIT_FAILURE; + return epsilon; } // Test elevation From bb85a0d461c22a65d660180928771610a1f0a263 Mon Sep 17 00:00:00 2001 From: Schwarzemann Date: Sun, 5 Jan 2025 17:56:03 +0300 Subject: [PATCH 05/12] Feature: Add getters for camera parameters #1419 --- library/testing/TestSDKCamera.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/library/testing/TestSDKCamera.cxx b/library/testing/TestSDKCamera.cxx index 5c6485f6cd..bcd8224f5d 100644 --- a/library/testing/TestSDKCamera.cxx +++ b/library/testing/TestSDKCamera.cxx @@ -141,6 +141,7 @@ int TestSDKCamera(int argc, char* argv[]) return EXIT_FAILURE; } + // Test getAzimuth f3d::angle_deg_t azimuth = cam.getAzimuth(); if (!compareDouble(azimuth, 90.0)) { From 6ce7254708fcbc2115cc0df9a77af0a32d6bda61 Mon Sep 17 00:00:00 2001 From: Schwarzemann Date: Sun, 5 Jan 2025 17:57:48 +0300 Subject: [PATCH 06/12] Feature: Add getters for camera parameters #1419 --- library/testing/TestSDKCamera.cxx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/library/testing/TestSDKCamera.cxx b/library/testing/TestSDKCamera.cxx index bcd8224f5d..4525f4d987 100644 --- a/library/testing/TestSDKCamera.cxx +++ b/library/testing/TestSDKCamera.cxx @@ -204,11 +204,10 @@ int TestSDKCamera(int argc, char* argv[]) std::cerr << std::setprecision(12) << "yaw: " << yaw << " != 0.0" << std::endl; return EXIT_FAILURE; } - dotProduct = viewDirProj[0] * viewDirProj[0] + viewDirProj[1] * viewDirProj[1]; if (dotProduct < epsilon) { - std::cerr << "Dot product is lesser than epsilon, returning epsilon." << std::endl; - return epsilon; + std::cerr << "Dot product is lesser than epsilon, returning failure." << std::endl; + return EXIT_FAILURE; } // Test elevation From 9839da318661daa9246bddaacac9f05a7d673e4d Mon Sep 17 00:00:00 2001 From: Schwarzemann Date: Sun, 16 Mar 2025 02:46:05 +0300 Subject: [PATCH 07/12] Feature: Add getters for camera parameters #1419 --- .vscode/settings.json | 6 ------ application/F3DStarter.cxx | 4 ++-- java/Camera.java | 6 +++--- java/F3DJavaBindings.cxx | 12 ++++++------ library/private/camera_impl.h | 6 +++--- library/public/camera.h | 6 +++--- library/src/camera_impl.cxx | 6 +++--- library/testing/TestSDKCamera.cxx | 8 ++++---- python/F3DPythonBindings.cxx | 6 +++--- python/testing/test_camera.py | 6 +++--- 10 files changed, 30 insertions(+), 36 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 63c5d37b51..0000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C_Cpp.errorSquiggles": "disabled", - "files.associations": { - "cmath": "cpp" - } -} \ No newline at end of file diff --git a/application/F3DStarter.cxx b/application/F3DStarter.cxx index 4bea077239..ab26d0f55e 100644 --- a/application/F3DStarter.cxx +++ b/application/F3DStarter.cxx @@ -157,8 +157,8 @@ class F3DStarter::F3DInternals cam.resetToBounds(zoomFactor); } - cam.addAzimuth(camConf.CameraAzimuthAngle) - .addElevation(camConf.CameraElevationAngle) + cam.azimuth(camConf.CameraAzimuthAngle) + .elevation(camConf.CameraElevationAngle) .setCurrentAsDefault(); } diff --git a/java/Camera.java b/java/Camera.java index 871e8324e5..bf2f5aa31c 100644 --- a/java/Camera.java +++ b/java/Camera.java @@ -8,9 +8,9 @@ public Camera(long nativeAddress) { public native void dolly(double val); public native void roll(double angle); - public native void addAzimuth(double angle); - public native void addYaw(double angle); - public native void addElevation(double angle); + public native void azimuth(double angle); + public native void yaw(double angle); + public native void elevation(double angle); public native void pitch(double angle); public native double[] getFocalPoint(); diff --git a/java/F3DJavaBindings.cxx b/java/F3DJavaBindings.cxx index 13558f1c4c..87dd3eac84 100644 --- a/java/F3DJavaBindings.cxx +++ b/java/F3DJavaBindings.cxx @@ -136,19 +136,19 @@ extern "C" GetEngine(env, self)->getWindow().getCamera().roll(angle); } - JNIEXPORT void JNICALL JAVA_BIND(Camera, addAzimuth)(JNIEnv* env, jobject self, jdouble angle) + JNIEXPORT void JNICALL JAVA_BIND(Camera, azimuth)(JNIEnv* env, jobject self, jdouble angle) { - GetEngine(env, self)->getWindow().getCamera().addAzimuth(angle); + GetEngine(env, self)->getWindow().getCamera().azimuth(angle); } - JNIEXPORT void JNICALL JAVA_BIND(Camera, addYaw)(JNIEnv* env, jobject self, jdouble angle) + JNIEXPORT void JNICALL JAVA_BIND(Camera, yaw)(JNIEnv* env, jobject self, jdouble angle) { - GetEngine(env, self)->getWindow().getCamera().addYaw(angle); + GetEngine(env, self)->getWindow().getCamera().yaw(angle); } - JNIEXPORT void JNICALL JAVA_BIND(Camera, addElevation)(JNIEnv* env, jobject self, jdouble angle) + JNIEXPORT void JNICALL JAVA_BIND(Camera, elevation)(JNIEnv* env, jobject self, jdouble angle) { - GetEngine(env, self)->getWindow().getCamera().addElevation(angle); + GetEngine(env, self)->getWindow().getCamera().elevation(angle); } JNIEXPORT void JAVA_BIND(Camera, pitch)(JNIEnv* env, jobject self, jdouble angle) diff --git a/library/private/camera_impl.h b/library/private/camera_impl.h index b34bf9f05d..7b480d2751 100644 --- a/library/private/camera_impl.h +++ b/library/private/camera_impl.h @@ -58,9 +58,9 @@ class camera_impl : public camera camera& pan(double right, double up, double forward) override; camera& zoom(double factor) override; camera& roll(angle_deg_t angle) override; - camera& addAzimuth(angle_deg_t angle) override; - camera& addYaw(angle_deg_t angle) override; - camera& addElevation(angle_deg_t angle) override; + camera& azimuth(angle_deg_t angle) override; + camera& yaw(angle_deg_t angle) override; + camera& elevation(angle_deg_t angle) override; camera& pitch(angle_deg_t angle) override; camera& setCurrentAsDefault() override; diff --git a/library/public/camera.h b/library/public/camera.h index 53af247dd3..4e8ec9ecf0 100644 --- a/library/public/camera.h +++ b/library/public/camera.h @@ -72,11 +72,11 @@ class F3D_EXPORT camera /** Rotate the camera about its forward axis. */ virtual camera& roll(angle_deg_t angle) = 0; /** Rotate the camera about its vertical axis, centered at the focal point. */ - virtual camera& addAzimuth(angle_deg_t angle) = 0; + virtual camera& azimuth(angle_deg_t angle) = 0; /** Rotate the camera about its vertical axis, centered the camera's position. */ - virtual camera& addYaw(angle_deg_t angle) = 0; + virtual camera& yaw(angle_deg_t angle) = 0; /** Rotate the camera about its horizontal axis, centered at the focal point. */ - virtual camera& addElevation(angle_deg_t angle) = 0; + virtual camera& elevation(angle_deg_t angle) = 0; /** Rotate the camera about its horizontal axis, centered the camera's position. */ virtual camera& pitch(angle_deg_t angle) = 0; diff --git a/library/src/camera_impl.cxx b/library/src/camera_impl.cxx index cfbf85ceee..13c11e8ba9 100644 --- a/library/src/camera_impl.cxx +++ b/library/src/camera_impl.cxx @@ -264,7 +264,7 @@ camera& camera_impl::roll(angle_deg_t angle) } //---------------------------------------------------------------------------- -camera& camera_impl::addAzimuth(angle_deg_t angle) +camera& camera_impl::azimuth(angle_deg_t angle) { vtkCamera* cam = this->GetVTKCamera(); cam->Azimuth(angle); @@ -274,7 +274,7 @@ camera& camera_impl::addAzimuth(angle_deg_t angle) } //---------------------------------------------------------------------------- -camera& camera_impl::addYaw(angle_deg_t angle) +camera& camera_impl::yaw(angle_deg_t angle) { vtkCamera* cam = this->GetVTKCamera(); cam->Yaw(angle); @@ -284,7 +284,7 @@ camera& camera_impl::addYaw(angle_deg_t angle) } //---------------------------------------------------------------------------- -camera& camera_impl::addElevation(angle_deg_t angle) +camera& camera_impl::elevation(angle_deg_t angle) { vtkCamera* cam = this->GetVTKCamera(); cam->Elevation(angle); diff --git a/library/testing/TestSDKCamera.cxx b/library/testing/TestSDKCamera.cxx index 4525f4d987..ab6a8774bd 100644 --- a/library/testing/TestSDKCamera.cxx +++ b/library/testing/TestSDKCamera.cxx @@ -121,7 +121,7 @@ int TestSDKCamera(int argc, char* argv[]) } // Test azimuth - cam.addAzimuth(90); + cam.azimuth(90); f3d::point3_t expectedPos = { 0., -11., -1. }; f3d::point3_t expectedFoc = { 0., 0., -1. }; f3d::vector3_t expectedUp = { 1., 0., 0. }; @@ -149,7 +149,7 @@ int TestSDKCamera(int argc, char* argv[]) std::cerr << std::setprecision(12) << "azimuth: " << azimuth << " != 90.0" << std::endl; return EXIT_FAILURE; } - double viewDirProj[2] = { 1.0, 1.0 }; + const double viewDirProj[2] = { 1.0, 1.0 }; double dotProduct = viewDirProj[0] * viewDirProj[0] + viewDirProj[1] * viewDirProj[1]; const double epsilon = std::numeric_limits::epsilon(); if (dotProduct < epsilon) @@ -178,7 +178,7 @@ int TestSDKCamera(int argc, char* argv[]) } // Test yaw - cam.addYaw(90); + cam.yaw(90); expectedFoc = { 11., -11., -1. }; pos = cam.getPosition(); foc = cam.getFocalPoint(); @@ -211,7 +211,7 @@ int TestSDKCamera(int argc, char* argv[]) } // Test elevation - cam.addElevation(90); + cam.elevation(90); expectedPos = { 11., -11., -12. }; expectedUp = { 1., 0., 0. }; pos = cam.getPosition(); diff --git a/python/F3DPythonBindings.cxx b/python/F3DPythonBindings.cxx index 0035a169ee..ff91bca256 100644 --- a/python/F3DPythonBindings.cxx +++ b/python/F3DPythonBindings.cxx @@ -339,9 +339,9 @@ PYBIND11_MODULE(pyf3d, module) .def("pan", &f3d::camera::pan, py::arg("right"), py::arg("up"), py::arg("forward") = 0.0) .def("zoom", &f3d::camera::zoom) .def("roll", &f3d::camera::roll) - .def("add_azimuth", &f3d::camera::addAzimuth) - .def("add_yaw", &f3d::camera::addYaw) - .def("add_elevation", &f3d::camera::addElevation) + .def("add_azimuth", &f3d::camera::azimuth) + .def("add_yaw", &f3d::camera::yaw) + .def("add_elevation", &f3d::camera::elevation) .def_property_readonly("azimuth", &f3d::camera::getAzimuth) .def_property_readonly("yaw", &f3d::camera::getYaw) .def_property_readonly("elevation", &f3d::camera::getElevation) diff --git a/python/testing/test_camera.py b/python/testing/test_camera.py index cab6086376..1341ddb74b 100644 --- a/python/testing/test_camera.py +++ b/python/testing/test_camera.py @@ -80,9 +80,9 @@ def test_moves(): camera.dolly(10) angle = 30 camera.roll(angle) - camera.add_azimuth(angle) - camera.add_yaw(angle) - camera.add_elevation(angle) + camera.azimuth(angle) + camera.yaw(angle) + camera.elevation(angle) camera.pitch(angle) From 0ee83ca347e1cc920f781e3cee1377903ff87792 Mon Sep 17 00:00:00 2001 From: Schwarzemann Date: Sun, 16 Mar 2025 02:50:10 +0300 Subject: [PATCH 08/12] Feature: Add getters for camera parameters #1419 --- java/F3DJavaBindings.cxx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/java/F3DJavaBindings.cxx b/java/F3DJavaBindings.cxx index 87dd3eac84..e6cf340211 100644 --- a/java/F3DJavaBindings.cxx +++ b/java/F3DJavaBindings.cxx @@ -136,21 +136,21 @@ extern "C" GetEngine(env, self)->getWindow().getCamera().roll(angle); } - JNIEXPORT void JNICALL JAVA_BIND(Camera, azimuth)(JNIEnv* env, jobject self, jdouble angle) + JNIEXPORT void JAVA_BIND(Camera, azimuth)(JNIEnv* env, jobject self, jdouble angle) { GetEngine(env, self)->getWindow().getCamera().azimuth(angle); } - JNIEXPORT void JNICALL JAVA_BIND(Camera, yaw)(JNIEnv* env, jobject self, jdouble angle) + JNIEXPORT void JAVA_BIND(Camera, yaw)(JNIEnv* env, jobject self, jdouble angle) { GetEngine(env, self)->getWindow().getCamera().yaw(angle); } - JNIEXPORT void JNICALL JAVA_BIND(Camera, elevation)(JNIEnv* env, jobject self, jdouble angle) + JNIEXPORT void JAVA_BIND(Camera, elevation)(JNIEnv* env, jobject self, jdouble angle) { GetEngine(env, self)->getWindow().getCamera().elevation(angle); } - + JNIEXPORT void JAVA_BIND(Camera, pitch)(JNIEnv* env, jobject self, jdouble angle) { GetEngine(env, self)->getWindow().getCamera().pitch(angle); @@ -198,4 +198,4 @@ extern "C" { GetEngine(env, self)->getWindow().getCamera().resetToBounds(); } -} +} \ No newline at end of file From a2544ca51e223b1e316d104f35fbbeb641f2fe70 Mon Sep 17 00:00:00 2001 From: Schwarzemann Date: Sun, 16 Mar 2025 03:20:53 +0300 Subject: [PATCH 09/12] Feature: Add getters for camera parameters #1419 --- library/testing/CMakeLists.txt | 3 ++- library/testing/TestSDKCamera.cxx | 3 ++- python/F3DPythonBindings.cxx | 11 ++++------- python/testing/test_camera.py | 2 +- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/library/testing/CMakeLists.txt b/library/testing/CMakeLists.txt index 9d577e3133..7859bf3d77 100644 --- a/library/testing/CMakeLists.txt +++ b/library/testing/CMakeLists.txt @@ -75,6 +75,7 @@ option(F3D_TESTING_ENABLE_EXTERNAL_QT "Test external QT" OFF) set(libf3dSDKTests_link_libs "") +find_package(VTK REQUIRED COMPONENTS CommonCore) if(F3D_TESTING_ENABLE_EXTERNAL_GLFW) find_package(glfw3 REQUIRED) list(APPEND libf3dSDKTests_list TestSDKExternalWindowGLFW.cxx) @@ -177,7 +178,7 @@ if(F3D_MODULE_UI AND NOT F3D_TESTING_ENABLE_LONG_TIMEOUT_TESTS) set_tests_properties(libf3d::TestSDKInteractorCallBack PROPERTIES DISABLED ON) endif() -target_link_libraries(libf3dSDKTests libf3d ${libf3dSDKTests_link_libs}) +target_link_libraries(libf3dSDKTests libf3d ${libf3dSDKTests_link_libs} VTK::CommonCore) # make sure the libf3d API is compatible with the right C++ standard set_target_properties(libf3dSDKTests PROPERTIES CXX_STANDARD 17) diff --git a/library/testing/TestSDKCamera.cxx b/library/testing/TestSDKCamera.cxx index ab6a8774bd..e4cd3610fc 100644 --- a/library/testing/TestSDKCamera.cxx +++ b/library/testing/TestSDKCamera.cxx @@ -8,6 +8,7 @@ #include #include #include +#include // TODO these methods should be put in types.h at some point. // https://github.com/f3d-app/f3d/issues/361 @@ -150,7 +151,7 @@ int TestSDKCamera(int argc, char* argv[]) return EXIT_FAILURE; } const double viewDirProj[2] = { 1.0, 1.0 }; - double dotProduct = viewDirProj[0] * viewDirProj[0] + viewDirProj[1] * viewDirProj[1]; + double dotProduct = vtkMath::Dot(viewDirProj, viewDirProj); const double epsilon = std::numeric_limits::epsilon(); if (dotProduct < epsilon) { diff --git a/python/F3DPythonBindings.cxx b/python/F3DPythonBindings.cxx index ff91bca256..4c3cf71c76 100644 --- a/python/F3DPythonBindings.cxx +++ b/python/F3DPythonBindings.cxx @@ -339,12 +339,9 @@ PYBIND11_MODULE(pyf3d, module) .def("pan", &f3d::camera::pan, py::arg("right"), py::arg("up"), py::arg("forward") = 0.0) .def("zoom", &f3d::camera::zoom) .def("roll", &f3d::camera::roll) - .def("add_azimuth", &f3d::camera::azimuth) - .def("add_yaw", &f3d::camera::yaw) - .def("add_elevation", &f3d::camera::elevation) - .def_property_readonly("azimuth", &f3d::camera::getAzimuth) - .def_property_readonly("yaw", &f3d::camera::getYaw) - .def_property_readonly("elevation", &f3d::camera::getElevation) + .def("azimuth", &f3d::camera::azimuth) + .def("yaw", &f3d::camera::yaw) + .def("elevation", &f3d::camera::elevation) .def("pitch", &f3d::camera::pitch) .def("set_current_as_default", &f3d::camera::setCurrentAsDefault) .def("reset_to_default", &f3d::camera::resetToDefault) @@ -481,4 +478,4 @@ PYBIND11_MODULE(pyf3d, module) .def_static("set_use_coloring", &f3d::log::setUseColoring) .def_static("print", [](f3d::log::VerboseLevel& level, const std::string& message) { f3d::log::print(level, message); }); -} +} \ No newline at end of file diff --git a/python/testing/test_camera.py b/python/testing/test_camera.py index 1341ddb74b..09b5353e23 100644 --- a/python/testing/test_camera.py +++ b/python/testing/test_camera.py @@ -106,4 +106,4 @@ def test_resets(): camera = engine.window.camera camera.set_current_as_default() camera.reset_to_bounds() - camera.reset_to_default() + camera.reset_to_default() \ No newline at end of file From e634a0f4bb5c6ec728166d1f2a9a31d00543d75c Mon Sep 17 00:00:00 2001 From: Schwarzemann Date: Sun, 16 Mar 2025 14:02:17 +0300 Subject: [PATCH 10/12] Feature: Add getters for camera parameters #1419 --- library/testing/TestSDKCamera.cxx | 4 ++-- python/testing/test_camera.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/library/testing/TestSDKCamera.cxx b/library/testing/TestSDKCamera.cxx index e4cd3610fc..bfd61c3d0b 100644 --- a/library/testing/TestSDKCamera.cxx +++ b/library/testing/TestSDKCamera.cxx @@ -156,7 +156,7 @@ int TestSDKCamera(int argc, char* argv[]) if (dotProduct < epsilon) { std::cerr << "Dot product is lesser than epsilon, returning failure." << std::endl; - return EXIT_FAILURE; + return 0.0; } // Test roll @@ -208,7 +208,7 @@ int TestSDKCamera(int argc, char* argv[]) if (dotProduct < epsilon) { std::cerr << "Dot product is lesser than epsilon, returning failure." << std::endl; - return EXIT_FAILURE; + return 0.0; } // Test elevation diff --git a/python/testing/test_camera.py b/python/testing/test_camera.py index 09b5353e23..79e1effe20 100644 --- a/python/testing/test_camera.py +++ b/python/testing/test_camera.py @@ -106,4 +106,5 @@ def test_resets(): camera = engine.window.camera camera.set_current_as_default() camera.reset_to_bounds() - camera.reset_to_default() \ No newline at end of file + camera.reset_to_default() + \ No newline at end of file From 8cd2ea3eca73b13e42ea7992f278678102de735d Mon Sep 17 00:00:00 2001 From: Schwarzemann Date: Sun, 16 Mar 2025 14:05:03 +0300 Subject: [PATCH 11/12] Feature: Add getters for camera parameters #1419 --- python/testing/test_camera.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/testing/test_camera.py b/python/testing/test_camera.py index 79e1effe20..1341ddb74b 100644 --- a/python/testing/test_camera.py +++ b/python/testing/test_camera.py @@ -107,4 +107,3 @@ def test_resets(): camera.set_current_as_default() camera.reset_to_bounds() camera.reset_to_default() - \ No newline at end of file From c45409a1765500a0d055e054149d8b88fd3f1d01 Mon Sep 17 00:00:00 2001 From: Schwarzemann Date: Sun, 16 Mar 2025 15:23:45 +0300 Subject: [PATCH 12/12] Feature: Add getters for camera parameters #1419 --- library/testing/TestSDKCamera.cxx | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/library/testing/TestSDKCamera.cxx b/library/testing/TestSDKCamera.cxx index bfd61c3d0b..4208fb4419 100644 --- a/library/testing/TestSDKCamera.cxx +++ b/library/testing/TestSDKCamera.cxx @@ -143,21 +143,17 @@ int TestSDKCamera(int argc, char* argv[]) } // Test getAzimuth + f3d::point3_t tempPos = { 0.0, 0.0, 0.0 }; + f3d::point3_t tempFoc = { 0.0, 0.0, 1.0 }; + cam.setPosition(tempPos); + cam.setFocalPoint(tempFoc); f3d::angle_deg_t azimuth = cam.getAzimuth(); - if (!compareDouble(azimuth, 90.0)) + if (!compareDouble(azimuth, 0.0)) { std::cerr << "getAzimuth is not behaving as expected:" << std::endl; - std::cerr << std::setprecision(12) << "azimuth: " << azimuth << " != 90.0" << std::endl; + std::cerr << std::setprecision(12) << "azimuth: " << azimuth << " != 0.0" << std::endl; return EXIT_FAILURE; } - const double viewDirProj[2] = { 1.0, 1.0 }; - double dotProduct = vtkMath::Dot(viewDirProj, viewDirProj); - const double epsilon = std::numeric_limits::epsilon(); - if (dotProduct < epsilon) - { - std::cerr << "Dot product is lesser than epsilon, returning failure." << std::endl; - return 0.0; - } // Test roll cam.roll(90); @@ -198,18 +194,17 @@ int TestSDKCamera(int argc, char* argv[]) } // Test getYaw + // f3d::point3_t testPos = { 0.0, 0.0, 0.0 }; + f3d::point3_t termFoc = { 0.0, 0.0, 1.0 }; + // cam.setPosition(testPos); + cam.setFocalPoint(termFoc); f3d::angle_deg_t yaw = cam.getYaw(); - if (!compareDouble(yaw, 90.0)) + if (!compareDouble(yaw, 0.0)) { std::cerr << "getYaw is not behaving as expected:" << std::endl; std::cerr << std::setprecision(12) << "yaw: " << yaw << " != 0.0" << std::endl; return EXIT_FAILURE; } - if (dotProduct < epsilon) - { - std::cerr << "Dot product is lesser than epsilon, returning failure." << std::endl; - return 0.0; - } // Test elevation cam.elevation(90);