85 lines
2.5 KiB
C++
85 lines
2.5 KiB
C++
/*//////////////////////////////////////////////////////////////////////////////
|
|
// CMT Cosmic Muon Tomography project //////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
Copyright (c) 2014, Universita' degli Studi Padova, INFN sez. di Padova
|
|
All rights reserved
|
|
|
|
Authors: Andrea Rigoni Garola < andrea.rigoni@pd.infn.it >
|
|
|
|
//////////////////////////////////////////////////////////////////////////////*/
|
|
|
|
#include "vtkBoxSolid.h"
|
|
#include "Core/Monitor.h"
|
|
#include <vtkCubeSource.h>
|
|
#include <vtkPolyDataMapper.h>
|
|
#include <vtkActor.h>
|
|
#include <vtkProperty.h>
|
|
#include <vtkAssembly.h>
|
|
#include <vtkTransform.h>
|
|
#include <vtkMatrix4x4.h>
|
|
#include <Geant4/G4VPhysicalVolume.hh>
|
|
#include "Vtk/Math/vtkDense.h"
|
|
|
|
namespace uLib {
|
|
namespace Vtk {
|
|
|
|
vtkBoxSolid::vtkBoxSolid(Geant::BoxSolid *content)
|
|
: vtkGeantSolid(content), m_BoxContent(content) {
|
|
this->InstallPipe();
|
|
|
|
// Connect the model's Updated event to updateTransform to ensure VTK sync
|
|
m_UpdateConnection = Object::connect(m_BoxContent, &uLib::Object::Updated, this, &vtkBoxSolid::Update);
|
|
|
|
// Initial sync
|
|
this->Update();
|
|
}
|
|
|
|
vtkBoxSolid::~vtkBoxSolid() {
|
|
}
|
|
|
|
void vtkBoxSolid::Update() {
|
|
ConnectionBlock blocker(m_UpdateConnection);
|
|
this->UpdateGeometry();
|
|
// Ensure base Puppet properties (color, opacity, etc) and transform are applied
|
|
this->Puppet::Update();
|
|
}
|
|
|
|
void vtkBoxSolid::SyncFromVtk() {
|
|
this->Puppet::SyncFromVtk();
|
|
if (auto* proxy = vtkProp3D::SafeDownCast(this->GetProxyProp())) {
|
|
if (vtkMatrix4x4* mat = proxy->GetUserMatrix()) {
|
|
m_BoxContent->SetTransform(VtkToMatrix4f(mat));
|
|
}
|
|
}
|
|
}
|
|
|
|
void vtkBoxSolid::UpdateGeometry() {
|
|
// Sync geometry from G4VSolid provided by vtkGeantSolid (tessellation)
|
|
vtkGeantSolid::UpdateGeometry();
|
|
}
|
|
|
|
void vtkBoxSolid::UpdateTransform() {
|
|
// Take transform from Puppet base (which uses GetContent() -> ContainerBox TRS)
|
|
this->Puppet::Update();
|
|
}
|
|
|
|
void vtkBoxSolid::serialize_display(uLib::Archive::display_properties_archive &ar,
|
|
const unsigned int version) {
|
|
// Expose Geant solid properties and underlying Box/TRS properties
|
|
this->Puppet::serialize_display(ar, version);
|
|
if (m_BoxContent) {
|
|
ar & NVP("Box", *m_BoxContent);
|
|
if (m_BoxContent->GetObject()) {
|
|
ar & NVP("Container", *m_BoxContent->GetObject());
|
|
}
|
|
}
|
|
}
|
|
|
|
void vtkBoxSolid::InstallPipe() {
|
|
vtkGeantSolid::InstallPipe();
|
|
}
|
|
|
|
} // namespace Vtk
|
|
} // namespace uLib
|