Skip to content

Commit 9ee46f2

Browse files
committed
Merge pull request #437 from appleseedhq/IECoreAppleseed
appleseed: added support for interactive non-editable final rendering.
2 parents e45ac17 + d21ac32 commit 9ee46f2

File tree

5 files changed

+117
-41
lines changed

5 files changed

+117
-41
lines changed

contrib/IECoreAppleseed/include/IECoreAppleseed/private/EditBlockHandler.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545

4646
#include "IECore/CompoundData.h"
4747

48+
#include "IECoreAppleseed/private/RendererController.h"
49+
4850
namespace IECoreAppleseed
4951
{
5052

@@ -70,8 +72,6 @@ class EditBlockHandler : boost::noncopyable
7072

7173
private :
7274

73-
class RendererController;
74-
7575
renderer::Project &m_project;
7676
std::auto_ptr<RendererController> m_rendererController;
7777
std::auto_ptr<renderer::MasterRenderer> m_renderer;
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
//////////////////////////////////////////////////////////////////////////
2+
//
3+
// Copyright (c) 2015, Esteban Tovagliari. All rights reserved.
4+
//
5+
// Redistribution and use in source and binary forms, with or without
6+
// modification, are permitted provided that the following conditions are
7+
// met:
8+
//
9+
// * Redistributions of source code must retain the above copyright
10+
// notice, this list of conditions and the following disclaimer.
11+
//
12+
// * Redistributions in binary form must reproduce the above copyright
13+
// notice, this list of conditions and the following disclaimer in the
14+
// documentation and/or other materials provided with the distribution.
15+
//
16+
// * Neither the name of Image Engine Design nor the names of any
17+
// other contributors to this software may be used to endorse or
18+
// promote products derived from this software without specific prior
19+
// written permission.
20+
//
21+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
22+
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
23+
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24+
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
25+
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26+
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27+
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28+
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29+
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30+
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31+
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32+
//
33+
//////////////////////////////////////////////////////////////////////////
34+
35+
#ifndef IECOREAPPLESEED_RENDERERCONTROLLER_H
36+
#define IECOREAPPLESEED_RENDERERCONTROLLER_H
37+
38+
#include "tbb/atomic.h"
39+
40+
#include "renderer/api/rendering.h"
41+
42+
namespace IECoreAppleseed
43+
{
44+
45+
class RendererController : public renderer::DefaultRendererController
46+
{
47+
public :
48+
49+
RendererController()
50+
{
51+
m_status = ContinueRendering;
52+
}
53+
54+
virtual Status get_status() const
55+
{
56+
return m_status;
57+
}
58+
59+
void set_status( Status status )
60+
{
61+
m_status = status;
62+
}
63+
64+
private :
65+
66+
tbb::atomic<Status> m_status;
67+
};
68+
69+
} // namespace IECoreAppleseed
70+
71+
#endif // IECOREAPPLESEED_RENDERERCONTROLLER_H

contrib/IECoreAppleseed/include/IECoreAppleseed/private/RendererImplementation.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ class RendererImplementation : public IECore::Renderer
131131

132132
void constructCommon();
133133

134-
bool isInteractive() const;
134+
bool isProjectGen() const;
135+
bool isEditable() const;
135136

136137
void setCamera( const std::string &name, IECore::CameraPtr cortexCamera,
137138
foundation::auto_release_ptr<renderer::Camera> &camera );

contrib/IECoreAppleseed/src/IECoreAppleseed/EditBlockHandler.cpp

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@
3636

3737
#include <cassert>
3838

39-
#include "tbb/atomic.h"
40-
4139
#include "IECore/MessageHandler.h"
4240
#include "IECore/SimpleTypedData.h"
4341

@@ -50,30 +48,6 @@ using namespace std;
5048
namespace asf = foundation;
5149
namespace asr = renderer;
5250

53-
class IECoreAppleseed::EditBlockHandler::RendererController : public asr::DefaultRendererController
54-
{
55-
public :
56-
57-
RendererController()
58-
{
59-
m_status = ContinueRendering;
60-
}
61-
62-
virtual Status get_status() const
63-
{
64-
return m_status;
65-
}
66-
67-
void set_status( Status status )
68-
{
69-
m_status = status;
70-
}
71-
72-
private :
73-
74-
tbb::atomic<Status> m_status;
75-
};
76-
7751
IECoreAppleseed::EditBlockHandler::EditBlockHandler( asr::Project &project )
7852
: m_project( project )
7953
{

contrib/IECoreAppleseed/src/IECoreAppleseed/RendererImplementation.cpp

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
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

6869
using 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

9898
IECoreAppleseed::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

788813
void IECoreAppleseed::RendererImplementation::editBegin( const string &editType, const CompoundDataMap &parameters )
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

814839
void 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

835865
void IECoreAppleseed::RendererImplementation::setCamera( const string &name, CameraPtr cortexCamera,

0 commit comments

Comments
 (0)