Merge branch 'blender-v4.3-release'
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user