Skip to content

Commit

Permalink
Fix bone translation.
Browse files Browse the repository at this point in the history
For this the widget selected state of the bone widget is exposed.
It's only logical since the GetBoneSelected is exposed.

See Issue#13637
  • Loading branch information
vovythevov committed Nov 16, 2012
1 parent 41cd18b commit 476e9a5
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 23 deletions.
Expand Up @@ -372,30 +372,30 @@ rotationAxis -0.866354 0 0.49943*/
arm->SetRepresentation(armRep);
//arm->CreateDefaultRepresentation();

vtkBoneWidget* forearm = armature->CreateBone(arm, 20.0, 0.0, 0.0);
vtkBoneWidget* forearm = armature->CreateBone(arm, 20.0, 0.0, 0.0, "forearm");
armature->AddBone(forearm, arm);
vtkSmartPointer<vtkDoubleConeBoneRepresentation> forearmRep =
vtkSmartPointer<vtkDoubleConeBoneRepresentation>::New();
forearm->SetRepresentation(forearmRep);
forearmRep->GetConesProperty()->SetOpacity(0.4);

vtkBoneWidget* thumb = armature->CreateBone(forearm, 20.0, 4.0, 0.0);
vtkBoneWidget* thumb = armature->CreateBone(forearm, 20.0, 4.0, 0.0, "thumb");
armature->AddBone(thumb, forearm);
thumb->SetShowAxes(vtkBoneWidget::ShowPoseTransform);

vtkBoneWidget* indexFinger = armature->CreateBone(forearm, 22.0, 2.0, 0.0);
vtkBoneWidget* indexFinger = armature->CreateBone(forearm, 22.0, 2.0, 0.0, "index finger");
armature->AddBone(indexFinger, forearm);
indexFinger->SetShowAxes(vtkBoneWidget::ShowPoseTransform);

vtkBoneWidget* middleFinger = armature->CreateBone(forearm, 22.0, 1.0, 0.0);
vtkBoneWidget* middleFinger = armature->CreateBone(forearm, 22.0, 1.0, 0.0, "middle finger");
armature->AddBone(middleFinger, forearm);
middleFinger->SetShowAxes(vtkBoneWidget::ShowPoseTransform);

vtkBoneWidget* ringFinger = armature->CreateBone(forearm, 22.0, -1.0, 0.0);
vtkBoneWidget* ringFinger = armature->CreateBone(forearm, 22.0, -1.0, 0.0, "ring finger");
armature->AddBone(ringFinger, forearm);
ringFinger->SetShowAxes(vtkBoneWidget::ShowPoseTransform);

vtkBoneWidget* littleFinger = armature->CreateBone(forearm, 22.0, -2.0, 0.0);
vtkBoneWidget* littleFinger = armature->CreateBone(forearm, 22.0, -2.0, 0.0, "little finger");
armature->AddBone(littleFinger, forearm);
littleFinger->SetShowAxes(vtkBoneWidget::ShowPoseTransform);

Expand All @@ -406,7 +406,7 @@ rotationAxis -0.866354 0 0.49943*/
renderWindowInteractor->SetInteractorStyle(style);
style->Armature = armature;

vtkActor* CylinderActor = vtkActor::New();
/* vtkActor* CylinderActor = vtkActor::New();
vtkPolyDataMapper* CylinderMapper = vtkPolyDataMapper::New();
vtkTubeFilter* CylinderGenerator= vtkTubeFilter::New();
Expand All @@ -424,7 +424,7 @@ rotationAxis -0.866354 0 0.49943*/
CylinderActor->SetMapper(CylinderMapper);
renderer->AddActor(CylinderActor);

*/
vtkSmartPointer<vtkAxesActor> axes =
vtkSmartPointer<vtkAxesActor>::New();

Expand All @@ -440,7 +440,7 @@ rotationAxis -0.866354 0 0.49943*/
renderWindow->Render();
armature->On();

vtkActor* CylinderActor2 = vtkActor::New();
/*vtkActor* CylinderActor2 = vtkActor::New();
vtkPolyDataMapper* CylinderMapper2 = vtkPolyDataMapper::New();
vtkTubeFilter* CylinderGenerator2 = vtkTubeFilter::New();
// Define cylinde properties
Expand All @@ -456,7 +456,7 @@ rotationAxis -0.866354 0 0.49943*/
CylinderMapper2->SetInput(CylinderGenerator2->GetOutput());
CylinderActor2->SetMapper(CylinderMapper2);
renderer->AddActor(CylinderActor2);
renderer->AddActor(CylinderActor2);*/


// Begin mouse interaction
Expand Down
17 changes: 13 additions & 4 deletions Libs/VTK/Widgets/vtkArmatureWidget.cxx
Expand Up @@ -137,9 +137,18 @@ class vtkArmatureWidget::vtkArmatureWidgetCallback : public vtkCommand
ArmatureTreeNode* node = ArmatureWidget->GetNode(bone);
if (node && node->HeadLinkedToParent && node->Parent)
{
double parentTail[3];
node->Parent->Bone->GetCurrentWorldTail(parentTail);
node->Bone->SetWorldHeadRest(parentTail);
if (node->Bone->GetBoneSelected() != vtkBoneWidget::LineSelected)
{
double parentTail[3];
node->Parent->Bone->GetWorldTailRest(parentTail);
node->Bone->SetWorldHeadRest(parentTail);
}
if (node->Bone->GetBoneSelected() == vtkBoneWidget::LineSelected)
{
double head[3];
node->Bone->GetWorldHeadRest(head);
node->Parent->Bone->SetWorldTailRest(head);
}
}

ArmatureWidget->UpdateChildrenWidgetStateToRest(node);
Expand Down Expand Up @@ -602,7 +611,7 @@ ::SetBoneLinkedWithParent(vtkBoneWidget* bone, bool linked)
if (node && node->HeadLinkedToParent != linked)
{
node->HeadLinkedToParent = linked;
if (node->Parent)
if (node->Parent && linked)
{
node->Bone->SetWorldHeadRest(node->Parent->Bone->GetWorldTailRest());
}
Expand Down
21 changes: 12 additions & 9 deletions Libs/VTK/Widgets/vtkBoneWidget.h
Expand Up @@ -381,6 +381,18 @@ class VTK_BENDER_WIDGETS_EXPORT vtkBoneWidget : public vtkAbstractWidget
// Get the selection state of the widget.
vtkGetMacro(BoneSelected, int);

// Description:
// The differents selection state of the widget.
//BTX
enum WidgetSelectedState
{
NotSelected = 0,
HeadSelected,
TailSelected,
LineSelected

This comment has been minimized.

Copy link
@finetjul

finetjul Nov 24, 2012

Contributor
enum WidgetSelectedState
  {
  NotSelected = 0x00,
  HeadSelected = 0x01,
  TailSelected = 0x02,
  LineSelected = HeadSelected | TailSelected
  }

Apply into the code the fact that LineSelected is HeadSelected | TailSelected, it could simplify the code (I'm not sure).

This comment has been minimized.

Copy link
@vovythevov

vovythevov Nov 26, 2012

Author Owner

LineSelected is used for translating the bone whereas HeadSelected and TailSelected are used for moving only one part of the line.
If I understand correctly, the solution you propose would not work becuase the bone would try to both translate and move its head or tail when interacting with an endpoint.

This comment has been minimized.

Copy link
@finetjul

finetjul Nov 26, 2012

Contributor

The move behavior is not the only part that us the bone selected property. Hilight uses it too. I agree that the or combination may not apply everywhere, it's ok, just use the enums in that case.
I think it is more of a semantic issue here. Selecting the line means selecting everything.

};
//ETX

protected:
vtkBoneWidget();
~vtkBoneWidget();
Expand All @@ -391,15 +403,6 @@ class VTK_BENDER_WIDGETS_EXPORT vtkBoneWidget : public vtkAbstractWidget
// The different states of the widget.
int WidgetState;
int BoneSelected;
//BTX
enum WidgetSelectedState
{
NotSelected = 0,
HeadSelected,
TailSelected,
LineSelected
};
//ETX

// Callback interface to capture events when placing the widget.
static void StartSelectAction(vtkAbstractWidget*);
Expand Down

0 comments on commit 476e9a5

Please sign in to comment.