6363#include " IECoreAppleseed/private/LogTarget.h"
6464#include " IECoreAppleseed/private/BatchPrimitiveConverter.h"
6565#include " IECoreAppleseed/private/InteractivePrimitiveConverter.h"
66+ #include " IECoreAppleseed/private/RendererController.h"
6667#include " IECoreAppleseed/ToAppleseedCameraConverter.h"
6768
6869using namespace IECore ;
@@ -92,11 +93,15 @@ IECoreAppleseed::RendererImplementation::RendererImplementation()
9293
9394 m_primitiveConverter.reset ( new InteractivePrimitiveConverter ( m_project->search_paths () ) );
9495 m_motionHandler.reset ( new MotionBlockHandler ( m_transformStack, *m_primitiveConverter ) );
95- m_editHandler.reset ( new EditBlockHandler ( *m_project ) );
9696}
9797
9898IECoreAppleseed::RendererImplementation::RendererImplementation ( const string &fileName )
9999{
100+ if ( fileName.empty () )
101+ {
102+ msg ( MessageHandler::Error, " IECoreAppleseed::RendererImplementation::RendererImplementation" , " Empty project filename" );
103+ }
104+
100105 m_fileName = fileName;
101106 m_projectPath = filesystem::path ( fileName ).parent_path ();
102107
@@ -233,10 +238,7 @@ void IECoreAppleseed::RendererImplementation::setOption( const string &name, Con
233238
234239 // if the number of passes is greater than one, we need to
235240 // switch the shading result framebuffer in the final rendering config.
236- if ( !isInteractive () )
237- {
238- m_project->configurations ().get_by_name ( " final" )->get_parameters ().insert ( " shading_result_framebuffer" , numPasses > 1 ? " permanent" : " ephemeral" );
239- }
241+ m_project->configurations ().get_by_name ( " final" )->get_parameters ().insert ( " shading_result_framebuffer" , numPasses > 1 ? " permanent" : " ephemeral" );
240242
241243 // enable decorrelate pixels if the number of render passes is greater than one.
242244 m_project->configurations ().get_by_name ( " final" )->get_parameters ().insert_path ( " uniform_pixel_renderer.decorrelate_pixels" , numPasses > 1 ? " true" : " false" );
@@ -284,7 +286,21 @@ void IECoreAppleseed::RendererImplementation::setOption( const string &name, Con
284286 }
285287 else if ( name == " editable" )
286288 {
287- // ignore
289+ if ( const BoolData *editableData = runTimeCast<const BoolData>( value.get () ) )
290+ {
291+ if ( editableData->readable () )
292+ {
293+ m_editHandler.reset ( new EditBlockHandler ( *m_project ) );
294+ }
295+ else
296+ {
297+ m_editHandler.reset ();
298+ }
299+ }
300+ else
301+ {
302+ msg ( Msg::Error, " IECoreAppleseed::RendererImplementation::setOption" , " editable option expects an BoolData value." );
303+ }
288304 }
289305 else
290306 {
@@ -449,14 +465,23 @@ void IECoreAppleseed::RendererImplementation::worldEnd()
449465 asf::auto_release_ptr<asr::AssemblyInstance> assemblyInstance = asr::AssemblyInstanceFactory::create ( " assembly_inst" , asr::ParamArray (), " assembly" );
450466 m_project->get_scene ()->assembly_instances ().insert ( assemblyInstance );
451467
452- if ( isInteractive () )
468+ // render or export the project
469+ if ( isEditable () )
453470 {
454471 m_editHandler->startRendering ();
455472 }
456- else
473+ else if ( isProjectGen () )
457474 {
458475 asr::ProjectFileWriter::write ( *m_project, m_fileName.c_str (), asr::ProjectFileWriter::OmitBringingAssets | asr::ProjectFileWriter::OmitWritingGeometryFiles );
459476 }
477+ else
478+ {
479+ // interactive non-editable render.
480+ RendererController rendererController;
481+ asr::Configuration *cfg = m_project->configurations ().get_by_name ( " final" );
482+ asr::MasterRenderer renderer ( *m_project, cfg->get_parameters (), &rendererController);
483+ renderer.render ();
484+ }
460485}
461486
462487// ///////////////////////////////////////////////////////////////////////////////////////
@@ -787,7 +812,7 @@ DataPtr IECoreAppleseed::RendererImplementation::command( const string &name, co
787812
788813void IECoreAppleseed::RendererImplementation::editBegin ( const string &editType, const CompoundDataMap ¶meters )
789814{
790- if ( isInteractive () )
815+ if ( isEditable () )
791816 {
792817 m_transformStack.clear ();
793818
@@ -813,7 +838,7 @@ void IECoreAppleseed::RendererImplementation::editBegin( const string &editType,
813838
814839void IECoreAppleseed::RendererImplementation::editEnd ()
815840{
816- if ( isInteractive () )
841+ if ( isEditable () )
817842 {
818843 m_editHandler->editEnd ();
819844 }
@@ -827,9 +852,14 @@ void IECoreAppleseed::RendererImplementation::editEnd()
827852// private
828853// ///////////////////////////////////////////////////////////////////////////////////////
829854
830- bool IECoreAppleseed::RendererImplementation::isInteractive () const
855+ bool IECoreAppleseed::RendererImplementation::isProjectGen () const
856+ {
857+ return !m_fileName.empty ();
858+ }
859+
860+ bool IECoreAppleseed::RendererImplementation::isEditable () const
831861{
832- return m_fileName. empty ();
862+ return m_editHandler. get ();
833863}
834864
835865void IECoreAppleseed::RendererImplementation::setCamera ( const string &name, CameraPtr cortexCamera,
0 commit comments