refactor using pimpl and fix test
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
|
||||
#include "vtkHandlerWidget.h"
|
||||
#include <iostream>
|
||||
#include <vtkActor.h>
|
||||
#include <vtkArcSource.h>
|
||||
#include <vtkArrowSource.h>
|
||||
#include <vtkCallbackCommand.h>
|
||||
@@ -51,32 +52,60 @@
|
||||
namespace uLib {
|
||||
namespace Vtk {
|
||||
|
||||
struct HandlerWidgetData {
|
||||
vtkSmartPointer<::vtkRenderer> m_OverlayRenderer;
|
||||
::vtkProp *m_HighlightedProp;
|
||||
|
||||
// Visual components //
|
||||
vtkSmartPointer<::vtkActor> m_AxesX, m_AxesY, m_AxesZ; // Arrows
|
||||
vtkSmartPointer<::vtkActor> m_RotX, m_RotY, m_RotZ; // Rings
|
||||
vtkSmartPointer<::vtkActor> m_RotCam; // Camera ring
|
||||
vtkSmartPointer<::vtkActor> m_ScaleX, m_ScaleY, m_ScaleZ; // Cubes
|
||||
|
||||
vtkSmartPointer<::vtkPlane> m_ClipPlane;
|
||||
|
||||
vtkSmartPointer<::vtkCellPicker> m_Picker;
|
||||
vtkSmartPointer<::vtkTransform> m_InitialTransform;
|
||||
|
||||
std::vector<vtkSmartPointer<::vtkTransform>> m_TransformChain;
|
||||
vtkSmartPointer<::vtkMatrix4x4> m_BaseMatrix;
|
||||
|
||||
HandlerWidgetData() {
|
||||
m_Picker = vtkSmartPointer<::vtkCellPicker>::New();
|
||||
m_InitialTransform = vtkSmartPointer<::vtkTransform>::New();
|
||||
m_ClipPlane = vtkSmartPointer<::vtkPlane>::New();
|
||||
m_OverlayRenderer = vtkSmartPointer<::vtkRenderer>::New();
|
||||
m_BaseMatrix = vtkSmartPointer<::vtkMatrix4x4>::New();
|
||||
m_HighlightedProp = nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
vtkStandardNewMacro(vtkHandlerWidget);
|
||||
|
||||
vtkHandlerWidget::vtkHandlerWidget() {
|
||||
vtkHandlerWidget::vtkHandlerWidget() : d(new HandlerWidgetData()) {
|
||||
this->Interaction = IDLE;
|
||||
this->m_Picker = vtkSmartPointer<::vtkCellPicker>::New();
|
||||
this->m_Picker->SetTolerance(0.01); // Increased tolerance for thin gizmos
|
||||
this->m_InitialTransform = vtkSmartPointer<::vtkTransform>::New();
|
||||
d->m_Picker->SetTolerance(0.01); // Increased tolerance for thin gizmos
|
||||
this->EventCallbackCommand->SetCallback(vtkHandlerWidget::ProcessEvents);
|
||||
this->EventCallbackCommand->SetClientData(this);
|
||||
this->m_Frame = LOCAL;
|
||||
this->m_HighlightedProp = nullptr;
|
||||
this->m_ClipPlane = vtkSmartPointer<::vtkPlane>::New();
|
||||
this->m_OverlayRenderer = vtkSmartPointer<::vtkRenderer>::New();
|
||||
this->m_OverlayRenderer->SetLayer(1);
|
||||
this->m_OverlayRenderer->EraseOff();
|
||||
this->m_OverlayRenderer->InteractiveOff();
|
||||
d->m_OverlayRenderer->SetLayer(1);
|
||||
d->m_OverlayRenderer->EraseOff();
|
||||
d->m_OverlayRenderer->InteractiveOff();
|
||||
this->Priority = 50.0; // Higher priority to beat camera style
|
||||
this->m_TranslationEnabled = true;
|
||||
this->m_RotationEnabled = true;
|
||||
this->m_ScalingEnabled = true;
|
||||
this->m_BaseMatrix = vtkSmartPointer<::vtkMatrix4x4>::New();
|
||||
this->m_BaseMatrix->Identity();
|
||||
d->m_BaseMatrix->Identity();
|
||||
this->CreateGizmos();
|
||||
}
|
||||
|
||||
vtkHandlerWidget::~vtkHandlerWidget() {}
|
||||
vtkHandlerWidget::~vtkHandlerWidget() {
|
||||
delete d;
|
||||
}
|
||||
|
||||
::vtkRenderer *vtkHandlerWidget::GetOverlayRenderer() {
|
||||
return d->m_OverlayRenderer;
|
||||
}
|
||||
|
||||
void vtkHandlerWidget::SetProp3D(::vtkProp3D *prop) {
|
||||
if (this->Prop3D == prop) {
|
||||
@@ -84,13 +113,13 @@ void vtkHandlerWidget::SetProp3D(::vtkProp3D *prop) {
|
||||
}
|
||||
this->Prop3D = prop;
|
||||
if (this->Prop3D) {
|
||||
// Initialize m_BaseMatrix from the object's current matrix
|
||||
// Initialize d->m_BaseMatrix from the object's current matrix
|
||||
if (this->Prop3D->GetUserMatrix()) {
|
||||
this->m_BaseMatrix->DeepCopy(this->Prop3D->GetUserMatrix());
|
||||
this->d->m_BaseMatrix->DeepCopy(this->Prop3D->GetUserMatrix());
|
||||
} else {
|
||||
this->m_BaseMatrix->Identity();
|
||||
this->d->m_BaseMatrix->Identity();
|
||||
}
|
||||
this->m_TransformChain.clear(); // Clear any previous transform chain
|
||||
this->d->m_TransformChain.clear(); // Clear any previous transform chain
|
||||
this->UpdateGizmoPosition();
|
||||
}
|
||||
this->Modified();
|
||||
@@ -141,20 +170,20 @@ void vtkHandlerWidget::SetEnabled(int enabling) {
|
||||
}
|
||||
|
||||
// Sync Viewport and Camera
|
||||
this->m_OverlayRenderer->SetViewport(this->CurrentRenderer->GetViewport());
|
||||
this->m_OverlayRenderer->SetActiveCamera(this->CurrentRenderer->GetActiveCamera());
|
||||
win->AddRenderer(this->m_OverlayRenderer);
|
||||
this->d->m_OverlayRenderer->SetViewport(this->CurrentRenderer->GetViewport());
|
||||
this->d->m_OverlayRenderer->SetActiveCamera(this->CurrentRenderer->GetActiveCamera());
|
||||
win->AddRenderer(this->d->m_OverlayRenderer);
|
||||
|
||||
this->m_OverlayRenderer->AddActor(m_AxesX);
|
||||
this->m_OverlayRenderer->AddActor(m_AxesY);
|
||||
this->m_OverlayRenderer->AddActor(m_AxesZ);
|
||||
this->m_OverlayRenderer->AddActor(m_RotX);
|
||||
this->m_OverlayRenderer->AddActor(m_RotY);
|
||||
this->m_OverlayRenderer->AddActor(m_RotZ);
|
||||
this->m_OverlayRenderer->AddActor(m_RotCam);
|
||||
this->m_OverlayRenderer->AddActor(m_ScaleX);
|
||||
this->m_OverlayRenderer->AddActor(m_ScaleY);
|
||||
this->m_OverlayRenderer->AddActor(m_ScaleZ);
|
||||
this->d->m_OverlayRenderer->AddActor(d->m_AxesX);
|
||||
this->d->m_OverlayRenderer->AddActor(d->m_AxesY);
|
||||
this->d->m_OverlayRenderer->AddActor(d->m_AxesZ);
|
||||
this->d->m_OverlayRenderer->AddActor(d->m_RotX);
|
||||
this->d->m_OverlayRenderer->AddActor(d->m_RotY);
|
||||
this->d->m_OverlayRenderer->AddActor(d->m_RotZ);
|
||||
this->d->m_OverlayRenderer->AddActor(d->m_RotCam);
|
||||
this->d->m_OverlayRenderer->AddActor(d->m_ScaleX);
|
||||
this->d->m_OverlayRenderer->AddActor(d->m_ScaleY);
|
||||
this->d->m_OverlayRenderer->AddActor(d->m_ScaleZ);
|
||||
|
||||
this->UpdateVisibility();
|
||||
|
||||
@@ -167,9 +196,9 @@ void vtkHandlerWidget::SetEnabled(int enabling) {
|
||||
this->Highlight(nullptr);
|
||||
this->Interactor->RemoveObserver(this->EventCallbackCommand);
|
||||
if (this->Interactor->GetRenderWindow()) {
|
||||
this->Interactor->GetRenderWindow()->RemoveRenderer(this->m_OverlayRenderer);
|
||||
this->Interactor->GetRenderWindow()->RemoveRenderer(this->d->m_OverlayRenderer);
|
||||
}
|
||||
this->m_OverlayRenderer->RemoveAllViewProps();
|
||||
this->d->m_OverlayRenderer->RemoveAllViewProps();
|
||||
this->InvokeEvent(::vtkCommand::DisableEvent, nullptr);
|
||||
}
|
||||
|
||||
@@ -214,15 +243,15 @@ void vtkHandlerWidget::OnKeyPress() {
|
||||
bool ctrl = (this->Interactor->GetControlKey() != 0);
|
||||
|
||||
if (ctrl && key == "z") {
|
||||
if (!this->m_TransformChain.empty()) {
|
||||
if (!this->d->m_TransformChain.empty()) {
|
||||
std::cout << "Undoing last transform action..." << std::endl;
|
||||
this->m_TransformChain.pop_back();
|
||||
this->d->m_TransformChain.pop_back();
|
||||
|
||||
// Update object from chain
|
||||
vtkNew<vtkTransform> total;
|
||||
total->PostMultiply();
|
||||
total->SetMatrix(this->m_BaseMatrix.GetPointer());
|
||||
for (auto& t : m_TransformChain) {
|
||||
total->SetMatrix(this->d->m_BaseMatrix.GetPointer());
|
||||
for (auto& t : d->m_TransformChain) {
|
||||
total->Concatenate(t);
|
||||
}
|
||||
|
||||
@@ -245,33 +274,33 @@ void vtkHandlerWidget::OnLeftButtonDown() {
|
||||
this->CurrentRenderer = this->Interactor->FindPokedRenderer(X, Y);
|
||||
}
|
||||
|
||||
this->m_Picker->Pick(X, Y, 0.0, this->m_OverlayRenderer);
|
||||
::vtkProp *prop = this->m_Picker->GetViewProp();
|
||||
this->m_Picker->GetPickPosition(this->m_StartPickPosition);
|
||||
this->d->m_Picker->Pick(X, Y, 0.0, this->d->m_OverlayRenderer);
|
||||
::vtkProp *prop = this->d->m_Picker->GetViewProp();
|
||||
this->d->m_Picker->GetPickPosition(this->m_StartPickPosition);
|
||||
|
||||
if (!prop)
|
||||
return;
|
||||
|
||||
this->Interaction = IDLE;
|
||||
if (prop == m_AxesX)
|
||||
if (prop == d->m_AxesX)
|
||||
this->Interaction = TRANS_X;
|
||||
else if (prop == m_AxesY)
|
||||
else if (prop == d->m_AxesY)
|
||||
this->Interaction = TRANS_Y;
|
||||
else if (prop == m_AxesZ)
|
||||
else if (prop == d->m_AxesZ)
|
||||
this->Interaction = TRANS_Z;
|
||||
else if (prop == m_RotX)
|
||||
else if (prop == d->m_RotX)
|
||||
this->Interaction = ROT_X;
|
||||
else if (prop == m_RotY)
|
||||
else if (prop == d->m_RotY)
|
||||
this->Interaction = ROT_Y;
|
||||
else if (prop == m_RotZ)
|
||||
else if (prop == d->m_RotZ)
|
||||
this->Interaction = ROT_Z;
|
||||
else if (prop == m_ScaleX)
|
||||
else if (prop == d->m_ScaleX)
|
||||
this->Interaction = SCALE_X;
|
||||
else if (prop == m_ScaleY)
|
||||
else if (prop == d->m_ScaleY)
|
||||
this->Interaction = SCALE_Y;
|
||||
else if (prop == m_ScaleZ)
|
||||
else if (prop == d->m_ScaleZ)
|
||||
this->Interaction = SCALE_Z;
|
||||
else if (prop == m_RotCam)
|
||||
else if (prop == d->m_RotCam)
|
||||
this->Interaction = ROT_CAM;
|
||||
|
||||
if (this->Interaction != IDLE) {
|
||||
@@ -285,14 +314,14 @@ void vtkHandlerWidget::OnLeftButtonDown() {
|
||||
|
||||
// If the chain is empty, initialize base from current state?
|
||||
// Actually, if we just started selecting this object, we should have initialized BaseMatrix.
|
||||
// For now, let's keep m_InitialTransform as the state BEFORE this drag
|
||||
// For now, let's keep d->m_InitialTransform as the state BEFORE this drag
|
||||
vtkNew<vtkTransform> current;
|
||||
current->PostMultiply();
|
||||
current->SetMatrix(this->m_BaseMatrix.GetPointer());
|
||||
for (auto& t : m_TransformChain) {
|
||||
current->SetMatrix(this->d->m_BaseMatrix.GetPointer());
|
||||
for (auto& t : d->m_TransformChain) {
|
||||
current->Concatenate(t);
|
||||
}
|
||||
this->m_InitialTransform->SetMatrix(current->GetMatrix());
|
||||
this->d->m_InitialTransform->SetMatrix(current->GetMatrix());
|
||||
}
|
||||
this->EventCallbackCommand->SetAbortFlag(1);
|
||||
this->InvokeEvent(::vtkCommand::StartInteractionEvent, nullptr);
|
||||
@@ -310,10 +339,10 @@ void vtkHandlerWidget::OnLeftButtonUp() {
|
||||
|
||||
// We need to re-calculate the final 'op' to store it
|
||||
// Actually, we could have stored it in OnMouseMove, but let's re-calculate or
|
||||
// just capture the delta between m_InitialTransform and current UserMatrix.
|
||||
// just capture the delta between d->m_InitialTransform and current UserMatrix.
|
||||
if (this->Prop3D && this->Prop3D->GetUserMatrix()) {
|
||||
vtkNew<vtkMatrix4x4> inv;
|
||||
vtkMatrix4x4::Invert(this->m_InitialTransform->GetMatrix(), inv);
|
||||
vtkMatrix4x4::Invert(this->d->m_InitialTransform->GetMatrix(), inv);
|
||||
|
||||
vtkNew<vtkMatrix4x4> final_op_mat;
|
||||
vtkMatrix4x4::Multiply4x4(this->Prop3D->GetUserMatrix(), inv, final_op_mat);
|
||||
@@ -321,8 +350,8 @@ void vtkHandlerWidget::OnLeftButtonUp() {
|
||||
vtkNew<vtkTransform> final_op;
|
||||
final_op->SetMatrix(final_op_mat);
|
||||
|
||||
this->m_TransformChain.push_back(final_op);
|
||||
std::cout << "Action finalized. Chain size: " << this->m_TransformChain.size() << std::endl;
|
||||
this->d->m_TransformChain.push_back(final_op);
|
||||
std::cout << "Action finalized. Chain size: " << this->d->m_TransformChain.size() << std::endl;
|
||||
}
|
||||
|
||||
this->Interaction = IDLE;
|
||||
@@ -339,8 +368,8 @@ void vtkHandlerWidget::OnMouseMove() {
|
||||
int Y = this->Interactor->GetEventPosition()[1];
|
||||
|
||||
if (this->Interaction == IDLE) {
|
||||
this->m_Picker->Pick(X, Y, 0.0, this->m_OverlayRenderer);
|
||||
::vtkProp *prop = this->m_Picker->GetViewProp();
|
||||
this->d->m_Picker->Pick(X, Y, 0.0, this->d->m_OverlayRenderer);
|
||||
::vtkProp *prop = this->d->m_Picker->GetViewProp();
|
||||
this->Highlight(prop);
|
||||
this->UpdateGizmoPosition(); // Ensure camera adjustments happen
|
||||
return;
|
||||
@@ -353,7 +382,7 @@ void vtkHandlerWidget::OnMouseMove() {
|
||||
// std::cout << "Interaction " << this->Interaction << " dx=" << dx << " dy=" << dy << std::endl;
|
||||
|
||||
// Get current gizmo properties from its actors
|
||||
vtkMatrix4x4 *gizmo_mat = m_AxesX->GetUserMatrix();
|
||||
vtkMatrix4x4 *gizmo_mat = d->m_AxesX->GetUserMatrix();
|
||||
if (!gizmo_mat)
|
||||
return;
|
||||
|
||||
@@ -542,7 +571,7 @@ void vtkHandlerWidget::OnMouseMove() {
|
||||
// Total transform = Base * Chain * Interaction
|
||||
vtkNew<vtkTransform> total;
|
||||
total->PostMultiply();
|
||||
total->SetMatrix(this->m_InitialTransform->GetMatrix()); // m_InitialTransform is already Base*Chain
|
||||
total->SetMatrix(this->d->m_InitialTransform->GetMatrix()); // d->m_InitialTransform is already Base*Chain
|
||||
total->Concatenate(op);
|
||||
|
||||
vtkMatrix4x4* targetMat = this->Prop3D->GetUserMatrix();
|
||||
@@ -588,41 +617,41 @@ void vtkHandlerWidget::SetScalingEnabled(bool enabled) {
|
||||
}
|
||||
|
||||
void vtkHandlerWidget::UpdateVisibility() {
|
||||
if (!m_AxesX) return;
|
||||
if (!d->m_AxesX) return;
|
||||
|
||||
m_AxesX->SetVisibility(m_TranslationEnabled);
|
||||
m_AxesY->SetVisibility(m_TranslationEnabled);
|
||||
m_AxesZ->SetVisibility(m_TranslationEnabled);
|
||||
d->m_AxesX->SetVisibility(m_TranslationEnabled);
|
||||
d->m_AxesY->SetVisibility(m_TranslationEnabled);
|
||||
d->m_AxesZ->SetVisibility(m_TranslationEnabled);
|
||||
|
||||
m_RotX->SetVisibility(m_RotationEnabled);
|
||||
m_RotY->SetVisibility(m_RotationEnabled);
|
||||
m_RotZ->SetVisibility(m_RotationEnabled);
|
||||
m_RotCam->SetVisibility(m_RotationEnabled);
|
||||
d->m_RotX->SetVisibility(m_RotationEnabled);
|
||||
d->m_RotY->SetVisibility(m_RotationEnabled);
|
||||
d->m_RotZ->SetVisibility(m_RotationEnabled);
|
||||
d->m_RotCam->SetVisibility(m_RotationEnabled);
|
||||
|
||||
m_ScaleX->SetVisibility(m_ScalingEnabled);
|
||||
m_ScaleY->SetVisibility(m_ScalingEnabled);
|
||||
m_ScaleZ->SetVisibility(m_ScalingEnabled);
|
||||
d->m_ScaleX->SetVisibility(m_ScalingEnabled);
|
||||
d->m_ScaleY->SetVisibility(m_ScalingEnabled);
|
||||
d->m_ScaleZ->SetVisibility(m_ScalingEnabled);
|
||||
|
||||
// Update picker list
|
||||
if (m_Picker) {
|
||||
m_Picker->InitializePickList();
|
||||
if (d->m_Picker) {
|
||||
d->m_Picker->InitializePickList();
|
||||
if (m_TranslationEnabled) {
|
||||
m_Picker->AddPickList(m_AxesX);
|
||||
m_Picker->AddPickList(m_AxesY);
|
||||
m_Picker->AddPickList(m_AxesZ);
|
||||
d->m_Picker->AddPickList(d->m_AxesX);
|
||||
d->m_Picker->AddPickList(d->m_AxesY);
|
||||
d->m_Picker->AddPickList(d->m_AxesZ);
|
||||
}
|
||||
if (m_RotationEnabled) {
|
||||
m_Picker->AddPickList(m_RotX);
|
||||
m_Picker->AddPickList(m_RotY);
|
||||
m_Picker->AddPickList(m_RotZ);
|
||||
m_Picker->AddPickList(m_RotCam);
|
||||
d->m_Picker->AddPickList(d->m_RotX);
|
||||
d->m_Picker->AddPickList(d->m_RotY);
|
||||
d->m_Picker->AddPickList(d->m_RotZ);
|
||||
d->m_Picker->AddPickList(d->m_RotCam);
|
||||
}
|
||||
if (m_ScalingEnabled) {
|
||||
m_Picker->AddPickList(m_ScaleX);
|
||||
m_Picker->AddPickList(m_ScaleY);
|
||||
m_Picker->AddPickList(m_ScaleZ);
|
||||
d->m_Picker->AddPickList(d->m_ScaleX);
|
||||
d->m_Picker->AddPickList(d->m_ScaleY);
|
||||
d->m_Picker->AddPickList(d->m_ScaleZ);
|
||||
}
|
||||
m_Picker->PickFromListOn();
|
||||
d->m_Picker->PickFromListOn();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -676,7 +705,7 @@ void vtkHandlerWidget::CreateGizmos() {
|
||||
|
||||
auto mapper = vtkSmartPointer<::vtkPolyDataMapper>::New();
|
||||
mapper->SetInputConnection(circle->GetOutputPort());
|
||||
mapper->AddClippingPlane(this->m_ClipPlane);
|
||||
mapper->AddClippingPlane(this->d->m_ClipPlane);
|
||||
|
||||
auto actor = vtkSmartPointer<::vtkActor>::New();
|
||||
actor->SetMapper(mapper);
|
||||
@@ -690,15 +719,15 @@ void vtkHandlerWidget::CreateGizmos() {
|
||||
blue[] = {0.0, 0.0, 1.0}, white[] = {1.0, 1.0, 1.0};
|
||||
|
||||
double x[] = {1, 0, 0}, y[] = {0, 1, 0}, z[] = {0, 0, 1};
|
||||
m_AxesX = create_arrow(x, red);
|
||||
m_AxesY = create_arrow(y, green);
|
||||
m_AxesZ = create_arrow(z, blue);
|
||||
d->m_AxesX = create_arrow(x, red);
|
||||
d->m_AxesY = create_arrow(y, green);
|
||||
d->m_AxesZ = create_arrow(z, blue);
|
||||
|
||||
m_RotX = create_ring(0, red);
|
||||
m_RotY = create_ring(1, green);
|
||||
m_RotZ = create_ring(2, blue);
|
||||
d->m_RotX = create_ring(0, red);
|
||||
d->m_RotY = create_ring(1, green);
|
||||
d->m_RotZ = create_ring(2, blue);
|
||||
|
||||
m_RotCam = vtkSmartPointer<::vtkActor>::New();
|
||||
d->m_RotCam = vtkSmartPointer<::vtkActor>::New();
|
||||
{
|
||||
auto circle = vtkSmartPointer<::vtkRegularPolygonSource>::New();
|
||||
circle->SetNumberOfSides(64);
|
||||
@@ -708,10 +737,10 @@ void vtkHandlerWidget::CreateGizmos() {
|
||||
circle->GeneratePolylineOn();
|
||||
auto mapper = vtkSmartPointer<::vtkPolyDataMapper>::New();
|
||||
mapper->SetInputConnection(circle->GetOutputPort());
|
||||
m_RotCam->SetMapper(mapper);
|
||||
m_RotCam->GetProperty()->SetColor(white);
|
||||
m_RotCam->GetProperty()->SetLineWidth(2);
|
||||
m_RotCam->GetProperty()->SetLighting(0);
|
||||
d->m_RotCam->SetMapper(mapper);
|
||||
d->m_RotCam->GetProperty()->SetColor(white);
|
||||
d->m_RotCam->GetProperty()->SetLineWidth(2);
|
||||
d->m_RotCam->GetProperty()->SetLighting(0);
|
||||
}
|
||||
|
||||
auto create_cube = [](double pos[3], double color[3]) {
|
||||
@@ -730,23 +759,23 @@ void vtkHandlerWidget::CreateGizmos() {
|
||||
};
|
||||
|
||||
double px[] = {1.2, 0, 0}, py[] = {0, 1.2, 0}, pz[] = {0, 0, 1.2};
|
||||
m_ScaleX = create_cube(px, red);
|
||||
m_ScaleY = create_cube(py, green);
|
||||
m_ScaleZ = create_cube(pz, blue);
|
||||
d->m_ScaleX = create_cube(px, red);
|
||||
d->m_ScaleY = create_cube(py, green);
|
||||
d->m_ScaleZ = create_cube(pz, blue);
|
||||
|
||||
// Configure picker to only see gizmo actors (Pick-Through)
|
||||
m_Picker->InitializePickList();
|
||||
m_Picker->AddPickList(m_AxesX);
|
||||
m_Picker->AddPickList(m_AxesY);
|
||||
m_Picker->AddPickList(m_AxesZ);
|
||||
m_Picker->AddPickList(m_RotX);
|
||||
m_Picker->AddPickList(m_RotY);
|
||||
m_Picker->AddPickList(m_RotZ);
|
||||
m_Picker->AddPickList(m_RotCam);
|
||||
m_Picker->AddPickList(m_ScaleX);
|
||||
m_Picker->AddPickList(m_ScaleY);
|
||||
m_Picker->AddPickList(m_ScaleZ);
|
||||
m_Picker->PickFromListOn();
|
||||
d->m_Picker->InitializePickList();
|
||||
d->m_Picker->AddPickList(d->m_AxesX);
|
||||
d->m_Picker->AddPickList(d->m_AxesY);
|
||||
d->m_Picker->AddPickList(d->m_AxesZ);
|
||||
d->m_Picker->AddPickList(d->m_RotX);
|
||||
d->m_Picker->AddPickList(d->m_RotY);
|
||||
d->m_Picker->AddPickList(d->m_RotZ);
|
||||
d->m_Picker->AddPickList(d->m_RotCam);
|
||||
d->m_Picker->AddPickList(d->m_ScaleX);
|
||||
d->m_Picker->AddPickList(d->m_ScaleY);
|
||||
d->m_Picker->AddPickList(d->m_ScaleZ);
|
||||
d->m_Picker->PickFromListOn();
|
||||
}
|
||||
|
||||
void vtkHandlerWidget::UpdateGizmoPosition() {
|
||||
@@ -843,24 +872,24 @@ void vtkHandlerWidget::UpdateGizmoPosition() {
|
||||
}
|
||||
}
|
||||
|
||||
m_AxesX->SetUserMatrix(mat_gizmo);
|
||||
m_AxesY->SetUserMatrix(mat_gizmo);
|
||||
m_AxesZ->SetUserMatrix(mat_gizmo);
|
||||
m_RotX->SetUserMatrix(mat_gizmo);
|
||||
m_RotY->SetUserMatrix(mat_gizmo);
|
||||
m_RotZ->SetUserMatrix(mat_gizmo);
|
||||
m_ScaleX->SetUserMatrix(mat_gizmo);
|
||||
m_ScaleY->SetUserMatrix(mat_gizmo);
|
||||
m_ScaleZ->SetUserMatrix(mat_gizmo);
|
||||
d->m_AxesX->SetUserMatrix(mat_gizmo);
|
||||
d->m_AxesY->SetUserMatrix(mat_gizmo);
|
||||
d->m_AxesZ->SetUserMatrix(mat_gizmo);
|
||||
d->m_RotX->SetUserMatrix(mat_gizmo);
|
||||
d->m_RotY->SetUserMatrix(mat_gizmo);
|
||||
d->m_RotZ->SetUserMatrix(mat_gizmo);
|
||||
d->m_ScaleX->SetUserMatrix(mat_gizmo);
|
||||
d->m_ScaleY->SetUserMatrix(mat_gizmo);
|
||||
d->m_ScaleZ->SetUserMatrix(mat_gizmo);
|
||||
|
||||
// Sync Overlay Renderer with Main Renderer
|
||||
if (this->CurrentRenderer && this->m_OverlayRenderer) {
|
||||
this->m_OverlayRenderer->SetViewport(this->CurrentRenderer->GetViewport());
|
||||
this->m_OverlayRenderer->SetAspect(this->CurrentRenderer->GetAspect());
|
||||
this->m_OverlayRenderer->ComputeAspect();
|
||||
if (this->CurrentRenderer && this->d->m_OverlayRenderer) {
|
||||
this->d->m_OverlayRenderer->SetViewport(this->CurrentRenderer->GetViewport());
|
||||
this->d->m_OverlayRenderer->SetAspect(this->CurrentRenderer->GetAspect());
|
||||
this->d->m_OverlayRenderer->ComputeAspect();
|
||||
|
||||
if (this->m_OverlayRenderer->GetActiveCamera() != this->CurrentRenderer->GetActiveCamera()) {
|
||||
this->m_OverlayRenderer->SetActiveCamera(this->CurrentRenderer->GetActiveCamera());
|
||||
if (this->d->m_OverlayRenderer->GetActiveCamera() != this->CurrentRenderer->GetActiveCamera()) {
|
||||
this->d->m_OverlayRenderer->SetActiveCamera(this->CurrentRenderer->GetActiveCamera());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -890,36 +919,36 @@ void vtkHandlerWidget::UpdateGizmoPosition() {
|
||||
}
|
||||
tcam->Translate(mat_gizmo->GetElement(0, 3), mat_gizmo->GetElement(1, 3),
|
||||
mat_gizmo->GetElement(2, 3));
|
||||
m_RotCam->SetUserMatrix(tcam->GetMatrix());
|
||||
d->m_RotCam->SetUserMatrix(tcam->GetMatrix());
|
||||
|
||||
// Update clipping plane for axes rings
|
||||
this->m_ClipPlane->SetOrigin(mat_gizmo->GetElement(0, 3),
|
||||
this->d->m_ClipPlane->SetOrigin(mat_gizmo->GetElement(0, 3),
|
||||
mat_gizmo->GetElement(1, 3),
|
||||
mat_gizmo->GetElement(2, 3));
|
||||
this->m_ClipPlane->SetNormal(dir);
|
||||
this->d->m_ClipPlane->SetNormal(dir);
|
||||
}
|
||||
}
|
||||
|
||||
void vtkHandlerWidget::Highlight(::vtkProp *prop) {
|
||||
if (this->m_HighlightedProp == prop)
|
||||
if (this->d->m_HighlightedProp == prop)
|
||||
return;
|
||||
|
||||
// Restore previous
|
||||
if (this->m_HighlightedProp) {
|
||||
::vtkActor *actor = ::vtkActor::SafeDownCast(this->m_HighlightedProp);
|
||||
if (this->d->m_HighlightedProp) {
|
||||
::vtkActor *actor = ::vtkActor::SafeDownCast(this->d->m_HighlightedProp);
|
||||
if (actor) {
|
||||
actor->GetProperty()->SetColor(m_OriginalColor);
|
||||
actor->GetProperty()->SetLineWidth(3);
|
||||
}
|
||||
}
|
||||
|
||||
this->m_HighlightedProp = nullptr;
|
||||
this->d->m_HighlightedProp = nullptr;
|
||||
|
||||
// Highlight new if it belongs to us
|
||||
if (prop == m_AxesX || prop == m_AxesY || prop == m_AxesZ || prop == m_RotX ||
|
||||
prop == m_RotY || prop == m_RotZ || prop == m_RotCam || prop == m_ScaleX ||
|
||||
prop == m_ScaleY || prop == m_ScaleZ) {
|
||||
this->m_HighlightedProp = prop;
|
||||
if (prop == d->m_AxesX || prop == d->m_AxesY || prop == d->m_AxesZ || prop == d->m_RotX ||
|
||||
prop == d->m_RotY || prop == d->m_RotZ || prop == d->m_RotCam || prop == d->m_ScaleX ||
|
||||
prop == d->m_ScaleY || prop == d->m_ScaleZ) {
|
||||
this->d->m_HighlightedProp = prop;
|
||||
::vtkActor *actor = ::vtkActor::SafeDownCast(prop);
|
||||
if (actor) {
|
||||
actor->GetProperty()->GetColor(m_OriginalColor);
|
||||
|
||||
Reference in New Issue
Block a user