[Bf-blender-cvs] [ff98475fccd] sculpt-mode-features: yay, multi-object volume CSG finally operational :)

Martin Felke noreply at git.blender.org
Mon Apr 8 21:55:36 CEST 2019


Commit: ff98475fccd98a45ba044821363042ee005c7ba7
Author: Martin Felke
Date:   Mon Apr 8 21:54:42 2019 +0200
Branches: sculpt-mode-features
https://developer.blender.org/rBff98475fccd98a45ba044821363042ee005c7ba7

yay, multi-object volume CSG finally operational :)

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

M	intern/openvdb/intern/openvdb_level_set.cc
M	intern/openvdb/intern/openvdb_level_set.h
M	intern/openvdb/openvdb_capi.cc
M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/blenkernel/intern/modifier.c
M	source/blender/editors/object/object_intern.h
M	source/blender/editors/object/object_modifier.c
M	source/blender/editors/object/object_ops.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_remesh.c

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

diff --git a/intern/openvdb/intern/openvdb_level_set.cc b/intern/openvdb/intern/openvdb_level_set.cc
index bd2772f027c..280b008f369 100644
--- a/intern/openvdb/intern/openvdb_level_set.cc
+++ b/intern/openvdb/intern/openvdb_level_set.cc
@@ -117,27 +117,24 @@ void OpenVDBLevelSet::OpenVDB_level_set_filter(OpenVDBLevelSet_FilterType filter
 		break;
 	}
 }
-void OpenVDBLevelSet::OpenVDB_CSG_operation(openvdb::FloatGrid::Ptr gridOut, openvdb::FloatGrid::Ptr gridA, openvdb::FloatGrid::Ptr gridB,
-						   OpenVDBLevelSet_CSGOperation operation)
+openvdb::FloatGrid::Ptr OpenVDBLevelSet::OpenVDB_CSG_operation(openvdb::FloatGrid::Ptr gridA, openvdb::FloatGrid::Ptr gridB, OpenVDBLevelSet_CSGOperation operation)
 {
 	openvdb::FloatGrid::Ptr gridA_copy = gridA->deepCopy();
 	openvdb::FloatGrid::Ptr gridB_copy = gridB->deepCopy();
 
 	switch (operation) {
 		case OPENVDB_LEVELSET_CSG_UNION:
-			openvdb::tools::csgUnion(*gridA, *gridB);
+			openvdb::tools::csgUnion(*gridA_copy, *gridB_copy);
 		break;
 		case OPENVDB_LEVELSET_CSG_DIFFERENCE:
-			openvdb::tools::csgDifference(*gridA, *gridB);
+			openvdb::tools::csgDifference(*gridA_copy, *gridB_copy);
 		break;
 		case OPENVDB_LEVELSET_CSG_INTERSECTION:
-			openvdb::tools::csgIntersection(*gridA, *gridB);
+			openvdb::tools::csgIntersection(*gridA_copy, *gridB_copy);
 		break;
 	}
 
-	gridOut = gridA->deepCopy();
-	gridA = gridA_copy->deepCopy();
-	gridB = gridB_copy->deepCopy();
+	return gridA_copy;
 }
 
 openvdb::FloatGrid::Ptr OpenVDBLevelSet::OpenVDB_level_set_get_grid(){
diff --git a/intern/openvdb/intern/openvdb_level_set.h b/intern/openvdb/intern/openvdb_level_set.h
index 64e717484b8..a4779bd1308 100644
--- a/intern/openvdb/intern/openvdb_level_set.h
+++ b/intern/openvdb/intern/openvdb_level_set.h
@@ -49,7 +49,7 @@ public:
 							const double isovalue, const double adaptivity, const bool relax_disoriented_triangles);
 	void OpenVDB_volume_to_mesh(struct OpenVDBVolumeToMeshData *mesh, const double isovalue, const double adaptivity, const bool relax_disoriented_triangles);
 	void OpenVDB_level_set_filter(OpenVDBLevelSet_FilterType filter_type, int width, int iterations, int filter_bias);
-	void OpenVDB_CSG_operation(openvdb::FloatGrid::Ptr gridOut, openvdb::FloatGrid::Ptr gridA, openvdb::FloatGrid::Ptr gridB,
+	openvdb::FloatGrid::Ptr OpenVDB_CSG_operation(openvdb::FloatGrid::Ptr gridA, openvdb::FloatGrid::Ptr gridB,
 						   OpenVDBLevelSet_CSGOperation operation);
 };
 
diff --git a/intern/openvdb/openvdb_capi.cc b/intern/openvdb/openvdb_capi.cc
index 12d7ec88c57..08057faccf2 100644
--- a/intern/openvdb/openvdb_capi.cc
+++ b/intern/openvdb/openvdb_capi.cc
@@ -298,8 +298,10 @@ void OpenVDBLevelSet_filter(struct OpenVDBLevelSet *level_set, OpenVDBLevelSet_F
 void OpenVDBLevelSet_CSG_operation(struct OpenVDBLevelSet *out, struct OpenVDBLevelSet *gridA, struct OpenVDBLevelSet *gridB,
 								   OpenVDBLevelSet_CSGOperation operation)
 {
-	out->OpenVDB_CSG_operation(out->OpenVDB_level_set_get_grid(), gridA->OpenVDB_level_set_get_grid(),
-							   gridB->OpenVDB_level_set_get_grid(), operation);
+	openvdb::FloatGrid::Ptr grid = out->OpenVDB_CSG_operation(gridA->OpenVDB_level_set_get_grid(),
+	                                                          gridB->OpenVDB_level_set_get_grid(),
+	                                                          operation);
+	out->OpenVDB_level_set_set_grid(grid);
 }
 
 void OpenVDBLevelSet_set_transform(struct OpenVDBLevelSet *level_set, float* transform)
diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 2414c775866..5233744dd3d 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1204,8 +1204,6 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
             layout.prop(md, "sharpness")
 
         if md.mode == 'VOXEL':
-            #layout.prop(md, "object")
-            #layout.prop(md, "operation")
             col = layout.column(align=True)
             col.prop(md, "voxel_size")
             col.prop(md, "isovalue")
@@ -1221,6 +1219,19 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
             layout.prop(md, "smooth_normals")
             layout.prop(md, "relax_triangles")
             layout.prop(md, "reproject_vertex_paint")
+            layout.label(text="CSG Operands")
+            layout.operator("remesh.csg_add", text="+")
+            for i,csg in enumerate(md.csg_operands):
+                box = layout.box()
+                row = box.row(align=True)
+                row.prop(csg, "enabled", text="")
+                row.prop(csg, "object", text="")
+                row.prop(csg, "operation", text="")
+                row = box.row(align=True)
+                row.prop(csg, "voxel_size")
+                row.operator("remesh.csg_remove", text="-").index = i
+                row.operator("remesh.csg_move_up", text="", icon="TRIA_UP").index = i
+                row.operator("remesh.csg_move_down", text="", icon="TRIA_DOWN").index = i
         else:
             layout.prop(md, "use_smooth_shade")
             layout.prop(md, "use_remove_disconnected")
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index fe955ced5f5..c6d1a4043a0 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -157,6 +157,18 @@ void modifier_free_ex(ModifierData *md, const int flag)
 			mti->foreachObjectLink(md, NULL, (ObjectWalkFunc)modifier_free_data_id_us_cb, NULL);
 		}
 	}
+#if 0
+	if (md->type == eModifierType_Remesh)
+	{
+		if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0){
+			/* is this a regular free ? */
+			RemeshModifierData *rmd = (RemeshModifierData*)md;
+			if (rmd->shared) {
+				//MEM_freeN(rmd->shared);
+			}
+		}
+	}
+#endif
 
 	if (mti->freeData) mti->freeData(md);
 	if (md->error) MEM_freeN(md->error);
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index ca72e694564..1b1547f7d62 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -282,4 +282,9 @@ void OBJECT_OT_remesh(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_to_loop_colors(struct wmOperatorType *ot);
 void OBJECT_OT_loop_to_vertex_colors(struct wmOperatorType *ot);
 
+void REMESH_OT_csg_add(struct wmOperatorType *ot);
+void REMESH_OT_csg_remove(struct wmOperatorType *ot);
+void REMESH_OT_csg_move_up(struct wmOperatorType *ot);
+void REMESH_OT_csg_move_down(struct wmOperatorType *ot);
+
 #endif /* __OBJECT_INTERN_H__ */
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index c3a562df037..60080090050 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2404,3 +2404,202 @@ void OBJECT_OT_surfacedeform_bind(wmOperatorType *ot)
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
 	edit_modifier_properties(ot);
 }
+
+static bool remesh_csg_poll(bContext *C)
+{
+	return edit_modifier_poll_generic(C, &RNA_RemeshModifier, 0);
+}
+
+static int remesh_csg_add_exec(bContext *C, wmOperator *op)
+{
+	Object *ob = ED_object_active_context(C);
+	RemeshModifierData *rmd = (RemeshModifierData *)edit_modifier_property_get(op, ob, eModifierType_Remesh);
+
+	if (rmd == NULL) {
+		return OPERATOR_CANCELLED;
+	}
+
+	CSGVolume_Object *vcob = MEM_callocN(sizeof(CSGVolume_Object), "vcob");
+	vcob->voxel_size = 0.1f;
+	vcob->flag |= MOD_REMESH_CSG_OBJECT_ENABLED;
+	BLI_addtail(&rmd->csg_operands, vcob);
+
+	DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE);
+	WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
+
+	return OPERATOR_FINISHED;
+}
+
+static int remesh_csg_add_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
+{
+	if (edit_modifier_invoke_properties(C, op))
+		return remesh_csg_add_exec(C, op);
+	else
+		return OPERATOR_CANCELLED;
+}
+
+void REMESH_OT_csg_add(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Add CSG Object";
+	ot->description = "Add CSG Object to remesh modifier";
+	ot->idname = "REMESH_OT_csg_add";
+
+	/* api callbacks */
+	ot->poll = remesh_csg_poll;
+	ot->invoke = remesh_csg_add_invoke;
+	ot->exec = remesh_csg_add_exec;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
+	edit_modifier_properties(ot);
+}
+
+static int remesh_csg_remove_exec(bContext *C, wmOperator *op)
+{
+	Object *ob = ED_object_active_context(C);
+	RemeshModifierData *rmd = (RemeshModifierData *)edit_modifier_property_get(op, ob, eModifierType_Remesh);
+	int index = RNA_int_get(op->ptr, "index");
+
+	if (rmd == NULL) {
+		return OPERATOR_CANCELLED;
+	}
+
+	CSGVolume_Object* vcob = (CSGVolume_Object*)BLI_findlink(&rmd->csg_operands, index);
+	if (vcob) {
+		BLI_remlink(&rmd->csg_operands, vcob);
+	}
+
+	DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE);
+	WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
+
+	return OPERATOR_FINISHED;
+}
+
+
+static int remesh_csg_remove_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
+{
+	if (edit_modifier_invoke_properties(C, op))
+		return remesh_csg_remove_exec(C, op);
+	else
+		return OPERATOR_CANCELLED;
+}
+
+void REMESH_OT_csg_remove(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Remove CSG Object";
+	ot->description = "Remove CSG Object at index";
+	ot->idname = "REMESH_OT_csg_remove";
+
+	/* api callbacks */
+	ot->poll = remesh_csg_poll;
+	ot->invoke = remesh_csg_remove_invoke;
+	ot->exec = remesh_csg_remove_exec;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
+	edit_modifier_properties(ot);
+
+	RNA_def_int(ot->srna, "index", 0, 0, INT_MAX, "Index", "Index of the Object to remove", 0, INT_MAX);
+}
+
+static int remesh_csg_move_up_exec(bContext *C, wmOperator *op)
+{
+	Object *ob = ED_object_active_context(C);
+	RemeshModifierData *rmd = (RemeshModifierData *)edit_modifier_property_get(op, ob, eModifierType_Remesh);
+	int index = RNA_int_get(op->ptr, "index");
+
+	if (rmd == NULL

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list