diff options
Diffstat (limited to 'kpovmodeler/pmwarpedit.cpp')
-rw-r--r-- | kpovmodeler/pmwarpedit.cpp | 407 |
1 files changed, 407 insertions, 0 deletions
diff --git a/kpovmodeler/pmwarpedit.cpp b/kpovmodeler/pmwarpedit.cpp new file mode 100644 index 00000000..99c620dd --- /dev/null +++ b/kpovmodeler/pmwarpedit.cpp @@ -0,0 +1,407 @@ +/* +************************************************************************** + description + -------------------- + copyright : (C) 2000-2001 by Luis Carvalho + email : lpassos@mail.telepac.pt +************************************************************************** + +************************************************************************** +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +**************************************************************************/ + + +#include "pmwarpedit.h" +#include "pmwarp.h" +#include "pmvectoredit.h" +#include "pmlineedits.h" + +#include <qlayout.h> +#include <qlabel.h> +#include <qcombobox.h> +#include <qcheckbox.h> +#include <klocale.h> +#include <kdialog.h> + + +PMWarpEdit::PMWarpEdit( QWidget* parent, const char* name ) + : Base( parent, name ) +{ + m_pDisplayedObject = 0; +} + +void PMWarpEdit::createTopWidgets( ) +{ + QHBoxLayout* hl; + QVBoxLayout* vl; + QGridLayout* gl; + + Base::createTopWidgets( ); + + QLabel* label = new QLabel( i18n( "Warp type:" ), this ); + m_pWarpTypeEdit = new QComboBox( false, this ); + m_pWarpTypeEdit->insertItem( i18n( "Repeat" ) ); + m_pWarpTypeEdit->insertItem( i18n( "Black Hole" ) ); + m_pWarpTypeEdit->insertItem( i18n( "Turbulence" ) ); + m_pWarpTypeEdit->insertItem( i18n( "Cylindrical" ) ); + m_pWarpTypeEdit->insertItem( i18n( "Spherical" ) ); + m_pWarpTypeEdit->insertItem( i18n( "Toroidal" ) ); + m_pWarpTypeEdit->insertItem( i18n( "Planar" ) ); + hl = new QHBoxLayout( topLayout( ) ); + hl->addWidget( label ); + hl->addWidget( m_pWarpTypeEdit ); + hl->addStretch( 1 ); + + /* Repeat Warp Objects */ + m_pRepeatWidget = new QWidget( this ); + vl = new QVBoxLayout( m_pRepeatWidget, 0, KDialog::spacingHint( ) ); + gl = new QGridLayout( vl, 3, 2 ); + m_pDirectionLabel = new QLabel( i18n( "Direction:" ), m_pRepeatWidget ); + m_pDirectionEdit = new PMVectorEdit( "x", "y", "z", m_pRepeatWidget ); + gl->addWidget( m_pDirectionLabel, 0, 0 ); + gl->addWidget( m_pDirectionEdit, 0, 1 ); + m_pOffsetLabel = new QLabel( i18n( "Offset:" ), m_pRepeatWidget ); + m_pOffsetEdit = new PMVectorEdit( "x", "y", "z", m_pRepeatWidget ); + gl->addWidget( m_pOffsetLabel, 1, 0 ); + gl->addWidget( m_pOffsetEdit, 1, 1 ); + m_pFlipLabel = new QLabel( i18n( "Flip:" ), m_pRepeatWidget ); + m_pFlipEdit = new PMVectorEdit( "x", "y", "z", m_pRepeatWidget ); + gl->addWidget( m_pFlipLabel, 2, 0 ); + gl->addWidget( m_pFlipEdit, 2, 1 ); + + /* Black Hole Warp Objects */ + m_pBlackHoleWidget = new QWidget( this ); + vl = new QVBoxLayout( m_pBlackHoleWidget, 0, KDialog::spacingHint( ) ); + m_pLocationLabel = new QLabel( i18n( "Location:" ), m_pBlackHoleWidget ); + m_pLocationEdit = new PMVectorEdit( "x", "y", "z", m_pBlackHoleWidget ); + hl = new QHBoxLayout( vl ); + hl->addWidget( m_pLocationLabel ); + hl->addWidget( m_pLocationEdit ); + m_pRadiusLabel = new QLabel( i18n( "Radius:" ), m_pBlackHoleWidget ); + m_pRadiusEdit = new PMFloatEdit( m_pBlackHoleWidget ); + m_pStrengthLabel = new QLabel( i18n( "Strength:" ), m_pBlackHoleWidget ); + m_pStrengthEdit = new PMFloatEdit( m_pBlackHoleWidget ); + m_pFalloffLabel = new QLabel( i18n( "Falloff:" ), m_pBlackHoleWidget ); + m_pFalloffEdit = new PMFloatEdit( m_pBlackHoleWidget ); + hl = new QHBoxLayout( vl ); + gl = new QGridLayout( hl, 3, 2 ); + gl->addWidget( m_pRadiusLabel, 0, 0 ); + gl->addWidget( m_pRadiusEdit, 0, 1 ); + gl->addWidget( m_pStrengthLabel, 1, 0 ); + gl->addWidget( m_pStrengthEdit, 1, 1 ); + gl->addWidget( m_pFalloffLabel, 2, 0 ); + gl->addWidget( m_pFalloffEdit, 2, 1 ); + hl->addStretch( 1 ); + + m_pRepeatLabel = new QLabel( i18n( "Repeat:" ), m_pBlackHoleWidget ); + m_pRepeatEdit = new PMVectorEdit( "x", "y", "z", m_pBlackHoleWidget ); + hl = new QHBoxLayout( vl ); + hl->addWidget( m_pRepeatLabel ); + hl->addWidget( m_pRepeatEdit ); + m_pTurbulenceLabel = new QLabel( i18n( "Turbulence:" ), m_pBlackHoleWidget ); + m_pTurbulenceEdit = new PMVectorEdit( "x", "y", "z", m_pBlackHoleWidget ); + hl = new QHBoxLayout( vl ); + hl->addWidget( m_pTurbulenceLabel ); + hl->addWidget( m_pTurbulenceEdit ); + m_pInverseEdit = new QCheckBox( i18n( "Inverse" ), m_pBlackHoleWidget ); + vl->addWidget( m_pInverseEdit ); + + /* Turbulence Warp Objects */ + m_pTurbulenceWidget = new QWidget( this ); + vl = new QVBoxLayout( m_pTurbulenceWidget, 0, KDialog::spacingHint( ) ); + m_pValueVectorLabel = new QLabel( i18n( "Value:" ), m_pTurbulenceWidget ); + m_pValueVectorEdit = new PMVectorEdit( "x", "y", "z", m_pTurbulenceWidget ); + hl = new QHBoxLayout( vl ); + hl->addWidget( m_pValueVectorLabel ); + hl->addWidget( m_pValueVectorEdit ); + + hl = new QHBoxLayout( vl ); + gl = new QGridLayout( hl, 3, 2 ); + m_pOctavesLabel = new QLabel( i18n( "Octaves:" ), m_pTurbulenceWidget ); + m_pOctavesEdit = new PMIntEdit( m_pTurbulenceWidget ); + gl->addWidget( m_pOctavesLabel, 0, 0 ); + gl->addWidget( m_pOctavesEdit, 0, 1 ); + m_pOmegaLabel = new QLabel( i18n( "Omega:" ), m_pTurbulenceWidget ); + m_pOmegaEdit = new PMFloatEdit( m_pTurbulenceWidget ); + gl->addWidget( m_pOmegaLabel, 1, 0 ); + gl->addWidget( m_pOmegaEdit, 1, 1 ); + m_pLambdaLabel = new QLabel( i18n( "Lambda:" ), m_pTurbulenceWidget ); + m_pLambdaEdit = new PMFloatEdit( m_pTurbulenceWidget ); + gl->addWidget( m_pLambdaLabel, 2, 0 ); + gl->addWidget( m_pLambdaEdit, 2, 1 ); + hl->addStretch( 1 ); + + /* Mapping Warp Objects */ + m_pMappingWidget = new QWidget( this ); + vl = new QVBoxLayout( m_pMappingWidget, 0, KDialog::spacingHint( ) ); + label = new QLabel( i18n( "Orientation:" ), m_pMappingWidget ); + m_pOrientationEdit = new PMVectorEdit( "x", "y", "z", m_pMappingWidget ); + hl = new QHBoxLayout( vl ); + hl->addWidget( label ); + hl->addWidget( m_pOrientationEdit ); + + gl = new QGridLayout( vl, 2, 2 ); + label = new QLabel( i18n( "Distance exponent:" ), m_pMappingWidget ); + m_pDistExpEdit = new PMFloatEdit( m_pMappingWidget ); + gl->addWidget( label, 0, 0 ); + gl->addWidget( m_pDistExpEdit, 0, 1 ); + m_pMajorRadiusLabel = new QLabel( i18n( "Major radius:" ), m_pMappingWidget ); + m_pMajorRadiusEdit = new PMFloatEdit( m_pMappingWidget ); + gl->addWidget( m_pMajorRadiusLabel, 1, 0 ); + gl->addWidget( m_pMajorRadiusEdit, 1, 1 ); + + vl = new QVBoxLayout( topLayout( ) ); + vl->addSpacing( 0 ); + vl->addWidget( m_pRepeatWidget ); + vl->addWidget( m_pBlackHoleWidget ); + vl->addWidget( m_pTurbulenceWidget ); + vl->addWidget( m_pMappingWidget ); + + connect( m_pWarpTypeEdit, SIGNAL( activated( int ) ), SLOT( slotComboChanged( int ) ) ); + connect( m_pDirectionEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pOffsetEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pFlipEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pLocationEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pRadiusEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pStrengthEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pFalloffEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pInverseEdit, SIGNAL( clicked( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pRepeatEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pTurbulenceEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pValueVectorEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pOctavesEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pOmegaEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pLambdaEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pOrientationEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pDistExpEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); + connect( m_pMajorRadiusEdit, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) ); +} + +void PMWarpEdit::displayObject( PMObject* o ) +{ + if( o->isA( "Warp" ) ) + { + bool readOnly = o->isReadOnly( ); + m_pDisplayedObject = ( PMWarp* ) o; + + switch( m_pDisplayedObject->warpType( ) ) + { + case PMWarp::Repeat: + m_pWarpTypeEdit->setCurrentItem( 0 ); + slotComboChanged( 0 ); + break; + case PMWarp::BlackHole: + m_pWarpTypeEdit->setCurrentItem( 1 ); + slotComboChanged( 1 ); + break; + case PMWarp::Turbulence: + m_pWarpTypeEdit->setCurrentItem( 2 ); + slotComboChanged( 2 ); + break; + case PMWarp::Cylindrical: + m_pWarpTypeEdit->setCurrentItem( 3 ); + slotComboChanged( 3 ); + break; + case PMWarp::Spherical: + m_pWarpTypeEdit->setCurrentItem( 4 ); + slotComboChanged( 4 ); + break; + case PMWarp::Toroidal: + m_pWarpTypeEdit->setCurrentItem( 5 ); + slotComboChanged( 5 ); + break; + case PMWarp::Planar: + m_pWarpTypeEdit->setCurrentItem( 6 ); + slotComboChanged( 6 ); + break; + } + m_pDirectionEdit->setVector( m_pDisplayedObject->direction( ) ); + m_pDirectionEdit->setReadOnly( readOnly ); + m_pOffsetEdit->setVector( m_pDisplayedObject->offset( ) ); + m_pOffsetEdit->setReadOnly( readOnly ); + m_pFlipEdit->setVector( m_pDisplayedObject->flip( ) ); + m_pFlipEdit->setReadOnly( readOnly ); + m_pLocationEdit->setVector( m_pDisplayedObject->location( ) ); + m_pLocationEdit->setReadOnly( readOnly ); + m_pRadiusEdit->setValue( m_pDisplayedObject->radius( ) ); + m_pRadiusEdit->setReadOnly( readOnly ); + m_pStrengthEdit->setValue( m_pDisplayedObject->strength( ) ); + m_pStrengthEdit->setReadOnly( readOnly ); + m_pFalloffEdit->setValue( m_pDisplayedObject->falloff( ) ); + m_pFalloffEdit->setReadOnly( readOnly ); + m_pInverseEdit->setChecked( m_pDisplayedObject->inverse( ) ); + m_pInverseEdit->setEnabled( !readOnly ); + m_pRepeatEdit->setVector( m_pDisplayedObject->repeat( ) ); + m_pRepeatEdit->setReadOnly( readOnly ); + m_pTurbulenceEdit->setVector( m_pDisplayedObject->turbulence( ) ); + m_pTurbulenceEdit->setReadOnly( readOnly ); + m_pValueVectorEdit->setVector( m_pDisplayedObject->valueVector( ) ); + m_pValueVectorEdit->setReadOnly( readOnly ); + m_pOctavesEdit->setValue( m_pDisplayedObject->octaves( ) ); + m_pOctavesEdit->setReadOnly( readOnly ); + m_pOmegaEdit->setValue( m_pDisplayedObject->omega( ) ); + m_pOmegaEdit->setReadOnly( readOnly ); + m_pLambdaEdit->setValue( m_pDisplayedObject->lambda( ) ); + m_pLambdaEdit->setReadOnly( readOnly ); + m_pOrientationEdit->setVector( m_pDisplayedObject->orientation( ) ); + m_pOrientationEdit->setReadOnly( readOnly ); + m_pDistExpEdit->setValue( m_pDisplayedObject->distExp( ) ); + m_pDistExpEdit->setReadOnly( readOnly ); + m_pMajorRadiusEdit->setValue( m_pDisplayedObject->majorRadius( ) ); + m_pMajorRadiusEdit->setReadOnly( readOnly ); + + Base::displayObject( o ); + } + else + kdError( PMArea ) << "PMWarpEdit: Can't display object\n"; +} + +void PMWarpEdit::saveContents( ) +{ + bool mapping = false; + + if( m_pDisplayedObject ) + { + Base::saveContents( ); + switch( m_pWarpTypeEdit->currentItem( ) ) + { + case 0: + m_pDisplayedObject->setWarpType( PMWarp::Repeat ); + m_pDisplayedObject->setDirection( m_pDirectionEdit->vector( ) ); + m_pDisplayedObject->setOffset( m_pOffsetEdit->vector( ) ); + m_pDisplayedObject->setFlip( m_pOffsetEdit->vector( ) ); + break; + case 1: + m_pDisplayedObject->setWarpType( PMWarp::BlackHole ); + m_pDisplayedObject->setLocation( m_pLocationEdit->vector( ) ); + m_pDisplayedObject->setRadius( m_pRadiusEdit->value( ) ); + m_pDisplayedObject->setStrength( m_pStrengthEdit->value( ) ); + m_pDisplayedObject->setFalloff( m_pFalloffEdit->value( ) ); + m_pDisplayedObject->setInverse( m_pInverseEdit->isChecked( ) ); + m_pDisplayedObject->setRepeat( m_pRepeatEdit->vector( ) ); + m_pDisplayedObject->setTurbulence( m_pTurbulenceEdit->vector( ) ); + break; + case 2: + m_pDisplayedObject->setWarpType( PMWarp::Turbulence ); + m_pDisplayedObject->setValueVector( m_pValueVectorEdit->vector( ) ); + m_pDisplayedObject->setOctaves( m_pOctavesEdit->value( ) ); + m_pDisplayedObject->setOmega( m_pOmegaEdit->value( ) ); + m_pDisplayedObject->setLambda( m_pLambdaEdit->value( ) ); + break; + case 3: + m_pDisplayedObject->setWarpType( PMWarp::Cylindrical ); + mapping = true; + break; + case 4: + m_pDisplayedObject->setWarpType( PMWarp::Spherical ); + mapping = true; + break; + case 5: + m_pDisplayedObject->setWarpType( PMWarp::Toroidal ); + m_pDisplayedObject->setMajorRadius( m_pMajorRadiusEdit->value( ) ); + mapping = true; + break; + case 6: + m_pDisplayedObject->setWarpType( PMWarp::Planar ); + mapping = true; + break; + } + + if( mapping ) + { + m_pDisplayedObject->setOrientation( m_pOrientationEdit->vector( ) ); + m_pDisplayedObject->setDistExp( m_pDistExpEdit->value( ) ); + } + } +} + +bool PMWarpEdit::isDataValid( ) +{ + double x,y,z; + + switch( m_pWarpTypeEdit->currentItem( ) ) + { + case 0: + if( !m_pDirectionEdit->isDataValid( ) || + !m_pOffsetEdit->isDataValid( ) || + !m_pFlipEdit->isDataValid( ) ) + return false; + // The direction vector can only have one non-zero component + x = m_pDirectionEdit->vector( ).x( ); + y = m_pDirectionEdit->vector( ).y( ); + z = m_pDirectionEdit->vector( ).z( ); + if( ( x && ( y || z ) ) || ( y && ( x || z )) || ( z && ( x || y ) ) ) + return false; + break; + case 1: + break; + case 2: + if( !m_pOctavesEdit->isDataValid( ) || + m_pOctavesEdit->value( ) < 1 || + m_pOctavesEdit->value( ) > 10 ) + return false; + break; + case 3: + case 4: + case 5: + case 6: + if( !m_pOrientationEdit->isDataValid( ) || + !m_pDistExpEdit->isDataValid( ) || + !m_pMajorRadiusEdit->isDataValid( ) ) + return false; + break; + } + return Base::isDataValid( ); +} + +void PMWarpEdit::slotComboChanged( int c ) +{ + switch ( c ) + { + case 0: + m_pRepeatWidget->show( ); + m_pBlackHoleWidget->hide( ); + m_pTurbulenceWidget->hide( ); + m_pMappingWidget->hide( ); + break; + case 1: + m_pRepeatWidget->hide( ); + m_pBlackHoleWidget->show( ); + m_pTurbulenceWidget->hide( ); + m_pMappingWidget->hide( ); + break; + case 2: + m_pRepeatWidget->hide( ); + m_pBlackHoleWidget->hide( ); + m_pTurbulenceWidget->show( ); + m_pMappingWidget->hide( ); + break; + case 3: + case 4: + case 6: + m_pRepeatWidget->hide( ); + m_pBlackHoleWidget->hide( ); + m_pTurbulenceWidget->hide( ); + m_pMappingWidget->show( ); + m_pMajorRadiusLabel->hide( ); + m_pMajorRadiusEdit->hide( ); + break; + case 5: + m_pRepeatWidget->hide( ); + m_pBlackHoleWidget->hide( ); + m_pTurbulenceWidget->hide( ); + m_pMappingWidget->show( ); + m_pMajorRadiusLabel->show( ); + m_pMajorRadiusEdit->show( ); + break; + } + emit dataChanged( ); + emit sizeChanged( ); +} + +#include "pmwarpedit.moc" |