static void render_view3d_startjob(void *customdata, short *stop, short *do_update, float *UNUSED(progress)) { RenderPreview *rp = customdata; Render *re; RenderStats *rstats; RenderData rdata; rctf viewplane; rcti cliprct; float clipsta, clipend, pixsize; bool orth, restore = 0; char name[32]; G.is_break = FALSE; if (false == render_view3d_get_rects(rp->ar, rp->v3d, rp->rv3d, &viewplane, rp->engine, &clipsta, &clipend, &pixsize, &orth)) return; rp->stop = stop; rp->do_update = do_update; // printf("Enter previewrender\n"); /* ok, are we rendering all over? */ sprintf(name, "View3dPreview %p", (void *)rp->ar); re = rp->engine->re = RE_GetRender(name); if (rp->engine->re == NULL) { re = rp->engine->re = RE_NewRender(name); rp->keep_data = 0; } /* set this always, rp is different for each job */ RE_test_break_cb(re, rp, render_view3d_break); RE_display_draw_cb(re, rp, render_view3d_draw_update); RE_stats_draw_cb(re, rp, render_view3d_renderinfo_cb); rstats = RE_GetStats(re); if (rp->keep_data == 0 || rstats->convertdone == 0 || (rp->keep_data & PR_UPDATE_RENDERSIZE)) { /* no osa, blur, seq, layers, etc for preview render */ rdata = rp->scene->r; rdata.mode &= ~(R_OSA | R_MBLUR | R_BORDER | R_PANORAMA); rdata.scemode &= ~(R_DOSEQ | R_DOCOMP | R_FREE_IMAGE); rdata.scemode |= R_VIEWPORT_PREVIEW; /* we do use layers, but only active */ rdata.scemode |= R_SINGLE_LAYER; /* initalize always */ if (render_view3d_disprect(rp->scene, rp->ar, rp->v3d, rp->rv3d, &cliprct)) { rdata.mode |= R_BORDER; RE_InitState(re, NULL, &rdata, NULL, rp->ar->winx, rp->ar->winy, &cliprct); } else RE_InitState(re, NULL, &rdata, NULL, rp->ar->winx, rp->ar->winy, NULL); } if (orth) RE_SetOrtho(re, &viewplane, clipsta, clipend); else RE_SetWindow(re, &viewplane, clipsta, clipend); RE_SetPixelSize(re, pixsize); /* database free can crash on a empty Render... */ if (rp->keep_data == 0 && rstats->convertdone) RE_Database_Free(re); if (rstats->convertdone == 0) { unsigned int lay = rp->scene->lay; /* allow localview render for objects with lights in normal layers */ if (rp->v3d->lay & 0xFF000000) lay |= rp->v3d->lay; else lay = rp->v3d->lay; RE_SetView(re, rp->viewmat); RE_Database_FromScene(re, rp->bmain, rp->scene, lay, 0); // 0= dont use camera view // printf("dbase update\n"); } else { // printf("dbase rotate\n"); RE_DataBase_IncrementalView(re, rp->viewmat, 0); restore = 1; } RE_DataBase_ApplyWindow(re); /* OK, can we enter render code? */ if (rstats->convertdone) { RE_TileProcessor(re); /* always rotate back */ if (restore) RE_DataBase_IncrementalView(re, rp->viewmat, 1); rp->engine->flag &= ~RE_ENGINE_DO_UPDATE; } }
static void render_view3d_startjob(void *customdata, short *stop, short *do_update, float *UNUSED(progress)) { RenderPreview *rp = customdata; Render *re; RenderStats *rstats; RenderData rdata; rctf viewplane; rcti cliprct; float clipsta, clipend, pixsize; bool orth, restore = 0; char name[32]; int update_flag; update_flag = rp->engine->job_update_flag; rp->engine->job_update_flag = 0; //printf("ma %d res %d view %d db %d\n", update_flag & PR_UPDATE_MATERIAL, update_flag & PR_UPDATE_RENDERSIZE, update_flag & PR_UPDATE_VIEW, update_flag & PR_UPDATE_DATABASE); G.is_break = FALSE; if (false == render_view3d_get_rects(rp->ar, rp->v3d, rp->rv3d, &viewplane, rp->engine, &clipsta, &clipend, &pixsize, &orth)) return; rp->stop = stop; rp->do_update = do_update; // printf("Enter previewrender\n"); /* ok, are we rendering all over? */ sprintf(name, "View3dPreview %p", (void *)rp->ar); re = rp->engine->re = RE_GetRender(name); /* set this always, rp is different for each job */ RE_test_break_cb(re, rp, render_view3d_break); RE_display_draw_cb(re, rp, render_view3d_draw_update); RE_stats_draw_cb(re, rp, render_view3d_renderinfo_cb); rstats = RE_GetStats(re); if ((update_flag & (PR_UPDATE_RENDERSIZE | PR_UPDATE_DATABASE)) || rstats->convertdone == 0) { /* no osa, blur, seq, layers, etc for preview render */ rdata = rp->scene->r; rdata.mode &= ~(R_OSA | R_MBLUR | R_BORDER | R_PANORAMA); rdata.scemode &= ~(R_DOSEQ | R_DOCOMP | R_FREE_IMAGE); rdata.scemode |= R_VIEWPORT_PREVIEW; /* we do use layers, but only active */ rdata.scemode |= R_SINGLE_LAYER; /* initalize always */ if (render_view3d_disprect(rp->scene, rp->ar, rp->v3d, rp->rv3d, &cliprct)) { rdata.mode |= R_BORDER; RE_InitState(re, NULL, &rdata, NULL, rp->ar->winx, rp->ar->winy, &cliprct); } else RE_InitState(re, NULL, &rdata, NULL, rp->ar->winx, rp->ar->winy, NULL); } if (orth) RE_SetOrtho(re, &viewplane, clipsta, clipend); else RE_SetWindow(re, &viewplane, clipsta, clipend); RE_SetPixelSize(re, pixsize); if ((update_flag & PR_UPDATE_DATABASE) || rstats->convertdone == 0) { unsigned int lay = rp->scene->lay; /* allow localview render for objects with lights in normal layers */ if (rp->v3d->lay & 0xFF000000) lay |= rp->v3d->lay; else lay = rp->v3d->lay; RE_SetView(re, rp->viewmat); /* copying blender data while main thread is locked, to avoid crashes */ WM_job_main_thread_lock_acquire(rp->job); RE_Database_Free(re); RE_Database_FromScene(re, rp->bmain, rp->scene, lay, 0); // 0= dont use camera view WM_job_main_thread_lock_release(rp->job); /* do preprocessing like building raytree, shadows, volumes, SSS */ RE_Database_Preprocess(re); /* conversion not completed, need to do it again */ if (!rstats->convertdone) { if (render_view3d_is_valid(rp)) { rp->engine->job_update_flag |= PR_UPDATE_DATABASE; } } // printf("dbase update\n"); } else { // printf("dbase rotate\n"); RE_DataBase_IncrementalView(re, rp->viewmat, 0); restore = 1; } RE_DataBase_ApplyWindow(re); /* OK, can we enter render code? */ if (rstats->convertdone) { RE_TileProcessor(re); /* always rotate back */ if (restore) RE_DataBase_IncrementalView(re, rp->viewmat, 1); } }