[Bf-blender-cvs] [2e662bbca47] uv_unwrapping_slim_algorithm: SLIM: use operator history instead of toolsettings for remembering settings.

Brecht Van Lommel noreply at git.blender.org
Mon Mar 27 22:44:34 CEST 2017


Commit: 2e662bbca477d8a179dcbd25c52a17e8e4a7d518
Author: Brecht Van Lommel
Date:   Sat Mar 25 16:14:30 2017 +0100
Branches: uv_unwrapping_slim_algorithm
https://developer.blender.org/rB2e662bbca477d8a179dcbd25c52a17e8e4a7d518

SLIM: use operator history instead of toolsettings for remembering settings.

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

M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenloader/intern/versioning_260.c
M	source/blender/blenloader/intern/versioning_legacy.c
M	source/blender/editors/include/ED_uvedit.h
M	source/blender/editors/uvedit/uvedit_ops.c
M	source/blender/editors/uvedit/uvedit_unwrap_ops.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_event_system.c

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

diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 56bfe5d7ff1..1e8c1a0db05 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -597,7 +597,6 @@ void BKE_scene_init(Scene *sce)
 	sce->toolsettings->doublimit = 0.001;
 	sce->toolsettings->vgroup_weight = 1.0f;
 	sce->toolsettings->uvcalc_margin = 0.001f;
-	sce->toolsettings->unwrapper = 1;
 	sce->toolsettings->select_thresh = 0.01f;
 
 	sce->toolsettings->selectmode = SCE_SELECT_VERTEX;
diff --git a/source/blender/blenloader/intern/versioning_260.c b/source/blender/blenloader/intern/versioning_260.c
index ab3d14af882..4a856feaa1a 100644
--- a/source/blender/blenloader/intern/versioning_260.c
+++ b/source/blender/blenloader/intern/versioning_260.c
@@ -1707,13 +1707,12 @@ void blo_do_versions_260(FileData *fd, Library *UNUSED(lib), Main *main)
 	}
 
 	if (main->versionfile < 264 || (main->versionfile == 264 && main->subversionfile < 5)) {
-		/* set a unwrapping margin and ABF by default */
+		/* set a UV margin by default */
 		Scene *scene;
 
 		for (scene = main->scene.first; scene; scene = scene->id.next) {
 			if (scene->toolsettings->uvcalc_margin == 0.0f) {
 				scene->toolsettings->uvcalc_margin = 0.001f;
-				scene->toolsettings->unwrapper = 0;
 			}
 		}
 	}
diff --git a/source/blender/blenloader/intern/versioning_legacy.c b/source/blender/blenloader/intern/versioning_legacy.c
index f2d42849bcc..921c69fcaa4 100644
--- a/source/blender/blenloader/intern/versioning_legacy.c
+++ b/source/blender/blenloader/intern/versioning_legacy.c
@@ -2236,12 +2236,6 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *main)
 			if (sce->nodetree)
 				ntree_version_241(sce->nodetree);
 
-			/* uv calculation options moved to toolsettings */
-			if (sce->toolsettings->unwrapper == 0) {
-				sce->toolsettings->uvcalc_flag = UVCALC_FILLHOLES;
-				sce->toolsettings->unwrapper = 1;
-			}
-
 			if (sce->r.mode & R_PANORAMA) {
 				/* all these checks to ensure saved files between released versions keep working... */
 				if (sce->r.xsch < sce->r.ysch) {
diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h
index 535683823bf..a0ff29790fe 100644
--- a/source/blender/editors/include/ED_uvedit.h
+++ b/source/blender/editors/include/ED_uvedit.h
@@ -42,8 +42,10 @@ struct Main;
 struct Object;
 struct Scene;
 struct SpaceImage;
+struct UnwrapProperties;
 struct bNode;
 struct wmKeyConfig;
+struct wmOperator;
 
 /* uvedit_ops.c */
 void ED_operatortypes_uvedit(void);
@@ -104,7 +106,7 @@ void ED_uvedit_pack_islands(struct Scene *scene, struct Object *ob, struct BMesh
 void ED_uvedit_unwrap_cube_project(struct Object *ob, struct BMesh *bm, float cube_size, bool use_select);
 
 /* single call up unwrap using scene settings, used for edge tag unwrapping */
-void ED_unwrap_lscm(struct Scene *scene, struct Object *obedit, const short sel);
+void ED_uvedit_unwrap(struct Scene *scene, struct Object *obedit, const short sel, struct wmOperator *op);
 
 
 /* uvedit_draw.c */
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index 193b006cf0d..c7b292d1458 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -4182,7 +4182,7 @@ static int uv_mark_seam_exec(bContext *C, wmOperator *op)
 	me->drawflag |= ME_DRAWSEAMS;
 
 	if (scene->toolsettings->edge_mode_live_unwrap)
-		ED_unwrap_lscm(scene, ob, false);
+		ED_uvedit_unwrap(scene, ob, false, NULL);
 
 	DAG_id_tag_update(&me->id, 0);
 	WM_event_add_notifier(C, NC_GEOM | ND_DATA, me);
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index ed01971fecc..2f288708160 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -76,7 +76,6 @@
 #include "RNA_access.h"
 #include "RNA_define.h"
 
-
 #include "WM_api.h"
 #include "WM_types.h"
 
@@ -86,24 +85,6 @@
 #include "slim_matrix_transfer.h"
 #include "slim_capi.h"
 
-static void modifier_unwrap_state(Object *obedit, Scene *scene, bool *r_use_subsurf)
-{
-	ModifierData *md;
-	bool subsurf = (scene->toolsettings->uvcalc_flag & UVCALC_USESUBSURF) != 0;
-
-	md = obedit->modifiers.first;
-
-	/* subsurf will take the modifier settings only if modifier is first or right after mirror */
-	if (subsurf) {
-		if (md && md->type == eModifierType_Subsurf)
-			subsurf = true;
-		else
-			subsurf = false;
-	}
-
-	*r_use_subsurf = subsurf;
-}
-
 static bool ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit)
 {
 	Main *bmain = CTX_data_main(C);
@@ -167,6 +148,61 @@ static bool ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit)
 	return 1;
 }
 
+/******************* Remembered Properties ******************/
+
+typedef struct UnwrapProperties {
+	bool use_slim;
+	bool use_abf;
+	bool correct_aspect;
+	bool fill_holes;
+	bool use_subsurf;
+	char vertex_group[MAX_ID_NAME];
+	float vertex_group_factor;
+	float relative_scale;
+	int reflection_mode;
+	int iterations;
+} UnwrapProperties;
+
+static UnwrapProperties unwrap_properties_get(wmOperator *op, Object *ob)
+{
+	/* We use the properties from the last unwrap operator for subsequent
+	 * live unwrap and minize stretch operators. */
+	PointerRNA ptr;
+	WM_operator_last_properties_alloc(op, "UV_OT_unwrap", &ptr);
+
+	UnwrapProperties unwrap;
+	unwrap.use_abf = RNA_enum_get(&ptr, "method") == 0;
+	unwrap.use_slim = RNA_enum_get(&ptr, "method") == 2;
+	unwrap.correct_aspect = RNA_boolean_get(&ptr, "correct_aspect");
+	unwrap.fill_holes = RNA_boolean_get(&ptr, "fill_holes");
+	unwrap.use_subsurf = RNA_boolean_get(&ptr, "use_subsurf_data");
+	RNA_string_get(&ptr, "vertex_group", unwrap.vertex_group);
+	unwrap.vertex_group_factor = RNA_float_get(&ptr, "vertex_group_factor");
+	unwrap.relative_scale = RNA_float_get(&ptr, "relative_scale");
+	unwrap.reflection_mode = RNA_enum_get(&ptr, "reflection_mode");
+	unwrap.iterations = RNA_int_get(&ptr, "iterations");
+
+	/* SLIM requires hole filling */
+	if (unwrap.use_slim) {
+		unwrap.fill_holes = true;
+	}
+
+	/* Subsurf will take the modifier settings only if modifier is first or right after mirror */
+	if (unwrap.use_subsurf) {
+		ModifierData *md = ob->modifiers.first;
+
+		if (!(md && md->type == eModifierType_Subsurf)) {
+			unwrap.use_subsurf = false;
+			if (op)
+				BKE_report(op->reports, RPT_INFO, "Subdivision Surface modifier needs to be first to work with unwrap");
+		}
+	}
+
+	WM_operator_properties_free(&ptr);
+
+	return unwrap;
+}
+
 /****************** Parametrizer Conversion ***************/
 
 static bool uvedit_have_selection(Scene *scene, BMEditMesh *em, bool implicit)
@@ -523,7 +559,7 @@ static void create_weight_matrix(BMesh *bm,
 	}
 }
 
-static int retrieve_weightmap_index(Object *obedit, char *vertex_group)
+static int retrieve_weightmap_index(Object *obedit, const char *vertex_group)
 {
 	return defgroup_name_index(obedit, vertex_group);
 }
@@ -540,14 +576,16 @@ static void fill_in_matrix_transfer(SLIMMatrixTransfer *mt,
 	mt->relative_scale = relative_scale;
 }
 
-static void enrich_handle_slim(Scene *scene,
-							   Object *obedit,
+static void enrich_handle_slim(Object *obedit,
 							   BMEditMesh *em,
 							   ParamHandle *handle,
 							   SLIMMatrixTransfer *mt,
-							   bool is_minimize_stretch)
+							   bool is_minimize_stretch,
+							   const UnwrapProperties *unwrap,
+							   bool skip_initialization,
+							   bool pack_islands)
 {
-	int weight_map_index = retrieve_weightmap_index(obedit, scene->toolsettings->slim_vertex_group);
+	int weight_map_index = retrieve_weightmap_index(obedit, unwrap->vertex_group);
 	bool with_weighted_parameterization = (weight_map_index >=0);
 	float *weight_array = NULL;
 
@@ -561,17 +599,14 @@ static void enrich_handle_slim(Scene *scene,
 
 	fill_in_matrix_transfer(mt,
 							with_weighted_parameterization,
-							scene->toolsettings->slim_weight_influence,
-							scene->toolsettings->slim_pack_islands,
-							scene->toolsettings->slim_relative_scale);
-
-	int n_iterations = scene->toolsettings->slim_n_iterations;
-	bool skip_initialization = scene->toolsettings->slim_skip_initialization;
+							unwrap->vertex_group_factor,
+							pack_islands,
+							unwrap->relative_scale);
 
 	param_slim_enrich_handle(handle,
 							 mt,
 							 weight_array,
-							 n_iterations,
+							 unwrap->iterations,
 							 skip_initialization,
 							 is_minimize_stretch);
 }
@@ -606,6 +641,14 @@ static bool minimize_stretch_init(bContext *C, wmOperator *op)
 	Scene *scene = CTX_data_scene(C);
 	Object *obedit = CTX_data_edit_object(C);
 	BMEditMesh *em = BKE_editmesh_from_object(obedit);
+	bool implicit = true;
+
+	if (!uvedit_have_selection(scene, em, implicit)) {
+		return false;
+	}
+
+	UnwrapProperties unwrap = unwrap_properties_get(NULL, obedit);
+	unwrap.fill_holes = true;
 
 	ParamHandle *handle = construct_param_handle(scene, obedit, em->bm, false, true, 1, 1);
 
@@ -620,11 +663,7 @@ static bool minimize_stretch_init(bContext *C, wmOperator *op)
 	ms->fixBorder = RNA_boolean_get(op->ptr, "fix_boundary");
 	rs->mt->fixed_boundary = RNA_boolean_get(op->ptr, "fix_boundary");
 
-	scene->toolsettings->slim_skip_initialization = true;
-	scene->toolsettings->slim_pack_islands = false;
-	scene->toolsettings->slim_fixed_boundary = RNA_boolean_get(op->ptr, "fix_boundary");
-
-	enrich_handle_slim(scene, obedit, em, handle, rs->mt, true);
+	enrich_handle_slim(obedit, em, handle, rs->mt, true, &unwrap, true, false);
 	param_slim_begin(handle);
 
 	rs->slimPtrs = MEM_callocN(sizeof(rs->slimPtrs)*rs->mt->n_charts, "pointers to per-chart-Data for Slim");
@@ -903,34 +942,26 @@ static ParamHandle *liveHandle = NULL;
 
 void ED_uvedit_live_unwrap_begin(Scene *scene, Object *obedit)
 {
-
 	BMEditMesh *em = BKE_editmesh_from_object(obedit);
-	const bool abf = (scene->toolsettings->unwrapper == 0);
-	const bool fillholes = (scene->toolsettings->uvcalc_flag & UVCALC_FILLHOLES) != 0;
-	bool use_subsurf;
-
-	modifier_unwrap_state(obedit, scene, &use_subsurf);
 
 	if (!ED_uvedit_test(obedit)) {
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list