Tomato Cycles: experimental option to cancel rendering when doing initial synchronization
This required wrapping create and update pytohn callbacks as into begin/end allow threading macroses. From quick tests this seems to be stable enough, but more tests would be needed before considering this stable.
This commit is contained in:
@@ -302,14 +302,17 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, int motion)
|
||||
BL::Scene b_sce = b_scene;
|
||||
int particle_offset = 0;
|
||||
|
||||
for(; b_sce; b_sce = b_sce.background_set()) {
|
||||
for(b_sce.objects.begin(b_ob); b_ob != b_sce.objects.end(); ++b_ob) {
|
||||
bool cancel = false;
|
||||
|
||||
for(; b_sce && !cancel; b_sce = b_sce.background_set()) {
|
||||
for(b_sce.objects.begin(b_ob); b_ob != b_sce.objects.end() && !cancel; ++b_ob) {
|
||||
bool hide = (render_layer.use_viewport_visibility)? b_ob->hide(): b_ob->hide_render();
|
||||
uint ob_layer = get_layer(b_ob->layers(), b_ob->layers_local_view(), object_is_light(*b_ob));
|
||||
CYCLES_LOCAL_LAYER_HACK(render_layer.use_localview, ob_layer);
|
||||
hide = hide || !(ob_layer & scene_layer);
|
||||
|
||||
if(!hide) {
|
||||
progress.set_status("Synchronizing object", (*b_ob).name());
|
||||
|
||||
int num_particles = object_count_particles(*b_ob);
|
||||
|
||||
@@ -351,10 +354,12 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, int motion)
|
||||
|
||||
particle_offset += num_particles;
|
||||
}
|
||||
|
||||
cancel = progress.get_cancel();
|
||||
}
|
||||
}
|
||||
|
||||
if(!motion) {
|
||||
if(!cancel && !motion) {
|
||||
sync_background_light();
|
||||
|
||||
/* handle removed data and modified pointers */
|
||||
|
||||
@@ -80,6 +80,8 @@ static PyObject *create_func(PyObject *self, PyObject *args)
|
||||
/* create session */
|
||||
BlenderSession *session;
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
|
||||
if(rv3d) {
|
||||
/* interactive session */
|
||||
int width = region.width();
|
||||
@@ -91,7 +93,9 @@ static PyObject *create_func(PyObject *self, PyObject *args)
|
||||
/* offline session */
|
||||
session = new BlenderSession(engine, userpref, data, scene);
|
||||
}
|
||||
|
||||
|
||||
Py_END_ALLOW_THREADS
|
||||
|
||||
return PyLong_FromVoidPtr(session);
|
||||
}
|
||||
|
||||
@@ -136,9 +140,13 @@ static PyObject *draw_func(PyObject *self, PyObject *args)
|
||||
|
||||
static PyObject *sync_func(PyObject *self, PyObject *value)
|
||||
{
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
|
||||
BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(value);
|
||||
session->synchronize();
|
||||
|
||||
Py_END_ALLOW_THREADS
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
||||
@@ -88,15 +88,6 @@ void BlenderSession::create_session()
|
||||
/* create scene */
|
||||
scene = new Scene(scene_params, session_params.device);
|
||||
|
||||
/* create sync */
|
||||
sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background);
|
||||
sync->sync_data(b_v3d, b_engine.camera_override());
|
||||
|
||||
if(b_rv3d)
|
||||
sync->sync_view(b_v3d, b_rv3d, width, height);
|
||||
else
|
||||
sync->sync_camera(b_engine.camera_override(), width, height);
|
||||
|
||||
/* create session */
|
||||
session = new Session(session_params);
|
||||
session->scene = scene;
|
||||
@@ -104,6 +95,15 @@ void BlenderSession::create_session()
|
||||
session->progress.set_cancel_callback(function_bind(&BlenderSession::test_cancel, this));
|
||||
session->set_pause(BlenderSync::get_session_pause(b_scene, background));
|
||||
|
||||
/* create sync */
|
||||
sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress);
|
||||
sync->sync_data(b_v3d, b_engine.camera_override());
|
||||
|
||||
if(b_rv3d)
|
||||
sync->sync_view(b_v3d, b_rv3d, width, height);
|
||||
else
|
||||
sync->sync_camera(b_engine.camera_override(), width, height);
|
||||
|
||||
/* set buffer parameters */
|
||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, scene->camera, width, height);
|
||||
session->reset(buffer_params, session_params.samples);
|
||||
|
||||
@@ -40,7 +40,7 @@ CCL_NAMESPACE_BEGIN
|
||||
|
||||
/* Constructor */
|
||||
|
||||
BlenderSync::BlenderSync(BL::RenderEngine b_engine_, BL::BlendData b_data_, BL::Scene b_scene_, Scene *scene_, bool preview_)
|
||||
BlenderSync::BlenderSync(BL::RenderEngine b_engine_, BL::BlendData b_data_, BL::Scene b_scene_, Scene *scene_, bool preview_, Progress &progress_)
|
||||
: b_engine(b_engine_),
|
||||
b_data(b_data_), b_scene(b_scene_),
|
||||
shader_map(&scene_->shaders),
|
||||
@@ -49,7 +49,8 @@ BlenderSync::BlenderSync(BL::RenderEngine b_engine_, BL::BlendData b_data_, BL::
|
||||
light_map(&scene_->lights),
|
||||
world_map(NULL),
|
||||
world_recalc(false),
|
||||
experimental(false)
|
||||
experimental(false),
|
||||
progress(progress_)
|
||||
{
|
||||
scene = scene_;
|
||||
preview = preview_;
|
||||
|
||||
@@ -49,7 +49,7 @@ class ShaderNode;
|
||||
|
||||
class BlenderSync {
|
||||
public:
|
||||
BlenderSync(BL::RenderEngine b_engine_, BL::BlendData b_data, BL::Scene b_scene, Scene *scene_, bool preview_);
|
||||
BlenderSync(BL::RenderEngine b_engine_, BL::BlendData b_data, BL::Scene b_scene, Scene *scene_, bool preview_, Progress &progress_);
|
||||
~BlenderSync();
|
||||
|
||||
/* sync */
|
||||
@@ -131,6 +131,8 @@ private:
|
||||
bool use_localview;
|
||||
int samples;
|
||||
} render_layer;
|
||||
|
||||
Progress &progress;
|
||||
};
|
||||
|
||||
/* we don't have spare bits for localview (normally 20-28)
|
||||
|
||||
Reference in New Issue
Block a user