44 if (frame_end <= frame_start) {
58 if (frame_start < scene->r.sfra) {
66 if (frame_end > scene->
r.
efra) {
72 C, op, 250,
IFACE_(
"Bake Object Transform to Grease Pencil"),
IFACE_(
"Bake"));
83 bake_targets.
append(active_object);
92 bake_targets.
append(duplicate_object.ob);
98 if (
object == active_object) {
103 bake_targets.
append(
object);
112 bake_targets.
append(duplicate_object.ob);
124 for (
Object *bake_target : bake_targets) {
130 keyframes.
add(
int(bezt.
vec[1][0]));
158 const int frame_offset =
RNA_int_get(op->
ptr,
"frame_target") - frame_start;
177 std::optional<Set<int>> keyframes;
184 for (
int frame = frame_start; frame <= frame_end; frame++) {
185 if ((frame - frame_start) %
step != 0 && frame != frame_end) {
189 if (keyframes && keyframes->contains(frame)) {
193 scene.
r.
cfra = frame;
196 for (
Object *source_object : bake_targets) {
199 source_object_eval->
data);
200 const float4x4 to_target = source_object_eval->object_to_world() * target_imat;
202 for (
const Layer *source_layer : source_eval_grease_pencil.layers()) {
203 std::string layer_name = fmt::format(
204 "{}_{}", source_object->id.name + 2, source_layer->name());
205 TreeNode *node = target.find_node_by_name(layer_name);
206 if (node ==
nullptr) {
207 Layer &new_layer = target.add_layer(layer_name);
208 target.set_active_layer(&new_layer);
211 Layer &target_layer = target.find_node_by_name(layer_name)->as_layer();
212 std::optional<DrawingPlacement> drawing_placement;
215 scene, *region, *v3d, *target_object_eval, &target_layer, reproject_mode);
219 if (source_frame ==
nullptr) {
223 const int target_frame_num = scene.
r.
cfra + frame_offset;
224 Drawing &source_drawing = *source_eval_grease_pencil.get_drawing_at(*source_layer,
226 Drawing &target_drawing = *target.insert_frame(target_layer, target_frame_num);
234 target_strokes.attributes_for_write().lookup_or_add_for_write_span<
int>(
239 source_material_indices[
i] + 1);
245 if (source_material == target_material) {
264 target_material_indices.
finish();
267 if (drawing_placement) {
269 for (const int i : range) {
270 positions[i] = drawing_placement->reproject(positions[i]);
277 scene.r.cfra = prior_frame;
308 ot->name =
"Bake Object Transform to Grease Pencil";
309 ot->idname =
"GREASE_PENCIL_OT_bake_grease_pencil_animation";
310 ot->description =
"Bake Grease Pencil object transform to Grease Pencil keyframes";
318 RNA_def_int(
ot->srna,
"frame_start", 1, 1, 100000,
"Start Frame",
"The start frame", 1, 100000);
321 ot->srna,
"frame_end", 250, 1, 100000,
"End Frame",
"The end frame of animation", 1, 100000);
324 RNA_def_int(
ot->srna,
"step", 1, 1, 100,
"Step",
"Step between generated frames", 1, 100);
329 "Only Selected Keyframes",
330 "Convert only selected keyframes");
332 ot->srna,
"frame_target", 1, 1, 100000,
"Target Frame",
"Destination frame", 1, 100000);
340 "Reproject the strokes using the X-Z plane"},
341 {int(
ReprojectMode::Side),
"SIDE", 0,
"Side",
"Reproject the strokes using the Y-Z plane"},
342 {int(
ReprojectMode::Top),
"TOP", 0,
"Top",
"Reproject the strokes using the X-Y plane"},
347 "Reproject the strokes to end up on the same plane, as if drawn from the current "
349 "using 'Cursor' Stroke Placement"},
354 "Reproject the strokes using the orientation of 3D cursor"},
355 {0,
nullptr, 0,
nullptr,
nullptr},
360 rna_grease_pencil_reproject_type_items,
Functions for backward compatibility with the legacy Action API.
AnimData * BKE_animdata_from_id(const ID *id)
#define CTX_DATA_BEGIN(C, Type, instance, member)
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
Object * CTX_data_active_object(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
Low-level operations for curves.
blender::VectorList< DupliObject > DupliList
void object_duplilist(Depsgraph *depsgraph, Scene *sce, Object *ob, blender::Set< const Object * > *include_objects, DupliList &r_duplilist)
General operations, lookup, etc. for materials.
@ BKE_MAT_ASSIGN_USERPREF
bool BKE_object_material_slot_add(Main *bmain, Object *ob, bool set_active=true)
Material * BKE_object_material_get(Object *ob, short act)
void BKE_object_material_assign(Main *bmain, Object *ob, Material *ma, short act, int assign_type)
int BKE_object_material_index_get(Object *ob, const Material *ma)
void BKE_scene_graph_update_for_newframe(Depsgraph *depsgraph)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
float DEG_get_ctime(const Depsgraph *graph)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
BPy_StructRNA * depsgraph
constexpr IndexRange index_range() const
void append(const T &value)
GAttributeReader lookup_or_default(StringRef attribute_id, AttrDomain domain, AttrType data_type, const void *default_value=nullptr) const
IndexRange curves_range() const
AttributeAccessor attributes() const
bke::CurvesGeometry & strokes_for_write()
const bke::CurvesGeometry & strokes() const
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
void ED_operatortypes_grease_pencil_bake_animation()
Vector< FCurve * > fcurves_for_assigned_action(AnimData *adt)
static Vector< Object * > get_bake_targets(bContext &C, Depsgraph &depsgraph, Scene &scene)
static wmOperatorStatus bake_grease_pencil_animation_exec(bContext *C, wmOperator *op)
static wmOperatorStatus bake_grease_pencil_animation_invoke(bContext *C, wmOperator *op, const wmEvent *)
static Set< int > get_selected_object_keyframes(Span< Object * > bake_targets)
static bool bake_grease_pencil_animation_poll(bContext *C)
static void GREASE_PENCIL_OT_bake_grease_pencil_animation(wmOperatorType *ot)
static void ensure_valid_frame_end(Main *, Scene *, PointerRNA *ptr)
Object * add_type(bContext *C, int type, const char *name, const float loc[3], const float rot[3], bool enter_editmode, unsigned short local_view_bits) ATTR_NONNULL(1) ATTR_RETURNS_NONNULL
CartesianBasis invert(const CartesianBasis &basis)
void transform_points(const float4x4 &transform, MutableSpan< float3 > points, bool use_threading=true)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
MatBase< float, 4, 4 > float4x4
VecBase< float, 3 > float3
void RNA_property_int_set(PointerRNA *ptr, PropertyRNA *prop, int value)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
bool RNA_property_is_set(PointerRNA *ptr, PropertyRNA *prop)
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
int RNA_property_int_get(PointerRNA *ptr, PropertyRNA *prop)
int RNA_int_get(PointerRNA *ptr, const char *name)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
void RNA_def_property_update_runtime(PropertyRNA *prop, RNAPropertyUpdateFunc func)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
unsigned short local_view_uid
MutableVArraySpan< T > span
void WM_cursor_wait(bool val)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
void WM_operatortype_append(void(*opfunc)(wmOperatorType *))
wmOperatorStatus WM_operator_props_dialog_popup(bContext *C, wmOperator *op, int width, std::optional< std::string > title, std::optional< std::string > confirm_text, const bool cancel_default, std::optional< std::string > message)