Merge branch 'master' into blender2.8
authorJulian Eisel <eiseljulian@gmail.com>
Fri, 5 May 2017 10:44:52 +0000 (12:44 +0200)
committerJulian Eisel <eiseljulian@gmail.com>
Fri, 5 May 2017 10:44:52 +0000 (12:44 +0200)
1  2 
source/blender/blenkernel/intern/armature.c
source/blender/blenkernel/intern/library.c
source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface.c
source/blender/editors/interface/interface_intern.h
source/blender/editors/interface/interface_regions.c
source/blender/editors/interface/interface_templates.c
source/blender/modifiers/intern/MOD_warp.c

index 0c1af5dcbe85b5820f3a631589747462028a2c74,1ee71c8448cadc9817963c13798d5743573ab730..6f04be653d1787b98cbebd8da8b228c6061f6f3d
@@@ -60,6 -60,7 +60,6 @@@
  #include "BKE_anim.h"
  #include "BKE_constraint.h"
  #include "BKE_curve.h"
 -#include "BKE_depsgraph.h"
  #include "BKE_DerivedMesh.h"
  #include "BKE_deform.h"
  #include "BKE_displist.h"
@@@ -981,6 -982,11 +981,11 @@@ void armature_deform_verts(Object *armO
                return;
        }
  
+       if ((armOb->pose->flag & POSE_RECALC) != 0) {
+               printf("ERROR! Trying to evaluate influence of armature '%s' which needs Pose recalc!", armOb->id.name);
+               BLI_assert(0);
+       }
        invert_m4_m4(obinv, target->obmat);
        copy_m4_m4(premat, target->obmat);
        mul_m4_m4m4(postmat, obinv, armOb->obmat);
@@@ -1929,7 -1935,7 +1934,7 @@@ void BKE_pose_clear_pointers(bPose *pos
  
  /* only after leave editmode, duplicating, validating older files, library syncing */
  /* NOTE: pose->flag is set for it */
 -void BKE_pose_rebuild_ex(Object *ob, bArmature *arm, const bool sort_bones)
 +void BKE_pose_rebuild(Object *ob, bArmature *arm)
  {
        Bone *bone;
        bPose *pose;
  
        BKE_pose_update_constraint_flags(ob->pose); /* for IK detection for example */
  
 -#ifdef WITH_LEGACY_DEPSGRAPH
 -      /* the sorting */
 -      /* Sorting for new dependnecy graph is done on the scene graph level. */
 -      if (counter > 1 && sort_bones) {
 -              DAG_pose_sort(ob);
 -      }
 -#endif
 -
        ob->pose->flag &= ~POSE_RECALC;
        ob->pose->flag |= POSE_WAS_REBUILT;
  
        BKE_pose_channels_hash_make(ob->pose);
  }
  
 -void BKE_pose_rebuild(Object *ob, bArmature *arm)
 -{
 -      BKE_pose_rebuild_ex(ob, arm, true);
 -}
 -
  /* ********************** THE POSE SOLVER ******************* */
  
  /* loc/rot/size to given mat4 */
index 64c888943f48eea9757f87e2af0279939c0d1886,3cf9acc237d1e8588a1535e59701d2aa40a4b61f..93ac50a932407bccbac3aaff842f8869edaf8299
@@@ -91,6 -91,7 +91,6 @@@
  #include "BKE_cachefile.h"
  #include "BKE_context.h"
  #include "BKE_curve.h"
 -#include "BKE_depsgraph.h"
  #include "BKE_font.h"
  #include "BKE_global.h"
  #include "BKE_group.h"
@@@ -778,11 -779,11 +778,11 @@@ void BKE_main_lib_objects_recalc_all(Ma
        /* flag for full recalc */
        for (ob = bmain->object.first; ob; ob = ob->id.next) {
                if (ID_IS_LINKED_DATABLOCK(ob)) {
 -                      DAG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
 +                      DEG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
                }
        }
  
 -      DAG_id_type_tag(bmain, ID_OB);
 +      DEG_id_type_tag(bmain, ID_OB);
  }
  
  /**
@@@ -993,7 -994,7 +993,7 @@@ void *BKE_libblock_alloc(Main *bmain, s
                /* alphabetic insertion: is in new_id */
                BKE_main_unlock(bmain);
        }
 -      DAG_id_type_tag(bmain, type);
 +      DEG_id_type_tag(bmain, type);
        return id;
  }
  
@@@ -1219,41 -1220,41 +1219,41 @@@ void BKE_main_free(Main *mainvar
                        /* errors freeing ID's can be hard to track down,
                         * enable this so valgrind will give the line number in its error log */
                        switch (a) {
 -                              case   0: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case   1: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case   2: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case   3: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case   4: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case   5: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case   6: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case   7: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case   8: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case   9: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  10: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  11: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  12: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  13: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  14: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  15: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  16: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  17: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  18: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  19: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  20: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  21: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  22: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  23: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  24: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  25: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  26: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  27: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  28: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  29: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  30: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  31: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  32: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  33: BKE_libblock_free_ex(mainvar, id, false, false); break;
 -                              case  34: BKE_libblock_free_ex(mainvar, id, false, false); break;
 +                              case   0: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case   1: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case   2: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case   3: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case   4: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case   5: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case   6: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case   7: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case   8: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case   9: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  10: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  11: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  12: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  13: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  14: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  15: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  16: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  17: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  18: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  19: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  20: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  21: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  22: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  23: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  24: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  25: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  26: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  27: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  28: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  29: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  30: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  31: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  32: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  33: BKE_libblock_free_ex(mainvar, id, false); break;
 +                              case  34: BKE_libblock_free_ex(mainvar, id, false); break;
                                default:
                                        BLI_assert(0);
                                        break;
@@@ -1947,7 -1948,7 +1947,7 @@@ void BKE_library_make_local
  
        /* Note: Keeping both version of the code (old one being safer, since it still has checks against unused IDs)
         * for now, we can remove old one once it has been tested for some time in master... */
- #if 1
+ #if 0
        /* Step 5: proxy 'remapping' hack. */
        for (LinkNode *it = copied_ids; it; it = it->next) {
                /* Attempt to re-link copied proxy objects. This allows appending of an entire scene
  
  #ifdef DEBUG_TIME
        printf("Step 6: Try to find circle dependencies between indirectly-linked-only datablocks: Done.\n");
-       TIMEIT_END(make_local);
+       TIMEIT_VALUE_PRINT(make_local);
+ #endif
  #endif
  
+       /* This is probably more of a hack than something we should do here, but...
+        * Issue is, the whole copying + remapping done in complex cases above may leave pose channels of armatures
+        * in complete invalid state (more precisely, the bone pointers of the pchans - very crappy cross-datablocks
+        * relationship), se we tag it to be fully recomputed, but this does not seems to be enough in some cases,
+        * and evaluation code ends up trying to evaluate a not-yet-updated armature object's deformations.
+        * Try "make all local" in 04_01_H.lighting.blend from Agent327 without this, e.g. */
+       for (Object *ob = bmain->object.first; ob; ob = ob->id.next) {
+               if (ob->data != NULL && ob->type == OB_ARMATURE && ob->pose != NULL && ob->pose->flag & POSE_RECALC) {
+                       BKE_pose_rebuild(ob, ob->data);
+               }
+       }
+ #ifdef DEBUG_TIME
+       printf("Hack: Forcefully rebuild armature object poses: Done.\n");
+       TIMEIT_VALUE_PRINT(make_local);
  #endif
  
        BKE_main_id_clear_newpoins(bmain);
index 904067839e2b5461898f4d607fe7571f722f8d02,252c199d46c2859e4cd20c9d1b11895837f3cad2..ee15413b4d057cc6e996663de903f7231c52edb2
@@@ -255,7 -255,6 +255,7 @@@ typedef enum 
        UI_BTYPE_CHECKBOX               = (13 << 9),  /* similar to toggle, display a 'tick' */
        UI_BTYPE_CHECKBOX_N             = (14 << 9),
        UI_BTYPE_COLOR                  = (15 << 9),
 +      UI_BTYPE_TAB                    = (16 << 9),
        UI_BTYPE_SCROLL                 = (18 << 9),
        UI_BTYPE_BLOCK                  = (19 << 9),
        UI_BTYPE_LABEL                  = (20 << 9),
   * Functions to draw various shapes, taking theme settings into account.
   * Used for code that draws its own UI style elements. */
  
 -void UI_draw_roundbox(float minx, float miny, float maxx, float maxy, float rad);
  void UI_draw_roundbox_corner_set(int type);
 +void UI_draw_roundbox_aa(bool filled, float minx, float miny, float maxx, float maxy, float rad, const float color[4]);
 +void UI_draw_roundbox_4fv(bool filled, float minx, float miny, float maxx, float maxy, float rad, const float col[4]);
 +void UI_draw_roundbox_3ubAlpha(bool filled, float minx, float miny, float maxx, float maxy, float rad, const unsigned char col[3], unsigned char alpha);
 +void UI_draw_roundbox_3fvAlpha(bool filled, float minx, float miny, float maxx, float maxy, float rad, const float col[3], float alpha);
 +void UI_draw_roundbox_shade_x(bool filled, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown, const float col[4]);
 +
 +#if 0 /* unused */
  int  UI_draw_roundbox_corner_get(void);
 -void UI_draw_roundbox_unfilled(float minx, float miny, float maxx, float maxy, float rad);
 +void UI_draw_roundbox_shade_y(bool filled, float minx, float miny, float maxx, float maxy, float rad, float shadeleft, float shaderight, const float col[4]);
 +#endif
 +
  void UI_draw_box_shadow(unsigned char alpha, float minx, float miny, float maxx, float maxy);
 -void UI_draw_roundbox_gl_mode(int mode, float minx, float miny, float maxx, float maxy, float rad);
 -void UI_draw_roundbox_shade_x(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown);
 -void UI_draw_roundbox_shade_y(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadeLeft, float shadeRight);
 -void UI_draw_text_underline(int pos_x, int pos_y, int len, int height);
 +void UI_draw_text_underline(int pos_x, int pos_y, int len, int height, const float color[4]);
  
 -void UI_draw_safe_areas(
 -        float x1, float x2, float y1, float y2,
 +void UI_draw_safe_areas(uint pos, float x1, float x2, float y1, float y2,
          const float title_aspect[2], const float action_aspect[2]);
  
  /* state for scrolldrawing */
@@@ -699,7 -694,7 +699,7 @@@ void    UI_but_func_search_set
  int     UI_searchbox_size_y(void);
  int     UI_searchbox_size_x(void);
  /* check if a string is in an existing search box */
- int     UI_search_items_find_index(uiSearchItems *items, const char *name, const size_t offset);
+ int     UI_search_items_find_index(uiSearchItems *items, const char *name);
  
  void    UI_block_func_handle_set(uiBlock *block, uiBlockHandleFunc func, void *arg);
  void    UI_block_func_butmenu_set(uiBlock *block, uiMenuHandleFunc func, void *arg);
@@@ -791,6 -786,7 +791,6 @@@ void UI_popup_handlers_remove_all(struc
  void UI_init(void);
  void UI_init_userdef(void);
  void UI_reinit_font(void);
 -void UI_reinit_gl_state(void);
  void UI_exit(void);
  
  /* Layout
@@@ -855,6 -851,9 +855,6 @@@ enum 
        UI_CNR_ALL          = (UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT | UI_CNR_BOTTOM_LEFT)
  };
  
 -/* not apart of the corner flags but mixed in some functions  */
 -#define UI_RB_ALPHA (UI_CNR_ALL + 1)
 -
  uiLayout *UI_block_layout(uiBlock *block, int dir, int type, int x, int y, int size, int em, int padding, struct uiStyle *style);
  void UI_block_layout_set_current(uiBlock *block, uiLayout *layout);
  void UI_block_layout_resolve(uiBlock *block, int *x, int *y);
@@@ -945,7 -944,6 +945,7 @@@ void uiTemplateHeader3D(uiLayout *layou
  void uiTemplateEditModeSelection(uiLayout *layout, struct bContext *C);
  void uiTemplateReportsBanner(uiLayout *layout, struct bContext *C);
  void uiTemplateKeymapItemProperties(uiLayout *layout, struct PointerRNA *ptr);
 +void uiTemplateOverrideProperty(uiLayout *layout, struct PointerRNA *collection_props_ptr, struct PointerRNA *scene_props_ptr, const char *name, const char *custom_template);
  void uiTemplateComponentMenu(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *name);
  void uiTemplateNodeSocket(uiLayout *layout, struct bContext *C, float *color);
  void uiTemplateCacheFile(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname);
@@@ -1043,22 -1041,20 +1043,22 @@@ void UI_context_active_but_prop_get_tem
  
  /* Styled text draw */
  void UI_fontstyle_set(const struct uiFontStyle *fs);
 -void UI_fontstyle_draw_ex(
 -        const struct uiFontStyle *fs, const struct rcti *rect, const char *str,
 -        size_t len, float *r_xofs, float *r_yofs);
 -void UI_fontstyle_draw(const struct uiFontStyle *fs, const struct rcti *rect, const char *str);
 -void UI_fontstyle_draw_rotated(const struct uiFontStyle *fs, const struct rcti *rect, const char *str);
 -void UI_fontstyle_draw_simple(const struct uiFontStyle *fs, float x, float y, const char *str);
 +void UI_fontstyle_draw_ex(const struct uiFontStyle *fs, const struct rcti *rect, const char *str,
 +                          const unsigned char col[4], size_t len, float *r_xofs, float *r_yofs);
 +void UI_fontstyle_draw(const struct uiFontStyle *fs, const struct rcti *rect, const char *str,
 +                       const unsigned char col[4]);
 +void UI_fontstyle_draw_rotated(const struct uiFontStyle *fs, const struct rcti *rect, const char *str,
 +                               const unsigned char col[4]);
 +void UI_fontstyle_draw_simple(const struct uiFontStyle *fs, float x, float y, const char *str,
 +                              const unsigned char col[4]);
  void UI_fontstyle_draw_simple_backdrop(
          const struct uiFontStyle *fs, float x, float y, const char *str,
 -        const unsigned char fg[4], const unsigned char bg[4]);
 +        const float col_fg[4], const float col_bg[4]);
  
  int UI_fontstyle_string_width(const struct uiFontStyle *fs, const char *str);
  int UI_fontstyle_height_max(const struct uiFontStyle *fs);
  
 -void UI_draw_icon_tri(float x, float y, char dir);
 +void UI_draw_icon_tri(float x, float y, char dir, const float[4]);
  
  struct uiStyle *UI_style_get(void);           /* use for fonts etc */
  struct uiStyle *UI_style_get_dpi(void);       /* DPI scaled settings for drawing */
index 75ccdece7996bceb36c4adf4e8836949b6fdc6f3,7180e18ab92baf9d9687fe553107700354773b64..e1ca6c60a7429aca65b57aa0943173e577faf534
@@@ -56,7 -56,7 +56,7 @@@
  #include "BKE_screen.h"
  #include "BKE_idprop.h"
  
 -#include "BIF_gl.h"
 +#include "GPU_matrix.h"
  
  #include "BLF_api.h"
  #include "BLT_translation.h"
@@@ -499,7 -499,6 +499,7 @@@ static int ui_but_calc_float_precision(
  static void ui_draw_linkline(uiLinkLine *line, int highlightActiveLines, int dashInactiveLines)
  {
        rcti rect;
 +      float color[4] = {1.0f};
  
        if (line->from == NULL || line->to == NULL) return;
        
        rect.ymax = BLI_rctf_cent_y(&line->to->rect);
        
        if (dashInactiveLines)
 -              UI_ThemeColor(TH_GRID);
 +              UI_GetThemeColor4fv(TH_GRID, color);
        else if (line->flag & UI_SELECT)
 -              glColor3ub(100, 100, 100);
 +              rgba_float_args_set_ch(color, 100, 100, 100, 255);
        else if (highlightActiveLines && ((line->from->flag & UI_ACTIVE) || (line->to->flag & UI_ACTIVE)))
 -              UI_ThemeColor(TH_TEXT_HI);
 +              UI_GetThemeColor4fv(TH_TEXT_HI, color);
        else
 -              glColor3ub(0, 0, 0);
 +              rgba_float_args_set_ch(color, 0, 0, 0, 255);
  
 -      ui_draw_link_bezier(&rect);
 +      ui_draw_link_bezier(&rect, color);
  }
  
  static void ui_draw_links(uiBlock *block)
@@@ -1377,9 -1376,11 +1377,9 @@@ void UI_block_draw(const bContext *C, u
        ui_but_to_pixelrect(&rect, ar, block, NULL);
        
        /* pixel space for AA widgets */
 -      glMatrixMode(GL_PROJECTION);
 -      glPushMatrix();
 -      glMatrixMode(GL_MODELVIEW);
 -      glPushMatrix();
 -      glLoadIdentity();
 +      gpuPushProjectionMatrix();
 +      gpuPushMatrix();
 +      gpuLoadIdentity();
  
        wmOrtho2_region_pixelspace(ar);
        
        }
        
        /* restore matrix */
 -      glMatrixMode(GL_PROJECTION);
 -      glPopMatrix();
 -      glMatrixMode(GL_MODELVIEW);
 -      glPopMatrix();
 +      gpuPopProjectionMatrix();
 +      gpuPopMatrix();
  
        if (multisample_enabled)
                glEnable(GL_MULTISAMPLE);
@@@ -1459,7 -1462,6 +1459,7 @@@ int ui_but_is_pushed_ex(uiBut *but, dou
                                break;
                        case UI_BTYPE_ROW:
                        case UI_BTYPE_LISTROW:
 +                      case UI_BTYPE_TAB:
                                UI_GET_BUT_VALUE_INIT(but, *value);
                                /* support for rna enum buts */
                                if (but->rnaprop && (RNA_property_flag(but->rnaprop) & PROP_ENUM_FLAG)) {
@@@ -4370,7 -4372,7 +4370,7 @@@ void UI_but_func_search_set
        if (0 == (but->block->flag & UI_BLOCK_LOOP)) {
                /* skip empty buttons, not all buttons need input, we only show invalid */
                if (but->drawstr[0])
-                       ui_but_search_refresh(but, false);
+                       ui_but_search_refresh(but);
        }
  }
  
@@@ -4398,7 -4400,7 +4398,7 @@@ static void operator_enum_search_cb(con
                for (item = item_array; item->identifier; item++) {
                        /* note: need to give the index rather than the identifier because the enum can be freed */
                        if (BLI_strcasestr(item->name, str)) {
 -                              if (false == UI_search_item_add(items, item->name, SET_INT_IN_POINTER(item->value), 0))
 +                              if (false == UI_search_item_add(items, item->name, SET_INT_IN_POINTER(item->value), item->icon))
                                        break;
                        }
                }
index 29808d84818e5bc922ae7b8a38d4673969de1070,067279777baa5c285158431a04cf2f95b23bf564..68bb48f66fb340801d18aa47c9492d4ec558aa4c
@@@ -72,7 -72,6 +72,7 @@@ typedef enum 
        UI_WTYPE_NUMBER,
        UI_WTYPE_SLIDER,
        UI_WTYPE_EXEC,
 +      UI_WTYPE_TAB,
        UI_WTYPE_TOOLTIP,
        
        /* strings */
@@@ -606,7 -605,7 +606,7 @@@ int ui_searchbox_autocomplete(struct bC
  void ui_searchbox_event(struct bContext *C, struct ARegion *ar, uiBut *but, const struct wmEvent *event);
  bool ui_searchbox_apply(uiBut *but, struct ARegion *ar);
  void ui_searchbox_free(struct bContext *C, struct ARegion *ar);
- void ui_but_search_refresh(uiBut *but, const bool is_template_ID);
+ void ui_but_search_refresh(uiBut *but);
  
  uiBlock *ui_popup_block_refresh(
          struct bContext *C, uiPopupBlockHandle *handle,
@@@ -641,8 -640,6 +641,8 @@@ extern void ui_draw_dropshadow(const rc
  
  void ui_draw_gradient(const rcti *rect, const float hsv[3], const int type, const float alpha);
  
 +
 +void ui_draw_but_TAB_outline(const rcti *rect, float rad, unsigned char highlight[3], unsigned char highlight_fade[3]);
  void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, const rcti *rect);
  void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, const rcti *rect);
  void ui_draw_but_VECTORSCOPE(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, const rcti *rect);
@@@ -685,16 -682,15 +685,16 @@@ struct wmIMEData *ui_but_ime_data_get(u
  #endif
  
  /* interface_widgets.c */
 -void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3);
 -void ui_draw_anti_roundbox(int mode, float minx, float miny, float maxx, float maxy, float rad, bool use_alpha);
 +void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3, const float color[4]);
 +void ui_draw_anti_roundbox(int mode, float minx, float miny, float maxx, float maxy,
 +                           float rad, bool use_alpha, const float color[4]);
  void ui_draw_menu_back(struct uiStyle *style, uiBlock *block, rcti *rect);
  void ui_draw_pie_center(uiBlock *block);
  uiWidgetColors *ui_tooltip_get_theme(void);
  void ui_draw_tooltip_background(uiStyle *UNUSED(style), uiBlock *block, rcti *rect);
  void ui_draw_search_back(struct uiStyle *style, uiBlock *block, rcti *rect);
  bool ui_link_bezier_points(const rcti *rect, float coord_array[][2], int resol);
 -void ui_draw_link_bezier(const rcti *rect);
 +void ui_draw_link_bezier(const rcti *rect, const float color[4]);
  
  extern void ui_draw_but(const struct bContext *C, ARegion *ar, struct uiStyle *style, uiBut *but, rcti *rect);
  /* theme color init */
index b1f3482e109bcf3d033ef768442ee7f30ef6770d,534bd4278ca32cfa53833e5facdc5dd83f6c15c9..ed8c3a5087514319a8fe34dcf76656992ba7f4d0
@@@ -194,7 -194,6 +194,7 @@@ static void ui_tooltip_region_draw_cb(c
        uiWidgetColors *theme = ui_tooltip_get_theme();
        rcti bbox = data->bbox;
        float tip_colors[UI_TIP_LC_MAX][3];
 +      unsigned char drawcol[4] = {0, 0, 0, 255}; /* to store color in while drawing (alpha is always 255) */
  
        float *main_color    = tip_colors[UI_TIP_LC_MAIN]; /* the color from the theme */
        float *value_color   = tip_colors[UI_TIP_LC_VALUE];
                        fstyle_header.shadowalpha = 1.0f;
                        fstyle_header.word_wrap = true;
  
 +                      rgb_float_to_uchar(drawcol, tip_colors[UI_TIP_LC_MAIN]);
                        UI_fontstyle_set(&fstyle_header);
 -                      glColor3fv(tip_colors[UI_TIP_LC_MAIN]);
 -                      UI_fontstyle_draw(&fstyle_header, &bbox, data->header);
 +                      UI_fontstyle_draw(&fstyle_header, &bbox, data->header, drawcol);
  
                        /* offset to the end of the last line */
                        xofs = data->line_geom[i].x_pos;
                        bbox.xmin += xofs;
                        bbox.ymax -= yofs;
  
 -                      glColor3fv(tip_colors[UI_TIP_LC_ACTIVE]);
 +                      rgb_float_to_uchar(drawcol, tip_colors[UI_TIP_LC_ACTIVE]);
                        fstyle_header.shadow = 0;
 -                      UI_fontstyle_draw(&fstyle_header, &bbox, data->active_info);
 +                      UI_fontstyle_draw(&fstyle_header, &bbox, data->active_info, drawcol);
  
                        /* undo offset */
                        bbox.xmin -= xofs;
                }
                else if (data->format[i].style == UI_TIP_STYLE_MONO) {
                        uiFontStyle fstyle_mono = data->fstyle;
 +
                        fstyle_mono.uifont_id = blf_mono_font;
                        fstyle_mono.word_wrap = true;
  
                        UI_fontstyle_set(&fstyle_mono);
                        /* XXX, needed because we dont have mono in 'U.uifonts' */
                        BLF_size(fstyle_mono.uifont_id, fstyle_mono.points * U.pixelsize, U.dpi);
 -                      glColor3fv(tip_colors[data->format[i].color_id]);
 -                      UI_fontstyle_draw(&fstyle_mono, &bbox, data->lines[i]);
 +                      rgb_float_to_uchar(drawcol, tip_colors[data->format[i].color_id]);
 +                      UI_fontstyle_draw(&fstyle_mono, &bbox, data->lines[i], drawcol);
                }
                else {
                        uiFontStyle fstyle_normal = data->fstyle;
  
                        /* draw remaining data */
                        UI_fontstyle_set(&fstyle_normal);
 -                      glColor3fv(tip_colors[data->format[i].color_id]);
 -                      UI_fontstyle_draw(&fstyle_normal, &bbox, data->lines[i]);
 +                      rgb_float_to_uchar(drawcol, tip_colors[data->format[i].color_id]);
 +                      UI_fontstyle_draw(&fstyle_normal, &bbox, data->lines[i], drawcol);
                }
  
                bbox.ymax -= data->lineh * data->line_geom[i].lines;
@@@ -813,11 -811,11 +813,11 @@@ int UI_searchbox_size_x(void
        return 12 * UI_UNIT_X;
  }
  
- int UI_search_items_find_index(uiSearchItems *items, const char *name, const size_t offset)
+ int UI_search_items_find_index(uiSearchItems *items, const char *name)
  {
        int i;
        for (i = 0; i < items->totitem; i++) {
-               if (STREQ(name, items->names[i] + offset)) {
+               if (STREQ(name, items->names[i])) {
                        return i;
                }
        }
@@@ -896,7 -894,7 +896,7 @@@ static void ui_searchbox_butrect(rcti *
  int ui_searchbox_find_index(ARegion *ar, const char *name)
  {
        uiSearchboxData *data = ar->regiondata;
-       return UI_search_items_find_index(&data->items, name, 0);
+       return UI_search_items_find_index(&data->items, name);
  }
  
  /* x and y in screencoords */
@@@ -1061,7 -1059,7 +1061,7 @@@ int ui_searchbox_autocomplete(bContext 
        return match;
  }
  
 -static void ui_searchbox_region_draw_cb(const bContext *UNUSED(C), ARegion *ar)
 +static void ui_searchbox_region_draw_cb(const bContext *C, ARegion *ar)
  {
        uiSearchboxData *data = ar->regiondata;
        
                if (data->preview) {
                        /* draw items */
                        for (a = 0; a < data->items.totitem; a++) {
 +                              /* ensure icon is up-to-date */
 +                              ui_icon_ensure_deferred(C, data->items.icons[a], data->preview);
 +
                                ui_searchbox_butrect(&rect, data, a);
                                
                                /* widget itself */
@@@ -1425,14 -1420,14 +1425,14 @@@ void ui_searchbox_free(bContext *C, ARe
  
  /* sets red alert if button holds a string it can't find */
  /* XXX weak: search_func adds all partial matches... */
- void ui_but_search_refresh(uiBut *but, const bool is_template_ID)
+ void ui_but_search_refresh(uiBut *but)
  {
        uiSearchItems *items;
        int x1;
  
-       /* possibly very large lists (such as ID datablocks),
-        * only validate string and pointer RNA buts */
-       if (but->rnaprop && !ELEM(RNA_property_type(but->rnaprop), PROP_STRING, PROP_POINTER)) {
+       /* possibly very large lists (such as ID datablocks) only
+        * only validate string RNA buts (not pointers) */
+       if (but->rnaprop && RNA_property_type(but->rnaprop) != PROP_STRING) {
                return;
        }
  
                UI_but_flag_enable(but, UI_BUT_REDALERT);
        }
        else if (items->more == 0) {
-               const size_t offset = is_template_ID ? 3 : 0;
-               if (UI_search_items_find_index(items, but->drawstr, offset) == -1) {
+               if (UI_search_items_find_index(items, but->drawstr) == -1) {
                        UI_but_flag_enable(but, UI_BUT_REDALERT);
                }
        }
@@@ -1702,7 -1696,7 +1701,7 @@@ static void ui_block_region_draw(const 
   * Use to refresh centered popups on screen resizing (for splash).
   */
  static void ui_block_region_popup_window_listener(
 -        bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 +        bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn, const Scene *UNUSED(scene))
  {
        switch (wmn->category) {
                case NC_WINDOW:
index 6efaeb882056bf235c959af27d2f065d74d32f77,131584dd405d3f59697e45bfdaf402dcf2cb3804..e3a71feb1a9a4bb23471036dbeea0098fe1a5de9
@@@ -58,8 -58,6 +58,8 @@@
  #include "BKE_depsgraph.h"
  #include "BKE_global.h"
  #include "BKE_idcode.h"
 +#include "BKE_idprop.h"
 +#include "BKE_layer.h"
  #include "BKE_library.h"
  #include "BKE_linestyle.h"
  #include "BKE_main.h"
@@@ -419,31 -417,17 +419,31 @@@ static void template_ID
                type = idptr.type;
  
        if (flag & UI_ID_PREVIEWS) {
 +              ARegion *region = CTX_wm_region(C);
 +              const bool use_big_size = (region->regiontype != RGN_TYPE_HEADER); /* silly check, could be more generic */
 +              /* Ugly exception for screens here, drawing their preview in icon size looks ugly/useless */
 +              const bool use_preview_icon = use_big_size || (id && (GS(id->name) != ID_SCR));
 +              const short width = UI_UNIT_X * (use_big_size ? 6 : 1.6f);
 +              const short height = UI_UNIT_Y * (use_big_size ? 6: 1);
 +
                template->preview = true;
  
 -              but = uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X * 6, UI_UNIT_Y * 6,
 +              but = uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, width, height,
                                     TIP_(template_id_browse_tip(type)));
 -              ui_def_but_icon(but, id ? ui_id_icon_get(C, id, true) : RNA_struct_ui_icon(type),
 -                              UI_HAS_ICON | UI_BUT_ICON_PREVIEW);
 +              if (use_preview_icon) {
 +                      int icon = id ? ui_id_icon_get(C, id, use_big_size) : RNA_struct_ui_icon(type);
 +                      ui_def_but_icon(but, icon, UI_HAS_ICON | UI_BUT_ICON_PREVIEW);
 +              }
 +              else {
 +                      ui_def_but_icon(but, RNA_struct_ui_icon(type), UI_HAS_ICON);
 +                      UI_but_drawflag_enable(but, UI_BUT_ICON_LEFT);
 +              }
  
                if ((idfrom && idfrom->lib) || !editable)
                        UI_but_flag_enable(but, UI_BUT_DISABLED);
 -              
 -              uiLayoutRow(layout, true);
 +              if (use_big_size) {
 +                      uiLayoutRow(layout, true);
 +              }
        }
        else if (flag & UI_ID_BROWSE) {
                but = uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X * 1.6, UI_UNIT_Y,
                but = uiDefButR(block, UI_BTYPE_TEXT, 0, name, 0, 0, UI_UNIT_X * 6, UI_UNIT_Y,
                                &idptr, "name", -1, 0, 0, -1, -1, RNA_struct_ui_description(type));
                UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_RENAME));
-               but->search_func = id_search_cb;
-               but->search_arg = template;
-               ui_but_search_refresh(but, true);
                if (user_alert) UI_but_flag_enable(but, UI_BUT_REDALERT);
  
                if (id->lib) {
@@@ -3741,7 -3720,6 +3736,7 @@@ void uiTemplateKeymapItemProperties(uiL
        if (propptr.data) {
                uiBut *but = uiLayoutGetBlock(layout)->buttons.last;
  
 +              WM_operator_properties_sanitize(&propptr, false);
                template_keymap_item_properties(layout, NULL, &propptr);
  
                /* attach callbacks to compensate for missing properties update,
        }
  }
  
 +/********************************* Overrides *************************************/
 +
 +void uiTemplateOverrideProperty(uiLayout *layout, struct PointerRNA *collection_props_ptr, struct PointerRNA *scene_props_ptr, const char *name, const char *custom_template)
 +{
 +      bool is_set = false;
 +      uiLayout *row, *col;
 +
 +      PointerRNA *ptr;
 +      PropertyRNA *prop;
 +
 +      IDProperty *collection_props = collection_props_ptr->data;
 +
 +      if (IDP_GetPropertyFromGroup(collection_props, name)) {
 +              prop = RNA_struct_find_property(collection_props_ptr, name);
 +              ptr = collection_props_ptr;
 +              is_set = RNA_property_is_set(ptr, prop);
 +      }
 +      else {
 +              /* property doesn't exist yet */
 +              prop = RNA_struct_find_property(scene_props_ptr, name);
 +              ptr = scene_props_ptr;
 +      }
 +
 +      row = uiLayoutRow(layout, false);
 +      col = uiLayoutColumn(row, false);
 +
 +      uiLayoutSetEnabled(col, is_set);
 +
 +      if (custom_template && STREQ(custom_template, "icon_view")) {
 +              uiTemplateIconView(col, ptr, name, false, 5.0f);
 +      }
 +      else {
 +              uiItemFullR(col, ptr, prop, -1, 0, 0, NULL, ICON_NONE);
 +      }
 +
 +      col = uiLayoutColumn(row, false);
 +      uiBut *but;
 +      uiBlock *block = uiLayoutGetBlock(col);
 +      UI_block_emboss_set(block, UI_EMBOSS_NONE);
 +
 +      if (is_set) {
 +              but = uiDefIconButO(block, UI_BTYPE_BUT, "UI_OT_unuse_property_button", WM_OP_EXEC_DEFAULT, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
 +      }
 +      else {
 +              but = uiDefIconButO(block, UI_BTYPE_BUT, "UI_OT_use_property_button", WM_OP_EXEC_DEFAULT, ICON_ZOOMIN, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
 +              /* XXX - Using existing data struct to pass another RNAPointer */
 +              but->rnasearchpoin = *scene_props_ptr;
 +      }
 +
 +      but->rnapoin = *collection_props_ptr;
 +      but->rnaprop = prop;
 +      UI_block_emboss_set(block, UI_EMBOSS);
 +}
 +
  /********************************* Color management *************************************/
  
  void uiTemplateColorspaceSettings(uiLayout *layout, PointerRNA *ptr, const char *propname)
index 9abe768726efc6758947068c4aa96943013d6c11,b340356467a98bc59c749071e7be4419097151be..c9a9e20df233c14444e9e1b0dc718aaaccfc2420
@@@ -42,6 -42,8 +42,6 @@@
  #include "BKE_texture.h"
  #include "BKE_colortools.h"
  
 -#include "depsgraph_private.h"
 -
  #include "RE_shader_ext.h"
  
  #include "MOD_util.h"
@@@ -64,6 -66,10 +64,10 @@@ static void copyData(ModifierData *md, 
        WarpModifierData *wmd = (WarpModifierData *) md;
        WarpModifierData *twmd = (WarpModifierData *) target;
  
+       if (twmd->curfalloff != NULL) {
+               curvemapping_free(twmd->curfalloff);
+       }
        modifier_copyData_generic(md, target);
  
        twmd->curfalloff = curvemapping_copy(wmd->curfalloff);
@@@ -133,6 -139,27 +137,6 @@@ static void foreachTexLink(ModifierDat
        walk(userData, ob, md, "texture");
  }
  
 -static void updateDepgraph(ModifierData *md, DagForest *forest,
 -                           struct Main *UNUSED(bmain),
 -                           struct Scene *UNUSED(scene),
 -                           Object *UNUSED(ob), DagNode *obNode)
 -{
 -      WarpModifierData *wmd = (WarpModifierData *) md;
 -
 -      if (wmd->object_from && wmd->object_to) {
 -              DagNode *fromNode = dag_get_node(forest, wmd->object_from);
 -              DagNode *toNode = dag_get_node(forest, wmd->object_to);
 -
 -              dag_add_relation(forest, fromNode, obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Warp Modifier1");
 -              dag_add_relation(forest, toNode, obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Warp Modifier2");
 -      }
 -
 -      if ((wmd->texmapping == MOD_DISP_MAP_OBJECT) && wmd->map_object) {
 -              DagNode *curNode = dag_get_node(forest, wmd->map_object);
 -              dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Warp Modifier3");
 -      }
 -}
 -
  static void updateDepsgraph(ModifierData *md,
                              struct Main *UNUSED(bmain),
                              struct Scene *UNUSED(scene),
@@@ -364,6 -391,7 +368,6 @@@ ModifierTypeInfo modifierType_Warp = 
        /* requiredDataMask */  requiredDataMask,
        /* freeData */          freeData,
        /* isDisabled */        isDisabled,
 -      /* updateDepgraph */    updateDepgraph,
        /* updateDepsgraph */   updateDepsgraph,
        /* dependsOnTime */     dependsOnTime,
        /* dependsOnNormals */  NULL,