[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [61032] branches/vgroup_modifiers/source/ blender: Fix "loop normals" being reset on every transform init.

Bastien Montagne montagne29 at wanadoo.fr
Thu Oct 31 18:13:41 CET 2013


Revision: 61032
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=61032
Author:   mont29
Date:     2013-10-31 17:13:40 +0000 (Thu, 31 Oct 2013)
Log Message:
-----------
Fix "loop normals" being reset on every transform init.

Issue was that in object mode, transform init copies base flag into object flag. Added code to sync both in case of use_loopnormals, but that's most likely not a good solution... Not sure yet what to do!

Modified Paths:
--------------
    branches/vgroup_modifiers/source/blender/blenkernel/BKE_scene.h
    branches/vgroup_modifiers/source/blender/blenkernel/intern/scene.c
    branches/vgroup_modifiers/source/blender/editors/transform/transform_conversions.c
    branches/vgroup_modifiers/source/blender/makesdna/DNA_object_types.h
    branches/vgroup_modifiers/source/blender/makesrna/intern/rna_object.c

Modified: branches/vgroup_modifiers/source/blender/blenkernel/BKE_scene.h
===================================================================
--- branches/vgroup_modifiers/source/blender/blenkernel/BKE_scene.h	2013-10-31 14:20:42 UTC (rev 61031)
+++ branches/vgroup_modifiers/source/blender/blenkernel/BKE_scene.h	2013-10-31 17:13:40 UTC (rev 61032)
@@ -87,8 +87,8 @@
 
 int          BKE_scene_base_iter_next(struct SceneBaseIter *iter, struct Scene **scene, int val, struct Base **base, struct Object **ob);
 
-void BKE_scene_base_flag_to_objects(struct Scene *scene);
-void BKE_scene_base_flag_from_objects(struct Scene *scene);
+void BKE_scene_base_flag_to_objects(struct Scene *scene, unsigned int mask);
+void BKE_scene_base_flag_from_objects(struct Scene *scene, unsigned int mask);
 
 void BKE_scene_set_background(struct Main *bmain, struct Scene *sce);
 struct Scene *BKE_scene_set_name(struct Main *bmain, const char *name);

Modified: branches/vgroup_modifiers/source/blender/blenkernel/intern/scene.c
===================================================================
--- branches/vgroup_modifiers/source/blender/blenkernel/intern/scene.c	2013-10-31 14:20:42 UTC (rev 61031)
+++ branches/vgroup_modifiers/source/blender/blenkernel/intern/scene.c	2013-10-31 17:13:40 UTC (rev 61032)
@@ -1462,22 +1462,22 @@
 	return (type && type->flag & RE_USE_SHADING_NODES);
 }
 
-void BKE_scene_base_flag_to_objects(struct Scene *scene)
+void BKE_scene_base_flag_to_objects(struct Scene *scene, unsigned int mask)
 {
 	Base *base = scene->base.first;
 
 	while (base) {
-		base->object->flag = base->flag;
+		base->object->flag = (base->object->flag & ~mask) | (base->flag & mask);
 		base = base->next;
 	}
 }
 
-void BKE_scene_base_flag_from_objects(struct Scene *scene)
+void BKE_scene_base_flag_from_objects(struct Scene *scene, unsigned int mask)
 {
 	Base *base = scene->base.first;
 
 	while (base) {
-		base->flag = base->object->flag;
+		base->flag = (base->flag & ~mask) | (base->object->flag & mask);
 		base = base->next;
 	}
 }

Modified: branches/vgroup_modifiers/source/blender/editors/transform/transform_conversions.c
===================================================================
--- branches/vgroup_modifiers/source/blender/editors/transform/transform_conversions.c	2013-10-31 14:20:42 UTC (rev 61031)
+++ branches/vgroup_modifiers/source/blender/editors/transform/transform_conversions.c	2013-10-31 17:13:40 UTC (rev 61032)
@@ -4893,7 +4893,7 @@
 		return;
 
 	/* makes sure base flags and object flags are identical */
-	BKE_scene_base_flag_to_objects(t->scene);
+	BKE_scene_base_flag_to_objects(t->scene, OB_BA_FLAG_MASK_ALL);
 
 	/* handle pending update events, otherwise they got copied below */
 	for (base = scene->base.first; base; base = base->next) {

Modified: branches/vgroup_modifiers/source/blender/makesdna/DNA_object_types.h
===================================================================
--- branches/vgroup_modifiers/source/blender/makesdna/DNA_object_types.h	2013-10-31 14:20:42 UTC (rev 61031)
+++ branches/vgroup_modifiers/source/blender/makesdna/DNA_object_types.h	2013-10-31 17:13:40 UTC (rev 61032)
@@ -503,6 +503,9 @@
 
 #define OB_USE_LOOPNORMALS  (1 << 14)
 
+/* Mask of values that should always be the same in base->flag and object->flag. */
+#define OB_BA_FLAG_MASK_ALL ((1 << 16) - 1)
+
 /* WARNING - when adding flags check on PSYS_RECALC */
 /* ob->recalc (flag bits!) */
 enum {

Modified: branches/vgroup_modifiers/source/blender/makesrna/intern/rna_object.c
===================================================================
--- branches/vgroup_modifiers/source/blender/makesrna/intern/rna_object.c	2013-10-31 14:20:42 UTC (rev 61031)
+++ branches/vgroup_modifiers/source/blender/makesrna/intern/rna_object.c	2013-10-31 17:13:40 UTC (rev 61032)
@@ -258,6 +258,13 @@
 	WM_main_add_notifier(NC_OBJECT | ND_DRAW, ptr->id.data);
 }
 
+static void rna_Object_internal_update_data_flag(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+	/* XXX This is a bad hack, have to find a good way to handle this... */
+	BKE_scene_base_flag_from_objects(scene, OB_USE_LOOPNORMALS);  /* Add more flags if needed. */
+	rna_Object_internal_update_data(bmain, scene, ptr);
+}
+
 static void rna_Object_active_shape_update(Main *bmain, Scene *scene, PointerRNA *ptr)
 {
 	Object *ob = ptr->id.data;
@@ -2384,7 +2391,7 @@
 	prop = RNA_def_property(srna, "use_loop_normals", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_USE_LOOPNORMALS);
 	RNA_def_property_ui_text(prop, "Loop Normals", "Enable loop normals for this object");
-	RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update_data");
+	RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update_data_flag");
 
 	prop = RNA_def_property(srna, "split_angle", PROP_FLOAT, PROP_ANGLE);
 	RNA_def_property_float_sdna(prop, NULL, "split_angle");




More information about the Bf-blender-cvs mailing list