Merge branch 'blender-v4.3-release'

This commit is contained in:
Falk David
2024-11-12 11:57:45 +01:00
4 changed files with 120 additions and 68 deletions

View File

@@ -33,7 +33,7 @@ void assign_to_vertex_group_from_mask(CurvesGeometry &curves,
* Remove selected vertices from the vertex group.
* \return True if at least one vertex was removed from the group.
*/
bool remove_from_vertex_group(GreasePencil &grease_pencil, StringRef name, bool use_selection);
bool remove_from_vertex_group(Drawing &drawing, StringRef name, bool use_selection);
/** Remove vertices from all vertex groups. */
void clear_vertex_groups(GreasePencil &grease_pencil);

View File

@@ -129,44 +129,36 @@ void assign_to_vertex_group(Drawing &drawing, const StringRef name, const float
}
}
bool remove_from_vertex_group(GreasePencil &grease_pencil,
const StringRef name,
const bool use_selection)
bool remove_from_vertex_group(Drawing &drawing, const StringRef name, const bool use_selection)
{
bool changed = false;
for (GreasePencilDrawingBase *base : grease_pencil.drawings()) {
if (base->type != GP_DRAWING) {
continue;
}
Drawing &drawing = reinterpret_cast<GreasePencilDrawing *>(base)->wrap();
bke::CurvesGeometry &curves = drawing.strokes_for_write();
ListBase &vertex_group_names = curves.vertex_group_names;
bke::CurvesGeometry &curves = drawing.strokes_for_write();
ListBase &vertex_group_names = curves.vertex_group_names;
const int def_nr = BKE_defgroup_name_index(&vertex_group_names, name);
if (def_nr < 0) {
/* No vertices assigned to the group in this drawing. */
continue;
}
const int def_nr = BKE_defgroup_name_index(&vertex_group_names, name);
if (def_nr < 0) {
/* No vertices assigned to the group in this drawing. */
return false;
}
const MutableSpan<MDeformVert> dverts = curves.deform_verts_for_write();
const bke::AttributeAccessor attributes = curves.attributes();
const VArray<bool> selection = *attributes.lookup_or_default<bool>(
".selection", bke::AttrDomain::Point, true);
for (const int i : dverts.index_range()) {
if (!use_selection || selection[i]) {
MDeformVert *dv = &dverts[i];
MDeformWeight *dw = BKE_defvert_find_index(dv, def_nr);
BKE_defvert_remove_group(dv, dw);
const MutableSpan<MDeformVert> dverts = curves.deform_verts_for_write();
const bke::AttributeAccessor attributes = curves.attributes();
const VArray<bool> selection = *attributes.lookup_or_default<bool>(
".selection", bke::AttrDomain::Point, true);
for (const int i : dverts.index_range()) {
if (!use_selection || selection[i]) {
MDeformVert *dv = &dverts[i];
MDeformWeight *dw = BKE_defvert_find_index(dv, def_nr);
BKE_defvert_remove_group(dv, dw);
/* Adjust remaining vertex group indices. */
for (const int j : IndexRange(dv->totweight)) {
if (dv->dw[j].def_nr > def_nr) {
dv->dw[j].def_nr--;
}
/* Adjust remaining vertex group indices. */
for (const int j : IndexRange(dv->totweight)) {
if (dv->dw[j].def_nr > def_nr) {
dv->dw[j].def_nr--;
}
changed = true;
}
changed = true;
}
}
return changed;

View File

@@ -205,11 +205,6 @@ bool BKE_object_defgroup_clear(Object *ob, bDeformGroup *dg, const bool use_sele
}
}
}
else if (ob->type == OB_GREASE_PENCIL) {
GreasePencil *grease_pencil = static_cast<GreasePencil *>(ob->data);
changed = blender::bke::greasepencil::remove_from_vertex_group(
*grease_pencil, dg->name, use_selection);
}
return changed;
}
@@ -298,30 +293,24 @@ static void object_defgroup_remove_object_mode(Object *ob, bDeformGroup *dg)
BLI_assert(def_nr != -1);
if (ob->type == OB_GREASE_PENCIL) {
GreasePencil *grease_pencil = static_cast<GreasePencil *>(ob->data);
blender::bke::greasepencil::remove_from_vertex_group(*grease_pencil, dg->name, false);
}
else {
BKE_object_defgroup_array_get(static_cast<ID *>(ob->data), &dvert_array, &dvert_tot);
BKE_object_defgroup_array_get(static_cast<ID *>(ob->data), &dvert_array, &dvert_tot);
if (dvert_array) {
int i, j;
MDeformVert *dv;
for (i = 0, dv = dvert_array; i < dvert_tot; i++, dv++) {
MDeformWeight *dw;
if (dvert_array) {
int i, j;
MDeformVert *dv;
for (i = 0, dv = dvert_array; i < dvert_tot; i++, dv++) {
MDeformWeight *dw;
dw = BKE_defvert_find_index(dv, def_nr);
BKE_defvert_remove_group(dv, dw); /* dw can be nullptr */
dw = BKE_defvert_find_index(dv, def_nr);
BKE_defvert_remove_group(dv, dw); /* dw can be nullptr */
/* inline, make into a function if anything else needs to do this */
for (j = 0; j < dv->totweight; j++) {
if (dv->dw[j].def_nr > def_nr) {
dv->dw[j].def_nr--;
}
/* inline, make into a function if anything else needs to do this */
for (j = 0; j < dv->totweight; j++) {
if (dv->dw[j].def_nr > def_nr) {
dv->dw[j].def_nr--;
}
/* done */
}
/* done */
}
}
@@ -380,10 +369,6 @@ static void object_defgroup_remove_edit_mode(Object *ob, bDeformGroup *dg)
}
}
}
else if (ob->type == OB_GREASE_PENCIL) {
GreasePencil *grease_pencil = static_cast<GreasePencil *>(ob->data);
blender::bke::greasepencil::remove_from_vertex_group(*grease_pencil, dg->name, false);
}
object_defgroup_remove_common(ob, dg, def_nr);
}

View File

@@ -2525,18 +2525,82 @@ void OBJECT_OT_vertex_group_add(wmOperatorType *ot)
/** \name Vertex Group Remove Operator
* \{ */
static void grease_pencil_clear_from_vgroup(Scene &scene,
Object &ob,
bDeformGroup *dg,
const bool use_selection,
const bool all_drawings = false)
{
using namespace ed::greasepencil;
GreasePencil &grease_pencil = *static_cast<GreasePencil *>(ob.data);
if (all_drawings) {
/* When removing vgroup, iterate over all the drawing. */
for (GreasePencilDrawingBase *base : grease_pencil.drawings()) {
if (base->type != GP_DRAWING) {
continue;
}
bke::greasepencil::Drawing &drawing = reinterpret_cast<GreasePencilDrawing *>(base)->wrap();
bke::greasepencil::remove_from_vertex_group(drawing, dg->name, use_selection);
}
/* Remove vgroup from the list. */
BKE_object_defgroup_remove(&ob, dg);
}
else {
Vector<MutableDrawingInfo> drawings = retrieve_editable_drawings(scene, grease_pencil);
for (const MutableDrawingInfo &info : drawings) {
bke::greasepencil::remove_from_vertex_group(info.drawing, dg->name, use_selection);
}
}
}
static void grease_pencil_clear_from_all_vgroup(Scene &scene,
Object &ob,
const bool use_selection,
const bool all_drawings = false,
const bool only_unlocked = false)
{
const ListBase *defbase = BKE_object_defgroup_list(&ob);
bDeformGroup *dg = static_cast<bDeformGroup *>(defbase->first);
while (dg) {
bDeformGroup *next_group = dg->next;
if (!only_unlocked || (dg->flag & DG_LOCK_WEIGHT) == 0) {
grease_pencil_clear_from_vgroup(scene, ob, dg, use_selection, all_drawings);
}
dg = next_group;
}
}
static int vertex_group_remove_exec(bContext *C, wmOperator *op)
{
Object *ob = context_object(C);
Scene &scene = *CTX_data_scene(C);
const bool all_vgroup = RNA_boolean_get(op->ptr, "all");
const bool only_unlocked = RNA_boolean_get(op->ptr, "all_unlocked");
if (RNA_boolean_get(op->ptr, "all")) {
BKE_object_defgroup_remove_all(ob);
}
else if (RNA_boolean_get(op->ptr, "all_unlocked")) {
BKE_object_defgroup_remove_all_ex(ob, true);
if (ob->type == OB_GREASE_PENCIL) {
if (all_vgroup || only_unlocked) {
grease_pencil_clear_from_all_vgroup(scene, *ob, false, true, only_unlocked);
}
else {
const ListBase *defbase = BKE_object_defgroup_list(ob);
bDeformGroup *dg = static_cast<bDeformGroup *>(
BLI_findlink(defbase, BKE_object_defgroup_active_index_get(ob) - 1));
if (!dg) {
return OPERATOR_CANCELLED;
}
grease_pencil_clear_from_vgroup(scene, *ob, dg, false, true);
}
}
else {
vgroup_delete_active(ob);
if (all_vgroup || only_unlocked) {
BKE_object_defgroup_remove_all_ex(ob, only_unlocked);
}
else {
vgroup_delete_active(ob);
}
}
DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
@@ -2654,11 +2718,15 @@ static int vertex_group_remove_from_exec(bContext *C, wmOperator *op)
{
const bool use_all_groups = RNA_boolean_get(op->ptr, "use_all_groups");
const bool use_all_verts = RNA_boolean_get(op->ptr, "use_all_verts");
Scene &scene = *CTX_data_scene(C);
Object *ob = context_object(C);
if (use_all_groups) {
if (BKE_object_defgroup_clear_all(ob, true) == false) {
if (ob->type == OB_GREASE_PENCIL) {
grease_pencil_clear_from_all_vgroup(scene, *ob, true);
}
else if (BKE_object_defgroup_clear_all(ob, true) == false) {
return OPERATOR_CANCELLED;
}
}
@@ -2666,7 +2734,14 @@ static int vertex_group_remove_from_exec(bContext *C, wmOperator *op)
const ListBase *defbase = BKE_object_defgroup_list(ob);
bDeformGroup *dg = static_cast<bDeformGroup *>(
BLI_findlink(defbase, BKE_object_defgroup_active_index_get(ob) - 1));
if ((dg == nullptr) || (BKE_object_defgroup_clear(ob, dg, !use_all_verts) == false)) {
if (dg == nullptr) {
return OPERATOR_CANCELLED;
}
if (ob->type == OB_GREASE_PENCIL) {
grease_pencil_clear_from_vgroup(scene, *ob, dg, !use_all_verts);
}
else if (BKE_object_defgroup_clear(ob, dg, !use_all_verts) == false) {
return OPERATOR_CANCELLED;
}
}