diff --git a/scripts/modules/_bpy_internal/grease_pencil/stroke.py b/scripts/modules/_bpy_internal/grease_pencil/stroke.py index 7ed17ee7e31..2eb8d4e9da8 100644 --- a/scripts/modules/_bpy_internal/grease_pencil/stroke.py +++ b/scripts/modules/_bpy_internal/grease_pencil/stroke.py @@ -123,8 +123,6 @@ def DefAttributeGetterSetters(attributes_list): # Define the list of attributes that should be exposed as read/write properties on the class. @DefAttributeGetterSetters([ # Property Name, Attribute Name, Type, Default Value, Doc-string. - ("position", "position", 'FLOAT_VECTOR', (0.0, 0.0, 0.0), - "The position of the point (in local space)."), ("radius", "radius", 'FLOAT', 0.01, "The radius of the point."), ("opacity", "opacity", 'FLOAT', 0.0, "The opacity of the point."), ("vertex_color", "vertex_color", 'FLOAT_COLOR', (0.0, 0.0, 0.0, 0.0), @@ -138,13 +136,32 @@ class GreasePencilStrokePoint(AttributeGetterSetter): """ A helper class to get access to stroke point data. """ - __slots__ = ("_curve_index", "_point_index") + __slots__ = ("_drawing", "_curve_index", "_point_index") def __init__(self, drawing, curve_index, point_index): super().__init__(drawing.attributes, point_index, 'POINT') + self._drawing = drawing self._curve_index = curve_index self._point_index = point_index + @property + def position(self): + """ + The position of the point (in local space). + """ + if attribute := self._attributes.get("position"): + return attribute.data[self._point_index].vector + # Position attribute should always exist, but return default just in case. + return (0.0, 0.0, 0.0) + + @position.setter + def position(self, value): + # Position attribute should always exist + if attribute := self._attributes.get("position"): + attribute.data[self._point_index].vector = value + # Tag the positions of the drawing. + self._drawing.tag_positions_changed() + @property def select(self): """ diff --git a/source/blender/blenkernel/intern/grease_pencil.cc b/source/blender/blenkernel/intern/grease_pencil.cc index ba10afd41ae..e49cba37b61 100644 --- a/source/blender/blenkernel/intern/grease_pencil.cc +++ b/source/blender/blenkernel/intern/grease_pencil.cc @@ -2482,11 +2482,12 @@ void BKE_grease_pencil_material_remap(GreasePencil *grease_pencil, const uint *r } greasepencil::Drawing &drawing = reinterpret_cast(base)->wrap(); MutableAttributeAccessor attributes = drawing.strokes_for_write().attributes_for_write(); - SpanAttributeWriter material_indices = attributes.lookup_or_add_for_write_span( - "material_index", AttrDomain::Curve); + SpanAttributeWriter material_indices = attributes.lookup_for_write_span( + "material_index"); if (!material_indices) { - return; + continue; } + BLI_assert(material_indices.domain == AttrDomain::Curve); for (const int i : material_indices.span.index_range()) { BLI_assert(blender::IndexRange(totcol).contains(remap[material_indices.span[i]])); UNUSED_VARS_NDEBUG(totcol); @@ -2496,7 +2497,7 @@ void BKE_grease_pencil_material_remap(GreasePencil *grease_pencil, const uint *r } } -void BKE_grease_pencil_material_index_remove(GreasePencil *grease_pencil, int index) +void BKE_grease_pencil_material_index_remove(GreasePencil *grease_pencil, const int index) { using namespace blender; using namespace blender::bke; @@ -2505,21 +2506,19 @@ void BKE_grease_pencil_material_index_remove(GreasePencil *grease_pencil, int in if (base->type != GP_DRAWING) { continue; } - greasepencil::Drawing &drawing = reinterpret_cast(base)->wrap(); MutableAttributeAccessor attributes = drawing.strokes_for_write().attributes_for_write(); - AttributeWriter material_indices = attributes.lookup_for_write("material_index"); + SpanAttributeWriter material_indices = attributes.lookup_for_write_span( + "material_index"); if (!material_indices) { - return; + continue; } - - MutableVArraySpan indices_span(material_indices.varray); - for (const int i : indices_span.index_range()) { - if (indices_span[i] > 0 && indices_span[i] >= index) { - indices_span[i]--; + BLI_assert(material_indices.domain == AttrDomain::Curve); + for (const int i : material_indices.span.index_range()) { + if (material_indices.span[i] > 0 && material_indices.span[i] >= index) { + material_indices.span[i]--; } } - indices_span.save(); material_indices.finish(); } } diff --git a/source/blender/makesrna/intern/rna_grease_pencil_api.cc b/source/blender/makesrna/intern/rna_grease_pencil_api.cc index e0be40b3644..7014c90ed4a 100644 --- a/source/blender/makesrna/intern/rna_grease_pencil_api.cc +++ b/source/blender/makesrna/intern/rna_grease_pencil_api.cc @@ -107,6 +107,11 @@ static void rna_GreasePencilDrawing_resize_curves(ID *grease_pencil_id, } } +static void rna_GreasePencilDrawing_tag_positions_changed(GreasePencilDrawing *drawing_ptr) +{ + drawing_ptr->wrap().tag_positions_changed(); +} + static GreasePencilFrame *rna_Frames_frame_new(ID *id, GreasePencilLayer *layer_in, ReportList *reports, @@ -484,6 +489,11 @@ void RNA_api_grease_pencil_drawing(StructRNA *srna) 0, 10000); RNA_def_parameter_flags(parm, PROP_DYNAMIC, ParameterFlag(0)); + + func = RNA_def_function( + srna, "tag_positions_changed", "rna_GreasePencilDrawing_tag_positions_changed"); + RNA_def_function_ui_description( + func, "Indicate that the positions of points in the drawing have changed"); } void RNA_api_grease_pencil_frames(StructRNA *srna) @@ -677,12 +687,12 @@ void RNA_api_grease_pencil_layer_groups(StructRNA *srna) parm = RNA_def_string( func, "name", "GreasePencilLayerGroup", MAX_NAME, "Name", "Name of the layer group"); RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_REQUIRED); - parm = RNA_def_pointer( - func, - "parent_group", - "GreasePencilLayerGroup", - "", - "The parent layer group the new group will be created in (use None for the main stack)"); + parm = RNA_def_pointer(func, + "parent_group", + "GreasePencilLayerGroup", + "", + "The parent layer group the new group will be created in (use None " + "for the main stack)"); RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_RNAPTR); parm = RNA_def_pointer( func, "layer_group", "GreasePencilLayerGroup", "", "The newly created layer group"); @@ -735,12 +745,12 @@ void RNA_api_grease_pencil_layer_groups(StructRNA *srna) func, "layer_group", "GreasePencilLayerGroup", "", "The layer group to move"); RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR); RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0)); - parm = RNA_def_pointer( - func, - "parent_group", - "GreasePencilLayerGroup", - "", - "The parent layer group the layer group will be moved into (use None for the main stack)"); + parm = RNA_def_pointer(func, + "parent_group", + "GreasePencilLayerGroup", + "", + "The parent layer group the layer group will be moved into (use " + "None for the main stack)"); RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_REQUIRED | PARM_RNAPTR); RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0)); } diff --git a/source/blender/makesrna/intern/rna_scene.cc b/source/blender/makesrna/intern/rna_scene.cc index ce8d9a15dd9..85270f99edc 100644 --- a/source/blender/makesrna/intern/rna_scene.cc +++ b/source/blender/makesrna/intern/rna_scene.cc @@ -8248,7 +8248,9 @@ static void rna_def_scene_eevee(BlenderRNA *brna) prop = RNA_def_property(srna, "use_volumetric_shadows", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "flag", SCE_EEVEE_VOLUMETRIC_SHADOWS); RNA_def_property_ui_text( - prop, "Volumetric Shadows", "Generate shadows from volumetric material (Very expensive)"); + prop, + "Volumetric Shadows", + "Cast shadows from volumetric materials onto volumetric materials (Very expensive)"); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, nullptr);