Cycles: fix crash in 3d view status text display.

This commit is contained in:
Brecht Van Lommel 2011-08-23 12:20:11 +00:00
parent f717a1cca6
commit bd38aa51ad
3 changed files with 21 additions and 38 deletions

@ -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)

@ -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();

@ -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;