distributed rendering
Christoph Fabianek <[email protected]> Sun, 14 Sep 2003 00:19:42 +0200
| Newsgroups | gmane.comp.kde.devel.kpovmodeler |
|---|---|
| Message-ID | <[email protected]> |
Hi, I have written a while ago to the list about implementing a distributed render mode. Now I have the first working version and would like to ask for some advice - it's my first code in C++ and I'm also not very familiar with CVS... Ok, here we go: Attached is the output of 'cvs diff -l > ~/dist_render.patch' in 'kdegraphics/kpovmodeler' - is this the correct way of submitting a patch? What do you think about the patch itself? I'm sure some things are not implemented optimally... (a screenshot of the 'Render Modes' dialog is available at http://fsmat.at/~cfabiane/tmp/render_modes.png ) And the biggest problem I have is with displaying the distributed rendered image in the 'Render Window'. Currently the image is rendered with nspovray which writes the composed result to stdout via 'cat result.tga'. The problem I encounter is that it shows the image bottom up. Any comments are welcome, Christoph PS: The current version of nspovray (http://fsmat.at/~cfabiane/nspovray.html) will not work with this patch - I have to do a new release. If someone want to try the patch let me know and I will send you the current version of nspovray. List archive and information: http://mail.kde.org/mailman/listinfo/kpovmodeler-devel
dist_render.patch
(text/x-diff, 13.5 KB)
Index: pmpovrayrenderwidget.cpp
===================================================================
RCS file: /home/kde/kdegraphics/kpovmodeler/pmpovrayrenderwidget.cpp,v
retrieving revision 1.21
diff -r1.21 pmpovrayrenderwidget.cpp
49a50
> m_pTempPovOutputFile = 0;
95c96,105
< *m_pProcess << s_povrayCommand;
---
> if ( m_renderMode.distributed( ) )
> {
> if( m_renderMode.NetSolve( ) ) {
> m_pProcess->setEnvironment( QString( "NETSOLVE_AGENT" ), m_renderMode.transportConfig( ) );
> m_pProcess->setEnvironment( QString( "PROXY_DIR" ), m_renderMode.nspovrayPath( ) );
> }
> *m_pProcess << QString( "%1/nspovray" ).arg( m_renderMode.nspovrayPath( ) );
> } else {
> *m_pProcess << s_povrayCommand;
> }
110c120
< *m_pProcess << QString( "+I" ) + m_pTempFile->name( ) << "+O-" << "+FT"
---
> *m_pProcess << QString( "+I" ) + m_pTempFile->name( ) << "+FT"
112a123,132
> if ( m_renderMode.distributed() )
> {
> QStringList args = m_renderMode.commandLineDistributedSwitches( );
> for( it = args.begin( ); it != args.end( ); ++it )
> *m_pProcess << *it;
> m_pTempPovOutputFile = new KTempFile( QString::null, ".tga" );
> *m_pProcess << QString( "+O" ) + m_pTempPovOutputFile->name( );
> } else {
> *m_pProcess << "+O-";
> }
139,141c159,165
< KMessageBox::error( this, i18n( "Couldn't call povray.\n"
< "Please check your installation "
< "or set another povray command." ) );
---
> if ( m_renderMode.distributed() )
> KMessageBox::error( this, i18n( "Couldn't call nspovray.\n"
> "Please check your installation." ) );
> else
> KMessageBox::error( this, i18n( "Couldn't call povray.\n"
> "Please check your installation "
> "or set another povray command." ) );
Index: pmpovrayrenderwidget.h
===================================================================
RCS file: /home/kde/kdegraphics/kpovmodeler/pmpovrayrenderwidget.h,v
retrieving revision 1.10
diff -r1.10 pmpovrayrenderwidget.h
169a170
> KTempFile* m_pTempPovOutputFile;
Index: pmrendermode.cpp
===================================================================
RCS file: /home/kde/kdegraphics/kpovmodeler/pmrendermode.cpp,v
retrieving revision 1.6
diff -r1.6 pmrendermode.cpp
53a54,63
>
> m_distributed = false;
> m_nspovrayPath = QString( "" );
> m_transport = 1;
> m_transportConfig = QString( "" );
> m_instances = 2;
> m_timeout = 60;
> m_tilewidth = 100;
> m_tileheight = 100;
>
77a88,95
> m_distributed = hlp.boolAttribute ("distributed", m_distributed );
> m_nspovrayPath = hlp.stringAttribute( "nspovrayPath", m_nspovrayPath );
> m_transport = hlp.intAttribute( "transport", m_transport );
> m_transportConfig = hlp.stringAttribute( "transportConfig", m_transportConfig );
> m_instances = hlp.intAttribute( "instances", m_instances );
> m_timeout = hlp.intAttribute( "timeout", m_timeout );
> m_tilewidth = hlp.intAttribute( "tilewidth", m_tilewidth );
> m_tileheight = hlp.intAttribute( "tileheight", m_tileheight );
98a117,124
> e.setAttribute( "distributed", m_distributed );
> e.setAttribute( "nspovrayPath", m_nspovrayPath );
> e.setAttribute( "transport", m_transport );
> e.setAttribute( "transportConfig", m_transportConfig );
> e.setAttribute( "instances", m_instances );
> e.setAttribute( "timeout", m_timeout );
> e.setAttribute( "tilewidth", m_tilewidth );
> e.setAttribute( "tileheight", m_tileheight );
157a184,213
> void PMRenderMode::setTransport( int transport )
> {
> if( ( transport >= 0 ) && ( transport <= 1 ) )
> m_transport = transport;
> }
>
> void PMRenderMode::setInstances( int instances )
> {
> if( instances >= 0 )
> m_instances = instances;
> }
>
> void PMRenderMode::setTimeout( int timeout )
> {
> if( timeout >= 0 )
> m_timeout = timeout;
> }
>
> void PMRenderMode::setTilewidth( int tilewidth )
> {
> if( tilewidth >= 0 )
> m_tilewidth = tilewidth;
> }
>
> void PMRenderMode::setTileheight( int tileheight )
> {
> if( tileheight >= 0 )
> m_tileheight = tileheight;
> }
>
177c233
<
---
>
220a277,289
> QStringList PMRenderMode::commandLineDistributedSwitches( ) const
> {
> QStringList cl;
> cl.append( QString( "--dist" ) );
> cl.append( QString( "%1" ).arg( m_instances ) );
>
> cl.append( QString( "--timeout" ) );
> cl.append( QString( "%1" ).arg( m_timeout ) );
>
> cl.append( QString( "--tile" ) );
> cl.append( QString( "%1x%2" ).arg( m_tilewidth, m_tileheight ) );
> return cl;
> }
Index: pmrendermode.h
===================================================================
RCS file: /home/kde/kdegraphics/kpovmodeler/pmrendermode.h,v
retrieving revision 1.6
diff -r1.6 pmrendermode.h
56c56
<
---
>
94,95c94,112
<
<
---
>
> void setDistributed( bool on ) { m_distributed = on; }
> bool distributed( ) const { return m_distributed; }
> void setNspovrayPath( const QString& nspovrayPath ) { m_nspovrayPath = nspovrayPath; }
> QString nspovrayPath( ) const { return m_nspovrayPath; }
> void setTransport( int m_transport );
> int transport( ) const { return m_transport; }
> bool NetSolve( ) const { return (m_transport == 0); }
> void setTransportConfig( const QString& tpconf ) { m_transportConfig = tpconf; }
> QString transportConfig( ) const { return m_transportConfig; }
> void setInstances( int instances );
> int instances( ) const { return m_instances; }
> void setTimeout( int timeout );
> int timeout( ) const { return m_timeout; }
> void setTilewidth( int tilewidth );
> int tilewidth( ) const { return m_tilewidth; }
> void setTileheight( int tileheight );
> int tileheight( ) const { return m_tileheight; }
>
100a118,121
> * Returns the settings as nspovray command line switches
> */
> QStringList commandLineDistributedSwitches( ) const;
> /**
104c125
<
---
>
107c128
<
---
>
112c133
<
---
>
122a144,152
>
> bool m_distributed;
> QString m_nspovrayPath;
> int m_transport;
> QString m_transportConfig;
> int m_instances;
> int m_timeout;
> int m_tilewidth;
> int m_tileheight;
Index: pmrendermodesdialog.cpp
===================================================================
RCS file: /home/kde/kdegraphics/kpovmodeler/pmrendermodesdialog.cpp,v
retrieving revision 1.6
diff -r1.6 pmrendermodesdialog.cpp
32a33
> #include <kiconloader.h>
246c247
< QWidget* page = new QWidget( this );
---
> QWidget* page = new QWidget( this );
361c362,415
<
---
> // distribued rendering options tab
> tab = new QWidget( );
> m_pTabWidget->addTab( tab, i18n( "Distributed rendering" ) );
> tabLayout = new QVBoxLayout( tab, marginHint( ), spacingHint( ) );
>
> m_pDistributedBox = new QCheckBox( i18n( "Use distributed rendering" ), tab );
> tabLayout->addWidget( m_pDistributedBox );
>
> QHBoxLayout* nspovrayPathLayout = new QHBoxLayout( tabLayout );
> QLabel* nspovrayPathLabel = new QLabel( i18n( "nspovray Path:" ), tab );
> nspovrayPathLayout->addWidget( nspovrayPathLabel );
> m_pNspovrayPathEdit = new QLineEdit( tab );
> nspovrayPathLayout->addWidget( m_pNspovrayPathEdit );
> m_pBrowseNspovrayPath = new QPushButton( tab );
> m_pBrowseNspovrayPath->setPixmap( SmallIcon( "fileopen" ) );
> nspovrayPathLayout->addWidget( m_pBrowseNspovrayPath );
>
> QHBoxLayout* distHelpLayout = new QHBoxLayout( tabLayout );
> QGridLayout* distLayout = new QGridLayout( distHelpLayout, 6, 2 );
> distLayout->addWidget( new QLabel( i18n( "Transport:" ), tab ), 0, 0 );
> m_pTransportCombo = new QComboBox( tab );
> distLayout->addWidget( m_pTransportCombo, 0, 1 );
> m_pTransportCombo->insertItem( i18n( "NetSolve" ) );
> m_pTransportCombo->insertItem( i18n( "SSH" ) );
>
> m_pTransportConfigLabel = new QLabel( i18n( "Hostfile:" ), tab );
> distLayout->addWidget( m_pTransportConfigLabel, 1, 0 );
> m_pTransportConfigLineEdit = new QLineEdit( tab );
> distLayout->addWidget( m_pTransportConfigLineEdit, 1, 1 );
>
> distLayout->addWidget( new QLabel( i18n( "Instances:" ), tab ), 2, 0 );
> m_pInstancesEdit = new PMIntEdit( tab );
> m_pInstancesEdit->setValidation( true, 1, false, 0 );
> distLayout->addWidget( m_pInstancesEdit, 2, 1 );
>
> distLayout->addWidget( new QLabel( i18n( "Timeout (sec):" ), tab ), 3, 0 );
> m_pTimeoutEdit = new PMIntEdit( tab );
> m_pTimeoutEdit->setValidation( true, 1, false, 0 );
> distLayout->addWidget( m_pTimeoutEdit, 3, 1 );
>
> distLayout->addWidget( new QLabel( i18n( "Tile width:" ), tab ), 4, 0 );
> m_pTileWidthEdit = new PMIntEdit( tab );
> m_pTileWidthEdit->setValidation( true, 1, false, 0 );
> distLayout->addWidget( m_pTileWidthEdit, 4, 1 );
>
> distLayout->addWidget( new QLabel( i18n( "Tile height:" ), tab ), 5, 0 );
> m_pTileHeightEdit = new PMIntEdit( tab );
> m_pTileHeightEdit->setValidation( true, 1, false, 0 );
> distLayout->addWidget( m_pTileHeightEdit, 5, 1 );
>
> distHelpLayout->addStretch( 1 );
>
> tabLayout->addStretch( 1 );
>
363c417
<
---
>
368c422
<
---
>
386a441,449
> connect( m_pDistributedBox, SIGNAL( toggled( bool ) ), SLOT( slotDistributedToggled( bool ) ) );
> connect( m_pNspovrayPathEdit, SIGNAL( textChanged( const QString& ) ), SLOT( slotTextChanged( const QString& ) ) );
> connect( m_pBrowseNspovrayPath, SIGNAL( clicked( ) ), SLOT( slotBrowseNspovrayPath( ) ) );
> connect( m_pTransportCombo, SIGNAL( activated( int ) ), SLOT( slotTransportChanged( int ) ) );
> connect( m_pTransportConfigLineEdit, SIGNAL( textChanged( const QString& ) ), SLOT( slotTextChanged( const QString& ) ) );
> connect( m_pInstancesEdit, SIGNAL( dataChanged( ) ), SLOT( slotChanged( ) ) );
> connect( m_pTimeoutEdit, SIGNAL( dataChanged( ) ), SLOT( slotChanged( ) ) );
> connect( m_pTileWidthEdit, SIGNAL( dataChanged( ) ), SLOT( slotChanged( ) ) );
> connect( m_pTileHeightEdit, SIGNAL( dataChanged( ) ), SLOT( slotChanged( ) ) );
435a499,506
> m_pMode->setDistributed( m_pDistributedBox->isChecked( ) );
> m_pMode->setNspovrayPath( m_pNspovrayPathEdit->text( ) );
> m_pMode->setTransport( m_pTransportCombo->currentItem( ) );
> m_pMode->setTransportConfig( m_pTransportConfigLineEdit->text( ) );
> m_pMode->setInstances( m_pInstancesEdit->value( ) );
> m_pMode->setTimeout( m_pTimeoutEdit->value( ) );
> m_pMode->setTilewidth( m_pTileWidthEdit->value( ) );
> m_pMode->setTileheight( m_pTileHeightEdit->value( ) );
480c551
<
---
>
492c563
<
---
>
517a589,598
> m_pDistributedBox->setChecked( m_pMode->distributed( ) );
> m_pNspovrayPathEdit->setText( m_pMode->nspovrayPath( ) );
> enableDistributed( m_pMode->distributed( ) );
> m_pTransportCombo->setCurrentItem( m_pMode->transport( ) );
> setTransportConfigLabel( m_pMode->transport( ) );
> m_pTransportConfigLineEdit->setText( m_pMode->transportConfig( ) );
> m_pInstancesEdit->setValue( m_pMode->instances( ) );
> m_pTimeoutEdit->setValue( m_pMode->timeout( ) );
> m_pTileWidthEdit->setValue( m_pMode->tilewidth( ) );
> m_pTileHeightEdit->setValue( m_pMode->tileheight( ) );
541a623,651
> void PMRenderModeDialog::enableDistributed( bool yes )
> {
> m_pNspovrayPathEdit->setEnabled( yes );
> m_pBrowseNspovrayPath->setEnabled( yes );
> m_pTransportCombo->setEnabled( yes );
> m_pTransportConfigLineEdit->setEnabled( yes );
> m_pInstancesEdit->setEnabled( yes );
> m_pTimeoutEdit->setEnabled( yes );
> m_pTileWidthEdit->setEnabled( yes );
> m_pTileHeightEdit->setEnabled( yes );
> }
>
> void PMRenderModeDialog::setTransportConfigLabel( int transport )
> {
> switch( transport )
> {
> case 0:
> m_pTransportConfigLabel->setText( i18n( "Agent:" ) );
> break;
> case 1:
> m_pTransportConfigLabel->setText( i18n( "Hostfile:" ) );
> break;
> default:
> m_pTransportConfigLabel->setText( QString( "" ) );
> break;
> }
>
> }
>
548c658
<
---
>
558c668
<
---
>
603a714,734
> }
>
> void PMRenderModeDialog::slotDistributedToggled( bool on )
> {
> slotChanged( );
> enableDistributed( on );
> }
>
> void PMRenderModeDialog::slotBrowseNspovrayPath( )
> {
> QString str = KFileDialog::getExistingDirectory( );
>
> if( !str.isEmpty( ) )
> m_pNspovrayPathEdit->setText( str );
> }
>
> void PMRenderModeDialog::slotTransportChanged( int item )
> {
> setTransportConfigLabel( item );
> m_pTransportConfigLineEdit->setText( QString( "" ) );
> slotActivated( item );
Index: pmrendermodesdialog.h
===================================================================
RCS file: /home/kde/kdegraphics/kpovmodeler/pmrendermodesdialog.h,v
retrieving revision 1.4
diff -r1.4 pmrendermodesdialog.h
131c131,134
<
---
> void slotDistributedToggled( bool );
> void slotBrowseNspovrayPath( );
> void slotTransportChanged( int );
>
148a152,153
> void enableDistributed( bool yes );
> void setTransportConfigLabel( int transport );
151c156
<
---
>
174c179,190
<
---
> // distributed rendering
> QCheckBox* m_pDistributedBox;
> QLineEdit* m_pNspovrayPathEdit;
> QPushButton* m_pBrowseNspovrayPath;
> QComboBox* m_pTransportCombo;
> QLabel* m_pTransportConfigLabel;
> QLineEdit* m_pTransportConfigLineEdit;
> PMIntEdit* m_pInstancesEdit;
> PMIntEdit* m_pTimeoutEdit;
> PMIntEdit* m_pTileWidthEdit;
> PMIntEdit* m_pTileHeightEdit;
>