From d38893e5e5c0a09347bfa4259c0dce6279a58487 Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Thu, 26 Feb 2026 16:39:05 +0100 Subject: [PATCH 1/2] [Visual] Scene center and radius are not longer cached. This avoids a case where it was used but not yet defined. --- .../src/sofa/component/visual/BaseCamera.cpp | 19 +++++++++++++++---- .../src/sofa/component/visual/BaseCamera.h | 7 ++----- .../component/visual/InteractiveCamera.cpp | 8 ++++---- .../sofa/component/visual/RecordedCamera.cpp | 2 +- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.cpp b/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.cpp index c8fd1b55266..4d0a6e7091b 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.cpp +++ b/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.cpp @@ -661,6 +661,9 @@ void BaseCamera::computeZ() { if (d_computeZClip.getValue()) { + const auto sceneCenter = getSceneCenter(); + const auto sceneRadius = getSceneRadius(); + //modelview transform sofa::type::Transform world_H_cam(d_position.getValue(), this->getOrientation()); @@ -737,9 +740,7 @@ void BaseCamera::setView(const type::Vec3& position, const Quat &orientation) void BaseCamera::setDefaultView(const type::Vec3 & gravity) { - const type::Vec3 & minBBox = d_minBBox.getValue(); - const type::Vec3 & maxBBox = d_maxBBox.getValue(); - sceneCenter = (minBBox + maxBBox)*0.5; + const auto sceneCenter = getSceneCenter(); if (b_setDefaultParameters) { @@ -770,7 +771,7 @@ void BaseCamera::setDefaultView(const type::Vec3 & gravity) //Distance const double coeff = 3.0; - const double dist = (minBBox - sceneCenter).norm() * coeff; + const double dist = (d_minBBox.getValue() - getSceneCenter()).norm() * coeff; d_distance.setValue(dist); currentDistance = dist; @@ -920,6 +921,16 @@ void BaseCamera::updateOutputData() d_zFar.setValue(currentZFar); } +type::Vec3 BaseCamera::getSceneCenter() const +{ + return (d_minBBox.getValue() + d_maxBBox.getValue()) * 0.5_sreal; +} + +SReal BaseCamera::getSceneRadius() const +{ + return 0.5_sreal * (d_maxBBox.getValue() - d_minBBox.getValue()).norm(); +} + void BaseCamera::handleEvent(sofa::core::objectmodel::Event* event) { if (sofa::simulation::AnimateBeginEvent::checkEventType(event)) diff --git a/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h b/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h index cd3a7ef26b6..97d17524f24 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h +++ b/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h @@ -164,9 +164,6 @@ class SOFA_COMPONENT_VISUAL_API BaseCamera : public core::objectmodel::BaseObjec d_minBBox.setValue(min); d_maxBBox.setValue(max); - sceneCenter = (min + max)*0.5; - sceneRadius = 0.5*(max - min).norm(); - computeZ(); } @@ -260,8 +257,8 @@ class SOFA_COMPONENT_VISUAL_API BaseCamera : public core::objectmodel::BaseObjec protected: void updateOutputData(); - type::Vec3 sceneCenter; - SReal sceneRadius; + type::Vec3 getSceneCenter() const; + SReal getSceneRadius() const; bool b_setDefaultParameters; diff --git a/Sofa/Component/Visual/src/sofa/component/visual/InteractiveCamera.cpp b/Sofa/Component/Visual/src/sofa/component/visual/InteractiveCamera.cpp index 68e48295994..9579ea80b7a 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/InteractiveCamera.cpp +++ b/Sofa/Component/Visual/src/sofa/component/visual/InteractiveCamera.cpp @@ -85,14 +85,14 @@ void InteractiveCamera::moveCamera(int x, int y) break; case SCENE_CENTER_PIVOT: default: - pivot = sceneCenter; + pivot = getSceneCenter(); break; } rotateWorldAroundPoint(newQuat, pivot, m_startingCameraOrientation, m_startingCameraPosition); } else if (currentMode == ZOOM_MODE) { - const double zoomStep = d_zoomSpeed.getValue() * (0.01 * sceneRadius ) / heightViewport; + const double zoomStep = d_zoomSpeed.getValue() * (0.01 * getSceneRadius() ) / heightViewport; double zoomDistance = zoomStep * -(y - lastMousePosY); type::Vec3 trans(0.0, 0.0, zoomDistance); @@ -109,7 +109,7 @@ void InteractiveCamera::moveCamera(int x, int y) else if (currentMode == PAN_MODE) { type::Vec3 trans(lastMousePosX - x, y-lastMousePosY, 0.0); - trans = cameraToWorldTransform(trans) * d_panSpeed.getValue() * (0.01 * sceneRadius ) ; + trans = cameraToWorldTransform(trans) * d_panSpeed.getValue() * (0.01 * getSceneRadius() ) ; translate(trans); if ( !d_fixedLookAtPoint.getValue() ) { @@ -126,7 +126,7 @@ void InteractiveCamera::moveCamera(int x, int y) } else if (currentMode == WHEEL_ZOOM_MODE) { - const double zoomStep = d_zoomSpeed.getValue() * (0.01 * sceneRadius ) / heightViewport; + const double zoomStep = d_zoomSpeed.getValue() * (0.01 * getSceneRadius() ) / heightViewport; double zoomDistance = zoomStep * -(y*0.5); type::Vec3 trans(0.0, 0.0, zoomDistance); diff --git a/Sofa/Component/Visual/src/sofa/component/visual/RecordedCamera.cpp b/Sofa/Component/Visual/src/sofa/component/visual/RecordedCamera.cpp index 3a5cf095481..6089325d4f0 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/RecordedCamera.cpp +++ b/Sofa/Component/Visual/src/sofa/component/visual/RecordedCamera.cpp @@ -503,7 +503,7 @@ void RecordedCamera::moveCamera_mouse(int x, int y) break; case SCENE_CENTER_PIVOT : default: - pivot = sceneCenter; + pivot = getSceneCenter(); break; } From 862d0ccbc0189d98244ee669bdbf03fdde29e90b Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Thu, 26 Feb 2026 16:44:50 +0100 Subject: [PATCH 2/2] easy consteness --- .../src/sofa/component/visual/BaseCamera.cpp | 14 +++++------ .../src/sofa/component/visual/BaseCamera.h | 25 ++++++++++--------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.cpp b/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.cpp index 4d0a6e7091b..b142ca06cda 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.cpp +++ b/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.cpp @@ -217,23 +217,23 @@ void BaseCamera::moveCamera(const type::Vec3 &p, const Quat &q) updateOutputData(); } -type::Vec3 BaseCamera::cameraToWorldCoordinates(const type::Vec3& p) +type::Vec3 BaseCamera::cameraToWorldCoordinates(const type::Vec3& p) const { return d_orientation.getValue().rotate(p) + d_position.getValue(); } -type::Vec3 BaseCamera::worldToCameraCoordinates(const type::Vec3& p) +type::Vec3 BaseCamera::worldToCameraCoordinates(const type::Vec3& p) const { return d_orientation.getValue().inverseRotate(p - d_position.getValue()); } -type::Vec3 BaseCamera::cameraToWorldTransform(const type::Vec3& v) +type::Vec3 BaseCamera::cameraToWorldTransform(const type::Vec3& v) const { const Quat q = d_orientation.getValue(); return q.rotate(v) ; } -type::Vec3 BaseCamera::worldToCameraTransform(const type::Vec3& v) +type::Vec3 BaseCamera::worldToCameraTransform(const type::Vec3& v) const { return d_orientation.getValue().inverseRotate(v); } @@ -305,7 +305,7 @@ void BaseCamera::setCameraType(unsigned int type) } -double BaseCamera::getHorizontalFieldOfView() +double BaseCamera::getHorizontalFieldOfView() const { const sofa::core::visual::VisualParams* vp = sofa::core::visual::VisualParams::defaultInstance(); const core::visual::VisualParams::Viewport viewport = vp->viewport(); @@ -783,7 +783,7 @@ void BaseCamera::setDefaultView(const type::Vec3 & gravity) computeZ(); } -void BaseCameraXMLExportSingleParameter(tinyxml2::XMLElement* root, core::objectmodel::BaseData& data, const std::string& comment) +void BaseCameraXMLExportSingleParameter(tinyxml2::XMLElement* root, const core::objectmodel::BaseData& data, const std::string& comment) { tinyxml2::XMLElement* node = root->GetDocument()->NewElement( data.getName().c_str() ); node->SetAttribute("value", data.getValueString().c_str() ); @@ -795,7 +795,7 @@ void BaseCameraXMLExportSingleParameter(tinyxml2::XMLElement* root, core::object root->LinkEndChild(node); } -bool BaseCamera::exportParametersInFile(const std::string& viewFilename) +bool BaseCamera::exportParametersInFile(const std::string& viewFilename) const { tinyxml2::XMLDocument doc; tinyxml2::XMLDeclaration* decl = doc.NewDeclaration(); diff --git a/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h b/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h index 97d17524f24..04d1552ef4f 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h +++ b/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h @@ -93,7 +93,7 @@ class SOFA_COMPONENT_VISUAL_API BaseCamera : public core::objectmodel::BaseObjec void desactivate(); bool isActivated(); - bool exportParametersInFile(const std::string& viewFilename); + bool exportParametersInFile(const std::string& viewFilename) const; bool importParametersFromFile(const std::string& viewFilename); void translate(const type::Vec3& t); @@ -120,10 +120,10 @@ class SOFA_COMPONENT_VISUAL_API BaseCamera : public core::objectmodel::BaseObjec type::Ray toRay() const; - type::Vec3 cameraToWorldCoordinates(const type::Vec3& p); - type::Vec3 worldToCameraCoordinates(const type::Vec3& p); - type::Vec3 cameraToWorldTransform(const type::Vec3& v); - type::Vec3 worldToCameraTransform(const type::Vec3& v); + type::Vec3 cameraToWorldCoordinates(const type::Vec3& p) const; + type::Vec3 worldToCameraCoordinates(const type::Vec3& p) const; + type::Vec3 cameraToWorldTransform(const type::Vec3& v) const; + type::Vec3 worldToCameraTransform(const type::Vec3& v) const; type::Vec3 screenToWorldCoordinates(int x, int y); type::Vec2 worldToScreenCoordinates(const type::Vec3& p); @@ -131,13 +131,14 @@ class SOFA_COMPONENT_VISUAL_API BaseCamera : public core::objectmodel::BaseObjec void fitBoundingBox(const type::Vec3& min,const type::Vec3& max); - type::Vec3 getPosition() + const type::Vec3& getPosition() const { return d_position.getValue(); } - Quat getOrientation() ; - type::Vec3 getLookAt() + Quat getOrientation(); + + const type::Vec3& getLookAt() const { return d_lookAt.getValue(); } @@ -148,12 +149,12 @@ class SOFA_COMPONENT_VISUAL_API BaseCamera : public core::objectmodel::BaseObjec return d_distance.getValue(); } - double getFieldOfView() + double getFieldOfView() const { return d_fieldOfView.getValue(); } - double getHorizontalFieldOfView() ; + double getHorizontalFieldOfView() const; unsigned int getCameraType() const ; @@ -173,12 +174,12 @@ class SOFA_COMPONENT_VISUAL_API BaseCamera : public core::objectmodel::BaseObjec d_heightViewport.setValue(h); } - double getZNear() + double getZNear() const { return currentZNear; } - double getZFar() + double getZFar() const { return currentZFar; }