diff options
Diffstat (limited to 'source/blender/render/intern/source/initrender.c')
-rw-r--r-- | source/blender/render/intern/source/initrender.c | 338 |
1 files changed, 1 insertions, 337 deletions
diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c index 34e47a00c7a..9611a8a7452 100644 --- a/source/blender/render/intern/source/initrender.c +++ b/source/blender/render/intern/source/initrender.c @@ -38,13 +38,9 @@ #include "BLI_math.h" #include "BLI_blenlib.h" -#include "BLI_jitter_2d.h" #include "BLI_utildefines.h" #include "DNA_camera_types.h" -#include "DNA_image_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" #include "BKE_camera.h" @@ -56,31 +52,6 @@ #include "initrender.h" -/* ********************** */ - -static void init_render_jit(Render *re) -{ - static float jit[32][2]; /* simple caching */ - static float mblur_jit[32][2]; /* simple caching */ - static int lastjit = 0; - static int last_mblur_jit = 0; - - if (lastjit != re->r.osa || last_mblur_jit != re->r.mblur_samples) { - memset(jit, 0, sizeof(jit)); - BLI_jitter_init(jit, re->r.osa); - - memset(mblur_jit, 0, sizeof(mblur_jit)); - BLI_jitter_init(mblur_jit, re->r.mblur_samples); - } - - lastjit = re->r.osa; - memcpy(re->jit, jit, sizeof(jit)); - - last_mblur_jit = re->r.mblur_samples; - memcpy(re->mblur_jit, mblur_jit, sizeof(mblur_jit)); -} - - /* ****************** MASKS and LUTS **************** */ static float filt_quadratic(float x) @@ -171,256 +142,6 @@ float RE_filter_value(int type, float x) return 0.0f; } -static float calc_weight(Render *re, float *weight, int i, int j) -{ - float x, y, dist, totw = 0.0; - int a; - - for (a = 0; a < re->osa; a++) { - x = re->jit[a][0] + i; - y = re->jit[a][1] + j; - dist = sqrtf(x * x + y * y); - - weight[a] = 0.0; - - /* Weighting choices */ - switch (re->r.filtertype) { - case R_FILTER_BOX: - if (i == 0 && j == 0) weight[a] = 1.0; - break; - - case R_FILTER_TENT: - if (dist < re->r.gauss) - weight[a] = re->r.gauss - dist; - break; - - case R_FILTER_GAUSS: - x = dist * re->r.gauss; - weight[a] = (1.0f / expf(x * x) - 1.0f / expf(re->r.gauss * re->r.gauss * 2.25f)); - break; - - case R_FILTER_MITCH: - weight[a] = filt_mitchell(dist * re->r.gauss); - break; - - case R_FILTER_QUAD: - weight[a] = filt_quadratic(dist * re->r.gauss); - break; - - case R_FILTER_CUBIC: - weight[a] = filt_cubic(dist * re->r.gauss); - break; - - case R_FILTER_CATROM: - weight[a] = filt_catrom(dist * re->r.gauss); - break; - - } - - totw += weight[a]; - - } - return totw; -} - -void free_sample_tables(Render *re) -{ - int a; - - if (re->samples) { - for (a = 0; a < 9; a++) { - MEM_freeN(re->samples->fmask1[a]); - MEM_freeN(re->samples->fmask2[a]); - } - - MEM_freeN(re->samples->centmask); - MEM_freeN(re->samples); - re->samples = NULL; - } -} - -/* based on settings in render, it makes the lookup tables */ -void make_sample_tables(Render *re) -{ - static int firsttime = 1; - SampleTables *st; - float flweight[32]; - float weight[32], totw, val, *fpx1, *fpx2, *fpy1, *fpy2, *m3, *m4; - int i, j, a, centmasksize; - - /* optimization tables, only once */ - if (firsttime) { - firsttime = 0; - } - - free_sample_tables(re); - - init_render_jit(re); /* needed for mblur too */ - - if (re->osa == 0) { - /* just prevents cpu cycles for larger render and copying */ - re->r.filtertype = 0; - return; - } - - st = re->samples = MEM_callocN(sizeof(SampleTables), "sample tables"); - - for (a = 0; a < 9; a++) { - st->fmask1[a] = MEM_callocN(256 * sizeof(float), "initfilt"); - st->fmask2[a] = MEM_callocN(256 * sizeof(float), "initfilt"); - } - for (a = 0; a < 256; a++) { - st->cmask[a] = 0; - if (a & 1) st->cmask[a]++; - if (a & 2) st->cmask[a]++; - if (a & 4) st->cmask[a]++; - if (a & 8) st->cmask[a]++; - if (a & 16) st->cmask[a]++; - if (a & 32) st->cmask[a]++; - if (a & 64) st->cmask[a]++; - if (a & 128) st->cmask[a]++; - } - - centmasksize = (1 << re->osa); - st->centmask = MEM_mallocN(centmasksize, "Initfilt3"); - - for (a = 0; a < 16; a++) { - st->centLut[a] = -0.45f + ((float)a) / 16.0f; - } - - /* calculate totw */ - totw = 0.0; - for (j = -1; j < 2; j++) { - for (i = -1; i < 2; i++) { - totw += calc_weight(re, weight, i, j); - } - } - - for (j = -1; j < 2; j++) { - for (i = -1; i < 2; i++) { - /* calculate using jit, with offset the weights */ - - memset(weight, 0, sizeof(weight)); - calc_weight(re, weight, i, j); - - for (a = 0; a < 16; a++) flweight[a] = weight[a] * (1.0f / totw); - - m3 = st->fmask1[3 * (j + 1) + i + 1]; - m4 = st->fmask2[3 * (j + 1) + i + 1]; - - for (a = 0; a < 256; a++) { - if (a & 1) { - m3[a] += flweight[0]; - m4[a] += flweight[8]; - } - if (a & 2) { - m3[a] += flweight[1]; - m4[a] += flweight[9]; - } - if (a & 4) { - m3[a] += flweight[2]; - m4[a] += flweight[10]; - } - if (a & 8) { - m3[a] += flweight[3]; - m4[a] += flweight[11]; - } - if (a & 16) { - m3[a] += flweight[4]; - m4[a] += flweight[12]; - } - if (a & 32) { - m3[a] += flweight[5]; - m4[a] += flweight[13]; - } - if (a & 64) { - m3[a] += flweight[6]; - m4[a] += flweight[14]; - } - if (a & 128) { - m3[a] += flweight[7]; - m4[a] += flweight[15]; - } - } - } - } - - /* centmask: the correct subpixel offset per mask */ - - fpx1 = MEM_mallocN(256 * sizeof(float), "initgauss4"); - fpx2 = MEM_mallocN(256 * sizeof(float), "initgauss4"); - fpy1 = MEM_mallocN(256 * sizeof(float), "initgauss4"); - fpy2 = MEM_mallocN(256 * sizeof(float), "initgauss4"); - for (a = 0; a < 256; a++) { - fpx1[a] = fpx2[a] = 0.0; - fpy1[a] = fpy2[a] = 0.0; - if (a & 1) { - fpx1[a] += re->jit[0][0]; - fpy1[a] += re->jit[0][1]; - fpx2[a] += re->jit[8][0]; - fpy2[a] += re->jit[8][1]; - } - if (a & 2) { - fpx1[a] += re->jit[1][0]; - fpy1[a] += re->jit[1][1]; - fpx2[a] += re->jit[9][0]; - fpy2[a] += re->jit[9][1]; - } - if (a & 4) { - fpx1[a] += re->jit[2][0]; - fpy1[a] += re->jit[2][1]; - fpx2[a] += re->jit[10][0]; - fpy2[a] += re->jit[10][1]; - } - if (a & 8) { - fpx1[a] += re->jit[3][0]; - fpy1[a] += re->jit[3][1]; - fpx2[a] += re->jit[11][0]; - fpy2[a] += re->jit[11][1]; - } - if (a & 16) { - fpx1[a] += re->jit[4][0]; - fpy1[a] += re->jit[4][1]; - fpx2[a] += re->jit[12][0]; - fpy2[a] += re->jit[12][1]; - } - if (a & 32) { - fpx1[a] += re->jit[5][0]; - fpy1[a] += re->jit[5][1]; - fpx2[a] += re->jit[13][0]; - fpy2[a] += re->jit[13][1]; - } - if (a & 64) { - fpx1[a] += re->jit[6][0]; - fpy1[a] += re->jit[6][1]; - fpx2[a] += re->jit[14][0]; - fpy2[a] += re->jit[14][1]; - } - if (a & 128) { - fpx1[a] += re->jit[7][0]; - fpy1[a] += re->jit[7][1]; - fpx2[a] += re->jit[15][0]; - fpy2[a] += re->jit[15][1]; - } - } - - for (a = centmasksize - 1; a > 0; a--) { - val = st->cmask[a & 255] + st->cmask[a >> 8]; - i = 8 + (15.9f * (fpy1[a & 255] + fpy2[a >> 8]) / val); - CLAMP(i, 0, 15); - j = 8 + (15.9f * (fpx1[a & 255] + fpx2[a >> 8]) / val); - CLAMP(j, 0, 15); - i = j + (i << 4); - st->centmask[a] = i; - } - - MEM_freeN(fpx1); - MEM_freeN(fpx2); - MEM_freeN(fpy1); - MEM_freeN(fpy2); -} - - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ struct Object *RE_GetCamera(Render *re) { @@ -435,37 +156,11 @@ static void re_camera_params_get(Render *re, CameraParams *params, Object *cam_o re->clipsta = params->clipsta; re->clipend = params->clipend; - re->ycor = params->ycor; - re->viewdx = params->viewdx; - re->viewdy = params->viewdy; re->viewplane = params->viewplane; BKE_camera_object_mode(&re->r, cam_ob); } -void RE_SetEnvmapCamera(Render *re, Object *cam_ob, float viewscale, float clipsta, float clipend) -{ - CameraParams params; - - /* setup parameters */ - BKE_camera_params_init(¶ms); - BKE_camera_params_from_object(¶ms, cam_ob); - - params.lens = 16.0f * viewscale; - params.sensor_x = 32.0f; - params.sensor_y = 32.0f; - params.sensor_fit = CAMERA_SENSOR_FIT_AUTO; - params.clipsta = clipsta; - params.clipend = clipend; - - /* compute matrix, viewplane, .. */ - BKE_camera_params_compute_viewplane(¶ms, re->winx, re->winy, 1.0f, 1.0f); - BKE_camera_params_compute_matrix(¶ms); - - /* extract results */ - re_camera_params_get(re, ¶ms, cam_ob); -} - void RE_SetOverrideCamera(Render *re, Object *camera) { re->camera_override = camera; @@ -487,10 +182,6 @@ void RE_SetCamera(Render *re, Object *cam_ob) BKE_camera_params_from_object(¶ms, cam_ob); re_camera_params_stereo3d(re, ¶ms, cam_ob); - params.use_fields = (re->r.mode & R_FIELDS); - params.field_second = (re->flag & R_SEC_FIELD); - params.field_odd = (re->r.mode & R_ODDFIELD); - /* compute matrix, viewplane, .. */ BKE_camera_params_compute_viewplane(¶ms, re->winx, re->winy, re->r.xasp, re->r.yasp); BKE_camera_params_compute_matrix(¶ms); @@ -499,12 +190,6 @@ void RE_SetCamera(Render *re, Object *cam_ob) re_camera_params_get(re, ¶ms, cam_ob); } -void RE_SetPixelSize(Render *re, float pixsize) -{ - re->viewdx = pixsize; - re->viewdy = re->ycor * pixsize; -} - void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[4][4]) { re->r.cfra = frame; @@ -522,13 +207,6 @@ void RE_GetCameraModelMatrix(Render *re, struct Object *camera, float r_mat[4][4 void RE_parts_free(Render *re) { - RenderPart *part = re->parts.first; - - while (part) { - if (part->rectp) MEM_freeN(part->rectp); - if (part->rectz) MEM_freeN(part->rectz); - part = part->next; - } BLI_freelistN(&re->parts); } @@ -539,7 +217,7 @@ void RE_parts_clamp(Render *re) re->party = max_ii(1, min_ii(re->r.tiley, re->recty)); } -void RE_parts_init(Render *re, bool do_crop) +void RE_parts_init(Render *re) { int nr, xd, yd, partx, party, xparts, yparts; int xminb, xmaxb, yminb, ymaxb; @@ -565,10 +243,6 @@ void RE_parts_init(Render *re, bool do_crop) xparts = (re->rectx + partx - 1) / partx; yparts = (re->recty + party - 1) / party; - /* calculate rotation factor of 1 pixel */ - if (re->r.mode & R_PANORAMA) - re->panophi = panorama_pixel_rot(re); - for (nr = 0; nr < xparts * yparts; nr++) { rcti disprect; int rectx, recty; @@ -601,16 +275,6 @@ void RE_parts_init(Render *re, bool do_crop) if (rectx > 0 && recty > 0) { RenderPart *pa = MEM_callocN(sizeof(RenderPart), "new part"); - /* Non-box filters need 2 pixels extra to work */ - if (do_crop && (re->r.filtertype || (re->r.mode & R_EDGE))) { - pa->crop = 2; - disprect.xmin -= pa->crop; - disprect.ymin -= pa->crop; - disprect.xmax += pa->crop; - disprect.ymax += pa->crop; - rectx += 2 * pa->crop; - recty += 2 * pa->crop; - } pa->disprect = disprect; pa->rectx = rectx; pa->recty = recty; |