Merge branch 'blender-v4.3-release'
This commit is contained in:
@@ -22,7 +22,10 @@ void validate_drawing_vertex_groups(GreasePencil &grease_pencil);
|
||||
int ensure_vertex_group(const StringRef name, ListBase &vertex_group_names);
|
||||
|
||||
/** Assign selected vertices to the vertex group. */
|
||||
void assign_to_vertex_group(GreasePencil &grease_pencil, StringRef name, float weight);
|
||||
void assign_to_vertex_group(GreasePencil &grease_pencil,
|
||||
Drawing &drawing,
|
||||
StringRef name,
|
||||
float weight);
|
||||
|
||||
void assign_to_vertex_group_from_mask(CurvesGeometry &curves,
|
||||
const IndexMask &mask,
|
||||
@@ -40,6 +43,7 @@ void clear_vertex_groups(GreasePencil &grease_pencil);
|
||||
|
||||
/** Select or deselect vertices assigned to this group. */
|
||||
void select_from_group(GreasePencil &grease_pencil,
|
||||
Drawing &drawing,
|
||||
const AttrDomain selection_domain,
|
||||
StringRef name,
|
||||
bool select);
|
||||
|
||||
@@ -95,40 +95,38 @@ void assign_to_vertex_group_from_mask(bke::CurvesGeometry &curves,
|
||||
});
|
||||
}
|
||||
|
||||
void assign_to_vertex_group(GreasePencil &grease_pencil, const StringRef name, const float weight)
|
||||
void assign_to_vertex_group(GreasePencil &grease_pencil,
|
||||
Drawing &drawing,
|
||||
const StringRef name,
|
||||
const float weight)
|
||||
{
|
||||
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;
|
||||
|
||||
const bke::AttributeAccessor attributes = curves.attributes();
|
||||
const VArray<bool> selection = *attributes.lookup_or_default<bool>(
|
||||
".selection", bke::AttrDomain::Point, true);
|
||||
bke::CurvesGeometry &curves = drawing.strokes_for_write();
|
||||
ListBase &vertex_group_names = curves.vertex_group_names;
|
||||
|
||||
/* Look for existing group, otherwise lazy-initialize if any vertex is selected. */
|
||||
int def_nr = BKE_defgroup_name_index(&vertex_group_names, name);
|
||||
const bke::AttributeAccessor attributes = curves.attributes();
|
||||
const VArray<bool> selection = *attributes.lookup_or_default<bool>(
|
||||
".selection", bke::AttrDomain::Point, true);
|
||||
|
||||
const MutableSpan<MDeformVert> dverts = curves.deform_verts_for_write();
|
||||
for (const int i : dverts.index_range()) {
|
||||
if (selection[i]) {
|
||||
/* Lazily add the vertex group if any vertex is selected. */
|
||||
if (def_nr < 0) {
|
||||
bDeformGroup *defgroup = MEM_cnew<bDeformGroup>(__func__);
|
||||
name.copy(defgroup->name);
|
||||
/* Look for existing group, otherwise lazy-initialize if any vertex is selected. */
|
||||
int def_nr = BKE_defgroup_name_index(&vertex_group_names, name);
|
||||
|
||||
BLI_addtail(&vertex_group_names, defgroup);
|
||||
def_nr = BLI_listbase_count(&vertex_group_names) - 1;
|
||||
BLI_assert(def_nr >= 0);
|
||||
}
|
||||
const MutableSpan<MDeformVert> dverts = curves.deform_verts_for_write();
|
||||
for (const int i : dverts.index_range()) {
|
||||
if (selection[i]) {
|
||||
/* Lazily add the vertex group if any vertex is selected. */
|
||||
if (def_nr < 0) {
|
||||
bDeformGroup *defgroup = MEM_cnew<bDeformGroup>(__func__);
|
||||
name.copy(defgroup->name);
|
||||
|
||||
MDeformWeight *dw = BKE_defvert_ensure_index(&dverts[i], def_nr);
|
||||
if (dw) {
|
||||
dw->weight = weight;
|
||||
}
|
||||
BLI_addtail(&vertex_group_names, defgroup);
|
||||
def_nr = BLI_listbase_count(&vertex_group_names) - 1;
|
||||
BLI_assert(def_nr >= 0);
|
||||
}
|
||||
|
||||
MDeformWeight *dw = BKE_defvert_ensure_index(&dverts[i], def_nr);
|
||||
if (dw) {
|
||||
dw->weight = weight;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -193,73 +191,69 @@ void clear_vertex_groups(GreasePencil &grease_pencil)
|
||||
}
|
||||
|
||||
void select_from_group(GreasePencil &grease_pencil,
|
||||
Drawing &drawing,
|
||||
const AttrDomain selection_domain,
|
||||
const StringRef name,
|
||||
const bool select)
|
||||
{
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
bke::CurvesGeometry &curves = drawing.strokes_for_write();
|
||||
ListBase &vertex_group_names = curves.vertex_group_names;
|
||||
|
||||
const Span<MDeformVert> dverts = curves.deform_verts_for_write();
|
||||
if (dverts.is_empty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
MutableAttributeAccessor attributes = curves.attributes_for_write();
|
||||
const int num_elements = attributes.domain_size(selection_domain);
|
||||
SpanAttributeWriter<bool> selection = attributes.lookup_or_add_for_write_span<bool>(
|
||||
".selection",
|
||||
selection_domain,
|
||||
bke::AttributeInitVArray(VArray<bool>::ForSingle(true, num_elements)));
|
||||
|
||||
switch (selection_domain) {
|
||||
case AttrDomain::Point:
|
||||
threading::parallel_for(curves.points_range(), 4096, [&](const IndexRange range) {
|
||||
for (const int point_i : range) {
|
||||
if (BKE_defvert_find_index(&dverts[point_i], def_nr)) {
|
||||
selection.span[point_i] = select;
|
||||
}
|
||||
}
|
||||
});
|
||||
break;
|
||||
case AttrDomain::Curve: {
|
||||
const OffsetIndices<int> points_by_curve = curves.points_by_curve();
|
||||
threading::parallel_for(curves.curves_range(), 1024, [&](const IndexRange range) {
|
||||
for (const int curve_i : range) {
|
||||
const IndexRange points = points_by_curve[curve_i];
|
||||
bool any_point_in_group = false;
|
||||
for (const int point_i : points) {
|
||||
if (BKE_defvert_find_index(&dverts[point_i], def_nr)) {
|
||||
any_point_in_group = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (any_point_in_group) {
|
||||
selection.span[curve_i] = select;
|
||||
}
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
break;
|
||||
}
|
||||
|
||||
selection.finish();
|
||||
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;
|
||||
}
|
||||
|
||||
const Span<MDeformVert> dverts = curves.deform_verts_for_write();
|
||||
if (dverts.is_empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
MutableAttributeAccessor attributes = curves.attributes_for_write();
|
||||
const int num_elements = attributes.domain_size(selection_domain);
|
||||
SpanAttributeWriter<bool> selection = attributes.lookup_or_add_for_write_span<bool>(
|
||||
".selection",
|
||||
selection_domain,
|
||||
bke::AttributeInitVArray(VArray<bool>::ForSingle(true, num_elements)));
|
||||
|
||||
switch (selection_domain) {
|
||||
case AttrDomain::Point:
|
||||
threading::parallel_for(curves.points_range(), 4096, [&](const IndexRange range) {
|
||||
for (const int point_i : range) {
|
||||
if (BKE_defvert_find_index(&dverts[point_i], def_nr)) {
|
||||
selection.span[point_i] = select;
|
||||
}
|
||||
}
|
||||
});
|
||||
break;
|
||||
case AttrDomain::Curve: {
|
||||
const OffsetIndices<int> points_by_curve = curves.points_by_curve();
|
||||
threading::parallel_for(curves.curves_range(), 1024, [&](const IndexRange range) {
|
||||
for (const int curve_i : range) {
|
||||
const IndexRange points = points_by_curve[curve_i];
|
||||
bool any_point_in_group = false;
|
||||
for (const int point_i : points) {
|
||||
if (BKE_defvert_find_index(&dverts[point_i], def_nr)) {
|
||||
any_point_in_group = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (any_point_in_group) {
|
||||
selection.span[curve_i] = select;
|
||||
}
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
break;
|
||||
}
|
||||
|
||||
selection.finish();
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
@@ -1006,7 +1006,10 @@ void vgroup_select_by_name(Object *ob, const char *name)
|
||||
* \{ */
|
||||
|
||||
/* only in editmode */
|
||||
static void vgroup_select_verts(const ToolSettings &tool_settings, Object *ob, int select)
|
||||
static void vgroup_select_verts(const ToolSettings &tool_settings,
|
||||
Object *ob,
|
||||
Scene &scene,
|
||||
int select)
|
||||
{
|
||||
const int def_nr = BKE_object_defgroup_active_index_get(ob) - 1;
|
||||
|
||||
@@ -1098,8 +1101,14 @@ static void vgroup_select_verts(const ToolSettings &tool_settings, Object *ob, i
|
||||
const bke::AttrDomain selection_domain = ED_grease_pencil_edit_selection_domain_get(
|
||||
&tool_settings);
|
||||
GreasePencil *grease_pencil = static_cast<GreasePencil *>(ob->data);
|
||||
bke::greasepencil::select_from_group(
|
||||
*grease_pencil, selection_domain, def_group->name, bool(select));
|
||||
{
|
||||
using namespace ed::greasepencil;
|
||||
Vector<MutableDrawingInfo> drawings = retrieve_editable_drawings(scene, *grease_pencil);
|
||||
for (MutableDrawingInfo info : drawings) {
|
||||
bke::greasepencil::select_from_group(
|
||||
*grease_pencil, info.drawing, selection_domain, def_group->name, bool(select));
|
||||
}
|
||||
}
|
||||
DEG_id_tag_update(&grease_pencil->id, ID_RECALC_GEOMETRY);
|
||||
}
|
||||
}
|
||||
@@ -2218,7 +2227,7 @@ static void vgroup_delete_active(Object *ob)
|
||||
}
|
||||
|
||||
/* only in editmode */
|
||||
static void vgroup_assign_verts(Object *ob, const float weight)
|
||||
static void vgroup_assign_verts(Object *ob, Scene &scene, const float weight)
|
||||
{
|
||||
const int def_nr = BKE_object_defgroup_active_index_get(ob) - 1;
|
||||
|
||||
@@ -2303,7 +2312,15 @@ static void vgroup_assign_verts(Object *ob, const float weight)
|
||||
GreasePencil *grease_pencil = static_cast<GreasePencil *>(ob->data);
|
||||
const bDeformGroup *defgroup = static_cast<const bDeformGroup *>(
|
||||
BLI_findlink(BKE_object_defgroup_list(ob), def_nr));
|
||||
bke::greasepencil::assign_to_vertex_group(*grease_pencil, defgroup->name, weight);
|
||||
|
||||
{
|
||||
using namespace ed::greasepencil;
|
||||
Vector<MutableDrawingInfo> drawings = retrieve_editable_drawings(scene, *grease_pencil);
|
||||
for (MutableDrawingInfo info : drawings) {
|
||||
bke::greasepencil::assign_to_vertex_group(
|
||||
*grease_pencil, info.drawing, defgroup->name, weight);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2566,8 +2583,9 @@ static int vertex_group_assign_exec(bContext *C, wmOperator * /*op*/)
|
||||
{
|
||||
ToolSettings *ts = CTX_data_tool_settings(C);
|
||||
Object *ob = context_object(C);
|
||||
Scene &scene = *CTX_data_scene(C);
|
||||
|
||||
vgroup_assign_verts(ob, ts->vgroup_weight);
|
||||
vgroup_assign_verts(ob, scene, ts->vgroup_weight);
|
||||
DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
|
||||
|
||||
@@ -2697,12 +2715,13 @@ static int vertex_group_select_exec(bContext *C, wmOperator * /*op*/)
|
||||
{
|
||||
const ToolSettings &tool_settings = *CTX_data_scene(C)->toolsettings;
|
||||
Object *ob = context_object(C);
|
||||
Scene &scene = *CTX_data_scene(C);
|
||||
|
||||
if (!ob || !ID_IS_EDITABLE(ob) || ID_IS_OVERRIDE_LIBRARY(ob)) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
vgroup_select_verts(tool_settings, ob, 1);
|
||||
vgroup_select_verts(tool_settings, ob, scene, 1);
|
||||
DEG_id_tag_update(static_cast<ID *>(ob->data), ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SELECT);
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob->data);
|
||||
|
||||
@@ -2734,8 +2753,9 @@ static int vertex_group_deselect_exec(bContext *C, wmOperator * /*op*/)
|
||||
{
|
||||
const ToolSettings &tool_settings = *CTX_data_scene(C)->toolsettings;
|
||||
Object *ob = context_object(C);
|
||||
Scene &scene = *CTX_data_scene(C);
|
||||
|
||||
vgroup_select_verts(tool_settings, ob, 0);
|
||||
vgroup_select_verts(tool_settings, ob, scene, 0);
|
||||
DEG_id_tag_update(static_cast<ID *>(ob->data), ID_RECALC_SYNC_TO_EVAL | ID_RECALC_SELECT);
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob->data);
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
* \ingroup spseq
|
||||
*/
|
||||
|
||||
#include "BLI_map.hh"
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
#include "BLI_set.hh"
|
||||
@@ -359,7 +360,9 @@ static bool freeze_frame_add_from_retiming_selection(const bContext *C,
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
bool success = false;
|
||||
|
||||
for (auto item : SEQ_retiming_selection_get(SEQ_editing_get(scene)).items()) {
|
||||
blender::Map selection = SEQ_retiming_selection_get(SEQ_editing_get(scene));
|
||||
|
||||
for (auto item : selection.items()) {
|
||||
const int timeline_frame = SEQ_retiming_key_timeline_frame_get(scene, item.value, item.key);
|
||||
success |= freeze_frame_add_new_for_seq(C, op, item.value, timeline_frame, duration);
|
||||
SEQ_relations_invalidate_cache_raw(scene, item.value);
|
||||
@@ -463,7 +466,9 @@ static bool transition_add_from_retiming_selection(const bContext *C,
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
bool success = false;
|
||||
|
||||
for (auto item : SEQ_retiming_selection_get(SEQ_editing_get(scene)).items()) {
|
||||
blender::Map selection = SEQ_retiming_selection_get(SEQ_editing_get(scene));
|
||||
|
||||
for (auto item : selection.items()) {
|
||||
const int timeline_frame = SEQ_retiming_key_timeline_frame_get(scene, item.value, item.key);
|
||||
success |= transition_add_new_for_seq(C, op, item.value, timeline_frame, duration);
|
||||
}
|
||||
|
||||
@@ -868,8 +868,14 @@ static ImBuf *seq_render_effect_strip_impl(const SeqRenderData *context,
|
||||
for (i = 0; i < 2; i++) {
|
||||
/* Speed effect requires time remapping of `timeline_frame` for input(s). */
|
||||
if (input[0] && seq->type == SEQ_TYPE_SPEED) {
|
||||
int target_frame = floor(
|
||||
seq_speed_effect_target_frame_get(scene, seq, timeline_frame, i));
|
||||
float target_frame = seq_speed_effect_target_frame_get(scene, seq, timeline_frame, i);
|
||||
|
||||
/* Only convert to int when interpolation is not used. */
|
||||
SpeedControlVars *s = reinterpret_cast<SpeedControlVars *>(seq->effectdata);
|
||||
if ((s->flags & SEQ_SPEED_USE_INTERPOLATION) != 0) {
|
||||
target_frame = std::floor(target_frame);
|
||||
}
|
||||
|
||||
ibuf[i] = seq_render_strip(context, state, input[0], target_frame);
|
||||
}
|
||||
else { /* Other effects. */
|
||||
|
||||
@@ -279,12 +279,12 @@ float seq_retiming_evaluate(const Sequence *seq, const float frame_index)
|
||||
|
||||
if (!SEQ_retiming_key_is_transition_start(start_key)) {
|
||||
const float segment_step = seq_retiming_segment_step_get(start_key);
|
||||
return start_key->retiming_factor + segment_step * segment_frame_index;
|
||||
return std::min(1.0f, start_key->retiming_factor + segment_step * segment_frame_index);
|
||||
}
|
||||
|
||||
if (seq_retiming_transition_is_linear(seq, start_key)) {
|
||||
const float segment_step = seq_retiming_segment_step_get(start_key - 1);
|
||||
return start_key->retiming_factor + segment_step * segment_frame_index;
|
||||
return std::min(1.0f, start_key->retiming_factor + segment_step * segment_frame_index);
|
||||
}
|
||||
|
||||
/* Sanity check for transition type. */
|
||||
@@ -292,7 +292,7 @@ float seq_retiming_evaluate(const Sequence *seq, const float frame_index)
|
||||
BLI_assert(start_key_index < seq->retiming_keys_num - 1);
|
||||
UNUSED_VARS_NDEBUG(start_key_index);
|
||||
|
||||
return seq_retiming_evaluate_arc_segment(start_key, frame_index);
|
||||
return std::min(1.0f, seq_retiming_evaluate_arc_segment(start_key, frame_index));
|
||||
}
|
||||
|
||||
static SeqRetimingKey *seq_retiming_add_key(const Scene *scene, Sequence *seq, float frame_index)
|
||||
@@ -301,9 +301,7 @@ static SeqRetimingKey *seq_retiming_add_key(const Scene *scene, Sequence *seq, f
|
||||
if (frame_index <= 0) {
|
||||
return &seq->retiming_keys[0];
|
||||
}
|
||||
if (frame_index >=
|
||||
SEQ_time_strip_length_get(scene, seq) * SEQ_time_media_playback_rate_factor_get(scene, seq))
|
||||
{
|
||||
if (frame_index >= SEQ_retiming_last_key_get(seq)->strip_frame_index) {
|
||||
return SEQ_retiming_last_key_get(seq); /* This is expected for strips with no offsets. */
|
||||
}
|
||||
|
||||
@@ -1055,7 +1053,8 @@ void SEQ_retiming_key_speed_set(
|
||||
const int frame_retimed_prev = round_fl_to_int(key_prev->retiming_factor * frame_index_max);
|
||||
const int frame_retimed = round_fl_to_int(key->retiming_factor * frame_index_max);
|
||||
|
||||
const int segment_duration = frame_retimed - frame_retimed_prev;
|
||||
const int segment_duration = (frame_retimed - frame_retimed_prev) /
|
||||
SEQ_time_media_playback_rate_factor_get(scene, seq);
|
||||
const int new_duration = segment_duration * speed_fac;
|
||||
|
||||
const int orig_timeline_frame = SEQ_retiming_key_timeline_frame_get(scene, seq, key);
|
||||
|
||||
Reference in New Issue
Block a user