[Bf-blender-cvs] [1477ebe] temp_custom_loop_normals: SetSplitNormal modifier: cleanup!

Bastien Montagne noreply at git.blender.org
Wed Aug 20 21:21:05 CEST 2014


Commit: 1477ebe2842289c4c4815de3a4de33fa6abb9b11
Author: Bastien Montagne
Date:   Wed Aug 20 20:22:43 2014 +0200
Branches: temp_custom_loop_normals
https://developer.blender.org/rB1477ebe2842289c4c4815de3a4de33fa6abb9b11

SetSplitNormal modifier: cleanup!

Merged both target ob data into a single one,
Reworked UI,
Reworked modifier code (also fixed mem leak),
Added an isDisabled callback to modifier,
...

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_setsplitnormal.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 413e316..7a3daef 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1227,27 +1227,20 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
 
     def SET_SPLIT_NORMAL(self, layout, ob, md):
         has_vgroup = bool(md.vertex_group)
-        needs_object_geom = (md.mode == 'OBJECT')
-        needs_object_center = (md.mode == 'ELLIPSOID')
-        has_object_center = bool(md.object_center)
+        needs_object_bbox_center = (md.mode == 'ELLIPSOID') and not md.target
 
-        row = layout.row(align=True)
+        row = layout.row()
         row.prop(md, "mode", expand=True)
 
         split = layout.split()
 
         col = split.column()
-        col.active = needs_object_center
-        col.prop(md, "object_center", text="")
-        row = col.row()
-        row.active = not has_object_center
-        row.prop(md, "use_bbox_center")
+        col.prop(md, "target", text="")
+        sub = col.row()
+        sub.active = needs_object_bbox_center
+        sub.prop(md, "use_bbox_center")
 
         col = split.column()
-        row = col.row()
-        row.active = needs_object_geom
-        row.prop(md, "object_geometry", text="")
-
         row = col.row(align=True)
         row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
         sub = row.row(align=True)
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index e681557..1840e12 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1371,23 +1371,22 @@ enum {
 typedef struct SetSplitNormalModifierData {
 	ModifierData modifier;
 	char defgrp_name[64];  /* MAX_VGROUP_NAME */
-	struct Object *object_geometry;  /* Source of normals. */
-	struct Object *object_center;    /* Center of box or ellipsoid. */
+	struct Object *target;  /* Source of normals, or center of ellipsoid. */
 	short flags;
 	short mode;
 	short pad[2];
 } SetSplitNormalModifierData;
 
-/* SetSplitNormalModifierData.flags */
+/* SetSplitNormalModifierData.mode */
 enum {
-	MOD_SETSPLITNORMAL_INVERT_VGROUP = (1 << 0),
-	MOD_SETSPLITNORMAL_CENTER_BBOX   = (1 << 1),
+	MOD_SETSPLITNORMAL_MODE_ELLIPSOID    = 0,
+	MOD_SETSPLITNORMAL_MODE_GEOM_FACENOR = 1,
 };
 
-/* SetSplitNormalModifierData.mode */
+/* SetSplitNormalModifierData.flags */
 enum {
-	MOD_SETSPLITNORMAL_ELLIPSOID    = 0,
-	MOD_SETSPLITNORMAL_OBJECT       = 1,
+	MOD_SETSPLITNORMAL_INVERT_VGROUP = (1 << 0),
+	MOD_SETSPLITNORMAL_CENTER_BBOX   = (1 << 1),
 };
 
 
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 77b6720..c28c426 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -406,8 +406,7 @@ RNA_MOD_OBJECT_SET(Curve, object, OB_CURVE);
 RNA_MOD_OBJECT_SET(Lattice, object, OB_LATTICE);
 RNA_MOD_OBJECT_SET(Mask, ob_arm, OB_ARMATURE);
 RNA_MOD_OBJECT_SET(MeshDeform, object, OB_MESH);
-RNA_MOD_OBJECT_SET(SetSplitNormal, object_geometry, OB_MESH);
-RNA_MOD_OBJECT_SET(SetSplitNormal, object_center, OB_EMPTY);
+RNA_MOD_OBJECT_SET(SetSplitNormal, target, OB_EMPTY);
 RNA_MOD_OBJECT_SET(Shrinkwrap, target, OB_MESH);
 RNA_MOD_OBJECT_SET(Shrinkwrap, auxTarget, OB_MESH);
 
@@ -3676,9 +3675,9 @@ static void rna_def_modifier_setsplitnormal(BlenderRNA *brna)
 	PropertyRNA *prop;
 
 	static EnumPropertyItem prop_mode_items[] = {
-		{MOD_SETSPLITNORMAL_ELLIPSOID, "ELLIPSOID", 0, "Ellipsoid",
-		                               "From an ellipsoid (shape defined by the boundbox's dimensions)"},
-		{MOD_SETSPLITNORMAL_OBJECT, "OBJECT", 0, "Object", "From a mesh object"},
+		{MOD_SETSPLITNORMAL_MODE_ELLIPSOID, "ELLIPSOID", 0, "Ellipsoid",
+		        "From an ellipsoid (shape defined by the boundbox's dimensions - target is optional)"},
+		{MOD_SETSPLITNORMAL_MODE_GEOM_FACENOR, "FACE_NORMALS", 0, "Face Normals", "From a mesh's face normals"},
 		{0, NULL, 0, NULL, NULL}
 	};
 
@@ -3689,31 +3688,12 @@ static void rna_def_modifier_setsplitnormal(BlenderRNA *brna)
 
 	prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
 	RNA_def_property_enum_items(prop, prop_mode_items);
-	RNA_def_property_ui_text(prop, "Mode", "How to get our normals");
+	RNA_def_property_ui_text(prop, "Mode", "How to affect (generate) normals");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
-	prop = RNA_def_property(srna, "object_geometry", PROP_POINTER, PROP_NONE);
-	RNA_def_property_ui_text(prop, "Object", "Mesh object to take normals from (use nearest face's normal)");
-	RNA_def_property_pointer_funcs(prop, NULL, "rna_SetSplitNormalModifier_object_geometry_set", NULL, NULL);
-	RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
-	RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
-
-	prop = RNA_def_property(srna, "use_bbox_center", PROP_BOOLEAN, PROP_NONE);
-	RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SETSPLITNORMAL_CENTER_BBOX);
-	RNA_def_property_ui_text(prop, "BoundingBox Center",
-	                         "Center ellipsoid on bounding box center instead of own object center");
-	RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
-	prop = RNA_def_property(srna, "object_center", PROP_POINTER, PROP_NONE);
-	RNA_def_property_ui_text(prop, "Object Center",
-	                         "Center ellipsoid on this object center (overrides BoundingBox Center when set)");
-	RNA_def_property_pointer_funcs(prop, NULL, "rna_SetSplitNormalModifier_object_center_set", NULL, NULL);
-	RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
-	RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
-
 	prop = RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
 	RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
-	RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name for selecting the affected areas");
+	RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name for selecting/weighting the affected areas");
 	RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SetSplitNormalModifier_defgrp_name_set");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
@@ -3721,6 +3701,18 @@ static void rna_def_modifier_setsplitnormal(BlenderRNA *brna)
 	RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SETSPLITNORMAL_INVERT_VGROUP);
 	RNA_def_property_ui_text(prop, "Invert", "Invert vertex group influence");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
+	RNA_def_property_ui_text(prop, "Target", "Target object used to affect normal");
+	RNA_def_property_pointer_funcs(prop, NULL, "rna_SetSplitNormalModifier_target_set", NULL, NULL);
+	RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
+	RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
+
+	prop = RNA_def_property(srna, "use_bbox_center", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SETSPLITNORMAL_CENTER_BBOX);
+	RNA_def_property_ui_text(prop, "BoundingBox Center",
+	                         "Center ellipsoid on bounding box center instead of own object center");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
 void RNA_def_modifier(BlenderRNA *brna)
diff --git a/source/blender/modifiers/intern/MOD_setsplitnormal.c b/source/blender/modifiers/intern/MOD_setsplitnormal.c
index f93fa44..eef41e7 100644
--- a/source/blender/modifiers/intern/MOD_setsplitnormal.c
+++ b/source/blender/modifiers/intern/MOD_setsplitnormal.c
@@ -50,11 +50,24 @@
 #include "MOD_util.h"
 
 
+static bool is_valid_target(SetSplitNormalModifierData *smd)
+{
+	if (smd->mode == MOD_SETSPLITNORMAL_MODE_ELLIPSOID) {
+		return true;
+	}
+	else if (smd->mode == MOD_SETSPLITNORMAL_MODE_GEOM_FACENOR &&
+	         smd->target && smd->target->type == OB_MESH)
+	{
+		return true;
+	}
+	return false;
+}
+
 static void initData(ModifierData *md)
 {
 	SetSplitNormalModifierData *smd = (SetSplitNormalModifierData *) md;
 
-	smd->mode = MOD_SETSPLITNORMAL_ELLIPSOID;
+	smd->mode = MOD_SETSPLITNORMAL_MODE_ELLIPSOID;
 }
 
 static void copyData(ModifierData *md, ModifierData *target)
@@ -83,16 +96,21 @@ static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk,
 {
 	SetSplitNormalModifierData *smd = (SetSplitNormalModifierData *) md;
 
-	walk(userData, ob, &smd->object_geometry);
-	walk(userData, ob, &smd->object_center);
+	walk(userData, ob, &smd->target);
 }
 
 static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
 {
 	SetSplitNormalModifierData *smd = (SetSplitNormalModifierData *) md;
 
-	walk(userData, ob, (ID **)&smd->object_geometry);
-	walk(userData, ob, (ID **)&smd->object_center);
+	walk(userData, ob, (ID **)&smd->target);
+}
+
+static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams))
+{
+	SetSplitNormalModifierData *smd = (SetSplitNormalModifierData *)md;
+
+	return !is_valid_target(smd);
 }
 
 static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UNUSED(scene),
@@ -100,14 +118,8 @@ static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UN
 {
 	SetSplitNormalModifierData *smd = (SetSplitNormalModifierData *) md;
 
-	if (smd->object_geometry) {
-		DagNode *Node = dag_get_node(forest, smd->object_geometry);
-
-		dag_add_relation(forest, Node, obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "SetSplitNormal Modifier");
-	}
-
-	if (smd->object_center) {
-		DagNode *Node = dag_get_node(forest, smd->object_center);
+	if (smd->target) {
+		DagNode *Node = dag_get_node(forest, smd->target);
 
 		dag_add_relation(forest, Node, obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "SetSplitNormal Modifier");
 	}
@@ -198,9 +210,177 @@ static float vertex_weight(MDeformVert *dvert, const int index, const int defgrp
 	return (!dvert || defgrp_index == -1) ? 1.0f :  defvert_find_weight(&dvert[index], defgrp_index);
 }
 
+static void setSplitNormalModifier_do_ellipsoid(
+        SetS

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list