From cdd0181ffcd4470152eb333d6a02e6eeafd7248c Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Fri, 19 Jul 2019 11:15:23 +0800 Subject: [PATCH] ViewProviderLink: fix visual of linked object with scale --- src/Gui/ViewProviderLink.cpp | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src/Gui/ViewProviderLink.cpp b/src/Gui/ViewProviderLink.cpp index cd6821097d..851485dba3 100644 --- a/src/Gui/ViewProviderLink.cpp +++ b/src/Gui/ViewProviderLink.cpp @@ -116,6 +116,7 @@ public: SoNodeSensor sensor; SoNodeSensor switchSensor; SoNodeSensor childSensor; + SoNodeSensor transformSensor; std::array,LinkView::SnapshotMax> pcSnapshots; std::array,LinkView::SnapshotMax> pcSwitches; @@ -175,6 +176,14 @@ public: static_cast(data)->updateChildren(); } + static void transformSensorCB(void *data, SoSensor *) { + auto self = static_cast(data); + for(size_t i=0;ipcSnapshots.size();++i) { + if(self->pcSnapshots[i] && i!=LinkView::SnapshotTransform) + self->getSnapshot(i,true); + } + } + LinkInfo(ViewProviderDocumentObject *vp) :ref(0),pcLinked(vp) { @@ -188,6 +197,8 @@ public: switchSensor.setData(this); childSensor.setFunction(childSensorCB); childSensor.setData(this); + transformSensor.setFunction(transformSensorCB); + transformSensor.setData(this); } ~LinkInfo() { @@ -233,6 +244,7 @@ public: sensor.detach(); switchSensor.detach(); childSensor.detach(); + transformSensor.detach(); for(auto &node : pcSnapshots) { if(node) coinRemoveAllChildren(node); @@ -369,14 +381,27 @@ public: auto childRoot = pcLinked->getChildRoot(); - if(type!=LinkView::SnapshotTransform) - pcSnapshot->addChild(pcLinked->getTransformNode()); - for(int i=0,count=root->getNumChildren();igetChild(i); - if(node==pcLinked->getTransformNode()) + if(node==pcLinked->getTransformNode()) { + if(type!=LinkView::SnapshotTransform) + pcSnapshot->addChild(node); + else { + auto transform = pcLinked->getTransformNode(); + const auto &scale = transform->scaleFactor.getValue(); + if(scale[0]!=1.0 || scale[1]!=1.0 || scale[2]!=1.0) { + SoTransform *trans = new SoTransform; + pcSnapshot->addChild(trans); + trans->scaleFactor.setValue(scale); + trans->scaleOrientation = transform->scaleOrientation; + if(transformSensor.getAttachedNode()!=transform) { + transformSensor.detach(); + transformSensor.attach(transform); + } + } + } continue; - else if(node!=pcLinked->getModeSwitch()) { + } else if(node!=pcLinked->getModeSwitch()) { pcSnapshot->addChild(node); continue; }