Fix issue in recent bugfix, did not work with multiple sessions (preview render).
This commit is contained in:
@@ -516,7 +516,7 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, int motion)
|
|||||||
mesh_motion_synced.clear();
|
mesh_motion_synced.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlenderSync::sync_motion(BL::SpaceView3D b_v3d, BL::Object b_override)
|
void BlenderSync::sync_motion(BL::SpaceView3D b_v3d, BL::Object b_override, void **python_thread_state)
|
||||||
{
|
{
|
||||||
if(scene->need_motion() == Scene::MOTION_NONE)
|
if(scene->need_motion() == Scene::MOTION_NONE)
|
||||||
return;
|
return;
|
||||||
@@ -535,9 +535,9 @@ void BlenderSync::sync_motion(BL::SpaceView3D b_v3d, BL::Object b_override)
|
|||||||
/* we need to set the python thread state again because this
|
/* we need to set the python thread state again because this
|
||||||
* function assumes it is being executed from python and will
|
* function assumes it is being executed from python and will
|
||||||
* try to save the thread state */
|
* try to save the thread state */
|
||||||
python_thread_state_restore();
|
python_thread_state_restore(python_thread_state);
|
||||||
b_scene.frame_set(frame + motion, 0.0f);
|
b_scene.frame_set(frame + motion, 0.0f);
|
||||||
python_thread_state_save();
|
python_thread_state_save(python_thread_state);
|
||||||
|
|
||||||
/* camera object */
|
/* camera object */
|
||||||
if(b_cam)
|
if(b_cam)
|
||||||
@@ -550,9 +550,9 @@ void BlenderSync::sync_motion(BL::SpaceView3D b_v3d, BL::Object b_override)
|
|||||||
/* we need to set the python thread state again because this
|
/* we need to set the python thread state again because this
|
||||||
* function assumes it is being executed from python and will
|
* function assumes it is being executed from python and will
|
||||||
* try to save the thread state */
|
* try to save the thread state */
|
||||||
python_thread_state_restore();
|
python_thread_state_restore(python_thread_state);
|
||||||
b_scene.frame_set(frame, 0.0f);
|
b_scene.frame_set(frame, 0.0f);
|
||||||
python_thread_state_save();
|
python_thread_state_save(python_thread_state);
|
||||||
|
|
||||||
/* tag camera for motion update */
|
/* tag camera for motion update */
|
||||||
if(scene->camera->motion_modified(prevcam))
|
if(scene->camera->motion_modified(prevcam))
|
||||||
|
@@ -35,17 +35,15 @@
|
|||||||
|
|
||||||
CCL_NAMESPACE_BEGIN
|
CCL_NAMESPACE_BEGIN
|
||||||
|
|
||||||
static PyThreadState *python_thread_state = NULL;
|
void python_thread_state_save(void **python_thread_state)
|
||||||
|
|
||||||
void python_thread_state_save()
|
|
||||||
{
|
{
|
||||||
python_thread_state = PyEval_SaveThread();
|
*python_thread_state = (void*)PyEval_SaveThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
void python_thread_state_restore()
|
void python_thread_state_restore(void **python_thread_state)
|
||||||
{
|
{
|
||||||
PyEval_RestoreThread(python_thread_state);
|
PyEval_RestoreThread((PyThreadState*)*python_thread_state);
|
||||||
python_thread_state = NULL;
|
*python_thread_state = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *init_func(PyObject *self, PyObject *args)
|
static PyObject *init_func(PyObject *self, PyObject *args)
|
||||||
@@ -100,8 +98,6 @@ static PyObject *create_func(PyObject *self, PyObject *args)
|
|||||||
/* create session */
|
/* create session */
|
||||||
BlenderSession *session;
|
BlenderSession *session;
|
||||||
|
|
||||||
python_thread_state_save();
|
|
||||||
|
|
||||||
if(rv3d) {
|
if(rv3d) {
|
||||||
/* interactive viewport session */
|
/* interactive viewport session */
|
||||||
int width = region.width();
|
int width = region.width();
|
||||||
@@ -122,7 +118,11 @@ static PyObject *create_func(PyObject *self, PyObject *args)
|
|||||||
session = new BlenderSession(engine, userpref, data, scene);
|
session = new BlenderSession(engine, userpref, data, scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
python_thread_state_restore();
|
python_thread_state_save(&session->python_thread_state);
|
||||||
|
|
||||||
|
session->create();
|
||||||
|
|
||||||
|
python_thread_state_restore(&session->python_thread_state);
|
||||||
|
|
||||||
return PyLong_FromVoidPtr(session);
|
return PyLong_FromVoidPtr(session);
|
||||||
}
|
}
|
||||||
@@ -136,12 +136,13 @@ static PyObject *free_func(PyObject *self, PyObject *value)
|
|||||||
|
|
||||||
static PyObject *render_func(PyObject *self, PyObject *value)
|
static PyObject *render_func(PyObject *self, PyObject *value)
|
||||||
{
|
{
|
||||||
python_thread_state_save();
|
|
||||||
|
|
||||||
BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(value);
|
BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(value);
|
||||||
|
|
||||||
|
python_thread_state_save(&session->python_thread_state);
|
||||||
|
|
||||||
session->render();
|
session->render();
|
||||||
|
|
||||||
python_thread_state_restore();
|
python_thread_state_restore(&session->python_thread_state);
|
||||||
|
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
@@ -183,23 +184,24 @@ static PyObject *reset_func(PyObject *self, PyObject *args)
|
|||||||
RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pyscene), &sceneptr);
|
RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pyscene), &sceneptr);
|
||||||
BL::Scene b_scene(sceneptr);
|
BL::Scene b_scene(sceneptr);
|
||||||
|
|
||||||
python_thread_state_save();
|
python_thread_state_save(&session->python_thread_state);
|
||||||
|
|
||||||
session->reset_session(b_data, b_scene);
|
session->reset_session(b_data, b_scene);
|
||||||
|
|
||||||
python_thread_state_restore();
|
python_thread_state_restore(&session->python_thread_state);
|
||||||
|
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *sync_func(PyObject *self, PyObject *value)
|
static PyObject *sync_func(PyObject *self, PyObject *value)
|
||||||
{
|
{
|
||||||
python_thread_state_save();
|
|
||||||
|
|
||||||
BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(value);
|
BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(value);
|
||||||
|
|
||||||
|
python_thread_state_save(&session->python_thread_state);
|
||||||
|
|
||||||
session->synchronize();
|
session->synchronize();
|
||||||
|
|
||||||
python_thread_state_restore();
|
python_thread_state_restore(&session->python_thread_state);
|
||||||
|
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
@@ -40,7 +40,7 @@ CCL_NAMESPACE_BEGIN
|
|||||||
BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::UserPreferences b_userpref_,
|
BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::UserPreferences b_userpref_,
|
||||||
BL::BlendData b_data_, BL::Scene b_scene_)
|
BL::BlendData b_data_, BL::Scene b_scene_)
|
||||||
: b_engine(b_engine_), b_userpref(b_userpref_), b_data(b_data_), b_render(b_engine_.render()), b_scene(b_scene_),
|
: b_engine(b_engine_), b_userpref(b_userpref_), b_data(b_data_), b_render(b_engine_.render()), b_scene(b_scene_),
|
||||||
b_v3d(PointerRNA_NULL), b_rv3d(PointerRNA_NULL)
|
b_v3d(PointerRNA_NULL), b_rv3d(PointerRNA_NULL), python_thread_state(NULL)
|
||||||
{
|
{
|
||||||
/* offline render */
|
/* offline render */
|
||||||
|
|
||||||
@@ -50,15 +50,13 @@ BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::UserPreferences b
|
|||||||
background = true;
|
background = true;
|
||||||
last_redraw_time = 0.0;
|
last_redraw_time = 0.0;
|
||||||
start_resize_time = 0.0;
|
start_resize_time = 0.0;
|
||||||
|
|
||||||
create_session();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::UserPreferences b_userpref_,
|
BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::UserPreferences b_userpref_,
|
||||||
BL::BlendData b_data_, BL::Scene b_scene_,
|
BL::BlendData b_data_, BL::Scene b_scene_,
|
||||||
BL::SpaceView3D b_v3d_, BL::RegionView3D b_rv3d_, int width_, int height_)
|
BL::SpaceView3D b_v3d_, BL::RegionView3D b_rv3d_, int width_, int height_)
|
||||||
: b_engine(b_engine_), b_userpref(b_userpref_), b_data(b_data_), b_render(b_scene_.render()), b_scene(b_scene_),
|
: b_engine(b_engine_), b_userpref(b_userpref_), b_data(b_data_), b_render(b_scene_.render()), b_scene(b_scene_),
|
||||||
b_v3d(b_v3d_), b_rv3d(b_rv3d_)
|
b_v3d(b_v3d_), b_rv3d(b_rv3d_), python_thread_state(NULL)
|
||||||
{
|
{
|
||||||
/* 3d view render */
|
/* 3d view render */
|
||||||
|
|
||||||
@@ -67,9 +65,6 @@ BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::UserPreferences b
|
|||||||
background = false;
|
background = false;
|
||||||
last_redraw_time = 0.0;
|
last_redraw_time = 0.0;
|
||||||
start_resize_time = 0.0;
|
start_resize_time = 0.0;
|
||||||
|
|
||||||
create_session();
|
|
||||||
session->start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BlenderSession::~BlenderSession()
|
BlenderSession::~BlenderSession()
|
||||||
@@ -77,6 +72,14 @@ BlenderSession::~BlenderSession()
|
|||||||
free_session();
|
free_session();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BlenderSession::create()
|
||||||
|
{
|
||||||
|
create_session();
|
||||||
|
|
||||||
|
if(b_v3d)
|
||||||
|
session->start();
|
||||||
|
}
|
||||||
|
|
||||||
void BlenderSession::create_session()
|
void BlenderSession::create_session()
|
||||||
{
|
{
|
||||||
SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background);
|
SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background);
|
||||||
@@ -102,7 +105,7 @@ void BlenderSession::create_session()
|
|||||||
|
|
||||||
if(b_v3d) {
|
if(b_v3d) {
|
||||||
/* full data sync */
|
/* full data sync */
|
||||||
sync->sync_data(b_v3d, b_engine.camera_override());
|
sync->sync_data(b_v3d, b_engine.camera_override(), &python_thread_state);
|
||||||
sync->sync_view(b_v3d, b_rv3d, width, height);
|
sync->sync_view(b_v3d, b_rv3d, width, height);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -389,7 +392,7 @@ void BlenderSession::render()
|
|||||||
|
|
||||||
/* update scene */
|
/* update scene */
|
||||||
sync->sync_camera(b_render, b_engine.camera_override(), width, height);
|
sync->sync_camera(b_render, b_engine.camera_override(), width, height);
|
||||||
sync->sync_data(b_v3d, b_engine.camera_override(), b_rlay_name.c_str());
|
sync->sync_data(b_v3d, b_engine.camera_override(), &python_thread_state, b_rlay_name.c_str());
|
||||||
|
|
||||||
/* update number of samples per layer */
|
/* update number of samples per layer */
|
||||||
int samples = sync->get_layer_samples();
|
int samples = sync->get_layer_samples();
|
||||||
@@ -506,7 +509,7 @@ void BlenderSession::synchronize()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* data and camera synchronize */
|
/* data and camera synchronize */
|
||||||
sync->sync_data(b_v3d, b_engine.camera_override());
|
sync->sync_data(b_v3d, b_engine.camera_override(), &python_thread_state);
|
||||||
|
|
||||||
if(b_rv3d)
|
if(b_rv3d)
|
||||||
sync->sync_view(b_v3d, b_rv3d, width, height);
|
sync->sync_view(b_v3d, b_rv3d, width, height);
|
||||||
|
@@ -40,6 +40,8 @@ public:
|
|||||||
|
|
||||||
~BlenderSession();
|
~BlenderSession();
|
||||||
|
|
||||||
|
void create();
|
||||||
|
|
||||||
/* session */
|
/* session */
|
||||||
void create_session();
|
void create_session();
|
||||||
void free_session();
|
void free_session();
|
||||||
@@ -90,6 +92,8 @@ public:
|
|||||||
int width, height;
|
int width, height;
|
||||||
double start_resize_time;
|
double start_resize_time;
|
||||||
|
|
||||||
|
void *python_thread_state;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void do_write_update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile, bool do_update_only);
|
void do_write_update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile, bool do_update_only);
|
||||||
void do_write_update_render_tile(RenderTile& rtile, bool do_update_only);
|
void do_write_update_render_tile(RenderTile& rtile, bool do_update_only);
|
||||||
|
@@ -135,7 +135,7 @@ bool BlenderSync::sync_recalc()
|
|||||||
return recalc;
|
return recalc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlenderSync::sync_data(BL::SpaceView3D b_v3d, BL::Object b_override, const char *layer)
|
void BlenderSync::sync_data(BL::SpaceView3D b_v3d, BL::Object b_override, void **python_thread_state, const char *layer)
|
||||||
{
|
{
|
||||||
sync_render_layers(b_v3d, layer);
|
sync_render_layers(b_v3d, layer);
|
||||||
sync_integrator();
|
sync_integrator();
|
||||||
@@ -143,7 +143,7 @@ void BlenderSync::sync_data(BL::SpaceView3D b_v3d, BL::Object b_override, const
|
|||||||
sync_shaders();
|
sync_shaders();
|
||||||
sync_curve_settings();
|
sync_curve_settings();
|
||||||
sync_objects(b_v3d);
|
sync_objects(b_v3d);
|
||||||
sync_motion(b_v3d, b_override);
|
sync_motion(b_v3d, b_override, python_thread_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Integrator */
|
/* Integrator */
|
||||||
|
@@ -53,7 +53,7 @@ public:
|
|||||||
|
|
||||||
/* sync */
|
/* sync */
|
||||||
bool sync_recalc();
|
bool sync_recalc();
|
||||||
void sync_data(BL::SpaceView3D b_v3d, BL::Object b_override, const char *layer = 0);
|
void sync_data(BL::SpaceView3D b_v3d, BL::Object b_override, void **python_thread_state, const char *layer = 0);
|
||||||
void sync_render_layers(BL::SpaceView3D b_v3d, const char *layer);
|
void sync_render_layers(BL::SpaceView3D b_v3d, const char *layer);
|
||||||
void sync_integrator();
|
void sync_integrator();
|
||||||
void sync_camera(BL::RenderSettings b_render, BL::Object b_override, int width, int height);
|
void sync_camera(BL::RenderSettings b_render, BL::Object b_override, int width, int height);
|
||||||
@@ -72,7 +72,7 @@ private:
|
|||||||
void sync_lamps(bool update_all);
|
void sync_lamps(bool update_all);
|
||||||
void sync_materials(bool update_all);
|
void sync_materials(bool update_all);
|
||||||
void sync_objects(BL::SpaceView3D b_v3d, int motion = 0);
|
void sync_objects(BL::SpaceView3D b_v3d, int motion = 0);
|
||||||
void sync_motion(BL::SpaceView3D b_v3d, BL::Object b_override);
|
void sync_motion(BL::SpaceView3D b_v3d, BL::Object b_override, void **python_thread_state);
|
||||||
void sync_film();
|
void sync_film();
|
||||||
void sync_view();
|
void sync_view();
|
||||||
void sync_world(bool update_all);
|
void sync_world(bool update_all);
|
||||||
|
@@ -37,8 +37,8 @@ float *BKE_image_get_float_pixels_for_frame(void *image, int frame);
|
|||||||
|
|
||||||
CCL_NAMESPACE_BEGIN
|
CCL_NAMESPACE_BEGIN
|
||||||
|
|
||||||
void python_thread_state_save();
|
void python_thread_state_save(void **python_thread_state);
|
||||||
void python_thread_state_restore();
|
void python_thread_state_restore(void **python_thread_state);
|
||||||
|
|
||||||
static inline BL::Mesh object_to_mesh(BL::BlendData data, BL::Object object, BL::Scene scene, bool apply_modifiers, bool render, bool calc_undeformed)
|
static inline BL::Mesh object_to_mesh(BL::BlendData data, BL::Object object, BL::Scene scene, bool apply_modifiers, bool render, bool calc_undeformed)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user