/* * * Copyright (C) 2000 Silicon Graphics, Inc. All Rights Reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like. Any license provided herein, whether implied or * otherwise, applies only to this software file. Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, * Mountain View, CA 94043, or: * * http://www.sgi.com * * For further information regarding this notice, see: * * http://oss.sgi.com/projects/GenInfo/NoticeExplan/ * */ /* * Copyright (C) 1990-93 Silicon Graphics, Inc. * _______________________________________________________________________ ______________ S I L I C O N G R A P H I C S I N C . ____________ | | $Revision: 1.1 $ | | Classes: | Subclasses of multiple sliders that act on specific fields of | specific types of nodes. | | Author(s) : Paul Isaacs | ______________ S I L I C O N G R A P H I C S I N C . ____________ _______________________________________________________________________ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #define TOL 0.0001 #define PI 3.141592653589793 #define DEGREES_TO_RADIANS PI / 180.0 #define RADIANS_TO_DEGREES 180.0 / PI static void extract_xyz( SbMatrix inMat, float &x, float &y, float &z ) { y = asin( inMat[2][0]); if( fabs(inMat[0][0]) rot( r1 ) y --> rot( r2 ) z */ /* is the same as: */ /* rot( PI + r0 ) x --> rot( PI - r1 ) y --> rot( PI + r2 ) z */ /* */ static void match_xyz_rots( float oldx, float oldy, float oldz, float &newx, float &newy, float &newz ) { int i; float R1[3],R2[3], Rold[3]; float sum1, sum2; Rold[0] = oldx; Rold[1] = oldy; Rold[2] = oldz; /* R1 and R2 are equivalent rots (see above) */ R1[0] = newx; R1[1] = newy; R1[2] = newz; R2[0] = PI + newx; R2[1] = PI - newy; R2[2] = PI + newz; /* map rots into interval nearest 'last frame' rots */ for( i=0; i<3; i++){ while( R1[i] < Rold[i] - PI ) R1[i] += 2. * PI; while( R2[i] < Rold[i] - PI ) R2[i] += 2. * PI; while( R1[i] >= Rold[i] + PI ) R1[i] -= 2. * PI; while( R2[i] >= Rold[i] + PI ) R2[i] -= 2. * PI; } /* see whether R1 or R2 better matches 'last frame' rots */ sum1 = fabs(Rold[0]-R1[0]) + fabs(Rold[1]-R1[1]) + fabs(Rold[2]-R1[2]); sum2 = fabs(Rold[0]-R2[0]) + fabs(Rold[1]-R2[1]) + fabs(Rold[2]-R2[2]); if(sum1setMultiSlider( this ); SoXtMultiSlider::buildWidget(form); setBaseWidget(form); } SoXtTransMultiSlider::~SoXtTransMultiSlider() {} SbBool SoXtTransMultiSlider::validNodeType(SoNode *node) { return ((node->isOfType(SoTransform::getClassTypeId())) || (node->isOfType(SoTranslation::getClassTypeId()))); } void SoXtTransMultiSlider::exportValuesToInventor() { float xX, xY, xZ; SbVec3f val; if ( _editNode ) { // get values from x-windows sliders xX = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue(); xY = ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue(); xZ = ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue(); // get values from inventor val = ((SoTransform *)_editNode)->translation.getValue(); if ( val[0] != xX || val[1] != xY || val[2] != xZ ) { // COPY TO NODE ((SoTransform *)_editNode)->translation.setValue( xX, xY, xZ ); } } } void SoXtTransMultiSlider::importValuesFromInventor() { SbVec3f val; if ( _editNode ) { // get values from inventor val = ((SoTransform *)_editNode)->translation.getValue(); // set values if necessary if ( val[0] != ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[0])->toolSetValue( val[0] ); if ( val[1] != ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[1])->toolSetValue( val[1] ); if ( val[2] != ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[2])->toolSetValue( val[2] ); } } /////////////////////////////////////////////////////////////////////////////// // // Class: SoXtScaleMultiSlider // /////////////////////////////////////////////////////////////////////////////// SoXtScaleMultiSlider::SoXtScaleMultiSlider( Widget parent, const char *name, SbBool buildInsideParent) : SoXtMultiSlider( parent, name, buildInsideParent, FALSE) // tell parent not to build just yet { _numSubComponents = 3; _subComponentArray = new ( SoXtSliderSetBase * [_numSubComponents] ); Widget form = buildForm(getParentWidget()); _subComponentArray[0] = new SoXtSliderTool( form, NULL, TRUE, SO_SCALE_SLIDER_MINIMUM, SO_SCALE_SLIDER_MAXIMUM ); _subComponentArray[1] = new SoXtSliderTool( form, NULL, TRUE, SO_SCALE_SLIDER_MINIMUM, SO_SCALE_SLIDER_MAXIMUM ); _subComponentArray[2] = new SoXtSliderTool( form, NULL, TRUE, SO_SCALE_SLIDER_MINIMUM, SO_SCALE_SLIDER_MAXIMUM ); for( int i = 0; i < _numSubComponents; i++ ) ((SoXtSliderTool *)_subComponentArray[i])->setMultiSlider( this ); SoXtMultiSlider::buildWidget(form); setBaseWidget(form); } SoXtScaleMultiSlider::~SoXtScaleMultiSlider() {} SbBool SoXtScaleMultiSlider::validNodeType(SoNode *node) { return ((node->isOfType(SoTransform::getClassTypeId())) || (node->isOfType(SoScale::getClassTypeId()))); } void SoXtScaleMultiSlider::exportValuesToInventor() { float xX, xY, xZ; SbVec3f val; if ( _editNode ) { // get values from x-windows sliders xX = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue(); xY = ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue(); xZ = ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue(); // get values from inventor val = ((SoTransform *)_editNode)->scaleFactor.getValue(); if ( val[0] != xX || val[1] != xY || val[2] != xZ ) { // COPY INTO NODE ((SoTransform *)_editNode)->scaleFactor.setValue( xX, xY, xZ ); } } } void SoXtScaleMultiSlider::importValuesFromInventor() { SbVec3f val; if ( _editNode ) { // get values from inventor val = ((SoTransform *)_editNode)->scaleFactor.getValue(); // set values if necessary if ( val[0] != ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[0])->toolSetValue( val[0] ); if ( val[1] != ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[1])->toolSetValue( val[1] ); if ( val[2] != ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[2])->toolSetValue( val[2] ); } } /////////////////////////////////////////////////////////////////////////////// // // Class: SoXtRotateMultiSlider // /////////////////////////////////////////////////////////////////////////////// SoXtRotateMultiSlider::SoXtRotateMultiSlider( Widget parent, const char *name, SbBool buildInsideParent) : SoXtMultiSlider( parent, name, buildInsideParent, FALSE) // tell parent not to build just yet { _numSubComponents = 3; _subComponentArray = new ( SoXtSliderSetBase * [_numSubComponents] ); Widget form = buildForm(getParentWidget()); _subComponentArray[0] = new SoXtSliderTool( form, NULL, TRUE, SO_ROTATE_SLIDER_MINIMUM, SO_ROTATE_SLIDER_MAXIMUM ); _subComponentArray[1] = new SoXtSliderTool( form, NULL, TRUE, SO_ROTATE_SLIDER_MINIMUM, SO_ROTATE_SLIDER_MAXIMUM ); _subComponentArray[2] = new SoXtSliderTool( form, NULL, TRUE, SO_ROTATE_SLIDER_MINIMUM, SO_ROTATE_SLIDER_MAXIMUM ); for( int i = 0; i < _numSubComponents; i++ ) ((SoXtSliderTool *)_subComponentArray[i])->setMultiSlider( this ); SoXtMultiSlider::buildWidget(form); setBaseWidget(form); } SoXtRotateMultiSlider::~SoXtRotateMultiSlider() {} SbBool SoXtRotateMultiSlider::validNodeType(SoNode *node) { return ((node->isOfType(SoTransform::getClassTypeId())) || (node->isOfType(SoRotation::getClassTypeId()))); } void SoXtRotateMultiSlider::exportValuesToInventor() { float xX, xY, xZ; SbMatrix theMatrix; SbRotation theRotation; if ( _editNode ) { // get values from x-windows sliders xX = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue(); xY = ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue(); xZ = ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue(); // convert from degrees to radians xX *= DEGREES_TO_RADIANS; xY *= DEGREES_TO_RADIANS; xZ *= DEGREES_TO_RADIANS; // set values in inventor rot_xyz( xX, xY, xZ, theMatrix ); theRotation.setValue( theMatrix ); ((SoTransform *)_editNode)->rotation.setValue( theRotation ); } } void SoXtRotateMultiSlider::importValuesFromInventor() { SbMatrix theMatrix; SbRotation theRotation; float xX, xY, xZ, x, y, z; if ( _editNode ) { // get values from inventor theRotation = ((SoTransform *)_editNode)->rotation.getValue(); theRotation.getValue( theMatrix ); extract_xyz( theMatrix, x, y, z ); // get values from sliders xX = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue(); xY = ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue(); xZ = ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue(); // convert from degrees to radians xX *= DEGREES_TO_RADIANS; xY *= DEGREES_TO_RADIANS; xZ *= DEGREES_TO_RADIANS; // match inventor values as closely as possible to the ones being // displayed match_xyz_rots( xX, xY, xZ, x, y, z ); // convert from radians to degrees x *= RADIANS_TO_DEGREES; y *= RADIANS_TO_DEGREES; z *= RADIANS_TO_DEGREES; // set values if necessary if ( x != ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[0])->toolSetValue( x ); if ( y != ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[1])->toolSetValue( y ); if ( z != ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[2])->toolSetValue( z ); } } /////////////////////////////////////////////////////////////////////////////// // // Class: SoXtScaleOrientationMultiSlider // /////////////////////////////////////////////////////////////////////////////// SoXtScaleOrientationMultiSlider::SoXtScaleOrientationMultiSlider( Widget parent, const char *name, SbBool buildInsideParent) : SoXtMultiSlider( parent, name, buildInsideParent, FALSE) // tell parent not to build just yet { _numSubComponents = 3; _subComponentArray = new ( SoXtSliderSetBase * [_numSubComponents] ); Widget form = buildForm(getParentWidget()); _subComponentArray[0] = new SoXtSliderTool( form, NULL, TRUE, SO_ROTATE_SLIDER_MINIMUM, SO_ROTATE_SLIDER_MAXIMUM ); _subComponentArray[1] = new SoXtSliderTool( form, NULL, TRUE, SO_ROTATE_SLIDER_MINIMUM, SO_ROTATE_SLIDER_MAXIMUM ); _subComponentArray[2] = new SoXtSliderTool( form, NULL, TRUE, SO_ROTATE_SLIDER_MINIMUM, SO_ROTATE_SLIDER_MAXIMUM ); for( int i = 0; i < _numSubComponents; i++ ) ((SoXtSliderTool *)_subComponentArray[i])->setMultiSlider( this ); SoXtMultiSlider::buildWidget(form); setBaseWidget(form); } SoXtScaleOrientationMultiSlider::~SoXtScaleOrientationMultiSlider() {} SbBool SoXtScaleOrientationMultiSlider::validNodeType(SoNode *node) { return ((node->isOfType(SoTransform::getClassTypeId())) || (node->isOfType(SoRotation::getClassTypeId()))); } void SoXtScaleOrientationMultiSlider::exportValuesToInventor() { float xX, xY, xZ; SbMatrix theMatrix; SbRotation theRotation; if ( _editNode ) { // get values from x-windows sliders xX = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue(); xY = ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue(); xZ = ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue(); // convert from degrees to radians xX *= DEGREES_TO_RADIANS; xY *= DEGREES_TO_RADIANS; xZ *= DEGREES_TO_RADIANS; // set values in inventor rot_xyz( xX, xY, xZ, theMatrix ); theRotation.setValue( theMatrix ); ((SoTransform *)_editNode)->scaleOrientation.setValue( theRotation ); } } void SoXtScaleOrientationMultiSlider::importValuesFromInventor() { SbMatrix theMatrix; SbRotation theRotation; float xX, xY, xZ, x, y, z; if ( _editNode ) { // get values from inventor theRotation = ((SoTransform *)_editNode)->scaleOrientation.getValue(); theRotation.getValue( theMatrix ); extract_xyz( theMatrix, x, y, z ); // get values from sliders xX = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue(); xY = ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue(); xZ = ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue(); // convert from degrees to radians xX *= DEGREES_TO_RADIANS; xY *= DEGREES_TO_RADIANS; xZ *= DEGREES_TO_RADIANS; // match inventor values as closely as possible to the ones being // displayed match_xyz_rots( xX, xY, xZ, x, y, z ); // convert from radians to degrees x *= RADIANS_TO_DEGREES; y *= RADIANS_TO_DEGREES; z *= RADIANS_TO_DEGREES; // set values if necessary if ( x != ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[0])->toolSetValue( x ); if ( y != ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[1])->toolSetValue( y ); if ( z != ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[2])->toolSetValue( z ); } } /////////////////////////////////////////////////////////////////////////////// // // Class: SoXtCenterMultiSlider // /////////////////////////////////////////////////////////////////////////////// SoXtCenterMultiSlider::SoXtCenterMultiSlider( Widget parent, const char *name, SbBool buildInsideParent) : SoXtMultiSlider( parent, name, buildInsideParent, FALSE) // tell parent not to build just yet { _numSubComponents = 3; _subComponentArray = new ( SoXtSliderSetBase * [_numSubComponents] ); Widget form = buildForm(getParentWidget()); _subComponentArray[0] = new SoXtSliderTool(form); _subComponentArray[1] = new SoXtSliderTool(form); _subComponentArray[2] = new SoXtSliderTool(form); for( int i = 0; i < _numSubComponents; i++ ) ((SoXtSliderTool *)_subComponentArray[i])->setMultiSlider( this ); SoXtMultiSlider::buildWidget(form); setBaseWidget(form); } SoXtCenterMultiSlider::~SoXtCenterMultiSlider() {} SbBool SoXtCenterMultiSlider::validNodeType(SoNode *node) { return (node->isOfType(SoTransform::getClassTypeId())); } void SoXtCenterMultiSlider::exportValuesToInventor() { float xX, xY, xZ; SbVec3f val; if ( _editNode ) { // get values from x-windows sliders xX = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue(); xY = ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue(); xZ = ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue(); // get values from inventor val = ((SoTransform *)_editNode)->center.getValue(); if ( val[0] != xX || val[1] != xY || val[2] != xZ ) { // COPY INTO NODE ((SoTransform *)_editNode)->center.setValue( xX, xY, xZ ); } } } void SoXtCenterMultiSlider::importValuesFromInventor() { SbVec3f val; if ( _editNode ) { // get values from inventor val = ((SoTransform *)_editNode)->center.getValue(); // set values if necessary if ( val[0] != ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[0])->toolSetValue( val[0] ); if ( val[1] != ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[1])->toolSetValue( val[1] ); if ( val[2] != ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[2])->toolSetValue( val[2] ); } } /////////////////////////////////////////////////////////////////////////////// // // Class: SoXtAmbientColorMultiSlider // /////////////////////////////////////////////////////////////////////////////// SoXtAmbientColorMultiSlider::SoXtAmbientColorMultiSlider( Widget parent, const char *name, SbBool buildInsideParent) : SoXtMultiSlider( parent, name, buildInsideParent, FALSE) // tell parent not to build just yet { _numSubComponents = 3; _subComponentArray = new ( SoXtSliderSetBase * [_numSubComponents] ); Widget form = buildForm(getParentWidget()); _subComponentArray[0] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); _subComponentArray[1] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); _subComponentArray[2] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); for( int i = 0; i < _numSubComponents; i++ ) ((SoXtSliderTool *)_subComponentArray[i])->setMultiSlider( this ); SoXtMultiSlider::buildWidget(form); setBaseWidget(form); } SoXtAmbientColorMultiSlider::~SoXtAmbientColorMultiSlider() {} SbBool SoXtAmbientColorMultiSlider::validNodeType(SoNode *node) { return (node->isOfType(SoMaterial::getClassTypeId())); } void SoXtAmbientColorMultiSlider::exportValuesToInventor() { float xX, xY, xZ; const SbVec3f *soColor; if ( _editNode ) { // get values from x-windows sliders xX = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue(); xY = ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue(); xZ = ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue(); // get values from inventor soColor = ((SoMaterial *)_editNode)->ambientColor.getValues( 0 ); // copy into node if necessary if (soColor[0][0] != xX || soColor[0][1] != xY || soColor[0][2] != xZ) { ((SoMaterial *)_editNode)->ambientColor.setValue( xX, xY, xZ ); ((SoMaterial *)_editNode)->ambientColor.setIgnored(FALSE); } } } void SoXtAmbientColorMultiSlider::importValuesFromInventor() { const SbVec3f *soColor; if ( _editNode ) { // get values from inventor soColor = ((SoMaterial *)_editNode)->ambientColor.getValues( 0 ); // set values if necessary if ( soColor[0][0] != ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[0])->toolSetValue( soColor[0][0] ); if ( soColor[0][1] != ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[1])->toolSetValue( soColor[0][1] ); if ( soColor[0][2] != ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[2])->toolSetValue( soColor[0][2] ); } } /////////////////////////////////////////////////////////////////////////////// // // Class: SoXtDiffuseColorMultiSlider // /////////////////////////////////////////////////////////////////////////////// SoXtDiffuseColorMultiSlider::SoXtDiffuseColorMultiSlider( Widget parent, const char *name, SbBool buildInsideParent) : SoXtMultiSlider( parent, name, buildInsideParent, FALSE) // tell parent not to build just yet { _numSubComponents = 3; _subComponentArray = new ( SoXtSliderSetBase * [_numSubComponents] ); Widget form = buildForm(getParentWidget()); _subComponentArray[0] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); _subComponentArray[1] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); _subComponentArray[2] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); for( int i = 0; i < _numSubComponents; i++ ) ((SoXtSliderTool *)_subComponentArray[i])->setMultiSlider( this ); SoXtMultiSlider::buildWidget(form); setBaseWidget(form); } SoXtDiffuseColorMultiSlider::~SoXtDiffuseColorMultiSlider() {} SbBool SoXtDiffuseColorMultiSlider::validNodeType(SoNode *node) { return (node->isOfType(SoMaterial::getClassTypeId())); } void SoXtDiffuseColorMultiSlider::exportValuesToInventor() { float xX, xY, xZ; const SbVec3f *soColor; if ( _editNode ) { // get values from x-windows sliders xX = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue(); xY = ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue(); xZ = ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue(); // get values from inventor soColor = ((SoMaterial *)_editNode)->diffuseColor.getValues( 0 ); // copy into node if necessary if (soColor[0][0] != xX || soColor[0][1] != xY || soColor[0][2] != xZ) { ((SoMaterial *)_editNode)->diffuseColor.setValue( xX, xY, xZ ); ((SoMaterial *)_editNode)->diffuseColor.setIgnored(FALSE); } } } void SoXtDiffuseColorMultiSlider::importValuesFromInventor() { const SbVec3f *soColor; if ( _editNode ) { // get values from inventor soColor = ((SoMaterial *)_editNode)->diffuseColor.getValues( 0 ); // set values if necessary if ( soColor[0][0] != ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[0])->toolSetValue( soColor[0][0] ); if ( soColor[0][1] != ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[1])->toolSetValue( soColor[0][1] ); if ( soColor[0][2] != ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[2])->toolSetValue( soColor[0][2] ); } } /////////////////////////////////////////////////////////////////////////////// // // Class: SoXtSpecularColorMultiSlider // /////////////////////////////////////////////////////////////////////////////// SoXtSpecularColorMultiSlider::SoXtSpecularColorMultiSlider( Widget parent, const char *name, SbBool buildInsideParent) : SoXtMultiSlider( parent, name, buildInsideParent, FALSE) // tell parent not to build just yet { _numSubComponents = 3; _subComponentArray = new ( SoXtSliderSetBase * [_numSubComponents] ); Widget form = buildForm(getParentWidget()); _subComponentArray[0] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); _subComponentArray[1] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); _subComponentArray[2] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); for( int i = 0; i < _numSubComponents; i++ ) ((SoXtSliderTool *)_subComponentArray[i])->setMultiSlider( this ); SoXtMultiSlider::buildWidget(form); setBaseWidget(form); } SoXtSpecularColorMultiSlider::~SoXtSpecularColorMultiSlider() {} SbBool SoXtSpecularColorMultiSlider::validNodeType(SoNode *node) { return (node->isOfType(SoMaterial::getClassTypeId())); } void SoXtSpecularColorMultiSlider::exportValuesToInventor() { float xX, xY, xZ; const SbVec3f *soColor; if ( _editNode ) { // get values from x-windows sliders xX = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue(); xY = ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue(); xZ = ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue(); // get values from inventor soColor = ((SoMaterial *)_editNode)->specularColor.getValues( 0 ); if (soColor[0][0] != xX || soColor[0][1] != xY || soColor[0][2] != xZ) { ((SoMaterial *)_editNode)->specularColor.setValue( xX, xY, xZ ); ((SoMaterial *)_editNode)->specularColor.setIgnored(FALSE); } } } void SoXtSpecularColorMultiSlider::importValuesFromInventor() { const SbVec3f *soColor; if ( _editNode ) { // get values from inventor soColor = ((SoMaterial *)_editNode)->specularColor.getValues( 0 ); // set values if necessary if ( soColor[0][0] != ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[0])->toolSetValue( soColor[0][0] ); if ( soColor[0][1] != ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[1])->toolSetValue( soColor[0][1] ); if ( soColor[0][2] != ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[2])->toolSetValue( soColor[0][2] ); } } /////////////////////////////////////////////////////////////////////////////// // // Class: SoXtEmissiveColorMultiSlider // /////////////////////////////////////////////////////////////////////////////// SoXtEmissiveColorMultiSlider::SoXtEmissiveColorMultiSlider( Widget parent, const char *name, SbBool buildInsideParent) : SoXtMultiSlider( parent, name, buildInsideParent, FALSE) // tell parent not to build just yet { _numSubComponents = 3; _subComponentArray = new ( SoXtSliderSetBase * [_numSubComponents] ); Widget form = buildForm(getParentWidget()); _subComponentArray[0] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); _subComponentArray[1] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); _subComponentArray[2] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); for( int i = 0; i < _numSubComponents; i++ ) ((SoXtSliderTool *)_subComponentArray[i])->setMultiSlider( this ); SoXtMultiSlider::buildWidget(form); setBaseWidget(form); } SoXtEmissiveColorMultiSlider::~SoXtEmissiveColorMultiSlider() {} SbBool SoXtEmissiveColorMultiSlider::validNodeType(SoNode *node) { return (node->isOfType(SoMaterial::getClassTypeId())); } void SoXtEmissiveColorMultiSlider::exportValuesToInventor() { float xX, xY, xZ; const SbVec3f *soColor; if ( _editNode ) { // get values from x-windows sliders xX = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue(); xY = ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue(); xZ = ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue(); // get values from inventor soColor = ((SoMaterial *)_editNode)->emissiveColor.getValues( 0 ); if (soColor[0][0] != xX || soColor[0][1] != xY || soColor[0][2] != xZ) { ((SoMaterial *)_editNode)->emissiveColor.setValue( xX, xY, xZ ); ((SoMaterial *)_editNode)->emissiveColor.setIgnored(FALSE); } } } void SoXtEmissiveColorMultiSlider::importValuesFromInventor() { const SbVec3f *soColor; if ( _editNode ) { // get values from inventor soColor = ((SoMaterial *)_editNode)->emissiveColor.getValues( 0 ); // set values if necessary if ( soColor[0][0] != ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[0])->toolSetValue( soColor[0][0] ); if ( soColor[0][1] != ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[1])->toolSetValue( soColor[0][1] ); if ( soColor[0][2] != ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[2])->toolSetValue( soColor[0][2] ); } } /////////////////////////////////////////////////////////////////////////////// // // Class: SoXtShininessMultiSlider // /////////////////////////////////////////////////////////////////////////////// SoXtShininessMultiSlider::SoXtShininessMultiSlider( Widget parent, const char *name, SbBool buildInsideParent) : SoXtMultiSlider( parent, name, buildInsideParent, FALSE) // tell parent not to build just yet { _numSubComponents = 1; _subComponentArray = new ( SoXtSliderSetBase * [_numSubComponents] ); Widget form = buildForm(getParentWidget()); _subComponentArray[0] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); for( int i = 0; i < _numSubComponents; i++ ) ((SoXtSliderTool *)_subComponentArray[i])->setMultiSlider( this ); SoXtMultiSlider::buildWidget(form); setBaseWidget(form); } SoXtShininessMultiSlider::~SoXtShininessMultiSlider() {} SbBool SoXtShininessMultiSlider::validNodeType(SoNode *node) { return (node->isOfType(SoMaterial::getClassTypeId())); } void SoXtShininessMultiSlider::exportValuesToInventor() { float xVal; const float *soShininess; if ( _editNode ) { // get values from x-windows sliders xVal = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue(); // get values from inventor soShininess = ((SoMaterial *)_editNode)->shininess.getValues( 0 ); if (soShininess[0] != xVal ) { ((SoMaterial *)_editNode)->shininess.setValue( xVal ); ((SoMaterial *)_editNode)->shininess.setIgnored(FALSE); } } } void SoXtShininessMultiSlider::importValuesFromInventor() { const float *soShininess; if ( _editNode ) { // get values from inventor soShininess = ((SoMaterial *)_editNode)->shininess.getValues( 0 ); // set values if necessary if ( soShininess[0] != ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[0])->toolSetValue( soShininess[0] ); } } /////////////////////////////////////////////////////////////////////////////// // // Class: SoXtTransparencyMultiSlider // /////////////////////////////////////////////////////////////////////////////// SoXtTransparencyMultiSlider::SoXtTransparencyMultiSlider( Widget parent, const char *name, SbBool buildInsideParent) : SoXtMultiSlider( parent, name, buildInsideParent, FALSE) // tell parent not to build just yet { _numSubComponents = 1; _subComponentArray = new ( SoXtSliderSetBase * [_numSubComponents] ); Widget form = buildForm(getParentWidget()); _subComponentArray[0] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); for( int i = 0; i < _numSubComponents; i++ ) ((SoXtSliderTool *)_subComponentArray[i])->setMultiSlider( this ); SoXtMultiSlider::buildWidget(form); setBaseWidget(form); } SoXtTransparencyMultiSlider::~SoXtTransparencyMultiSlider() {} SbBool SoXtTransparencyMultiSlider::validNodeType(SoNode *node) { return (node->isOfType(SoMaterial::getClassTypeId())); } void SoXtTransparencyMultiSlider::exportValuesToInventor() { float xVal; const float *soTransparency; if ( _editNode ) { // get values from x-windows sliders xVal = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue(); // get values from inventor soTransparency = ((SoMaterial *)_editNode)->transparency.getValues( 0 ); if (soTransparency[0] != xVal ) { ((SoMaterial *)_editNode)->transparency.setValue( xVal ); ((SoMaterial *)_editNode)->transparency.setIgnored(FALSE); } } } void SoXtTransparencyMultiSlider::importValuesFromInventor() { const float *soTransparency; if ( _editNode ) { // get values from inventor soTransparency = ((SoMaterial *)_editNode)->transparency.getValues( 0 ); // set values if necessary if ( soTransparency[0] != ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[0])->toolSetValue( soTransparency[0] ); } } /////////////////////////////////////////////////////////////////////////////// // // Class: SoXtLightIntensityMultiSlider // /////////////////////////////////////////////////////////////////////////////// SoXtLightIntensityMultiSlider::SoXtLightIntensityMultiSlider( Widget parent, const char *name, SbBool buildInsideParent) : SoXtMultiSlider( parent, name, buildInsideParent, FALSE) // tell parent not to build just yet { _numSubComponents = 1; _subComponentArray = new ( SoXtSliderSetBase * [_numSubComponents] ); Widget form = buildForm(getParentWidget()); _subComponentArray[0] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); for( int i = 0; i < _numSubComponents; i++ ) ((SoXtSliderTool *)_subComponentArray[i])->setMultiSlider( this ); SoXtMultiSlider::buildWidget(form); setBaseWidget(form); } SoXtLightIntensityMultiSlider::~SoXtLightIntensityMultiSlider() {} SbBool SoXtLightIntensityMultiSlider::validNodeType(SoNode *node) { return (node->isOfType(SoLight::getClassTypeId())); } void SoXtLightIntensityMultiSlider::exportValuesToInventor() { float xVal; float soIntensity; if ( _editNode ) { // get values from x-windows sliders xVal = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue(); // get values from inventor soIntensity = ((SoLight *)_editNode)->intensity.getValue(); if (soIntensity != xVal ) { ((SoLight *)_editNode)->intensity.setValue( xVal ); } } } void SoXtLightIntensityMultiSlider::importValuesFromInventor() { float soIntensity; if ( _editNode ) { // get values from inventor soIntensity = ((SoLight *)_editNode)->intensity.getValue(); // set values if necessary if ( soIntensity != ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[0])->toolSetValue( soIntensity ); } } /////////////////////////////////////////////////////////////////////////////// // // Class: SoXtLightColorMultiSlider // /////////////////////////////////////////////////////////////////////////////// SoXtLightColorMultiSlider::SoXtLightColorMultiSlider( Widget parent, const char *name, SbBool buildInsideParent) : SoXtMultiSlider( parent, name, buildInsideParent, FALSE) // tell parent not to build just yet { _numSubComponents = 3; _subComponentArray = new ( SoXtSliderSetBase * [_numSubComponents] ); Widget form = buildForm(getParentWidget()); _subComponentArray[0] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); _subComponentArray[1] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); _subComponentArray[2] = new SoXtSliderTool( form, NULL, TRUE, SO_UNIT_SLIDER_MINIMUM, SO_UNIT_SLIDER_MAXIMUM ); for( int i = 0; i < _numSubComponents; i++ ) ((SoXtSliderTool *)_subComponentArray[i])->setMultiSlider( this ); SoXtMultiSlider::buildWidget(form); setBaseWidget(form); } SoXtLightColorMultiSlider::~SoXtLightColorMultiSlider() {} SbBool SoXtLightColorMultiSlider::validNodeType(SoNode *node) { return (node->isOfType(SoLight::getClassTypeId())); } void SoXtLightColorMultiSlider::exportValuesToInventor() { float xX, xY, xZ; SbColor soColor; if ( _editNode ) { // get values from x-windows sliders xX = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue(); xY = ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue(); xZ = ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue(); // get values from inventor soColor = ((SoLight *)_editNode)->color.getValue(); // copy into node if necessary if (soColor[0] != xX || soColor[1] != xY || soColor[2] != xZ) { ((SoLight *)_editNode)->color.setValue( xX, xY, xZ ); } } } void SoXtLightColorMultiSlider::importValuesFromInventor() { SbColor soColor; if ( _editNode ) { // get values from inventor soColor = ((SoLight *)_editNode)->color.getValue(); // set values if necessary if ( soColor[0] != ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[0])->toolSetValue( soColor[0] ); if ( soColor[1] != ((SoXtSliderTool *) _subComponentArray[1])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[1])->toolSetValue( soColor[1] ); if ( soColor[2] != ((SoXtSliderTool *) _subComponentArray[2])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[2])->toolSetValue( soColor[2] ); } } /////////////////////////////////////////////////////////////////////////////// // // Class: SoXtFovMultiSlider // /////////////////////////////////////////////////////////////////////////////// SoXtFovMultiSlider::SoXtFovMultiSlider( Widget parent, const char *name, SbBool buildInsideParent) : SoXtMultiSlider( parent, name, buildInsideParent, FALSE) // tell parent not to build just yet { _numSubComponents = 1; _subComponentArray = new ( SoXtSliderSetBase * [_numSubComponents] ); Widget form = buildForm(getParentWidget()); _subComponentArray[0] = new SoXtSliderTool( form, NULL, TRUE, SO_FOV_SLIDER_MINIMUM, SO_FOV_SLIDER_MAXIMUM ); for( int i = 0; i < _numSubComponents; i++ ) ((SoXtSliderTool *)_subComponentArray[i])->setMultiSlider( this ); SoXtMultiSlider::buildWidget(form); setBaseWidget(form); } SoXtFovMultiSlider::~SoXtFovMultiSlider() {} SbBool SoXtFovMultiSlider::validNodeType(SoNode *node) { return (node->isOfType(SoCamera::getClassTypeId())); } void SoXtFovMultiSlider::exportValuesToInventor() { float xFov; float soFov; if ( _editNode ) { // get value from x-windows sliders xFov = ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue() * DEGREES_TO_RADIANS; // get values from inventor if ( _editNode->isOfType(SoPerspectiveCamera::getClassTypeId()) ) soFov = ((SoPerspectiveCamera *)_editNode)->heightAngle.getValue(); else soFov = ((SoOrthographicCamera *)_editNode)->height.getValue(); // copy into node if necessary if (soFov != xFov ) { if (_editNode->isOfType(SoPerspectiveCamera::getClassTypeId())) ((SoPerspectiveCamera *)_editNode)->heightAngle.setValue( xFov ); else ((SoOrthographicCamera *)_editNode)->height.setValue( xFov ); } } } void SoXtFovMultiSlider::importValuesFromInventor() { float soFov; if ( _editNode ) { // get values from inventor if (_editNode->isOfType(SoPerspectiveCamera::getClassTypeId())) soFov = ((SoPerspectiveCamera *)_editNode)->heightAngle.getValue() * RADIANS_TO_DEGREES; else soFov = ((SoOrthographicCamera *)_editNode)->height.getValue(); // set values if necessary if (soFov != ((SoXtSliderTool *) _subComponentArray[0])->getSliderValue()) ((SoXtSliderTool *) _subComponentArray[0])->toolSetValue( soFov ); } }