[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