diff options
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 41 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/brush.c | 42 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/crazyspace.c | 33 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/curve.c | 42 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/customdata.c | 94 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/depsgraph.c | 26 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/effect.c | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/font.c | 43 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/lattice.c | 113 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/pbvh_bmesh.c | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/screen.c | 26 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/seqeffects.c | 86 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/sequencer.c | 20 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 24 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/tracking.c | 20 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/tracking_region_tracker.c | 46 |
17 files changed, 411 insertions, 261 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index d0ddd293a38..9ff9991f5a6 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -44,6 +44,7 @@ #include "DNA_scene_types.h" #include "BLI_blenlib.h" +#include "BLI_bitmap.h" #include "BLI_math.h" #include "BLI_utildefines.h" #include "BLI_linklist.h" @@ -2579,6 +2580,46 @@ DMCoNo *mesh_get_mapped_verts_nors(Scene *scene, Object *ob) #endif +/* same as above but for vert coords */ +typedef struct { + float (*vertexcos)[3]; + BLI_bitmap *vertex_visit; +} MappedUserData; + +static void make_vertexcos__mapFunc(void *userData, int index, const float co[3], + const float UNUSED(no_f[3]), const short UNUSED(no_s[3])) +{ + MappedUserData *mappedData = (MappedUserData *)userData; + + if (BLI_BITMAP_TEST(mappedData->vertex_visit, index) == 0) { + /* we need coord from prototype vertex, not from copies, + * assume they stored in the beginning of vertex array stored in DM + * (mirror modifier for eg does this) */ + copy_v3_v3(mappedData->vertexcos[index], co); + BLI_BITMAP_ENABLE(mappedData->vertex_visit, index); + } +} + +void mesh_get_mapped_verts_coords(DerivedMesh *dm, float (*r_cos)[3], const int totcos) +{ + float (*vertexcos)[3]; + + if (dm->foreachMappedVert) { + MappedUserData userData; + memset(r_cos, 0, sizeof(*r_cos) * totcos); + userData.vertexcos = r_cos; + userData.vertex_visit = BLI_BITMAP_NEW(totcos, "vertexcos flags"); + dm->foreachMappedVert(dm, make_vertexcos__mapFunc, &userData, DM_FOREACH_NOP); + MEM_freeN(userData.vertex_visit); + } + else { + int i; + for (i = 0; i < totcos; i++) { + dm->getVertCo(dm, i, vertexcos[i]); + } + } +} + /* ******************* GLSL ******************** */ typedef struct { diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index cfdb1aa7a96..76b0cad337f 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -930,39 +930,27 @@ void BKE_brush_scale_size(int *r_brush_size, void BKE_brush_jitter_pos(const Scene *scene, Brush *brush, const float pos[2], float jitterpos[2]) { - int use_jitter = (brush->flag & BRUSH_ABSOLUTE_JITTER) ? - (brush->jitter_absolute != 0) : (brush->jitter != 0); + float rand_pos[2]; + float spread; + int diameter; - /* jitter-ed brush gives weird and unpredictable result for this - * kinds of stroke, so manually disable jitter usage (sergey) */ - use_jitter &= (brush->flag & (BRUSH_DRAG_DOT | BRUSH_ANCHORED)) == 0; + do { + rand_pos[0] = BLI_rng_get_float(brush_rng) - 0.5f; + rand_pos[1] = BLI_rng_get_float(brush_rng) - 0.5f; + } while (len_squared_v2(rand_pos) > (0.5f * 0.5f)); - if (use_jitter) { - float rand_pos[2]; - float spread; - int diameter; - do { - rand_pos[0] = BLI_rng_get_float(brush_rng) - 0.5f; - rand_pos[1] = BLI_rng_get_float(brush_rng) - 0.5f; - } while (len_squared_v2(rand_pos) > (0.5f * 0.5f)); - - - if (brush->flag & BRUSH_ABSOLUTE_JITTER) { - diameter = 2 * brush->jitter_absolute; - spread = 1.0; - } - else { - diameter = 2 * BKE_brush_size_get(scene, brush); - spread = brush->jitter; - } - /* find random position within a circle of diameter 1 */ - jitterpos[0] = pos[0] + 2 * rand_pos[0] * diameter * spread; - jitterpos[1] = pos[1] + 2 * rand_pos[1] * diameter * spread; + if (brush->flag & BRUSH_ABSOLUTE_JITTER) { + diameter = 2 * brush->jitter_absolute; + spread = 1.0; } else { - copy_v2_v2(jitterpos, pos); + diameter = 2 * BKE_brush_size_get(scene, brush); + spread = brush->jitter; } + /* find random position within a circle of diameter 1 */ + jitterpos[0] = pos[0] + 2 * rand_pos[0] * diameter * spread; + jitterpos[1] = pos[1] + 2 * rand_pos[1] * diameter * spread; } void BKE_brush_randomize_texture_coordinates(UnifiedPaintSettings *ups, bool mask) diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index bebc1c35357..08052127fbf 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -801,7 +801,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm, glBegin(mf->v4 ? GL_QUADS : GL_TRIANGLES); if (tf) glTexCoord2fv(tf->uv[0]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf->uv[0]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf->uv[0]); if (cp) glColor3ub(cp[3], cp[2], cp[1]); mvert = &mv[mf->v1]; if (lnors) glNormal3sv((const GLshort *)lnors[0][0]); @@ -809,7 +809,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm, glVertex3fv(mvert->co); if (tf) glTexCoord2fv(tf->uv[1]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf->uv[1]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf->uv[1]); if (cp) glColor3ub(cp[7], cp[6], cp[5]); mvert = &mv[mf->v2]; if (lnors) glNormal3sv((const GLshort *)lnors[0][1]); @@ -817,7 +817,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm, glVertex3fv(mvert->co); if (tf) glTexCoord2fv(tf->uv[2]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf->uv[2]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf->uv[2]); if (cp) glColor3ub(cp[11], cp[10], cp[9]); mvert = &mv[mf->v3]; if (lnors) glNormal3sv((const GLshort *)lnors[0][2]); @@ -826,7 +826,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm, if (mf->v4) { if (tf) glTexCoord2fv(tf->uv[3]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf->uv[3]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf->uv[3]); if (cp) glColor3ub(cp[15], cp[14], cp[13]); mvert = &mv[mf->v4]; if (lnors) glNormal3sv((const GLshort *)lnors[0][3]); diff --git a/source/blender/blenkernel/intern/crazyspace.c b/source/blender/blenkernel/intern/crazyspace.c index 7ca5d6b4f28..911bb19a594 100644 --- a/source/blender/blenkernel/intern/crazyspace.c +++ b/source/blender/blenkernel/intern/crazyspace.c @@ -40,7 +40,6 @@ #include "BLI_utildefines.h" #include "BLI_math.h" -#include "BLI_bitmap.h" #include "BKE_crazyspace.h" #include "BKE_DerivedMesh.h" @@ -49,11 +48,6 @@ #include "BKE_mesh.h" #include "BKE_editmesh.h" -typedef struct { - float (*vertexcos)[3]; - BLI_bitmap *vertex_visit; -} MappedUserData; - BLI_INLINE void tan_calc_quat_v3( float r_quat[4], const float co_1[3], const float co_2[3], const float co_3[3]) @@ -88,20 +82,6 @@ static void set_crazy_vertex_quat( sub_qt_qtqt(r_quat, q2, q1); } -static void make_vertexcos__mapFunc(void *userData, int index, const float co[3], - const float UNUSED(no_f[3]), const short UNUSED(no_s[3])) -{ - MappedUserData *mappedData = (MappedUserData *)userData; - - if (BLI_BITMAP_TEST(mappedData->vertex_visit, index) == 0) { - /* we need coord from prototype vertex, not from copies, - * assume they stored in the beginning of vertex array stored in DM - * (mirror modifier for eg does this) */ - copy_v3_v3(mappedData->vertexcos[index], co); - BLI_BITMAP_ENABLE(mappedData->vertex_visit, index); - } -} - static int modifiers_disable_subsurf_temporary(Object *ob) { ModifierData *md; @@ -124,8 +104,6 @@ float (*BKE_crazyspace_get_mapped_editverts(Scene *scene, Object *obedit))[3] DerivedMesh *dm; float (*vertexcos)[3]; int nverts = me->edit_btmesh->bm->totvert; - BLI_bitmap *vertex_visit; - MappedUserData userData; /* disable subsurf temporal, get mapped cos, and enable it */ if (modifiers_disable_subsurf_temporary(obedit)) { @@ -134,22 +112,17 @@ float (*BKE_crazyspace_get_mapped_editverts(Scene *scene, Object *obedit))[3] } /* now get the cage */ - dm = editbmesh_get_derived_cage(scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH); + vertexcos = MEM_mallocN(sizeof(*vertexcos) * nverts, "vertexcos map"); - vertexcos = MEM_callocN(sizeof(*vertexcos) * nverts, "vertexcos map"); - vertex_visit = BLI_BITMAP_NEW(nverts, "vertexcos flags"); + dm = editbmesh_get_derived_cage(scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH); - userData.vertexcos = vertexcos; - userData.vertex_visit = vertex_visit; - dm->foreachMappedVert(dm, make_vertexcos__mapFunc, &userData, DM_FOREACH_NOP); + mesh_get_mapped_verts_coords(dm, vertexcos, nverts); dm->release(dm); /* set back the flag, no new cage needs to be built, transform does it */ modifiers_disable_subsurf_temporary(obedit); - MEM_freeN(vertex_visit); - return vertexcos; } diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 730bffd2509..a06834f61b3 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -2605,7 +2605,6 @@ void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render) bp = nu->bp; seglen = bl->seglen; segbevcount = bl->segbevcount; - BLI_assert(segcount >= len); while (len--) { copy_v3_v3(bevp->vec, bp->vec); @@ -3209,7 +3208,13 @@ static void calchandleNurb_intern(BezTriple *bezt, BezTriple *prev, BezTriple *n madd_v3_v3v3fl(p2_h2, p2, dvec_b, 1.0f / 3.0f); } - if (skip_align || (!ELEM(HD_ALIGN, bezt->h1, bezt->h2) && !ELEM(HD_ALIGN_DOUBLESIDE, bezt->h1, bezt->h2))) { + if (skip_align || + /* when one handle is free, alignming makes no sense, see: T35952 */ + (ELEM(HD_FREE, bezt->h1, bezt->h2)) || + /* also when no handles are aligned, skip this step */ + (!ELEM(HD_ALIGN, bezt->h1, bezt->h2) && + !ELEM(HD_ALIGN_DOUBLESIDE, bezt->h1, bezt->h2))) + { /* handles need to be updated during animation and applying stuff like hooks, * but in such situations it's quite difficult to distinguish in which order * align handles should be aligned so skip them for now */ @@ -3307,6 +3312,31 @@ void BKE_nurb_handles_calc(Nurb *nu) /* first, if needed, set handle flags */ calchandlesNurb_intern(nu, false); } +/** + * Workaround #BKE_nurb_handles_calc logic + * that makes unselected align to the selected handle. + */ +static void nurbList_handles_swap_select(Nurb *nu) +{ + BezTriple *bezt; + int i; + + for (i = nu->pntsu, bezt = nu->bezt; i--; bezt++) { + if ((bezt->f1 & SELECT) != (bezt->f3 & SELECT)) { + bezt->f1 ^= SELECT; + bezt->f3 ^= SELECT; + } + } +} + +/* internal use only (weak) */ +static void nurb_handles_calc__align_selected(Nurb *nu) +{ + nurbList_handles_swap_select(nu); + BKE_nurb_handles_calc(nu); + nurbList_handles_swap_select(nu); +} + /* similar to BKE_nurb_handle_calc but for curves and * figures out the previous and next for us */ void BKE_nurb_handle_calc_simple(Nurb *nu, BezTriple *bezt) @@ -3504,7 +3534,9 @@ void BKE_nurbList_handles_set(ListBase *editnurb, const char code) } bezt++; } - BKE_nurb_handles_calc(nu); + + /* like BKE_nurb_handles_calc but moves selected */ + nurb_handles_calc__align_selected(nu); } nu = nu->next; } @@ -3548,7 +3580,9 @@ void BKE_nurbList_handles_set(ListBase *editnurb, const char code) bezt++; } - BKE_nurb_handles_calc(nu); + + /* like BKE_nurb_handles_calc but moves selected */ + nurb_handles_calc__align_selected(nu); } } } diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index fd4350123b4..ab3cf5851e9 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -129,21 +129,21 @@ typedef struct LayerTypeInfo { void (*set_default)(void *data, int count); /** functions necessary for geometry collapse */ - bool (*equal)(void *data1, void *data2); + bool (*equal)(const void *data1, const void *data2); void (*multiply)(void *data, float fac); void (*initminmax)(void *min, void *max); - void (*add)(void *data1, void *data2); - void (*dominmax)(void *data1, void *min, void *max); - void (*copyvalue)(void *source, void *dest); + void (*add)(void *data1, const void *data2); + void (*dominmax)(const void *data1, void *min, void *max); + void (*copyvalue)(const void *source, void *dest); /** a function to read data from a cdf file */ int (*read)(CDataFile *cdf, void *data, int count); /** a function to write data to a cdf file */ - int (*write)(CDataFile *cdf, void *data, int count); + int (*write)(CDataFile *cdf, const void *data, int count); /** a function to determine file size */ - size_t (*filesize)(CDataFile *cdf, void *data, int count); + size_t (*filesize)(CDataFile *cdf, const void *data, int count); } LayerTypeInfo; static void layerCopy_mdeformvert(const void *source, void *dest, @@ -552,9 +552,9 @@ static int layerRead_mdisps(CDataFile *cdf, void *data, int count) return 1; } -static int layerWrite_mdisps(CDataFile *cdf, void *data, int count) +static int layerWrite_mdisps(CDataFile *cdf, const void *data, int count) { - MDisps *d = data; + const MDisps *d = data; int i; for (i = 0; i < count; ++i) { @@ -567,9 +567,9 @@ static int layerWrite_mdisps(CDataFile *cdf, void *data, int count) return 1; } -static size_t layerFilesize_mdisps(CDataFile *UNUSED(cdf), void *data, int count) +static size_t layerFilesize_mdisps(CDataFile *UNUSED(cdf), const void *data, int count) { - MDisps *d = data; + const MDisps *d = data; size_t size = 0; int i; @@ -612,9 +612,10 @@ static void layerFree_grid_paint_mask(void *data, int count, int UNUSED(size)) } /* --------- */ -static void layerCopyValue_mloopcol(void *source, void *dest) +static void layerCopyValue_mloopcol(const void *source, void *dest) { - MLoopCol *m1 = source, *m2 = dest; + const MLoopCol *m1 = source; + MLoopCol *m2 = dest; m2->r = m1->r; m2->g = m1->g; @@ -622,9 +623,9 @@ static void layerCopyValue_mloopcol(void *source, void *dest) m2->a = m1->a; } -static bool layerEqual_mloopcol(void *data1, void *data2) +static bool layerEqual_mloopcol(const void *data1, const void *data2) { - MLoopCol *m1 = data1, *m2 = data2; + const MLoopCol *m1 = data1, *m2 = data2; float r, g, b, a; r = m1->r - m2->r; @@ -645,9 +646,10 @@ static void layerMultiply_mloopcol(void *data, float fac) m->a = (float)m->a * fac; } -static void layerAdd_mloopcol(void *data1, void *data2) +static void layerAdd_mloopcol(void *data1, const void *data2) { - MLoopCol *m = data1, *m2 = data2; + MLoopCol *m = data1; + const MLoopCol *m2 = data2; m->r += m2->r; m->g += m2->g; @@ -655,9 +657,9 @@ static void layerAdd_mloopcol(void *data1, void *data2) m->a += m2->a; } -static void layerDoMinMax_mloopcol(void *data, void *vmin, void *vmax) +static void layerDoMinMax_mloopcol(const void *data, void *vmin, void *vmax) { - MLoopCol *m = data; + const MLoopCol *m = data; MLoopCol *min = vmin, *max = vmax; if (m->r < min->r) min->r = m->r; @@ -743,16 +745,17 @@ static void layerInterp_mloopcol(void **sources, const float *weights, mc->a = (int)col.a; } -static void layerCopyValue_mloopuv(void *source, void *dest) +static void layerCopyValue_mloopuv(const void *source, void *dest) { - MLoopUV *luv1 = source, *luv2 = dest; + const MLoopUV *luv1 = source; + MLoopUV *luv2 = dest; copy_v2_v2(luv2->uv, luv1->uv); } -static bool layerEqual_mloopuv(void *data1, void *data2) +static bool layerEqual_mloopuv(const void *data1, const void *data2) { - MLoopUV *luv1 = data1, *luv2 = data2; + const MLoopUV *luv1 = data1, *luv2 = data2; return len_squared_v2v2(luv1->uv, luv2->uv) < 0.00001f; } @@ -771,16 +774,18 @@ static void layerInitMinMax_mloopuv(void *vmin, void *vmax) INIT_MINMAX2(min->uv, max->uv); } -static void layerDoMinMax_mloopuv(void *data, void *vmin, void *vmax) +static void layerDoMinMax_mloopuv(const void *data, void *vmin, void *vmax) { - MLoopUV *min = vmin, *max = vmax, *luv = data; + const MLoopUV *luv = data; + MLoopUV *min = vmin, *max = vmax; minmax_v2v2_v2(min->uv, max->uv, luv->uv); } -static void layerAdd_mloopuv(void *data1, void *data2) +static void layerAdd_mloopuv(void *data1, const void *data2) { - MLoopUV *l1 = data1, *l2 = data2; + MLoopUV *l1 = data1; + const MLoopUV *l2 = data2; add_v2_v2(l1->uv, l2->uv); } @@ -815,16 +820,17 @@ static void layerInterp_mloopuv(void **sources, const float *weights, } /* origspace is almost exact copy of mloopuv's, keep in sync */ -static void layerCopyValue_mloop_origspace(void *source, void *dest) +static void layerCopyValue_mloop_origspace(const void *source, void *dest) { - OrigSpaceLoop *luv1 = source, *luv2 = dest; + const OrigSpaceLoop *luv1 = source; + OrigSpaceLoop *luv2 = dest; copy_v2_v2(luv2->uv, luv1->uv); } -static bool layerEqual_mloop_origspace(void *data1, void *data2) +static bool layerEqual_mloop_origspace(const void *data1, const void *data2) { - OrigSpaceLoop *luv1 = data1, *luv2 = data2; + const OrigSpaceLoop *luv1 = data1, *luv2 = data2; return len_squared_v2v2(luv1->uv, luv2->uv) < 0.00001f; } @@ -843,16 +849,18 @@ static void layerInitMinMax_mloop_origspace(void *vmin, void *vmax) INIT_MINMAX2(min->uv, max->uv); } -static void layerDoMinMax_mloop_origspace(void *data, void *vmin, void *vmax) +static void layerDoMinMax_mloop_origspace(const void *data, void *vmin, void *vmax) { - OrigSpaceLoop *min = vmin, *max = vmax, *luv = data; + const OrigSpaceLoop *luv = data; + OrigSpaceLoop *min = vmin, *max = vmax; minmax_v2v2_v2(min->uv, max->uv, luv->uv); } -static void layerAdd_mloop_origspace(void *data1, void *data2) +static void layerAdd_mloop_origspace(void *data1, const void *data2) { - OrigSpaceLoop *l1 = data1, *l2 = data2; + OrigSpaceLoop *l1 = data1; + const OrigSpaceLoop *l2 = data2; add_v2_v2(l1->uv, l2->uv); } @@ -2661,7 +2669,7 @@ void *CustomData_bmesh_get_layer_n(const CustomData *data, void *block, int n) return (char *)block + data->layers[n].offset; } -bool CustomData_layer_has_math(struct CustomData *data, int layer_n) +bool CustomData_layer_has_math(const struct CustomData *data, int layer_n) { const LayerTypeInfo *typeInfo = layerType_getInfo(data->layers[layer_n].type); @@ -2674,7 +2682,7 @@ bool CustomData_layer_has_math(struct CustomData *data, int layer_n) return false; } -bool CustomData_layer_has_interp(struct CustomData *data, int layer_n) +bool CustomData_layer_has_interp(const struct CustomData *data, int layer_n) { const LayerTypeInfo *typeInfo = layerType_getInfo(data->layers[layer_n].type); @@ -2685,7 +2693,7 @@ bool CustomData_layer_has_interp(struct CustomData *data, int layer_n) return false; } -bool CustomData_has_math(struct CustomData *data) +bool CustomData_has_math(const struct CustomData *data) { int i; @@ -2700,7 +2708,7 @@ bool CustomData_has_math(struct CustomData *data) } /* a non bmesh version would have to check layer->data */ -bool CustomData_bmesh_has_free(struct CustomData *data) +bool CustomData_bmesh_has_free(const struct CustomData *data) { const LayerTypeInfo *typeInfo; int i; @@ -2716,7 +2724,7 @@ bool CustomData_bmesh_has_free(struct CustomData *data) return false; } -bool CustomData_has_interp(struct CustomData *data) +bool CustomData_has_interp(const struct CustomData *data) { int i; @@ -2732,7 +2740,7 @@ bool CustomData_has_interp(struct CustomData *data) /* copies the "value" (e.g. mloopuv uv or mloopcol colors) from one block to * another, while not overwriting anything else (e.g. flags)*/ -void CustomData_data_copy_value(int type, void *source, void *dest) +void CustomData_data_copy_value(int type, const void *source, void *dest) { const LayerTypeInfo *typeInfo = layerType_getInfo(type); @@ -2744,7 +2752,7 @@ void CustomData_data_copy_value(int type, void *source, void *dest) memcpy(dest, source, typeInfo->size); } -bool CustomData_data_equals(int type, void *data1, void *data2) +bool CustomData_data_equals(int type, const void *data1, const void *data2) { const LayerTypeInfo *typeInfo = layerType_getInfo(type); @@ -2762,7 +2770,7 @@ void CustomData_data_initminmax(int type, void *min, void *max) } -void CustomData_data_dominmax(int type, void *data, void *min, void *max) +void CustomData_data_dominmax(int type, const void *data, void *min, void *max) { const LayerTypeInfo *typeInfo = layerType_getInfo(type); @@ -2780,7 +2788,7 @@ void CustomData_data_multiply(int type, void *data, float fac) } -void CustomData_data_add(int type, void *data1, void *data2) +void CustomData_data_add(int type, void *data1, const void *data2) { const LayerTypeInfo *typeInfo = layerType_getInfo(type); diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index eecc04c1e72..93bb4849718 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -62,6 +62,7 @@ #include "BKE_anim.h" #include "BKE_animsys.h" #include "BKE_action.h" +#include "BKE_DerivedMesh.h" #include "BKE_effect.h" #include "BKE_fcurve.h" #include "BKE_global.h" @@ -80,6 +81,8 @@ #include "BKE_screen.h" #include "BKE_tracking.h" +#include "GPU_buffers.h" + #include "atomic_ops.h" #include "depsgraph_private.h" @@ -1771,7 +1774,8 @@ static unsigned int flush_layer_node(Scene *sce, DagNode *node, int curtime) } /* node was checked to have lasttime != curtime, and is of type ID_OB */ -static void flush_pointcache_reset(Main *bmain, Scene *scene, DagNode *node, int curtime, int reset) +static void flush_pointcache_reset(Main *bmain, Scene *scene, DagNode *node, + int curtime, unsigned int lay, bool reset) { DagAdjList *itA; Object *ob; @@ -1785,14 +1789,17 @@ static void flush_pointcache_reset(Main *bmain, Scene *scene, DagNode *node, int if (reset || (ob->recalc & OB_RECALC_ALL)) { if (BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_DEPSGRAPH)) { - ob->recalc |= OB_RECALC_DATA; - lib_id_recalc_data_tag(bmain, &ob->id); + /* Don't tag nodes which are on invisible layer. */ + if (itA->node->lay & lay) { + ob->recalc |= OB_RECALC_DATA; + lib_id_recalc_data_tag(bmain, &ob->id); + } } - flush_pointcache_reset(bmain, scene, itA->node, curtime, 1); + flush_pointcache_reset(bmain, scene, itA->node, curtime, lay, true); } else - flush_pointcache_reset(bmain, scene, itA->node, curtime, 0); + flush_pointcache_reset(bmain, scene, itA->node, curtime, lay, false); } } } @@ -1909,10 +1916,12 @@ void DAG_scene_flush_update(Main *bmain, Scene *sce, unsigned int lay, const sho lib_id_recalc_data_tag(bmain, &ob->id); } - flush_pointcache_reset(bmain, sce, itA->node, lasttime, 1); + flush_pointcache_reset(bmain, sce, itA->node, lasttime, + lay, true); } else - flush_pointcache_reset(bmain, sce, itA->node, lasttime, 0); + flush_pointcache_reset(bmain, sce, itA->node, lasttime, + lay, false); } } } @@ -2499,9 +2508,8 @@ static void dag_id_flush_update(Main *bmain, Scene *sce, ID *id) if (ELEM(idtype, ID_MA, ID_TE)) { obt = sce->basact ? sce->basact->object : NULL; if (obt && obt->mode & OB_MODE_TEXTURE_PAINT) { - obt->recalc |= OB_RECALC_DATA; BKE_texpaint_slots_refresh_object(sce, obt); - lib_id_recalc_data_tag(bmain, &obt->id); + GPU_drawobject_free(obt->derivedFinal); } } diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c index 4859aa8f791..24ee470eaa7 100644 --- a/source/blender/blenkernel/intern/effect.c +++ b/source/blender/blenkernel/intern/effect.c @@ -630,8 +630,7 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin } else { /* use center of object for distance calculus */ - Object *ob = eff->ob; - Object obcopy = *ob; + const Object *ob = eff->ob; /* use z-axis as normal*/ normalize_v3_v3(efd->nor, ob->obmat[2]); @@ -654,8 +653,6 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin if (real_velocity) copy_v3_v3(efd->vel, eff->velocity); - *eff->ob = obcopy; - efd->size = 0.0f; ret = 1; diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c index 3b53c579496..8d4bb7ec058 100644 --- a/source/blender/blenkernel/intern/font.c +++ b/source/blender/blenkernel/intern/font.c @@ -484,24 +484,51 @@ int BKE_vfont_select_get(Object *ob, int *r_start, int *r_end) { Curve *cu = ob->data; EditFont *ef = cu->editfont; + int start, end, direction; if ((ob->type != OB_FONT) || (ef == NULL)) return 0; + BLI_assert(ef->len >= 0); BLI_assert(ef->selstart >= 0 && ef->selstart <= ef->len + 1); - BLI_assert(ef->selend >= 0 && ef->selend <= ef->len + 1); + BLI_assert(ef->selend >= 0 && ef->selend <= ef->len); BLI_assert(ef->pos >= 0 && ef->pos <= ef->len); - if (ef->selstart == 0) return 0; + if (ef->selstart == 0) { + return 0; + } + if (ef->selstart <= ef->selend) { - *r_start = ef->selstart - 1; - *r_end = ef->selend - 1; - return 1; + start = ef->selstart - 1; + end = ef->selend - 1; + direction = 1; } else { - *r_start = ef->selend; - *r_end = ef->selstart - 2; - return -1; + start = ef->selend; + end = ef->selstart - 2; + direction = -1; + } + + if (start == end + 1) { + return 0; } + else { + BLI_assert(start < end + 1); + *r_start = start; + *r_end = end; + return direction; + } +} + +void BKE_vfont_select_clamp(Object *ob) +{ + Curve *cu = ob->data; + EditFont *ef = cu->editfont; + + BLI_assert((ob->type == OB_FONT) && ef); + + CLAMP_MAX(ef->pos, ef->len); + CLAMP_MAX(ef->selstart, ef->len + 1); + CLAMP_MAX(ef->selend, ef->len); } static float char_width(Curve *cu, VChar *che, CharInfo *info) diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 1f609852af2..3f12e3efcc7 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -729,7 +729,8 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target, DerivedMesh Curve *cu; int a; CurveDeform cd; - int use_vgroups; + MDeformVert *dvert = NULL; + int defgrp_index = -1; const bool is_neg_axis = (defaxis > 2); if (cuOb->type != OB_CURVE) @@ -750,75 +751,63 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target, DerivedMesh cd.dmax[0] = cd.dmax[1] = cd.dmax[2] = 0.0f; } - /* check whether to use vertex groups (only possible if target is a Mesh) - * we want either a Mesh with no derived data, or derived data with - * deformverts + /* Check whether to use vertex groups (only possible if target is a Mesh or Lattice). + * We want either a Mesh/Lattice with no derived data, or derived data with deformverts. */ - if (target->type == OB_MESH) { - /* if there's derived data without deformverts, don't use vgroups */ - if (dm) { - use_vgroups = (dm->getVertData(dm, 0, CD_MDEFORMVERT) != NULL); - } - else { - Mesh *me = target->data; - use_vgroups = (me->dvert != NULL); + if (vgroup && vgroup[0] && ELEM(target->type, OB_MESH, OB_LATTICE)) { + defgrp_index = defgroup_name_index(target, vgroup); + + if (defgrp_index != -1) { + /* if there's derived data without deformverts, don't use vgroups */ + if (dm) { + dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + } + else if (target->type == OB_LATTICE) { + dvert = ((Lattice *)target->data)->dvert; + } + else { + dvert = ((Mesh *)target->data)->dvert; + } } } - else { - use_vgroups = false; - } - - if (vgroup && vgroup[0] && use_vgroups) { - Mesh *me = target->data; - const int defgrp_index = defgroup_name_index(target, vgroup); - if (defgrp_index != -1 && (me->dvert || dm)) { - MDeformVert *dvert = me->dvert; - float vec[3]; - float weight; - + if (dvert) { + MDeformVert *dvert_iter; + float vec[3]; - if (cu->flag & CU_DEFORM_BOUNDS_OFF) { - dvert = me->dvert; - for (a = 0; a < numVerts; a++, dvert++) { - if (dm) dvert = dm->getVertData(dm, a, CD_MDEFORMVERT); - weight = defvert_find_weight(dvert, defgrp_index); - - if (weight > 0.0f) { - mul_m4_v3(cd.curvespace, vertexCos[a]); - copy_v3_v3(vec, vertexCos[a]); - calc_curve_deform(scene, cuOb, vec, defaxis, &cd, NULL); - interp_v3_v3v3(vertexCos[a], vertexCos[a], vec, weight); - mul_m4_v3(cd.objectspace, vertexCos[a]); - } + if (cu->flag & CU_DEFORM_BOUNDS_OFF) { + for (a = 0, dvert_iter = dvert; a < numVerts; a++, dvert_iter++) { + const float weight = defvert_find_weight(dvert_iter, defgrp_index); + + if (weight > 0.0f) { + mul_m4_v3(cd.curvespace, vertexCos[a]); + copy_v3_v3(vec, vertexCos[a]); + calc_curve_deform(scene, cuOb, vec, defaxis, &cd, NULL); + interp_v3_v3v3(vertexCos[a], vertexCos[a], vec, weight); + mul_m4_v3(cd.objectspace, vertexCos[a]); } } - else { - /* set mesh min/max bounds */ - INIT_MINMAX(cd.dmin, cd.dmax); - - for (a = 0; a < numVerts; a++, dvert++) { - if (dm) dvert = dm->getVertData(dm, a, CD_MDEFORMVERT); - - if (defvert_find_weight(dvert, defgrp_index) > 0.0f) { - mul_m4_v3(cd.curvespace, vertexCos[a]); - minmax_v3v3_v3(cd.dmin, cd.dmax, vertexCos[a]); - } + } + else { + /* set mesh min/max bounds */ + INIT_MINMAX(cd.dmin, cd.dmax); + + for (a = 0, dvert_iter = dvert; a < numVerts; a++, dvert_iter++) { + if (defvert_find_weight(dvert_iter, defgrp_index) > 0.0f) { + mul_m4_v3(cd.curvespace, vertexCos[a]); + minmax_v3v3_v3(cd.dmin, cd.dmax, vertexCos[a]); } - - dvert = me->dvert; - for (a = 0; a < numVerts; a++, dvert++) { - if (dm) dvert = dm->getVertData(dm, a, CD_MDEFORMVERT); - - weight = defvert_find_weight(dvert, defgrp_index); - - if (weight > 0.0f) { - /* already in 'cd.curvespace', prev for loop */ - copy_v3_v3(vec, vertexCos[a]); - calc_curve_deform(scene, cuOb, vec, defaxis, &cd, NULL); - interp_v3_v3v3(vertexCos[a], vertexCos[a], vec, weight); - mul_m4_v3(cd.objectspace, vertexCos[a]); - } + } + + for (a = 0, dvert_iter = dvert; a < numVerts; a++, dvert_iter++) { + const float weight = defvert_find_weight(dvert_iter, defgrp_index); + + if (weight > 0.0f) { + /* already in 'cd.curvespace', prev for loop */ + copy_v3_v3(vec, vertexCos[a]); + calc_curve_deform(scene, cuOb, vec, defaxis, &cd, NULL); + interp_v3_v3v3(vertexCos[a], vertexCos[a], vec, weight); + mul_m4_v3(cd.objectspace, vertexCos[a]); } } } diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c index 1218e3a063c..55653f41e75 100644 --- a/source/blender/blenkernel/intern/pbvh_bmesh.c +++ b/source/blender/blenkernel/intern/pbvh_bmesh.c @@ -546,7 +546,8 @@ static void edge_queue_insert(EdgeQueueContext *eq_ctx, BMEdge *e, * should already make the brush move the vertices only 50%, which means * that topology updates will also happen less frequent, that should be * enough. */ - if ((check_mask(eq_ctx, e->v1) || check_mask(eq_ctx, e->v2)) && + if (((eq_ctx->cd_vert_mask_offset == -1) || + (check_mask(eq_ctx, e->v1) || check_mask(eq_ctx, e->v2))) && !(BM_elem_flag_test_bool(e->v1, BM_ELEM_HIDDEN) || BM_elem_flag_test_bool(e->v2, BM_ELEM_HIDDEN))) { diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c index 9d40ee6e667..b2296151cf7 100644 --- a/source/blender/blenkernel/intern/screen.c +++ b/source/blender/blenkernel/intern/screen.c @@ -425,6 +425,32 @@ ScrArea *BKE_screen_find_big_area(bScreen *sc, const int spacetype, const short return big; } +/** + * Utility function to get the active layer to use when adding new objects. + */ +unsigned int BKE_screen_view3d_layer_active_ex(const View3D *v3d, const Scene *scene, bool use_localvd) +{ + unsigned int lay; + if ((v3d == NULL) || (v3d->scenelock && !v3d->localvd)) { + lay = scene->layact; + } + else { + lay = v3d->layact; + } + + if (use_localvd) { + if (v3d && v3d->localvd) { + lay |= v3d->lay; + } + } + + return lay; +} +unsigned int BKE_screen_view3d_layer_active(const struct View3D *v3d, const struct Scene *scene) +{ + return BKE_screen_view3d_layer_active_ex(v3d, scene, true); +} + void BKE_screen_view3d_sync(View3D *v3d, struct Scene *scene) { int bit; diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c index d2dc9da47f9..a8e578eae0d 100644 --- a/source/blender/blenkernel/intern/seqeffects.c +++ b/source/blender/blenkernel/intern/seqeffects.c @@ -310,41 +310,45 @@ static void do_alphaover_effect(const SeqRenderData *context, Sequence *UNUSED(s static void do_alphaunder_effect_byte(float facf0, float facf1, int x, int y, unsigned char *rect1, unsigned char *rect2, unsigned char *out) { - int fac2, mfac, fac, fac4; + float fac2, fac, fac4; int xo; - unsigned char *rt1, *rt2, *rt; + unsigned char *cp1, *cp2, *rt; + float tempc[4], rt1[4], rt2[4]; xo = x; - rt1 = rect1; - rt2 = rect2; + cp1 = rect1; + cp2 = rect2; rt = out; - fac2 = (int)(256.0f * facf0); - fac4 = (int)(256.0f * facf1); + fac2 = facf0; + fac4 = facf1; while (y--) { x = xo; while (x--) { /* rt = rt1 under rt2 (alpha from rt2) */ + straight_uchar_to_premul_float(rt1, cp1); + straight_uchar_to_premul_float(rt2, cp2); /* this complex optimization is because the * 'skybuf' can be crossed in */ - if (rt2[3] == 0 && fac2 == 256) *((unsigned int *) rt) = *((unsigned int *) rt1); - else if (rt2[3] == 255) *((unsigned int *) rt) = *((unsigned int *) rt2); + if (rt2[3] <= 0.0f && fac2 >= 1.0f) *((unsigned int *) rt) = *((unsigned int *) cp1); + else if (rt2[3] >= 1.0f) *((unsigned int *) rt) = *((unsigned int *) cp2); else { - mfac = rt2[3]; - fac = (fac2 * (256 - mfac)) >> 8; + fac = (fac2 * (1.0f - rt2[3])); - if (fac == 0) *((unsigned int *) rt) = *((unsigned int *) rt2); + if (fac <= 0) *((unsigned int *) rt) = *((unsigned int *) cp2); else { - rt[0] = (fac * rt1[0] + mfac * rt2[0]) >> 8; - rt[1] = (fac * rt1[1] + mfac * rt2[1]) >> 8; - rt[2] = (fac * rt1[2] + mfac * rt2[2]) >> 8; - rt[3] = (fac * rt1[3] + mfac * rt2[3]) >> 8; + tempc[0] = (fac * rt1[0] + rt2[0]); + tempc[1] = (fac * rt1[1] + rt2[1]); + tempc[2] = (fac * rt1[2] + rt2[2]); + tempc[3] = (fac * rt1[3] + rt2[3]); + + premul_float_to_straight_uchar(rt, tempc); } } - rt1 += 4; rt2 += 4; rt += 4; + cp1 += 4; cp2 += 4; rt += 4; } if (y == 0) @@ -353,28 +357,32 @@ static void do_alphaunder_effect_byte(float facf0, float facf1, int x, int y, un x = xo; while (x--) { - if (rt2[3] == 0 && fac4 == 256) *((unsigned int *) rt) = *((unsigned int *) rt1); - else if (rt2[3] == 255) *((unsigned int *) rt) = *((unsigned int *) rt2); - else { - mfac = rt2[3]; - fac = (fac4 * (256 - mfac)) >> 8; + straight_uchar_to_premul_float(rt1, cp1); + straight_uchar_to_premul_float(rt2, cp2); + + if (rt2[3] <= 0.0f && fac4 >= 1.0f) *((unsigned int *) rt) = *((unsigned int *) cp1); + else if (rt2[3] >= 1.0f) *((unsigned int *) rt) = *((unsigned int *) cp2); + else { + fac = (fac4 * (1.0f - rt2[3])); - if (fac == 0) *((unsigned int *)rt) = *((unsigned int *)rt2); + if (fac <= 0) *((unsigned int *)rt) = *((unsigned int *)cp2); else { - rt[0] = (fac * rt1[0] + mfac * rt2[0]) >> 8; - rt[1] = (fac * rt1[1] + mfac * rt2[1]) >> 8; - rt[2] = (fac * rt1[2] + mfac * rt2[2]) >> 8; - rt[3] = (fac * rt1[3] + mfac * rt2[3]) >> 8; + tempc[0] = (fac * rt1[0] + rt2[0]); + tempc[1] = (fac * rt1[1] + rt2[1]); + tempc[2] = (fac * rt1[2] + rt2[2]); + tempc[3] = (fac * rt1[3] + rt2[3]); + + premul_float_to_straight_uchar(rt, tempc); } } - rt1 += 4; rt2 += 4; rt += 4; + cp1 += 4; cp2 += 4; rt += 4; } } } static void do_alphaunder_effect_float(float facf0, float facf1, int x, int y, float *rect1, float *rect2, float *out) { - float fac2, mfac, fac, fac4; + float fac2, fac, fac4; int xo; float *rt1, *rt2, *rt; @@ -401,17 +409,16 @@ static void do_alphaunder_effect_float(float facf0, float facf1, int x, int y, memcpy(rt, rt2, 4 * sizeof(float)); } else { - mfac = rt2[3]; - fac = fac2 * (1.0f - mfac); + fac = fac2 * (1.0f - rt2[3]); if (fac == 0) { memcpy(rt, rt2, 4 * sizeof(float)); } else { - rt[0] = fac * rt1[0] + mfac * rt2[0]; - rt[1] = fac * rt1[1] + mfac * rt2[1]; - rt[2] = fac * rt1[2] + mfac * rt2[2]; - rt[3] = fac * rt1[3] + mfac * rt2[3]; + rt[0] = fac * rt1[0] + rt2[0]; + rt[1] = fac * rt1[1] + rt2[1]; + rt[2] = fac * rt1[2] + rt2[2]; + rt[3] = fac * rt1[3] + rt2[3]; } } rt1 += 4; rt2 += 4; rt += 4; @@ -430,17 +437,16 @@ static void do_alphaunder_effect_float(float facf0, float facf1, int x, int y, memcpy(rt, rt2, 4 * sizeof(float)); } else { - mfac = rt2[3]; - fac = fac4 * (1.0f - mfac); + fac = fac4 * (1.0f - rt2[3]); if (fac == 0) { memcpy(rt, rt2, 4 * sizeof(float)); } else { - rt[0] = fac * rt1[0] + mfac * rt2[0]; - rt[1] = fac * rt1[1] + mfac * rt2[1]; - rt[2] = fac * rt1[2] + mfac * rt2[2]; - rt[3] = fac * rt1[3] + mfac * rt2[3]; + rt[0] = fac * rt1[0] + rt2[0]; + rt[1] = fac * rt1[1] + rt2[1]; + rt[2] = fac * rt1[2] + rt2[2]; + rt[3] = fac * rt1[3] + rt2[3]; } } rt1 += 4; rt2 += 4; rt += 4; diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index dedf5e8bd72..c9647b05ce7 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -3513,16 +3513,28 @@ bool BKE_sequence_single_check(Sequence *seq) } /* check if the selected seq's reference unselected seq's */ -bool BKE_sequence_base_isolated_sel_check(ListBase *seqbase) +bool BKE_sequence_base_isolated_sel_check(ListBase *seqbase, bool one_only) { Sequence *seq; - /* is there more than 1 select */ + /* is there a valid selection select */ bool ok = false; + /* is there one selected already? */ + bool first = false; for (seq = seqbase->first; seq; seq = seq->next) { if (seq->flag & SELECT) { - ok = true; - break; + if (one_only) { + ok = true; + break; + } + else { + if (first) { + ok = true; + break; + } + else + first = true; + } } } diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index c394e492732..0bd9517dcfd 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -2397,25 +2397,25 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm, float *d_co = CCG_grid_elem_co(&key, faceGridData, x, y + 1); if (tf) glTexCoord2fv(tf->uv[1]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf_stencil->uv[1]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf_stencil->uv[1]); if (cp) glColor3ub(cp[7], cp[6], cp[5]); glNormal3sv(ln[0][1]); glVertex3fv(d_co); if (tf) glTexCoord2fv(tf->uv[2]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf_stencil->uv[2]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf_stencil->uv[2]); if (cp) glColor3ub(cp[11], cp[10], cp[9]); glNormal3sv(ln[0][2]); glVertex3fv(c_co); if (tf) glTexCoord2fv(tf->uv[3]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf_stencil->uv[3]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf_stencil->uv[3]); if (cp) glColor3ub(cp[15], cp[14], cp[13]); glNormal3sv(ln[0][3]); glVertex3fv(b_co); if (tf) glTexCoord2fv(tf->uv[0]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf_stencil->uv[0]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf_stencil->uv[0]); if (cp) glColor3ub(cp[3], cp[2], cp[1]); glNormal3sv(ln[0][0]); glVertex3fv(a_co); @@ -2437,13 +2437,13 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm, b = CCG_grid_elem(&key, faceGridData, x, y + 1); if (tf) glTexCoord2fv(tf->uv[0]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf_stencil->uv[0]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf_stencil->uv[0]); if (cp) glColor3ub(cp[3], cp[2], cp[1]); glNormal3fv(CCG_elem_no(&key, a)); glVertex3fv(CCG_elem_co(&key, a)); if (tf) glTexCoord2fv(tf->uv[1]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf_stencil->uv[1]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf_stencil->uv[1]); if (cp) glColor3ub(cp[7], cp[6], cp[5]); glNormal3fv(CCG_elem_no(&key, b)); glVertex3fv(CCG_elem_co(&key, b)); @@ -2459,13 +2459,13 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm, b = CCG_grid_elem(&key, faceGridData, x, y + 1); if (tf) glTexCoord2fv(tf->uv[3]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf_stencil->uv[3]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf_stencil->uv[3]); if (cp) glColor3ub(cp[15], cp[14], cp[13]); glNormal3fv(CCG_elem_no(&key, a)); glVertex3fv(CCG_elem_co(&key, a)); if (tf) glTexCoord2fv(tf->uv[2]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf_stencil->uv[2]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf_stencil->uv[2]); if (cp) glColor3ub(cp[11], cp[10], cp[9]); glNormal3fv(CCG_elem_no(&key, b)); glVertex3fv(CCG_elem_co(&key, b)); @@ -2490,22 +2490,22 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm, ccgDM_glNormalFast(a_co, b_co, c_co, d_co); if (tf) glTexCoord2fv(tf->uv[1]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf_stencil->uv[1]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf_stencil->uv[1]); if (cp) glColor3ub(cp[7], cp[6], cp[5]); glVertex3fv(d_co); if (tf) glTexCoord2fv(tf->uv[2]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf_stencil->uv[2]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf_stencil->uv[2]); if (cp) glColor3ub(cp[11], cp[10], cp[9]); glVertex3fv(c_co); if (tf) glTexCoord2fv(tf->uv[3]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf_stencil->uv[3]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf_stencil->uv[3]); if (cp) glColor3ub(cp[15], cp[14], cp[13]); glVertex3fv(b_co); if (tf) glTexCoord2fv(tf->uv[0]); - if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE1, tf_stencil->uv[0]); + if (tf_stencil) glMultiTexCoord2fv(GL_TEXTURE2, tf_stencil->uv[0]); if (cp) glColor3ub(cp[3], cp[2], cp[1]); glVertex3fv(a_co); diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 22005892535..b77cd744a18 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -1891,11 +1891,21 @@ ImBuf *BKE_tracking_distort_frame(MovieTracking *tracking, ImBuf *ibuf, int cali calibration_height, overscan, false); } -void BKE_tracking_max_undistortion_delta_across_bound(MovieTracking *tracking, rcti *rect, float delta[2]) +void BKE_tracking_max_distortion_delta_across_bound(MovieTracking *tracking, rcti *rect, + bool undistort, float delta[2]) { int a; float pos[2], warped_pos[2]; const int coord_delta = 5; + void (*apply_distortion) (MovieTracking *tracking, + const float pos[2], float out[2]); + + if (undistort) { + apply_distortion = BKE_tracking_undistort_v2; + } + else { + apply_distortion = BKE_tracking_distort_v2; + } delta[0] = delta[1] = -FLT_MAX; @@ -1907,7 +1917,7 @@ void BKE_tracking_max_undistortion_delta_across_bound(MovieTracking *tracking, r pos[0] = a; pos[1] = rect->ymin; - BKE_tracking_undistort_v2(tracking, pos, warped_pos); + apply_distortion(tracking, pos, warped_pos); delta[0] = max_ff(delta[0], fabsf(pos[0] - warped_pos[0])); delta[1] = max_ff(delta[1], fabsf(pos[1] - warped_pos[1])); @@ -1916,7 +1926,7 @@ void BKE_tracking_max_undistortion_delta_across_bound(MovieTracking *tracking, r pos[0] = a; pos[1] = rect->ymax; - BKE_tracking_undistort_v2(tracking, pos, warped_pos); + apply_distortion(tracking, pos, warped_pos); delta[0] = max_ff(delta[0], fabsf(pos[0] - warped_pos[0])); delta[1] = max_ff(delta[1], fabsf(pos[1] - warped_pos[1])); @@ -1933,7 +1943,7 @@ void BKE_tracking_max_undistortion_delta_across_bound(MovieTracking *tracking, r pos[0] = rect->xmin; pos[1] = a; - BKE_tracking_undistort_v2(tracking, pos, warped_pos); + apply_distortion(tracking, pos, warped_pos); delta[0] = max_ff(delta[0], fabsf(pos[0] - warped_pos[0])); delta[1] = max_ff(delta[1], fabsf(pos[1] - warped_pos[1])); @@ -1942,7 +1952,7 @@ void BKE_tracking_max_undistortion_delta_across_bound(MovieTracking *tracking, r pos[0] = rect->xmax; pos[1] = a; - BKE_tracking_undistort_v2(tracking, pos, warped_pos); + apply_distortion(tracking, pos, warped_pos); delta[0] = max_ff(delta[0], fabsf(pos[0] - warped_pos[0])); delta[1] = max_ff(delta[1], fabsf(pos[1] - warped_pos[1])); diff --git a/source/blender/blenkernel/intern/tracking_region_tracker.c b/source/blender/blenkernel/intern/tracking_region_tracker.c index 6300e29f516..c41106f37cb 100644 --- a/source/blender/blenkernel/intern/tracking_region_tracker.c +++ b/source/blender/blenkernel/intern/tracking_region_tracker.c @@ -725,6 +725,35 @@ void BKE_tracking_context_finish(MovieTrackingContext *context) } } +static bool refine_marker_reference_frame_get(MovieTrackingTrack *track, + MovieTrackingMarker *marker, + bool backwards, + int *reference_framenr) +{ + const MovieTrackingMarker *first_marker = track->markers; + const MovieTrackingMarker *last_marker = track->markers + track->markersnr - 1; + MovieTrackingMarker *reference = backwards ? marker + 1 : marker - 1; + + while (reference >= first_marker && + reference <= last_marker && + (reference->flag & MARKER_DISABLED) != 0) + { + if (backwards) + reference++; + else + reference--; + } + + if (reference < first_marker || + reference > last_marker) + { + return false; + } + + *reference_framenr = reference->framenr; + return (reference->flag & MARKER_DISABLED) == 0; +} + /* Refine marker's position using previously known keyframe. * Direction of searching for a keyframe depends on backwards flag, * which means if backwards is false, previous keyframe will be as @@ -748,14 +777,15 @@ void BKE_tracking_refine_marker(MovieClip *clip, MovieTrackingTrack *track, Movi BKE_movieclip_get_size(clip, &user, &frame_width, &frame_height); - /* Get an image buffer for reference frame, also gets reference marker. - * - * Usually tracking_context_get_reference_ibuf will return current frame - * if marker is keyframed, which is correct for normal tracking. But here - * we'll want to have next/previous frame in such cases. So let's use small - * magic with original frame number used to get reference frame for. - */ - reference_framenr = backwards ? marker->framenr + 1 : marker->framenr - 1; + /* Get an image buffer for reference frame, also gets reference marker. */ + if (!refine_marker_reference_frame_get(track, + marker, + backwards, + &reference_framenr)) + { + return; + } + reference_ibuf = tracking_context_get_reference_ibuf(clip, &user, clip_flag, track, reference_framenr, backwards, &reference_marker); if (reference_ibuf == NULL) { |