Merge branch 'master' of git@git.blender.org:blender.git into blender2.8
authormano-wii <germano.costa@ig.com.br>
Tue, 11 Jul 2017 16:54:08 +0000 (13:54 -0300)
committermano-wii <germano.costa@ig.com.br>
Tue, 11 Jul 2017 16:54:08 +0000 (13:54 -0300)
# Conflicts:
# source/blender/editors/transform/transform_snap_object.c

1  2 
source/blender/editors/include/ED_transform_snap_object_context.h
source/blender/editors/transform/transform_snap_object.c
source/blender/makesrna/intern/rna_scene_api.c
source/blenderplayer/bad_level_call_stubs/stubs.c

index cd33e18ce3e1b3fa4702d9a306b5950d379012a9,30cdae416e604bcf48b2bbefc3bccb06073e539b..6e91e47ed193707514160c0589810034aed924af
@@@ -136,13 -135,188 +136,187 @@@ struct SnapObjectContext 
  
  /* -------------------------------------------------------------------- */
  
- /** \name Support for storing all depths, not just the first (raycast 'all')
+ /** Common utilities
+ * \{ */
+ struct SnapObject {
+       struct SnapObject *next, *prev;
+       bool use_obedit;
+       struct Object *ob;
+       float obmat[4][4];
+ };
+ /**
+  * Walks through all objects in the scene to create the list of objets to snap.
   *
-  * This uses a list of #SnapObjectHitDepth structs.
+  * \param sctx: Snap context to store data.
+  * \param snap_select : from enum SnapSelect.
+  * \param use_object_edit_cage : Uses the coordinates of BMesh(if any) to do the snapping.
   *
-  * \{ */
+  */
+ static void create_object_list(
+         SnapObjectContext *sctx,
+         const SnapSelect snap_select, const bool use_object_edit_cage, ListBase *r_obj_list)
+ {
+       r_obj_list->first = r_obj_list->last = NULL;
+       Object *obedit = use_object_edit_cage ? sctx->scene->obedit : NULL;
+       bool ignore_object_selected = false, ignore_object_active = false;
+       switch (snap_select) {
+               case SNAP_ALL:
+                       break;
+               case SNAP_NOT_SELECTED:
+                       ignore_object_selected = true;
+                       break;
+               case SNAP_NOT_ACTIVE:
+                       ignore_object_active = true;
+                       break;
+       }
+       /* Need an exception for particle edit because the base is flagged with BA_HAS_RECALC_DATA
+        * which makes the loop skip it, even the derived mesh will never change
+        *
+        * To solve that problem, we do it first as an exception.
+        * */
 -      Base *base_act = sctx->scene->basact;
++      Base *base_act = sctx->scene_layer->basact;
+       if (base_act && base_act->object && base_act->object->mode & OB_MODE_PARTICLE_EDIT) {
+               struct SnapObject *sobj = MEM_mallocN(sizeof(*sobj), __func__);
+               sobj->use_obedit = false;
+               sobj->ob = base_act->object;
+               copy_m4_m4(sobj->obmat, sobj->ob->obmat);
+               BLI_addtail(r_obj_list, sobj);
+       }
 -      for (Base *base = sctx->scene->base.first; base != NULL; base = base->next) {
 -              if ((BASE_VISIBLE_BGMODE(sctx->v3d_data.v3d, sctx->scene, base)) &&
 -                  (base->flag & (BA_HAS_RECALC_OB | BA_HAS_RECALC_DATA)) == 0 &&
++      for (Base *base = sctx->scene_layer->object_bases.first; base != NULL; base = base->next) {
++              if ((BASE_VISIBLE_NEW(base)) && (base->flag_legacy & (BA_HAS_RECALC_OB | BA_HAS_RECALC_DATA)) == 0 &&
 -                      !((ignore_object_selected && (base->flag & (SELECT | BA_WAS_SEL))) ||
 -                        (ignore_object_active && base == base_act)))
++                      !((ignore_object_selected && ((base->flag & BASE_SELECTED) || (base->flag_legacy & BA_WAS_SEL))) ||
++                      (ignore_object_active && base == base_act)))
+               {
+                       Object *ob = base->object;
+                       if (ob->transflag & OB_DUPLI) {
+                               DupliObject *dupli_ob;
+                               ListBase *lb = object_duplilist(sctx->bmain->eval_ctx, sctx->scene, ob);
+                               for (dupli_ob = lb->first; dupli_ob; dupli_ob = dupli_ob->next) {
+                                       struct SnapObject *sobj = MEM_mallocN(sizeof(*sobj), __func__);
+                                       sobj->use_obedit = obedit && dupli_ob->ob->data == obedit->data;
+                                       sobj->ob = sobj->use_obedit ? obedit : dupli_ob->ob;;
+                                       copy_m4_m4(sobj->obmat, dupli_ob->mat);
+                                       BLI_addtail(r_obj_list, sobj);
+                               }
+                               free_object_duplilist(lb);
+                       }
+                       struct SnapObject *sobj = MEM_mallocN(sizeof(*sobj), __func__);
+                       sobj->use_obedit = obedit && ob->data == obedit->data;
+                       sobj->ob = sobj->use_obedit ? obedit : ob;
+                       copy_m4_m4(sobj->obmat, sobj->ob->obmat);
+                       BLI_addtail(r_obj_list, sobj);
+               }
+       }
+ }
+ /**
+  * Generates a struct with the immutable parameters that will be used on all objects.
+  *
+  * \param snap_to: Element to snap, Vertice, Edge or Face.
+  * \param view_proj: ORTHO or PERSP.
+  * Currently only works one at a time, but can eventually operate as flag.
+  *
+  * \param mval: Mouse coords.
+  * (When NULL, ray-casting is handled without any projection matrix correction.)
+  * \param ray_origin: ray_start before being moved toward the ray_normal at the distance from vew3d clip_min.
+  * \param ray_start: ray_origin moved for the start clipping plane (clip_min).
+  * \param ray_direction: Unit length direction of the ray.
+  * \param depth_range: distances of clipe plane min and clip plane max;
+  */
+ static void snap_data_set(
+         SnapData *snapdata,
+         const ARegion *ar, const unsigned short snap_to, const enum eViewProj view_proj,
+         const float mval[2], const float ray_origin[3], const float ray_start[3],
+         const float ray_direction[3], const float depth_range[2])
+ {
+       copy_m4_m4(snapdata->pmat, ((RegionView3D *)ar->regiondata)->persmat);
+       snapdata->win_half[0] = ar->winx / 2;
+       snapdata->win_half[1] = ar->winy / 2;
+       copy_v2_v2(snapdata->mval, mval);
+       snapdata->snap_to = snap_to;
+       copy_v3_v3(snapdata->ray_origin, ray_origin);
+       copy_v3_v3(snapdata->ray_start, ray_start);
+       copy_v3_v3(snapdata->ray_dir, ray_direction);
+       snapdata->view_proj = view_proj;
+       copy_v2_v2(snapdata->depth_range, depth_range);
+ }
+ MINLINE float depth_get(const float co[3], const float ray_start[3], const float ray_dir[3])
+ {
+       float dvec[3];
+       sub_v3_v3v3(dvec, co, ray_start);
+       return dot_v3v3(dvec, ray_dir);
+ }
+ static float dist_aabb_to_plane(
+         const float bbmin[3], const float bbmax[3],
+         const float plane_co[3], const float plane_no[3])
+ {
+       const float local_bvmin[3] = {
+               (plane_no[0] < 0) ? bbmax[0] : bbmin[0],
+               (plane_no[1] < 0) ? bbmax[1] : bbmin[1],
+               (plane_no[2] < 0) ? bbmax[2] : bbmin[2],
+       };
+       return depth_get(local_bvmin, plane_co, plane_no);
+ }
+ static bool walk_parent_bvhroot_cb(const BVHTreeAxisRange *bounds, void *userdata)
+ {
+       BVHTreeRay *ray = userdata;
+       const float bbmin[3] = {bounds[0].min, bounds[1].min, bounds[2].min};
+       const float bbmax[3] = {bounds[0].max, bounds[1].max, bounds[2].max};
+       if (!isect_ray_aabb_v3_simple(ray->origin, ray->direction, bbmin, bbmax, &ray->radius, NULL)) {
+               ray->radius = -1;
+       }
+       return false;
+ }
+ static bool isect_ray_bvhroot_v3(struct BVHTree *tree, const float ray_start[3], const float ray_dir[3], float *depth)
+ {
+       BVHTreeRay ray;
+       copy_v3_v3(ray.origin, ray_start);
+       copy_v3_v3(ray.direction, ray_dir);
+       BLI_bvhtree_walk_dfs(tree, walk_parent_bvhroot_cb, NULL, NULL, &ray);
+       if (ray.radius > 0) {
+               *depth = ray.radius;
+               return true;
+       }
+       else {
+               return false;
+       }
+ }
+ static int dm_looptri_to_poly_index(DerivedMesh *dm, const MLoopTri *lt);
+ /** \} */
+ /* -------------------------------------------------------------------- */
+ /** \name Ray Cast Funcs
+ * \{ */
+ /* Store all ray-hits
+  * Support for storing all depths, not just the first (raycast 'all') */
  
- /* Store all ray-hits */
  struct RayCastAll_Data {
        void *bvhdata;