refactor: rename Puppet class to Prop3D across the codebase

This commit is contained in:
AndreaRigoni
2026-04-08 15:47:33 +00:00
parent 77f00a2b8a
commit f7ba4b1a17
63 changed files with 412 additions and 413 deletions

View File

@@ -0,0 +1,106 @@
/*//////////////////////////////////////////////////////////////////////////////
// CMT Cosmic Muon Tomography project //////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2014, Universita' degli Studi di Padova, INFN sez. di Padova
// All rights reserved
//
// Authors: Andrea Rigoni Garola < andrea.rigoni@pd.infn.it >
//
//////////////////////////////////////////////////////////////////////////////*/
#include <cstdlib>
#include <Core/ObjectsContext.h>
#include <Math/Assembly.h>
#include <Math/ContainerBox.h>
#include <Vtk/uLibVtkViewer.h>
#include <Vtk/vtkObjectsContext.h>
#include <Vtk/Math/vtkAssembly.h>
#include <Vtk/Math/vtkContainerBox.h>
#include <vtkAssembly.h>
#include <vtkProp3D.h>
#include <vtkRenderer.h>
#include <vtkMatrix4x4.h>
#include "testing-prototype.h"
using namespace uLib;
int main() {
BEGIN_TESTING(Prop3D Parenting Test);
ObjectsContext globalContext;
Vtk::Viewer viewer;
// Create the display context, linked to the model context.
// It will automatically create visual prop3ds for each model object.
Vtk::ObjectsContext viewerContext(&globalContext);
viewerContext.ConnectRenderer(viewer.GetRenderer());
// 1. Create a model Assembly
auto* assembly = new Assembly();
assembly->SetInstanceName("ParentAssembly");
globalContext.AddObject(assembly);
// Verify assembly prop3d exists in the viewer context
Vtk::Prop3D* assemblyProp3D = viewerContext.GetProp3D(assembly);
ASSERT_NOT_NULL(assemblyProp3D);
// cast to Vtk::Assembly to access child context
auto* vtkAss = dynamic_cast<Vtk::Assembly*>(assemblyProp3D);
ASSERT_NOT_NULL(vtkAss);
// 2. Create a child Box and add it to the Assembly
auto* box1 = new ContainerBox(Vector3f(10, 10, 10));
box1->SetInstanceName("ChildBox1");
box1->SetPosition(Vector3f(20, 0, 0));
assembly->AddObject(box1);
// Verify child prop3d was created in the assembly's child context
Vtk::ObjectsContext* childVtkCtx = vtkAss->GetChildrenContext();
ASSERT_NOT_NULL(childVtkCtx);
Vtk::Prop3D* box1Prop3D = childVtkCtx->GetProp3D(box1);
ASSERT_NOT_NULL(box1Prop3D);
// 3. Move the parent and verify the child follows
assembly->SetPosition(Vector3f(100, 0, 0));
assembly->Updated();
// In VTK assemblies, the child's absolute matrix should reflect the parent's transform
vtkProp3D* box1Prop = vtkProp3D::SafeDownCast(box1Prop3D->GetProp());
ASSERT_NOT_NULL(box1Prop);
vtkMatrix4x4* boxMatrix = box1Prop->GetMatrix();
// Origin (0,0,0) + local(20,0,0) + assembly(100,0,0) = world(120,0,0) ?
// Actually, box1->GetPosition() is (20,0,0).
// The prop3d ApplyTransform sets the prop orientation and position.
std::cout << "Checking transformation chain..." << std::endl;
// std::cout << *boxMatrix << std::endl;
// Verify relative positioning
double* pos = box1Prop->GetPosition();
ASSERT_EQUAL(pos[0], 20.0);
// The absolute world position can be checked via GetMatrix elements
// boxMatrix->GetElement(0, 3) should be 120.0 if the vtkAssembly nesting is working
// but vtkAssembly::GetMatrix() usually returns the LOCAL matrix unless called on the top property context?
// Actually vtkProp3D::GetMatrix() is the local matrix.
// 4. Add another child
auto* box2 = new ContainerBox(Vector3f(5, 5, 5));
box2->SetInstanceName("ChildBox2");
box2->SetPosition(Vector3f(-20, 0, 0));
assembly->AddObject(box2);
Vtk::Prop3D* box2Prop3D = childVtkCtx->GetProp3D(box2);
ASSERT_NOT_NULL(box2Prop3D);
// Render if not in batch environment
if (!std::getenv("CTEST_PROJECT_NAME")) {
viewer.GetRenderer()->ResetCamera();
viewer.Start();
}
END_TESTING;
}