Merge branch 'master' into blender2.8
authorCampbell Barton <ideasman42@gmail.com>
Tue, 13 Mar 2018 07:39:51 +0000 (18:39 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 13 Mar 2018 07:39:51 +0000 (18:39 +1100)
1  2 
intern/cycles/blender/blender_object.cpp
source/blender/blenkernel/BKE_object.h
source/blender/editors/include/ED_uvedit.h
source/blender/editors/uvedit/uvedit_ops.c
tests/python/CMakeLists.txt

index 536b21e83ce93df3b18ce046dbc3f5d97471dda2,5578290c41ab3d69680096557cccd1677bdddf08..11e259e031813e445d83b9f258a19e4579f5fe9a
@@@ -141,18 -122,17 +141,24 @@@ void BKE_object_to_mat4(struct Object *
  void BKE_object_apply_mat4(struct Object *ob, float mat[4][4], const bool use_compat, const bool use_parent);
  void BKE_object_matrix_local_get(struct Object *ob, float mat[4][4]);
  
 +bool BKE_object_pose_context_check_ex(struct Object *ob, bool selected);
  bool BKE_object_pose_context_check(struct Object *ob);
  struct Object *BKE_object_pose_armature_get(struct Object *ob);
 +struct Object *BKE_object_pose_armature_get_visible(struct Object *ob, struct ViewLayer *view_layer);
  
- void BKE_object_get_parent_matrix(struct Scene *scene, struct Object *ob,
-                                   struct Object *par, float parentmat[4][4]);
- void BKE_object_where_is_calc(const struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *ob);
- void BKE_object_where_is_calc_ex(const struct EvaluationContext *eval_ctx, struct Scene *scene, struct RigidBodyWorld *rbw, struct Object *ob, float r_originmat[3][3]);
- void BKE_object_where_is_calc_time(const struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *ob, float ctime);
- void BKE_object_where_is_calc_time_ex(const struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *ob, float ctime,
-                                       struct RigidBodyWorld *rbw, float r_originmat[3][3]);
 -void BKE_object_get_parent_matrix(struct Scene *scene, struct Object *ob, struct Object *par, float parentmat[4][4]);
 -void BKE_object_where_is_calc(struct Scene *scene, struct Object *ob);
++void BKE_object_get_parent_matrix(
++        struct Scene *scene, struct Object *ob,
++        struct Object *par, float parentmat[4][4]);
++void BKE_object_where_is_calc(
++        const struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *ob);
+ void BKE_object_where_is_calc_ex(
 -        struct Scene *scene, struct RigidBodyWorld *rbw, struct Object *ob, float r_originmat[3][3]);
 -void BKE_object_where_is_calc_time(struct Scene *scene, struct Object *ob, float ctime);
++        const struct EvaluationContext *eval_ctx, struct Scene *scene, struct RigidBodyWorld *rbw,
++        struct Object *ob, float r_originmat[3][3]);
++void BKE_object_where_is_calc_time(
++        const struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *ob, float ctime);
+ void BKE_object_where_is_calc_time_ex(
 -        struct Scene *scene, struct Object *ob, float ctime,
++        const struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *ob, float ctime,
+         struct RigidBodyWorld *rbw, float r_originmat[3][3]);
  void BKE_object_where_is_calc_mat4(struct Scene *scene, struct Object *ob, float obmat[4][4]);
  
  /* possibly belong in own moduke? */
@@@ -168,14 -148,18 +174,17 @@@ void BKE_object_dimensions_set(struct O
  void BKE_object_empty_draw_type_set(struct Object *ob, const int value);
  void BKE_object_boundbox_flag(struct Object *ob, int flag, const bool set);
  void BKE_object_minmax(struct Object *ob, float r_min[3], float r_max[3], const bool use_hidden);
- bool BKE_object_minmax_dupli(struct Scene *scene, struct Object *ob, float r_min[3], float r_max[3], const bool use_hidden);
+ bool BKE_object_minmax_dupli(
+         struct Scene *scene, struct Object *ob, float r_min[3], float r_max[3], const bool use_hidden);
  
  /* sometimes min-max isn't enough, we need to loop over each point */
- void BKE_object_foreach_display_point(struct Object *ob, float obmat[4][4],
-                                       void (*func_cb)(const float[3], void *), void *user_data);
- void BKE_scene_foreach_display_point(struct Scene *scene,
-                                      struct ViewLayer *view_layer,
-                                      void (*func_cb)(const float[3], void *), void *user_data);
+ void BKE_object_foreach_display_point(
+         struct Object *ob, float obmat[4][4],
+         void (*func_cb)(const float[3], void *), void *user_data);
+ void BKE_scene_foreach_display_point(
+         struct Scene *scene,
 -        struct View3D *v3d,
 -        const short flag,
++        struct ViewLayer *view_layer,
+         void (*func_cb)(const float[3], void *), void *user_data);
  
  bool BKE_object_parent_loop_check(const struct Object *parent, const struct Object *ob);
  
@@@ -191,58 -175,58 +200,71 @@@ typedef struct ObjectTfmProtectedChanne
        float rotAngle,   drotAngle;
  } ObjectTfmProtectedChannels;
  
- void BKE_object_tfm_protected_backup(const struct Object *ob,
-                                      ObjectTfmProtectedChannels *obtfm);
+ void BKE_object_tfm_protected_backup(
+         const struct Object *ob,
+         ObjectTfmProtectedChannels *obtfm);
  
- void BKE_object_tfm_protected_restore(struct Object *ob,
-                                       const ObjectTfmProtectedChannels *obtfm,
-                                       const short protectflag);
+ void BKE_object_tfm_protected_restore(
+         struct Object *ob,
+         const ObjectTfmProtectedChannels *obtfm,
+         const short protectflag);
  
  /* Dependency graph evaluation callbacks. */
- void BKE_object_eval_local_transform(const struct EvaluationContext *eval_ctx,
-                                      struct Object *ob);
- void BKE_object_eval_parent(const struct EvaluationContext *eval_ctx,
-                             struct Scene *scene,
-                             struct Object *ob);
- void BKE_object_eval_constraints(const struct EvaluationContext *eval_ctx,
-                                  struct Scene *scene,
-                                  struct Object *ob);
+ void BKE_object_eval_local_transform(
 -        struct EvaluationContext *eval_ctx,
++        const struct EvaluationContext *eval_ctx,
+         struct Object *ob);
+ void BKE_object_eval_parent(
 -        struct EvaluationContext *eval_ctx,
++        const struct EvaluationContext *eval_ctx,
+         struct Scene *scene,
+         struct Object *ob);
+ void BKE_object_eval_constraints(
 -        struct EvaluationContext *eval_ctx,
++        const struct EvaluationContext *eval_ctx,
+         struct Scene *scene,
+         struct Object *ob);
 -void BKE_object_eval_done(struct EvaluationContext *eval_ctx, struct Object *ob);
 +void BKE_object_eval_done(const struct EvaluationContext *eval_ctx, struct Object *ob);
  
- bool BKE_object_eval_proxy_copy(const struct EvaluationContext *eval_ct,
-                                 struct Object *object);
- void BKE_object_eval_uber_transform(const struct EvaluationContext *eval_ctx,
-                                     struct Object *ob);
- void BKE_object_eval_uber_data(const struct EvaluationContext *eval_ctx,
-                                struct Scene *scene,
-                                struct Object *ob);
+ bool BKE_object_eval_proxy_copy(
 -        struct EvaluationContext *eval_ctx,
++        const struct EvaluationContext *eval_ctx,
+         struct Object *object);
+ void BKE_object_eval_uber_transform(
 -        struct EvaluationContext *eval_ctx,
++        const struct EvaluationContext *eval_ctx,
+         struct Object *ob);
+ void BKE_object_eval_uber_data(
 -        struct EvaluationContext *eval_ctx,
++        const struct EvaluationContext *eval_ctx,
+         struct Scene *scene,
+         struct Object *ob);
  
- void BKE_object_eval_cloth(const struct EvaluationContext *eval_ctx,
-                            struct Scene *scene,
-                            struct Object *object);
+ void BKE_object_eval_cloth(
 -        struct EvaluationContext *eval_ctx,
++        const struct EvaluationContext *eval_ctx,
+         struct Scene *scene,
+         struct Object *object);
  
- void BKE_object_eval_transform_all(const struct EvaluationContext *eval_ctx,
-                                    struct Scene *scene,
-                                    struct Object *object);
 -
+ void BKE_object_eval_transform_all(
 -        struct EvaluationContext *eval_ctx,
++        const struct EvaluationContext *eval_ctx,
+         struct Scene *scene,
+         struct Object *object);
  
- void BKE_object_eval_update_shading(const struct EvaluationContext *eval_ctx,
-                                     struct Object *object);
- void BKE_object_data_select_update(const struct EvaluationContext *eval_ctx,
-                                    struct ID *object_data);
++void BKE_object_eval_update_shading(
++        const struct EvaluationContext *eval_ctx,
++        struct Object *object);
++void BKE_object_data_select_update(
++        const struct EvaluationContext *eval_ctx,
++        struct ID *object_data);
 +
- void BKE_object_eval_flush_base_flags(const struct EvaluationContext *eval_ctx,
-                                       struct Object *object, struct Base *base,
-                                       const bool is_from_set);
++void BKE_object_eval_flush_base_flags(
++        const struct EvaluationContext *eval_ctx,
++        struct Object *object, struct Base *base,
++        const bool is_from_set);
 +
  void BKE_object_handle_data_update(
 -        struct EvaluationContext *eval_ctx,
 +        const struct EvaluationContext *eval_ctx,
          struct Scene *scene,
          struct Object *ob);
 -void BKE_object_handle_update(struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *ob);
 +void BKE_object_handle_update(
 +        const struct EvaluationContext *eval_ctx,
 +        struct Scene *scene, struct Object *ob);
  void BKE_object_handle_update_ex(
 -        struct EvaluationContext *eval_ctx,
 +        const struct EvaluationContext *eval_ctx,
          struct Scene *scene, struct Object *ob,
          struct RigidBodyWorld *rbw,
          const bool do_proxy_update);
@@@ -289,16 -272,19 +310,18 @@@ typedef enum eObjectSet 
        OB_SET_ALL       /* All Objects      */
  } eObjectSet;
  
- struct LinkNode *BKE_object_relational_superset(struct ViewLayer *view_layer, eObjectSet objectSet, eObRelationTypes includeFilter);
+ struct LinkNode *BKE_object_relational_superset(
 -        struct Scene *scene, eObjectSet objectSet, eObRelationTypes includeFilter);
++        struct ViewLayer *view_layer, eObjectSet objectSet, eObRelationTypes includeFilter);
  struct LinkNode *BKE_object_groups(struct Object *ob);
 -void             BKE_object_groups_clear(struct Scene *scene, struct Base *base, struct Object *object);
 +void             BKE_object_groups_clear(struct Object *object);
  
  struct KDTree *BKE_object_as_kdtree(struct Object *ob, int *r_tot);
  
  bool BKE_object_modifier_use_time(struct Object *ob, struct ModifierData *md);
  
- bool BKE_object_modifier_update_subframe(const struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *ob,
-                                          bool update_mesh, int parent_recursion, float frame, int type);
+ bool BKE_object_modifier_update_subframe(
 -        struct Scene *scene, struct Object *ob, bool update_mesh,
 -        int parent_recursion, float frame,
 -        int type);
++        const struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *ob,
++        bool update_mesh, int parent_recursion, float frame, int type);
  
  #ifdef __cplusplus
  }
index e25c34ddb78270f66ce3cfd8ee2046d10493e429,d2d4732eedb9870ef9434d387ac070945ff77990..15de57da09cc7b866f6c3d860ba00250558df1ed
@@@ -50,49 -49,63 +50,65 @@@ struct wmKeyConfig
  void ED_operatortypes_uvedit(void);
  void ED_keymap_uvedit(struct wmKeyConfig *keyconf);
  
- void ED_uvedit_assign_image(struct Main *bmain, struct Scene *scene, struct Object *obedit, struct Image *ima, struct Image *previma);
+ void ED_uvedit_assign_image(
+         struct Main *bmain, struct Scene *scene, struct Object *obedit, struct Image *ima, struct Image *previma);
  bool ED_uvedit_minmax(struct Scene *scene, struct Image *ima, struct Object *obedit, float min[2], float max[2]);
 +bool ED_uvedit_center(Scene *scene, Image *ima, struct Object *obedit, float cent[2], char mode);
  void ED_uvedit_select_all(struct BMesh *bm);
  
- bool ED_object_get_active_image(struct Object *ob, int mat_nr,
-                                 struct Image **r_ima, struct ImageUser **r_iuser, struct bNode **r_node, struct bNodeTree **r_ntree);
+ bool ED_object_get_active_image(
+         struct Object *ob, int mat_nr,
+         struct Image **r_ima, struct ImageUser **r_iuser, struct bNode **r_node, struct bNodeTree **r_ntree);
  void ED_object_assign_active_image(struct Main *bmain, struct Object *ob, int mat_nr, struct Image *ima);
  
  bool ED_uvedit_test(struct Object *obedit);
  
  /* visibility and selection */
- bool uvedit_face_visible_test(struct Scene *scene, struct Object *obedit, struct Image *ima, struct BMFace *efa);
- bool uvedit_face_select_test(struct Scene *scene, struct BMFace *efa,
-                              const int cd_loop_uv_offset);
- bool uvedit_edge_select_test(struct Scene *scene, struct BMLoop *l,
-                              const int cd_loop_uv_offset);
- bool uvedit_uv_select_test(struct Scene *scene, struct BMLoop *l,
-                            const int cd_loop_uv_offset);
 -bool uvedit_face_visible_test(struct Scene *scene, struct Image *ima, struct BMFace *efa, struct MTexPoly *tf);
++bool uvedit_face_visible_test(
++        struct Scene *scene, struct Object *obedit, struct Image *ima, struct BMFace *efa);
+ bool uvedit_face_select_test(
+         struct Scene *scene, struct BMFace *efa,
+         const int cd_loop_uv_offset);
+ bool uvedit_edge_select_test(
+         struct Scene *scene, struct BMLoop *l,
+         const int cd_loop_uv_offset);
+ bool uvedit_uv_select_test(
+         struct Scene *scene, struct BMLoop *l,
+         const int cd_loop_uv_offset);
  /* uv face */
- bool uvedit_face_select_set(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa, const bool select,
-                             const bool do_history, const int cd_loop_uv_offset);
- bool uvedit_face_select_enable(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa,
-                                const bool do_history, const int cd_loop_uv_offset);
- bool uvedit_face_select_disable(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa,
-                                 const int cd_loop_uv_offset);
+ bool uvedit_face_select_set(
+         struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa, const bool select,
+         const bool do_history, const int cd_loop_uv_offset);
+ bool uvedit_face_select_enable(
+         struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa,
+         const bool do_history, const int cd_loop_uv_offset);
+ bool uvedit_face_select_disable(
+         struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa,
+         const int cd_loop_uv_offset);
  /* uv edge */
- void uvedit_edge_select_set(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const bool select,
-                             const bool do_history, const int cd_loop_uv_offset);
- void uvedit_edge_select_enable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l,
-                                const bool do_history, const int cd_loop_uv_offset);
- void uvedit_edge_select_disable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l,
-                                 const int cd_loop_uv_offset);
+ void uvedit_edge_select_set(
+         struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const bool select,
+         const bool do_history, const int cd_loop_uv_offset);
+ void uvedit_edge_select_enable(
+         struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l,
+         const bool do_history, const int cd_loop_uv_offset);
+ void uvedit_edge_select_disable(
+         struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l,
+         const int cd_loop_uv_offset);
  /* uv vert */
- void uvedit_uv_select_set(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const bool select,
-                           const bool do_history, const int cd_loop_uv_offset);
- void uvedit_uv_select_enable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l,
-                              const bool do_history, const int cd_loop_uv_offset);
- void uvedit_uv_select_disable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l,
-                               const int cd_loop_uv_offset);
- bool ED_uvedit_nearest_uv(struct Scene *scene, struct Object *obedit, struct Image *ima,
-                           const float co[2], float r_uv[2]);
+ void uvedit_uv_select_set(
+         struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const bool select,
+         const bool do_history, const int cd_loop_uv_offset);
+ void uvedit_uv_select_enable(
+         struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l,
+         const bool do_history, const int cd_loop_uv_offset);
+ void uvedit_uv_select_disable(
+         struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l,
+         const int cd_loop_uv_offset);
+ bool ED_uvedit_nearest_uv(
+         struct Scene *scene, struct Object *obedit, struct Image *ima,
+         const float co[2], float r_uv[2]);
  
  void ED_uvedit_get_aspect(struct Scene *scene, struct Object *ob, struct BMesh *em, float *aspx, float *aspy);
  
@@@ -102,7 -115,9 +118,8 @@@ void ED_uvedit_live_unwrap_re_solve(voi
  void ED_uvedit_live_unwrap_end(short cancel);
  
  void ED_uvedit_live_unwrap(struct Scene *scene, struct Object *obedit);
- void ED_uvedit_pack_islands(struct Scene *scene, struct Object *ob, struct BMesh *bm, bool selected, bool correct_aspect, bool do_rotate);
+ void ED_uvedit_pack_islands(
 -        struct Scene *scene, struct Object *ob, struct BMesh *bm,
 -        bool selected, bool correct_aspect, bool do_rotate);
++struct Scene *scene, struct Object *ob, struct BMesh *bm, bool selected, bool correct_aspect, bool do_rotate);
  void ED_uvedit_unwrap_cube_project(
          struct BMesh *bm, float cube_size, bool use_select, const float center[3]);
  
@@@ -111,11 -126,11 +128,12 @@@ void ED_unwrap_lscm(struct Scene *scene
  
  
  /* uvedit_draw.c */
- void ED_image_draw_cursor(struct ARegion *ar, const float cursor[2]);
+ void ED_image_draw_cursor(
 -        struct ARegion *ar, const float cursor[2]);
++struct ARegion *ar, const float cursor[2]);
  void ED_uvedit_draw_main(
 -        struct SpaceImage *sima, struct ARegion *ar, struct Scene *scene,
 -        struct Object *obedit, struct Object *obact);
 +        struct SpaceImage *sima, const struct EvaluationContext *eval_ctx,
 +        struct ARegion *ar, struct Scene *scene, struct ViewLayer *view_layer,
 +        struct Object *obedit, struct Object *obact, struct Depsgraph *depsgraph);
  
  /* uvedit_buttons.c */
  void ED_uvedit_buttons_register(struct ARegionType *art);
index 5b1320df51d23019b055194ab4c5e01ac723e14c,3ab2274f82eb05d54525503404a89c719a31018e..1acd6a1152dab8085bfe348b51863614702cd9bc
@@@ -266,7 -290,48 +278,11 @@@ void ED_uvedit_assign_image(Main *UNUSE
  
  }
  
- /*********************** space conversion *********************/
 -/* dotile - 1, set the tile flag (from the space image)
 - *          2, set the tile index for the faces. */
 -static bool uvedit_set_tile(Object *obedit, Image *ima, int curtile)
 -{
 -      BMEditMesh *em;
 -      BMFace *efa;
 -      BMIter iter;
 -      MTexPoly *tf;
 -      int cd_poly_tex_offset;
 -      
 -      /* verify if we have something to do */
 -      if (!ima || !ED_uvedit_test(obedit))
 -              return false;
 -
 -      if ((ima->tpageflag & IMA_TILES) == 0)
 -              return false;
 -
 -      /* skip assigning these procedural images... */
 -      if (ima->type == IMA_TYPE_R_RESULT || ima->type == IMA_TYPE_COMPOSITE)
 -              return false;
 -      
 -      em = BKE_editmesh_from_object(obedit);
 -
 -      cd_poly_tex_offset = CustomData_get_offset(&em->bm->pdata, CD_MTEXPOLY);
 -
 -      BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
 -              tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
 -
 -              if (BM_elem_flag_test(efa, BM_ELEM_SELECT))
 -                      tf->tile = curtile;  /* set tile index */
 -      }
 -
 -      DAG_id_tag_update(obedit->data, 0);
 -
 -      return true;
 -}
 -
+ /** \} */
+ /* -------------------------------------------------------------------- */
+ /** \name Space Conversion
+  * \{ */
  
  static void uvedit_pixel_to_float(SpaceImage *sima, float *dist, float pixeldist)
  {
@@@ -315,17 -384,15 +335,18 @@@ bool uvedit_face_visible_test(Scene *sc
  {
        ToolSettings *ts = scene->toolsettings;
  
 -      if (ts->uv_flag & UV_SHOW_SAME_IMAGE)
 -              return (tf->tpage == ima) ? uvedit_face_visible_nolocal(scene, efa) : false;
 -      else
 +      if (ts->uv_flag & UV_SHOW_SAME_IMAGE) {
 +              const Image *face_image = BKE_object_material_edit_image_get(obedit, efa->mat_nr);
 +              return (face_image == ima) ? uvedit_face_visible_nolocal(scene, efa) : false;
 +      }
 +      else {
                return uvedit_face_visible_nolocal(scene, efa);
 +      }
  }
  
- bool uvedit_face_select_test(Scene *scene, BMFace *efa,
-                              const int cd_loop_uv_offset)
+ bool uvedit_face_select_test(
+         Scene *scene, BMFace *efa,
+         const int cd_loop_uv_offset)
  {
        ToolSettings *ts = scene->toolsettings;
        if (ts->uv_flag & UV_SYNC_SELECTION) {
@@@ -705,13 -798,17 +746,17 @@@ bool ED_uvedit_center(Scene *scene, Ima
        return changed;
  }
  
- /************************** find nearest ****************************/
+ /** \} */
+ /* -------------------------------------------------------------------- */
+ /** \name Find Nearest Elements
+  * \{ */
  
  bool uv_find_nearest_edge(
 -        Scene *scene, Image *ima, BMEditMesh *em, const float co[2],
 +        Scene *scene, Image *ima, Object *obedit, const float co[2],
          UvNearestHit *hit)
  {
 -      MTexPoly *tf;
 +      BMEditMesh *em = BKE_editmesh_from_object(obedit);
        BMFace *efa;
        BMLoop *l;
        BMIter iter, liter;
@@@ -1091,11 -1205,15 +1141,15 @@@ static int uv_select_edgeloop
        return (select) ? 1 : -1;
  }
  
- /*********************** linked select ***********************/
+ /** \} */
+ /* -------------------------------------------------------------------- */
+ /** \name Select Linked
+  * \{ */
  
  static void uv_select_linked(
 -        Scene *scene, Image *ima, BMEditMesh *em, const float limit[2], UvNearestHit *hit_final,
 -        bool extend, bool select_faces)
 +        Scene *scene, Image *ima, Object *obedit, BMEditMesh *em, const float limit[2],
 +        UvNearestHit *hit_final, bool extend, bool select_faces)
  {
        BMFace *efa;
        BMLoop *l;
@@@ -1730,9 -1886,10 +1801,9 @@@ static int uv_remove_doubles_exec(bCont
                MLoopUV **loop_arr = NULL;
                BLI_array_declare(loop_arr);
  
-               /* TODO, use qsort as with MESH_OT_remove_doubles, this isn't optimal */
+               /* TODO, use kd-tree as with MESH_OT_remove_doubles, this isn't optimal */
                BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
 -                      tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
 -                      if (!uvedit_face_visible_test(scene, ima, efa, tf))
 +                      if (!uvedit_face_visible_test(scene, obedit, ima, efa))
                                continue;
  
                        BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
@@@ -1875,10 -2038,13 +1951,13 @@@ static void UV_OT_weld(wmOperatorType *
        ot->poll = ED_operator_uvedit;
  }
  
+ /** \} */
  
- /* ******************** (de)select all operator **************** */
+ /* -------------------------------------------------------------------- */
+ /** \name (De)Select All Operator
+  * \{ */
  
 -static void uv_select_all_perform(Scene *scene, Image *ima, BMEditMesh *em, int action)
 +static void uv_select_all_perform(Scene *scene, Image *ima, Object *obedit, BMEditMesh *em, int action)
  {
        ToolSettings *ts = scene->toolsettings;
        BMFace *efa;
@@@ -2788,11 -2991,14 +2889,12 @@@ static int uv_border_select_exec(bConte
        MLoopUV *luv;
        rctf rectf;
        bool changed, pinned, select, extend;
-       const bool use_face_center = (ts->uv_flag & UV_SYNC_SELECTION) ?
-                                   (ts->selectmode == SCE_SELECT_FACE) :
-                                   (ts->uv_selectmode == UV_SELECT_FACE);
+       const bool use_face_center = (
+               (ts->uv_flag & UV_SYNC_SELECTION) ?
+               (ts->selectmode == SCE_SELECT_FACE) :
+               (ts->uv_selectmode == UV_SELECT_FACE));
  
        const int cd_loop_uv_offset  = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
 -      const int cd_poly_tex_offset = CustomData_get_offset(&em->bm->pdata, CD_MTEXPOLY);
  
        /* get rectangle from operator */
        WM_operator_properties_border_to_rctf(op, &rectf);
@@@ -3865,6 -4135,82 +4004,12 @@@ static void UV_OT_cursor_set(wmOperator
                             "Cursor location in normalized (0.0-1.0) coordinates", -10.0f, 10.0f);
  }
  
 -/* -------------------------------------------------------------------- */
 -/** \name Set Tile Operator
 - * \{ */
 -
 -static int set_tile_exec(bContext *C, wmOperator *op)
 -{
 -      Image *ima = CTX_data_edit_image(C);
 -      int tile[2];
 -      Object *obedit = CTX_data_edit_object(C);
 -
 -      RNA_int_get_array(op->ptr, "tile", tile);
 -
 -      if (uvedit_set_tile(obedit, ima, tile[0] + ima->xrep * tile[1])) {
 -              WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
 -              WM_event_add_notifier(C, NC_SPACE | ND_SPACE_IMAGE, NULL);
 -
 -              return OPERATOR_FINISHED;
 -      }
 -      
 -      return OPERATOR_CANCELLED;
 -}
 -
 -static int set_tile_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 -{
 -      SpaceImage *sima = CTX_wm_space_image(C);
 -      Image *ima = CTX_data_edit_image(C);
 -      ARegion *ar = CTX_wm_region(C);
 -      float fx, fy;
 -      int tile[2];
 -
 -      if (!ima || !(ima->tpageflag & IMA_TILES))
 -              return OPERATOR_CANCELLED;
 -
 -      UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &fx, &fy);
 -
 -      if (fx >= 0.0f && fy >= 0.0f && fx < 1.0f && fy < 1.0f) {
 -              fx = fx * ima->xrep;
 -              fy = fy * ima->yrep;
 -              
 -              tile[0] = fx;
 -              tile[1] = fy;
 -              
 -              sima->curtile = tile[1] * ima->xrep + tile[0];
 -              RNA_int_set_array(op->ptr, "tile", tile);
 -      }
 -
 -      return set_tile_exec(C, op);
 -}
 -
 -static void UV_OT_tile_set(wmOperatorType *ot)
 -{
 -      /* identifiers */
 -      ot->name = "Set Tile";
 -      ot->description = "Set UV image tile coordinates";
 -      ot->idname = "UV_OT_tile_set";
 -      
 -      /* api callbacks */
 -      ot->exec = set_tile_exec;
 -      ot->invoke = set_tile_invoke;
 -      ot->poll = ED_operator_image_active;
 -
 -      /* flags */
 -      ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 -
 -      /* properties */
 -      RNA_def_int_vector(ot->srna, "tile", 2, NULL, 0, INT_MAX, "Tile", "Tile coordinate", 0, 10);
 -}
 -
 -/** \} */
 -
+ /** \} */
+ /* -------------------------------------------------------------------- */
+ /** \name Seam from UV Islands Operator
+  * \{ */
  static int uv_seams_from_islands_exec(bContext *C, wmOperator *op)
  {
        UvVertMap *vmap;
Simple merge