diff options
author | Julian Eisel <eiseljulian@gmail.com> | 2015-09-11 02:38:08 +0300 |
---|---|---|
committer | Julian Eisel <eiseljulian@gmail.com> | 2015-09-11 02:38:08 +0300 |
commit | 0f06bef71307a3f5d6b25c5241fcbad7d15b3f5b (patch) | |
tree | 85534371d16cc64fe90798e86c5e7080d90df8d1 /source/blender/blenkernel | |
parent | e6c5611dbced32ddbb54c2558f08a9dcc262f9d2 (diff) | |
parent | 935544671636fd679a607d380c11c4176b22bb6f (diff) |
Merge branch 'master' into wiggly-widgets
Conflicts:
source/blender/editors/transform/transform_manipulator.c
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_customdata.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/camera.c | 25 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/colortools.c | 59 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/customdata.c | 39 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/font.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 105 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/seqeffects.c | 15 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/shrinkwrap.c | 9 |
9 files changed, 187 insertions, 75 deletions
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h index 6fb27cf7577..3e784752f10 100644 --- a/source/blender/blenkernel/BKE_customdata.h +++ b/source/blender/blenkernel/BKE_customdata.h @@ -381,6 +381,10 @@ void CustomData_bmesh_update_active_layers(struct CustomData *fdata, struct Cust void CustomData_bmesh_do_versions_update_active_layers(struct CustomData *fdata, struct CustomData *pdata, struct CustomData *ldata); void CustomData_bmesh_init_pool(struct CustomData *data, int totelem, const char htype); +#ifndef NDEBUG +bool CustomData_from_bmeshpoly_test(CustomData *fdata, CustomData *pdata, CustomData *ldata, bool fallback); +#endif + /* External file storage */ void CustomData_external_add(struct CustomData *data, diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 6c3564167b6..d13786facce 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -593,8 +593,6 @@ void DM_generate_tangent_tessface_data(DerivedMesh *dm, bool generate) if (!polyindex) return; - CustomData_from_bmeshpoly(fdata, pdata, ldata, totface); - if (generate) { for (i = 0; i < ldata->totlayer; i++) { if (ldata->layers[i].type == CD_TANGENT) @@ -603,6 +601,8 @@ void DM_generate_tangent_tessface_data(DerivedMesh *dm, bool generate) CustomData_bmesh_update_active_layers(fdata, pdata, ldata); } + BLI_assert(CustomData_from_bmeshpoly_test(fdata, pdata, ldata, true)); + loopindex = MEM_mallocN(sizeof(*loopindex) * totface, __func__); for (mf_idx = 0, mf = mface; mf_idx < totface; mf_idx++, mf++) { diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c index 807ae9094fd..07ce96461e5 100644 --- a/source/blender/blenkernel/intern/camera.c +++ b/source/blender/blenkernel/intern/camera.c @@ -169,15 +169,15 @@ float BKE_camera_object_dof_distance(Object *ob) if (ob->type != OB_CAMERA) return 0.0f; if (cam->dof_ob) { - /* too simple, better to return the distance on the view axis only - * return len_v3v3(ob->obmat[3], cam->dof_ob->obmat[3]); */ - float mat[4][4], imat[4][4], obmat[4][4]; - - copy_m4_m4(obmat, ob->obmat); - normalize_m4(obmat); - invert_m4_m4(imat, obmat); - mul_m4_m4m4(mat, imat, cam->dof_ob->obmat); - return fabsf(mat[3][2]); +#if 0 + /* too simple, better to return the distance on the view axis only */ + return len_v3v3(ob->obmat[3], cam->dof_ob->obmat[3]); +#else + float view_dir[3], dof_dir[3]; + normalize_v3_v3(view_dir, ob->obmat[2]); + sub_v3_v3v3(dof_dir, ob->obmat[3], cam->dof_ob->obmat[3]); + return fabsf(dot_v3v3(view_dir, dof_dir)); +#endif } return cam->YF_dofdist; } @@ -959,11 +959,6 @@ void BKE_camera_to_gpu_dof(struct Object *camera, struct GPUFXSettings *r_fx_set r_fx_settings->dof = &cam->gpu_dof; r_fx_settings->dof->focal_length = cam->lens; r_fx_settings->dof->sensor = BKE_camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y); - if (cam->dof_ob) { - r_fx_settings->dof->focus_distance = len_v3v3(cam->dof_ob->obmat[3], camera->obmat[3]); - } - else { - r_fx_settings->dof->focus_distance = cam->YF_dofdist; - } + r_fx_settings->dof->focus_distance = BKE_camera_object_dof_distance(camera); } } diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c index aad6681fa2a..acfec306997 100644 --- a/source/blender/blenkernel/intern/colortools.c +++ b/source/blender/blenkernel/intern/colortools.c @@ -975,7 +975,6 @@ void BKE_histogram_update_sample_line(Histogram *hist, ImBuf *ibuf, const ColorM { int i, x, y; const float *fp; - float rgb[3]; unsigned char *cp; int x1 = 0.5f + hist->co[0][0] * ibuf->x; @@ -1004,16 +1003,36 @@ void BKE_histogram_update_sample_line(Histogram *hist, ImBuf *ibuf, const ColorM } else { if (ibuf->rect_float) { + float rgba[4]; fp = (ibuf->rect_float + (ibuf->channels) * (y * ibuf->x + x)); - copy_v3_v3(rgb, fp); - IMB_colormanagement_processor_apply_v3(cm_processor, rgb); + switch (ibuf->channels) { + case 4: + copy_v4_v4(rgba, fp); + IMB_colormanagement_processor_apply_v4(cm_processor, rgba); + break; + case 3: + copy_v3_v3(rgba, fp); + IMB_colormanagement_processor_apply_v3(cm_processor, rgba); + rgba[3] = 1.0f; + break; + case 2: + copy_v3_fl(rgba, fp[0]); + rgba[3] = fp[1]; + break; + case 1: + copy_v3_fl(rgba, fp[0]); + rgba[3] = 1.0f; + break; + default: + BLI_assert(0); + } - hist->data_luma[i] = IMB_colormanagement_get_luminance(rgb); - hist->data_r[i] = rgb[0]; - hist->data_g[i] = rgb[1]; - hist->data_b[i] = rgb[2]; - hist->data_a[i] = fp[3]; + hist->data_luma[i] = IMB_colormanagement_get_luminance(rgba); + hist->data_r[i] = rgba[0]; + hist->data_g[i] = rgba[1]; + hist->data_b[i] = rgba[2]; + hist->data_a[i] = rgba[3]; } else if (ibuf->rect) { cp = (unsigned char *)(ibuf->rect + y * ibuf->x + x); @@ -1148,8 +1167,28 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, const ColorManagedViewSettings * for (x = 0; x < ibuf->x; x++) { float rgba[4], ycc[3], luma; if (is_float) { - copy_v4_v4(rgba, rf); - IMB_colormanagement_processor_apply_v4(cm_processor, rgba); + + switch (ibuf->channels) { + case 4: + copy_v4_v4(rgba, rf); + IMB_colormanagement_processor_apply_v4(cm_processor, rgba); + break; + case 3: + copy_v3_v3(rgba, rf); + IMB_colormanagement_processor_apply_v3(cm_processor, rgba); + rgba[3] = 1.0f; + break; + case 2: + copy_v3_fl(rgba, rf[0]); + rgba[3] = rf[1]; + break; + case 1: + copy_v3_fl(rgba, rf[0]); + rgba[3] = 1.0f; + break; + default: + BLI_assert(0); + } } else { for (c = 0; c < 4; c++) diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 416125e53ad..ed50bdda744 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -2501,6 +2501,10 @@ void CustomData_to_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData *l void CustomData_from_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData *ldata, int total) { int i; + + /* avoid accumulating extra layers */ + BLI_assert(!CustomData_from_bmeshpoly_test(fdata, pdata, ldata, false)); + for (i = 0; i < pdata->totlayer; i++) { if (pdata->layers[i].type == CD_MTEXPOLY) { CustomData_add_layer_named(fdata, CD_MTFACE, CD_CALLOC, NULL, total, pdata->layers[i].name); @@ -2527,6 +2531,41 @@ void CustomData_from_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData CustomData_bmesh_update_active_layers(fdata, pdata, ldata); } +#ifndef NDEBUG +/** + * Debug check, used to assert when we expect layers to be in/out of sync. + * + * \param fallback: Use when there are no layers to handle, + * since callers may expect success or failure. + */ +bool CustomData_from_bmeshpoly_test(CustomData *fdata, CustomData *pdata, CustomData *ldata, bool fallback) +{ + int a_num = 0, b_num = 0; +#define LAYER_CMP(l_a, t_a, l_b, t_b) \ + ((a_num += CustomData_number_of_layers(l_a, t_a)) == (b_num += CustomData_number_of_layers(l_b, t_b))) + + if (!LAYER_CMP(pdata, CD_MTEXPOLY, fdata, CD_MTFACE)) + return false; + if (!LAYER_CMP(ldata, CD_MLOOPCOL, fdata, CD_MCOL)) + return false; + if (!LAYER_CMP(ldata, CD_PREVIEW_MLOOPCOL, fdata, CD_PREVIEW_MCOL)) + return false; + if (!LAYER_CMP(ldata, CD_ORIGSPACE_MLOOP, fdata, CD_ORIGSPACE)) + return false; + if (!LAYER_CMP(ldata, CD_NORMAL, fdata, CD_TESSLOOPNORMAL)) + return false; + if (!LAYER_CMP(ldata, CD_TANGENT, fdata, CD_TANGENT)) + return false; + +#undef TEST_RET + + /* if no layers are on either CustomData's, + * then there was nothing to do... */ + return a_num ? true : fallback; +} +#endif + + void CustomData_bmesh_update_active_layers(CustomData *fdata, CustomData *pdata, CustomData *ldata) { int act; diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c index 2adf8ebc615..23261b63486 100644 --- a/source/blender/blenkernel/intern/font.c +++ b/source/blender/blenkernel/intern/font.c @@ -777,7 +777,7 @@ makebreak: if ((tb_scale.h != 0.0f) && (cu->totbox > (curbox + 1)) && - ((-(yof - tb_scale.y)) > (tb_scale.h - (linedist * cu->fsize)) - yof_scale)) + ((-(yof - tb_scale.y)) > (tb_scale.h - linedist) - yof_scale)) { maxlen = 0; curbox++; diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index ef760f2da26..36aeb97c3f0 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -2578,21 +2578,10 @@ static void image_init_imageuser(Image *ima, ImageUser *iuser) RenderResult *rr = ima->rr; iuser->multi_index = 0; - iuser->layer = iuser->view = 0; - iuser->passtype = SCE_PASS_COMBINED; - - if (rr) { - RenderLayer *rl = rr->layers.first; - - if (rl) { - RenderPass *rp = rl->passes.first; - - if (rp) - iuser->passtype = rp->passtype; - } + iuser->layer = iuser->pass = iuser->view = 0; + if (rr) BKE_image_multilayer_index(rr, iuser); - } } void BKE_image_init_imageuser(Image *ima, ImageUser *iuser) @@ -2740,6 +2729,52 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal) } } +#define PASSTYPE_UNSET -1 +/* return renderpass for a given pass index and active view */ +/* fallback to available if there are missing passes for active view */ +static RenderPass *image_render_pass_get(RenderLayer *rl, const int pass, const int view, int *r_passindex) +{ + RenderPass *rpass_ret = NULL; + RenderPass *rpass; + + int rp_index = 0; + int rp_passtype = PASSTYPE_UNSET; + + for (rpass = rl->passes.first; rpass; rpass = rpass->next, rp_index++) { + if (rp_index == pass) { + rpass_ret = rpass; + if (view == 0) { + /* no multiview or left eye */ + break; + } + else { + rp_passtype = rpass->passtype; + } + } + /* multiview */ + else if ((rp_passtype != PASSTYPE_UNSET) && + (rpass->passtype == rp_passtype) && + (rpass->view_id == view)) + { + rpass_ret = rpass; + break; + } + } + + /* fallback to the first pass in the layer */ + if (rpass_ret == NULL) { + rp_index = 0; + rpass_ret = rl->passes.first; + } + + if (r_passindex) { + *r_passindex = (rpass == rpass_ret ? rp_index : pass); + } + + return rpass_ret; +} +#undef PASSTYPE_UNSET + /* if layer or pass changes, we need an index for the imbufs list */ /* note it is called for rendered results, but it doesnt use the index! */ /* and because rendered results use fake layer/passes, don't correct for wrong indices here */ @@ -2759,27 +2794,16 @@ RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser) if (RE_HasFakeLayer(rr)) rl_index += 1; for (rl = rr->layers.first; rl; rl = rl->next, rl_index++) { - for (rpass = rl->passes.first; rpass; rpass = rpass->next, index++) { - if (iuser->layer == rl_index && - iuser->passtype == rpass->passtype && - rv_index == rpass->view_id) - { - break; - } - } - if (rpass) + if (iuser->layer == rl_index) { + int rp_index; + rpass = image_render_pass_get(rl, iuser->pass, rv_index, &rp_index); + iuser->multi_index = index + rp_index; break; + } + else { + index += BLI_listbase_count(&rl->passes); + } } - iuser->multi_index = (rpass ? index : 0); - } - - if (rpass == NULL) { - rl = rr->layers.first; - if (rl) - rpass = rl->passes.first; - - if (rpass && iuser) - iuser->passtype = rpass->passtype; } return rpass; @@ -3613,7 +3637,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_loc float *rectf, *rectz; unsigned int *rect; float dither; - int channels, layer, passtype; + int channels, layer, pass; ImBuf *ibuf; int from_render = (ima->render_slot == ima->last_render_slot); int actview; @@ -3630,7 +3654,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_loc channels = 4; layer = iuser->layer; - passtype = iuser->passtype; + pass = iuser->pass; actview = iuser->view; if ((ima->flag & IMA_IS_STEREO) && (iuser->flag & IMA_SHOW_STEREO)) @@ -3693,19 +3717,10 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_loc else if (rres.layers.first) { RenderLayer *rl = BLI_findlink(&rres.layers, layer - (rres.have_combined ? 1 : 0)); if (rl) { - RenderPass *rpass; - - for (rpass = rl->passes.first; rpass; rpass = rpass->next) { - if (passtype == rpass->passtype && - actview == rpass->view_id) - { - break; - } - } - + RenderPass *rpass = image_render_pass_get(rl, pass, actview, NULL); if (rpass) { rectf = rpass->rect; - if (passtype == SCE_PASS_COMBINED) { + if (pass == 0) { if (rectf == NULL) { /* Happens when Save Buffers is enabled. * Use display buffer stored in the render layer. diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c index 3e6edbe01e8..1333d28960c 100644 --- a/source/blender/blenkernel/intern/seqeffects.c +++ b/source/blender/blenkernel/intern/seqeffects.c @@ -43,6 +43,7 @@ #include "DNA_scene_types.h" #include "DNA_sequence_types.h" #include "DNA_anim_types.h" +#include "DNA_space_types.h" #include "BKE_fcurve.h" #include "BKE_sequencer.h" @@ -2480,7 +2481,7 @@ void BKE_sequence_effect_speed_rebuild_map(Scene *scene, Sequence *seq, bool for if ((seq->seq1->enddisp != seq->seq1->start) && (seq->seq1->len != 0)) { - fallback_fac = 1.0f; + fallback_fac = (float) seq->seq1->len / (float) (seq->seq1->enddisp - seq->seq1->start); flags = SEQ_SPEED_INTEGRATE; fcu = NULL; } @@ -2920,12 +2921,22 @@ static ImBuf *do_text_effect(const SeqRenderData *context, Sequence *seq, float const char *display_device; const int mono = blf_mono_font_render; // XXX int y_ofs, x, y; + float proxy_size_comp; display_device = context->scene->display_settings.display_device; display = IMB_colormanagement_display_get_named(display_device); + /* Compensate text size for preview render size. */ + if (context->preview_render_size == SEQ_PROXY_RENDER_SIZE_100) { + /* Should be rendered at 100%, but context->preview_render_size = 99 right now. */ + proxy_size_comp = 1.0f; + } + else { + proxy_size_comp = context->preview_render_size / 100.0f; + } + /* set before return */ - BLF_size(mono, (context->scene->r.size / 100.0f) * data->text_size, 72); + BLF_size(mono, proxy_size_comp * (context->scene->r.size / 100) * data->text_size, 72); BLF_buffer(mono, out->rect_float, (unsigned char *)out->rect, width, height, out->channels, display); diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index 5ecd2fc74e8..7d492586b7d 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -50,6 +50,7 @@ #include "BKE_lattice.h" #include "BKE_deform.h" +#include "BKE_editmesh.h" #include "BKE_mesh.h" /* for OMP limits. */ #include "BKE_subsurf.h" @@ -278,6 +279,14 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, bool for BLI_SPACE_TRANSFORM_SETUP(&local2aux, calc->ob, calc->smd->auxTarget); } + /* use editmesh to avoid array allocation */ + if (calc->smd->target && calc->target->type == DM_TYPE_EDITBMESH) { + treeData.em_evil = BKE_editmesh_from_object(calc->smd->target); + } + if (calc->smd->auxTarget && auxMesh->type == DM_TYPE_EDITBMESH) { + auxData.em_evil = BKE_editmesh_from_object(calc->smd->auxTarget); + } + /* After sucessufuly build the trees, start projection vertexs */ if (bvhtree_from_mesh_looptri(&treeData, calc->target, 0.0, 4, 6) && (auxMesh == NULL || bvhtree_from_mesh_looptri(&auxData, auxMesh, 0.0, 4, 6))) |