예제 #1
0
static void render_update_resolution(Render *re, const RenderPreview *rp,
                                     bool use_border, const rcti *clip_rect)
{
	int winx = rp->ar->winx / rp->resolution_divider;
	int winy = rp->ar->winy / rp->resolution_divider;
	if (use_border) {
		rcti scaled_cliprct;
		rcti_scale_coords(&scaled_cliprct, clip_rect,
		                  1.0f / rp->resolution_divider);
		RE_ChangeResolution(re, winx, winy, &scaled_cliprct);
	}
	else {
		RE_ChangeResolution(re, winx, winy, NULL);
	}

	if (rp->has_freestyle) {
		if (rp->resolution_divider == 1) {
			RE_ChangeModeFlag(re, R_EDGE_FRS, false);
		}
		else {
			RE_ChangeModeFlag(re, R_EDGE_FRS, true);
		}
	}
}
예제 #2
0
static void render_view3d_startjob(void *customdata, short *stop, short *do_update, float *UNUSED(progress))
{
	RenderPreview *rp = customdata;
	Render *re;
	RenderStats *rstats;
	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_update_cb(re, rp, render_view3d_display_update);
	RE_stats_draw_cb(re, rp, render_view3d_renderinfo_cb);
	
	rstats = RE_GetStats(re);

	if (update_flag & PR_UPDATE_VIEW) {
		rp->resolution_divider = START_RESOLUTION_DIVIDER;
	}

	if ((update_flag & (PR_UPDATE_RENDERSIZE | PR_UPDATE_DATABASE)) || rstats->convertdone == 0) {
		RenderData rdata;
		int winx = rp->ar->winx / rp->resolution_divider,
		    winy = rp->ar->winy / rp->resolution_divider;

		/* 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, winx, winy, &cliprct);
		}
		else
			RE_InitState(re, NULL, &rdata, NULL, winx, winy, NULL);
	}
	else if (update_flag & PR_UPDATE_VIEW) {
		int winx = rp->ar->winx / rp->resolution_divider,
		    winy = rp->ar->winy / rp->resolution_divider;
		RE_ChangeResolution(re, winx, 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) {
		for (;;) {
			RE_TileProcessor(re);

			if (!*stop && rp->resolution_divider > 1) {
				int winx, winy;
				rp->resolution_divider /= 2;
				winx = rp->ar->winx / rp->resolution_divider;
				winy = rp->ar->winy / rp->resolution_divider;
				*do_update = 1;
				RE_ChangeResolution(re, winx, winy, NULL);

				/* Otherwise shadows are incorrect. */
				if (orth) {
					RE_SetOrtho(re, &viewplane, clipsta, clipend);
				}
				else {
					RE_SetWindow(re, &viewplane, clipsta, clipend);
				}
			}
			else {
				break;
			}
		}

		/* always rotate back */
		if (restore)
			RE_DataBase_IncrementalView(re, rp->viewmat, 1);
	}
}