Anim: add custom property support for Bone Collections
Pull request: https://projects.blender.org/blender/blender/pulls/109976
This commit is contained in:
committed by
Nathan Vegdahl
parent
998136f7a7
commit
9eee076a29
@@ -50,6 +50,8 @@ BoneCollection *ANIM_bonecoll_new(const char *name)
|
|||||||
BLI_strncpy(bcoll->name, name, sizeof(bcoll->name));
|
BLI_strncpy(bcoll->name, name, sizeof(bcoll->name));
|
||||||
bcoll->flags = default_flags;
|
bcoll->flags = default_flags;
|
||||||
|
|
||||||
|
bcoll->prop = nullptr;
|
||||||
|
|
||||||
return bcoll;
|
return bcoll;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -141,6 +141,12 @@ static void armature_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, c
|
|||||||
/* Duplicate bone collections & assignments. */
|
/* Duplicate bone collections & assignments. */
|
||||||
BLI_duplicatelist(&armature_dst->collections, &armature_src->collections);
|
BLI_duplicatelist(&armature_dst->collections, &armature_src->collections);
|
||||||
LISTBASE_FOREACH (BoneCollection *, bcoll, &armature_dst->collections) {
|
LISTBASE_FOREACH (BoneCollection *, bcoll, &armature_dst->collections) {
|
||||||
|
/* ID properties. */
|
||||||
|
if (bcoll->prop) {
|
||||||
|
bcoll->prop = IDP_CopyProperty(bcoll->prop);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bone references. */
|
||||||
BLI_duplicatelist(&bcoll->bones, &bcoll->bones);
|
BLI_duplicatelist(&bcoll->bones, &bcoll->bones);
|
||||||
LISTBASE_FOREACH (BoneCollectionMember *, member, &bcoll->bones) {
|
LISTBASE_FOREACH (BoneCollectionMember *, member, &bcoll->bones) {
|
||||||
member->bone = BKE_armature_find_bone_name(armature_dst, member->bone->name);
|
member->bone = BKE_armature_find_bone_name(armature_dst, member->bone->name);
|
||||||
@@ -160,6 +166,13 @@ static void armature_free_data(ID *id)
|
|||||||
|
|
||||||
/* Free all BoneCollectionMembership objects. */
|
/* Free all BoneCollectionMembership objects. */
|
||||||
LISTBASE_FOREACH_MUTABLE (BoneCollection *, bcoll, &armature->collections) {
|
LISTBASE_FOREACH_MUTABLE (BoneCollection *, bcoll, &armature->collections) {
|
||||||
|
/* ID properties. */
|
||||||
|
if (bcoll->prop) {
|
||||||
|
IDP_FreeProperty(bcoll->prop);
|
||||||
|
bcoll->prop = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bone references. */
|
||||||
BLI_freelistN(&bcoll->bones);
|
BLI_freelistN(&bcoll->bones);
|
||||||
}
|
}
|
||||||
BLI_freelistN(&armature->collections);
|
BLI_freelistN(&armature->collections);
|
||||||
@@ -197,6 +210,16 @@ static void armature_foreach_id_editbone(EditBone *edit_bone, LibraryForeachIDDa
|
|||||||
data));
|
data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void armature_foreach_id_bone_collection(BoneCollection *bcoll, LibraryForeachIDData *data)
|
||||||
|
{
|
||||||
|
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(
|
||||||
|
data,
|
||||||
|
IDP_foreach_property(bcoll->prop,
|
||||||
|
IDP_TYPE_FILTER_ID,
|
||||||
|
BKE_lib_query_idpropertiesForeachIDLink_callback,
|
||||||
|
data));
|
||||||
|
}
|
||||||
|
|
||||||
static void armature_foreach_id(ID *id, LibraryForeachIDData *data)
|
static void armature_foreach_id(ID *id, LibraryForeachIDData *data)
|
||||||
{
|
{
|
||||||
bArmature *arm = (bArmature *)id;
|
bArmature *arm = (bArmature *)id;
|
||||||
@@ -209,6 +232,11 @@ static void armature_foreach_id(ID *id, LibraryForeachIDData *data)
|
|||||||
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data, armature_foreach_id_editbone(edit_bone, data));
|
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data, armature_foreach_id_editbone(edit_bone, data));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LISTBASE_FOREACH (BoneCollection *, bcoll, &arm->collections) {
|
||||||
|
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data,
|
||||||
|
armature_foreach_id_bone_collection(bcoll, data));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write_bone(BlendWriter *writer, Bone *bone)
|
static void write_bone(BlendWriter *writer, Bone *bone)
|
||||||
@@ -238,13 +266,14 @@ static void write_bone_collection(BlendWriter *writer, BoneCollection *bcoll)
|
|||||||
{
|
{
|
||||||
/* Write this bone collection. */
|
/* Write this bone collection. */
|
||||||
BLO_write_struct(writer, BoneCollection, bcoll);
|
BLO_write_struct(writer, BoneCollection, bcoll);
|
||||||
BLO_write_struct_list(writer, BoneCollectionMember, &bcoll->bones);
|
|
||||||
|
|
||||||
// /* Write ID Properties -- and copy this comment EXACTLY for easy finding
|
/* Write ID Properties -- and copy this comment EXACTLY for easy finding
|
||||||
// * of library blocks that implement this. */
|
* of library blocks that implement this. */
|
||||||
// if (bcoll->prop) {
|
if (bcoll->prop) {
|
||||||
// IDP_BlendWrite(writer, bcoll->prop);
|
IDP_BlendWrite(writer, bcoll->prop);
|
||||||
// }
|
}
|
||||||
|
|
||||||
|
BLO_write_struct_list(writer, BoneCollectionMember, &bcoll->bones);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void armature_blend_write(BlendWriter *writer, ID *id, const void *id_address)
|
static void armature_blend_write(BlendWriter *writer, ID *id, const void *id_address)
|
||||||
@@ -297,13 +326,13 @@ static void direct_link_bones(BlendDataReader *reader, Bone *bone)
|
|||||||
|
|
||||||
static void direct_link_bone_collection(BlendDataReader *reader, BoneCollection *bcoll)
|
static void direct_link_bone_collection(BlendDataReader *reader, BoneCollection *bcoll)
|
||||||
{
|
{
|
||||||
|
BLO_read_data_address(reader, &bcoll->prop);
|
||||||
|
IDP_BlendDataRead(reader, &bcoll->prop);
|
||||||
|
|
||||||
BLO_read_list(reader, &bcoll->bones);
|
BLO_read_list(reader, &bcoll->bones);
|
||||||
LISTBASE_FOREACH (BoneCollectionMember *, member, &bcoll->bones) {
|
LISTBASE_FOREACH (BoneCollectionMember *, member, &bcoll->bones) {
|
||||||
BLO_read_data_address(reader, &member->bone);
|
BLO_read_data_address(reader, &member->bone);
|
||||||
}
|
}
|
||||||
|
|
||||||
// BLO_read_data_address(reader, &bcoll->prop);
|
|
||||||
// IDP_BlendDataRead(reader, &bcoll->prop);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void armature_blend_read_data(BlendDataReader *reader, ID *id)
|
static void armature_blend_read_data(BlendDataReader *reader, ID *id)
|
||||||
|
|||||||
@@ -1801,6 +1801,7 @@ void DepsgraphNodeBuilder::build_armature(bArmature *armature)
|
|||||||
add_operation_node(
|
add_operation_node(
|
||||||
&armature->id, NodeType::ARMATURE, OperationCode::ARMATURE_EVAL, [](::Depsgraph *) {});
|
&armature->id, NodeType::ARMATURE, OperationCode::ARMATURE_EVAL, [](::Depsgraph *) {});
|
||||||
build_armature_bones(&armature->bonebase);
|
build_armature_bones(&armature->bonebase);
|
||||||
|
build_armature_bone_collections(&armature->collections);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DepsgraphNodeBuilder::build_armature_bones(ListBase *bones)
|
void DepsgraphNodeBuilder::build_armature_bones(ListBase *bones)
|
||||||
@@ -1811,6 +1812,13 @@ void DepsgraphNodeBuilder::build_armature_bones(ListBase *bones)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DepsgraphNodeBuilder::build_armature_bone_collections(ListBase *collections)
|
||||||
|
{
|
||||||
|
LISTBASE_FOREACH (BoneCollection *, bcoll, collections) {
|
||||||
|
build_idproperties(bcoll->prop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DepsgraphNodeBuilder::build_camera(Camera *camera)
|
void DepsgraphNodeBuilder::build_camera(Camera *camera)
|
||||||
{
|
{
|
||||||
if (built_map_.checkIsBuiltAndTag(camera)) {
|
if (built_map_.checkIsBuiltAndTag(camera)) {
|
||||||
|
|||||||
@@ -246,6 +246,7 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder {
|
|||||||
virtual void build_rig(Object *object);
|
virtual void build_rig(Object *object);
|
||||||
virtual void build_armature(bArmature *armature);
|
virtual void build_armature(bArmature *armature);
|
||||||
virtual void build_armature_bones(ListBase *bones);
|
virtual void build_armature_bones(ListBase *bones);
|
||||||
|
virtual void build_armature_bone_collections(ListBase *collections);
|
||||||
virtual void build_shapekeys(Key *key);
|
virtual void build_shapekeys(Key *key);
|
||||||
virtual void build_camera(Camera *camera);
|
virtual void build_camera(Camera *camera);
|
||||||
virtual void build_light(Light *lamp);
|
virtual void build_light(Light *lamp);
|
||||||
|
|||||||
@@ -2716,6 +2716,7 @@ void DepsgraphRelationBuilder::build_armature(bArmature *armature)
|
|||||||
build_animdata(&armature->id);
|
build_animdata(&armature->id);
|
||||||
build_parameters(&armature->id);
|
build_parameters(&armature->id);
|
||||||
build_armature_bones(&armature->bonebase);
|
build_armature_bones(&armature->bonebase);
|
||||||
|
build_armature_bone_collections(&armature->collections);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DepsgraphRelationBuilder::build_armature_bones(ListBase *bones)
|
void DepsgraphRelationBuilder::build_armature_bones(ListBase *bones)
|
||||||
@@ -2726,6 +2727,13 @@ void DepsgraphRelationBuilder::build_armature_bones(ListBase *bones)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DepsgraphRelationBuilder::build_armature_bone_collections(ListBase *collections)
|
||||||
|
{
|
||||||
|
LISTBASE_FOREACH (BoneCollection *, bcoll, collections) {
|
||||||
|
build_idproperties(bcoll->prop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DepsgraphRelationBuilder::build_camera(Camera *camera)
|
void DepsgraphRelationBuilder::build_camera(Camera *camera)
|
||||||
{
|
{
|
||||||
if (built_map_.checkIsBuiltAndTag(camera)) {
|
if (built_map_.checkIsBuiltAndTag(camera)) {
|
||||||
|
|||||||
@@ -225,6 +225,7 @@ class DepsgraphRelationBuilder : public DepsgraphBuilder {
|
|||||||
virtual void build_shapekeys(Key *key);
|
virtual void build_shapekeys(Key *key);
|
||||||
virtual void build_armature(bArmature *armature);
|
virtual void build_armature(bArmature *armature);
|
||||||
virtual void build_armature_bones(ListBase *bones);
|
virtual void build_armature_bones(ListBase *bones);
|
||||||
|
virtual void build_armature_bone_collections(ListBase *collections);
|
||||||
virtual void build_camera(Camera *camera);
|
virtual void build_camera(Camera *camera);
|
||||||
virtual void build_light(Light *lamp);
|
virtual void build_light(Light *lamp);
|
||||||
virtual void build_nodetree(bNodeTree *ntree);
|
virtual void build_nodetree(bNodeTree *ntree);
|
||||||
|
|||||||
@@ -226,7 +226,8 @@ typedef struct BoneCollection {
|
|||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
uint8_t _pad0[7];
|
uint8_t _pad0[7];
|
||||||
|
|
||||||
// TODO: add IDProperties.
|
/** Custom properties. */
|
||||||
|
struct IDProperty *prop;
|
||||||
} BoneCollection;
|
} BoneCollection;
|
||||||
|
|
||||||
/** Membership relation of a bone with a bone collection. */
|
/** Membership relation of a bone with a bone collection. */
|
||||||
|
|||||||
@@ -219,6 +219,21 @@ static void rna_BoneCollection_name_set(PointerRNA *ptr, const char *name)
|
|||||||
// TODO: notifiers.
|
// TODO: notifiers.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *rna_BoneCollection_path(const PointerRNA *ptr)
|
||||||
|
{
|
||||||
|
const BoneCollection *bcoll = (const BoneCollection *)ptr->data;
|
||||||
|
char name_esc[sizeof(bcoll->name) * 2];
|
||||||
|
|
||||||
|
BLI_str_escape(name_esc, bcoll->name, sizeof(name_esc));
|
||||||
|
return BLI_sprintfN("collections[\"%s\"]", name_esc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static IDProperty **rna_BoneCollection_idprops(PointerRNA *ptr)
|
||||||
|
{
|
||||||
|
BoneCollection *bcoll = static_cast<BoneCollection *>(ptr->data);
|
||||||
|
return &bcoll->prop;
|
||||||
|
}
|
||||||
|
|
||||||
/* Bone.collections iterator functions. */
|
/* Bone.collections iterator functions. */
|
||||||
|
|
||||||
static void rna_Bone_collections_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
|
static void rna_Bone_collections_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
|
||||||
@@ -1912,8 +1927,8 @@ static void rna_def_bonecollection(BlenderRNA *brna)
|
|||||||
|
|
||||||
srna = RNA_def_struct(brna, "BoneCollection", NULL);
|
srna = RNA_def_struct(brna, "BoneCollection", NULL);
|
||||||
RNA_def_struct_ui_text(srna, "BoneCollection", "Bone collection in an Armature data-block");
|
RNA_def_struct_ui_text(srna, "BoneCollection", "Bone collection in an Armature data-block");
|
||||||
// RNA_def_struct_path_func(srna, "rna_BoneCollection_path");
|
RNA_def_struct_path_func(srna, "rna_BoneCollection_path");
|
||||||
// RNA_def_struct_idprops_func(srna, "rna_BoneCollection_idprops");
|
RNA_def_struct_idprops_func(srna, "rna_BoneCollection_idprops");
|
||||||
|
|
||||||
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
|
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
|
||||||
RNA_def_property_string_sdna(prop, NULL, "name");
|
RNA_def_property_string_sdna(prop, NULL, "name");
|
||||||
|
|||||||
Reference in New Issue
Block a user