Ejemplo n.º 1
0
/* perform syncing updates for F-Curves */
static void animchan_sync_fcurve(bAnimContext *ac, bAnimListElem *ale, FCurve **active_fcurve)
{
	FCurve *fcu = (FCurve *)ale->data;
	ID *owner_id = ale->id;
	
	/* major priority is selection status, so refer to the checks done in anim_filter.c 
	 * skip_fcurve_selected_data() for reference about what's going on here...
	 */
	if (ELEM(NULL, fcu, fcu->rna_path, owner_id))
		return;
	
	if (GS(owner_id->name) == ID_OB) {
		Object *ob = (Object *)owner_id;
		
		/* only affect if F-Curve involves pose.bones */
		if ((fcu->rna_path) && strstr(fcu->rna_path, "pose.bones")) {
			bArmature *arm = (bArmature *)ob->data;
			bPoseChannel *pchan;
			char *bone_name;
			
			/* get bone-name, and check if this bone is selected */
			bone_name = BLI_str_quoted_substrN(fcu->rna_path, "pose.bones[");
			pchan = BKE_pose_channel_find_name(ob->pose, bone_name);
			if (bone_name) MEM_freeN(bone_name);
			
			/* F-Curve selection depends on whether the bone is selected */
			if ((pchan) && (pchan->bone)) {
				/* F-Curve selection */
				if (pchan->bone->flag & BONE_SELECTED)
					fcu->flag |= FCURVE_SELECTED;
				else
					fcu->flag &= ~FCURVE_SELECTED;
					
				/* Active F-Curve - it should be the first one for this bone on the 
				 * active object to be considered as active
				 */
				if ((ob == ac->obact) && (pchan->bone == arm->act_bone)) {
					/* if no previous F-Curve has active flag, then we're the first and only one to get it */
					if (*active_fcurve == NULL) {
						fcu->flag |= FCURVE_ACTIVE;
						*active_fcurve = fcu;
					}
					else {
						/* someone else has already taken it - set as not active */
						fcu->flag &= ~FCURVE_ACTIVE;
					}
				}
				else {
					/* this can't possibly be active now */
					fcu->flag &= ~FCURVE_ACTIVE;
				}
			}
		}
	}
	else if (GS(owner_id->name) == ID_SCE) {
		Scene *scene = (Scene *)owner_id;
		
		/* only affect if F-Curve involves sequence_editor.sequences */
		if ((fcu->rna_path) && strstr(fcu->rna_path, "sequences_all")) {
			Editing *ed = BKE_sequencer_editing_get(scene, false);
			Sequence *seq;
			char *seq_name;
			
			/* get strip name, and check if this strip is selected */
			seq_name = BLI_str_quoted_substrN(fcu->rna_path, "sequences_all[");
			seq = BKE_sequence_get_by_name(ed->seqbasep, seq_name, false);
			if (seq_name) MEM_freeN(seq_name);
			
			/* update selection status */
			if (seq) {
				if (seq->flag & SELECT)
					fcu->flag |= FCURVE_SELECTED;
				else
					fcu->flag &= ~FCURVE_SELECTED;
			}
		}
	}
	else if (GS(owner_id->name) == ID_NT) {
		bNodeTree *ntree = (bNodeTree *)owner_id;
		
		/* check for selected nodes */
		if ((fcu->rna_path) && strstr(fcu->rna_path, "nodes")) {
			bNode *node;
			char *node_name;
			
			/* get strip name, and check if this strip is selected */
			node_name = BLI_str_quoted_substrN(fcu->rna_path, "nodes[");
			node = nodeFindNodebyName(ntree, node_name);
			if (node_name) MEM_freeN(node_name);
			
			/* update selection/active status */
			if (node) {
				/* update selection status */
				if (node->flag & NODE_SELECT)
					fcu->flag |= FCURVE_SELECTED;
				else
					fcu->flag &= ~FCURVE_SELECTED;
					
				/* update active status */
				/* XXX: this may interfere with setting bones as active if both exist at once;
				 * then again, if that's the case, production setups aren't likely to be animating
				 * nodes while working with bones?
				 */
				if (node->flag & NODE_ACTIVE) {
					if (*active_fcurve == NULL) {
						fcu->flag |= FCURVE_ACTIVE;
						*active_fcurve = fcu;
					}
					else {
						fcu->flag &= ~FCURVE_ACTIVE;
					}
				}
				else {
					fcu->flag &= ~FCURVE_ACTIVE;
				}
			}
		}
	}
}
Ejemplo n.º 2
0
/* perform syncing updates for F-Curves */
static void animchan_sync_fcurve (bAnimContext *UNUSED(ac), bAnimListElem *ale)
{
    FCurve *fcu= (FCurve *)ale->data;
    ID *owner_id= ale->id;

    /* major priority is selection status, so refer to the checks done in anim_filter.c
     * skip_fcurve_selected_data() for reference about what's going on here...
     */
    if (ELEM3(NULL, fcu, fcu->rna_path, owner_id))
        return;

    if (GS(owner_id->name) == ID_OB) {
        Object *ob= (Object *)owner_id;

        /* only affect if F-Curve involves pose.bones */
        if ((fcu->rna_path) && strstr(fcu->rna_path, "pose.bones")) {
            bPoseChannel *pchan;
            char *bone_name;

            /* get bone-name, and check if this bone is selected */
            bone_name= BLI_getQuotedStr(fcu->rna_path, "pose.bones[");
            pchan= get_pose_channel(ob->pose, bone_name);
            if (bone_name) MEM_freeN(bone_name);

            /* F-Curve selection depends on whether the bone is selected */
            if ((pchan) && (pchan->bone)) {
                if (pchan->bone->flag & BONE_SELECTED)
                    fcu->flag |= FCURVE_SELECTED;
                else
                    fcu->flag &= ~FCURVE_SELECTED;
            }
        }
    }
    else if (GS(owner_id->name) == ID_SCE) {
        Scene *scene = (Scene *)owner_id;

        /* only affect if F-Curve involves sequence_editor.sequences */
        if ((fcu->rna_path) && strstr(fcu->rna_path, "sequences_all")) {
            Editing *ed= seq_give_editing(scene, FALSE);
            Sequence *seq;
            char *seq_name;

            /* get strip name, and check if this strip is selected */
            seq_name= BLI_getQuotedStr(fcu->rna_path, "sequences_all[");
            seq = get_seq_by_name(ed->seqbasep, seq_name, FALSE);
            if (seq_name) MEM_freeN(seq_name);

            /* can only add this F-Curve if it is selected */
            if (seq) {
                if (seq->flag & SELECT)
                    fcu->flag |= FCURVE_SELECTED;
                else
                    fcu->flag &= ~FCURVE_SELECTED;
            }
        }
    }
    else if (GS(owner_id->name) == ID_NT) {
        bNodeTree *ntree = (bNodeTree *)owner_id;

        /* check for selected nodes */
        if ((fcu->rna_path) && strstr(fcu->rna_path, "nodes")) {
            bNode *node;
            char *node_name;

            /* get strip name, and check if this strip is selected */
            node_name= BLI_getQuotedStr(fcu->rna_path, "nodes[");
            node = nodeFindNodebyName(ntree, node_name);
            if (node_name) MEM_freeN(node_name);

            /* can only add this F-Curve if it is selected */
            if (node) {
                if (node->flag & NODE_SELECT)
                    fcu->flag |= FCURVE_SELECTED;
                else
                    fcu->flag &= ~FCURVE_SELECTED;
            }
        }
    }
}