add assembly to gcompose, not working yet
This commit is contained in:
@@ -70,6 +70,7 @@ void Assembly::InstallPipe() {
|
||||
m_BBoxActor->GetProperty()->SetColor(1.0, 0.85, 0.0); // gold wireframe
|
||||
m_BBoxActor->GetProperty()->SetLineWidth(1.5);
|
||||
m_BBoxActor->GetProperty()->SetOpacity(0.6);
|
||||
m_BBoxActor->PickableOff();
|
||||
m_BBoxActor->SetVisibility(m_Content ? m_Content->GetShowBoundingBox() : false);
|
||||
|
||||
m_VtkAsm->AddPart(m_BBoxActor);
|
||||
|
||||
@@ -48,6 +48,7 @@ public:
|
||||
virtual void SyncFromVtk() override;
|
||||
|
||||
virtual uLib::Object* GetContent() const override { return (uLib::Object*)m_Content; }
|
||||
virtual uLib::ObjectsContext* GetChildren() override { return (uLib::ObjectsContext*)m_Content; }
|
||||
|
||||
/** @brief Called when the model signals an update (model→VTK push). */
|
||||
void contentUpdate();
|
||||
|
||||
@@ -3,6 +3,7 @@ set(TESTS
|
||||
vtkViewerTest
|
||||
vtkHandlerWidget
|
||||
PuppetPropertyTest
|
||||
PuppetParentingTest
|
||||
# vtkVoxImageTest
|
||||
# vtkTriangleMeshTest
|
||||
)
|
||||
|
||||
106
src/Vtk/testing/PuppetParentingTest.cpp
Normal file
106
src/Vtk/testing/PuppetParentingTest.cpp
Normal 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(Puppet Parenting Test);
|
||||
|
||||
ObjectsContext globalContext;
|
||||
Vtk::Viewer viewer;
|
||||
|
||||
// Create the display context, linked to the model context.
|
||||
// It will automatically create visual puppets for each model object.
|
||||
Vtk::vtkObjectsContext viewerContext(&globalContext);
|
||||
viewerContext.ConnectRenderer(viewer.GetRenderer());
|
||||
|
||||
// 1. Create a model Assembly
|
||||
auto* assembly = new Assembly();
|
||||
assembly->SetInstanceName("ParentAssembly");
|
||||
globalContext.AddObject(assembly);
|
||||
|
||||
// Verify assembly puppet exists in the viewer context
|
||||
Vtk::Puppet* assemblyPuppet = viewerContext.GetPuppet(assembly);
|
||||
ASSERT_NOT_NULL(assemblyPuppet);
|
||||
|
||||
// cast to Vtk::Assembly to access child context
|
||||
auto* vtkAss = dynamic_cast<Vtk::Assembly*>(assemblyPuppet);
|
||||
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 puppet was created in the assembly's child context
|
||||
Vtk::vtkObjectsContext* childVtkCtx = vtkAss->GetChildrenContext();
|
||||
ASSERT_NOT_NULL(childVtkCtx);
|
||||
|
||||
Vtk::Puppet* box1Puppet = childVtkCtx->GetPuppet(box1);
|
||||
ASSERT_NOT_NULL(box1Puppet);
|
||||
|
||||
// 3. Move the parent and verify the child follows
|
||||
assembly->SetPosition(Vector3f(100, 0, 0));
|
||||
assembly->Update();
|
||||
|
||||
// In VTK assemblies, the child's absolute matrix should reflect the parent's transform
|
||||
vtkProp3D* box1Prop = vtkProp3D::SafeDownCast(box1Puppet->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 puppet 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::Puppet* box2Puppet = childVtkCtx->GetPuppet(box2);
|
||||
ASSERT_NOT_NULL(box2Puppet);
|
||||
|
||||
// Render if not in batch environment
|
||||
if (!std::getenv("CTEST_PROJECT_NAME")) {
|
||||
viewer.GetRenderer()->ResetCamera();
|
||||
viewer.Start();
|
||||
}
|
||||
|
||||
END_TESTING;
|
||||
}
|
||||
Reference in New Issue
Block a user