From bd38aa51ad029f114813d3d8f5a069571255b211 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 23 Aug 2011 12:20:11 +0000 Subject: Cycles: fix crash in 3d view status text display. --- intern/cycles/blender/blender_python.cpp | 27 +++------------------------ intern/cycles/blender/blender_session.cpp | 30 +++++++++++++++++------------- intern/cycles/blender/blender_session.h | 2 +- 3 files changed, 21 insertions(+), 38 deletions(-) diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp index 1e72e5f15f1..b40f5206fea 100644 --- a/intern/cycles/blender/blender_python.cpp +++ b/intern/cycles/blender/blender_python.cpp @@ -129,37 +129,16 @@ static PyObject *draw_func(PyObject *self, PyObject *args) BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession); - bool draw_text = false; - if(PyLong_AsVoidPtr(pyrv3d)) { /* 3d view drawing */ int viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); - draw_text = session->draw(viewport[2], viewport[3]); - } - else { - /* image editor drawing */ - draw_text = session->draw(); + session->draw(viewport[2], viewport[3]); } - /* draw */ - PyObject *ret = PyTuple_New(2); - - if(!draw_text) { - PyTuple_SetItem(ret, 0, PyUnicode_FromString("")); - PyTuple_SetItem(ret, 1, PyUnicode_FromString("")); - } - else { - string status, substatus; - - session->get_status(status, substatus); - - PyTuple_SetItem(ret, 0, PyUnicode_FromString(status.c_str())); - PyTuple_SetItem(ret, 1, PyUnicode_FromString(substatus.c_str())); - } - - return ret; + Py_INCREF(Py_None); + return Py_None; } static PyObject *sync_func(PyObject *self, PyObject *args) diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index 045efef0ef0..4223998c1f6 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -229,12 +229,10 @@ bool BlenderSession::draw(int w, int h) session->reset(width, height); } - /* draw */ - return !session->draw(width, height); -} + /* update status and progress for 3d view draw */ + update_status_progress(); -bool BlenderSession::draw() -{ + /* draw */ return !session->draw(width, height); } @@ -252,20 +250,13 @@ void BlenderSession::get_progress(float& progress, double& total_time) progress = ((float)pass/(float)session->params.passes); } -void BlenderSession::tag_update() -{ - /* tell blender that we want to get another update callback */ - engine_tag_update((RenderEngine*)b_engine.ptr.data); -} - -void BlenderSession::tag_redraw() +void BlenderSession::update_status_progress() { string status, substatus; float progress; double total_time; char time_str[128]; - /* update stats and progress */ get_status(status, substatus); get_progress(progress, total_time); @@ -279,8 +270,21 @@ void BlenderSession::tag_redraw() RE_engine_update_stats((RenderEngine*)b_engine.ptr.data, "", status.c_str()); RE_engine_update_progress((RenderEngine*)b_engine.ptr.data, progress); +} +void BlenderSession::tag_update() +{ + /* tell blender that we want to get another update callback */ + engine_tag_update((RenderEngine*)b_engine.ptr.data); +} + +void BlenderSession::tag_redraw() +{ if(background) { + /* update stats and progress, only for background here because + in 3d view we do it in draw for thread safety reasons */ + update_status_progress(); + /* offline render, redraw if timeout passed */ if(time_dt() - last_redraw_time > 1.0f) { write_render_result(); diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h index ea3e005a884..8608ddd2658 100644 --- a/intern/cycles/blender/blender_session.h +++ b/intern/cycles/blender/blender_session.h @@ -50,13 +50,13 @@ public: void synchronize(); /* drawing */ - bool draw(); bool draw(int w, int h); void tag_redraw(); void tag_update(); void get_status(string& status, string& substatus); void get_progress(float& progress, double& total_time); void test_cancel(); + void update_status_progress(); bool background; Session *session; -- cgit v1.2.3