/* * * 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/ * */ /* | Classes: | NoodleTextureGizmo is a component for editing textures of a noodle. | | Author(s) : Paul Isaacs | */ #include #include #include #include #include #include #include "GeneralizedCylinder.h" #include "NoodleTextureGizmo.h" #include "NoodleSlider.h" NoodleTextureGizmo::NoodleTextureGizmo( Widget parent, const char *name, SbBool buildInsideParent) : SoXtComponent( parent, name, buildInsideParent) { // Build the widget! Widget w = buildWidget( getParentWidget() ); setBaseWidget(w); myNoodle = NULL; } NoodleTextureGizmo::~NoodleTextureGizmo() { } Widget NoodleTextureGizmo::buildWidget( Widget parent ) { Arg resources[20]; int n = 0; SbVec2s sliderSize; _rowCol = XtCreateManagedWidget(getWidgetName(),xmRowColumnWidgetClass, parent,NULL, 0); #define STRING(a) XmStringCreate(a,XmSTRING_DEFAULT_CHARSET) // Texture on/off Toggle Button XtSetArg(resources[n], XmNlabelString, STRING("TextureOnOff")); ++n; textureToggle = XmCreateToggleButtonGadget(_rowCol, "textureOnOff", resources, n); n = 0; XtAddCallback(textureToggle, XmNvalueChangedCallback, NoodleTextureGizmo::textureToggleCallback, (XtPointer)this); XtManageChild(textureToggle); // Texture repeat in X-direction. // Label... XtSetArg(resources[n], XmNlabelString, STRING("X repeat:")); ++n; Widget xRepeatLabel = XmCreateLabelGadget(_rowCol, "X repeat", resources, n); n = 0; XtManageChild(xRepeatLabel); // Slider... xRepeatSlider = new NoodleSlider(_rowCol); xRepeatSlider->addValueChangedCallback( NoodleTextureGizmo::xRepeatCallback, this ); sliderSize = xRepeatSlider->getSize(); xRepeatSlider->setSize( SbVec2s( 200, sliderSize[1] ) ); xRepeatSlider->setValue(1.0); xRepeatSlider->setMin(0.0); xRepeatSlider->setMax(30.0); xRepeatSlider->show(); // Texture repeat in Y-direction. // Label... XtSetArg(resources[n], XmNlabelString, STRING("Y repeat:")); ++n; Widget yRepeatLabel = XmCreateLabelGadget(_rowCol, "Y repeat", resources, n); n = 0; XtManageChild(yRepeatLabel); // Slider... yRepeatSlider = new NoodleSlider(_rowCol); yRepeatSlider->addValueChangedCallback( NoodleTextureGizmo::yRepeatCallback, this ); sliderSize = yRepeatSlider->getSize(); yRepeatSlider->setSize( SbVec2s( 200, sliderSize[1] ) ); yRepeatSlider->setValue(1.0); yRepeatSlider->setMin(0.0); yRepeatSlider->setMax(30.0); yRepeatSlider->show(); // Texture translate in X-direction. // Label... XtSetArg(resources[n], XmNlabelString, STRING("X transl:")); ++n; Widget xTranslLabel = XmCreateLabelGadget(_rowCol, "X transl", resources, n); n = 0; XtManageChild(xTranslLabel); // Slider... xTranslSlider = new NoodleSlider(_rowCol); xTranslSlider->addValueChangedCallback( NoodleTextureGizmo::xTranslCallback, this ); sliderSize = xTranslSlider->getSize(); xTranslSlider->setSize( SbVec2s( 200, sliderSize[1] ) ); xTranslSlider->setValue(0.0); xTranslSlider->setMin(-1.0); xTranslSlider->setMax(1.0); xTranslSlider->show(); // Texture translate in Y-direction. // Label... XtSetArg(resources[n], XmNlabelString, STRING("Y transl:")); ++n; Widget yTranslLabel = XmCreateLabelGadget(_rowCol, "Y transl", resources, n); n = 0; XtManageChild(yTranslLabel); // Slider... yTranslSlider = new NoodleSlider(_rowCol); yTranslSlider->addValueChangedCallback( NoodleTextureGizmo::yTranslCallback, this ); sliderSize = yTranslSlider->getSize(); yTranslSlider->setSize( SbVec2s( 200, sliderSize[1] ) ); yTranslSlider->setValue(0.0); yTranslSlider->setMin(-1.0); yTranslSlider->setMax(1.0); yTranslSlider->show(); // Texture rotation angle. // Label... XtSetArg(resources[n], XmNlabelString, STRING("Rotation:")); ++n; Widget texRotationLabel = XmCreateLabelGadget(_rowCol, "Rotation", resources, n); n = 0; XtManageChild(texRotationLabel); // Slider... texRotationSlider = new NoodleSlider(_rowCol); texRotationSlider->addValueChangedCallback(NoodleTextureGizmo::texRotationCallback, this); sliderSize = texRotationSlider->getSize(); texRotationSlider->setSize( SbVec2s( 200, sliderSize[1] ) ); texRotationSlider->setValue(0.0); texRotationSlider->setMin(0.0); texRotationSlider->setMax(6.28); texRotationSlider->show(); return _rowCol; } void NoodleTextureGizmo::setNoodle( GeneralizedCylinder *newNoodle ) { myNoodle = newNoodle; // Set the values in the widgets to reflect values in the noodle. SbBool bv = (newNoodle) ? newNoodle->withTextureCoords.getValue() : FALSE; XmToggleButtonSetState(textureToggle, bv, FALSE); if (newNoodle) { SoTexture2Transform *txXf = SO_GET_PART(newNoodle, "texture2Transform", SoTexture2Transform ); xTranslSlider->setValue( txXf->translation.getValue()[0]); yTranslSlider->setValue( txXf->translation.getValue()[1]); xRepeatSlider->setValue( txXf->scaleFactor.getValue()[0] ); yRepeatSlider->setValue( txXf->scaleFactor.getValue()[1] ); texRotationSlider->setValue( txXf->rotation.getValue() ); } else { xTranslSlider->setValue( 0 ); yTranslSlider->setValue( 0 ); xRepeatSlider->setValue( 1 ); yRepeatSlider->setValue( 1 ); texRotationSlider->setValue( 0 ); } } // // Callback for the texture on/off toggle buttons // void NoodleTextureGizmo::textureToggleCallback(Widget w, XtPointer data, XtPointer) { SbBool test = XmToggleButtonGetState( w ); NoodleTextureGizmo *myself = (NoodleTextureGizmo *) data; if ( myself->myNoodle != NULL ) myself->myNoodle->withTextureCoords = test; } // // Texture parameter callbacks // void NoodleTextureGizmo::xTranslCallback(void *userData, void *) { NoodleTextureGizmo *myself = (NoodleTextureGizmo *) userData; float newVal = myself->xTranslSlider->getValue(); if ( myself->myNoodle != NULL ) { SoTexture2Transform *txXf = SO_GET_PART( myself->myNoodle, "texture2Transform", SoTexture2Transform ); SbVec2f old = txXf->translation.getValue(); old[0] = newVal; txXf->translation = old; } } void NoodleTextureGizmo::yTranslCallback(void *userData, void *) { NoodleTextureGizmo *myself = (NoodleTextureGizmo *) userData; float newVal = myself->yTranslSlider->getValue(); if ( myself->myNoodle != NULL ) { SoTexture2Transform *txXf = SO_GET_PART( myself->myNoodle, "texture2Transform", SoTexture2Transform ); SbVec2f old = txXf->translation.getValue(); old[1] = newVal; txXf->translation = old; } } void NoodleTextureGizmo::xRepeatCallback(void *userData, void *) { NoodleTextureGizmo *myself = (NoodleTextureGizmo *) userData; float newVal = myself->xRepeatSlider->getValue(); if ( myself->myNoodle != NULL ) { SoTexture2Transform *txXf = SO_GET_PART( myself->myNoodle, "texture2Transform", SoTexture2Transform ); SbVec2f old = txXf->scaleFactor.getValue(); old[0] = newVal; txXf->scaleFactor = old; } } void NoodleTextureGizmo::yRepeatCallback(void *userData, void *) { NoodleTextureGizmo *myself = (NoodleTextureGizmo *) userData; float newVal = myself->yRepeatSlider->getValue(); if ( myself->myNoodle != NULL ) { SoTexture2Transform *txXf = SO_GET_PART( myself->myNoodle, "texture2Transform", SoTexture2Transform ); SbVec2f old = txXf->scaleFactor.getValue(); old[1] = newVal; txXf->scaleFactor = old; } } void NoodleTextureGizmo::texRotationCallback(void *userData, void *) { NoodleTextureGizmo *myself = (NoodleTextureGizmo *) userData; float newVal = myself->texRotationSlider->getValue(); if ( myself->myNoodle != NULL ) { SoTexture2Transform *txXf = SO_GET_PART( myself->myNoodle, "texture2Transform", SoTexture2Transform ); txXf->rotation = newVal; } }