Depsgraph: Object data separation, armature
This commit is contained in:
@@ -1159,6 +1159,20 @@ void DepsgraphNodeBuilder::build_object_data_geometry_datablock(ID *obdata)
|
||||
DEG_OPCODE_GEOMETRY_SELECT_UPDATE);
|
||||
}
|
||||
|
||||
void DepsgraphNodeBuilder::build_armature(bArmature *armature)
|
||||
{
|
||||
if (built_map_.checkIsBuiltAndTag(armature)) {
|
||||
return;
|
||||
}
|
||||
build_animdata(&armature->id);
|
||||
/* Make sure pose is up-to-date with armature updates. */
|
||||
add_operation_node(&armature->id,
|
||||
DEG_NODE_TYPE_PARAMETERS,
|
||||
NULL,
|
||||
DEG_OPCODE_PLACEHOLDER,
|
||||
"Armature Eval");
|
||||
}
|
||||
|
||||
void DepsgraphNodeBuilder::build_camera(Camera *camera)
|
||||
{
|
||||
if (built_map_.checkIsBuiltAndTag(camera)) {
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
struct Base;
|
||||
struct bArmature;
|
||||
struct CacheFile;
|
||||
struct Camera;
|
||||
struct bGPdata;
|
||||
@@ -192,6 +193,7 @@ struct DepsgraphNodeBuilder {
|
||||
bConstraint *con);
|
||||
void build_rig(Object *object);
|
||||
void build_proxy_rig(Object *object);
|
||||
void build_armature(bArmature *armature);
|
||||
void build_shapekeys(Key *key);
|
||||
void build_camera(Camera *camera);
|
||||
void build_lamp(Lamp *lamp);
|
||||
|
||||
@@ -148,7 +148,6 @@ void DepsgraphNodeBuilder::build_rig(Object *object)
|
||||
Scene *scene_cow = get_cow_datablock(scene_);
|
||||
Object *object_cow = get_cow_datablock(object);
|
||||
OperationDepsNode *op_node;
|
||||
|
||||
/* Animation and/or drivers linking posebones to base-armature used to
|
||||
* define them.
|
||||
*
|
||||
@@ -158,16 +157,8 @@ void DepsgraphNodeBuilder::build_rig(Object *object)
|
||||
* mechanism in-between here to ensure that we can use same rig
|
||||
* multiple times in same scene.
|
||||
*/
|
||||
if (!built_map_.checkIsBuiltAndTag(armature)) {
|
||||
build_animdata(&armature->id);
|
||||
/* Make sure pose is up-to-date with armature updates. */
|
||||
add_operation_node(&armature->id,
|
||||
DEG_NODE_TYPE_PARAMETERS,
|
||||
NULL,
|
||||
DEG_OPCODE_PLACEHOLDER,
|
||||
"Armature Eval");
|
||||
}
|
||||
|
||||
/* Armature. */
|
||||
build_armature(armature);
|
||||
/* Rebuild pose if not up to date. */
|
||||
if (object->pose == NULL || (object->pose->flag & POSE_RECALC)) {
|
||||
BKE_pose_rebuild(object, armature);
|
||||
@@ -179,15 +170,13 @@ void DepsgraphNodeBuilder::build_rig(Object *object)
|
||||
object->adt->recalc |= ADT_RECALC_ANIM;
|
||||
}
|
||||
}
|
||||
|
||||
/* speed optimization for animation lookups */
|
||||
/* Speed optimization for animation lookups. */
|
||||
if (object->pose != NULL) {
|
||||
BKE_pose_channels_hash_make(object->pose);
|
||||
if (object->pose->flag & POSE_CONSTRAINTS_NEED_UPDATE_FLAGS) {
|
||||
BKE_pose_update_constraint_flags(object->pose);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Pose Rig Graph
|
||||
* ==============
|
||||
@@ -209,8 +198,7 @@ void DepsgraphNodeBuilder::build_rig(Object *object)
|
||||
* only so that we can redirect those to point at either the the post-IK/
|
||||
* post-constraint/post-matrix steps, as needed.
|
||||
*/
|
||||
|
||||
/* pose eval context */
|
||||
/* Pose eval context. */
|
||||
op_node = add_operation_node(&object->id,
|
||||
DEG_NODE_TYPE_EVAL_POSE,
|
||||
function_bind(BKE_pose_eval_init,
|
||||
@@ -236,8 +224,7 @@ void DepsgraphNodeBuilder::build_rig(Object *object)
|
||||
object_cow),
|
||||
DEG_OPCODE_POSE_DONE);
|
||||
op_node->set_as_exit();
|
||||
|
||||
/* bones */
|
||||
/* Bones. */
|
||||
int pchan_index = 0;
|
||||
LISTBASE_FOREACH (bPoseChannel *, pchan, &object->pose->chanbase) {
|
||||
/* Node for bone evaluation. */
|
||||
@@ -302,25 +289,23 @@ void DepsgraphNodeBuilder::build_rig(Object *object)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Custom shape. */
|
||||
if (pchan->custom != NULL) {
|
||||
build_object(-1, pchan->custom, DEG_ID_LINKED_INDIRECTLY);
|
||||
}
|
||||
|
||||
pchan_index++;
|
||||
}
|
||||
}
|
||||
|
||||
void DepsgraphNodeBuilder::build_proxy_rig(Object *object)
|
||||
{
|
||||
bArmature *arm = (bArmature *)object->data;
|
||||
bArmature *armature = (bArmature *)object->data;
|
||||
OperationDepsNode *op_node;
|
||||
Object *object_cow = get_cow_datablock(object);
|
||||
/* Sanity check. */
|
||||
BLI_assert(object->pose != NULL);
|
||||
/* Animation. */
|
||||
build_animdata(&arm->id);
|
||||
/* Armature. */
|
||||
build_armature(armature);
|
||||
/* speed optimization for animation lookups */
|
||||
BKE_pose_channels_hash_make(object->pose);
|
||||
if (object->pose->flag & POSE_CONSTRAINTS_NEED_UPDATE_FLAGS) {
|
||||
|
||||
@@ -1881,6 +1881,14 @@ void DepsgraphRelationBuilder::build_object_data_geometry_datablock(ID *obdata)
|
||||
}
|
||||
}
|
||||
|
||||
void DepsgraphRelationBuilder::build_armature(bArmature *armature)
|
||||
{
|
||||
if (built_map_.checkIsBuiltAndTag(armature)) {
|
||||
return;
|
||||
}
|
||||
build_animdata(&armature->id);
|
||||
}
|
||||
|
||||
void DepsgraphRelationBuilder::build_camera(Camera *camera)
|
||||
{
|
||||
if (built_map_.checkIsBuiltAndTag(camera)) {
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
#include "intern/nodes/deg_node_operation.h"
|
||||
|
||||
struct Base;
|
||||
struct bArmature;
|
||||
struct bGPdata;
|
||||
struct CacheFile;
|
||||
struct Camera;
|
||||
@@ -248,6 +249,7 @@ struct DepsgraphRelationBuilder
|
||||
void build_rig(Object *object);
|
||||
void build_proxy_rig(Object *object);
|
||||
void build_shapekeys(ID *obdata, Key *key);
|
||||
void build_armature(bArmature *armature);
|
||||
void build_camera(Camera *camera);
|
||||
void build_lamp(Lamp *lamp);
|
||||
void build_nodetree(bNodeTree *ntree);
|
||||
|
||||
@@ -304,27 +304,21 @@ void DepsgraphRelationBuilder::build_splineik_pose(Object *object,
|
||||
void DepsgraphRelationBuilder::build_rig(Object *object)
|
||||
{
|
||||
/* Armature-Data */
|
||||
bArmature *arm = (bArmature *)object->data;
|
||||
|
||||
bArmature *armature = (bArmature *)object->data;
|
||||
// TODO: selection status?
|
||||
|
||||
/* attach links between pose operations */
|
||||
/* Attach links between pose operations. */
|
||||
OperationKey init_key(&object->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_INIT);
|
||||
OperationKey init_ik_key(&object->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_INIT_IK);
|
||||
OperationKey flush_key(&object->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
|
||||
|
||||
add_relation(init_key, init_ik_key, "Pose Init -> Pose Init IK");
|
||||
add_relation(init_ik_key, flush_key, "Pose Init IK -> Pose Cleanup");
|
||||
|
||||
/* Make sure pose is up-to-date with armature updates. */
|
||||
if (!built_map_.checkIsBuiltAndTag(arm)) {
|
||||
OperationKey armature_key(&arm->id,
|
||||
DEG_NODE_TYPE_PARAMETERS,
|
||||
DEG_OPCODE_PLACEHOLDER,
|
||||
"Armature Eval");
|
||||
add_relation(armature_key, init_key, "Data dependency");
|
||||
}
|
||||
|
||||
build_armature(armature);
|
||||
OperationKey armature_key(&armature->id,
|
||||
DEG_NODE_TYPE_PARAMETERS,
|
||||
DEG_OPCODE_PLACEHOLDER,
|
||||
"Armature Eval");
|
||||
add_relation(armature_key, init_key, "Data dependency");
|
||||
/* IK Solvers...
|
||||
* - These require separate processing steps are pose-level
|
||||
* to be executed between chains of bones (i.e. once the
|
||||
@@ -337,7 +331,8 @@ void DepsgraphRelationBuilder::build_rig(Object *object)
|
||||
* references, or with bones being parented to IK'd bones)
|
||||
*
|
||||
* Unsolved Issues:
|
||||
* - Care is needed to ensure that multi-headed trees work out the same as in ik-tree building
|
||||
* - Care is needed to ensure that multi-headed trees work out the same as
|
||||
* in ik-tree building
|
||||
* - Animated chain-lengths are a problem...
|
||||
*/
|
||||
RootPChanMap root_map;
|
||||
@@ -372,7 +367,6 @@ void DepsgraphRelationBuilder::build_rig(Object *object)
|
||||
}
|
||||
}
|
||||
//root_map.print_debug();
|
||||
|
||||
if (pose_depends_on_local_transform) {
|
||||
/* TODO(sergey): Once partial updates are possible use relation between
|
||||
* object transform and solver itself in it's build function.
|
||||
@@ -381,8 +375,7 @@ void DepsgraphRelationBuilder::build_rig(Object *object)
|
||||
ComponentKey local_transform_key(&object->id, DEG_NODE_TYPE_TRANSFORM);
|
||||
add_relation(local_transform_key, pose_key, "Local Transforms");
|
||||
}
|
||||
|
||||
/* links between operations for each bone */
|
||||
/* Links between operations for each bone. */
|
||||
LISTBASE_FOREACH (bPoseChannel *, pchan, &object->pose->chanbase) {
|
||||
OperationKey bone_local_key(&object->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_LOCAL);
|
||||
OperationKey bone_pose_key(&object->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_POSE_PARENT);
|
||||
@@ -397,7 +390,9 @@ void DepsgraphRelationBuilder::build_rig(Object *object)
|
||||
if (pchan->parent != NULL) {
|
||||
eDepsOperation_Code parent_key_opcode;
|
||||
|
||||
/* NOTE: this difference in handling allows us to prevent lockups while ensuring correct poses for separate chains */
|
||||
/* NOTE: this difference in handling allows us to prevent lockups
|
||||
* while ensuring correct poses for separate chains.
|
||||
*/
|
||||
if (root_map.has_common_root(pchan->name, pchan->parent->name)) {
|
||||
parent_key_opcode = DEG_OPCODE_BONE_READY;
|
||||
}
|
||||
@@ -433,14 +428,15 @@ void DepsgraphRelationBuilder::build_rig(Object *object)
|
||||
|
||||
/* bone ready -> done
|
||||
* NOTE: For bones without IK, this is all that's needed.
|
||||
* For IK chains however, an additional rel is created from IK to done,
|
||||
* with transitive reduction removing this one...
|
||||
* For IK chains however, an additional rel is created from IK
|
||||
* to done, with transitive reduction removing this one..
|
||||
*/
|
||||
add_relation(bone_ready_key, bone_done_key, "Ready -> Done");
|
||||
|
||||
/* assume that all bones must be done for the pose to be ready (for deformers) */
|
||||
/* assume that all bones must be done for the pose to be ready
|
||||
* (for deformers)
|
||||
*/
|
||||
add_relation(bone_done_key, flush_key, "PoseEval Result-Bone Link");
|
||||
|
||||
/* Custom shape. */
|
||||
if (pchan->custom != NULL) {
|
||||
build_object(NULL, pchan->custom);
|
||||
@@ -450,7 +446,9 @@ void DepsgraphRelationBuilder::build_rig(Object *object)
|
||||
|
||||
void DepsgraphRelationBuilder::build_proxy_rig(Object *object)
|
||||
{
|
||||
bArmature *armature = (bArmature *)object->data;
|
||||
Object *proxy_from = object->proxy_from;
|
||||
build_armature(armature);
|
||||
OperationKey pose_init_key(&object->id,
|
||||
DEG_NODE_TYPE_EVAL_POSE,
|
||||
DEG_OPCODE_POSE_INIT);
|
||||
|
||||
Reference in New Issue
Block a user