[Bf-blender-cvs] [538475dec75] blender2.8: Merge branch 'master' of git at git.blender.org:blender.git into blender2.8

mano-wii noreply at git.blender.org
Tue Jul 11 18:54:16 CEST 2017


Commit: 538475dec7585bb77f57215e722f5b6762907d51
Author: mano-wii
Date:   Tue Jul 11 13:54:08 2017 -0300
Branches: blender2.8
https://developer.blender.org/rB538475dec7585bb77f57215e722f5b6762907d51

Merge branch 'master' of git at git.blender.org:blender.git into blender2.8

# Conflicts:
#	source/blender/editors/transform/transform_snap_object.c

===================================================================



===================================================================

diff --cc source/blender/editors/transform/transform_snap_object.c
index cd33e18ce3e,30cdae416e6..6e91e47ed19
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@@ -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;




More information about the Bf-blender-cvs mailing list