Depsgraph: Build relations for objects linked via pchan constraints

This is similar to previous fix for missing ID nodes, just the original
fix missed this part of change because it looked like it is already
happening.
This commit is contained in:
Sergey Sharybin 2018-04-10 11:56:20 +02:00
parent 814f143acf
commit 5c3857b305
3 changed files with 59 additions and 45 deletions

View File

@ -114,51 +114,6 @@ extern "C" {
namespace DEG {
namespace {
struct BuilderWalkUserData {
DepsgraphRelationBuilder *builder;
};
void modifier_walk(void *user_data,
struct Object * /*object*/,
struct ID **idpoin,
int /*cb_flag*/)
{
BuilderWalkUserData *data = (BuilderWalkUserData *)user_data;
ID *id = *idpoin;
if (id == NULL) {
return;
}
switch (GS(id->name)) {
case ID_OB:
data->builder->build_object((Object *)id);
break;
case ID_TE:
data->builder->build_texture((Tex *)id);
break;
default:
/* pass */
break;
}
}
void constraint_walk(bConstraint * /*con*/,
ID **idpoin,
bool /*is_reference*/,
void *user_data)
{
BuilderWalkUserData *data = (BuilderWalkUserData *)user_data;
if (*idpoin) {
ID *id = *idpoin;
if (GS(id->name) == ID_OB) {
data->builder->build_object((Object *)id);
}
}
}
} /* namespace */
/* ***************** */
/* Relations Builder */
@ -1886,4 +1841,43 @@ void DepsgraphRelationBuilder::build_movieclip(MovieClip *clip)
build_animdata(&clip->id);
}
/* **** ID traversal callbacks functions **** */
void DepsgraphRelationBuilder::modifier_walk(void *user_data,
struct Object * /*object*/,
struct ID **idpoin,
int /*cb_flag*/)
{
BuilderWalkUserData *data = (BuilderWalkUserData *)user_data;
ID *id = *idpoin;
if (id == NULL) {
return;
}
switch (GS(id->name)) {
case ID_OB:
data->builder->build_object((Object *)id);
break;
case ID_TE:
data->builder->build_texture((Tex *)id);
break;
default:
/* pass */
break;
}
}
void DepsgraphRelationBuilder::constraint_walk(bConstraint * /*con*/,
ID **idpoin,
bool /*is_reference*/,
void *user_data)
{
BuilderWalkUserData *data = (BuilderWalkUserData *)user_data;
if (*idpoin) {
ID *id = *idpoin;
if (GS(id->name) == ID_OB) {
data->builder->build_object((Object *)id);
}
}
}
} // namespace DEG

View File

@ -313,6 +313,20 @@ protected:
const KeyTo& key_to);
private:
struct BuilderWalkUserData {
DepsgraphRelationBuilder *builder;
};
static void modifier_walk(void *user_data,
struct Object *object,
struct ID **idpoin,
int cb_flag);
static void constraint_walk(bConstraint *con,
ID **idpoin,
bool is_reference,
void *user_data);
/* State which never changes, same for the whole builder time. */
Main *bmain_;
Depsgraph *graph_;

View File

@ -51,6 +51,7 @@ extern "C" {
#include "BKE_action.h"
#include "BKE_armature.h"
#include "BKE_constraint.h"
} /* extern "C" */
#include "DEG_depsgraph.h"
@ -411,6 +412,11 @@ void DepsgraphRelationBuilder::build_rig(Object *object)
/* constraints */
if (pchan->constraints.first != NULL) {
/* Build relations for indirectly linked objects. */
BuilderWalkUserData data;
data.builder = this;
BKE_constraints_id_loop(&pchan->constraints, constraint_walk, &data);
/* constraints stack and constraint dependencies */
build_constraints(&object->id, DEG_NODE_TYPE_BONE, pchan->name, &pchan->constraints, &root_map);