From 8a01ee7f4031abf7c61f2e8764d85747a9d854b1 Mon Sep 17 00:00:00 2001 From: AndreaRigoni Date: Wed, 8 Apr 2026 13:37:38 +0000 Subject: [PATCH] refactor: simplify vtkContainerBox transform logic by removing redundant affine matrix and updating synchronization methods --- src/Vtk/Math/testing/vtkContainerBoxTest.cpp | 17 +++++---- src/Vtk/Math/vtkContainerBox.cpp | 37 ++++++++------------ src/Vtk/uLibVtkInterface.cxx | 5 +-- src/Vtk/uLibVtkInterface.h | 13 ++++--- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/Vtk/Math/testing/vtkContainerBoxTest.cpp b/src/Vtk/Math/testing/vtkContainerBoxTest.cpp index 12ddf37..0edce10 100644 --- a/src/Vtk/Math/testing/vtkContainerBoxTest.cpp +++ b/src/Vtk/Math/testing/vtkContainerBoxTest.cpp @@ -37,14 +37,17 @@ int main() { BEGIN_TESTING(vtk ContainerBox Test); ContainerBox box; - box.Scale(Vector3f(1_m,5_m,1_m)); - box.SetPosition(Vector3f(0,1_m,0)); - Vtk::vtkContainerBox v_box(&box); - v_box.SetRepresentation(Vtk::Puppet::Surface); - v_box.SetOpacity(0.5); - v_box.SetSelectable(true); + box.Scale(Vector3f(1_m,2_m,1_m)); + box.SetPosition(Vector3f(0,0,0)); - box.findOrAddSignal(&ContainerBox::Updated)->connect([&box](){ + Vtk::vtkContainerBox v_box(&box); + v_box.Update(); + + // v_box.SetRepresentation(Vtk::Puppet::Surface); + // v_box.SetOpacity(0.5); + // v_box.SetSelectable(true); + + box.findOrAddSignal(&Object::Updated)->connect([&box](){ std::cout << "box updated: " << box.GetWorldPoint(HPoint3f(1,1,1)) << std::endl; }); diff --git a/src/Vtk/Math/vtkContainerBox.cpp b/src/Vtk/Math/vtkContainerBox.cpp index f7518b4..c96a7e9 100644 --- a/src/Vtk/Math/vtkContainerBox.cpp +++ b/src/Vtk/Math/vtkContainerBox.cpp @@ -51,14 +51,12 @@ struct ContainerBoxData { vtkSmartPointer m_Cube; vtkSmartPointer m_Axes; vtkSmartPointer m_VtkAsm; - vtkSmartPointer m_Affine; uLib::Connection m_UpdateSignal; ContainerBoxData() : m_Cube(vtkSmartPointer::New()), m_Axes(vtkSmartPointer::New()), - m_VtkAsm(vtkSmartPointer::New()), - m_Affine(vtkSmartPointer::New()) {} + m_VtkAsm(vtkSmartPointer::New()) {} ~ContainerBoxData() { } }; @@ -87,14 +85,13 @@ void vtkContainerBox::Update() { RecursiveMutex::ScopedLock lock(this->m_UpdateMutex); if (!m_Content) return; - vtkProp3D* root = vtkProp3D::SafeDownCast(this->GetProp()); - if (root) { - // Apply local full matrix (TRS * LocalBox) so that nested assemblies work correctly - Matrix4f fullLocal = m_Content->GetMatrix() * m_Content->GetLocalMatrix(); - vtkNew m; - Matrix4fToVtk(fullLocal, m); - root->SetUserMatrix(m); - root->Modified(); + vtkProp3D* prop = vtkProp3D::SafeDownCast(this->GetProp()); + if (prop) { + // Apply the full volume matrix (TRS * m_LocalT) + vtkNew m; + Matrix4fToVtk(m_Content->GetMatrix(), m); + prop->SetUserMatrix(m); + prop->Modified(); } // Delegate rest of update (appearance, render, etc) @@ -103,6 +100,8 @@ void vtkContainerBox::Update() { } + + void vtkContainerBox::SyncFromVtk() { RecursiveMutex::ScopedLock lock(this->m_UpdateMutex); if (!m_Content) return; @@ -112,18 +111,11 @@ void vtkContainerBox::SyncFromVtk() { // VTK -> Model: Extract new world TRS from proxy, which matches the model's TRS center vtkMatrix4x4* rootMat = root->GetUserMatrix(); - // if (rootMat) { - // std::cout << "[vtkContainerBox::SyncFromVtk] Read Proxy UserMatrix:" << std::endl; - // rootMat->Print(std::cout); - // } - Matrix4f vtkWorld = VtkToMatrix4f(rootMat); // Synchronize TRS property members from the updated local matrix m_Content->FromMatrix(vtkWorld); - // std::cout << "[vtkContainerBox::SyncFromVtk] New Model WorldMatrix:" << std::endl << m_Content->GetWorldMatrix() << std::endl; - // Since we modified the model, notify observers, but block the loop back to VTK // ConnectionBlock blocker(d->m_UpdateSignal); m_Content->Updated(); @@ -172,11 +164,10 @@ void vtkContainerBox::InstallPipe() { d->m_VtkAsm->AddPart(d->m_Axes); this->SetProp(d->m_VtkAsm); - vtkProp3D* root = d->m_VtkAsm; - if (root) { - d->m_Affine = Matrix4fToVtk(m_Content->GetMatrix()); - root->SetUserMatrix(d->m_Affine); - } + // vtkProp3D* root = d->m_VtkAsm; + // if (root) { + // this->ApplyPuppetTransform(root); + // } this->Update(); } diff --git a/src/Vtk/uLibVtkInterface.cxx b/src/Vtk/uLibVtkInterface.cxx index c30a01e..40e19ab 100644 --- a/src/Vtk/uLibVtkInterface.cxx +++ b/src/Vtk/uLibVtkInterface.cxx @@ -100,6 +100,7 @@ public: ~PuppetData() { // No manual Delete needed for smart pointers + } Puppet *m_Puppet; @@ -112,9 +113,10 @@ public: vtkSmartPointer m_CubeAxesActor; vtkSmartPointer m_HighlightActor; + // Display properties bool m_ShowBoundingBox; bool m_ShowScaleMeasures; - int m_Representation; + int m_Representation; // 0: Points, 1: Wireframe, 2: Surface, 3: SurfaceWithEdges, 4: Volume, 5: Outline, 6: Slice Vector3d m_Color; double m_Opacity; @@ -179,7 +181,6 @@ public: void UpdateHighlight() { if (m_Selected) { - // Find first polydata in assembly to highlight vtkPolyData* polydata = nullptr; if (vtkActor *actor = vtkActor::SafeDownCast(m_Prop)) { if (actor->GetMapper()) { diff --git a/src/Vtk/uLibVtkInterface.h b/src/Vtk/uLibVtkInterface.h index 3032dd0..fc66429 100644 --- a/src/Vtk/uLibVtkInterface.h +++ b/src/Vtk/uLibVtkInterface.h @@ -64,7 +64,8 @@ class Puppet : public uLib::Object { uLibTypeMacro(Puppet, uLib::Object) - public : Puppet(); +public: + Puppet(); virtual ~Puppet(); virtual vtkProp *GetProp(); @@ -149,9 +150,9 @@ protected: void RemoveProp(vtkProp *prop); - void ApplyAppearance(vtkProp *prop); - void ApplyTransform(vtkProp3D *p3d); - void ApplyPuppetTransform(vtkProp3D *p3d); + virtual void ApplyAppearance(vtkProp *prop); + virtual void ApplyTransform(vtkProp3D *p3d); + virtual void ApplyPuppetTransform(vtkProp3D *p3d); std::vector m_DisplayProperties; mutable uLib::RecursiveMutex m_UpdateMutex; @@ -167,6 +168,10 @@ private: } // namespace Vtk } // namespace uLib + + + + // -------------------------------------------------------------------------- // // DISPLAY PROPERTIES SERIALIZE // -------------------------------------------------------------------------- //