refactor: simplify vtkContainerBox transform logic by removing redundant affine matrix and updating synchronization methods
This commit is contained in:
@@ -37,14 +37,17 @@ int main() {
|
|||||||
BEGIN_TESTING(vtk ContainerBox Test);
|
BEGIN_TESTING(vtk ContainerBox Test);
|
||||||
|
|
||||||
ContainerBox box;
|
ContainerBox box;
|
||||||
box.Scale(Vector3f(1_m,5_m,1_m));
|
box.Scale(Vector3f(1_m,2_m,1_m));
|
||||||
box.SetPosition(Vector3f(0,1_m,0));
|
box.SetPosition(Vector3f(0,0,0));
|
||||||
Vtk::vtkContainerBox v_box(&box);
|
|
||||||
v_box.SetRepresentation(Vtk::Puppet::Surface);
|
|
||||||
v_box.SetOpacity(0.5);
|
|
||||||
v_box.SetSelectable(true);
|
|
||||||
|
|
||||||
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;
|
std::cout << "box updated: " << box.GetWorldPoint(HPoint3f(1,1,1)) << std::endl;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -51,14 +51,12 @@ struct ContainerBoxData {
|
|||||||
vtkSmartPointer<vtkActor> m_Cube;
|
vtkSmartPointer<vtkActor> m_Cube;
|
||||||
vtkSmartPointer<vtkActor> m_Axes;
|
vtkSmartPointer<vtkActor> m_Axes;
|
||||||
vtkSmartPointer<vtkAssembly> m_VtkAsm;
|
vtkSmartPointer<vtkAssembly> m_VtkAsm;
|
||||||
vtkSmartPointer<vtkMatrix4x4> m_Affine;
|
|
||||||
uLib::Connection m_UpdateSignal;
|
uLib::Connection m_UpdateSignal;
|
||||||
|
|
||||||
|
|
||||||
ContainerBoxData() : m_Cube(vtkSmartPointer<vtkActor>::New()),
|
ContainerBoxData() : m_Cube(vtkSmartPointer<vtkActor>::New()),
|
||||||
m_Axes(vtkSmartPointer<vtkActor>::New()),
|
m_Axes(vtkSmartPointer<vtkActor>::New()),
|
||||||
m_VtkAsm(vtkSmartPointer<vtkAssembly>::New()),
|
m_VtkAsm(vtkSmartPointer<vtkAssembly>::New()) {}
|
||||||
m_Affine(vtkSmartPointer<vtkMatrix4x4>::New()) {}
|
|
||||||
~ContainerBoxData() {
|
~ContainerBoxData() {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -87,14 +85,13 @@ void vtkContainerBox::Update() {
|
|||||||
RecursiveMutex::ScopedLock lock(this->m_UpdateMutex);
|
RecursiveMutex::ScopedLock lock(this->m_UpdateMutex);
|
||||||
if (!m_Content) return;
|
if (!m_Content) return;
|
||||||
|
|
||||||
vtkProp3D* root = vtkProp3D::SafeDownCast(this->GetProp());
|
vtkProp3D* prop = vtkProp3D::SafeDownCast(this->GetProp());
|
||||||
if (root) {
|
if (prop) {
|
||||||
// Apply local full matrix (TRS * LocalBox) so that nested assemblies work correctly
|
// Apply the full volume matrix (TRS * m_LocalT)
|
||||||
Matrix4f fullLocal = m_Content->GetMatrix() * m_Content->GetLocalMatrix();
|
|
||||||
vtkNew<vtkMatrix4x4> m;
|
vtkNew<vtkMatrix4x4> m;
|
||||||
Matrix4fToVtk(fullLocal, m);
|
Matrix4fToVtk(m_Content->GetMatrix(), m);
|
||||||
root->SetUserMatrix(m);
|
prop->SetUserMatrix(m);
|
||||||
root->Modified();
|
prop->Modified();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delegate rest of update (appearance, render, etc)
|
// Delegate rest of update (appearance, render, etc)
|
||||||
@@ -103,6 +100,8 @@ void vtkContainerBox::Update() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void vtkContainerBox::SyncFromVtk() {
|
void vtkContainerBox::SyncFromVtk() {
|
||||||
RecursiveMutex::ScopedLock lock(this->m_UpdateMutex);
|
RecursiveMutex::ScopedLock lock(this->m_UpdateMutex);
|
||||||
if (!m_Content) return;
|
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
|
// VTK -> Model: Extract new world TRS from proxy, which matches the model's TRS center
|
||||||
vtkMatrix4x4* rootMat = root->GetUserMatrix();
|
vtkMatrix4x4* rootMat = root->GetUserMatrix();
|
||||||
// if (rootMat) {
|
|
||||||
// std::cout << "[vtkContainerBox::SyncFromVtk] Read Proxy UserMatrix:" << std::endl;
|
|
||||||
// rootMat->Print(std::cout);
|
|
||||||
// }
|
|
||||||
|
|
||||||
Matrix4f vtkWorld = VtkToMatrix4f(rootMat);
|
Matrix4f vtkWorld = VtkToMatrix4f(rootMat);
|
||||||
|
|
||||||
// Synchronize TRS property members from the updated local matrix
|
// Synchronize TRS property members from the updated local matrix
|
||||||
m_Content->FromMatrix(vtkWorld);
|
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
|
// Since we modified the model, notify observers, but block the loop back to VTK
|
||||||
// ConnectionBlock blocker(d->m_UpdateSignal);
|
// ConnectionBlock blocker(d->m_UpdateSignal);
|
||||||
m_Content->Updated();
|
m_Content->Updated();
|
||||||
@@ -172,11 +164,10 @@ void vtkContainerBox::InstallPipe() {
|
|||||||
d->m_VtkAsm->AddPart(d->m_Axes);
|
d->m_VtkAsm->AddPart(d->m_Axes);
|
||||||
this->SetProp(d->m_VtkAsm);
|
this->SetProp(d->m_VtkAsm);
|
||||||
|
|
||||||
vtkProp3D* root = d->m_VtkAsm;
|
// vtkProp3D* root = d->m_VtkAsm;
|
||||||
if (root) {
|
// if (root) {
|
||||||
d->m_Affine = Matrix4fToVtk(m_Content->GetMatrix());
|
// this->ApplyPuppetTransform(root);
|
||||||
root->SetUserMatrix(d->m_Affine);
|
// }
|
||||||
}
|
|
||||||
this->Update();
|
this->Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ public:
|
|||||||
|
|
||||||
~PuppetData() {
|
~PuppetData() {
|
||||||
// No manual Delete needed for smart pointers
|
// No manual Delete needed for smart pointers
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Puppet *m_Puppet;
|
Puppet *m_Puppet;
|
||||||
@@ -112,9 +113,10 @@ public:
|
|||||||
vtkSmartPointer<vtkCubeAxesActor> m_CubeAxesActor;
|
vtkSmartPointer<vtkCubeAxesActor> m_CubeAxesActor;
|
||||||
vtkSmartPointer<vtkActor> m_HighlightActor;
|
vtkSmartPointer<vtkActor> m_HighlightActor;
|
||||||
|
|
||||||
|
// Display properties
|
||||||
bool m_ShowBoundingBox;
|
bool m_ShowBoundingBox;
|
||||||
bool m_ShowScaleMeasures;
|
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;
|
Vector3d m_Color;
|
||||||
double m_Opacity;
|
double m_Opacity;
|
||||||
|
|
||||||
@@ -179,7 +181,6 @@ public:
|
|||||||
|
|
||||||
void UpdateHighlight() {
|
void UpdateHighlight() {
|
||||||
if (m_Selected) {
|
if (m_Selected) {
|
||||||
// Find first polydata in assembly to highlight
|
|
||||||
vtkPolyData* polydata = nullptr;
|
vtkPolyData* polydata = nullptr;
|
||||||
if (vtkActor *actor = vtkActor::SafeDownCast(m_Prop)) {
|
if (vtkActor *actor = vtkActor::SafeDownCast(m_Prop)) {
|
||||||
if (actor->GetMapper()) {
|
if (actor->GetMapper()) {
|
||||||
|
|||||||
@@ -64,7 +64,8 @@ class Puppet : public uLib::Object {
|
|||||||
|
|
||||||
uLibTypeMacro(Puppet, uLib::Object)
|
uLibTypeMacro(Puppet, uLib::Object)
|
||||||
|
|
||||||
public : Puppet();
|
public:
|
||||||
|
Puppet();
|
||||||
virtual ~Puppet();
|
virtual ~Puppet();
|
||||||
|
|
||||||
virtual vtkProp *GetProp();
|
virtual vtkProp *GetProp();
|
||||||
@@ -149,9 +150,9 @@ protected:
|
|||||||
|
|
||||||
void RemoveProp(vtkProp *prop);
|
void RemoveProp(vtkProp *prop);
|
||||||
|
|
||||||
void ApplyAppearance(vtkProp *prop);
|
virtual void ApplyAppearance(vtkProp *prop);
|
||||||
void ApplyTransform(vtkProp3D *p3d);
|
virtual void ApplyTransform(vtkProp3D *p3d);
|
||||||
void ApplyPuppetTransform(vtkProp3D *p3d);
|
virtual void ApplyPuppetTransform(vtkProp3D *p3d);
|
||||||
|
|
||||||
std::vector<uLib::PropertyBase *> m_DisplayProperties;
|
std::vector<uLib::PropertyBase *> m_DisplayProperties;
|
||||||
mutable uLib::RecursiveMutex m_UpdateMutex;
|
mutable uLib::RecursiveMutex m_UpdateMutex;
|
||||||
@@ -167,6 +168,10 @@ private:
|
|||||||
} // namespace Vtk
|
} // namespace Vtk
|
||||||
} // namespace uLib
|
} // namespace uLib
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------- //
|
// -------------------------------------------------------------------------- //
|
||||||
// DISPLAY PROPERTIES SERIALIZE
|
// DISPLAY PROPERTIES SERIALIZE
|
||||||
// -------------------------------------------------------------------------- //
|
// -------------------------------------------------------------------------- //
|
||||||
|
|||||||
Reference in New Issue
Block a user