Gui: refactor SoRotationDragger

This commit is contained in:
captain0xff
2025-06-21 23:14:07 +05:30
parent ce54149637
commit cd8ddd1b9b
5 changed files with 283 additions and 185 deletions

View File

@@ -84,7 +84,6 @@ SoLinearDragger::SoLinearDragger()
FC_ADD_CATALOG_ENTRY(secondaryColor, SoBaseColor, activeSwitch);
FC_ADD_CATALOG_ENTRY(coneSeparator, SoSeparator, translator);
FC_ADD_CATALOG_ENTRY(cylinderSeparator, SoSeparator, translator);
// For some reason changing the whichChild parameter of this switch doesn't hide the label
FC_ADD_CATALOG_ENTRY(labelSwitch, SoSwitch, translator);
FC_ADD_CATALOG_ENTRY(labelSeparator, SoSeparator, labelSwitch);
@@ -101,10 +100,10 @@ SoLinearDragger::SoLinearDragger()
SO_KIT_INIT_INSTANCE();
setupGeometryCalculator();
SoInteractionKit::setPart("cylinderSeparator", buildCylinderGeometry());
SoInteractionKit::setPart("coneSeparator", buildConeGeometry());
SoInteractionKit::setPart("labelSeparator", buildLabelGeometry());
SoInteractionKit::setPart("secondaryColor", buildActiveColor());
setPart("cylinderSeparator", buildCylinderGeometry());
setPart("coneSeparator", buildConeGeometry());
setPart("labelSeparator", buildLabelGeometry());
setPart("secondaryColor", buildActiveColor());
FC_SET_SWITCH("activeSwitch", SO_SWITCH_NONE);
setLabelVisibility(true);
@@ -427,8 +426,8 @@ SoLinearDraggerContainer::SoLinearDraggerContainer()
SO_KIT_INIT_INSTANCE();
SoInteractionKit::setPart("baseColor", buildColor());
SoInteractionKit::setPart("transform", buildTransform());
setPart("baseColor", buildColor());
setPart("transform", buildTransform());
setVisibility(true);
}

View File

@@ -48,6 +48,7 @@
#include <Inventor/nodes/SoText2.h>
#include <Inventor/nodes/SoAnnotation.h>
#include <Inventor/nodes/SoFontStyle.h>
#include <Inventor/engines/SoCalculator.h>
#endif
#include <Base/Quantity.h>
@@ -55,7 +56,7 @@
#include "SoRotationDragger.h"
#include "MainWindow.h"
#include "SoFCDB.h"
#include "Utilities.h"
#include <SoTextLabel.h>
@@ -75,30 +76,26 @@ SoRotationDragger::SoRotationDragger()
this->ref();
#endif
SO_KIT_ADD_CATALOG_ENTRY(rotatorSwitch, SoSwitch, TRUE, geomSeparator, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(rotator, SoSeparator, TRUE, rotatorSwitch, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(rotatorActive, SoSeparator, TRUE, rotatorSwitch, "", TRUE);
arcRadius = 8.0;
if (SO_KIT_IS_FIRST_INSTANCE()) {
buildFirstInstance();
}
FC_ADD_CATALOG_ENTRY(activeSwitch, SoSwitch, geomSeparator);
FC_ADD_CATALOG_ENTRY(secondaryColor, SoBaseColor, activeSwitch);
FC_ADD_CATALOG_ENTRY(rotator, SoSeparator, geomSeparator);
SO_KIT_ADD_FIELD(rotation, (SbVec3f(0.0, 0.0, 1.0), 0.0));
SO_KIT_ADD_FIELD(rotationIncrement, (std::numbers::pi / 8.0));
SO_KIT_ADD_FIELD(rotationIncrementCount, (0));
SO_KIT_ADD_FIELD(activeColor, (1, 1, 0));
SO_KIT_ADD_FIELD(arcRadius, (8.0));
SO_KIT_ADD_FIELD(arcAngle, (std::numbers::pi_v<float> / 2.0f));
SO_KIT_ADD_FIELD(sphereRadius, (0.8));
SO_KIT_ADD_FIELD(arcThickness, (4.0));
SO_KIT_INIT_INSTANCE();
// initialize default parts.
// first is from 'SO_KIT_CATALOG_ENTRY_HEADER' macro
// second is unique name from buildFirstInstance().
this->setPartAsDefault("rotator", "CSysDynamics_RDragger_Rotator");
this->setPartAsDefault("rotatorActive", "CSysDynamics_RDragger_RotatorActive");
setupGeometryCalculator();
setPart("secondaryColor", buildActiveColor());
setPart("rotator", buildGeometry());
SoSwitch* sw = SO_GET_ANY_PART(this, "rotatorSwitch", SoSwitch);
SoInteractionKit::setSwitchValue(sw, 0);
FC_SET_SWITCH("activeSwitch", SO_SWITCH_NONE);
this->addStartCallback(&SoRotationDragger::startCB);
this->addMotionCallback(&SoRotationDragger::motionCB);
@@ -118,50 +115,28 @@ SoRotationDragger::~SoRotationDragger()
fieldSensor.setData(nullptr);
fieldSensor.detach();
arcRadiusSensor.setData(nullptr);
arcRadiusSensor.detach();
arcAngleSensor.setData(nullptr);
arcAngleSensor.detach();
this->removeStartCallback(&SoRotationDragger::startCB);
this->removeMotionCallback(&SoRotationDragger::motionCB);
this->removeFinishCallback(&SoRotationDragger::finishCB);
removeValueChangedCallback(&SoRotationDragger::valueChangedCB);
}
void SoRotationDragger::buildFirstInstance()
SoSeparator* SoRotationDragger::buildGeometry()
{
SoGroup* geometryGroup = buildGeometry();
auto root = new SoSeparator();
auto localRotator = new SoSeparator();
localRotator->setName("CSysDynamics_RDragger_Rotator");
localRotator->addChild(geometryGroup);
SoFCDB::getStorage()->addChild(localRotator);
auto localRotatorActive = new SoSeparator();
localRotatorActive->setName("CSysDynamics_RDragger_RotatorActive");
auto colorActive = new SoBaseColor();
colorActive->rgb.setValue(1.0, 1.0, 0.0);
localRotatorActive->addChild(colorActive);
localRotatorActive->addChild(geometryGroup);
SoFCDB::getStorage()->addChild(localRotatorActive);
}
SoGroup* SoRotationDragger::buildGeometry()
{
auto root = new SoGroup();
// arc
auto coordinates = new SoCoordinate3();
unsigned int segments = 15;
float angleIncrement = (std::numbers::pi_v<float> / 2.f) / static_cast<float>(segments);
SbRotation rotation(SbVec3f(0.0, 0.0, 1.0), angleIncrement);
SbVec3f point(arcRadius, 0.0, 0.0);
for (unsigned int index = 0; index <= segments; ++index) {
coordinates->point.set1Value(index, point);
rotation.multVec(point, point);
}
this->coordinates = coordinates;
setupArcSensors();
root->addChild(coordinates);
auto drawStyle = new SoDrawStyle();
drawStyle->lineWidth = 4.0;
drawStyle->lineWidth.connectFrom(&arcThickness);
root->addChild(drawStyle);
auto lightModel = new SoLightModel();
@@ -178,20 +153,67 @@ SoGroup* SoRotationDragger::buildGeometry()
root->addChild(pickStyle);
// sphere.
SbVec3f origin(1.0, 1.0, 0.0);
origin.normalize();
origin *= arcRadius;
auto sphereTranslation = new SoTranslation();
sphereTranslation->translation.setValue(origin);
sphereTranslation->translation.connectFrom(&calculator->oA);
root->addChild(sphereTranslation);
auto sphere = new SoSphere();
sphere->radius.setValue(0.8F);
sphere->radius.connectFrom(&sphereRadius);
root->addChild(sphere);
return root;
}
void SoRotationDragger::arcSensorCB(void* userdata, SoSensor*)
{
auto sudoThis = static_cast<SoRotationDragger*>(userdata);
assert(sudoThis->coordinates);
auto coordinates = sudoThis->coordinates;
float angleIncrement = sudoThis->arcAngle.getValue() / static_cast<float>(segments);
SbRotation rotation(SbVec3f(0.0, 0.0, 1.0), angleIncrement);
SbVec3f point(sudoThis->arcRadius.getValue(), 0.0, 0.0);
for (unsigned int index = 0; index <= segments; ++index) {
coordinates->point.set1Value(index, point);
rotation.multVec(point, point);
}
}
SoBaseColor* SoRotationDragger::buildActiveColor()
{
auto color = new SoBaseColor;
color->rgb.connectFrom(&activeColor);
return color;
}
void SoRotationDragger::setupGeometryCalculator()
{
calculator = new SoCalculator;
// Recalculate the corresponding variables in the left hand side whenever any of the variables in the right hand side change
// oA -> sphereTranslation
// a -> arcRadius
// b -> arcAngle
calculator->expression = "oA = vec3f(a * cos(b / 2), a * sin(b / 2), 0)";
calculator->a.connectFrom(&arcRadius);
calculator->b.connectFrom(&arcAngle);
}
void SoRotationDragger::setupArcSensors()
{
arcRadiusSensor.setFunction(arcSensorCB);
arcRadiusSensor.setData(this);
arcRadiusSensor.setPriority(0);
arcRadiusSensor.attach(&arcRadius);
arcRadius.touch();
arcAngleSensor.setFunction(arcSensorCB);
arcAngleSensor.setData(this);
arcAngleSensor.setPriority(0);
arcAngleSensor.attach(&arcAngle);
arcAngle.touch();
}
void SoRotationDragger::startCB(void*, SoDragger* d)
{
auto sudoThis = static_cast<SoRotationDragger*>(d);
@@ -232,10 +254,7 @@ void SoRotationDragger::valueChangedCB(void*, SoDragger* d)
assert(sudoThis);
SbMatrix matrix = sudoThis->getMotionMatrix(); // clazy:exclude=rule-of-two-soft
// all this just to get the translation?
SbVec3f translationDummy, scaleDummy;
SbRotation localRotation, scaleOrientationDummy;
matrix.getTransform(translationDummy, localRotation, scaleDummy, scaleOrientationDummy);
SbRotation localRotation = getMatrixTransform(matrix).rotation;
sudoThis->fieldSensor.detach();
if (sudoThis->rotation.getValue() != localRotation) {
@@ -246,9 +265,7 @@ void SoRotationDragger::valueChangedCB(void*, SoDragger* d)
void SoRotationDragger::dragStart()
{
SoSwitch* sw;
sw = SO_GET_ANY_PART(this, "rotatorSwitch", SoSwitch);
SoInteractionKit::setSwitchValue(sw, 1);
FC_SET_SWITCH("activeSwitch", SO_SWITCH_ALL);
projector.setViewVolume(this->getViewVolume());
projector.setWorkingSpace(this->getLocalToWorldMatrix());
@@ -320,9 +337,7 @@ void SoRotationDragger::drag()
void SoRotationDragger::dragFinish()
{
SoSwitch* sw;
sw = SO_GET_ANY_PART(this, "rotatorSwitch", SoSwitch);
SoInteractionKit::setSwitchValue(sw, 0);
FC_SET_SWITCH("activeSwitch", SO_SWITCH_NONE);
}
SbBool SoRotationDragger::setUpConnections(SbBool onoff, SbBool doitalways)
@@ -365,3 +380,81 @@ int SoRotationDragger::roundIncrement(const float& radiansIn)
return rCount;
}
SO_KIT_SOURCE(SoRotationDraggerContainer)
void SoRotationDraggerContainer::initClass()
{
SoRotationDragger::initClass();
SO_KIT_INIT_CLASS(SoRotationDraggerContainer, SoInteractionKit, "InteractionKit");
}
SoRotationDraggerContainer::SoRotationDraggerContainer()
{
SO_KIT_CONSTRUCTOR(SoRotationDraggerContainer);
#if defined(Q_OS_MACOS) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD)
this->ref();
#endif
FC_ADD_CATALOG_ENTRY(draggerSwitch, SoSwitch, geomSeparator);
FC_ADD_CATALOG_ENTRY(baseColor, SoBaseColor, draggerSwitch);
FC_ADD_CATALOG_ENTRY(transform, SoTransform, draggerSwitch);
FC_ADD_CATALOG_ENTRY(dragger, SoRotationDragger, draggerSwitch);
SO_KIT_ADD_FIELD(rotation, (0, 0, 0, 0));
SO_KIT_ADD_FIELD(color, (0, 0, 0));
SO_KIT_ADD_FIELD(translation, (0, 0, 0));
SO_KIT_INIT_INSTANCE();
setPart("baseColor", buildColor());
setPart("transform", buildTransform());
setVisibility(true);
}
SoBaseColor* SoRotationDraggerContainer::buildColor()
{
auto color = new SoBaseColor;
color->rgb.connectFrom(&this->color);
return color;
}
SoTransform* SoRotationDraggerContainer::buildTransform() {
auto transform = new SoTransform;
transform->translation.connectFrom(&this->translation);
transform->rotation.connectFrom(&this->rotation);
return transform;
}
void SoRotationDraggerContainer::setVisibility(bool visible)
{
FC_SET_SWITCH("draggerSwitch", visible? SO_SWITCH_ALL : SO_SWITCH_NONE);
}
bool SoRotationDraggerContainer::isVisible() {
auto* sw = SO_GET_ANY_PART(this, "draggerSwitch", SoSwitch);
return sw->whichChild.getValue() == SO_SWITCH_ALL;
}
SoRotationDragger* SoRotationDraggerContainer::getDragger()
{
return SO_GET_PART(this, "dragger", SoRotationDragger);
}
void Gui::SoRotationDraggerContainer::setPointerDirection(const Base::Vector3d& dir)
{
// This is the direction of normal from the origin to the spherical handle of
// the dragger in its local space
float arcAngle = getDragger()->arcAngle.getValue();
Base::Vector3d draggerDir{std::cos(arcAngle), std::sin(arcAngle), 0};
Base::Vector3d axis = draggerDir.Cross(dir).Normalize();
double ang = draggerDir.GetAngleOriented(dir, axis);
SbRotation rot{Base::convertTo<SbVec3f>(axis), static_cast<float>(ang)};
rotation.setValue(rot);
}

View File

@@ -33,6 +33,11 @@
#include <Inventor/projectors/SbLineProjector.h>
#include <Inventor/projectors/SbPlaneProjector.h>
#include <Inventor/nodes/SoBaseColor.h>
#include <Base/Vector3D.h>
class SoTransform;
class SoCalculator;
class SoCoordinate3;
namespace Gui
{
@@ -46,16 +51,22 @@ namespace Gui
class SoRotationDragger : public SoDragger
{
SO_KIT_HEADER(SoRotationDragger);
SO_KIT_CATALOG_ENTRY_HEADER(rotatorSwitch);
SO_KIT_CATALOG_ENTRY_HEADER(rotator);
SO_KIT_CATALOG_ENTRY_HEADER(rotatorActive);
SO_KIT_CATALOG_ENTRY_HEADER(activeSwitch);
SO_KIT_CATALOG_ENTRY_HEADER(secondaryColor);
public:
static void initClass();
SoRotationDragger();
SoSFRotation rotation; //!< set from outside and used from outside for single precision.
SoSFDouble rotationIncrement; //!< set from outside and used for rounding.
SoSFInt32 rotationIncrementCount; //!< number of steps. used from outside.
SoSFColor color; //!< set from outside. non-active color.
SoSFColor activeColor;
SoSFFloat arcRadius;
SoSFFloat arcAngle; //!< in radians
SoSFFloat sphereRadius;
SoSFFloat arcThickness;
protected:
~SoRotationDragger() override;
@@ -73,15 +84,53 @@ protected:
SoFieldSensor fieldSensor;
SbPlaneProjector projector;
float arcRadius;
private:
void buildFirstInstance();
SoCalculator* calculator;
SoCoordinate3* coordinates = nullptr;
SoFieldSensor arcRadiusSensor;
SoFieldSensor arcAngleSensor;
constexpr static int segments = 10; //!< segments of the arc per arcAngle
int roundIncrement(const float &radiansIn);
SoGroup* buildGeometry();
SoSeparator* buildGeometry();
static void arcSensorCB(void* userdata, SoSensor*);
SoBaseColor* buildActiveColor();
void setupGeometryCalculator();
void setupArcSensors();
using inherited = SoDragger;
};
class SoRotationDraggerContainer: public SoInteractionKit
{
SO_KIT_HEADER(SoRotationDraggerContainer);
SO_KIT_CATALOG_ENTRY_HEADER(draggerSwitch);
SO_KIT_CATALOG_ENTRY_HEADER(baseColor);
SO_KIT_CATALOG_ENTRY_HEADER(transform);
SO_KIT_CATALOG_ENTRY_HEADER(dragger);
public:
static void initClass();
SoRotationDraggerContainer();
SoSFRotation rotation;
SoSFColor color;
SoSFVec3f translation;
void setVisibility(bool visible);
bool isVisible();
void setPointerDirection(const Base::Vector3d& dir);
SoRotationDragger* getDragger();
private:
SoBaseColor* buildColor();
SoTransform* buildTransform();
using inherited = SoInteractionKit;
};
}
#endif /* GUI_ROTATION_DRAGGER_H */

View File

@@ -96,7 +96,7 @@ void SoTransformDragger::initClass()
{
SoLinearDraggerContainer::initClass();
SoPlanarDragger::initClass();
SoRotationDragger::initClass();
SoRotationDraggerContainer::initClass();
SO_KIT_INIT_CLASS(SoTransformDragger, SoDragger, "Dragger");
}
@@ -201,26 +201,9 @@ SoTransformDragger::SoTransformDragger()
TRUE);
// Rotator
SO_KIT_ADD_CATALOG_ENTRY(xRotatorSwitch, SoSwitch, TRUE, annotation, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(yRotatorSwitch, SoSwitch, TRUE, annotation, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(zRotatorSwitch, SoSwitch, TRUE, annotation, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(xRotatorSeparator, SoSeparator, TRUE, xRotatorSwitch, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(yRotatorSeparator, SoSeparator, TRUE, yRotatorSwitch, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(zRotatorSeparator, SoSeparator, TRUE, zRotatorSwitch, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(xRotatorColor, SoBaseColor, TRUE, xRotatorSeparator, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(yRotatorColor, SoBaseColor, TRUE, yRotatorSeparator, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(zRotatorColor, SoBaseColor, TRUE, zRotatorSeparator, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(xRotatorRotation, SoRotation, TRUE, xRotatorSeparator, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(yRotatorRotation, SoRotation, TRUE, yRotatorSeparator, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(zRotatorRotation, SoRotation, TRUE, zRotatorSeparator, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(xRotatorDragger, SoRotationDragger, TRUE, xRotatorSeparator, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(yRotatorDragger, SoRotationDragger, TRUE, yRotatorSeparator, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(zRotatorDragger, SoRotationDragger, TRUE, zRotatorSeparator, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(xRotatorDragger, SoRotationDraggerContainer, TRUE, annotation, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(yRotatorDragger, SoRotationDraggerContainer, TRUE, annotation, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(zRotatorDragger, SoRotationDraggerContainer, TRUE, annotation, "", TRUE);
// Other
SO_KIT_ADD_FIELD(translation, (0.0, 0.0, 0.0));
@@ -269,17 +252,9 @@ SoTransformDragger::SoTransformDragger()
tPlanarDragger->autoScaleResult.connectFrom(&this->autoScaleResult);
translationIncrementCountX.appendConnection(&tPlanarDragger->translationIncrementXCount);
translationIncrementCountZ.appendConnection(&tPlanarDragger->translationIncrementYCount);
// Rotator
SoRotationDragger* rDragger;
rDragger = SO_GET_ANY_PART(this, "xRotatorDragger", SoRotationDragger);
rDragger->rotationIncrement.connectFrom(&this->rotationIncrement);
rotationIncrementCountX.connectFrom(&rDragger->rotationIncrementCount);
rDragger = SO_GET_ANY_PART(this, "yRotatorDragger", SoRotationDragger);
rDragger->rotationIncrement.connectFrom(&this->rotationIncrement);
rotationIncrementCountY.connectFrom(&rDragger->rotationIncrementCount);
rDragger = SO_GET_ANY_PART(this, "zRotatorDragger", SoRotationDragger);
rDragger->rotationIncrement.connectFrom(&this->rotationIncrement);
rotationIncrementCountZ.connectFrom(&rDragger->rotationIncrementCount);
setupRotationDraggers();
// Switches
SoSwitch* sw;
@@ -290,13 +265,6 @@ SoTransformDragger::SoTransformDragger()
SoInteractionKit::setSwitchValue(sw, SO_SWITCH_ALL);
sw = SO_GET_ANY_PART(this, "zxPlanarTranslatorSwitch", SoSwitch);
SoInteractionKit::setSwitchValue(sw, SO_SWITCH_ALL);
// Rotator
sw = SO_GET_ANY_PART(this, "xRotatorSwitch", SoSwitch);
SoInteractionKit::setSwitchValue(sw, SO_SWITCH_ALL);
sw = SO_GET_ANY_PART(this, "yRotatorSwitch", SoSwitch);
SoInteractionKit::setSwitchValue(sw, SO_SWITCH_ALL);
sw = SO_GET_ANY_PART(this, "zRotatorSwitch", SoSwitch);
SoInteractionKit::setSwitchValue(sw, SO_SWITCH_ALL);
// Rotations
@@ -311,16 +279,17 @@ SoTransformDragger::SoTransformDragger()
localRotation = SO_GET_ANY_PART(this, "zxPlanarTranslatorRotation", SoRotation);
localRotation->rotation.setValue(SbVec3f(1.0, 0.0, 0.0), angle);
// Rotator
localRotation = SO_GET_ANY_PART(this, "xRotatorRotation", SoRotation);
SoRotationDraggerContainer* rDragger;
rDragger = SO_GET_ANY_PART(this, "xRotatorDragger", SoRotationDraggerContainer);
tempRotation = SbRotation(SbVec3f(1.0, 0.0, 0.0), angle);
tempRotation *= SbRotation(SbVec3f(0.0, 0.0, 1.0), angle);
localRotation->rotation.setValue(tempRotation);
localRotation = SO_GET_ANY_PART(this, "yRotatorRotation", SoRotation);
rDragger->rotation.setValue(tempRotation);
rDragger = SO_GET_ANY_PART(this, "yRotatorDragger", SoRotationDraggerContainer);
tempRotation = SbRotation(SbVec3f(0.0, -1.0, 0.0), angle);
tempRotation *= SbRotation(SbVec3f(0.0, 0.0, -1.0), angle);
localRotation->rotation.setValue(tempRotation);
localRotation = SO_GET_ANY_PART(this, "zRotatorRotation", SoRotation);
localRotation->rotation.setValue(SbRotation::identity());
rDragger->rotation.setValue(tempRotation);
rDragger = SO_GET_ANY_PART(this, "zRotatorDragger", SoRotationDraggerContainer);
rDragger->rotation.setValue(SbRotation::identity());
// this is for non-autoscale mode. this will be disconnected for autoscale
// and won't be used. see setUpAutoScale.
@@ -387,9 +356,9 @@ SbBool SoTransformDragger::setUpConnections(SbBool onoff, SbBool doitalways)
SO_GET_ANY_PART(this, "yzPlanarTranslatorDragger", SoPlanarDragger);
SoPlanarDragger* tPlanarDraggerZX =
SO_GET_ANY_PART(this, "zxPlanarTranslatorDragger", SoPlanarDragger);
SoRotationDragger* rDraggerX = SO_GET_ANY_PART(this, "xRotatorDragger", SoRotationDragger);
SoRotationDragger* rDraggerY = SO_GET_ANY_PART(this, "yRotatorDragger", SoRotationDragger);
SoRotationDragger* rDraggerZ = SO_GET_ANY_PART(this, "zRotatorDragger", SoRotationDragger);
auto rDraggerX = SO_GET_ANY_PART(this, "xRotatorDragger", SoRotationDraggerContainer);
auto rDraggerY = SO_GET_ANY_PART(this, "yRotatorDragger", SoRotationDraggerContainer);
auto rDraggerZ = SO_GET_ANY_PART(this, "zRotatorDragger", SoRotationDraggerContainer);
if (onoff) {
inherited::setUpConnections(onoff, doitalways);
@@ -400,9 +369,9 @@ SbBool SoTransformDragger::setUpConnections(SbBool onoff, SbBool doitalways)
registerChildDragger(tPlanarDraggerXZ);
registerChildDragger(tPlanarDraggerYZ);
registerChildDragger(tPlanarDraggerZX);
registerChildDragger(rDraggerX);
registerChildDragger(rDraggerY);
registerChildDragger(rDraggerZ);
registerChildDragger(rDraggerX->getDragger());
registerChildDragger(rDraggerY->getDragger());
registerChildDragger(rDraggerZ->getDragger());
translationSensorCB(this, nullptr);
if (this->translationSensor.getAttachedField() != &this->translation) {
@@ -421,9 +390,9 @@ SbBool SoTransformDragger::setUpConnections(SbBool onoff, SbBool doitalways)
unregisterChildDragger(tPlanarDraggerXZ);
unregisterChildDragger(tPlanarDraggerYZ);
unregisterChildDragger(tPlanarDraggerZX);
unregisterChildDragger(rDraggerX);
unregisterChildDragger(rDraggerY);
unregisterChildDragger(rDraggerZ);
unregisterChildDragger(rDraggerX->getDragger());
unregisterChildDragger(rDraggerY->getDragger());
unregisterChildDragger(rDraggerZ->getDragger());
inherited::setUpConnections(onoff, doitalways);
@@ -642,12 +611,13 @@ void SoTransformDragger::setAxisColors(unsigned long x, unsigned long y, unsigne
color = SO_GET_ANY_PART(this, "zxPlanarTranslatorColor", SoBaseColor);
color->rgb.setValue(colorY[0], colorY[1], colorY[2]);
// Rotator
color = SO_GET_ANY_PART(this, "xRotatorColor", SoBaseColor);
color->rgb.setValue(colorX[0], colorX[1], colorX[2]);
color = SO_GET_ANY_PART(this, "yRotatorColor", SoBaseColor);
color->rgb.setValue(colorY[0], colorY[1], colorY[2]);
color = SO_GET_ANY_PART(this, "zRotatorColor", SoBaseColor);
color->rgb.setValue(colorZ[0], colorZ[1], colorZ[2]);
SoRotationDraggerContainer* rDragger;
rDragger = SO_GET_ANY_PART(this, "xRotatorDragger", SoRotationDraggerContainer);
rDragger->color.setValue(colorX[0], colorX[1], colorX[2]);
rDragger = SO_GET_ANY_PART(this, "yRotatorDragger", SoRotationDraggerContainer);
rDragger->color.setValue(colorY[0], colorY[1], colorY[2]);
rDragger = SO_GET_ANY_PART(this, "zRotatorDragger", SoRotationDraggerContainer);
rDragger->color.setValue(colorZ[0], colorZ[1], colorZ[2]);
}
// Visibility API Functions
@@ -769,66 +739,50 @@ bool SoTransformDragger::isHiddenPlanarTranslationZX()
// Rotator
void SoTransformDragger::showRotationX()
{
SoSwitch* sw = SO_GET_ANY_PART(this, "xRotatorSwitch", SoSwitch);
SoInteractionKit::setSwitchValue(sw, SO_SWITCH_ALL);
SoRotationDraggerContainer* rDragger = SO_GET_ANY_PART(this, "xRotatorDragger", SoRotationDraggerContainer);
rDragger->setVisibility(true);
}
void SoTransformDragger::showRotationY()
{
SoSwitch* sw = SO_GET_ANY_PART(this, "yRotatorSwitch", SoSwitch);
SoInteractionKit::setSwitchValue(sw, SO_SWITCH_ALL);
SoRotationDraggerContainer* rDragger = SO_GET_ANY_PART(this, "yRotatorDragger", SoRotationDraggerContainer);
rDragger->setVisibility(true);
}
void SoTransformDragger::showRotationZ()
{
SoSwitch* sw = SO_GET_ANY_PART(this, "zRotatorSwitch", SoSwitch);
SoInteractionKit::setSwitchValue(sw, SO_SWITCH_ALL);
SoRotationDraggerContainer* rDragger = SO_GET_ANY_PART(this, "zRotatorDragger", SoRotationDraggerContainer);
rDragger->setVisibility(true);
}
void SoTransformDragger::hideRotationX()
{
SoSwitch* sw = SO_GET_ANY_PART(this, "xRotatorSwitch", SoSwitch);
SoInteractionKit::setSwitchValue(sw, SO_SWITCH_NONE);
SoRotationDraggerContainer* rDragger = SO_GET_ANY_PART(this, "xRotatorDragger", SoRotationDraggerContainer);
rDragger->setVisibility(false);
}
void SoTransformDragger::hideRotationY()
{
SoSwitch* sw = SO_GET_ANY_PART(this, "yRotatorSwitch", SoSwitch);
SoInteractionKit::setSwitchValue(sw, SO_SWITCH_NONE);
SoRotationDraggerContainer* rDragger = SO_GET_ANY_PART(this, "yRotatorDragger", SoRotationDraggerContainer);
rDragger->setVisibility(false);
}
void SoTransformDragger::hideRotationZ()
{
SoSwitch* sw = SO_GET_ANY_PART(this, "zRotatorSwitch", SoSwitch);
SoInteractionKit::setSwitchValue(sw, SO_SWITCH_NONE);
SoRotationDraggerContainer* rDragger = SO_GET_ANY_PART(this, "zRotatorDragger", SoRotationDraggerContainer);
rDragger->setVisibility(false);
}
bool SoTransformDragger::isShownRotationX()
{
SoSwitch* sw = SO_GET_ANY_PART(this, "xRotatorSwitch", SoSwitch);
return (sw->whichChild.getValue() == SO_SWITCH_ALL);
SoRotationDraggerContainer* rDragger = SO_GET_ANY_PART(this, "xRotatorDragger", SoRotationDraggerContainer);
return rDragger->isVisible();
}
bool SoTransformDragger::isShownRotationY()
{
SoSwitch* sw = SO_GET_ANY_PART(this, "yRotatorSwitch", SoSwitch);
return (sw->whichChild.getValue() == SO_SWITCH_ALL);
SoRotationDraggerContainer* rDragger = SO_GET_ANY_PART(this, "yRotatorDragger", SoRotationDraggerContainer);
return rDragger->isVisible();
}
bool SoTransformDragger::isShownRotationZ()
{
SoSwitch* sw = SO_GET_ANY_PART(this, "zRotatorSwitch", SoSwitch);
return (sw->whichChild.getValue() == SO_SWITCH_ALL);
}
bool SoTransformDragger::isHiddenRotationX()
{
SoSwitch* sw = SO_GET_ANY_PART(this, "xRotatorSwitch", SoSwitch);
return (sw->whichChild.getValue() == SO_SWITCH_NONE);
}
bool SoTransformDragger::isHiddenRotationY()
{
SoSwitch* sw = SO_GET_ANY_PART(this, "yRotatorSwitch", SoSwitch);
return (sw->whichChild.getValue() == SO_SWITCH_NONE);
}
bool SoTransformDragger::isHiddenRotationZ()
{
SoSwitch* sw = SO_GET_ANY_PART(this, "zRotatorSwitch", SoSwitch);
return (sw->whichChild.getValue() == SO_SWITCH_NONE);
SoRotationDraggerContainer* rDragger = SO_GET_ANY_PART(this, "zRotatorDragger", SoRotationDraggerContainer);
return rDragger->isVisible();
}
void SoTransformDragger::setupTranslationDraggers()
@@ -850,3 +804,19 @@ void SoTransformDragger::setupTranslationDragger(const std::string& name, SoSFSt
draggerContainer->setPointerDirection(Base::convertTo<Base::Vector3d>(rotDir));
}
void SoTransformDragger::setupRotationDraggers()
{
setupRotationDragger("xRotatorDragger", rotationIncrementCountX);
setupRotationDragger("yRotatorDragger", rotationIncrementCountY);
setupRotationDragger("zRotatorDragger", rotationIncrementCountZ);
}
void SoTransformDragger::setupRotationDragger(const std::string& name, SoSFInt32& incrementCount)
{
SoRotationDraggerContainer* draggerContainer = SO_GET_ANY_PART(this, name.c_str(), SoRotationDraggerContainer);
SoRotationDragger* dragger = draggerContainer->getDragger();
dragger->rotationIncrement.connectFrom(&this->rotationIncrement);
incrementCount.connectFrom(&dragger->rotationIncrementCount);
}

View File

@@ -82,18 +82,6 @@ class GuiExport SoTransformDragger : public SoDragger
SO_KIT_CATALOG_ENTRY_HEADER(yzPlanarTranslatorDragger);
SO_KIT_CATALOG_ENTRY_HEADER(zxPlanarTranslatorDragger);
// Rotator
SO_KIT_CATALOG_ENTRY_HEADER(xRotatorSwitch);
SO_KIT_CATALOG_ENTRY_HEADER(yRotatorSwitch);
SO_KIT_CATALOG_ENTRY_HEADER(zRotatorSwitch);
SO_KIT_CATALOG_ENTRY_HEADER(xRotatorSeparator);
SO_KIT_CATALOG_ENTRY_HEADER(yRotatorSeparator);
SO_KIT_CATALOG_ENTRY_HEADER(zRotatorSeparator);
SO_KIT_CATALOG_ENTRY_HEADER(xRotatorColor);
SO_KIT_CATALOG_ENTRY_HEADER(yRotatorColor);
SO_KIT_CATALOG_ENTRY_HEADER(zRotatorColor);
SO_KIT_CATALOG_ENTRY_HEADER(xRotatorRotation);
SO_KIT_CATALOG_ENTRY_HEADER(yRotatorRotation);
SO_KIT_CATALOG_ENTRY_HEADER(zRotatorRotation);
SO_KIT_CATALOG_ENTRY_HEADER(xRotatorDragger);
SO_KIT_CATALOG_ENTRY_HEADER(yRotatorDragger);
SO_KIT_CATALOG_ENTRY_HEADER(zRotatorDragger);
@@ -168,9 +156,6 @@ public:
bool isShownRotationX(); //!< is x rotation dragger shown.
bool isShownRotationY(); //!< is x rotation dragger shown.
bool isShownRotationZ(); //!< is x rotation dragger shown.
bool isHiddenRotationX(); //!< is x rotation dragger hidden.
bool isHiddenRotationY(); //!< is x rotation dragger hidden.
bool isHiddenRotationZ(); //!< is x rotation dragger hidden.
//@}
void GLRender(SoGLRenderAction * action) override;
@@ -202,6 +187,8 @@ private:
void setupTranslationDraggers();
void setupTranslationDragger(const std::string& name, SoSFString* label, SoSFInt32& incrementCount, const SbVec3d& rotDir);
void setupRotationDraggers();
void setupRotationDragger(const std::string& name, SoSFInt32& incrementCount);
using inherited = SoDragger;
};